Andmed: 400 eesti keele tasemeeksamite kirjutamisosa loovkirjutist, tasemed A2-C1, igalt tasemelt 100 teksti.
print(tekstid)
## # A tibble: 400 x 14
## kood eksam keeletase kirjtulemus sonad laused spikkus lpikkus J_osak lemmad
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 A2I_… 2018… 1 13 39 9 4.87 4.33 0.0256 31
## 2 A2I_… 2018… 1 18 72 12 4.19 6 0.0972 43
## 3 A2I_… 2018… 1 12 38 6 5.74 6.33 0.0263 26
## 4 A2I_… 2018… 1 16 61 8 5.46 7.62 0.0656 43
## 5 A2I_… 2018… 1 20 75 12 4.77 6.25 0.0933 45
## 6 A2II… 2018… 1 17 31 6 5.10 5.17 0 26
## 7 A2II… 2018… 1 16 47 6 4.64 7.83 0.0426 41
## 8 A2II… 2018… 1 14 40 6 4.78 6.67 0.025 32
## 9 A2II… 2018… 1 19 43 7 5 6.14 0.0698 33
## 10 A2II… 2018… 1 18 57 8 4.60 7.12 0.0526 42
## # … with 390 more rows, and 4 more variables: lss <dbl>, yld_kaanded <dbl>,
## # yld_Nom <dbl>, V_aux <dbl>
Küsimus: kuivõrd on omavahel seotud sõnade ja lausete arv tekstis?
Vastus: sõnade ja lausete arvu vahel on tugev lineaarne seos (0,82). Mida rohkem sõnu, seda rohkem lauseid.
cor(tekstid$sonad, tekstid$laused)
## [1] 0.8197988
Ka joonisel on lineaarne seos näha, kuigi leidub erandlikke tekste, kus on palju sõnu ja vähe pikki lauseid või, vastupidi, võrdlemisi vähe sõnu ja palju lühikesi lauseid.
tekstid %>% ggplot(aes(sonad, laused)) + geom_point(position="jitter")
Eeldades, et minu valim on esinduslik - mis vahemikku võiks sõnade ja lausete arvu korrelatsioon erineva tasemega keeleõppijate loovkirjutistes jääda?
Vastus: 95% tõenäosusega vahemikku 0,78-0,85.
cor.test(tekstid$sonad, tekstid$laused)
##
## Pearson's product-moment correlation
##
## data: tekstid$sonad and tekstid$laused
## t = 28.56, df = 398, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7848341 0.8495605
## sample estimates:
## cor
## 0.8197988
Võrdluseks: sõnade ja lausete keskmise pikkuse vahel on hoopis nõrgem, kuid siiski keskmise tugevusega seos - 0,53.
Tendents: mida pikemaid sõnu kasutatakse, seda pikemad kipuvad olema ka laused.
Joonis on samuti hajusam.
cor(tekstid$spikkus, tekstid$lpikkus)
## [1] 0.5281068
tekstid %>% ggplot(aes(spikkus, lpikkus)) + geom_point(position="jitter")
Koostan korrelatsioonimaatriksi, kust nähtub, et tugev seos (üle 0,7) on lisaks sõnade ja lausete arvule ka sõnade ja käänete arvul, erinevate sõnade (lemmade) ja käänete arvul, sõnade pikkusel ja lemmade arvul, lausete pikkusel ja lemmade arvul ning sõnade arvul ja lausete pikkusel.
Tugevaim seos on sõnade ja lemmade arvul (0,97) - mida rohkem on üldse sõnu, seda rohkem saab olla unikaalseid sõnu.
tekstid %>% select(-keeletase) %>% select_if(is.numeric) %>% cor()
## kirjtulemus sonad laused spikkus lpikkus
## kirjtulemus 1.00000000 0.1334967 0.1499037 0.06955450 0.14700909
## sonad 0.13349671 1.0000000 0.8197988 0.66277715 0.74079857
## laused 0.14990370 0.8197988 1.0000000 0.48840185 0.29779749
## spikkus 0.06955450 0.6627772 0.4884019 1.00000000 0.52810678
## lpikkus 0.14700909 0.7407986 0.2977975 0.52810678 1.00000000
## J_osak 0.21743601 0.4579822 0.2762443 0.13301661 0.53420699
## lemmad 0.15237872 0.9715969 0.7975391 0.73047142 0.71783742
## lss -0.17272383 -0.5798795 -0.5578207 -0.12012141 -0.46285660
## yld_kaanded 0.22433581 0.7575413 0.6374923 0.58800654 0.59565107
## yld_Nom -0.09882183 -0.5756349 -0.3626287 -0.53439728 -0.53842854
## V_aux 0.07471666 0.1462816 0.1818147 -0.08758002 0.09366863
## J_osak lemmad lss yld_kaanded yld_Nom
## kirjtulemus 0.217436005 0.1523787 -0.1727238 0.2243358 -0.09882183
## sonad 0.457982245 0.9715969 -0.5798795 0.7575413 -0.57563495
## laused 0.276244298 0.7975391 -0.5578207 0.6374923 -0.36262869
## spikkus 0.133016613 0.7304714 -0.1201214 0.5880065 -0.53439728
## lpikkus 0.534206994 0.7178374 -0.4628566 0.5956511 -0.53842854
## J_osak 1.000000000 0.4003925 -0.5174289 0.3639190 -0.34352493
## lemmad 0.400392462 1.0000000 -0.4233634 0.7602196 -0.58908607
## lss -0.517428882 -0.4233634 1.0000000 -0.4675153 0.22875626
## yld_kaanded 0.363919010 0.7602196 -0.4675153 1.0000000 -0.55847666
## yld_Nom -0.343524929 -0.5890861 0.2287563 -0.5584767 1.00000000
## V_aux 0.007270947 0.1129178 -0.2212928 0.1100944 0.03681864
## V_aux
## kirjtulemus 0.074716660
## sonad 0.146281620
## laused 0.181814749
## spikkus -0.087580025
## lpikkus 0.093668634
## J_osak 0.007270947
## lemmad 0.112917765
## lss -0.221292788
## yld_kaanded 0.110094437
## yld_Nom 0.036818644
## V_aux 1.000000000
Proovin ka pairs()-käsku. Valin tunnusteks väga tugevalt omavahel seotud sõnade ja lemmade arvu ning tekstis esindatud käänete arvu, mis on nii sõnade kui ka lemmade arvuga samuti tugevalt seotud.
tekstid %>% select(sonad, lemmad, yld_kaanded) %>% pairs()
Kui tahan vaadelda keeleoskustaseme seost erinevate arvtunnustega, siis ei ole Pearsoni lineaarne korrelatsioonikordaja selleks sobivaim. Kui üks kahest tunnusest on järjestustunnus (nagu keeleoskustase), siis peaks paremini sobima hoopis Spearmani ja Kendalli kordaja.Samuti ei ole need kordajad nii tundlikud jaotuse kuju ja äärmuslike väärtuste suhtes.
Järeldus: keeleoskustasemel on tugev või keskmine seos kõigi tunnustega peale abitegusõnade ja eksamitulemuse. Kasutades Pearsoni kordaja asemel Spearmani kordajat, muutuvad mõned seosed tugevamaks, teised nõrgemaks, kuid muutus on üsna vähe - tõlgendamise seisukohast jääb kõik samaks. Kendalli kordajat kasutades on kõik seosed nõrgemad, kuid tõlgendus endiselt sarnane.
tekstid %>% select_if(is.numeric) %>% cor(method="pearson")
## keeletase kirjtulemus sonad laused spikkus
## keeletase 1.0000000 0.11035948 0.9315687 0.7623918 0.72179209
## kirjtulemus 0.1103595 1.00000000 0.1334967 0.1499037 0.06955450
## sonad 0.9315687 0.13349671 1.0000000 0.8197988 0.66277715
## laused 0.7623918 0.14990370 0.8197988 1.0000000 0.48840185
## spikkus 0.7217921 0.06955450 0.6627772 0.4884019 1.00000000
## lpikkus 0.7347172 0.14700909 0.7407986 0.2977975 0.52810678
## J_osak 0.4643376 0.21743601 0.4579822 0.2762443 0.13301661
## lemmad 0.9304761 0.15237872 0.9715969 0.7975391 0.73047142
## lss -0.5403149 -0.17272383 -0.5798795 -0.5578207 -0.12012141
## yld_kaanded 0.7704067 0.22433581 0.7575413 0.6374923 0.58800654
## yld_Nom -0.6262201 -0.09882183 -0.5756349 -0.3626287 -0.53439728
## V_aux 0.1419286 0.07471666 0.1462816 0.1818147 -0.08758002
## lpikkus J_osak lemmad lss yld_kaanded
## keeletase 0.73471722 0.464337645 0.9304761 -0.5403149 0.7704067
## kirjtulemus 0.14700909 0.217436005 0.1523787 -0.1727238 0.2243358
## sonad 0.74079857 0.457982245 0.9715969 -0.5798795 0.7575413
## laused 0.29779749 0.276244298 0.7975391 -0.5578207 0.6374923
## spikkus 0.52810678 0.133016613 0.7304714 -0.1201214 0.5880065
## lpikkus 1.00000000 0.534206994 0.7178374 -0.4628566 0.5956511
## J_osak 0.53420699 1.000000000 0.4003925 -0.5174289 0.3639190
## lemmad 0.71783742 0.400392462 1.0000000 -0.4233634 0.7602196
## lss -0.46285660 -0.517428882 -0.4233634 1.0000000 -0.4675153
## yld_kaanded 0.59565107 0.363919010 0.7602196 -0.4675153 1.0000000
## yld_Nom -0.53842854 -0.343524929 -0.5890861 0.2287563 -0.5584767
## V_aux 0.09366863 0.007270947 0.1129178 -0.2212928 0.1100944
## yld_Nom V_aux
## keeletase -0.62622009 0.141928585
## kirjtulemus -0.09882183 0.074716660
## sonad -0.57563495 0.146281620
## laused -0.36262869 0.181814749
## spikkus -0.53439728 -0.087580025
## lpikkus -0.53842854 0.093668634
## J_osak -0.34352493 0.007270947
## lemmad -0.58908607 0.112917765
## lss 0.22875626 -0.221292788
## yld_kaanded -0.55847666 0.110094437
## yld_Nom 1.00000000 0.036818644
## V_aux 0.03681864 1.000000000
tekstid %>% select_if(is.numeric) %>% cor(method="spearman")
## keeletase kirjtulemus sonad laused spikkus
## keeletase 1.00000000 0.06678885 0.9476440 0.7813211 0.71444319
## kirjtulemus 0.06678885 1.00000000 0.1233564 0.0993772 0.04077476
## sonad 0.94764404 0.12335642 1.0000000 0.8365681 0.63379700
## laused 0.78132111 0.09937720 0.8365681 1.0000000 0.50187649
## spikkus 0.71444319 0.04077476 0.6337970 0.5018765 1.00000000
## lpikkus 0.81768453 0.14666629 0.8291340 0.4168087 0.55691909
## J_osak 0.43803729 0.17872922 0.4773878 0.2637632 0.11426228
## lemmad 0.95335876 0.13734172 0.9808834 0.8209244 0.68691546
## lss -0.50655043 -0.13924716 -0.5863326 -0.5404850 -0.09697324
## yld_kaanded 0.78348403 0.16704355 0.7881514 0.6561675 0.60062198
## yld_Nom -0.64265826 -0.08142185 -0.5964723 -0.3757269 -0.55274558
## V_aux 0.15862933 0.04900890 0.1967456 0.2076550 -0.11040919
## lpikkus J_osak lemmad lss yld_kaanded
## keeletase 0.8176845 0.43803729 0.9533588 -0.50655043 0.7834840
## kirjtulemus 0.1466663 0.17872922 0.1373417 -0.13924716 0.1670435
## sonad 0.8291340 0.47738779 0.9808834 -0.58633259 0.7881514
## laused 0.4168087 0.26376317 0.8209244 -0.54048496 0.6561675
## spikkus 0.5569191 0.11426228 0.6869155 -0.09697324 0.6006220
## lpikkus 1.0000000 0.57267974 0.8203277 -0.48711895 0.6791857
## J_osak 0.5726797 1.00000000 0.4256295 -0.50999531 0.3409455
## lemmad 0.8203277 0.42562954 1.0000000 -0.44748293 0.7934824
## lss -0.4871190 -0.50999531 -0.4474829 1.00000000 -0.4164636
## yld_kaanded 0.6791857 0.34094551 0.7934824 -0.41646360 1.0000000
## yld_Nom -0.6030723 -0.33773805 -0.6136690 0.21085135 -0.5566035
## V_aux 0.1111629 0.03280829 0.1676767 -0.22024299 0.1132496
## yld_Nom V_aux
## keeletase -0.642658258 0.158629334
## kirjtulemus -0.081421852 0.049008901
## sonad -0.596472299 0.196745552
## laused -0.375726918 0.207655017
## spikkus -0.552745579 -0.110409189
## lpikkus -0.603072324 0.111162935
## J_osak -0.337738053 0.032808291
## lemmad -0.613669022 0.167676681
## lss 0.210851354 -0.220242993
## yld_kaanded -0.556603461 0.113249594
## yld_Nom 1.000000000 0.003889004
## V_aux 0.003889004 1.000000000
tekstid %>% select_if(is.numeric) %>% cor(method="kendall")
## keeletase kirjtulemus sonad laused spikkus
## keeletase 1.00000000 0.04681596 0.83934068 0.64976572 0.57045240
## kirjtulemus 0.04681596 1.00000000 0.08363404 0.07172274 0.02907943
## sonad 0.83934068 0.08363404 1.00000000 0.66091659 0.43807153
## laused 0.64976572 0.07172274 0.66091659 1.00000000 0.34977055
## spikkus 0.57045240 0.02907943 0.43807153 0.34977055 1.00000000
## lpikkus 0.66821183 0.10194186 0.62905500 0.27750747 0.38206931
## J_osak 0.32422171 0.12667106 0.32394741 0.17413910 0.07467633
## lemmad 0.84813759 0.09482741 0.88460151 0.64172954 0.49480101
## lss -0.38124570 -0.09558730 -0.41382846 -0.38341172 -0.05952709
## yld_kaanded 0.67095725 0.12492255 0.61838842 0.50454442 0.44810026
## yld_Nom -0.50629214 -0.05739841 -0.42019840 -0.25833156 -0.38647392
## V_aux 0.11793345 0.03214054 0.12871465 0.14537044 -0.07439084
## lpikkus J_osak lemmad lss yld_kaanded
## keeletase 0.66821183 0.32422171 0.84813759 -0.38124570 0.67095725
## kirjtulemus 0.10194186 0.12667106 0.09482741 -0.09558730 0.12492255
## sonad 0.62905500 0.32394741 0.88460151 -0.41382846 0.61838842
## laused 0.27750747 0.17413910 0.64172954 -0.38341172 0.50454442
## spikkus 0.38206931 0.07467633 0.49480101 -0.05952709 0.44810026
## lpikkus 1.00000000 0.40600524 0.61696763 -0.33005948 0.51160350
## J_osak 0.40600524 1.00000000 0.28454439 -0.35573494 0.23596655
## lemmad 0.61696763 0.28454439 1.00000000 -0.29368570 0.62661806
## lss -0.33005948 -0.35573494 -0.29368570 1.00000000 -0.29452136
## yld_kaanded 0.51160350 0.23596655 0.62661806 -0.29452136 1.00000000
## yld_Nom -0.42585649 -0.23028665 -0.43285560 0.14358621 -0.41257936
## V_aux 0.07361263 0.02422311 0.10935255 -0.15127800 0.07868187
## yld_Nom V_aux
## keeletase -0.50629214 0.11793345
## kirjtulemus -0.05739841 0.03214054
## sonad -0.42019840 0.12871465
## laused -0.25833156 0.14537044
## spikkus -0.38647392 -0.07439084
## lpikkus -0.42585649 0.07361263
## J_osak -0.23028665 0.02422311
## lemmad -0.43285560 0.10935255
## lss 0.14358621 -0.15127800
## yld_kaanded -0.41257936 0.07868187
## yld_Nom 1.00000000 -0.00262138
## V_aux -0.00262138 1.00000000
Peakomponentide analüüs
Ilma andmeid standardiseerimata ehk ilma valikuga “scale=TRUE” piisaks tekstide erinevuse kirjeldamiseks ainult ühest peakomponendist, mis kirjeldab 98,8% tekstide varieerumisest.
tekstid %>% select(-keeletase, -kirjtulemus) %>% select_if(is.numeric) %>% prcomp() %>% summary()
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 95.2685 9.50976 3.88237 1.39480 1.13143 0.43127 0.05351
## Proportion of Variance 0.9881 0.00985 0.00164 0.00021 0.00014 0.00002 0.00000
## Cumulative Proportion 0.9881 0.99799 0.99963 0.99984 0.99998 1.00000 1.00000
## PC8 PC9 PC10
## Standard deviation 0.04387 0.03221 0.02254
## Proportion of Variance 0.00000 0.00000 0.00000
## Cumulative Proportion 1.00000 1.00000 1.00000
Kuna tunnustel on erinevad skaalad (nt sõnade arv võib küündida üle 300, keskmine sõnapikkus vaid veidi üle 7 ja mõned tunnused on sootuks esitatud osakaaludena vahemikus 0…1), siis tuleb tunnuste väärtused standardiseerida ehk skaalast lahti siduda. Tunnuste uus aritmeetiline keskmine on 0, väärtused jäävad vahemikku -3…3.
Nüüd kirjeldab esimene peakomponent tekstide tunnuste varieerumisest üksnes 54,1%. Esimene ja teine peakomponent kokku omavad 67,2% kirjeldusvõimet.
tekstid %>% select(-keeletase, -kirjtulemus) %>% select_if(is.numeric) %>% prcomp(scale=TRUE) %>% summary()
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.3255 1.1441 1.0280 0.86804 0.69360 0.6181 0.56079
## Proportion of Variance 0.5408 0.1309 0.1057 0.07535 0.04811 0.0382 0.03145
## Cumulative Proportion 0.5408 0.6717 0.7773 0.85270 0.90081 0.9390 0.97046
## PC8 PC9 PC10
## Standard deviation 0.50166 0.18232 0.10234
## Proportion of Variance 0.02517 0.00332 0.00105
## Cumulative Proportion 0.99563 0.99895 1.00000
Jätan kõrvale abitegusõnade osakaalu (V_aux), sest tean korrelatsioonianalüüsi põhjal, et see ei erista tekste eriti tõhusalt.
Nüüd kirjeldab esimene peakomponent 59,9% ning kaks esimest peakomponenti kirjeldavad 73,2% varieerumisest.
tekstid %>% select(-keeletase, -kirjtulemus, -V_aux) %>% select_if(is.numeric) %>%
prcomp(scale=TRUE) %>% summary()
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.3221 1.0916 0.9555 0.6946 0.63006 0.56111 0.51498
## Proportion of Variance 0.5991 0.1324 0.1014 0.0536 0.04411 0.03498 0.02947
## Cumulative Proportion 0.5991 0.7315 0.8330 0.8866 0.93068 0.96566 0.99513
## PC8 PC9
## Standard deviation 0.18268 0.10238
## Proportion of Variance 0.00371 0.00116
## Cumulative Proportion 0.99884 1.00000
Et oleks mugavam jooniseid teha, jätan osa tunnuseid kõrvale ja muudan keeleoskustaseme arvtunnusest nimitunnuseks, kuna tahan võtta korraga arvesse kõiki ülejäänud arvunnuseid ja kuvada joonisel tasemete nimetused.
tekstid <- tekstid %>% select(-kood, -eksam, -kirjtulemus, -V_aux)
tekstid <- tekstid %>% mutate(keeletase=recode(keeletase,
'1'="A2",
'2'="B1",
'3'="B2",
'4'="C1"))
Joonisel eristuvad keeleoskustasemed üsna kenasti. Aga kuidas neid kahte mõõdet tõlgendada?
tekstid %>% select_if(is.numeric) %>% prcomp(scale=TRUE) %>% .$x %>% as_tibble() %>%
add_column(keeleoskustase=tekstid$keeletase) %>%
ggplot(aes(PC1, PC2, color=keeleoskustase)) + geom_point()
Leian tegurid, millega tuleks tekstide tunnused läbi korrutada, et leida peakomponentide väärtused ja tekstid koordinaatteljestikule paigutada. Neid tegureid saab tõlgendada seostena vastava peakomponendi ja tunnuse vahel.
tekstid %>% select_if(is.numeric) %>% prcomp(scale=TRUE)
## Standard deviations (1, .., p=9):
## [1] 2.3221115 1.0915552 0.9555252 0.6945502 0.6300632 0.5611052 0.5149791
## [8] 0.1826842 0.1023785
##
## Rotation (n x k) = (9 x 9):
## PC1 PC2 PC3 PC4 PC5
## sonad 0.4157841 -0.02039551 -0.13500498 0.13332821 -0.06317364
## laused 0.3335437 -0.01276420 -0.60187529 -0.19732699 -0.28187062
## spikkus 0.3067324 -0.49952255 0.08197507 0.26044058 -0.13873641
## lpikkus 0.3376386 0.09862073 0.44922965 0.49048654 0.32101928
## J_osak 0.2356971 0.57341883 0.37132975 -0.05501738 -0.63545892
## lemmad 0.4075633 -0.16024164 -0.09476141 0.15805259 -0.19104669
## lss -0.2621261 -0.58046953 0.27305547 0.05082136 -0.48527289
## yld_kaanded 0.3622747 -0.07982048 -0.06522968 -0.13372034 0.31481479
## yld_Nom -0.2935535 0.20583865 -0.43047984 0.76577270 -0.13911097
## PC6 PC7 PC8 PC9
## sonad -0.19066295 0.24916463 0.485467854 -0.672755188
## laused -0.10850573 0.09327942 -0.618893030 -0.066631280
## spikkus -0.04065232 -0.74784385 -0.026165489 -0.031428744
## lpikkus -0.14408400 0.25960949 -0.491379324 -0.035006848
## J_osak 0.21384707 -0.15793312 0.001414589 -0.015541878
## lemmad -0.09767654 0.31765075 0.339699384 0.715483931
## lss 0.23931928 0.41712803 -0.151246990 -0.166036133
## yld_kaanded 0.85904382 0.04370278 0.018824372 -0.030344388
## yld_Nom 0.28099833 -0.02824579 0.022943984 -0.009994922
Tõlgendus:
Esimene peakomponent on positiivselt seotud eelkõige sõnade ja lemmade arvuga, samuti käänete arvu, lausete arvu, sõnade ja lausete keskmise pikkusega. Sidesõnade osakaaluga on nõrk seos (alla 0,3).
Nõrk negatiivne seos on nimetavas käändes sõnade osakaaluga ning unikaalsete sõnade suhtarvuga. Seega: mida pikem tekst, seda rohkem hakkab sõnavara korduma ja seda väiksem on unikaalsete sõnade osakaal kõigi sõnade hulgas. Samuti kaasneb pikemate ja keerukamate tekstidega nimetava käände taandumine, sest kasutatakse rohkem erinevaid grammatilisi vorme.
Teine peakomponent on kõige tugevamas positiivses seoses sidesõnade osakaaluga (mida rohkem sidesõnu, seda kõrgemal tekst teljestikul asub). Tugevaim negatiivne korrelatsioon on unikaalsete sõnade suhtarvuga (mida suurem suhtarv, seda madalamal tekst paikneb). Samuti on üsna tugev negatiivne seos keskmise sõnapikkusega (mida pikemad sõnad, seda madalamal tekstid paiknevad).
Võib järeldada, et suure unikaalsete sõnade osakaaluga (ehk pigem lühikesed tekstid) sisaldavad pigem vähe sidesõnu. Samuti on sidesõnade osakaal väiksem, kui sõnad on keskmiselt pikemad (loogiline tulemus, sest sidesõnade on pigem lühikesed).
Veel üks joonis, mis kinnitab minu tõlgendust:
tekstid %>% select_if(is.numeric) %>% prcomp(scale=TRUE) %>%
biplot(xlabs=tekstid$keeletase)