Podstawy R – Analiza danych cz.2 „Eksploracja”
Pierwsza część analizy dany w R prezentowała jak wczytać nasze pliki do środowiska. Teraz trzeba te dane zweryfikować, w celu wyeliminowania wszystkich błędów mogących wpłynąć na wynik naszej analizy. Do ćwiczenia przygotowaliśmy zmodyfikowany plik z ludnością w powiatach do którego specjalnie wprowadziliśmy kilka błędów (pobierz).
Zacznijmy od wczytania pliku z danymi:
1 |
data = read.table("D:/powiaty_ludność_popr.txt", header = TRUE, sep = "\t", stringsAsFactors = FALSE) |
Przyjrzyjmy się zapisanym w tabeli data danym. Wyświetlamy pierwsze wiersze z tabeli:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
head(data) identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 1 201 bolesławiecki dolnośląskie 130351 1304 90306 69 2 202 dzierżoniowski dolnośląskie 47851 479 104613 219 3 203 głogowski dolnośląskie 44327 443 90302 204 4 204 górowski dolnośląskie 73827 738 36391 49 5 205 jaworski dolnośląskie 58155 582 52070 90 6 206 jeleniogórski dolnośląskie 62714 627 65171 104 |
Wiersze możemy przeglądać jeden po drugim:
1 2 3 4 5 |
data[100,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 100 1008 pabianicki łódzkie 49218 492 119672 243 |
Jak również pojedyncze kolumny na dwa sposoby:
1 2 3 4 5 6 7 8 9 10 11 |
data[,2] [1] „bolesławiecki” „dzierżoniowski” „głogowski” … data$powiat [1] „bolesławiecki” „dzierżoniowski” „głogowski” … |
Sposoby przeglądania szerzej zaprezentowane zostały w części kursu dotyczącej przechowywania danych.
Czasami nie wiemy w jakiej postaci przechowywane są dane w zmiennej. Sprawdzić to możemy korzystając z funkcji class, która zwróci nam typ kontenera danych:
1 2 3 |
class(data) [1] „data.frame” |
Nasza zmienna data to ramka danych zawierająca w kolumnach różne typy wartości.
Wróćmy do weryfikacji wczytanych przez nas danych. Wiemy, że zawierają liczbę ludności w poszczególnych powiatach. W Polsce jest 380 powiatów. Posiadając taką informację możemy sprawdzić, czy liczba wierszy naszych danych jest równa tej liczbie. Napiszmy wyrażenie sprawdzające, czy liczba wierszy tabeli jest równa 380 i wykonajmy je:
1 2 |
nrow(data) == 380 [1] FALSE |
Wyrażenie zwraca nam wartość FAŁSZ co znaczy, że nie mamy 380 wierszy. Mamy ich 381:
1 2 |
nrow(data) [1] 381 |
Oznacza to, że jakiś wiersz się powtarza. Sprawdźmy, który używając funkcji duplicated na kolumnie identyfikator:
1 2 3 |
duplicated(data$identyfikator) [1] FALSE FALSE FALSE FALSE … |
Funkcja zwraca wektor zawierający wartości PRAWDA/FAŁSZ dla każdego z elementów kolumny. W przypadku, gdy któryś z elementów się powtarza drugi raz otrzymuje wartość PRAWDA. W naszym zbiorze łatwo jest odnaleźć powtarzające się wartości, co w przypadku, gdy mamy bardzo duży zbiór danych? Możemy sprawdzić, czy którakolwiek wartość przyjmuje wartość PRAWDA przy wykorzystaniu funkcji any:
1 2 |
any(duplicated(data$identyfikator)) [1] TRUE |
Wiemy, już że mamy powtórzenie w danych, ale gdzie? Do tego służy funkcja wskazująca pozycję elementu which:
1 2 |
which(duplicated(data$identyfikator)) [1] 135 |
Wiersz 135 jest powtórzeniem innego wiersza w tabeli. Wyświetlmy go:
1 2 3 4 5 |
data[135,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 135 616 rycki lubelskie 61453 615 58080 95 |
Identyfikator tego powiatu to 616. Wybierzmy numery wierszy, które mają taki identyfikator do zmiennej sel:
1 |
sel = which(data$identyfikator == 616) |
I wyświetlmy je:
1 2 3 4 5 6 7 |
data[sel,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 69 616 rycki lubelskie 61453 615 58080 95 135 616 rycki lubelskie 61453 615 58080 95 |
Powiat rycki występuje dwa razy w naszej tabli. Teraz go usuniemy w podobny sposób jak go wyświetlamy, tylko dodamy minus i zapiszemy go do zmiennej data:
1 |
data = data[-135,] |
Usunęliśmy powtarzający się wiersz. Sprawdzamy jeszcze raz czy mamy powtórzenia:
1 2 |
any(duplicated(data$identyfikator)) [1] FALSE |
W kolumnach numerycznych takich jak np. ludność wiemy, że nie powinno być wartości ujemnych i równych zero. Możemy to sprawdzić tworząc wyrażenie:
1 2 |
any(data$ludność ‹= 0) [1] TRUE |
Otrzymaliśmy z wyrażenia wartość PRAWDA to znaczy, że wartość mniejsza bądź równa zero występuje w danych. Zapisujemy pozycję błędnego wiersza do zmiennej sel:
1 |
sel = which(data$ludność == 0) |
Wyświetlamy wiersz:
1 2 3 4 5 |
data[sel,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 126 1211 nowotarski małopolskie 147499 1474 0 129 |
Korzystając z pozycji wiersza zapisanego w sel poprawiamy błędną wartość w kolumnie ludność:
1 |
data$ludność[sel] = 189623 |
Wyświetlamy wiersz ponownie i sprawdzamy poprawność zmiany:
1 2 3 4 5 |
data[sel,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 126 1211 nowotarski małopolskie 147499 1474 189623 129 |
Poprawiliśmy błąd. W komórkach tabeli może również nie być danych. Brak danych zapisywany jest jako NA. Wyszukać tego typu miejsc możemy poprzez funkcję is.na:
1 2 |
any(is.na(data$ludność)) [1] TRUE |
Mamy taki element w kolumnie ludność. Znajdźmy, który to wiersz:
1 |
sel = which(is.na(data$ludność)) |
Wyświetlamy go:
1 2 3 4 5 |
data[sel,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 249 2214 tczewski pomorskie 69711 697 NA 166 |
Poprawiamy:
1 |
data$ludność[sel] = 115962 |
Sprawdzamy zmianę:
1 2 3 4 5 |
data[sel,] identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2 249 2214 tczewski pomorskie 69711 697 115962 166 |