1.2 Ochutnávka práce s daty

V tomto oddíle začneme se slíbenou ochutnávkou toho, na co se můžete v R těšit. Začneme práci s daty. Nevadí, že nebudete rozumět všemu, co se v této kapitole děje. Věnujte však pozornost tomu, jak jednoduše můžete dostat celkem složitý výsledek.

Jak se v R zachází s datovými soubory, si ukážeme na příkladu data setu diamonds. Nejdříve načteme potřebné balíky pomocí funkce library() a následně i vlastní data.

library(dplyr)
library(purrr)
library(ggplot2)
library(stargazer)
data("diamonds")

Nejprve se na data podíváme. Data set obsahuje údaje o 53 940 diamantech. Pro každý diamant (řádek tabulky) data set uvádí váhu diamantu v karátech, kvalitu jeho řezu (cit), jeho barvu (chlor), rozměry a cenu (proce). R inteligentně vypíše jen několik prvních řádků tabulky.

diamonds
## # A tibble: 53,940 x 10
##    carat cut       color clarity depth table price     x     y     z
##    <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
##  2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
##  3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
##  4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
##  5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
##  6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
##  7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
##  8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
##  9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
## 10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
## # … with 53,930 more rows

R umožňuje s daty manipulovat velmi elegantně. Například se můžeme podívat na cenu a váhu u nejlépe zbarvených kamenů. Následující kód nejprve z data setu vyfiltruje kameny se správnou barvou, a pak vybere zvolené sloupce:

diamonds %>%
    filter(color == "D") %>%
    select(color, price, carat)
## # A tibble: 6,775 x 3
##    color price carat
##    <ord> <int> <dbl>
##  1 D       357  0.23
##  2 D       402  0.23
##  3 D       403  0.26
##  4 D       403  0.26
##  5 D       403  0.26
##  6 D       404  0.22
##  7 D       552  0.3 
##  8 D       552  0.3 
##  9 D       552  0.3 
## 10 D       553  0.24
## # … with 6,765 more rows

Data lze i jednoduše řadit. Například je možné se podívat na ty nejdražší kameny. Následující kód setřídí kameny sestupně podle ceny (tj. od nejvyšší po nejnižší cenu):

diamonds %>%
    arrange(desc(price))
## # A tibble: 53,940 x 10
##    carat cut       color clarity depth table price     x     y     z
##    <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1  2.29 Premium   I     VS2      60.8    60 18823  8.5   8.47  5.16
##  2  2    Very Good G     SI1      63.5    56 18818  7.9   7.97  5.04
##  3  1.51 Ideal     G     IF       61.7    55 18806  7.37  7.41  4.56
##  4  2.07 Ideal     G     SI2      62.5    55 18804  8.2   8.13  5.11
##  5  2    Very Good H     SI1      62.8    57 18803  7.95  8     5.01
##  6  2.29 Premium   I     SI1      61.8    59 18797  8.52  8.45  5.24
##  7  2.04 Premium   H     SI1      58.1    60 18795  8.37  8.28  4.84
##  8  2    Premium   I     VS1      60.8    59 18795  8.13  8.02  4.91
##  9  1.71 Premium   F     VS2      62.3    59 18791  7.57  7.53  4.7 
## 10  2.15 Ideal     G     SI2      62.6    54 18791  8.29  8.35  5.21
## # … with 53,930 more rows

Jednotlivé operace lze snadno kombinovat do větších celků. Řekněme, že nás např. zajímá, jaká cena nejdražšího kamene pro každou barvu. Nejdříve rozdělíme tabulku do skupin podle barvy kamene, pak každou skupinu setřídíme podle ceny od nejvyšší po nejnižší, a pak vybereme 1. (tj. nejdražší) kámen v každé skupině.

diamonds %>%
    group_by(color) %>%
    arrange(desc(price)) %>%
    slice(1L)
## # A tibble: 7 x 10
## # Groups:   color [7]
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  2.19 Ideal     D     SI2      61.8    57 18693  8.23  8.49  5.17
## 2  2.02 Very Good E     SI1      59.8    59 18731  8.11  8.2   4.88
## 3  1.71 Premium   F     VS2      62.3    59 18791  7.57  7.53  4.7 
## 4  2    Very Good G     SI1      63.5    56 18818  7.9   7.97  5.04
## 5  2    Very Good H     SI1      62.8    57 18803  7.95  8     5.01
## 6  2.29 Premium   I     VS2      60.8    60 18823  8.5   8.47  5.16
## 7  3.01 Premium   J     SI2      60.7    59 18710  9.35  9.22  5.64

Data lze i jednoduše agregovat. Můžeme např. snadno spočítat průměrnou cenu pro každou barvu kamenů. Opět kameny rozdělíme do skupin podle barvy a pro každou skupinu vypočítáme průměrnou cenu kamenů ve skupině:

diamonds %>%
    group_by(color) %>%
    summarise(average_price = mean(price, na.rm = TRUE))
## # A tibble: 7 x 2
##   color average_price
##   <ord>         <dbl>
## 1 D             3170.
## 2 E             3077.
## 3 F             3725.
## 4 G             3999.
## 5 H             4487.
## 6 I             5092.
## 7 J             5324.

Kritéria je možné i kombinovat. Následující tabulka obsahuje průměrnou cenu kamene pro kombinaci barvy a řezu:

diamonds %>%
    group_by(color, cut) %>%
    summarise(average_price = mean(price, na.rm = TRUE))
## # A tibble: 35 x 3
## # Groups:   color [7]
##    color cut       average_price
##    <ord> <ord>             <dbl>
##  1 D     Fair              4291.
##  2 D     Good              3405.
##  3 D     Very Good         3470.
##  4 D     Premium           3631.
##  5 D     Ideal             2629.
##  6 E     Fair              3682.
##  7 E     Good              3424.
##  8 E     Very Good         3215.
##  9 E     Premium           3539.
## 10 E     Ideal             2598.
## # … with 25 more rows