(toiminnot)

hwechtla-tl: Pukusuolitesti

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Testaa henkinen pukusuolesi -testi on täällä: http://sange.fi/~atehwa/cgi-bin/pukusuoli.cgi

Testistä annetut palautteet ovat nähtävillä täällä: http://sange.fi/~atehwa/cgi-bin/pukusuoli.cgi?nayta_palautteet=0

Tämä testi perustuu samaan ajatukseen kuin testit.mine.nu:n alkuperäinen "testaa henkinen ikäsi" -testi, eli siihen, että henkilöiden fyysisiä/konkreettisia ominaisuuksia voi yrittää arvioida siitä, miten nämä taipuvat vastaamaan kysymyksiin, jotka eivät (ainakaan suoraan) liity mitenkään mitattavaan suureeseen. Esimerkiksi, että kysymykseen "mitenkä sanotaan?" vastausvaihtoehdon "kiitos" valitsevat keskimäärin 40-vuotiaat ja vastausvaihtoehdon "mutsis" valitsevat keskimäärin 15-vuotiaat, tai jotain.

Alkuperäisen, hämmentävän tarkan testin (joka on, harmi kyllä, poistunut keskuudestamme jo muutamia vuosia sitten) suuri idis oli, että testi ei itse asiassa sisällä mitään ennalta määrättyä, suurta tietoutta eri-ikäisten ihmisten vastaustaipumuksista, vaan testiä kalibroidaan automaattisesti sen perusteella, jos vastaajat kertovat todellisen ikänsä. Kaikkia niitä, joiden todellinen ikä oli tiedossa, käytettiin materiaalina sen arvioimiseen, millaista ikää mikin vastaus "kuvastaa". Vastausten vaikutus muuttui siis dynaamisesti, sen sijaan kysymyssarja ja vastausvaihtoehdot olivat staattiset, ja, kuten testin kehittäjä FAQ:ssa avoimesti myönsi, "kaikki kysymykset eivät korreloi merkittävästi iän kanssa vaan ovat mukana vain siksi että olen tykästynyt niihin".

Meidän testissämme, siis tässä pukusuolitestissä, arvioitavia fyysisiä/konkreettisia ominaisuuksia on aika liuta. Kutsun näitä kaikkia kollektiivisesti nimellä "pukusuoli". Henkilön pukusuoleen siis kuuluu, minkä ikäinen hän on, kuinka pitkä, paljonko painaa, ja niin edelleen. Henkinen pukusuoli taas tarkoittaa sitä, että ihmisellä on taipumus vastata tietyn ikäisten / pituisten / painoisten / ... ihmisten tapaan. Voitte arvata, kuinka erilaisia vastauksia lihavat ja laihat antavat esim. kysymykseen "Mitä Kekkonen tekisi?". Testin tulokset ovat siis varmoja ja kiistämättömiä.

Varsinainen mielenkiintoinen asia testissä oikeastaan on se, miten eri vastausten korrelaatio eri pukusuoliin otetaan huomioon. Tässä testissä nimittäin arvioitavia muuttujia on useita, kysymyksiä iso joukko, josta yksittäiselle testintekijälle poimitaan satunnaiset 15, vastausvaihtoehtoja voi lisätä (jolloin vastausten samanlaisuuden vertailussa pitää ottaa huomioon, etteivät kaikki samaan kysymykseen vastaajat ole nähneet samoja vastausvaihtoehtoja), ja kysymyksiäkin voi tulla lisää. Kaikista vastaajista ei tiedetä kaikkia pukusuoliominaisuuksia, eikä joistain tiedetä mitään (jos he eivät ole halunneet osallistua kalibroimiseen).

Tällä sivulla dokumentoin sitä, miten testi varsinaisesti toimii, eli miten näihin ongelmiin on vastattu. Varsinainen lähdekoodikin on tarjolla, http://members.sange.fi/~atehwa/vc/prod/piki/pukusuoli/pukusuoli.py

Vastausvaihtoehtojen dynaamisuus

Testissä ei oikeastaan järjestellä vastauksia kysymysten mukaan, vaan jokaisen kysymyksen jokainen vastausvaihtoehto muodostaa oman "vastauksensa" (kyllä tai ei). Kysymykset ovat siis oikeastaan vain "otsikoita", jotka ryhmittelevät vastausvaihtoehtoja. Kullakin vastaajalla voi olla kuhunkin vastausvaihtoehtoon joko myönteinen tai kielteinen kanta, tai sitten ei kantaa ollenkaan, jos kyseistä vastausvaihtoehtoa ei ole näytetty vastaajalle (mahdollisia syitä tähän on kaksi: vastausvaihtoehto on lisätty kysymykseen myöhemmin, tai vastaajan testi ei ole sisältänyt ollenkaan sitä kysymystä, johon vastausvaihtoehto kuuluu).

Kun arvioidaan vastaajan henkistä pukusuolta ja verrataan tämän vastauksia muiden vastaajien vastauksiin, otetaan tietenkin huomioon vain ne vastaukset, jotka muilla vastaajilla ovat yhteisiä (tai vastakkaisia) arvioitavan vastausten kanssa. Tämä tapahtuu eri tavalla vanhassa ja uudessa arviointimenetelmässä (katso alla), ja molemmissa on itse asiassa ihan hyvät mahdollisuudet, että tilastollinen analyysi kusee sen takia, että eri vastaajilla on niin erilaisia päällekkäisyyksiä vastattavan kanssa. Mutta en ole jaksanut miettiä tätä niin pitkälle.

Pukusuolen arviointi

Ensimmäinen ajatukseni oli laskea henkinen pukusuoli siten, että katsotaan kunkin vastauksen vaikutus kuhunkin ominaisuuteen laskemalla (vastaus, ominaisuuden arvo) -taulukon regressiosuoran kulmakerroin ja kertomalla keskenään tämä vaikutus ja vastaajan vastauksen (kyllä = 1, ei = 0) ja kaikkien vastaajien keskiarvovastauksen ero. Käymällä tämä kaikkien vastausten osalta saadaan muodostetuksi summa siitä, kuinka paljon vastaajan pukusuoliominaisuus eroaa oletettavasti keskimääräisestä vastaajien pukusuolesta. Katsoin tätä varten MAOLin taulukoista regressiosuoran muodostamiskaavan, koodi näytti seuraavalta. Kaava on aivan tarpeettoman yleispätevä siihen nähden, että x-muuttuja (eli vastaus) on aina arvoltaan 0 tai 1.

def korrelaatio(vaihtoehto, parametri):
        q = '''select count(*), sum(vastaus*arvo), sum(vastaus), sum(arvo),
                sum(vastaus*vastaus) from ps_ominaisuus, ps_vastaus
                where parametri=%s and vaihtoehto=%s
                and ps_ominaisuus.vastaaja = ps_vastaus.vastaaja'''
        ((n, sxy, sx, sy, sxx),) = sqlget(q, (parametri, vaihtoehto))
        if not n: return (0, 0, 0)
        n, sxy, sx, sy, sxx = \
                float(n), float(sxy), float(sx), float(sy), float(sxx)
        # suoraan MAOLin taulukosta :/
        try: corr = (n * sxy - sx * sy) / (n * sxx - sx * sx)
        except ZeroDivisionError: corr = 0
        return (sx / n, sy / n, corr)

def vaikutus(vaihtoehto, parametri, vastaus):
        ka_vastaus, ka_arvo, skaalaus = korrelaatio(vaihtoehto, parametri)
        return skaalaus * (vastaus - ka_vastaus)

Totesin tämän laskentatavan kuitenkin huonoksi, sillä enimmäkseen eri vastausten korrelaatio ominaisuuksien kanssa ei ole kovin voimakas, ja kun lasketaan keskiarvoja jollain tavoin vastanneiden ominaisuuksista ja vielä kaikkien kysymysten erisuuntaisia vaikutuksia yhteen, tulos on hyvin normalisoituva, eli loppujen lopuksi kaikkien vastaajien kaikkien ominaisuuksien arvo on melko lähellä aiemmin vastanneiden keskiarvoa. Tämä on äärimmäisen epätyydyttävää, koska tarkoitus oli oikeasti yrittää löytää vastaajien erot näiden antamien vastausten perusteella. Aloin suunnitella jotain toisenlaista laskutapaa, jossa kärjistetymmin otettaisiin huomioon vastaajan vastausten erityispiirteet ja painotettaisiin enemmän "epätyypillisiä" vastauksia tai vastausyhdistelmiä.

Uusi arviointimenetelmä, jonka kehitin, on seuraava. Sen sijaan, että otettaisiin huomioon kaikki aiemmat vastaajat, etsitäänkin vain muutamia, kaikkein eniten samalla tavalla vastanneita vastaajia tämän vastaajan "prototyypeiksi". Tämänhetkisessä kaavassa otetaan viisi kaikkein samimmin vastannutta aikaisempaa vastaajaa ja muodostetaan vastaajan henkinen pukusuoli keskiarvona (pitäisi olla ehkä mieluummin mediaani satunnaisten klusterin ulkopuolella olijoiden eliminoimiseksi?) näiden prototyyppien pukusuolista. Koodi näyttää seuraavalta:

def hae_prototyypit(vastaaja, maara):
        query = '''select v2.vastaaja from ps_vastaus v1, ps_vastaus v2
                where v1.vastaaja=%s and v1.vaihtoehto = v2.vaihtoehto
                and v2.vastaaja in (select vastaaja from ps_ominaisuus)
                group by v2.vastaaja
                order by avg(v1.vastaus = v2.vastaus) desc limit %s'''
        return sqlgetlist(query, (vastaaja, maara))

def joukon_keskiarvo(parametri, joukko):
        query = '''select avg(arvo) from ps_ominaisuus where parametri=%d
                and vastaaja in (%s)''' % (parametri,
                        ','.join(str(j) for j in joukko))
        ((arvio,),) = sqlget(query)
        return arvio

Myöhemmin päivitin vielä arviointia siten, että kahden vastaajan samankaltaisuuteen eivät vaikuta nekään kysymykset, joihin molemmat ovat vastanneet "ei". Eli vastaustilanne kahden vastaajan välillä vaikuttaa vastaajien samankaltaisuuteen seuraavasti ("+" = lisää samankaltaisuutta, "-" = vähentää samankaltaisuutta, "?" = ei vaikuta samankaltaisuuteen, "vX?" = vastaaja X ei ole vastannut kysymykseen, "vX=YY" = vastaajan X vastaus kysymykseen on YY):

vanha arviointitapa                     uusi arviointitapa
        v1?     v1=ei   v1=joo                  v1?     v1=ei   v1=joo
v2?     ?       ?       ?               v2?     ?       ?       ?
v2=ei   ?       +       -               v2=ei   ?       ?       -
v2=joo  ?       -       +               v2=joo  ?       -       +

Varsinainen opetus koko hommasta tosin on se, että on ihan sama, miten pukusuolta arvioidaan, koska ihmiset ovat joka tapauksessa ihan riemuissaan, kun saavat jotain lukuja eteensä. Turhautumista saattaa tietysti aiheuttaa, jos joku kokeilee monta kertaa eri vastauksilla ja tulokset ovat aina ihan samanlaisia. Uusi laskentatapa ainakin välttää sen sudenkuopan.

Spämmäyksen esto / hankaloitus

Jotkin pukusuolitestissä olevat ominaisuudet ovat ongelmallisia. Vaikka testissä selvästi sanotaan, että kalibrointia varten tarvitaan vastaajan todelliset ominaisuudet, tietyt ominaisuudet houkuttelevat antamaan täysin mielikuvituksellisia vastauksia. Tällaisia ovat ainakin peniksen pituus erektiossa ja paino. En tiedä, mitä tyydytystä vastaaja saa siitä, että valehtelee painonsa vaikka nimenomaan antaa tietojaan auttaakseen testin kalibroinnissa. Joka tapauksessa jotenkin täytyy suhtautua siihen, että testin tekijä voi esimerkiksi sanoa iäkseen 10000 vuotta, koska se vaikuttaa keskiarvoihin hyvin paljon.

Koska en halunnut rakentaa testiohjelmaan tietoa siitä, mitä nämä testissä käsitellyt suureet oikeastaan ovat, päätin tarkistaa syötteet tilastollisesti. Arvo, joka on yli neljän keskihajonnan päässä aiempien vastausten keskiarvosta, heitetään hiljaa mäkeen. Sofistikoituneet hakkerit voivat tästä päätellä, miten tietokantaa voi kumminkin spämmätä, jos on tarpeeksi sitkeä.

Automaattinen spämmäys on ongelma sinänsä, koska kyseessä on julkinen www-lomake. Jokainen www-lomake, jossa on vapaita tekstikenttiä, saa jonkin verran "lomakespämmiä": lomakelähetyksiä, jossa jokaiseen tekstikenttään on tungettu mainoksia siinä toivossa, että ne jostain syystä päätyisivät jonkun luettavaksi (käsittelen ilmiötä myös wikispämmäys-sivulla). Yleensä spämmereiden ainoa varsinainen tavoite on saada lisää linkkejä omalle sivulleen, joten poistan automaattisesti uudet vastausvaihtoehdot, jotka sisältävät linkkejä. Sama rajoitus on tämän nettipäiväkirjan kommentoinnissa, ja se on toiminut kohtalaisen hyvin.

Käyttöliittymäkysymykset

Kun aloin tehdä kyselyä, suunnittelin käyttöliittymän, jossa voi halutessaan kirjautua sisään ja sitten hallinnoida kysymyksiään ja vastauksiaan ja päivittää tietojaan ja niin edelleen. Totesin kuitenkin, että tällainen on (a) epäintuitiivista, (b) turhaa ja (c) itse asiassa tietosuojan kannalta paljon kyseenalaisempaa kuin anonyymi käyttö. Niinpä suunnittelin käyttöliittymän, jossa testin eri toiminnot esitetään käyttäjille toinen toisensa jälkeen jonkinlaisessa kiinnostavuusjärjestyksessä. Jos olet halunnut tehdä testin, haluat ehkä auttaa myös sen kalibroinnissa; jos olet auttanut kalibroinnissa, haluat ehkä myös tehdä siihen uusia kysymyksiä. Ja vastausvaihtoehtoja taas on luontevaa lisätä silloin, kun niiden puute ärsyttää, eli testiä täytettäessä.

Käyttöliittymä on kaikkea muuta kuin loistava. Oikeasti kysymyksiä voisi lisätä paljon ja periaatteessa olisi mahdollista, että vastaaja voisi vastata kysymyksiin lisää ja siten "tarkentaa" tuloksiaan. Kuitenkin suurimman osan näistä tarpeista kattaa myös se, että testin voi tehdä useampaan kertaan. Yksinkertainen on kaunista, ja tässä tärkeintä lienee matala oppimiskynnys.

Muuta opittua

Ihmisiä ärsyttää paljon, jos vastausvaihtoehdot ovat väärässä muodossa tai keskenään epäloogisia. Ihmiset kirjoittavat "muu vastaus"-kenttiin eri asioita, jos tietävät syöttämiensä asioiden päätyvän muiden näkyville, kuin jos olettavat niiden päätyvän vain testin luojan tietoon. Joitain ihmisiä harmittaa miettiä, ovatko homoseksuaaleja vai eivät (siis kaksijakoisuus harmittaa). Ihmiset eivät lue ohjeita eivätkä siksi huomaa, että kaikkia ominaisuuksiaan ei tarvitse kertoa vaikka kertoisikin osan.



Pikalinkit:


kommentoi (viimeksi muutettu 30.05.2023 10:00)