Uusi parempi turtle-kirjasto Colabin Pythoniin

Colab on Googlen tuottama ohjelmointiympäristö Python-kielen opiskelun avuksi. Aiemmin julkaistu Colabin kilpikonnagrafiikka-kirjasto (ColabTurtle) oli hieman puutteellinen, koska se ei toiminut kuten perinteiset Logo/Python-turtlet. ColabTurtlePlus on uusi kirjasto, sen toiminta vastaa ”virallista” Pythonin Turtle-kirjastoa, joka toimii vaikkapa Idlessä ja Replissä (https://replit.com/ ). Ymmärtämykseni mukaan joissakin yläasteen matikan kirjoissakin käytetyt PythonTurtlekoodipätkät toimivat ColabTurtlePlussassa.

Minä ainakin olen melkoisen innostunut ColabTurtlePlussasta, koordinaatiston origo on keskellä näyttöä ja xy-koordinaatisto toimii ”oikein”. Uskoisin, että tästä on apua opettajille/oppilaille, jotka käyttävät kilpikonnagrafiikkaa Pythonin oppimiseen. Minä aloitin kilpikonnalla koodaamisen opiskelun Logolla ja kilpikonnagrafiikalla noin vuonna 1983, kun olin auskultoimassa Helsingin yliopistossa. Jotenkin tämä liittyi konstruktivismiin :o)

Katso Colabiin liittyviä artikkeleita blogissani https://mikkorahikka.blog/?s=colab

Näytän pari esimerkkiä aiheeseen liittyen kuvankaappauksineen. Googlen Colaborary löytyy osoitteesta https://colab.research.google.com/ jos olet aloitelija, niin katso sivulta ohjeita. Käytän tässä pelkästään koodisoluja, esimerkkisivulla on mukana myös tekstisoluja. En laita koodin sekaan #kommentteja.

Koodi löytyy täältä https://colab.research.google.com/drive/1B3DJRc0RA7jY5Wci53h6OSB7AKuy45u1?usp=sharing

ColabTurtlePlus

Rivillä 1 asennetaan kirjasto Colabiin ja rivillä 2 luetaan se käyttöön. Nämä pitää olla suoritettuna ennen kuin konnaa voi käyttää Colab-sivulla.

Kun kaikki toimii, niin selaimessa (minulla Chrome) näkyy tällainen tuotos.

Piirretään konnalla neliö. Tätä kirjoittaessa en tajua, miksi tuonne koodirivien alapuolelle tulevat nuo aaltoviivat, liittynee Chromen asetuksiini, en tee siitä ongelmaa.

Rivillä 3 konna kulkee eteenpäin 200 askelta ja rivillä  4 se kääntyy 90 astetta oikealle.

Väritetään neliön sisusta ja reunaviiva. Rivillä 2 määritellään reunan ja sisustan väri, rivillä 3 määritellään sisuksen värittämisen alku. Riveillä 4-6 tuotetaan neliö (laiskuuksissani käytän lyhenteitä komennoille) ja rivillä 7 lopetetaan sisustan väritys.

Neliöt ovat tylsiä, piirretään pentagrammi. Tästä näkee, että väritys toimii kuten GeoGebrassa. 

Jos haluaa muuttaa täytön sellaiseksi, että koko sisusta täyttyy, niin apuna voi käyttää ”nonzero” muuttujaa begin_fill-funktion muuttujana, kuten rivillä 19. Rivillä 3 muutetaan konnan nopeus suurimmaksi, eli syntyy vain valmis kuva, tämä toiminto pitää päättää rivin 27 done():lla. Riveillä 6-8 siirretään konna hieman vasemmalle perinteisin menetelmin, tässä versiossa saman asian ajaa rivin 18 jumpto-funktio.

Tähti

Jostain kumman syystä olen ihastunut tähtikuvioihin. Tehdään pieni matemaattinen pähkinä aiheeseen liittyen.

Miksi tahti(300, 5, 2) tuottaa tähden, kuten myös tahti(300, 9, 2), mutta tahti(300, 9, 6) ei tuota tähteä. Millaisilla m:n ja n:n arvoilla syntyy tähti? Saman tyyppinen appi löytyy GeoGebralla tuotettuna sivulla https://www.geogebra.org/m/rgVYFJrS

Alla oleva kuva on tahti(200, 10, 3)


Palaan aiheeseen lähiaikoina ja piirtelen fraktaaleja, nyt kun on käytössä vikkelä tapa tuottaa niitä suht’ koht simppelisti.

Lähteet

Larryn ohjesivu kirjastoon
https://larryriddle.agnesscott.org/ColabTurtlePlus/documentation2.html

”virallisen” Pythonin turtlekirjastosivu
https://docs.python.org/3/library/turtle.html

Turtle graphics Wikipediassa
https://en.wikipedia.org/wiki/Turtle_graphics

Seymort Papert Wikipediassa

https://en.wikipedia.org/wiki/Seymour_Papert

Lue

Seymort Papert : Lapset, tietokoneet, ajattelemisen taito, Kirjayhtymä, 1985

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

Monty Hall Pythonilla

Luin Dimensiosta Hannu Korhosen kirja-arvion Tapio Lindin Vesimelonin kuivatus ja muita matemaattisia pähkinöitä -kirjasta. En ole vielä ehtinyt lukemaan kirjaa, mutta se pitänee lukea lähiaikoina. Kirjassa yhtenä ongelmana on kuuluisa Monty Hall-probleema. Aihe on kuikertanut mielessäni jo jonkin aikaa. Niinpä päätin tehdä siitä pienen Python ohjelman. Lähinnä itselleni ja samalla myös oppilaitani varten esimerkkinä siitä, miten sanallinen ongelma käännetään tietokoneohjelmaksi.

Ongelma sanallisesti

Wikipediassa Monty Hall -ongelma esitetään seuraavasti: ” Monty Hallin ongelmassa kilpailijalla on edessään kolme ovea. Yhden oven takana on palkintona auto, kahden muun takana vuohi. Kilpailija, joka ei tiedä minkä oven takana mikin palkinto on, saa valita ovista yhden. Valittuaan oven hän ei vielä avaa sitä. Jäljelle jääneistä kahdesta ovesta avataan toinen, ja sen takana on aina vuohi. Tämän jälkeen kilpailija saa valita, vaihtaako ensin valitsemansa oven toiseen jäljellä olevaan suljettuun oveen, vai pitääkö ensin valitsemansa oven.”

Varmaankin kaikki matikan opet tietävät (viimeistään lukemalla ratkaisun Wikipediasta), että kilpailijan kannattaa vaihtaa, sillä pitämällä ensimmäisen valinnan, niin todennäköisyys voittoon on 1/3 ja vaihtamalla 2/3.

Python koodi

Tehdään Pythonilla ohjelma, joka noudattaa edellä esitettyä tilannetta siten, että kilpailija vaihtaa aina valintansa. Koodia kirjoittaessa en käytä järkeä siinä mielessä, että oikaisisin suoraan ratkaisuun. Toteutan tilanteen ikään kuin ohjeen mukaan. Laitan koodiin rivinumerot ja kommentit, joiden avulla yritän kertoa lukijalle mitä koodissa tapahtuu.

Muutama kommentti koodista

Lukijan on hyvä muistaa, että Pythonissa listan ensimmäisen jäsenen järjestysluku on nolla, toisen järjestysluku on 1 jne. Siksi ovien numerot ovat 0, 1, ja 2.

Rivillä 9: shuffle(lista) funktio sekoittaa syötelistansa jäsenet satunnaisesti.

Rivillä 13: randint(a, b) tuottaa satunnaisen kokonaisluvun väliltä [a, b].

Rivillä 17: pop-metodi poistaa olion listasta ja antaa sen tulosteena.  Jos lista  = [13, 42, 666, 42], niin lista.pop(1) antaa tulokseksi luvun 42 ja samalla listasta katoaa jäsen 42, eli nyt lista on [13, 666, 42].

Rivillä 20: remove-metodi poistaa ensimmäisen esiintymän syötteestään. Jos lista  = [13, 42, 666, 42], niin lista.remove(42) muutaa listan listaksi [13, 666, 42].

Rivillä 23: Leikkauksien avulla saadaan valittua listasta jäseniä. Jos lista on lista  = [13, 42, 666, 42], niin lista[1] tulostaa luvun 42.

Alla ohjelman tuottama tulos muutamalla suorituskerralla.

Kun tuota ohjelmaa ja tulosteita katsoo, niin pikku hiljaa (ainakin minulle) selkenee, että tässä pelissä pelaaja voittaa, jos hän on alun perin valinnut vuohen. Vuohi valitaan todennäköisyydellä 2/3.

Tehdään vielä ohjelmaan sellainen muutos, että suoritetaan se vaikkapa 1000 kertaa ja lasketaan voittojen lukumäärä.

Alla ohjelman tulos:

Seuraavassa tarinassani muokkaan ongelmaa/ohjelmaa sellaiseksi, että vuohia onkin vaikkapa 5 ja voittoautoja 2. Ja samalla tietysti pohdin, mikä siinä tilanteessa on voiton todennäköisyys.

Lähteet

https://dimensiolehti.fi/kirjallisuutta-vesimelonin-kuivatus/

https://fi.wikipedia.org/wiki/Monty_Hallin_ongelma