Interaktywna praca z danymi

Transkrypt

Interaktywna praca z danymi
Interaktywna praca z danymi
Bartosz Maćkiewicz
10 października 2016
Praca domowa A
Cel ćwiczenia - opanowanie sposobu tworzenia wektorów za pomocą
konstrukcji dolna_granica:górna_granica oraz mnożenia
macierzy element-po-elemencie
cbind(1:5, 2:6, 3:7) * 100
##
##
##
##
##
##
[1,]
[2,]
[3,]
[4,]
[5,]
[,1] [,2] [,3]
100 200 300
200 300 400
300 400 500
400 500 600
500 600 700
Praca domowa B
Cel ćwiczenia - opanowanie “palcowe” indeksowania, zapamiętanie, że najpierw
wiersz, potem kolumna :)
m = rbind(c(250,24,46,58,7), c(170,11,42,13,14), c(200, 300, 40, 50, 600
m[2,3]
## [1] 42
m[1,4]
## [1] 58
m[3,2]
## [1] 300
m[3,4]
## [1] 50
Praca domowa C
Cel ćwiczenia - opanowanie tworzenia ramek danych z wektorów.
lider = c('Brock', 'Misty', 'Lt. Surge', 'Erika',
'Koga', 'Sabrina', 'Blaine', 'Giovanni')
miasto = c('Pewter City', 'Cerulean City', 'Vermilion City',
'Celadon City', 'Fuchsia City',
'Saffron City', 'Cinnabar Island', 'Viridian City')
df = data.frame(row.names = lider, miasto = miasto, kolejnosc = 1:8)
Praca domowa C
df
##
##
##
##
##
##
##
##
##
miasto kolejnosc
Brock
Pewter City
1
Misty
Cerulean City
2
Lt. Surge Vermilion City
3
Erika
Celadon City
4
Koga
Fuchsia City
5
Sabrina
Saffron City
6
Blaine
Cinnabar Island
7
Giovanni
Viridian City
8
Praca domowa D
Cel ćwiczenia - opanowanie tworzenia list i “optyczna biegłość” w różnych
sposobach indeksowania
lista = list(1, 2, "Hop?", list(3,4, list(c('Jest tam kto?'))))
lista[[4]][[3]][1]
## [[1]]
## [1] "Jest tam kto?"
Praca domowa D
lista = list(rasy_psow = list(male_psy = c('jamnik', 'pudel')))
lista$rasy_psow$male_psy[2]
## [1] "pudel"
Praca domowa E
Cel ćwiczenia - integracja wiedzy na temat typów danych i
indeksowania
data(beavers)
which.max(beaver1$temp)
## [1] 80
beaver1$day[which.max(beaver1$temp)]
## [1] 346
Praca domowa E
beaver_day_1 = beaver1[which(beaver1['day'] == 346),]
temp = beaver_day_1[which(beaver_day_1['activ'] == 1),]$temp
max(temp)
## [1] 37.53
Indeksowanie
W notatnikach dla logicznego wywodu używaliśmy funkcji which. Mówiliśmy
sobie wcześniej, że wektory typu logical są bardzo ważne przy indeksowaniu.
W bardzo wielu wypadkach możemy indeksować bez użycia which.
x = c(2,3,5,6,7,4,3,6,8,3,4,5,6)
x > 5
## [1] FALSE FALSE FALSE
## [12] FALSE TRUE
x[which(x>5)]
## [1] 6 7 6 8 6
x[x>5]
## [1] 6 7 6 8 6
TRUE
TRUE FALSE FALSE
TRUE
TRUE FALSE FALS
Indeksowanie
Jest jedna bardzo ważna różnica między tymi dwoma sposobami.
x = c(4,5,NA,4,7,8,6,4,2)
x[x>5]
## [1] NA
7
x[which(x>5)]
## [1] 7 8 6
8
6
NA
NA jest wartością, którą R oznacza brakujące dane. Jeżeli jakichś danych brakuje,
to dobrze jest, żebyśmy tak je właśnie oznaczali. Możemy łatwo usunąć je za
pomocą funkcji is.na.
is.na(x)
## [1] FALSE FALSE
TRUE FALSE FALSE FALSE FALSE FALSE FALSE
x[!is.na(x)]
## [1] 4 5 4 7 8 6 4 2
Sortowanie
Najprostszym sposobem sortowania danych jest funkcja order,
która zwraca wektor integer z kolejnością.
x = c(1,7,5,2,3,6,8,9,4,10)
order(x)
##
[1]
1
4
5
9
3
6
2
7
8 10
x[order(x, decreasing = TRUE)]
##
[1] 10
9
8
7
6
5
4
3
2
1
W przypadku typu character sortuje alfabetycznie. Przyjmuje
argument decreasing (odwrotne sortowanie)
NA
W przypadku ramek danych łatwo możemy “odsiać” te wiersze, w których jest
przynajmniej jedna kolumna o wartości NA za pomocą funkcji complete.cases:
df = data.frame(imie = c('Kasia', 'Zosia', 'Marek', 'Jacek'),
wiek = c(12,22,NA,41),
ocena_z_r = c(NA,3,NA,5))
df[complete.cases(df),]
##
imie wiek ocena_z_r
## 2 Zosia
22
3
## 4 Jacek
41
5
Operatory logiczne
x= c(2,3,4,5,1)
x < 3 # mniejsze niż
## [1]
TRUE FALSE FALSE FALSE
TRUE
x <= 4 # mniejsze lub równie, `>=` daje większe lub równe
## [1]
TRUE
TRUE
TRUE FALSE
TRUE
x == 1 # dokładnie równe (wszystkie typy danych)
## [1] FALSE FALSE FALSE FALSE
TRUE
Operatory logiczne
x= c(2,3,4,5,1)
x != 4 # nierówne
## [1]
TRUE
TRUE FALSE
TRUE
TRUE
x < 2 | x > 4 # alternatywa logiczna, `&` daje koniunkcje
## [1] FALSE FALSE FALSE
TRUE
TRUE
x %in% c(2,1) # zawiera się w zbiorze (wszystkie typy)
## [1]
TRUE FALSE FALSE FALSE
TRUE
!(x %in% c(4,1)) # operator negacji (na `logical`)
## [1]
TRUE
TRUE FALSE
TRUE FALSE
table
Za pomocą funkcji table możemy stworzyć z dwóch wektorów
tabelę częstościową.
plec = c('K', 'M', 'K', 'K', 'M', 'M', 'M', 'K')
ocena_z_zajec = c(4,4,3,2,5,5,2,4)
table(ocena_z_zajec, plec)
##
plec
## ocena_z_zajec K M
##
2 1 1
##
3 1 0
##
4 2 1
##
5 0 2
prop.table
Za pomocą funkcji prop.table możemy stworzyć tabelę
procentową. Argument margin mówi, w którym wymiarze R ma
zliczać procenty.
prop.table(table(ocena_z_zajec, plec), margin = 2)
##
plec
## ocena_z_zajec
K
M
##
2 0.25 0.25
##
3 0.25 0.00
##
4 0.50 0.25
##
5 0.00 0.50
Funkcje przydatne do interaktywnej pracy z R
I
I
I
I
I
I
nrow, ncol - liczba wierszy, liczba kolumn
levels - wszystkie występujące w factor poziomy
length - długość wektora
colnames - kolumny danej ramki danych
summary, str - “magiczne” funkcje, pozwalają “obejrzeć”
obiekt
class - powie nam, jakiego typu jest wartość
W wykonaniu zadań przyda się jeszcze:
I
intersect - przecięcie dwóch zbiorów
Zadanie I
Zadanie pierwsze polegać będzie na wczytaniu danych z plików
student-mat.csv oraz student-por.csv. Informacje o plikach
znajdują się w pliku student.txt.
Dane te pochodzą z badań dotyczących użycia alkoholu wśród
młodzieży w wieku licealnym.
Zadanie I
Podzadanie A Proszę stworzyć tabelę, w której znajdować się
będzie liczba nieobecności ze względu na pozostawanie w związku.
Tabelę proszę wykonać na podstawie danych studentów, którzy
mieszkają z rodzicami.
Podzadanie B Proszę dowiedzieć się:
1. O ile więcej punktów procentowych chłopców niż dziewczyn
dostało pięć najwyższych ocen z matematyki?
2. O ile więcej punktów procentowych dziewcząt niż chłopców
dostało pięć najwyższych ocen z portugalskiego?
Jak zabrać się do zadadania I?
1. Wczytywanie danych
I
I
jakim poleceniem wczytać dane?
w jakim formacie są dane? jaki seperator? jest nagłówek?
2. Oglądanie danych
I
co oznaczają kolumny?
3. Podzadanie A
I
jak zrobić tabelkę? jak tabelkę procentową?
4. Podzadanie B
I
I
czy z tabelki możemy zrobić macierz?
jak zsumować wektor? (sum)
Zadanie II
Proszę wczytać do R plik “DEMO_DS_08102016081305271.csv”.
Plik ten pochodzi ze strony UNESCO, która za darmo udostępnia
wiele zbiorów danych, w tym np. demograficzne, na których dzisiaj
będziemy pracować. Po wczytaniu do R danych proszę wykonać
następujące zadania:
Zadanie II
Podzadanie A W których krajach śmiertelność noworodków w 2005
roku była wyższa niż w 2004 roku? Wynik proszę przedstawić jako
ramkę danych z trzema kolumnami:
|kraj|śmiertelność w 2004|śmiertelność w 2005|róznica
między nimi|
Podzadanie B W których krajach populacja powyżej 65 roku życia
stanowiła więcej niż 15% całości populacji w 2007 roku?
Rozwiązanie należy podać w formie:
|kraj|populacja|populacjastarszych|procent, jaki
stanowi populacja powyżej 65 roku życia|
Ramka danych ma być posortowana według proporcji (malejąco)
Jak zabrać się do zadanie II?
1. Wczytywanie danych.
I jakim poleceniem wczytać dane? (read.table?)
I jaki format mają dane? jaki jest separator?
2. Oglądanie danych
I jakie wymiary ma nasza ramka danych? (ncol, nrow)
I jakie mamy kolumny? (colnames)
I jakie poziomy (levels) mają wartości w różnych kolumnach? (levels)
3. Przygotowywanie danych
I jak zrobić tabelę tylko z tym, co nas interesuje? (indeksowanie)
I czy porównujemy właściwe rzeczy? (kraje == kraje?)
4. Konstruowanie zapytań
I jak skonstruować zapytanie, które sprawdzi, dla których wierszy prawdziwy jest
nasz warunek?
I jak potem wybrać nazwy krajów?
5. Konstruowanie odpowiedzi
I jak stworzyć nową ramkę danych? co w niej ma być?
I czy kontrolujemy, co i w jakiej kolejności porównujemy?
Zadanie III
To nie jest właściwy format tabeli do takiego zadania, chcielibyśmy
mieć osobną tabelę dla interesującego nas wskaźnika tak, żeby kraje
były wierszami, a lata kolumnami. Z R zadanie to łatwo wykonać.
My pomożemy sobie pakietem reshape i jego funkcją cast.
# install.packages('reshape')
library(reshape)
?cast
examples(cast)
Zadanie III
Proszę za pomocą funkcji cast z pakietu reshape stworzyć tabele
(tyle, ile będzie potrzeba), w których wierszami będą kraje, a
kolumnami lata. W podzadaniach 2 i 3 proszę odpowiedź
przygotować w formie ramki danych:
|Country|Różnica| (bardzo ważne żeby były polskie znaki w
nazwie kolumny!)
Proszę odpowiedzieć na następujące pytania:
Zadanie III
1. (Powtórka z zadania 2!) W których krajach liczba urodzeń na
kobietę w 2010 roku była niższa niż w 2005 roku? Wynik
proszę przedstawić jako wektor krajów.
2. W których krajach w okresie objętym tabelą proporcja
populacji wiejskiej zmniejszyła się najbardziej? (TOP 10 - tylko
10 z najwyższa wartością)
3. W których krajach w okresie objętym tabelą liczba osób
(proporcjonalnie do populacji), które muszą przeżyć za 1,90
dolara dziennie zmniejszyła się najbardziej? A w których za
3.90 dolara? (TOP 10)
Jak zabrać się za zadanie III?
1. Przygotowywanie danych.
I czy chcemy piwotować całą ramkę, czy tylko jej jakiś podzbiór?
2. Piwotowanie tabeli
I jakiej formuły użyjemy (Country ~ Time?)
I jaki argument oprócz formuły musimy jeszcze przekazać? (może subset?
ale co tam wpisać?)
3. Indeksowanie
I co z brakującymi danymi? jakie wartości przyjmuje porównanie NA z
numeric? Co będzie potem, gdy będziemy indeksować?
I jaka różnica jest, kiedy użyjemy funkcji which do indeksowania i kiedy jej
nie użyjemy?
4. Tworzenie odpowiedzi
I jak stworzyć i dołączyć do ramki danych nową kolumna z różnicą?
Protipy
1. Zapisujmy co robimy (w pliku .R traktowanym jak notatnik)
2. Sprawdzamy, co nam wychodzi.
3. Czytamy ostrzeżenia i błędy - dowiemy się z nich, co robimy
źle.
4. Używamy wielu tymczasowych zmiennych - nie wszystko uda
się zrobić na jeden raz.
Protipy do zadania I
1. W każdej chwili możemy obejrzeć całość danych - warto
kontrolować, czy nasze wyniki mają sens.
2. Kiedy tabelę procentową zmienimy w macierz możemy użyć
całej naszej wiedzy dotyczącej indeksowania.
Protipy do zadania II
1. Ten zbiór danych jest za duży, żeby go oglądać w REPL. Musimy nauczyć się
sprawnie posługiwać poleceniami w pracy interaktywnej.
2. Tabela jest spłaszczona. Za pomocą head zobaczyć można jak wygląda.
3. W podzadaniu A musimy dokonać kilku “filtrowań” naszej tabeli. Każde z nich
można zrobić w osobnym kroku i do każdego z nich można zrobić osobną
zmienną:
I
I
I
I
wskaźnik (interesuje nas tylko jeden z 25)
lata (porównujemy dwa - 2004 i 2005)
wartości (porównujemy kolumnę ‘Value’)
warunek (śmiertelność wyższa w 2005 niż 2004)
3. W podzadaniu B warto podzielić sobie ramkę na dwie ramki, osobną dla
każdego wskaźnika
4. W podzadaniu B warto sprawdzić, czy w obu ramkach są te same kraje i czy są
w tej samej kolejności. Tylko wtedy będziemy mogli sprawdzić, czy zachodzi
warunek z zadania.
5. W pozadaniu B warto posortować obie ramki, tak by kraje były w tej samej
kolejności.
Protipy do zadania III
1. W dokumentacji do cast znajduje się informacja jak używać
argumentów value oraz subset. Ich użycie może okazać się
niezbędne do wykonania zadania.
2. Sortowanie i wybieranie 10 krajów można wykonać w ostatniej
kolejności.