Projekt R

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