Sunday, December 31, 2017

GoodReads, Python ja statistika

Goodreads pakub kasutajatele mitmesugust statistikat nende lugemisharjumuste kohta: raamatuid saab mitmel moel organiseerida ja sorteerida, saab seada lugemiseesmärke ja nende täitmist jälgida, aasta lõpus genereeritakse ülevaade möödunud aastast jmt. Ma tahtsin aga teada asju, mida Goodreads mulle otsesõnu (vist) ei öelnud ja kuna mul oli parasjagu palju vaba aega, siis mõtlesin uurida, kuidas ise oma küsimustele vastused leida.

Goodreadsil on normaalselt dokumenteeritud API ja Goodreadsis on ka grupp Goodreads Developers, kust ma mõnele küsimusele vastuse sain. Olgu öeldud, et ma tahtsin algusest peale teha hästi lihtsaid asju, sest ma ei oska õieti programmeeridagi, ma polnud kunagi varem ühtegi API-t enda kasuks tööle pannud ja mu statistikaalased teadmised on sellised, et ma võiksin mingeid dispersioonihinnanguid välja arvutada küll, aga on väga kahtlane, kas ma neist midagi mõistlikku ka järeldada oskaksin. See tegi kõik edasise mu jaoks muidugi hulga lihtsamaks.

Eesmärk

Analüüsida raamatuid, mille lugemise lõpetasin aastatel 2011-2017. Nende aastate kohta on mul Goodreadsis suhteliselt sanitaarses korras andmed, millega midagi teha annab. Mida ma nende raamatute kohta teada tahtsin saada, oli tihedalt seotud sellega, et ma need läbi olen lugenud, seetõttu ei mõelnud ma funktsioone kirjutades, kas neid saaks kuidagi rakendada parasjagu loetavatele või kunagi loetavatele raamatutele jne. Rakendust testides pidasin ma ka silmas ennekõike (ok, tegelikult ainult) seda, et opereeritakse loetud raamatutega. Ja kuigi ma huvitusin alguses ainult enda raamatutest, siis pärastpoole hakkasin analüüsima ka teiste loetud raamatuid (see on ka nimelt võimalik mu programmiga).

Tehnilisest vaatepunktist mõtlesin oma klotsikese kokku kirjutada Pythonis, sest see on kõige lihtsam. Idee oli kirjutada konsoolirakendus, mis võiks ka graafikuid välja pritsida. See käiks siis nii, et programmi käivitades kargab lahti must aken, küsitakse küsimusi kasutajatunnuse, soovitud aastakäikude, statistika jmt kohta, arvuti hakkab arvutama ja siis kuvatakse tulemused sellessamas konsooliaknas ja graafikud salvestatakse pildifailidena.

Probleemid

No kogu selle asjanduse kirjutamine ainult probleemidest ja nende lahendamisest koosneski. Esiteks oli natuke probleem see, et ma eriti Pythonit ei oska. Pole vist enne pidanud ka kirjutama midagi sellist, mida eri mooduliteks jagama peaks, nii et jah. Õnneks Python on selline keel, et lihtsalt asja ära ajamiseks ei pea väga tark olema. Samas tähendas see seda, et ma ei teinud ilmselgelt asju optimaalsel viisil, mistõttu pidin pidevalt päris kaua ootama, kuniks mu programm kümneid või sadu raamatuid ja nende andmeid läbi kammib. (See lõppes siis, kui taipasin andmeid serialiseerima hakata.)

Palju tüütumad probleemid olid seotud Goodreadsiga. Ühest küljest tulid välja puudujäägid mu enda sisestatud andmetes ja teisest küljest pidin rinda pistma suisa Goodreadsi bugidega. Näiteks mõne raamatu leheküljed jäid mu kalkulatsioonidest esimese hooga välja, kuna lähemal vaatlusel selgus, et Goodreadsis olid leheküljenumbrid sisestamata. Mõne puhul ma ei saanudki aru, milles siis häda oli, aga muutsin väljaannet ja siis sai nagu korda. Häda oli ka raamatutega, mille lugemise alustamise kuupäeva olin suvalisel hetkel pannud. Harilikult teen ma seda õigel ajal, aga tuleb ette, et olen raamatu juba läbi lugenud, kui täheldan, et pole seda loetavakski veel märkinud ja siis saavad need mõlemad välja üsna ühesuguse väärtuse. Seetõttu ei hakanud ma näiteks arvutama, milliseid raamatuid ma kõige kiiremini lugenud olen.

Küll aga oli ilmselt Goodreads süüdi olukorras, kus olin loetuks märkinud soomekeelse väljaande ja mingil põhjusel olin sama raamatu eestikeelse väljaande märkinud to-read'iks. Kui ma selle segaduse enda meelest likvideerinud olin, selgus, et lugemise alustamise ja lõpetamise andmeid kusagil vist cache'itakse, sest kuigi Goodreadsis tundus kõik tipp-topp olevat, polnud seda see XML, mille ma oma päringu vastuseks sain. Mõne tunni pärast sama päringut korrates oli aga kõik korras.

Teine Goodreadsi häda oli see, et mingil põhjusel ei õnnestunud korraga kätte saada kasutaja ühe riiuli kõiki raamatuid, mistõttu pidin pärima otsingutulemusi 50 kaupa ja siis nende lehekülgi nii palju läbi käima, et kõik raamatud kätte saada. See ei olnud vist minu süü, sest Goodreads Developers grupis kurtsid ka teised selle üle.

Tulemus (Githubi link)

Goodreadsi API-t kasutades sain teha GET päringu, mille vastuseks sain XML-i kasutaja riiulis olevate raamatutega. Pärast mõningast andmete saniteerimist tegin sellest dictionary, millega siis edasi opereerisin. Kasutaja saab valida, kas teeb uue päringu ja saab värsked andmed või kasutab serialiseeritud andmeid, mis on faili salvestatud. Graafikud jätavad natuke soovida, sest väga raske oli annotatsioone kuidagi automaatselt nii sättida, et need üksteise otsa ei läheks, kui andmed sarnased on. Aga ajab asja ära.

Mis edasi saab?

Mulle nii meeldis seda teha, et ma kavatsen vähemalt ühe nädala sellega edasi tegelda. Näiteks tahaks võrrelda eri kasutajate andmeid.

Panen siia ka lühidalt kirja, mis küsimustele mu programm vastused annab ja lisan siis vastavad graafikud, mille ma Matplotlib'i-nimelise teegiga genereerisin.
  • Millise raamatu lõpuni lugemiseks kulus aastal x enim aega? (Seda probleemipüstitust on natuke raske sõnadesse panna, sest leidus raamatuid, mida ma lugesin aastaid. Aasta x tähistab siis aastat, mil lugemine õnneliku lõpu leidis.)

  • Milline oli kõige (eba)populaarsem raamat, mida ma aastal x lugesin? (Populaarne võrdub siin kõige suurema ja ebapopulaarne kõige väiksema hinnete hulgaga, sest seda oli lihtsam teada saada, kui seda, mitu inimest raamatut lugenud on.)


  • Kui võtta aastal x loetud raamatud, siis mitu hinnet neil keskmiselt oli? (Mõeldes sellele, kas on aastaid, kus loen vähepopulaarseid raamatuid ja aastaid, mil loen menukeid. Tegelikult väljendus selles tulemuses hoopis paljuski see, mis aastatel ma rohkem eesti kirjandust lugenud olen, või mis aastal ma "Süü on tähtedel" lugesin, sest selle populaarsus tõmbas kõik mu keskmised paigast.)

  • Mis oli kõige parem/halvem raamat, mida ma aastal x lugesin? (Headuse mõõdupuuks võtsin raamatu keskmise hinde Goodreadsis.)

  • Mis oli mu aastal x loetud raamatute keskmine hinne Goodreadsis? (Mõtlesin, et huvitav, kas aastate jooksul olen halvemaid või paremaid raamatuid lugema hakanud. Arvestasin ainult neid raamatuid, millel oli minimaalselt 15 hinnet, kuigi see 15 oli üsna lambist võetud. Paljud eesti autorite raamatud on ebanormaalselt kõrge hindega, sest hindajaid on vähe, aga samas ei tahtnud neid kõiki ka välja jätta.)

  • Mitu lehekülge ma aastal x lugesin?

  • Mitu lehekülge ma aastal x keskmiselt iga päev lugesin? (Ühest küljest rikub luule seda vastust kõvasti, sest arvesse lähevad leheküljed, mitte tähemärgid, aga teisest küljest ei võta suur hulk inimesi luulet suu sissegi, nii et selles mõttes oleme vist siis tasa.)

0 kommentaari:

Post a Comment