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:
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:
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:
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:
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:
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:
nrow(data) == 380
[1] FALSE
Wyrażenie zwraca nam wartość FAŁSZ co znaczy, że nie mamy 380 wierszy. Mamy ich 381:
nrow(data)
[1] 381
Oznacza to, że jakiś wiersz się powtarza. Sprawdźmy, który używając funkcji duplicated na kolumnie identyfikator:
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:
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:
which(duplicated(data$identyfikator))
[1] 135
Wiersz 135 jest powtórzeniem innego wiersza w tabeli. Wyświetlmy go:
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:
sel = which(data$identyfikator == 616)
I wyświetlmy je:
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:
data = data[-135,]
Usunęliśmy powtarzający się wiersz. Sprawdzamy jeszcze raz czy mamy powtórzenia:
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:
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:
sel = which(data$ludność == 0)
Wyświetlamy wiersz:
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ść:
data$ludność[sel] = 189623
Wyświetlamy wiersz ponownie i sprawdzamy poprawność zmiany:
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:
any(is.na(data$ludność))
[1] TRUE
Mamy taki element w kolumnie ludność. Znajdźmy, który to wiersz:
sel = which(is.na(data$ludność))
Wyświetlamy go:
data[sel,]
identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2
249 2214 tczewski pomorskie 69711 697 NA 166
Poprawiamy:
data$ludność[sel] = 115962
Sprawdzamy zmianę:
data[sel,]
identyfikator powiat województwo pow_ha pow_km2 ludność ludność_km2
249 2214 tczewski pomorskie 69711 697 115962 166