Võrdlen eesti keele tasemeeksamite kirjutisi neljal keeleoskustasemel. Vaadeldavad tunnused on tekstis esindatud käänete arv (yld_kaanded) ja sidesõnade osakaal tekstis (J_osak).

print(tekstid %>% select(kood, keeletase, yld_kaanded, J_osak))
## # A tibble: 400 x 4
##    kood         keeletase yld_kaanded J_osak
##    <chr>            <dbl>       <dbl>  <dbl>
##  1 A2I_001-014          1           4 0.0256
##  2 A2I_001-015          1           7 0.0972
##  3 A2I_001-023          1           8 0.0263
##  4 A2I_001-025          1           7 0.0656
##  5 A2I_001-027          1          10 0.0933
##  6 A2II_001-010         1           7 0     
##  7 A2II_001-025         1           6 0.0426
##  8 A2II_001-039         1           5 0.025 
##  9 A2II_002-026         1           8 0.0698
## 10 A2II_002-042         1           7 0.0526
## # … with 390 more rows

Küsimus: Kas tekstis esindatud käänete arv erineb keeleoskustasemeti? Eeldus: Erinevus on olemas, sest keskmine käänete arv tasemeti on valimis u 6, 8, 9 ja 11. Dispersioonanalüüsi (ANOVA) tulemus: Tõenäosus, et käänete arv kõigil neljal tasemel on sarnane, on peaaegu olematu.

tekstid %>% group_by(keeletase) %>% summarise(keskmine=mean(yld_kaanded))
## # A tibble: 4 x 2
##   keeletase keskmine
##       <dbl>    <dbl>
## 1         1     6.25
## 2         2     8.25
## 3         3     9.13
## 4         4    10.6
summary(aov(yld_kaanded~keeletase, data=tekstid))
##              Df Sum Sq Mean Sq F value Pr(>F)    
## keeletase     1  970.2   970.2   581.2 <2e-16 ***
## Residuals   398  664.5     1.7                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Edasine küsimus: Kas kõik tasemed erinevad üksteisest või ainult mõningad tasemed? Proovin kasutada Tukey järeltesti, kuid saan veateate, mis viitab, et “keeletase” ei sobi faktortunnuseks ehk grupeerivaks tunnuseks:

Error in TukeyHSD.aov(aov(yld_kaanded ~ keeletase, data = tekstid)) : no factors in the fitted model In addition: Warning message: In replications(paste(“~”, xx), data = mf) : non-factors ignored: keeletase

Muudan keeleoskustaseme arvtunnusest nimitunnuseks, et R käsitleks seda faktortunnusena.

tekstid <- tekstid %>%
  mutate(keeletase=replace(keeletase, keeletase==1, "A2"),
         keeletase=replace(keeletase, keeletase==2, "B1"),
         keeletase=replace(keeletase, keeletase==3, "B2"),
         keeletase=replace(keeletase, keeletase==4, "C1"))

ANOVA tulemus on endiselt sarnane, st gruppide sarnasuse tõenäosus ligi 0. Nüüd õnnestub ka Tukey järeltest. Kõik tasemed erinevad üksteisest olulisel määral. Eelkõige pakuvad huvi aga kõrvutiasetsevad tasemed: B1-A2, B2-B1, C1-B2.

summary(aov(yld_kaanded~keeletase, data=tekstid))
##              Df Sum Sq Mean Sq F value Pr(>F)    
## keeletase     3  991.9   330.6   203.7 <2e-16 ***
## Residuals   396  642.8     1.6                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(aov(yld_kaanded~keeletase, data=tekstid))
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = yld_kaanded ~ keeletase, data = tekstid)
## 
## $keeletase
##       diff       lwr      upr p adj
## B1-A2 2.00 1.5351382 2.464862 0e+00
## B2-A2 2.88 2.4151382 3.344862 0e+00
## C1-A2 4.35 3.8851382 4.814862 0e+00
## B2-B1 0.88 0.4151382 1.344862 9e-06
## C1-B1 2.35 1.8851382 2.814862 0e+00
## C1-B2 1.47 1.0051382 1.934862 0e+00

ANOVA eeldus on see, et tunnus on võrreldavates gruppides normaaljaotusega ja sarnase hajuvusega (erinevad üksteisest sarnasel määral). Normaaljaotuse eelduse suhtes on ANOVA üsna robustne - selle mittetäidetud mõjutab tulemusi vähe. Tulpdiagrammid viitavad siiski, et väärtused on koondunud enamjaolt keskmise ümber. Siin on toodud C1-taseme näide.

tekstid %>% filter(keeletase=="C1") %>% group_by(yld_kaanded) %>% summarise(kogus=n()) %>%
  ggplot(aes(yld_kaanded, kogus)) + geom_col()

Hajuvuste sarnasuse väljaselgitamiseks kasutan Bartletti testi, mille jaoks ei pea eraldi paketti alla laadima. Kuna p väärtus on üle 0.05, siis võib lugeda gruppide hajuvuse sarnaseks. Ka karpdiagrammilt paistab, et kolmel tasemel on käänete arv sarnaselt jaotunud, rohkem erineb C1-tase.

bartlett.test(yld_kaanded~keeletase, data=tekstid)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  yld_kaanded by keeletase
## Bartlett's K-squared = 5.4272, df = 3, p-value = 0.1431
tekstid %>% ggplot(aes(keeletase, yld_kaanded)) + geom_boxplot()

Küsimus nr 2: Kas sidesõnade osakaal tekstis erineb keeleoskustasemeti? Kui võrrelda keskmisi osakaalusid valimis, võib eeldada, et vähemalt osa tasemeid erineb üksteisest. Karpdiagramm viitab, et sidesõnade osakaal ei ole tasemeti sarnase hajuvusega.

tekstid %>% group_by(keeletase) %>% summarise(keskmine=mean(J_osak))
## # A tibble: 4 x 2
##   keeletase keskmine
##   <chr>        <dbl>
## 1 A2          0.0509
## 2 B1          0.0802
## 3 B2          0.0946
## 4 C1          0.0888
tekstid %>% ggplot(aes(keeletase, J_osak)) + geom_boxplot()

Klassikalise dispersioonanalüüsi põhjal on gruppide vahel statistiliselt oluline erinevus, kuid Bartletti testi alusel ei ole sarnase hajuvuse eeldus täidetud.

summary(aov(J_osak~keeletase, data=tekstid))
##              Df Sum Sq Mean Sq F value Pr(>F)    
## keeletase     3 0.1134 0.03778   55.75 <2e-16 ***
## Residuals   396 0.2684 0.00068                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
bartlett.test(J_osak~keeletase, data=tekstid)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  J_osak by keeletase
## Bartlett's K-squared = 47.522, df = 3, p-value = 2.691e-10

Järelikult tasub eelistada alternatiivset meetodit - Welchi ANOVAt, mis sarnast hajuvust ei eelda. Paigaldasin selleks paketi “onewaytests”, kuid siis avastasin, et Welchi ANOVAt võimaldab kasutada ka R-i sisseehitatud pakett “stats”. Tulemus on igatahes sama: rühmade vahel on erinevus olemas.

library(onewaytests)
welch.test(J_osak~keeletase, data=tekstid)
## 
##   Welch's Heteroscedastic F Test (alpha = 0.05) 
## ------------------------------------------------------------- 
##   data : J_osak and keeletase 
## 
##   statistic  : 45.46865 
##   num df     : 3 
##   denom df   : 213.2848 
##   p.value    : 9.288152e-23 
## 
##   Result     : Difference is statistically significant. 
## -------------------------------------------------------------
stats::oneway.test(J_osak~keeletase, data=tekstid)
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  J_osak and keeletase
## F = 45.469, num df = 3.00, denom df = 213.28, p-value < 2.2e-16

Koos Welchi ANOVAga tuleks kasutada ka teistsugust järeltest, Games-Howelli testi. Seda võimalust pakub mitu R-i paketti. Mina laadisin neist alla paketi “userfriendlyscience”. Tulemus: erinevad A2- ja B1-tase ning B1- ja B2-tase, kuid mitte B2- ja C1-tase.

library(userfriendlyscience)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Registered S3 methods overwritten by 'lme4':
##   method                          from
##   cooks.distance.influence.merMod car 
##   influence.merMod                car 
##   dfbeta.influence.merMod         car 
##   dfbetas.influence.merMod        car
posthocTGH(y=tekstid$J_osak, x=tekstid$keeletase, method="games-howell")
##      n means variances
## A2 100 0.051   0.00105
## B1 100 0.080   0.00088
## B2 100 0.095   0.00050
## C1 100 0.089   0.00028
## Registered S3 methods overwritten by 'ufs':
##   method                     from               
##   grid.draw.ggProportionPlot userfriendlyscience
##   pander.associationMatrix   userfriendlyscience
##   pander.dataShape           userfriendlyscience
##   pander.descr               userfriendlyscience
##   pander.normalityAssessment userfriendlyscience
##   print.CramersV             userfriendlyscience
##   print.associationMatrix    userfriendlyscience
##   print.confIntOmegaSq       userfriendlyscience
##   print.confIntV             userfriendlyscience
##   print.dataShape            userfriendlyscience
##   print.descr                userfriendlyscience
##   print.ggProportionPlot     userfriendlyscience
##   print.meanConfInt          userfriendlyscience
##   print.multiVarFreq         userfriendlyscience
##   print.normalityAssessment  userfriendlyscience
##   print.scaleDiagnosis       userfriendlyscience
##   print.scaleStructure       userfriendlyscience
##   print.scatterMatrix        userfriendlyscience
##          diff    ci.lo  ci.hi    t  df    p
## B1-A2  0.0293  0.01796 0.0407  6.7 197 <.01
## B2-A2  0.0438  0.03358 0.0540 11.1 175 <.01
## C1-A2  0.0380  0.02847 0.0474 10.4 149 <.01
## B2-B1  0.0144  0.00480 0.0240  3.9 183 <.01
## C1-B1  0.0086 -0.00026 0.0175  2.5 157  .06
## C1-B2 -0.0058 -0.01305 0.0014  2.1 184  .16