class: center, middle, inverse, title-slide .title[ # Statystyka i wizualizacja danych ] .subtitle[ ## Przetwarzanie danych ] .author[ ### Jakub Nowosad
nowosad@amu.edu.pl
] --- class: inverse, middle, center # Przetwarzanie danych --- ## Zbiór danych ```r library(gapminder) ``` http://www.gapminder.org/data/ http://github.com/jennybc/gapminder http://www.youtube.com/watch?v=jbkSRLYSojo --- class: inverse, middle, center # R --- ## Wektory - indeksowanie - brak indeksu - indeks dodatni - indeks zerowy - indeks ujemny - indeks logiczny - indeks tekstowy --- ## data.frame - indeksowanie - `obiekt[wiersz, kolumna]` ```r gapminder[2, 1] gapminder[1, 3] gapminder[, 1] gapminder[1] gapminder[1, ] gapminder[0, 3] gapminder[-2, ] gapminder[, -1] gapminder[c(1, 5, 7), ] gapminder[, c(1, 2)] gapminder[gapminder$pop < 100000, ] gapminder[gapminder$year == 1952, c(4)] ``` --- ## data.frame - indeksowanie ```r gapminder$lifeExp ``` ```r gapminder$continent ``` --- class: inverse, middle, center # dplyr --- ## **dplyr** ```r # install.packages("dplyr") library(dplyr) ``` - **dplyr** to pakiet służący do podstawowych operacji przetwarzania danych z wykrzystaniem obiektów typu data.frame - podstawowe funkcje pakietu **dplyr** to `select()`, `arrange()`, `filter()`, `mutate()`, oraz `summarize()` - dodatkowo ważną rolę spełnia funkcja `group_by()` - inne możliwości pakietu **dplyr** to operator łączący funkcje (`%>%`), złączenia (`*_join`) czy operacje w ruchomym oknie - inny, alternatywny pakiet ułatwiający pracę na danych to **data.table** - https://rdatatable.gitlab.io/data.table/ --- ## **dplyr** - `select()` - funkcja *select* pozwala na stworzenie obiektu zawierającego tylko wybrane kolumny - ta funkcja pozwala zarówno na wybór pozytywny jak i negatywny - wiele dodatkowych możliwości - ?dplyr::select <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 28.801 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 779.4453 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1957 </td> <td style="text-align:right;"> 30.332 </td> <td style="text-align:right;"> 9240934 </td> <td style="text-align:right;"> 820.8530 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1962 </td> <td style="text-align:right;"> 31.997 </td> <td style="text-align:right;"> 10267083 </td> <td style="text-align:right;"> 853.1007 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1967 </td> <td style="text-align:right;"> 34.020 </td> <td style="text-align:right;"> 11537966 </td> <td style="text-align:right;"> 836.1971 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1972 </td> <td style="text-align:right;"> 36.088 </td> <td style="text-align:right;"> 13079460 </td> <td style="text-align:right;"> 739.9811 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1977 </td> <td style="text-align:right;"> 38.438 </td> <td style="text-align:right;"> 14880372 </td> <td style="text-align:right;"> 786.1134 </td> </tr> </tbody> </table> --- ## **dplyr** - `select()` ```r gapminder_sel1 = select(gapminder, country, year, pop) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> pop </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 8425333 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:right;"> 1957 </td> <td style="text-align:right;"> 9240934 </td> </tr> </tbody> </table> ```r gapminder_sel2 = select(gapminder, -continent) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 28.801 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 779.4453 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:right;"> 1957 </td> <td style="text-align:right;"> 30.332 </td> <td style="text-align:right;"> 9240934 </td> <td style="text-align:right;"> 820.8530 </td> </tr> </tbody> </table> --- ## **dplyr** - `arrange()` - funkcja `arrange()` sortuje wybrane kolumny w kolejności rosnącej... ```r gapminder_arr1 = arrange(gapminder, lifeExp) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Rwanda </td> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 1992 </td> <td style="text-align:right;"> 23.599 </td> <td style="text-align:right;"> 7290203 </td> <td style="text-align:right;"> 737.0686 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 28.801 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 779.4453 </td> </tr> <tr> <td style="text-align:left;"> Gambia </td> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 30.000 </td> <td style="text-align:right;"> 284320 </td> <td style="text-align:right;"> 485.2307 </td> </tr> <tr> <td style="text-align:left;"> Angola </td> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 30.015 </td> <td style="text-align:right;"> 4232095 </td> <td style="text-align:right;"> 3520.6103 </td> </tr> <tr> <td style="text-align:left;"> Sierra Leone </td> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 30.331 </td> <td style="text-align:right;"> 2143249 </td> <td style="text-align:right;"> 879.7877 </td> </tr> </tbody> </table> --- ## **dplyr** - `arrange()` - ...lub malejącej ```r gapminder_arr1 = arrange(gapminder, desc(lifeExp)) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Japan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 82.603 </td> <td style="text-align:right;"> 127467972 </td> <td style="text-align:right;"> 31656.07 </td> </tr> <tr> <td style="text-align:left;"> Hong Kong, China </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 82.208 </td> <td style="text-align:right;"> 6980412 </td> <td style="text-align:right;"> 39724.98 </td> </tr> <tr> <td style="text-align:left;"> Japan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 2002 </td> <td style="text-align:right;"> 82.000 </td> <td style="text-align:right;"> 127065841 </td> <td style="text-align:right;"> 28604.59 </td> </tr> <tr> <td style="text-align:left;"> Iceland </td> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 81.757 </td> <td style="text-align:right;"> 301931 </td> <td style="text-align:right;"> 36180.79 </td> </tr> <tr> <td style="text-align:left;"> Switzerland </td> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 81.701 </td> <td style="text-align:right;"> 7554661 </td> <td style="text-align:right;"> 37506.42 </td> </tr> </tbody> </table> --- ## **dplyr** - `filter()` - funkcja `filter()` pozwala na wybranie tylko tych obserwacji (wierszy), które spełniają zadane warunki - warunki określane są przez operatory logiczne: ==, !=, >, >=, <, <=, &, | ```r gapminder_fil1 = filter(gapminder, year == 2007) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 43.828 </td> <td style="text-align:right;"> 31889923 </td> <td style="text-align:right;"> 974.5803 </td> </tr> <tr> <td style="text-align:left;"> Albania </td> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 76.423 </td> <td style="text-align:right;"> 3600523 </td> <td style="text-align:right;"> 5937.0295 </td> </tr> </tbody> </table> --- ## **dplyr** - `filter()` ```r gapminder_fil2 = filter(gapminder, year == 2007 & pop <= 999999) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Bahrain </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 75.635 </td> <td style="text-align:right;"> 708573 </td> <td style="text-align:right;"> 29796.0483 </td> </tr> <tr> <td style="text-align:left;"> Comoros </td> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 65.152 </td> <td style="text-align:right;"> 710960 </td> <td style="text-align:right;"> 986.1479 </td> </tr> </tbody> </table> ```r gapminder_fil3 = filter(gapminder, continent != "Asia" | lifeExp < 30) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 28.801 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 779.4453 </td> </tr> <tr> <td style="text-align:left;"> Albania </td> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 55.230 </td> <td style="text-align:right;"> 1282697 </td> <td style="text-align:right;"> 1601.0561 </td> </tr> </tbody> </table> --- ## **dplyr** - `mutate()` - funkcja `mutate()` dodaje nowe zmienne (kolumny) na podstawe zadanego wyrażenia ```r gapminder_mut1 = mutate(gapminder, gdp_mil = (gdpPercap * pop) / 1000000) ``` <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> <th style="text-align:right;"> gdp_mil </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 28.801 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 779.4453 </td> <td style="text-align:right;"> 6567.086 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1957 </td> <td style="text-align:right;"> 30.332 </td> <td style="text-align:right;"> 9240934 </td> <td style="text-align:right;"> 820.8530 </td> <td style="text-align:right;"> 7585.449 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1962 </td> <td style="text-align:right;"> 31.997 </td> <td style="text-align:right;"> 10267083 </td> <td style="text-align:right;"> 853.1007 </td> <td style="text-align:right;"> 8758.856 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1967 </td> <td style="text-align:right;"> 34.020 </td> <td style="text-align:right;"> 11537966 </td> <td style="text-align:right;"> 836.1971 </td> <td style="text-align:right;"> 9648.014 </td> </tr> <tr> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1972 </td> <td style="text-align:right;"> 36.088 </td> <td style="text-align:right;"> 13079460 </td> <td style="text-align:right;"> 739.9811 </td> <td style="text-align:right;"> 9678.553 </td> </tr> </tbody> </table> --- ## **dplyr** - `summarize()` - funkcja `summarize()` służy do tworzenia podsumowań statystycznych; tworzy kolumny z zadanymi statystykami opisowymi ```r gapminder_sum1 = summarize(gapminder, mean_le = mean(lifeExp)) ``` ``` ## # A tibble: 1 × 1 ## mean_le ## <dbl> ## 1 59.5 ``` --- ## **dplyr** - `summarize()` - funkcja `summarize()` służy do tworzenia podsumowań statystycznych; tworzy kolumny z zadanymi statystykami opisowymi ```r gapminder_sum2 = summarize(gapminder, mean_le = mean(lifeExp), min_le = min(lifeExp), max_le = max(lifeExp)) ``` ``` ## # A tibble: 1 × 3 ## mean_le min_le max_le ## <dbl> <dbl> <dbl> ## 1 59.5 23.6 82.6 ``` --- ## **dplyr** - `.by` ```r gapminder_grp1 = summarize(gapminder_fil1, mean_lifeExp = mean(lifeExp), .by = continent) ``` <table> <thead> <tr> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> mean_lifeExp </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 70.72848 </td> </tr> <tr> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 77.64860 </td> </tr> <tr> <td style="text-align:left;"> Africa </td> <td style="text-align:right;"> 54.80604 </td> </tr> <tr> <td style="text-align:left;"> Americas </td> <td style="text-align:right;"> 73.60812 </td> </tr> <tr> <td style="text-align:left;"> Oceania </td> <td style="text-align:right;"> 80.71950 </td> </tr> </tbody> </table> --- ## **dplyr** - `pull()` - funkcja `pull()` służy do wyciągania tylko jednej zmiennej ```r pull(gapminder, lifeExp) ``` ``` ## [1] 28.801 30.332 31.997 34.020 36.088 38.438 39.854 40.822 41.674 41.763 ``` ```r pull(gapminder, continent) ``` ``` ## [1] Asia Asia Asia Asia Asia Asia Asia Asia Asia Asia ## Levels: Africa Americas Asia Europe Oceania ``` --- class: inverse, middle, center # tidyr --- ## **tidyr** ```r # install.packages("tidyr") library(tidyr) ``` - często dane jakie posiadamy są ułożone nie w ten sposób jaki my czy też różne funkcje R oczekują; ważne jest, aby dane były uporządkowane (tzw. "tidy data"), co oznacza, że: - każda kolumna to zmienna - każdy wiersz to obserwacja - istnieją dwie podstawowe układy danych, tzw. dane szerokie (wide) oraz dane długie (long) - więcej szczegółów można znaleźć pod adresem http://vita.had.co.nz/papers/tidy-data.html - pakiet **tidyr** posiada dwie główne funkcje - `pivot_wider()` i `pivot_longer()` oraz szereg dodatkowych --- ## **tidyr** - `pivot_wider()` - celem funkcji `pivot_wider()` jest przetworzenie danych na tzw. dane szerokie - konieczne jest, aby dane miały tylko jeden unikalny identyfikator ```r gapminder2 = select(gapminder, -continent, -lifeExp, -gdpPercap) gapminder_wide = pivot_wider(gapminder2, names_from = country, values_from = pop) ``` <table> <thead> <tr> <th style="text-align:right;"> year </th> <th style="text-align:right;"> Afghanistan </th> <th style="text-align:right;"> Albania </th> <th style="text-align:right;"> Algeria </th> <th style="text-align:right;"> Angola </th> <th style="text-align:right;"> Argentina </th> <th style="text-align:right;"> Australia </th> <th style="text-align:right;"> Austria </th> <th style="text-align:right;"> Bahrain </th> <th style="text-align:right;"> Bangladesh </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:right;"> 8425333 </td> <td style="text-align:right;"> 1282697 </td> <td style="text-align:right;"> 9279525 </td> <td style="text-align:right;"> 4232095 </td> <td style="text-align:right;"> 17876956 </td> <td style="text-align:right;"> 8691212 </td> <td style="text-align:right;"> 6927772 </td> <td style="text-align:right;"> 120447 </td> <td style="text-align:right;"> 46886859 </td> </tr> <tr> <td style="text-align:right;"> 1957 </td> <td style="text-align:right;"> 9240934 </td> <td style="text-align:right;"> 1476505 </td> <td style="text-align:right;"> 10270856 </td> <td style="text-align:right;"> 4561361 </td> <td style="text-align:right;"> 19610538 </td> <td style="text-align:right;"> 9712569 </td> <td style="text-align:right;"> 6965860 </td> <td style="text-align:right;"> 138655 </td> <td style="text-align:right;"> 51365468 </td> </tr> <tr> <td style="text-align:right;"> 1962 </td> <td style="text-align:right;"> 10267083 </td> <td style="text-align:right;"> 1728137 </td> <td style="text-align:right;"> 11000948 </td> <td style="text-align:right;"> 4826015 </td> <td style="text-align:right;"> 21283783 </td> <td style="text-align:right;"> 10794968 </td> <td style="text-align:right;"> 7129864 </td> <td style="text-align:right;"> 171863 </td> <td style="text-align:right;"> 56839289 </td> </tr> <tr> <td style="text-align:right;"> 1967 </td> <td style="text-align:right;"> 11537966 </td> <td style="text-align:right;"> 1984060 </td> <td style="text-align:right;"> 12760499 </td> <td style="text-align:right;"> 5247469 </td> <td style="text-align:right;"> 22934225 </td> <td style="text-align:right;"> 11872264 </td> <td style="text-align:right;"> 7376998 </td> <td style="text-align:right;"> 202182 </td> <td style="text-align:right;"> 62821884 </td> </tr> <tr> <td style="text-align:right;"> 1972 </td> <td style="text-align:right;"> 13079460 </td> <td style="text-align:right;"> 2263554 </td> <td style="text-align:right;"> 14760787 </td> <td style="text-align:right;"> 5894858 </td> <td style="text-align:right;"> 24779799 </td> <td style="text-align:right;"> 13177000 </td> <td style="text-align:right;"> 7544201 </td> <td style="text-align:right;"> 230800 </td> <td style="text-align:right;"> 70759295 </td> </tr> </tbody> </table> --- ## **tidyr** - `pivot_longer()` - funkcja `pivot_longer()` przetwarza dane na postać tzw. długą ```r gapminder_long = pivot_longer(gapminder_wide, cols = Afghanistan:Zimbabwe) ``` <table> <thead> <tr> <th style="text-align:right;"> year </th> <th style="text-align:left;"> name </th> <th style="text-align:right;"> value </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> Afghanistan </td> <td style="text-align:right;"> 8425333 </td> </tr> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> Albania </td> <td style="text-align:right;"> 1282697 </td> </tr> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> Algeria </td> <td style="text-align:right;"> 9279525 </td> </tr> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> Angola </td> <td style="text-align:right;"> 4232095 </td> </tr> <tr> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> Argentina </td> <td style="text-align:right;"> 17876956 </td> </tr> </tbody> </table> --- class: inverse, middle, center # Zadania --- ## Zadania Dane `gapminder` zawierają informacje o nazwie kraju, nazwie kontynentu, roku danych, oczekiwanej długości życia, populacji oraz PKB na osobę. 1. Który kraj miał najdłuższą i najkrótszą wartość oczekiwanej długości życia? W którym roku? 2. Jaki jest najludniejszy kraj w tym zbiorze? 3. Jaka jest średnia wartość oczekiwanej długości życia w całej bazie? A jaka jest średnia wartość oczekiwanej długości życia w roku 2007? 4. Który kontynent miał największą liczbę ludności w roku 2007? 5. Dla każdego kontynentu wylicz średnią wartość PKB na osobę w roku 2007. Na którym kontynencie ta wartość była najwyższa a na którym najniższa? 6. Zbuduj wykres pokazujący relację między oczekiwaną długością życia a PKB na osobę w roku 2007.