Agregace
Agregace dat se v analýze využívá:
- pro úpravy dat (sjednocování řádků nebo sloupců v případě opakovaných měření)
- pro generování sumárních statistik a frekvenčních tabulek (sumarizace)
Funkce pro agregaci v R se dají rozdělit podle typu objektu:
- Pro seznamy, matice a pole: apply(), mapply(), sweep(), sapply(), lapply()
- Pro datové tabulky: aggregate(), by(), table()
Výběr agregační funkce se tedy provádí jednak podle typu objektu, ale také podle toho jestli jsou skupiny definovány jednou nebo více proměnnými:
- Skupiny jsou definovány jako prvky seznamu (list): sapply(), lapply()
- Skupiny jsou definovány řádky nebo sloupci matice: apply()
- Skupiny definované jednou nebo více proměnnými: aggregate(), tapply()
Pro podrobnější informace o použití funkcí skupiny apply()si prostudujte výukovou jednotku:Skupiny funkcí apply() předmětu Výpočetní matematické systémy.
Funkce aggregate() - shrnuje hodnoty ve skupinách do popisných statistik a vrací výsledek v nejvhodnější formě. Ukážeme si na příkladu dat kosatců:
> data (iris)
Vypočteme průměrné hodnoty čtyř charakteristik květů kosatců (šířka a délka okvětních a kališních lístků) na základě příslušnosti ke druhu kosatce :
> data(iris)
> aggregate(x=iris[,-5], by=iris[5], FUN = mean)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
Skupinová proměnná musí být definována jako seznam. Protože iris je datová tabulka, nejjednodušší způsob je odvolat se na skupinovou proměnnou pomocí iris[5].
Další způsob agregace dat je použít nástroje knihovny reshape, kterou jsme si představili již v kapitole Reorganizace datových tabulek při tvorbě dlouhé (funkce melt) a široké (funkce cast) datové tabulky.
Funkce cast() dokáže nejen vytvořit širokou verzi tabulky, ale také sumarizovat hodnoty podle zadané funkce.
Principem použití je tedy nejdříve vytvořit dlouhou verzi datového souboru pomocí funkce melt(), kterou potom přeformujeme pomocí funkce cast().
Připomínáme, že melt() je funkce, která uspořádá všechny proměnné, které měříme, do dvou sloupců: sloupec variable obsahující název proměnné a sloupec value obsahující hodnoty.
Při jejím použití je nutné rozlišovat identifikátorové proměnné a proměnné, které měříme - které chceme agregovat. Defaultní nastavení je, že proměnné typu faktor a character jsou identifikátorové, jinak je třeba definovat proměnné pomocí argumentů id.var = a measure.var =.
Pro příklad použijeme znovu datovou tabulku state.fin:
> data(state)
> library(reshape)
> state.fin <- data.frame(state.x77, state=row.names(state.x77), region=state.region, division = state.division, row.names=1:50)
> head(state.fin)
Population Income Illiteracy Life.Exp Murder HS.Grad Frost Area state region
1 3615 3624 2.1 69.05 15.1 41.3 20 50708 Alabama South
2 365 6315 1.5 69.31 11.3 66.7 152 566432 Alaska West
3 2212 4530 1.8 70.55 7.8 58.1 15 113417 Arizona West
4 2110 3378 1.9 70.66 10.1 39.9 65 51945 Arkansas South
5 21198 5114 1.1 71.71 10.3 62.6 20 156361 California West
6 2541 4884 0.7 72.06 6.8 63.9 166 103766 Colorado West
division
1 East South Central
2 Pacific
3 Mountain
4 West South Central
5 Pacific
6 Mountain
Pro jednotlivé regiony chceme vypočítat průměrnou velikost populace, příjmu, procenta analfabetů, věku dožití, podílu vražd na 100 tis. obyvatel, procento lidí se střední školou a průměrný počet dnů v roce s minimální teplotou pod 0.
Datovou tabulku state.fin můžeme v tomto smyslu považovat za široká data. Pomocí funkce melt() vytvoříme "dlouhou" verzi dat. Protože state a region jsou faktory, jsou defaultně považovány za identifikátorové proměnné:
> mstates <- melt(state.fin)
Using state, region, division as id variables
> head(mstates)
state region division variable value
1 Alabama South East South Central Population 3615
2 Alaska West Pacific Population 365
3 Arizona West Mountain Population 2212
4 Arkansas South West South Central Population 2110
5 California West Pacific Population 21198
6 Colorado West Mountain Population 2541
Nyní pomocí funkce cast() provedeme agregaci hodnot ve čtyřech US regionech a vypočteme průměr:
> cast(data=mstates, formula=region~variable, fun.aggregate=mean)
region Population Income Illiteracy Life.Exp Murder HS.Grad Frost Area
1 Northeast 5495.111 4570.222 1.000000 71.26444 4.722222 53.96667 132.7778 18141.00
2 South 4208.125 4011.938 1.737500 69.70625 10.581250 44.34375 64.6250 54605.12
3 North Central 4803.000 4611.083 0.700000 71.76667 5.275000 54.51667 138.8333 62652.00
4 West 2915.308 4702.615 1.023077 71.23462 7.215385 62.00000 102.1538 134463.00
Argument formula= funkce cast() určuje způsob agregace dat, zatímco argument fun.aggregate= zas funkci, kterou se data agregují. Vyměníme-li ve formuli region a variable, dostaneme stejný výsledek, ale transponovanou tabulku:
> cast(mstates, variable~region, mean)
variable Northeast South North Central West
1 Population 5495.111111 4208.12500 4803.00000 2.915308e+03
2 Income 4570.222222 4011.93750 4611.08333 4.702615e+03
3 Illiteracy 1.000000 1.73750 0.70000 1.023077e+00
4 Life.Exp 71.264444 69.70625 71.76667 7.123462e+01
5 Murder 4.722222 10.58125 5.27500 7.215385e+00
6 HS.Grad 53.966667 44.34375 54.51667 6.200000e+01
7 Frost 132.777778 64.62500 138.83333 1.021538e+02
8 Area 18141.000000 54605.12500 62652.00000 1.344630e+05
Na rozdíl od funkce aggregate(), funkce cast() akceptuje i funkce, jejichž výstupem jsou vektory, popřípadě akceptuje i seznam více funkcí.
použití .~variable vypočítá průměry proměnných pro celý soubor:
> cast(mstates,. ~ variable, mean)
value Population Income Illiteracy Life.Exp Murder HS.Grad Frost Area
1 (all) 4246.42 4435.8 1.17 70.8786 7.378 53.108 104.46 70735.88
variable ~. | region uspořádá výsledky do seznamu:
> cast(mstates, variable ~. | region, mean)
$Northeast
variable (all)
1 Population 5495.111111
2 Income 4570.222222
3 Illiteracy 1.000000
4 Life.Exp 71.264444
5 Murder 4.722222
6 HS.Grad 53.966667
7 Frost 132.777778
8 Area 18141.000000
$South
variable (all)
1 Population 4208.12500
2 Income 4011.93750
3 Illiteracy 1.73750
4 Life.Exp 69.70625
5 Murder 10.58125
6 HS.Grad 44.34375
7 Frost 64.62500
8 Area 54605.12500
$`North Central`
variable (all)
1 Population 4803.00000
2 Income 4611.08333
3 Illiteracy 0.70000
4 Life.Exp 71.76667
5 Murder 5.27500
6 HS.Grad 54.51667
7 Frost 138.83333
8 Area 62652.00000
$West
variable (all)
1 Population 2.915308e+03
2 Income 4.702615e+03
3 Illiteracy 1.023077e+00
4 Life.Exp 7.123462e+01
5 Murder 7.215385e+00
6 HS.Grad 6.200000e+01
7 Frost 1.021538e+02
8 Area 1.344630e+05