6 Tunnusluvut

Tunnusluvut (engl. statistics) ovat keskeinen osa tilastotiedettä. Tunnuslukujen avulla voidaan tiivistää ja tarkastella aineistoa. Tässä harjoittelemme tyypillisimpien tunnuslukujen laskemista aineistosta. Näitä tunnuslukuja voi sanoa myös empiirisiksi, koska ne on laskettu aineistosta.

6.1 Sijaintia kuvaavat tunnusluvut

6.1.1 Minimi ja maksimi

Minimi tarkoittaa aineiston pienintä arvoa kyseiselle muuttujalle. Maksimi on vastaavasti suurin arvo. Minimi ja maksimi ovat periaatteessa helppo laskea funktioiden min ja max avulla, mutta niihinkin liittyy pari pientä sudenkuoppaa. Funktiot min ja max hyväksyvät argumenteikseen vain numeerisia vektoreita.

dat_for_loc <- c(-1.25, -4.1, 1.16, -3.05, 4.17, 0.73, -3.14, 3.39, -2.55, 0.4)
min(dat_for_loc)
## [1] -4.1
max(dat_for_loc)
## [1] 4.17

Joskus minimiä ja maksimia tarvitaan tilanteessa, jossa halutaan vaikkapa muuttaa kaikki negatiiviset arvot nolliksi (tai positiiviset, jos maksimi). Tämä onnistuu helpoiten funktioiden pmin ja pmax avulla. Samalla tapaa, jos halutaan kaikki lukua 1 pienemmät luvut muutettua luvuksi 1, niin tämä onnistuu vaihtamalla luku 0 lukuun 1.

# We want to get rid of all values below 0 and make them 0
pmin(dat_for_loc, 0)
##  [1] -1.25 -4.10  0.00 -3.05  0.00  0.00 -3.14  0.00 -2.55  0.00
# Similar, but get rid of all values over 0
pmax(dat_for_loc, 0)
##  [1] 0.00 0.00 1.16 0.00 4.17 0.73 0.00 3.39 0.00 0.40
# We can do similar things to any limit, e.g. 1
pmin(dat_for_loc, 1)
##  [1] -1.25 -4.10  1.00 -3.05  1.00  0.73 -3.14  1.00 -2.55  0.40

Funktiota pmin ja pmax voi käyttää vieläkin yleisemmässä muodossa antamalla yksittäisen lukuarvon sijasta vektorin. Näitä emme käsittele tässä, mutta kiinnostuneet voivat kokeilla lisää itse.

6.1.2 Keskiarvo

Keskiarvo saadaan laskemalla muuttujan kaikki havainnot yhteen ja jakamalla summa havaintojen määrällä. Esimerkiksi aineiston \(1,2,3,4\) keskiarvo on \((1+2+3+4)/4 = 2.5\). Keskiarvoa satunnaismuuttujan \(X\) havainnoille voidaan merkitä matemaattisesti seuraavasti \[\overline{x} = \frac1n \sum_{i=1}^n x_i = \frac{x_1+x_2+\dots+x_n}{n},\] missä merkintä \(\overline{x}\) tarkoittaa itse keskiarvoa, \(x_1,...,x_n\) ovat havaintoja ja \(n\) on havaintojen määrä.

Keskiarvo voidaan laskea helposti funktiolla mean.

tooth_length <- ToothGrowth$len
mean(tooth_length)
## [1] 18.81333

Mikäli muuttujassa on puuttuvia arvoja (NA) niin keskiarvoksi tulee oletusarvoisesti NA. Puuttuvat arvot voi jättää pois keskiarvon laskemisessa antamalla funktiolle lisäargumentiksi na.rm = TRUE.

# Create some data
dat_for_mean <- c(1, 2, NA, 4)
# Data with NA results mean with NA
mean(dat_for_mean)
## [1] NA
# Leave NA-values out and calculate mean from the remaining ones
mean(dat_for_mean, na.rm = TRUE)
## [1] 2.333333

6.1.3 Mediaani

Mediaani ilmaisee aineiston keskimmäisen havainnon. Toisin sanoen puolet havainnoista on mediaania suurempia ja puolet mediaania pienempiä. Esimerkiksi aineiston \(1, 1, 2, 3, 5\) mediaani on \(2\). Jos aineistossa on parillinen määrä lukuja, otetaan kaksi keskimmäisä ja lasketaan ne yhteen ja jaetaan kahdella (keskiarvo). Aineiston \(3, 3, 5, 6, 7, 17\) mediaani on \((5 + 6) / 2 = 5.5\). Mediaani on helppoa laskea funktiolla median.

# Let's think about median
dat_for_median <- c(7, 2, 3, 4, 1, 7, 0, 4, 3, 3, 2, 6)
dat_for_median
##  [1] 7 2 3 4 1 7 0 4 3 3 2 6
sort(dat_for_median) # Median would be the middle value in the arranged data, thus 3
##  [1] 0 1 2 2 3 3 3 4 4 6 7 7
# Getting median in R
median(dat_for_median)
## [1] 3

6.1.4 Kvantiilit

Mediaani siis kertoi kohdan, jossa 50 % aineistosta on pienenmpiä kuin kyseinen arvo. Entä jos haluamme luvun, jota pienempiä ovat vaikkapa 10 % aineiston havainnoista tai mikä tahansa muu osuus? Tällainen yleistys on nimeltään kvantiili. Joillakin kvantiileilla on erityisnimet. Ne ovat

  • mediaani (50 % aineistosta on tätä pienempiä)
  • alakvartiili (25 %)
  • yläkvartiili (75 %)
  • desiilit (10% välein)
    • 10 %:n desiili, 20 %:n desiili jne.

Haluamansa kvantiilin voi laskea funktiolla quantile. Jos haluat laskea 30 %:n kvantiilin, niin arnna argumentille probs tätä vastaava suhteellinen osuus eli 0.30.

quantile(dat_for_median, probs = 0.30)
## 30% 
## 2.3

quantile-funktiolle voi antaa useita kvantiileita laskettavaksi kerralla. Tällöin argumentille probs on annettava vektori. Esimerkiksi kvartiilit ja mediaanin voi laskea samanaikaisesti näin:

quantile(dat_for_median, probs = c(0.25, 0.5, 0.75))
## 25% 50% 75% 
## 2.0 3.0 4.5

Eräs jännä seikka on se, että laskemalla 0 %:n ja 100 %:n kvantiilit saa tulokseksi minimin ja maksimin. Samaan lopputulokseen pääsee myös funktiolla range. Kokeillaan tätä

# 0 % and 100 % quantile gives a range of the data
quantile(dat_for_median, probs = c(0.00, 1.00))
##   0% 100% 
##    0    7
# Let's compare with min and max
min(dat_for_median)
## [1] 0
max(dat_for_median)
## [1] 7
# There is also function called range
range(dat_for_median)
## [1] 0 7

Esimerkiksi viiksilaatikko-kuvaa vastaavat lukuarvot eli minimin, alakvartiilin, mediaanin, yläkvartiilin ja maksimin saa kätevästi quantile-funktiolla antamalla probs-argumentille vektorin c(0, 0.25, 0.5, 0.75, 1). Tätä sanotaan joskus viiden numeron yhteenvedoksi.

quantile(dat_for_median, probs = c(0, 0.25, 0.5, 0.75, 1))
##   0%  25%  50%  75% 100% 
##  0.0  2.0  3.0  4.5  7.0

6.1.5 Moodi

Moodi ilmaisee muuttujan yleisimmän arvon. Valitettavasti R:ssä ei ole valmista funktiota moodin laskemiseen. Sen sijaan funktio nimeltään mode antaa objektin tyypin, eikä laske moodia. Jos moodin haluaa laskea R:ssä, on ensin muodostettava aineistosta frekvenssitaulukko ja sitten etsittävä taulokosta se arvo, josta on eniten havaintoja, eli suurin frekvenssi

# Find out the mode
dat_for_mode <- c(7, 2, 3, 4, 1, 7, 0, 4, 3, 3, 2, 6, 1, 3, 3, 1, 6, 0, 1, 3, 
                  0, 6, 4, 2, 3, 2, 2, 7, 3, 1, 5, 3, 4, 3, 3, 2, 2, 4, 2, 1, 
                  5, 3, 2, 2, 2, 3, 4, 2, 5, 3, 4, 2, 1, 4, 2, 3, 1, 1, 4, 3, 
                  2, 3, 5, 4, 4, 4, 1, 3, 1, 3, 5, 2, 3, 1, 4, 2, 4, 2, 1, 0, 
                  3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 2, 1, 2, 4, 4, 4, 6, 2, 3, 2)
tab <- table(dat_for_mode)
# Let's see how is tab
tab
## dat_for_mode
##  0  1  2  3  4  5  6  7 
##  4 14 22 26 22  5  4  3
# Let's pick up the largest frequency using which.max function
tab[which.max(tab)]
##  3 
## 26
# Mode is 3 and the frequency is 26

# Let's pick up only the value 3
names(tab)[which.max(tab)]
## [1] "3"
# That is character so let's convert it to numeric
as.numeric(names(tab)[which.max(tab)])
## [1] 3

Ylläoleva käy itse asiassa hyvästä esimerkistä tilanteesta, jossa seuraavaksi tekisin viimeisen rivin funktioksi ja jatkossa käyttäisin kyseistä funktiota työssäni. Funktiohin palataan osiossa Funktiot. En malta olla tekemättä funktiota, joten olkoon alla esimerkki moodi-funktiosta ilman suurempia selityksiä.

# Write a function for mode
moodi <- function(x) {
  tab <- table(x)
  as.numeric(names(tab)[which.max(tab)])
}
# Use that function
moodi(dat_for_mode)
## [1] 3

6.2 Yhteenveto datasta (summary)

Kätevä tapa saada nopea yhteenveto datakehikon kaikista muuttujista on soveltaa summary-funktiota datakehikkoon.

# Calculate summary for ToothGrowth data
summary(ToothGrowth)
##       len        supp         dose      
##  Min.   : 4.20   OJ:30   Min.   :0.500  
##  1st Qu.:13.07   VC:30   1st Qu.:0.500  
##  Median :19.25           Median :1.000  
##  Mean   :18.81           Mean   :1.167  
##  3rd Qu.:25.27           3rd Qu.:2.000  
##  Max.   :33.90           Max.   :2.000

summary huolii myös yksittäisen vektorin, jolloin yhteenveto tulostuu vaakasuuntaisena.

tooth_length <- ToothGrowth$len
summary(tooth_length)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.20   13.07   19.25   18.81   25.27   33.90

6.3 Varianssi ja keskihajonta

Yksittäiselle numeeriselle muuttujalle voidaan laskea varianssi funktiolla var. Varianssia tulkittaessa kannattaa muistaa, että varianssin mittayksikkö ei ole sama kuin alkuperäisen muuttujan, vaan mittayksikkö tulee korottaa toiseen potenssiin. Esim. jos pituuden yksikkö on cm, niin pituuden varianssin yksikkö on \(\text{cm}^2\). Käytännössä tulkintaa kannattaa yrittää keskihajonnan avulla.

# pull the variable from data frame and use it directly in function var
var(ToothGrowth$len)
## [1] 58.51202
# calculate the variance-covariance matrix for entire data frame 
# (gives NA to any pairs with categorical variables)
# variances are obtained from the diagonal (58.51, NA, 0.3954)
var(ToothGrowth)
## Warning in var(ToothGrowth): NAs introduced by coercion
##            len supp      dose
## len  58.512023   NA 3.8612994
## supp        NA   NA        NA
## dose  3.861299   NA 0.3954802

Keskihajonta (engl. standard deviation) saadaan vastaavasti funktiolla sd. Keskihajonta on varianssin neliöjuuri.

# standard deviation
sd(ToothGrowth$len)
## [1] 7.649315