Kokeiden arvioinnista TIES542 Ohjelmointikielten periaatteet, kevät 2016 Antti-Juhani Kaijanaho 19. tammikuuta 2016 Kokeella (engl. experiment) tarkoitan tässä monisteessa tutkimusta, jossa tutkijat pyrkivät todellista koetilannetta manipuloimalla tuottamaan mitattavia muutoksia tai eroja koetilanteessa. 1 Koeasetelma Tyypillinen (joskaan ei ainoa mahdollinen) koeasetelma on seuraavanlainen. Tutkijat pyrkivät osoittamaan, että ohjelmointikieli A on parempi kuin ohjelmointikieli B. He rekrytoivat jostakin 2n koehenkilöä (engl. experimental subject, participant), jotka eivät osaa kumpaakaan kieltä, ja jakavat heidät arvalla kahteen n ihmisen ryhmään. Toiselle ryhmälle he opettavat kielen A ja toiselle kielen B. Sen jälkeen he laittavat kummankin ryhmän toteuttamaan jonkin tietyn ohjelmointitehtävän sillä kielellä, joka heille opetettiin. Kunkin koehenkilön käyttämä aika hyväksyttävään lopputulokseen kirjataan ylös. Ryhmien keskimääräisillä suoriutumisajoilla huomataan olevan eroa kielen A hyväksi; tilastollisella testillä todetaan p = 0.02. Tutkijat raportoivat kielen A olevan keskimäärin parempi kuin kieli B. 1 Tässä kuvitteellisessa esimerkissä manipulointi ilmenee siten, että osalle koehenkilöistä opetetaan yksi kieli ja osalle toinen kieli, ja kukin laitetaan laatimaan oppimallaan kielellä tietty ohjelma. Tällä manipuloinnilla saadaan aikaan mitattava ero ryhmien välille keskimääräisessä suoriutumisajassa. Kokeiden analyysissä koemanipulaatio mallitetaan mahdollisimman yksinkertaisena matemaattisena muuttujana, jota kutsutaan riippumattomaksi muuttujaksi (engl. independent variable). Riippumattoman muuttujan arvoja kutsutaan toisinaan käsittelyiksi (engl. treatment). Kokeen tulos johdetaan puolestaan mittauksista, jotka mallitetaan riippuvana muuttujana (engl. dependent variable). Ylläolevassa esimerkissä riippumattomaksi muuttujaksi 1 Tämä ei ole esimerkki hyvästä kokeesta. Koeasetelmaan liittyy ongelmia. 1
kelpaa ohjelmointikieli sillä on kaksi arvoa, A ja B, jotka ovat siten käsittelyjä ja riippuvaksi muuttujaksi aika hyväksyttyyn suoritukseen se on positiivinen reaaliluku. 2 Ylläoleva esimerkkikoe on koehenkilöiden välinen (engl. between subjects): kullekin koehenkilölle määrätään yksi riippumattoman muuttujan arvo ja kokeen tulos luetaan vertailemalla koehenkilöiden tuloksia toisiinsa. Jotkut kokeet ovat koehenkilöiden sisäisiä (engl. within subjects): jokainen koehenkilö testataan riippumattoman muuttujan kaikilla arvoilla ja kokeen tulos luetaan vertailemalla kunkin koehenkilön omia tuloksia toisiinsa; jos esimerkkikokeessa jokainen koehenkilö opettelisi molemmat kielet ja ohjelmoisi testiohjelman kummallakin kielellä, koe olisi koehenkilöiden sisäinen. Yksi tärkeimmistä kokeen luotettavuuteen vaikuttavista kysymyksistä on, onko se kontrolloitu. Kontrolloidussa kokeessa on aina kyse kahden tai useamman eri käsittelyn vertailusta. Tavallisesti yksi tai useampi vertailtavista käsittelyistä on kontrolli, jolloin muita kutsutaan interventioiksi, ja tällöin tarkoitus on, että mikäli kontrolli pärjää paremmin kuin jokin interventioista, kyseinen interventio on kokeen perusteella hylättävä. Kontrollina käytetään yleensä jotain yleisesti hyväksyttyä ja laajasti käytettyä käsittelyä. Esimerkiksi, jos kokeen tarkoituksena on osoittaa uuden ohjelmointikielen ylivertaisuus, voidaan kontrolliksi ottaa jokin vertailukohdaksi sopiva laajasti käytössä oleva kieli. Kokeen kontrolliin kuuluu olennaisena seikkana se, että kaikki muut tekijät kuin riippumattomat muuttujat pyritään pitämään muuttumattomina. Lisäksi joskus ennakoitavissa olevat häiriötekijät pyritään sulkemaan pois tilastollisin keinoin käyttämällä niitä kovariaatteina. Esimerkkikokeessa ongelmana on esimerkiksi se, kuinka nämä kaksi kieltä voidaan opettaa tasavertaisesti niin, että opetuksesta ei johdu kokeen luotettavuutta sekoittavia eroja. Koehenkilöiden sisäisissä kokeissa on lisäksi kontrolloitava myös järjestys, jolla käsittelyitä testataan. Jos esimerkiksi vertaillaan Javaa ja C#:aa, tulee joillakin koehenkilöillä ensin testata Javaa ja sitten C#:aa ja toisilla ensin C#:aa ja sitten Javaa. Tätä kutsutaan koeasetelman tasapainottamikseksi (engl. counterbalancing). Jos kaikki mahdolliset järjestykset testataan, koeasetelma on täysin tasapainotettu (engl. fully counterbalanced). Jos tasapainotus jätetään tekemättä tai se tehdään vaillinaisesti, voi olla, että osa havaitusta tuloksesta selittyy valitulla järjestyksellä. 2 Joskus kokeissa mitataan riippuvien muuttujien lisäksi kovariaatteja (engl. covariant). Näitä muuttujia ei koeasetelmassa manipuloida eikä niistä lueta kokeen tulosta, mutta niiden arvellaan vaikuttavan jollakin tavalla kokeen lopputulokseen ja niitä siksi käytetään tulosten tilastollisessa analyysissä apuna. Ylläolevassa esimerkissä ei ole kovariaatteja mitattu, mutta esimerkiksi koehenkilön opiskelumenestystä olisi voitu käyttää kovariaattina. 2
Koehenkilöiden jako ryhmiin tapahtuu tavallisesti arpomalla. Tällöin puhutaan satunnaistetusta kokeesta (engl. randomized controlled trial (RCT)). Arpomisen etu on, että tällöin kukaan ihminen ei voi vahingossa tai tahallaan vaikuttaa ryhmien muodostumiseen eikä siten voi antaa jollekin käsittelylle etulyöntiasemaa. Arpomisen haittana on, että se on todella vaikea tehdä oikein, ja se voi joskus aiheuttaa eettisiä ongelmia. 3 Joskus koeraportti väittää kokeen olevan satunnaistettu vaikka se oikeasti sitä ei ole: esimerkiksi ryhmiin jako koehenkilöiden nimien MD5-tarkistussummien perusteella ei ole satunnainen vaan systemaattinen. Samassa kokeessa voidaan testata useiden riippumattomien muuttujien vaikutusta riippuviin muuttujiin samanaikaisesti. Tällöin puhutaan faktorikoeasetelmasta (engl. factorial design) ja riippumattomia muuttujia kutsutaan tässä yhteydessä usein faktoreiksi (engl. factor). Esimerkiksi Fischer ja Hanenberg 4 käyttivät riippumattomina muuttujina eli faktoreina ohjelmointikieltä (JavaScript vai TypeScript) ja koodintäydennystä (päällä vai pois). Tällöin asianmukainen kokeen kontrolli vaatii, että kaikkia riippumattomien muuttujien arvojen yhdistelmiä testataan. Kahden riippumattoman muuttujan tapauksessa piirretään usein taulukko, jossa muttujien yhdistelmien jakaminen koehenkilöryhmille ilmoitetaan. Esimerkiksi: 5 code completion no code completion JavaScript Group 1 Group 2 TypeScript Group 3 Group 4 Se, onko koe koehenkilöiden välinen vai koehenkilöiden sisäinen, voi olla kullekin riippumattomalle muuttujalle eri. Esimerkiksi edellä mainitussa Fischerin ja Hanenbergin kokeessa koodintäydennys on koehenkilöiden välinen ja kieli koehenkilöiden sisäinen (osittain tasapainotettu) faktori. Niinpä heidän todellinen koeasetelmansa vaatii kaksiosaisen taulukon (suora lainaus kuten edellä, ilman poistoja): 3 Joskus väitetään, että satunnaistaminen poistaa kaikki häiritsevät tekijät kokeesta. Tämä on varsin uskomaton väite, enkä ole sille koskaan nähnyt hyvää perustelua. 4 Lars Fischer, Stefan Hanenberg: An Empirical Investigation of the Effects of Type Systems and Code Completion on API Usability using TypeScript and JavaScript in MS Visual Studio. In Proceedings of the 11th Symposium on Dynamic Languages (DLS 15), 154 167, 2015. doi:10.1145/2816707.2816720 5 Taulukko on suora lainaus edellämainitusta Fischerin ja Hanenbergin tutkimuksesta, heidän kuvansa 2 sivulta 157, round 1, kierroksen nimi poistettu. 3
Round 1 code completion no code completion JavaScript Group 1 Group 2 TypeScript Group 3 Group 4 Round 2 code completion no code completion TypeScript Group 1 Group 2 JavaScript Group 3 Group 4 2 Kokeen tulosten analyysi Miten tahansa koe onkaan järjestetty, tuloksena on tavallisesti joukko riippuvan muuttujan mittauksia, joista jokaiseen liittyy mm. tieto, millä riippumattoman muuttujan arvolla se on mitattu. Tästä tilastoaineistosta voidaan sitten laskea havaittu efekti. Ylläolevan kuvitteellisen kokeen tapauksessa lasketaan hyväksyttyyn suoritukseen käytetyn ajan keskiarvo kummallekin kielelle erikseen; havaittu efekti on näiden erotus. Edellä mainitun Fischerin ja Hanenbergin kokeen havaittu efekti on myös hyväksyttyyn suoritukseen vaaditun ajan keskiarvojen erotus. Havaitun efektin pistearvo ei sinänsä kerro mitään. Siksi usein koeraportissa ilmoitetaan myös sen luottamusväli (engl. confidence interval). Luottamusvälin kanssa tulee aina ilmoittaa myös luottamustaso (yleensä, mutta ei aina, 95 %). Tämä usein ilmoitetaan esimerkiksi näin: The observed difference in mean time to successful completion was 15 minutes (95 % CI 10 to 20 minutes). Luottamusvälin käsite on varsin hankala ymmärtää, ja se usein selitetään väärin. Edellä esitetty raportti ei tarkoita, että todellinen efekti olisi 95 %:n todennäköisyydellä 10 ja 20 minuutin välillä. Sen sijaan se tarkoittaa, että jos käyttäydymme ikään kuin todellinen efekti olisi 10 ja 20 minuutin välillä, teemme virheen 5 %:n todennäköisyydellä. Luottamusvälin asemesta tai sen lisäksi usein raportoidaan tilastollinen hypoteesitesti. Tavanomaisesti testattava hypoteesi 6 on, että todellinen efekti on nolla (eli eroa ei todellisuudessa ole), ja vaihtoehtoinen hypoteesi on, että todellinen efekti on jotain muuta kuin nolla (eli eroa on, joskin sen suuruusluokasta ei ole tietoa). Lisäksi kiinnitetään käytettävä testi sekä α-taso eli todennäköisyys, jolla testi virheellisesti kertoo testattavan hypoteesin olevan väärä. Tämän jälkeen voidaan koedata ajaa tilastollisen analyysiohjelmiston läpi ja katsoa, millaisen p-arvon ohjelma antaa valitulla testillä. Jos p < α, testattava hypoteesi hylätään. Tavallisesti tutkimusraportissa ilmoitetaan valittu testi, valittu α-taso sekä aineistosta laskettu p-arvo. 6 Testattavaa hypoteesia kutsutaan joskus myös nollahypoteesiksi (engl. null hypothesis). 4
On tavallista, että tutkimusraportissa käytetään ilmaisua tilastollisesti merkitsevä (engl. statistically significant). Tämä tarkoittaa vain, että hypoteesitestissä testattava hypoteesi hylättiin. Raportissa pitäisi aina myös ilmoittaa, mitä α-tasoa eli merkitsevyystasoa (engl. significance level) käytettiin. Hypoteesitesti on yhtä vaikea tulkittava kuin luottamusvälikin. Yleinen virhe on tulkita raportoitu p-arvo testattavan hypoteesin todennäköisyydeksi; sitä se ei ole. Oikea tulkinta on: mikäli aina, kun testattava hypoteeesi hylätään, käyttäydymme ikään kuin se olisi epätosi, teemme virheen todennäköisyydellä α. Hypoteesitesteihin liittyy merkittävä ongelma, jota kutsutaan p-arvon nikkaroimiseksi (engl. p-value hacking). Luottamustaso ja merkitsevyystaso ilmaisevat todennäköisyyden kertatestauksen virheelle. Jos testejä tehdään runsaasti, todennäköisyys sille, että ainakin yksi antaa tilastollisesti merkitsevän tuloksen, kasvaa. Esimerkiksi jos tehdään sata testiä merkitsevyystasolla α = 0.05, on todennäköisyys, että ainakin yksi niistä tuottaa tilastollisesti merkitsevän tuloksen vaikka mitään todellista ilmiötä ei havaittu, 1 (1 0.05) 100 0.99. Asiaa kuvaa hyvin kuvan 1 sarjakuva. 7 Hypoteesitesti ja luottamusväli kertovat olennaisesti saman informaation: jos nolla ei sisälly (1 p) 100 %:n luottamusväliin, vastaava hypoteesin tulos on nolla testi α-tasolla p on tilastollisesti merkisevä. Myös p-arvon nikkarointi on luottamusvälienkin ongelma. Kokeen analyysineen voi tulkita induktiiviseksi argumentiksi: teimme näin, havaitsimme noin, sen vuoksi on niin. Aiemmassa monisteessa mainitsemani subjektiiviseen todennäköisyyteen perustava argumentin analyysi voi käyttää tällaisia tilastollisia analyysejä apunaan. Valitettavasti sen tekeminen täsmällisesti numeroiden kanssa on työlästä: tavallisesti raportoitujen tietojen lisäksi tarvitaan käytetyn testin voimafunktio. 8 3 Validiteettiuhat Kokeiden arvioinnissä käytetään tavallisesti validiteettiuhkien (engl. threats to validity) käsitettä. Tässä validiteetilla ei valitettavasti tarkoiteta deduktiivisen argumentin validiteettia. Validiteettiuhka tarkoittaa potentiaalisia 7 Ks. esim. Joseph P. Simmons, Leif D. Nelson, Uri Simonsohn: False-Positive Psychology: Undisclosed Flexibility in Data Collection and Analysis Allows Presenting Anything as Significant. Psychological Science 22 (11), 1359 1366, 2011. doi:10.1177/0956797611417632. 8 Asiaa on käsitelty tarkemmin väitöskirjani luvussa 4.5. Antti-Juhani Kaijanaho: Evidence-Based Programming Language Design: A Philosophical and Methodological Exploration. University of Jyväskylä, Jyväskylä Studies in Computing 222, 2015. 5
Kuva 1: Randall Munroe. XKCD: Significant https://xkcd.com/882/. CC BY-NC. 6
syytä, jonka vuoksi kokeen tulos voi olla virheellinen. Hyvä koeraportti sisältää jo itse validiteettiuhkien tarkastelua, mutta kriittisen lukijan tulee aina pohtia asiaa myös itse. Tässä yhteydessä puhutaan usein seuraavista validiteettityypeistä: Konstruktiovaliditeetti (engl. construct validity) Usein kokeella halutaan selvittää vastaus johonkin hankalasti mitattavaan kysymykseen. Koetta varten kysymystä muokataan niin, että siitä tulee mitattava. Tähän muokkaamiseen liittyy vakava uhka siitä, että koe ei enää mittaa sitä, mitä sen on tarkoitus mitata. Esimerkiksi koe, joka haluaa verrata staattista ja dynaamista tyypitystä, saattaa testata asiaa vertaamalla TypeScriptiä ja JavaScriptiä; kysymys on, katoaako tässä yksinkertaistuksessa jotain oleellista? Sisäinen validiteetti (engl. internal validity) Kokeen sisäisen logiikan pätevyys. Ulkoinen validiteetti (engl. external validity) Kokeen tulosten yleistettävyys muihin kuin itse koetilanteeseen ja muihin ihmisiin kuin koehenkilöihin. 4 Koeraportin arviointi Aivan ensimmäinen kysymys koeraportin arvioinnissa on, onko kyseessä oikeasti koe. Moni tutkimusraportti kuvailee itseään sanalla experiment olematta oikeasti koe. Älä luota pelkästään siihen, että raportissa esiintyy kyseinen sana! Koeraportin arvioinnissa tulee selvittää, mitä kokeessa oikeasti testattiin. Mitkä olivat riippumattomat ja riippuvat muuttujat? Tässä ei kannata luottaa koeraportin omiin luonnehdintoihin, sillä ne ovat usein ylioptimistisia tai muuten epätarkkoja; esimerkiksi, jos kokeessa verrataan TypeScriptiä ja JavaScriptiä, koeraportissa saatetaan silti puhua koko ajan dynaamisen ja staattisen tyypityksen vertaamisesta vaikka näillä kielillä on muitakin eroja kuin pelkästään tyypitys. Tämän jälkeen kokeen arvioinnissa kannattaa noudattaa Paul Glaszioun urheilukilpailuanalogiaa 9 First, was there a fair start? [... ] Second, was the race fair? [... ] Third, was it a fair finish? 9 Sharon E. Straus, Paul Glasziou, W. Scott Richardson, R. Brian Haynes: Evidence- Based Medicine: How to practice and teach it. 4th Edition. Edinburgh: Churchill Livingstone, 2011. Lainaus sivulta 63. 7
Reilu lähtö: tarkista koeasetelman asianmukaisuus. Onko koe asianmukaisesti kontrolloitu? Tehtiinkö ryhmäjako arpomalla tai muulla tutkijoiden epäasiallista valtaa vähentävällä tavalla? Reilu kilpailu: Onko kokeen läpivienti tehty niin, että kaikilla käsittelyillä on yhtäläinen mahdollisuus pärjätä? Esimerkiksi kahta kieltä vertailevassa kokeessa koehenkilöillä voi olla huomattavasti enemmän aiempaa kokemusta toisesta kielestä tai kieliä ei opeteta tasavertaisesti. Reilu maaliintulo: Analysoitiinko tulokset asianmukaisesti? Tyypillinen ongelma tässä on tilastollisten hypoteesitestien liikakäyttö, joka johtaa siihen, että tilastollisesti merkitseviä tuloksia tulee lähes varmasti riippumatta siitä, onko todellista vaikutusta olemassa. Useiden yksittäisten testien asemesta on aina parempi käyttää kokeen kokonaisuuden kerta-analyysiä monimuuttujamenetelmillä (esim. ANOVA). Hankalaksi tämän arvioinnin tekee se, että moni raportoi vain tilastollisesti merkitsevät testit, eikä lukija siten voi tietää, kuinka paljon tehtiin muita testejä. Jos ongelmia löytyy, pitää arvioida, ovatko ongelmat niin vakavia, että ne vaarantavat tulosten luotettavuuden. 8