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()
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()