Ylioppilaskoekorrelaatiomatriisi koodi Pythonilla

Julkaisin muutama päivä sitten tarinan ”Kevään 22 yo-kirjoitusten tuloksien korrelaatiomatriisi Pythonilla”. Tässä artikkelissa kerron, millaisen koodin avulla tuotin sen. Käytän ohjelmointiympäristönä Googlen Colabia. Colabin etuna verrattuna muihin Python ympäristöihin (IDLE, Spyder yms.) on se, että voin muokata koodia pilven kautta ja Colabissa on lähes kaikki Big Datan käsittelyyn käytettävät kirjastot ovat helposti kätettävissä. Samalla saan helpon pääsyn omiin tiedostoihini Google Drivessä ja voin jakaa koodin helposti.

Esitän koodin kuvankaappauksina Colabista ja kommentoin niitä tarinan edetessä. Linkki lopulliseen tiedostoon löytyy tarinan  lopusta.

Tähän käytetty tiedosto löytyy ytl:n sivulta https://www.ylioppilastutkinto.fi/tietopalvelut/tilastot/koulukohtaisia-tunnuslukuja
sieltä löytyy linkki myös oppiainekoodeihin ja miten tiedostojen nimet on koodattu.

Itse tiedosto on osoitteessa https://www.ylioppilastutkinto.fi/ext/data/FT2022KD3001.csv

kirjastoista

Python on siitä kiva, että lähes mihin tahansa koodausongelmiin löytyy apua kirjastoista. Tässä tarinassa käytän Pandas, Seaborn ja Matplotlib -kirjastoja. 

Pandas on luotu taulukoidun datan käsittelyyn, se ikään kuin tuo taulukkolaskennan rivit ja sarakkeet koodiin. Taulukon tietotyyppi Pandasissa on Dataframe, yleensä kirjallisuudessa käytetylle taulukolle annetaan nimi df. Kun käyttää Pandasia, niin kannattaa ajatella taulukot siten, että rivit ovat tilastoyksikköjä ja sarakkeet muuttujia, kuten ytl:n datassa.

Matplotlib-kirjaston avulla piirretetään kuvaajia. Seaborn on Matplotlibin laajennus. Sen avulla saan taulukon dataan värikoodauksen heatmap-funktion avulla. 

koodi kommentoituna, pandas taulukko

Rivit 8-10: ladataan kirjastot

Rivi 13: on Ytl:n datan osoite

Rivi 15: luetaan data Pandasin taulukkoon. Tätä koodatessa havaitsin, että Ytl:n taulukossa erotin on puolipiste, niinkuin usein meillä skandinaaveilla. 

Tässä vaiheessa taulukko näyttää tältä. Jos rivin 16 olisi korvannut rivillä

display(talukko)

niin siitä olisi tullut nätimmmän näköisen, taas opin uutta. En jaksa muuttaa tarinaan liitettyjä kuvankaappauksia.

Kuvasta nähdään, että 24911 ylioppilasta valmistui tänä keväänä. Aakkosissa (tai jollain muulla logiikalla) ensimmäinen Vieremän lukion oppilas oli tyttö ja sai yhteensä 18 puoltoääntä jne.

Alla display-funktiolla tuotetun kuvan vasenta reunaa.

Rivillä 19 luodaan taulukosta df-niminen DataFrame-taulukko.

Rivillä 22 poistetaan kuusi vasemmanpuoleista saraketta ja oikeanpuolisin (tutkintotyyppi).

Taulukko df on nyt tämän näköinen.

Rivi 27: Lasketaan rivien summat (axis = 0 on rivit ja axis = 1 on sarakkeet). Funktio count laskee lukumäärät ja list tuottaa luvuista helposti käsiteltävän listan.

Rivit 30-33: Lasketaan sellaiset sarakkeet, joissa on alle 100 kirjoittajaa. 

Rivi 37: Poistetaan sellaiset sarakkeet, joissa on poistettava indeksi.

Edellisten rivien printtaus tuottaa tällaista.

Rivi 41: Lasketaan korrelaatiomatriisi, min_periods kertoo kuinka monta paria vähintään pitää olla ja round desimaalien lukumäärän. Oletuksena syntyy neliömatriisi, mikä on minulle parempi. LibreOffice ja Excel tuottavat työkaluillaan vain kolmiomatriiseja.

Tämä näyttää hyvältä.

Rivi 45 ja 47: Pitää poistaa vasemmasta reunasta tuo yht-sarake yhteenlaskuja varten.

Rivit 50-51: Lasketaan selitysasteiden summa ja niiden aineiden summa, joilla korrelaatio on yli 0.6. Tässä näkyy Pandasin käyttökelpoisuus taulukoidun datan käsittelyssä.

Nyt taulukon oikeassa reunassa on 

Jos tässä vaiheessa haluaisin tallentaa datan csv-tiedostona omaan Driveeni, niin se toimisi rivillä

df.to_csv(/content/drive/MyDrive/Artikkelit/matriisi/yo.csv", encoding="utf-8”)

seaborn

Tämän kirjaston avulla saan taulukkoon värikoodauksen käyttämällä heatmap-tyyppistä kuvaajaa. Erilaisia väripaletteja on aika paljon, valitsin tähän diskreetin (ei jatkuvan) paletin.  Tämän tuottaminen vaati aika paljon yritystä ja erehdystä.

Rivi 58: Valitaan diskreetti väripaletti keltaisesta punaiseen, päädyin kokeilujen jälkeen tuohon kuuteen eri väriin, ne kuvaavat MAOLin taulukoissa olevaa tulkintaa korrelaatiokertoimista. En välitä negatiivista korrelaatikertoimista, niitä kun on niin vähän.

Rivi 59: Tuotetaan heatmap, annot näyttää oikean reunan palkkin, vmax, vmin ja vcenter kertovat rajoista, annot_kws on fontin koko ja title otsikko.

Rivi 62: Tässä määritetään kuvan koko.

Viimein saatiin tämä kuva.

Oikean reunan kielien poistaminen toimii lisäämällä väliin rivit.

Nyt kuva on tällainen

koodaamisesta

Vaikka yllä oleva voi vaikuttaa aika suoraviivaiselta ja jopa ymmärrettävältäkin, niin tuon tuottaminen tällaiselta aloittelijalta vaati aika paljon Googlettamista sekä yritystä ja erehdystä. Koska Colabissa voi helposti kokeilla erilaisia versioita, niin pitää muistaa kirjoittaa paljon kommentteja. Muuten versioiden hallinta menee mahdottomaksi.

Colab-tiedosto https://colab.research.google.com/drive/106rjIDEJWdn2ImdVtjAKzg_3df9fWhPx?usp=sharing


Koodaamisen oppiminen on helppoa, sen opettaminen on vaikeaa.

lähteitä

Korrelaatiomatriisi Pandasilla https://datagy.io/python-correlation-matrix/

Pandas dataframe-ohje https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html

Seaborn väripaletit https://seaborn.pydata.org/tutorial/color_palettes.html

Seaborn Heatmap, aika hyvä ohje https://www.geeksforgeeks.org/seaborn-heatmap-a-comprehensive-guide/

Kalibur Rahman, Python Data Visualization, Essential Guide, 2021, BpB

Kevään 22 yo-kirjoitusten tuloksien korrelaatiomatriisi Pythonilla


Tänä keväänä opiskelin Pythonia ja Pandas+Seaborn -kirjastoja sen verran, että pystyin tuottamaan korrelaatiomatriisin taas uudella tavalla. Big datan kanssa puuhasteleminen on kivaa, ongelmaksi tulee se mitä tietoa siitä kaivaa ja miten sen esittää. Matriisi osoittaa (minun mielestäni), että ei-matemaattiset reaaliaineet (bi, et, hi, ge, ff) ennustavat parhaiten ylioppilaiden kokonaismenestystä ylioppilaskokeessa.

edelliset tarinat aiheesta

Vuoden 19 ylioppilaskoematriisi LibreOfficella ​​https://mikkorahikka.blog/2020/01/20/korrelaatiomatriisi-libreofficella-ytln-datasta/

Vuoden 21 ylioppilaskoematriisi Excelillä https://mikkorahikka.blog/2021/05/28/kevaan-21-yo-kirjoitusten-korrelaatiomatriisi/

22 korrelaatiomatriisit

Tähän käytetty tiedosto löytyy ytl:n sivulta https://www.ylioppilastutkinto.fi/tietopalvelut/tilastot/koulukohtaisia-tunnuslukuja

ja itse tiedosto on osoitteessa https://www.ylioppilastutkinto.fi/ext/data/FT2022KD3001.csv

Loin Pythonilla taulukon, jossa oli vain oppilaiden puoltoäänien summa (”yht”) ja eri kirjoituksista saadut arvosanat (”a ” = 2, ”b” = 3, …, ”l”  = 7) . Poistin taulukosta sellaiset aineet, joita oli kirjoitettu alle 100 kertaa. Loin korrelaatiomatriisin siten, että mukaan laskettiin vain ne aineparit, jossa vähintään 20 oppilasta oli kirjoittanut kyseiset aineet.

Klikkaamalla kuvaan, saat sen avautumaan isompana uuteen välilehteen.

Ainekoodit ovat alla. En todellakaan muista mistä löysin nuo alunperin, kaipa ne ovat jossain YTL:n sivuilla.

Tein vielä toisen matriisin, poistin tästä osan oikean reunan kielistä. Tuota on ehkä hieman mukavampi katsella. Toki se hävittää kielten väliset korrelaatiot.

pari kommenttia

Miten näitä matriisejaa pitäisi tulkita. En oikeasti ole tilastotieteilijä, mutta muutamia kommentteja voin tähän raapaista. Käytän tässä tuota ylempää kuvaa.

Parhaiten ylioppilaskokeen puoltoäänien määrää ennustaa menestyminen biologiassa ja elämänkatsomustiedossa (r = 0.77).  Lähes sama korrelaatiokerroin oli historialla, ev-lut.uskonnolla, maantieteellä ja keskipitkällä ruotsilla ( r = 0.75). 

Laskemalla selitysasteiden summan eli korrelaatiokerreinten summan, sain podiumille biologian (Σr^2 = 9), psykologian (Σr^2 = 8.9) ja tasapisteillä historian ja keskipitkän ruotsin (Σr^2 = 8.5).

Sellaisia korrelaatioita, jotka olivat yli 0.6 oli eniten biologiassa (12) filosofiassa (11) ja uskonnossa ja maantieteessä (10).

Suurimmat aineiden väliset korrelaatiot olivat elämänkatsomustiedon ja historian välillä sekä elämänkatsomustiedon ja filosofian välillä (0.82)

Nämä tulokset ovat aika samantyyppisiä kuin vuosina 19 ja 21. Yo-kokeessa menestymistä ennustanee parhaiten menestyminen ei-matemaattisissa  reaaliaineissa. Tarkoittaako tämä sitä, että reaaliaineissa pärjäävät pärjäävät muissakin aineissa vai sitä, että yo-koe yleisesti mittaa reaaliaineissa opittuja tietoja ja taitoja enemmän kuin muita tietoja ja taitoja? En tiedä?


Kunhan opin Pythonia lisää, niin teen oikeasti vertailuja muutoksista aikaisempiin vuosiin. Itse koodin julkaisen lähipäivinä, kunhan saan koodin siivotuksi.

R^2 eli selitysaste GeoGebralla

[edit 21.11.20. Lisäsin virkkeen selitysasteen toimivuudesta.]

Resonanssi-kirjasarjan 7. osassa Aine ja säteily tehtävässä 457 pyydetään osoittamaan, että isotoopin hajoamisen lukumäärä ajan funktiona, on parempi mallintaa eksponenttifunktiona kuin lineaarisena mallina. Tehtävää antaessani kuvittelin, että korrelaation/selitysasteen eksponentiaaliselle ja  lineaariselle sovitukselle saisi suoraan GeoGebran Kahden muuttujan regressioanalyysillä. Muistin väärin tai sitten kyseinen työkalu ei ole sitä ennenkään laskenut.

Oppitunnilla abien kanssa huomasinkin tämän artikkelin kirjoittamisen jälkeen, että Kahden muuttujan regressiotyökalu laskeekin R^2:n oikein. Korrelaatiokerroin toimii vain lineaariselle mallille.

kuva Resonanssikirjasta

Lasketaan selitysaste sekä GeoGeberalla, että LibreOfficella.

GeoGebra

GeoGebrassa täytyy selitysaste laskea komennolla RegressioNeliö( <Pistelista>, <Funktio> ).

Sijoitetaan tehtävän luvut GeoGebran taulukkolaskentaan. Valitaan luvut ja luodaan niistä pistelista nimeltä l1. Sovitetaan suora ja eksponenttifunktio Syöttökentän komennoilla

f(x) = SovitaPolynomi(l1, 1)
g(x) = SovitaEksp(l1)

Selitysasteet saadaan kirjoittamalla syöttökenttään

linSel = RegressioNeliö(l1, f)
ekspSel = RegressioNeliö(l1, g)

LibreOfficessa

LibreOfficessa R^2:n laskeminen onnistuu helpoimmin kuvaajan piirron yhteydessä trendiviivan avulla.

Alla olevien kuvien avulla yritän kuvailla ratkaisutapani.


Komennon Wikisivu https://wiki.geogebra.org/en/RSquare_Command?note=fi