1. Lineaarne regressioon

Kuidas on seotud kõigi sõnade arv ja unikaalsete sõnade ehk lemmade arv tekstis? Valin need tunnused, kuna nende vahel on väga tugev korrelatsiooniseos.

Joonisele on lisatud seosejoon. Hall ala, mis näitab standardviga, on üsna kitsas - seda on näha alles lõpus.

tekstid %>% ggplot(aes(sonad, lemmad)) + geom_jitter() + geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Seos esitatud sirgjoonena, ilma standardvea vahemikku kuvamata.

Jooniselt nähtub näiteks, et 100sõnalistes tekstides esineb keskmiselt 60 eripärast sõna.

tekstid %>% ggplot(aes(sonad, lemmad)) + geom_jitter() + geom_smooth(method="lm", se = FALSE)

Treenin mudeli, et ennustada tekstis leiduvate lemmade arvu põhjal kõigi sõnade arvu.

Mudeli tõlgendus: - iga lemma lisab teksti pikkusele 1,8 sõna; - kui pole ühtegi lemmat, pole ühtegi sõna ja vabaliige on seega negatiivne.

Sõnade arvu leidmise valem: sõnade arv = -6,69 + 1,8 * lemmade arv

mudel <- lm(sonad~lemmad, data=tekstid)
print(mudel)
## 
## Call:
## lm(formula = sonad ~ lemmad, data = tekstid)
## 
## Coefficients:
## (Intercept)       lemmad  
##       -6.69         1.80

Ennustus võib üsna suurelt eksida. Valimisse kuuluvad tekstid on ennustatust kuni 77 sõna jagu lühemad ja kuni 101 sõna jagu pikemad.

Pooltel juhtudel jääb arvutusviga -10 ja +10 sõna vahemikku.

Vahemikhinnang näitab, et iga lemma lisab tekstile 1,8 +/- 0,02 sõna. Tõenäosus, et selline seos tunnuste vahel puudub, on olulisustõenäosusele tuginedes kaduvväike.

summary(mudel)
## 
## Call:
## lm(formula = sonad ~ lemmad, data = tekstid)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -77.261 -10.339  -1.586  10.362 101.326 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.69024    2.11225  -3.167  0.00166 ** 
## lemmad       1.79974    0.02197  81.910  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.93 on 398 degrees of freedom
## Multiple R-squared:  0.944,  Adjusted R-squared:  0.9439 
## F-statistic:  6709 on 1 and 398 DF,  p-value: < 2.2e-16

Prognoosin sõnade arvu tekstis, kus on 50, 100, 150 ja 200 lemmat.

uuritav <- tibble(lemmad=c(50, 100, 150, 200))
uuritav$sonad <- predict(mudel, uuritav)
print(uuritav)
## # A tibble: 4 x 2
##   lemmad sonad
##    <dbl> <dbl>
## 1     50  83.3
## 2    100 173. 
## 3    150 263. 
## 4    200 353.

Joonisel on lisaks algandmetele kujutatud ennustatav sõnade arv etteantud lemmade arvu juures.

tekstid %>% ggplot(aes(sonad, lemmad)) + geom_jitter(color="blue") + 
  geom_point(data=uuritav, color="red", size=5)

Sõnade arv tekstis on tugevas korrelatsioonis ka lausete arvuga ja lausete keskmise pikkusega. Koostan mudeli, mis prognoosib sõnade arvu kolmest tunnusest lähtuvalt.

Kolme tunnuse alusel prognoosimine on täpsem: arvutusviga jääb pooltel juhtudel vahemikku -7,5 kuni +6.

Sõnade arv valimi tekstides on ennustatust kuni 116 võrra vähem, ent ainult kuni 70 võrra suurem.

Iga lemma lisab tekstile 0,94 sõna, iga lause 5,02 sõna ning iga keskmisele lausepikkusele lisanduv sõna lisab tekstile 6,2 sõna.

Valem: sõnade arv = -66,3 + 0,94 * lemmade arv + 5,02 * lausete arv + 6,24 * keskmine lausepikkus

Olulisustõenäosus osutab mudelis olevate seoste statistilisele olulisele.

mudel <- lm(formula = sonad ~ lemmad + laused + lpikkus, data = tekstid)
summary(mudel)
## 
## Call:
## lm(formula = sonad ~ lemmad + laused + lpikkus, data = tekstid)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -116.912   -7.484    0.405    6.173   70.764 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -66.31557    3.45473  -19.20   <2e-16 ***
## lemmad        0.93648    0.04758   19.68   <2e-16 ***
## laused        5.02005    0.28186   17.81   <2e-16 ***
## lpikkus       6.24265    0.36382   17.16   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.36 on 396 degrees of freedom
## Multiple R-squared:  0.9711, Adjusted R-squared:  0.9708 
## F-statistic:  4429 on 3 and 396 DF,  p-value: < 2.2e-16

Prognoosin sõnade arvu tekstis, lähtudes etteantud lemmade arvust, lausete arvust ja lausete keskmisest pikkusest.

Katsetan erinevate tunnuseväärtustega ja kohati ennustatakse lemmade arvust väiksemat sõnade arvu, mis ei ole võimalik.

uuritav <- tibble(lemmad=c(25, 70, 120, 200), 
                  laused=c(7, 10, 15, 20), 
                  lpikkus=c(5, 8, 10, 12))

uuritav$sonad=predict(mudel, uuritav)
print(uuritav)
## # A tibble: 4 x 4
##   lemmad laused lpikkus sonad
##    <dbl>  <dbl>   <dbl> <dbl>
## 1     25      7       5  23.4
## 2     70     10       8  99.4
## 3    120     15      10 184. 
## 4    200     20      12 296.

Lisan oma andmestikule ennustatava sõnade arvu tulba.

tekstid$e_sonad <- predict(mudel, tekstid %>% select(lemmad, laused, lpikkus))

print(tekstid %>% select(sonad, lemmad, laused, lpikkus, e_sonad))
## # A tibble: 400 x 5
##    sonad lemmad laused lpikkus e_sonad
##    <dbl>  <dbl>  <dbl>   <dbl>   <dbl>
##  1    39     31      9    4.33    34.9
##  2    72     43     12    6       71.6
##  3    38     26      6    6.33    27.7
##  4    61     43      8    7.62    61.7
##  5    75     45     12    6.25    75.1
##  6    31     26      6    5.17    20.4
##  7    47     41      6    7.83    51.1
##  8    40     32      6    6.67    35.4
##  9    43     33      7    6.14    38.1
## 10    57     42      8    7.12    57.7
## # … with 390 more rows

Jooniselt saab aimu, millise keeleoskustaseme puhul on mudeli ennustus täpsem.

Paistab, et A2- ja B2-taseme puhul on prognoos täpsem (täpid paiknevad vähem hajusalt) kui B1- ja C1-taseme puhul.

tekstid %>% ggplot(aes(sonad, e_sonad, color=keeletase)) + geom_jitter()

  1. Klasteranalüüs

Rühmitan tekstid sõnade arvu ja lausete keskmise pikkuse järgi, teades, et need tunnused eristavad olulisel määral keeleoskustasemeid.

Valin klastrite arvuks neli, lootuses, et eri taseme tekstid võiks paigutuda enamjaolt eri klastritesse.

klastrid <- kmeans(tekstid %>% select(sonad, lpikkus), centers=4)

Kuvan klastrite keskpunktid teljestikul.

klastrid$centers
##       sonad   lpikkus
## 1 171.05882 11.191036
## 2 269.53261 13.475087
## 3 110.03922  8.651899
## 4  46.89423  5.985133

Salvestan andmestikku tulba klastri numbriga.

Tabeli algusotsast ilmneb, et A2-taseme tekstid on paigutunud samasse klastrisse.

tekstid$klaster=klastrid$cluster
print(tekstid %>% select(keeletase, sonad, lpikkus, klaster))
## # A tibble: 400 x 4
##    keeletase sonad lpikkus klaster
##    <chr>     <dbl>   <dbl>   <int>
##  1 A2           39    4.33       4
##  2 A2           72    6          4
##  3 A2           38    6.33       4
##  4 A2           61    7.62       4
##  5 A2           75    6.25       4
##  6 A2           31    5.17       4
##  7 A2           47    7.83       4
##  8 A2           40    6.67       4
##  9 A2           43    6.14       4
## 10 A2           57    7.12       4
## # … with 390 more rows

Jooniselt paistab, et klastrid ja keeleoskustasemed siiski üks-ühele ei kattu. Rohkem paiknevad risti-rästi B1- ja B2-taseme tekstid.

tekstid %>% ggplot(aes(sonad, jitter(lpikkus), color=factor(klaster), label=keeletase)) + 
  geom_text()