R – Četnost podruhé

Mějme následující data:

> head(dotaznik.csv[,c(2,3)])
  type gender
1    H      F
2    H      M
3    A      F
4    A      M
5    A      F
6    H      M

A potřebujeme zjistit absolutní a relativní četnost výskytu žen a mužů, rozdělenou ještě podle hodnoty v type .

> tbl <- table(dotaznik.csv$gender, dotaznik.csv$type)
> tbl
   
     A  H
  M 18 16
  Ž 17 19

Opět převedeme na data frame

> tbl.frame <- as.data.frame(tbl)
> tbl.frame
  Var1 Var2 Freq
1    M    A   18
2    Ž    A   17
3    M    H   16
4    Ž    H   19

A máme absolutní četnost. Teď vypočítáme relativní četnost.

> library(plyr) 
> ddply(tbl.frame, .(Var2), transform, prop=Freq/sum(Freq))
  Var1 Var2 Freq      prop
1    M    A   18 0.5142857
2    Ž    A   17 0.4857143
3    M    H   16 0.4571429
4    Ž    H   19 0.5428571

Což znamená: pro každý subset z framu tbl.frame , rozdělený podle proměnné Var2 , proveď transform , a vypočti relativní četnost podle frekvence (abs. četnosti) a součtu hodnot frekvence.

R – četnost a graf

Dostal jsem pověření z nejvyšších míst vyrobit statistické zhodnocení dotazníků. A protože bytostně nemám rád Excel, našel jsem R a zkouším.

Udělal jsem data do CSV souboru a nahrál do R (RStudio)

> head(dotaznik.csv)
  num type gender age height weight           edu
1   1    H      M  60    182    100 Vysokoškolské
2   2    H      M  49    188    102      Vyučen/a
3   3    H      M  61    176     75      Vyučen/a
4   4    H      M  56    180    110       Střední
5   5    H      M  47    180     95 Vysokoškolské
6   6    H      M  48    178     95       Střední

Zkusíme vyrobit četnost vzdělání (edu) a potom ji ještě rozdělit podle pohlaví (gender).

> edu <- table(dotaznik.csv$edu)
> edu

      Střední Vysokoškolské Vyšší odborné      Vyučen/a 
           30             7             2            25 
     Základní 
            6

Máme tabulku, ale potřebujeme z ní frame

> fedu <- as.data.frame(edu)
> fedu
           Var1 Freq
1       Střední   30
2 Vysokoškolské    7
3 Vyšší odborné    2
4      Vyučen/a   25
5      Základní    6

Přidáme relativní četnost (mean)

> fedu$mean <- fedu$Freq / sum(fedu$Freq)
> fedu
           Var1 Freq       mean
1       Střední   30 0.42857143
2 Vysokoškolské    7 0.10000000
3 Vyšší odborné    2 0.02857143
4      Vyučen/a   25 0.35714286
5      Základní    6 0.08571429

A teď na graf. Používáme ggplot2.

ggplot(fedu, aes(x=Var1, y=Freq)) + geom_bar(stat='identity')

Rplot1

Fajn. Ale chceme graf otočit

ggplot(fedu, aes(x=Var1, y=Freq)) + geom_bar(stat='identity') + coord_flip()

Rplot2

Teď ještě smazat popisek osy x a přepsat osu y.

ggplot(fedu, aes(x=Var1, y=Freq)) + geom_bar(stat='identity') +
coord_flip() +
xlab('Vzdělání') + 
theme(axis.title.x = element_blank()) + 
ggtitle('Dosažené vzdělání')

Rplot3

A finálně přidáme hodnoty frekvence do jednotlivých sloupců.

ggplot(fedu, aes(x=Var1, y=Freq)) + 
geom_bar(stat='identity', position=position_dodge()) + 
geom_text(aes(label=Freq), hjust=1.3, color="white",position = position_dodge(0.9), size=3.5) + 
coord_flip() + 
xlab('Vzdělání') + 
theme(axis.title.x = element_blank()) + 
ggtitle('Dosažené vzdělání')

Rplot4

A teď trochu komplexněji. Ještě to rozdělíme na muže a ženy..

> edu <- table(dotaznik.csv$gender, dotaznik.csv$edu)
> edu
   
    Střední Vysokoškolské Vyšší odborné Vyučen/a Základní
  M      10             4             2       17        1
  Ž      20             3             0        8        5

> fedu <- as.data.frame(edu)
> fedu
   Var1          Var2 Freq
1     M       Střední   10
2     Ž       Střední   20
3     M Vysokoškolské    4
4     Ž Vysokoškolské    3
5     M Vyšší odborné    2
6     Ž Vyšší odborné    0
7     M      Vyučen/a   17
8     Ž      Vyučen/a    8
9     M      Základní    1
10    Ž      Základní    5

a přidáme graf

> ggplot(fedu, aes(x=Var2, y=Freq, fill=Var1)) + 
geom_bar(stat='identity', position=position_dodge()) + 
geom_text(aes(label=Freq), hjust=1.6, color="white",position = position_dodge(0.9), size=3.5) + 
coord_flip() + 
xlab('Vzdělání') + 
theme(axis.title.x = element_blank()) + 
ggtitle('Dosažené vzdělání') + 
labs(fill = 'Pohlaví')

Rplot6

A co když budeme chtít jeden bar, ale rozdělený podle hodnot?

# seridime podle Var2 a Freq
> library(plyr)
> fedu_s <- arrange(fedu, Var2, Freq)
> fedu_s
   Var1          Var2 Freq
1     M       Střední   10
2     Ž       Střední   20
3     Ž Vysokoškolské    3
4     M Vysokoškolské    4
5     Ž Vyšší odborné    0
6     M Vyšší odborné    2
7     Ž      Vyučen/a    8
8     M      Vyučen/a   17
9     M      Základní    1
10    Ž      Základní    5

# a pridame souhrnny soucet, rozdeleny s kazdym jinym Var2
> fedu_s_sum <- ddply(fedu_s, 'Var2', transform, label_ypos=cumsum(Freq))
> fedu_s_sum
   Var1          Var2 Freq label_ypos
1     M       Střední   10         10
2     Ž       Střední   20         30
3     Ž Vysokoškolské    3          3
4     M Vysokoškolské    4          7
5     Ž Vyšší odborné    0          0
6     M Vyšší odborné    2          2
7     Ž      Vyučen/a    8          8
8     M      Vyučen/a   17         25
9     M      Základní    1          1
10    Ž      Základní    5          6

A graf

ggplot(fedu_s_sum, aes(x=Var2, y=Freq, fill=Var1)) + 
geom_bar(stat='identity') + 
geom_text(aes(label=Freq, y=label_ypos), hjust=1.6, color="white", size=3.5) + 
coord_flip() + 
xlab('Vzdělání') + 
theme(axis.title.x = element_blank()) + 
ggtitle('Dosažené vzdělání') + 
labs(fill = 'Pohlaví')

Rplot7