class: bottom, left, inverse, title-slide # Efektivní a přehledná práce s daty
v prostředí jazyka R ## Workshop: konference EJ NOK 2020 ### Petr Bouchal ### 5. listopadu 2020 --- class: left, middle, inverse # Proč tu jsme: cíle pro dnešek --- class: left, top, large 1\. Ujasnit si, kdy a proč použít na data programovací jazyk (R) -- 2\. Naučit se vyznat se v R a RStudiu -- 3\. Poznat nástroje na práci s daty -- 4\. Poznat nástroje na tvorbu výstupů -- 5\. Vědět, kde a jak se učit další věci --- # A co není cílem .large[ pokrýt všechny nástroje do hloubky naučit se statistiku řešit "big data" / "umělou inteligenci" a další buzzwords ] --- class: middle, inverse # Jak na to půjdeme --- class: middle .large[ 1\. Motivace ] -- .large[ 2\. Stavební kameny ] -- .large[ 3\. Ukázkový projekt ] -- .large[ 4\. Kam dál ] Celou dobu budeme používat data Google Mobility: https://www.google.com/covid19/mobility/ --- class: middle, inverse # Motivace: proč na data s kódem --- layout: true ## Jste v dobré společnosti --- ![](bbc.png) --- ![](sdg-atlas-2018-cover-400px.png) https://blogs.worldbank.org/opendata/2018-atlas-sustainable-development-goals-all-new-visual-guide-data-and-development https://github.com/worldbank/sdgatlas2018/blob/master/sdg11.R#L15-L72 --- ![](ft.png) --- ![](economist.png) https://projects.economist.com/us-2020-forecast/president --- class: large layout: false # Proč R .pull-left.center.middle[ Open source Flexibilita *Komunita* ] .pull-right.center.middle[ Data Vizualizace a reporty *RStudio* ] --- class: center, middle .large[ [petrbouchal.xyz/eval2020](https://petrbouchal.xyz/eval2020) ] --- class: middle, inverse # Stavební kameny --- class: middle, large 1\. R a RStudio: prostředí -- 2\. Základní funkce a operace -- 3\. Práce s tabulkovými daty -- .large[ 4\. Nástroje na tvorbu výstupů ] --- class: middle, large **1\. R a RStudio: prostředí** 2\. Základní funkce a operace 3\. Práce s tabulkovými daty 4\. Nástroje na tvorbu výstupů --- class: center, middle, large otevřete RStudio ([rstudio.cloud](https://rstudio.cloud)) --- class: large # Resumé: Co je co v R "Only the data and code are real" .pull-left[ ## Trvalé/opravdické - kód - vstupní data ] .pull-right[ ## Přechodné - výstupy: dokumenty, grafy, výstupní data - objekty v prostředi (environment) ] viz https://socviz.co/gettingstarted.html#things-to-know-about-r --- ### Data se nemění Data se ze souboru na disku načtou do prostředí R. Prostřednictvím kódu pracuji s odrazem dat v prostředí, nikoli přímo s datovým souborem. Nakonec můžu výsledek zapsat na disk do nového souboru. ### Vše, co dělám s daty, musí být zaznamenáno v kódu Do vstupních ani výstupních dat nezasahuji ručně. Do výstupů nezasahuji ručně (pokud, tak až nakonec) Kód (skript) by měl běžet od začátku do konce ### Co je v prostředí (Environment), je přechodné Jakmile restartuji R, zmizí to Pokud chci, aby mi něco zůstalo, musím mít v kódu popsán způsob, jak to vzniklo --- class: center, middle, large Pokud se toto naučíte dodržovat, přiblížíte se dobré praxi reprodukovatné analýzy dat Stejné principy platí i u jiných skriptovacích jazyků na práci s daty (Python, Julia aj.) --- class: middle, large 1\. R a RStudio: prostředí **2\. Základní funkce a operace** 3\. Práce s tabulkovými daty 4\. Nástroje na tvorbu výstupů --- class: large, center, middle otevřete `01_prvni-skript.R` --- class: large # Vsuvka: kde hledat pomoc - `?funkce` / `??cokoli` - klik na funkci ve skriptu, pak F1 - "Google the error message" - Stack Overflow - RStudio Community - webová dokumentace balíků --- class: middle, large 1\. R a RStudio: prostředí 2\. Základní funkce a operace **3\. Práce s tabulkovými daty** 4\. Nástroje na tvorbu výstupů --- class: large # Tidyverse: co to je - sada balíků s podobnými principy používání - postaveno na potřebách práce s tabulkovými daty (řádky, sloupce) - vychází z analogie s gramatikou: pro každou oblast existuje sada základních sloves - odpovídá logice datové analýzy --- class: left, top # Tidyverse: základní logika .center.middle[ ![](tidyverse-diagrams.png) ] --- class: large # Co balík, to sada úloh datové analýzy .center[ <img src="tidyverse-logos.png" width="60%" /> ] --- class: large # Co balík, to řešení sady problémů datové analýzy - `readr` načítání dat z textových souborů (CSV, TSV) - `readxl`: import dat z Excelu - `dplyr`: základní manipulace s daty - `tidyr` na čištění a úpravu dat - `stringr`: práce s textem - `lubridate` práce s datumy a časy - `ggplot2`: vizualizace dat --- class: large, center, middle [dplyr.tidyverse.org](https://dplyr.tidyverse.org) [readr.tidyverse.org](https://dplyr.tidyverse.org) ... Reference | Articles --- ## Další: - `forcats` na práci s faktory (kategorická data) - `httr` a `rvest` na stahování a scrapeování dat z webu - `tibble` na tvorbu data frames - `glue` na slepování textu / textu a dat - `purrr` na opakování operací pro různé vstupy ## Související mimo tidyverse: - `haven` na načítání dan např. z SPSS - `DBI` a další: kontakt s databázemi - `writexl` na export dat do z Excelu - `sf` na práci s geografickými daty --- class: large *Slovesa* v tidyverse (balíky `dplyr` a `tidyr`) - `filter`: výběr řádků podle pravidla - `mutate`: výpočty ze sloupců - `summarise`: souhrn pomocí funkce - `group_by`: operace po skupinách - `select`: výběr sloupců (jako v SQL) - `arrange`: řazení - `join_*:` spojení dvou tabulek podle klíče - `pivot_*:` tvarování ("dlouhý" <=> "krátký" formát --- class: large Další užitečné - `count` - `starts_with` / `ends_with` / `matches` - `distinct` - `n_distinct` - `rename` - `recode` - `separate / unite` - `bind_rows` --- ## Ještě jedna věc: `%>%` (pipe) `%>%` posilá výstup funkce vlevo jako první argument to funkce vpravo. .pull-left[ ```r summarise( filter( select(gdta, date, zmena), date > "2020-10-01"), min_zmena = min(zmena, na.rm = T)) ``` ``` # A tibble: 1 x 1 min_zmena <dbl> 1 -91 ``` ] .pull-right[ ```r gdta %>% select(date, zmena) %>% filter(date > "2020-10-01") %>% summarise(min_zmena = min(zmena, na.rm = T)) ``` ``` # A tibble: 1 x 1 min_zmena <dbl> 1 -91 ``` ] Je to přehlednější a praktičtější: nemusíme číst složené funkce odprostřed, ale vidíme jednotlivé kroky. `Cmd/Ctrl + Shift + M` --- ## Srovnání práce v 'base' R a tidyverse .pull-left[ ```r x <- gdta[gdta$zmena < -45,] x <- x[,c("kategorie", "zmena")] x ``` ``` # A tibble: 33,515 x 2 kategorie zmena <chr> <dbl> 1 retail_and_recreation -56 2 retail_and_recreation -57 3 retail_and_recreation -61 4 transit_stations -50 5 retail_and_recreation -65 6 transit_stations -56 7 retail_and_recreation -65 8 transit_stations -55 9 retail_and_recreation -67 10 transit_stations -58 # … with 33,505 more rows ``` ] .pull-right[ ```r gdta %>% filter(zmena < -45) %>% select(kategorie, zmena) ``` ``` # A tibble: 9,406 x 2 kategorie zmena <chr> <dbl> 1 retail_and_recreation -56 2 retail_and_recreation -57 3 retail_and_recreation -61 4 transit_stations -50 5 retail_and_recreation -65 6 transit_stations -56 7 retail_and_recreation -65 8 transit_stations -55 9 retail_and_recreation -67 10 transit_stations -58 # … with 9,396 more rows ``` ] --- class: center, middle, large # Tidyverse: ukázka --- count: false .panel1-tidyverse-priklad-auto[ ```r *gdta ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 147,396 x 5 sub_region_1 kategorie zmena date country_region <chr> <chr> <dbl> <date> <chr> 1 <NA> retail_and_recreation 13 2020-02-15 Czechia 2 <NA> grocery_and_pharmacy 8 2020-02-15 Czechia 3 <NA> parks 37 2020-02-15 Czechia 4 <NA> transit_stations 14 2020-02-15 Czechia 5 <NA> workplaces 3 2020-02-15 Czechia 6 <NA> residential -2 2020-02-15 Czechia 7 <NA> retail_and_recreation 12 2020-02-16 Czechia 8 <NA> grocery_and_pharmacy 8 2020-02-16 Czechia 9 <NA> parks 28 2020-02-16 Czechia 10 <NA> transit_stations 9 2020-02-16 Czechia # … with 147,386 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% * select(-country_region) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 147,396 x 4 sub_region_1 kategorie zmena date <chr> <chr> <dbl> <date> 1 <NA> retail_and_recreation 13 2020-02-15 2 <NA> grocery_and_pharmacy 8 2020-02-15 3 <NA> parks 37 2020-02-15 4 <NA> transit_stations 14 2020-02-15 5 <NA> workplaces 3 2020-02-15 6 <NA> residential -2 2020-02-15 7 <NA> retail_and_recreation 12 2020-02-16 8 <NA> grocery_and_pharmacy 8 2020-02-16 9 <NA> parks 28 2020-02-16 10 <NA> transit_stations 9 2020-02-16 # … with 147,386 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% * rename(kraj_nazev = sub_region_1) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 147,396 x 4 kraj_nazev kategorie zmena date <chr> <chr> <dbl> <date> 1 <NA> retail_and_recreation 13 2020-02-15 2 <NA> grocery_and_pharmacy 8 2020-02-15 3 <NA> parks 37 2020-02-15 4 <NA> transit_stations 14 2020-02-15 5 <NA> workplaces 3 2020-02-15 6 <NA> residential -2 2020-02-15 7 <NA> retail_and_recreation 12 2020-02-16 8 <NA> grocery_and_pharmacy 8 2020-02-16 9 <NA> parks 28 2020-02-16 10 <NA> transit_stations 9 2020-02-16 # … with 147,386 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% * filter(date > "2020-10-01") ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 23,478 x 4 kraj_nazev kategorie zmena date <chr> <chr> <dbl> <date> 1 <NA> retail_and_recreation -10 2020-10-02 2 <NA> grocery_and_pharmacy 13 2020-10-02 3 <NA> parks 26 2020-10-02 4 <NA> transit_stations -2 2020-10-02 5 <NA> workplaces -7 2020-10-02 6 <NA> residential 0 2020-10-02 7 <NA> retail_and_recreation -10 2020-10-03 8 <NA> grocery_and_pharmacy 8 2020-10-03 9 <NA> parks 66 2020-10-03 10 <NA> transit_stations 1 2020-10-03 # … with 23,468 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% * mutate(zmena_dec = zmena/100) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 23,478 x 5 kraj_nazev kategorie zmena date zmena_dec <chr> <chr> <dbl> <date> <dbl> 1 <NA> retail_and_recreation -10 2020-10-02 -0.1 2 <NA> grocery_and_pharmacy 13 2020-10-02 0.13 3 <NA> parks 26 2020-10-02 0.26 4 <NA> transit_stations -2 2020-10-02 -0.02 5 <NA> workplaces -7 2020-10-02 -0.07 6 <NA> residential 0 2020-10-02 0 7 <NA> retail_and_recreation -10 2020-10-03 -0.1 8 <NA> grocery_and_pharmacy 8 2020-10-03 0.08 9 <NA> parks 66 2020-10-03 0.66 10 <NA> transit_stations 1 2020-10-03 0.01 # … with 23,468 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% * select(-zmena) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 23,478 x 4 kraj_nazev kategorie date zmena_dec <chr> <chr> <date> <dbl> 1 <NA> retail_and_recreation 2020-10-02 -0.1 2 <NA> grocery_and_pharmacy 2020-10-02 0.13 3 <NA> parks 2020-10-02 0.26 4 <NA> transit_stations 2020-10-02 -0.02 5 <NA> workplaces 2020-10-02 -0.07 6 <NA> residential 2020-10-02 0 7 <NA> retail_and_recreation 2020-10-03 -0.1 8 <NA> grocery_and_pharmacy 2020-10-03 0.08 9 <NA> parks 2020-10-03 0.66 10 <NA> transit_stations 2020-10-03 0.01 # … with 23,468 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% * group_by(kraj_nazev, kategorie) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 23,478 x 4 # Groups: kraj_nazev, kategorie [90] kraj_nazev kategorie date zmena_dec <chr> <chr> <date> <dbl> 1 <NA> retail_and_recreation 2020-10-02 -0.1 2 <NA> grocery_and_pharmacy 2020-10-02 0.13 3 <NA> parks 2020-10-02 0.26 4 <NA> transit_stations 2020-10-02 -0.02 5 <NA> workplaces 2020-10-02 -0.07 6 <NA> residential 2020-10-02 0 7 <NA> retail_and_recreation 2020-10-03 -0.1 8 <NA> grocery_and_pharmacy 2020-10-03 0.08 9 <NA> parks 2020-10-03 0.66 10 <NA> transit_stations 2020-10-03 0.01 # … with 23,468 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% * mutate(zmena_min = min(zmena_dec, na.rm = T), * zmena_max = max(zmena_dec, na.rm = T)) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 23,478 x 6 # Groups: kraj_nazev, kategorie [90] kraj_nazev kategorie date zmena_dec zmena_min zmena_max <chr> <chr> <date> <dbl> <dbl> <dbl> 1 <NA> retail_and_recreation 2020-10-02 -0.1 -0.79 -0.03 2 <NA> grocery_and_pharmacy 2020-10-02 0.13 -0.85 0.27 3 <NA> parks 2020-10-02 0.26 -0.36 0.66 4 <NA> transit_stations 2020-10-02 -0.02 -0.56 0.01 5 <NA> workplaces 2020-10-02 -0.07 -0.74 0.05 6 <NA> residential 2020-10-02 0 -0.02 0.26 7 <NA> retail_and_recreation 2020-10-03 -0.1 -0.79 -0.03 8 <NA> grocery_and_pharmacy 2020-10-03 0.08 -0.85 0.27 9 <NA> parks 2020-10-03 0.66 -0.36 0.66 10 <NA> transit_stations 2020-10-03 0.01 -0.56 0.01 # … with 23,468 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% * summarise(zmena_p = mean(zmena_dec, na.rm = T)) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 90 x 3 # Groups: kraj_nazev [15] kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 Central Bohemian Region grocery_and_pharmacy 0.0576 2 Central Bohemian Region parks 0.237 3 Central Bohemian Region residential 0.107 4 Central Bohemian Region retail_and_recreation -0.272 5 Central Bohemian Region transit_stations -0.0555 6 Central Bohemian Region workplaces -0.200 7 Hradec Králové Region grocery_and_pharmacy 0.000736 8 Hradec Králové Region parks 0.156 9 Hradec Králové Region residential 0.0964 10 Hradec Králové Region retail_and_recreation -0.364 # … with 80 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% * ungroup() ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 90 x 3 kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 Central Bohemian Region grocery_and_pharmacy 0.0576 2 Central Bohemian Region parks 0.237 3 Central Bohemian Region residential 0.107 4 Central Bohemian Region retail_and_recreation -0.272 5 Central Bohemian Region transit_stations -0.0555 6 Central Bohemian Region workplaces -0.200 7 Hradec Králové Region grocery_and_pharmacy 0.000736 8 Hradec Králové Region parks 0.156 9 Hradec Králové Region residential 0.0964 10 Hradec Králové Region retail_and_recreation -0.364 # … with 80 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% ungroup() %>% * arrange(kategorie, zmena_p) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 90 x 3 kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 Prague grocery_and_pharmacy -0.0381 2 Zlín Region grocery_and_pharmacy -0.0257 3 Karlovy Vary Region grocery_and_pharmacy -0.00262 4 Hradec Králové Region grocery_and_pharmacy 0.000736 5 <NA> grocery_and_pharmacy 0.00651 6 South Bohemian Region grocery_and_pharmacy 0.0154 7 Moravian-Silesian Region grocery_and_pharmacy 0.0190 8 Olomouc Region grocery_and_pharmacy 0.0287 9 Liberec Region grocery_and_pharmacy 0.0312 10 Pardubice Region grocery_and_pharmacy 0.0433 # … with 80 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% ungroup() %>% arrange(kategorie, zmena_p) %>% * arrange(kategorie, desc(zmena_p)) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 90 x 3 kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 South Moravian Region grocery_and_pharmacy 0.0658 2 Ústí nad Labem Region grocery_and_pharmacy 0.0599 3 Central Bohemian Region grocery_and_pharmacy 0.0576 4 Vysočina Region grocery_and_pharmacy 0.0516 5 Plzeň Region grocery_and_pharmacy 0.0445 6 Pardubice Region grocery_and_pharmacy 0.0433 7 Liberec Region grocery_and_pharmacy 0.0312 8 Olomouc Region grocery_and_pharmacy 0.0287 9 Moravian-Silesian Region grocery_and_pharmacy 0.0190 10 South Bohemian Region grocery_and_pharmacy 0.0154 # … with 80 more rows ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% ungroup() %>% arrange(kategorie, zmena_p) %>% arrange(kategorie, desc(zmena_p)) %>% * filter(kategorie == "workplaces") ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 15 x 3 kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 Karlovy Vary Region workplaces -0.167 2 Ústí nad Labem Region workplaces -0.177 3 Pardubice Region workplaces -0.179 4 Olomouc Region workplaces -0.182 5 Plzeň Region workplaces -0.183 6 Liberec Region workplaces -0.19 7 Zlín Region workplaces -0.193 8 South Bohemian Region workplaces -0.195 9 Vysočina Region workplaces -0.198 10 Moravian-Silesian Region workplaces -0.200 11 Central Bohemian Region workplaces -0.200 12 Hradec Králové Region workplaces -0.203 13 South Moravian Region workplaces -0.224 14 <NA> workplaces -0.229 15 Prague workplaces -0.363 ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% ungroup() %>% arrange(kategorie, zmena_p) %>% arrange(kategorie, desc(zmena_p)) %>% filter(kategorie == "workplaces") %>% * replace_na(list(kraj_nazev = "Celá ČR")) ``` ] .panel2-tidyverse-priklad-auto[ ``` # A tibble: 15 x 3 kraj_nazev kategorie zmena_p <chr> <chr> <dbl> 1 Karlovy Vary Region workplaces -0.167 2 Ústí nad Labem Region workplaces -0.177 3 Pardubice Region workplaces -0.179 4 Olomouc Region workplaces -0.182 5 Plzeň Region workplaces -0.183 6 Liberec Region workplaces -0.19 7 Zlín Region workplaces -0.193 8 South Bohemian Region workplaces -0.195 9 Vysočina Region workplaces -0.198 10 Moravian-Silesian Region workplaces -0.200 11 Central Bohemian Region workplaces -0.200 12 Hradec Králové Region workplaces -0.203 13 South Moravian Region workplaces -0.224 14 Celá ČR workplaces -0.229 15 Prague workplaces -0.363 ``` ] --- count: false .panel1-tidyverse-priklad-auto[ ```r gdta %>% select(-country_region) %>% rename(kraj_nazev = sub_region_1) %>% filter(date > "2020-10-01") %>% mutate(zmena_dec = zmena/100) %>% select(-zmena) %>% group_by(kraj_nazev, kategorie) %>% mutate(zmena_min = min(zmena_dec, na.rm = T), zmena_max = max(zmena_dec, na.rm = T)) %>% summarise(zmena_p = mean(zmena_dec, na.rm = T)) %>% ungroup() %>% arrange(kategorie, zmena_p) %>% arrange(kategorie, desc(zmena_p)) %>% filter(kategorie == "workplaces") %>% replace_na(list(kraj_nazev = "Celá ČR")) %>% * gt::gt() ``` ] .panel2-tidyverse-priklad-auto[
kraj_nazev
kategorie
zmena_p
Karlovy Vary Region
workplaces
-0.1673256
Ústí nad Labem Region
workplaces
-0.1773547
Pardubice Region
workplaces
-0.1793488
Olomouc Region
workplaces
-0.1820543
Plzeň Region
workplaces
-0.1829360
Liberec Region
workplaces
-0.1900000
Zlín Region
workplaces
-0.1933023
South Bohemian Region
workplaces
-0.1953779
Vysočina Region
workplaces
-0.1976357
Moravian-Silesian Region
workplaces
-0.1996013
Central Bohemian Region
workplaces
-0.2003936
Hradec Králové Region
workplaces
-0.2026357
South Moravian Region
workplaces
-0.2244767
Celá ČR
workplaces
-0.2293023
Prague
workplaces
-0.3634884
] <style> .panel1-tidyverse-priklad-auto { color: black; width: 38.6060606060606%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-tidyverse-priklad-auto { color: black; width: 59.3939393939394%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-tidyverse-priklad-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- # Tidy data .pull-left[ ## Co to je - co řádek, to pozorování - co sloupec, to hodnota - každý typ pozorované jednotky je ve své vlastní tabulce ] .pull-right[ ## Proč - lépe se s tím pracuje (filtr atd.) - lépe se to vizualizuje - lépe se v tom vyznám (je jasné, co je hodnota) ] Zdroj: https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html --- # Tidy data: příklady ## Untidy <table> <thead> <tr> <th style="text-align:left;"> date </th> <th style="text-align:left;"> sub_region_1 </th> <th style="text-align:left;"> transit </th> <th style="text-align:left;"> retail </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Central Bohemian Region </td> <td style="text-align:left;"> 18 pct </td> <td style="text-align:left;"> 17 pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Hradec Králové Region </td> <td style="text-align:left;"> 6 pct </td> <td style="text-align:left;"> 6 pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Karlovy Vary Region </td> <td style="text-align:left;"> 18 pct </td> <td style="text-align:left;"> 19 pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Liberec Region </td> <td style="text-align:left;"> 18 pct </td> <td style="text-align:left;"> 14 pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Moravian-Silesian Region </td> <td style="text-align:left;"> 16 pct </td> <td style="text-align:left;"> 18 pct </td> </tr> </tbody> </table> --- # Tidy data: příklady ## Tidy <table> <thead> <tr> <th style="text-align:left;"> date </th> <th style="text-align:left;"> sub_region_1 </th> <th style="text-align:left;"> kategorie </th> <th style="text-align:right;"> zmena </th> <th style="text-align:left;"> jednotka </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Central Bohemian Region </td> <td style="text-align:left;"> transit </td> <td style="text-align:right;"> 18 </td> <td style="text-align:left;"> pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Central Bohemian Region </td> <td style="text-align:left;"> retail </td> <td style="text-align:right;"> 17 </td> <td style="text-align:left;"> pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Hradec Králové Region </td> <td style="text-align:left;"> transit </td> <td style="text-align:right;"> 6 </td> <td style="text-align:left;"> pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Hradec Králové Region </td> <td style="text-align:left;"> retail </td> <td style="text-align:right;"> 6 </td> <td style="text-align:left;"> pct </td> </tr> <tr> <td style="text-align:left;"> 2020-02-16 </td> <td style="text-align:left;"> Karlovy Vary Region </td> <td style="text-align:left;"> transit </td> <td style="text-align:right;"> 18 </td> <td style="text-align:left;"> pct </td> </tr> </tbody> </table> Taky někdy "dlouhá" a "široká." Pro různé účely jsou potřeba různé tvary. Balíky `dplyr` a `tidyr` pomůžou data přeskládat z jednoho tvaru do druhého (`pivot_wider()` a `pivot_longer()`). --- ## Tvary dat: `pivot_longer()/wider()` ![](tidyr-spread-gather.gif) Zdroj: https://github.com/gadenbuie/tidyexplain --- ## Propojování dat: `left_join()` ![](left-join.gif) --- class: large, center, middle otevřete `02_tabulkova-data.R` --- # Grammar of Graphics: `ggplot2` Logika, jak přemýšlet o vizualizaci dat: o tom, jak se z čísel stává něco viditelného. Standardní logika: milý Excele, namaluj mi *sloupcový graf*. Tady máš několik datových řad, něco s nimi udělej. Logika GG: každý graf má nějaké grafické prvky, které budu kreslit podle toho, na jaká data je navážu, napr: - osa x, osa y: `x = `,` y =` - barva/obrys bodu/prvku, průhlednost: `colour`, `alpha` - velikost bodu: `size` - rozdělení grafu na víc panelů podle proměnné: `facet_wrap()`, `facet_grid()` - škály (barevné, číselné - např. logaritmické, velikostní), `scale_*()` - souřadnicové systémy (standardní karteziánská, polární, geografické): `coord_*()` ``` library(ggplot2) ``` --- ```r ggplot() ``` <img src="index_files/figure-html/unnamed-chunk-12-1.png" width="504" /> --- ```r ggplot(data = gdta_rij, mapping = aes(x = date, y = zmena)) + geom_line() ``` <img src="index_files/figure-html/unnamed-chunk-13-1.png" width="504" /> NB vrstvy se přidávají znamínkem `+` --- ```r ggplot(data = gdta_rij, mapping = aes(x = date, y = zmena)) + * geom_line(aes(colour = kategorie)) ``` <img src="index_files/figure-html/unnamed-chunk-14-1.png" width="504" /> --- Uvnitř `mapping = aes(...)` se přiřazují proměnné, vně se přiřazují konstanty. .pull-left[ ```r ggplot(data = gdta_rij, mapping = aes(x = date, y = zmena)) + * geom_line(aes(colour = kategorie)) ``` <img src="index_files/figure-html/unnamed-chunk-15-1.png" width="504" /> ] .pull-right[ ```r ggplot(data = gdta_rij, mapping = aes(x = date, y = zmena)) + * geom_line(colour = "red", aes(group = kategorie)) ``` <img src="index_files/figure-html/unnamed-chunk-16-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r *ggplot(gdta_rij, * aes(x = date, y = zmena)) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_01_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + * geom_line(aes(colour = kategorie), * size = .5) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_02_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + geom_line(aes(colour = kategorie), size = .5) + * facet_wrap(vars(kategorie)) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_03_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + geom_line(aes(colour = kategorie), size = .5) + facet_wrap(vars(kategorie)) + * geom_smooth(aes(colour = kategorie)) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_04_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + geom_line(aes(colour = kategorie), size = .5) + facet_wrap(vars(kategorie)) + geom_smooth(aes(colour = kategorie)) + * scale_colour_brewer(palette = "Set1") ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_05_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + geom_line(aes(colour = kategorie), size = .5) + facet_wrap(vars(kategorie)) + geom_smooth(aes(colour = kategorie)) + scale_colour_brewer(palette = "Set1") + * theme( * panel.background = element_rect(fill = "grey95"), * legend.position = "none" * ) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_06_output-1.png" width="504" /> ] --- count: false .panel1-ggplot-priklad-auto[ ```r ggplot(gdta_rij, aes(x = date, y = zmena)) + geom_line(aes(colour = kategorie), size = .5) + facet_wrap(vars(kategorie)) + geom_smooth(aes(colour = kategorie)) + scale_colour_brewer(palette = "Set1") + theme( panel.background = element_rect(fill = "grey95"), legend.position = "none" ) + * labs( * title = "Aktivita podle krajů a typu míst", * x = NULL, * subtitle = "Změna proti normálnímu stavu", * y = NULL * ) ``` ] .panel2-ggplot-priklad-auto[ <img src="index_files/figure-html/ggplot-priklad_auto_07_output-1.png" width="504" /> ] <style> .panel1-ggplot-priklad-auto { color: black; width: 38.6060606060606%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-ggplot-priklad-auto { color: black; width: 59.3939393939394%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-ggplot-priklad-auto { color: black; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- class: middle, large 1\. R a RStudio: prostředí 2\. Základní funkce a operace 3\. Práce s tabulkovými daty **4\. Nástroje na tvorbu výstupů** --- # RMarkdown = R + Markdown Proč počítat a psát zvlášť? Text v Markdown + kód v R = Rmarkdown Kód v R se do dokumentu vkládá v tzv. *code chunks*. Ty vypadají takhle: ```` ```{r, eval=TRUE} 1 + 1 ``` ```` Vytváří se `Ctrl/Cmd+Alt+I` Chunks můžete spouštět samostatně v průběhu analýzy (`Ctrl/Cmd+Shift+Enter`) a výstup se ukáže hned pod kódem. Na konci se pak celý dokument zprocesuje čudlíkem "Knit". Výsledkem může být *HTML stránka*, *word*ový dokument nebo *PDF*. .small[viz https://socviz.co/gettingstarted.html#work-in-plain-text-using-rmarkdown] --- class: large # RMarkdown: přínos - nemusím kopírovat grafy a čísla tam a zpět - reprodukovatelnost celé práce - zmáčknutím čudlíku mám celý report aktualizovaný - text blízko čísel a grafů - víc času na přemýšlení, míň na přepínání - vše je jen text: můžu snadno srovnat, co se změnilo --- ## Markdown Jednoduchý "jazyk", umožňující textovými značkami říct, jak má text vypadat Např. .pull-left[ `**tučný text**` `*kurzíva*` <br /> `### Nadpis 3` Odkaz: `<https://google.com>` a `[odkaz s textem](https://google.com)` Kód přímo v textu: dnes je `` 2020-11-18 `` ] .pull-right[ **tučný text** *kurzíva* ### Nadpis 3 Odkaz: <https://google.com> a [odkaz s textem](https://google.com) Kód přímo v textu: dnes je 2020-11-18 ] --- class: large, middle, center otevřete `03_report-reseni.Rmd` --- # Kam dál .pull-left[ ## Širší nástroje - Git a Github: verzování kódu a spolupráce - Šablony pro Rmarkdown (Word, PDF) ] .pull-right[ ## R - Pokročilé úpravy dat (`stringr`, `dplyr::across()`) - Faktory (balík `forcats`) - Přístup do databází, viz [db.rstudio.com](https://db.rstudio.com) - Vizuální styly na míru (`ggplot2::theme()`) - Tabulky (např. balík `gt`) ## Otevřená data v R viz [tento dokument](https://petrbouchal.xyz/slides/pssau2020-07/) ] --- # Kam dál: online knihy viz část ["Kam dál po workshopu" na webu kurzu](https://petrbouchal.xyz/eval2020) --- class: middle, center, inverse .large[ (Tato prezentace je také reprodukovatelná: Viz [<span style="text-decoration: underline; color: #fff">kód</span>](https://github.com/petrbouchal/eval2020/blob/main/docs/slides/index.Rmd).) Prezentaci samotnou najdete na [<span style="text-decoration: underline; color: #fff">petrbouchal.xyz/eval2020/slides</span>](https://petrbouchal.xyz/eval2020/slides). ] --- class: center, middle # Poděkování EJ NOK MMR Tvůrci tidyverse Yihui Xie, tvůrce balíku xaringan (nástroj těchto slidů) Garick Aden-Buie: balíky xaringanExtra, xaringanthemr flipbookr --- class: inverse, bottom, right layout: false .large[ <a href="https://twitter.com/petrbouchal"><svg style="height:0.8em;top:.04em;position:relative;fill:white;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg></a> <a href="https://github.com/petrbouchal"><svg style="height:0.8em;top:.04em;position:relative;fill:white;" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></a> <a href="https://linkedin.com/in/petrbouchal"><svg style="height:0.8em;top:.04em;position:relative;fill:white;" viewBox="0 0 448 512"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg></a> petrbouchal pbouchal@gmail.com ]