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.