4. Lýsandi tölfræði

Í þessum kafla munum við fjalla um algengar lýsistærðir sem notaðar eru til að lýsa gögnum. Við munum skipta umfjölluninni upp eftir því hvort verið sé að vinna með talnabreytur eða flokkabreytur. Fyrir talnabreyturnar munum við kynnast aðferðunum min(), max(), mean() ,median(), var(), sd(), quantile(), og IQR(). Þær eru teknar fyrir í hluta 4.1. Á flokkbreytur notum við skipanirnar table() og prop.table en þær eru teknar fyrir í hluta 4.2. Að lokum fjallar hluti 4.3 um aðrar gagnlegar skipanir. Þar munum við sjá aðferðirnar round(), summary() og tapply().

4.1. Talnabreytur

4.1.1. Talnabreytur

Í þessum hluta munum við skoða lýsistærðir fyrir talnabreytur. Við byrjum á að sjá hvernig við getum auðveldlega fundið hæsta og lægsta gildið sem breytan tekur en snúum okkur svo að lýsistærðum sem lýsa miðju og breytileika talnabreyta. Það er oft svo að það vantar mælingar í breytunni okkar, þá kemur na.rm = T stillingin að góðum notum en hana má nota í nær öllum aðferðunum sem fjallað verður um í þessum hluta.

4.1.1.1. max()

Athugið

Inntak: nafn á vigri/breytu

Úttak: hæsta gildi

Helstu stillingar: na.rm


Aðferðin max() gefur hæsta gildið. Viljum við finna hæsta gildið af 3, 4, 7 og 8 gerum við það með

max(c(3,4,7,8))
## [1] 8

en viljum við finna hæsta gildi ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar.

max(konnun$ferdatimi_skoli, na.rm=T)
## [1] 75

4.1.1.2. min()

Athugið

Inntak: nafn á vigri/breytu

Úttak: lægsta gildi

Helstu stillingar: na.rm


Aðferðin min() gefur lægsta gildið. Viljum við finna lægsta gildið af 3, 4, 7 og 8 gerum við það með

min(c(3,4,7,8), na.rm=T)
## [1] 3

en viljum við finna lægsta gildi ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar.

min(konnun$ferdatimi_skoli, na.rm=T)
## [1] 0

4.1.2. Miðja

4.1.2.1. mean()

Athugið

Inntak: nafn á vigri/breytu

Úttak: meðaltal

Helstu stillingar: na.rm


Aðferðin mean() reiknar meðaltal. Viljum við reikna meðaltal talnanna 3, 4, 7 og 8 gerum við það með:

mean(c(3,4,7,8))
## [1] 5.5

Viljum við reikna meðaltal ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar.

mean(konnun$ferdatimi_skoli, na.rm=T)
## [1] 19.42786

4.1.2.2. median()

Athugið

Inntak: nafn á vigri/breytu

Úttak: miðgildið

Helstu stillingar: na.rm


Aðferðin median() reiknar miðgildi. Viljum við reikna miðgildi talnanna 3, 4, 7 og 8 gerum við það með

median(c(3,4,7,8))
## [1] 5.5

en viljum við reikna miðgildi ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar:

median(konnun$ferdatimi_skoli, na.rm=T)
## [1] 16

4.1.3. Breytileiki

4.1.3.1. var()

Athugið

Inntak: nafn á vigri/breytu

Úttak: dreifni

Helstu stillingar: na.rm


Aðferðin var() reiknar dreifni. Viljum við reikna dreifni talnanna 3, 4, 7 og 8 gerum við það með

var(c(3,4,7,8))

en viljum við reikna dreifni ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar:

var(konnun$ferdatimi_skoli, na.rm=T)
## [1] 198.786

4.1.3.2. sd()

Athugið

Inntak: nafn á vigri/breytu

Úttak: staðalfrávik

Helstu stillingar: na.rm


Aðferðin sd() reiknar staðalfrávik. Viljum við reikna staðalfrávik talnanna 3, 4, 7 og 8 gerum við það með

sd(c(3,4,7,8))
## [1] 2.380476

en viljum við reikna staðalfrávik ákveðinnar breytu gerum við það með að mata aðferðina með nafni breytunnar:

sd(konnun$ferdatimi_skoli, na.rm=T)
## [1] 14.09915

4.1.3.3. quantile()

Athugið

Inntak: nafn á vigri/breytu

Úttak: hlutfallsmörk

Helstu stillingar: na.rm, probs


Aðferðin quantile reiknar út hlutfallsmörk. Sjálfgefna stilling aðferðarinnar skilar okkur fjórðungamörkunum. Við mötum aðferðina með nafninu á breytunni:

quantile(konnun$ferdatimi_skoli, na.rm=T)
## 0%  25%  50%  75% 100%
## 0   8   16   25   75

Við getum notað probs stillinguna til að reikna hvaða hlutfallsmörk sem er.

4.1.4. Samspil tveggja talnabreyta

4.1.4.1. cor()

Athugið

Inntak: nafn á tveimur vigrum/breytum

Úttak: fylgni

Helstu stillingar: use


Reikna má fylgni milli tveggja breyta í R með cor() aðferðinni. Við þurfum að mata aðferðina með heitunum á breytunum sem við ætlum að reikna fylgnina á milli. Viljum við reikna fylgnina á heildarlengdar og höfuðlengdar pokarotta, semsagt breytanna heildarlengd og hofud_lengd, notum við skipunina:

cor(pokarotta$heildarlengd, pokarotta$hofud_lengd)
## [1] 0.6910937

Stillinguna use="complete.obs" notum við vanti einhverjar mælingar. Munið að við reiknum aðeins út fylgnistuðul sé línulegt samband á milli breytanna!

4.2. Flokkabreytur

Í þessum hluta reiknum við út lýsistærðir fyrir flokkabreytur. Við byrjum á að sjá hvernig finna má tíðni og hlutföll á auðveldan hátt og skoðum svo lýsistærðir sem lýsa sambandi tveggja flokkabreyta.

4.2.1. Tíðni og hlutfall

4.2.1.1. table()

Athugið

Inntak: nafn á flokkabreyt(um)

Úttak: tíðni


table() skipunin telur hversu oft hver og ein útkoma flokkabreytu kemur fyrir. Viljum við sjá hversu margir nemendur voru í LAN203 og STÆ209 í gagnasafninu okkar gerum við það með:

table(konnun$is)
##
## Jarðaberja  Súkkulaði    Vanilla
##         39        91         71

Við getum líka matað table() með tveimur flokkabreytum og þá telur hún hversu oft hversu mörg viðfangsefni hljóta hverja og eina af mögulegum samsetningum útkoma beggja breytanna eins og er sýnt hér að neðan.

table(konnun$is, konnun$dyr)
##
##               Hunda Ketti
## Jarðaberja    23    16
## Súkkulaði     61    30
## Vanilla       43    28

4.2.1.2. prop.table()

Athugið

Inntak: tafla - úttak úr table()

Úttak: hlutföll

Helstu stillingar: margin


table() skipunin skilar okkur fjölda/tíðni en viljum við frekar hlutföll getum við notað prop.table() aðferðina. Við mötum hana með því sem table() aðferðin skilar:

prop.table(table(konnun$is))
##
## Jarðaberja  Súkkulaði    Vanilla
##  0.1940299  0.4527363  0.3532338

Séum við að vinna með tvær breytur má mata prop.table() aðferðina á þrennan hátt. Viljum við fá heildarhlutföllin gerum við það með:

prop.table(table(konnun$is, konnun$dyr))
##
##                  Hunda      Ketti
##  Jarðaberja 0.11442786 0.07960199
##  Súkkulaði  0.30348259 0.14925373
##  Vanilla    0.21393035 0.13930348

Í töflunni má t.d. sjá að um 30% nemenda í gagnasafninu kunna betur við hunda en ketti og finnst súkkulaðiís bestur. Viljum við aftur á móti skoða hlutföllin eftir línum í töflunni gerum við það með:

prop.table(table(konnun$is, konnun$dyr), margin=1)
##
##                 Hunda     Ketti
##  Jarðaberja 0.5897436 0.4102564
##  Súkkulaði  0.6703297 0.3296703
##  Vanilla    0.6056338 0.3943662

Í töflunni má t.d. sjá að um 67% nemenda sem finnst súkkulaðiís bestur eru hrifnir af hundum. Viljum við hins vegar skoða hlutföllin eftir dálkum í töflunni gerum við það með:

prop.table(table(konnun$is, konnun$dyr), margin=2)
##
##                 Hunda     Ketti
##  Jarðaberja 0.1811024 0.2162162
##  Súkkulaði  0.4803150 0.4054054
##  Vanilla    0.3385827 0.3783784

Í töflunni má t.d. sjá að um 21.6% þeirra sem eru hrifinn af köttum elska jarðaberjaís.

Takið eftir að nota má prop.table() til að reikna lýsistærðirnar næmi (e. sensitivity) og sértæki (e. specificity).

4.3. Aðrar gagnlegar skipanir

4.3.1. Aðrar gagnlegar skipanir

4.3.1.1. round()

Athugið

Inntak: gildi, vigur, tafla…

Úttak: gildi, vigur, tafla með námunduðum gildum

Helstu stillingar: digits


R skilar stundum óþarflega mörgum aukastöfum. Við getum notað round() aðferðina til að stjórna hversu mörgum aukastöfum er skilað. Við mötum aðferðina með því sem reikna á og fjölda aukastafa sem á að skila. Skoðum t.d. töfluna hér að ofan. Viljum við aðeins að þremur aukastöfum sé skilað gerum við það með:

round(prop.table(table(konnun$is, konnun$dyr),2),3)
##
##             Hunda Ketti
##  Jarðaberja 0.181 0.216
##  Súkkulaði  0.480 0.405
##  Vanilla    0.339 0.378

4.3.1.2. summary()

Athugið

Inntak: allt milli himins og jarðar

Úttak: flest það sem þú vilt vita


Við munum rekast á skipunina summary() nokkrum sinnum í þessari bók. Skipunin skilar mismunandi úttaki eftir því með hverju hún er mötuð. Sé hún mötuð með talnabreytu gefur summary() aðferðin okkur fimm tölu samantekt og meðaltal. Það er bæði hægt að mata aðferðina með tölum

summary(c(3,4,7,8))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
##    3.00    3.75    5.50    5.50    7.25    8.00

og með nafni breytu:

summary(konnun$ferdatimi_skoli)
##   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
##   0.00    8.00   16.00   19.43   25.00   75.00

Ef breytan sem við erum að skoða er flokkabreyta gefur summary() aðferðin okkur nafnið á flokkunum og fjölda viðfangsefna í hverjum flokki.

Það er líka hægt að mata summary() aðferðina með nafninu á gagnatöflu og fáum við þá upplýsingar um allar breyturnar í töflunni.

summary(konnun)
##       X            is            ferdatimi_skoli styrikerfi_simi
## Min.   :  1   Length:201         Min.   : 0.00   Length:201
## 1st Qu.: 51   Class :character   1st Qu.: 8.00   Class :character
## Median :101   Mode  :character   Median :16.00   Mode  :character
## Mean   :101                      Mean   :19.43
## 3rd Qu.:151                      3rd Qu.:25.00
## Max.   :201                      Max.   :75.00
## ferdamati_skoli    systkini_fjoldi      dyr             feministi
## Length:201         Min.   : 0.000   Length:201         Length:201
## Class :character   1st Qu.: 2.000   Class :character   Class :character
## Mode  :character   Median : 2.000   Mode  :character   Mode  :character
##                    Mean   : 2.541
##                    3rd Qu.: 3.000
##                    Max.   :10.000
## staerdfraedi_gaman  smjor_kostar    napoleon_faeddur  stefnumot
## Min.   :2          Min.   : 144.0   Min.   :  46     Length:201
## 1st Qu.:6          1st Qu.: 450.0   1st Qu.:1740     Class :character
## Median :7          Median : 595.0   Median :1769     Mode  :character
## Mean   :7          Mean   : 593.8   Mean   :1733
## 3rd Qu.:8          3rd Qu.: 745.0   3rd Qu.:1800
## Max.   :9          Max.   :1490.0   Max.   :3142
##  messi_staerd       kosid
## Min.   :  1.65   Length:201
## 1st Qu.:163.00   Class :character
## Median :169.00   Mode  :character
## Mean   :163.58
## 3rd Qu.:172.00
## Max.   :191.00

4.3.1.3. tapply()

Athugið

Inntak: nafn á talnabreytu, nafn á flokkabreytu og nafn á aðferð fyrir lýsistærð

Úttak: gildi á lýsistærð fyrir talnabreytuna reiknað fyrir sérhvern flokk flokkabreytunnar


tapply() skipunin getur verið mjög gagnleg viljum við reikna út lýsistærðir talnabreytu fyrir hvern flokk í flokkabreytu sem tilheyrir sömu gagnatöflu og talnabreytan. Við mötum tapply() aðferðina með nafninu á talnabreytunni, nafninu á flokkabreytunni og nafninu á aðferðinni sem við viljum beita. Ef það vantar einhver gildi þurfum við að nota na.rm=TRUE líkt og áður. Viljum við t.d. reikna út meðaltal ferðatíma í skóla eftir ferðamáta gerum við það með:

tapply(konnunat$ferdatimi_skoli, konnun$ferdamati_skoli, mean, na.rm=T)
##            Á annan hátt Á hjóli / rafhlaupahjóli     Gangandi / skokkandi
##                2.500000                11.666667                 7.588235
##            Með einkabíl               Með strætó
##               19.923077                33.733333

4.3.1.4. Pípurtiháttur

Hingað til hafið þið kynnst allskyns skipunum í R og ættuð að vera orðin nokkuð kunnug R umhverfinu. Þegar skipanir eru orðanr langar og flóknar getur verið gott að nota pípurithátt. Táknið %>% lesið „og þá“. Pípur eru notaðar til að „pípa“ lausn úr einni skipun yfir í aðra. Með því að nota pípurihátt verða skipanirnar einfaldari og auðskiljanlegar. Skoðum nokkur dæmi um pípurithátt:

Ef við viljum t.d. finna meðaltalið á tölunum 1-101, taka svo kvaðratrótina af meðaltalinu og skila með tveimur aukastöfum. Án pípunar er það gert svona:

round(sqrt(mean(1:101)),2)
## 7.14

Með pípun:

1:101 %>%
   mean() %>%
   sqrt() %>%
   round(2)

## 7.14

Þessa skipun er auðveldara að lesa.

Ef við viljum skoða meðalferðatíma í skóla hjá þeim sem ferðast með strætó eftir því hvaða ís þeim finnst bestur. Byrjum að gera þetta án pípunar.

konnun1 <- konnun
konnun1 <- filter(konnun1, ferdamati_skoli=="Með strætó")
konnun1 <- select(konnun1, ferdatimi_skoli, is)
konnun1 <- group_by(konnun1, is)
konnun1 <- summarize(konnun1, Meðalferðatími=mean(ferdatimi_skoli))
konnun1
## is             Meðalferðatími
## Jarðaberja     48.60000
## SúkkulaðI      25.07692
## Vanilla        36.91667

Hér þurftum við að búa til nýtt gagnasett og yfirskrifa það. Mun einfaldara er að gera þetta með pípurithætti.

konnun %>%
   filter(ferdamati_skoli=="Með strætó") %>%
   select(ferdatimi_skoli, is) %>%
   group_by(is) %>%
   summarise(mean(ferdatimi_skoli))

## is             Meðalferðatími
## Jarðaberja     48.60000
## SúkkulaðI      25.07692
## Vanilla        36.91667

Það má líka nota pípurithátt við að teikna myndir.

konnun %>% ggplot(aes(x=is, y=ferdatimi_skoli))+
geom_boxplot()
../_images/mynd_pipu_4.svg

Skoðum fleiri dæmi:

konnun %>% select(ferdatimi_skoli) %>% summary()
## ferdamati_skoli
## Min.     :0.00
## 1at Qu.  :8.00
## Median   :16.00
## Mean     :19.43
## 3rd Qu   :25.00
## Max.     :75.00

Einnig má nota kable() skipunina sem útbýr fína töflu.

table(konnun$stefnumot) %>% kable()
## Var1           Freq
## Á ísrúnt       93
## Á kaffihús     74
## Í bíó          12
## Í fjallgöngu   22

Reiknum allskyns lýsistærðir fyrir breytuna smjor_kostar eftir breytunni is.

konnun %>%
   filter(!is.na(smjor_kostar)) %>%
   group_by(stefnumot) %>%
   summarise("Miðgildi"=median(smjor_kostar),
   "Meðaltal" = mean(smjor_kostar),
   "Staðalfrávik" = sd(smjor_kostar)) %>% kable()

## stefnumot      Miðgildi    Meðaltal    Staðalfrávik
## Á kaffihús           500.0              577.5676     209.5798
## Á ísrúnt        618.0           621.6667     229.0420
## Í bíó              589.5        576.0000     184.0198
## Í fjallgöngu      513.5         540.5909     153.5586

4.4. Leiksvæði fyrir R kóða

Hér fyrir neðan er hægt að skrifa R kóða og keyra hann. Notið þetta svæði til að prófa ykkur áfram með skipanir kaflans. Athugið að við höfum þegar sett inn skipun til að lesa inn puls gögnin sem eru notuð gegnum alla bókina.

# Gogn sott og sett i breytuna puls. puls <- read.table ("https://raw.githubusercontent.com/edbook/haskoli-islands/main/pulsAll.csv", header=TRUE, sep=";") # Setjid ykkar eigin koda her fyrir nedan: # Sem daemi, skipunin head(puls) skilar fyrstu nokkrar radirnar i gognunum # asamt dalkarheitum. head(puls)