Vanduo

Ką turi mokėti analitikas

Neseniai iš skaitytojo gavau klausimą: ką turi mokėti analitikas? Klausimas ne toks jau paprastas, nes neužtenka išvardinti kelias programavimo kalbas ar paminėti kelias technologijas: negali būti jokio baigtinio sąrašo prie kurio sudėliojus varneles galėtum sakyti, kad, va, šitas analitikas tikrai yra geras. Juk tai tėra tik įrankiai.

Nors daugelis analitiko negali įsivaizduoti be matematikos ar statistikos žinių, manau, kad pati svarbiausia sritis, kurią turi išmanyti analitikas yra verslas, kuriame jis dirba. Juk jokios naudos iš to, kad gali sudaryti labai protingą statistinį modelį, jeigu verslas iš to negali padaryti jokių protingų įžvalgų. Sugebėti užduoti teisingus klausimus ir į juos atsakyti gal ir ne šimto procentų užtikrintumu, bet greitai ir efektyviai versle yra labai svarbu. Ir labai dažnai būna, jog teisingai ir laiku užduotas klausimas („o mes toje šalyje sudarėme galimybes atsiskaityti debetinėmis kortelėmis?“) atneša žymiai daugiau naudos nei sudėtingi modeliai, beribės procesoriaus galios bei aukštosios matematikos diplomai. Gal būt dėl to ne visada akademinėje srityje daug pasiekusiems žmonėms sekasi dirbti analitikais: tam reikia kiek kitokios patirties, greito mąstymo ir susitaikymo su tuo, kad nemažai sprendimų gali būti ir klaidingi.

Verslo poreikių supratimas sudėtingas ir tuo, kad nelabai aišku, iš kur to mokytis – tai įgyjama per patirtį. Kai jau matai nebe pirmą ekonomikos nuosmukį, gali numatyti, kas bus su apyvartinėmis lėšomis, kai siuvi nebe pirmas kelnes, žinai, kad šitos medžiagos tiekėjas kartais vėluoja, kai klientų kreditingumą analizuoji nebe pirmus metus, supranti, kad verta atsižvelgti ir į kliento amžių ar šeimyninę padėtį. Bet tokios informacijos neperskaitysi kokioje nors vienoje knygoje: reikės ilgai ir aktyviai tuo domėtis. Todėl labai svarbu, kad analitikas būtų žingeidus, domėtųsi savo analizuojama sritimi bei mokėtų uždavinėti teisingus klausimus. Atsakymai ateis su patirtimi.

Aišku, techninės žinios analitikui irgi reikalingos: juk reikia mokėti iš duomenų atrasti dėsningumus. Kadangi nemaža analitiko darbo dalis yra duomenų traukimas ir valymas, analitikui praverstų mokėti elgtis su duomenų bazėmis (dažniausiai tai reiškia, jog vertėtų neblogai žinoti SQL kalbą). Duomenis transformuojant reiktų mokėti kokią nors programavimo kalbą: R, Python, Ruby ar dar ką nors ne itin sudėtingo. Tai labai pagreitina duomenų analizės darbus, jau nekalbant apie tai, kad šių programavimo kalbų reikės norint daryti sudėtingesnes duomenų analizes – Excelis yra lyg vaikiškas kastuvėlis, lyginant su kitais įrankiais, kuriais reikia mokėti norint kapstytis didelių duomenų sankaupose.

Beje, matematikos žinių analitikui ilgai gali neprireikti – jeigu nedaromi sudėtinti dirbtinio intelekto modeliai, visiškai galima apsieiti ir be jos. Matricų algebra tampa naudinga tik labai pažengusiems. Bet be statistikos žinių toli nenueisi: reikia žinoti, kas yra statistinis reikšmingumas tam, kad šią savaitę dviem procentais nukritus pardavimams nepultum į paniką – gal būt tai tik pokytis normalių svyravimų ribose. Neprošal žinoti ir kaip analizuoti laiko eilutes – trendų ir sezoniškumo analizė gali duoti puikių įžvalgų.

Dar viena dažnai pražiūrima analitiko savybė: mokėjimas komunikuoti. Kad ir kokias protingas įžvalgas iš duomenų padarytum, jas reikės papasakoti kitiems kolegoms, ir dažniausiai p-reikšmės, autokoreliacija ir Chi kvadratas jiems absoliučiai nieko nesakys. Geras analitikas moka duomenis prašnekinti: rasti įžvalgas, jas suprantamai pavaizduoti grafikuose ir įtikinamai aprašyti žodžiais (ir nebijoti prieš auditoriją papasakoti jas gyvai). Puikus to pavyzdys yra Gitanas Nausėda – mokėjimas komunikuoti neretai yra svarbiau nei pačios sudėtingiausios akademinės analizės superkompiuteriais. Man pačiam to vertėtų pasimokyti.

Lietuvos Respublikos Seimas

Antro rinkimų turo prognozė pasitelkiant neuroninius tinklus

Pirmiausia turiu įspėti: nemanau, kad reikėtų į gautus rezultatus žiūrėti labai rimtai. Neuroninio tinklo mokymui naudojau tik 2012-ų metų Seimo rinkimų apygardų duomenis, tad imtis labai nedidelė, o tai turėtų lemti ir gana nemažą paklaidą prognozėse. Galbūt tikslesnių rezultatų būtų galima tikėtis naudojant apylinkių, o ne apygardų duomenis.

Prognozuoti šių metų rezultatus iš 2012-ų metų duomenų nelengva ir dėl stipriai pasikeitusio partijų populiarumo: žalieji valstiečiai prieš ketverius metus nebuvo labai patrauklūs rinkėjams, o ir Skvernelio atsiradimas labai šią partiją pakeitė. Įdomu tai, kad Darbo partijos bei tvarkiečių kritimas iš aukštumų gana gerai atsispindi neuroninio tinklo rezultatuose: jiems prognozuojama laimėti mažiau apygardų nei jie šiuo metu pirmauja.  Kad ir kaip ten būtų, gavau tokį rezultatą:

Prognozė Dabar pirmauja
LVZS 24 21
TSLKD 24 22
LSDP 9 10
LRLS 5 4
LLRA 3 3
TT 2 4
KITI 1 2
DP 1 3
NEP 2 2

Neuroninis tinklas „išmoko“, jog stiprus lenkų pirmavimas apygardoje dažniausiai lemia ir pergalę antrame ture. Algirdui Paleckiui pergalė neprognozuojama, nes istoriniai pernai metų duomenys rodo, jog „Frontui“ ne itin sekėsi – bet jo puikus pasirodymas pirmame ture tikriausiai buvo netikėtas ir daugeliui politikos analitikų. Keisčiausia prognozė, kuria sunku patikėti yra 52-oje Visagino-Zarasų apygardoje, kurioje antrame ture kausis Darbo partija su tvarkiečiais (pergalė prognozuojama Darbo partijai, nors stipriai pirmauja tvarkietis Dumbrava). Keistoka, bet gal ir logiška 40-osios Telšių apygardos prognozė, kur stipriai pirmaujantis darbietis turi mažai šansų atsilaikyti prieš valstietį Martinkų. Kaip jau minėjau, Darbo partijai šis modelis daug šansų nepalieka. Visas apygardų sąrašas su prognozuojamais nugalėtojais ir tikimybėmis, kad nugalės pirmaujantis:

Turint nedaug istorinių duomenų tikriausiai labiau pasitikėčiau politikos ekspertų prognozėmis konkrečioje apygardoje arba modeliuočiau tikimybes kiek kurios partijos rėmėjų ateis į antrą turą bei palaikys ne savo partijos kandidatą: būtent tokį modelį ruošia WebRobots komanda, kuri leido man pasinaudoti jų surinktais iš VRK duomenimis. Idėja patreniruoti neuroninį tinklą ir kilo susidūrus su problema ar nebūtų galima kaip nors statistiškai išskaičiuoti tikimybių, kiek, tarkim, socialdemokratų palaikytų konservatorių kandidatą jei jis būtų likęs prieš darbietį. Taip pat galima pažiūrėti į Vaidoto Zemlio prognozes.

Post Mortem

Rezutatai buvo stipriai kitokie, nei buvo tikimasi: daugiausiai prašauta (tikriausiai dėl to, kad 2012-aisias valstiečiai pasirodė ne itin įspūdingai) su LVŽS ir TSLKD. Tam tikros tendencijos buvo teisingos – Darbo partija, Tvarka ir Teisingumas bei Socialdemokratai iš tiesų gavo mažiau mandatų nei buvo pirmaujama po pirmo turo, tuo tarpu liberalai sugebėjo laimėti daugiau apygardų nei pirmavo po pirmo turo, tačiau šių pokyčių mastas buvo žymiai (žymiai žymiai) didesnis. Iš viso, neuroniniai tinklai sugebėjo atspėti 48 apygardas (67% tikslumas). Palyginimui – rankomis dėliotas Webrobots komandos modelis pasiekė 80% tikslumą. Tiesa, atmetus kai kuriuos nelogiškus neuroninio tinklo siūlymus, kurie plika akimi atrodė keisti ir pataisius prognozę Dainavos apygardoje dėl Vinkaus skandalo (ko iš 2012-ųjų duomenų niekaip nebuvo galima žinoti), buvo galima pasiekti maždaug 75% procentų tikslumą. Ne kažką, bet šis tas.

Skaičiuojant modelio patikimumą, dažnai žiūrimas plotas po Receiver Operating Characteristic (ROC) kreive (kuo gerenis modelis, tuo jis turėtų artėti link vieneto). Štai modelių palyginimai:

Area under ROC curve
Neuroninis tinklas (tikimybės) 0.597143
Webrobots modelis 0.708095
Neuroninis tinklas (binarinis) 0.549048
Laimės pirmaujantis 1 ture 0.500000
Laimės pirmaujantis daugiamandatėje 0.487619

O čia pačios ROC kreivės:

Skirtingų modelių ROC kreivės

 

Skaitykite toliau

Kaip skiriasi partijos pagal Manoseimas.lt duomenis

Prieš kelias dienas pasirodė manoseimas.lt svetainė, kurioje, atsakius į 12 klausimų, galima pasilyginti, kuri partija buvo arčiausiai jūsų nuomonės. Buvo įdomu paanalizuoti, kurios partijos yra panašiausios ir kiek jos skiriasi. Liberalai ryškiai kitokia opozicinė partija, bet išties, jiems artimiausi socialdemokratai, o ne konservatoriai.

Koreliacijos tarp partijų

Manoseimas.lt pateikia duomenis apie partijų balsavimus dvylika klausimų. Sudėjus visus duomenis į vieną CSV (kurį galima rasti http://petras.kudaras.lt/notebooks/manoseimas.csv) galima paskaičiuoti koreliacijas tarp partijų balsavimo:

data = read.csv2('/Users/petras/dev/manoseimas.csv', sep=',', header=T, row.names=1)
data = data/100
t(data[1:7,])
##                           TT   DP LSDP   AW LRLS   MG TSLK
## Šauktiniai              0.92 0.89 0.96 0.72 0.95 0.79 0.91
## Meras                   0.82 0.94 0.89 0.85 0.31 0.89 0.55
## Internetinis_balsavimas 0.49 0.80 0.91 0.11 1.00 0.74 0.22
## Darbo_kodeksas          0.91 0.79 0.98 0.15 0.95 0.41 0.42
## Švietimas               0.91 0.92 0.86 0.60 0.29 0.63 0.42
## Vaiko_teisės            0.74 0.78 0.91 0.44 0.76 0.40 0.34
## Alkoholis               0.59 0.53 0.55 0.68 0.44 0.75 0.82
## Pensijos                0.79 0.85 0.89 0.25 0.88 0.24 0.30
## Pabėgėliai              0.96 0.91 0.97 0.89 0.59 0.84 0.84
## Dviguba_pilietybė       0.94 0.90 0.94 0.83 0.91 0.81 0.64
## Asmenvardžiai           0.81 0.61 0.69 0.83 0.51 0.29 0.15
## Privati_informacija     0.76 0.76 0.81 0.59 0.75 0.63 0.74
kable(round(cor(t(data[1:7,])), 2))
TT DP LSDP AW LRLS MG TSLK
TT 1.00 0.57 0.50 0.45 -0.08 0.04 0.30
DP 0.57 1.00 0.85 0.07 0.10 0.36 0.13
LSDP 0.50 0.85 1.00 -0.23 0.51 0.12 0.00
AW 0.45 0.07 -0.23 1.00 -0.57 0.48 0.52
LRLS -0.08 0.10 0.51 -0.57 1.00 -0.19 -0.06
MG 0.04 0.36 0.12 0.48 -0.19 1.00 0.68
TSLK 0.30 0.13 0.00 0.52 -0.06 0.68 1.00

Mano paties rezultatai manoseimas.lt svetainėje mane nustebino, nes, pasirodo, mane geriausiai atstovauja Tvarkos ir Teisingumo partija. Iš tiesų, jų koreliacija su mano nuomone yra tampriausia.

kable(round(cor(t(data)), 2))
TT DP LSDP AW LRLS MG TSLK PETRAS
TT 1.00 0.57 0.50 0.45 -0.08 0.04 0.30 0.61
DP 0.57 1.00 0.85 0.07 0.10 0.36 0.13 0.12
LSDP 0.50 0.85 1.00 -0.23 0.51 0.12 0.00 0.07
AW 0.45 0.07 -0.23 1.00 -0.57 0.48 0.52 0.41
LRLS -0.08 0.10 0.51 -0.57 1.00 -0.19 -0.06 -0.01
MG 0.04 0.36 0.12 0.48 -0.19 1.00 0.68 -0.24
TSLK 0.30 0.13 0.00 0.52 -0.06 0.68 1.00 -0.07
PETRAS 0.61 0.12 0.07 0.41 -0.01 -0.24 -0.07 1.00

Pagrindinių komponenčių analizė

Nenuostabu, jog Facebooke daugelis save laikančių liberalais pamatė, jog jiems geriausiai atstovauja LSDP: liberalų koreliacija su šia partija tikrai geriausia. Bet matyt koreliacijos nėra viskas. Gal galima nupiešti partijų pozicijas vienoje koordinačių erdvėje? Tam galima panaudoti pagrindinių komponenčių analizę (principal component analysis) ir išskirti tiesiškai nepriklausomas komponentes. Tada galima pabandyti pavaizduoti partijas viename dvidimensiniame grafike.

  ggbiplot(prcomp(data[1:7,]/100, center=T), scale=0, 
           labels=rownames(data[1:7,]), var.axes=F)

Nieko keisto, kad koalicijos partnerės LSDP, TT ir DP balsuoja labai panašiai - jos ir glaudžiasi viename grafiko kampe. Tuo tarpu LRLS yra labai skirtinga opozicinė partija, ji patenka visai į kitą kampą nuo TSLK ar kitų opozicinių partijų. Kita vertus, nors LRLS ir geriausiai koreliuoja su LSDP, ji tolokai nuo jos nutolusi. Lygiai kaip ir nuo TSLK.

Tai į ką aš panašus?

Padariau interaktyvų grafiką: pastumdžius atsakymus, galima pastebėti, kaip artėjama ar tolėjama nuo vienos ar kitos partijos. Labiausiai nuo liberalų skiriuosi tuo, kad esu prieš internetinį balsavimą. Būtent šitas klausimas geriausiai atspindi radikalų skirtumą ašyje tarp lenkų AW ir LRLS ir labai stipriai mane atitolina nuo liberalų. Žaistis bus žymiai patogiau, jei atsidarysite šią nuorodą naujame lange: https://petras.shinyapps.io/manoseimas/

Įtakingiausių verslininkų analizė

Vakar dariau šiokią tokią analizę, apie kurią jau rašiau Facebooke. Šiandien tiesiog bandau būdą, kaip įkelti šią analizę į dienoraščio formatą. Geresnę notebook versiją galima rasti čia, o žalius duomenis šiuo adresu.

Svarbiausia pastraipa tiems, kas tingi skaityti viską:

Įdomu tai, kad politikai daug įtakos suteikia asociacijų ir konfederacijų veikėjams, bet verslininkams jie įspūdžio nedaro: grafiko apačioje liko Danas Arlauskas bei Stasys Kropas. Matyt politikams su jais tenka nemažai bendrauti, bet reali jų įtaka kyla ne iš pačių asmenybių, o iš atstovaujamų interesų. Tuo tarpu verslininkai žymiai daugiau reikšmės suteikia Dariui Mockui bei Nerijui Numavičiui: asmenims, kurie atstovauja savo pačių interesus. Gal kiek netikėtai trečias tarp labiausiai politikų nuvertintų verslininkų yra Dalius Misiūnas: energetika verslininkams labai svarbu, bet ji kontroliuojama valstybės ir pačių politikų, tad politikai energetikų galios nesureikšmina.

Tarp didžiųjų bankų ekonomistų irgi įdomus prasilenkimas: Gitanas Nausėda bei Raimondas Kuodis yra politikų ekonomistai, o Nerijus Mačiulis ir Jekaterina Rojaka – labiau verslininkų.

Delfi įtakingiausi verslininkai

Kiekvienais metais portalas Delfi daro svarbių žmonių apklausas ir taip išrenka įtakingiausius šalies žmones. Pasižiūrėjus į įtakingiausių verslininkų rinkimus pasirodė, jog politikai ir patys verslininkai labai skirtingai vertina tam tikrų verslininkų įtaką, tad ką politikai nuvertina ar pervertina?

Tam pirmiausia reikėjo išsivalyti duomenis. Po keliasdešimt search-replace operacijų iš HTML teksto pasidariau švarų CSV, kuris jau tinkamas analizei.

verslas = read.csv2('/Users/petras/datadev/verslininkai.csv', header=TRUE, sep=",")
head(verslas)
##         Verslininkas Politiku_balas Verslininku_balas Pop_balas
## 1    Robertas Dargis            128                89         9
## 2    Gitanas Nausėda             93                62         9
## 3      Darius Mockus             58                68        16
## 4 Nerijus Numavičius             56                62        18
## 5   Nerijus Mačiulis             41                39         4
## 6     Arvydas Avulis             36                22         4
##   Ziniasklaidos_balas Visuomenininku_balas Tarnautoju_balas
## 1                  54                   80              103
## 2                  46                   64               78
## 3                  53                   36               56
## 4                  50                   36               41
## 5                  30                   28               42
## 6                  23                   17               51

Duomenų normalizavimas

Žymiai patogiau dirbti su santykiniais skaičiais, tad absoliučius balus paverčiau į santykinius, padalindamas juos iš kiekvienos kategorijos respondentų skaičiaus (bent jau spėju, jog būtent tai reiškia maksimalus galimas balų skaičius kategorijoje). Santykinis rodiklis reiškia, kokia dalis respondentų pažymėjo konkretų verslininką kaip vieną iš 5 įtakingiausių Lietuvoje.

verslas %>% 
  mutate(Politiku_balas = Politiku_balas / 196) %>%
  mutate(Verslininku_balas = Verslininku_balas / 137) %>%
  mutate(Pop_balas = Pop_balas / 29) %>%
  mutate(Ziniasklaidos_balas = Ziniasklaidos_balas / 93) %>%
  mutate(Visuomenininku_balas = Visuomenininku_balas / 106) %>%
  mutate(Tarnautoju_balas = Tarnautoju_balas / 160) -> verslas

Tiesinė regresija

Pritaikome paprastą tiesinę regresiją.

fit <- lm(Verslininku_balas ~ Politiku_balas, data=verslas) -> fit
summary(fit)
## 
## Call:
## lm(formula = Verslininku_balas ~ Politiku_balas, data = verslas)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.118173 -0.017360  0.002104  0.012048  0.192314 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -0.002738   0.006480  -0.423    0.674    
## Politiku_balas  1.036687   0.049748  20.839   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04563 on 68 degrees of freedom
## Multiple R-squared:  0.8646, Adjusted R-squared:  0.8626 
## F-statistic: 434.3 on 1 and 68 DF,  p-value: < 2.2e-16

Kad jau turime regresiją, kurios R^2 yra 0.86, galima pasižiūrėti, ką labiausiai vertina verslininkai, lyginant su politikais.

verslas$diff <- residuals(fit)
verslas %>% 
  ggplot(aes(x=diff, y=reorder(Verslininkas, diff))) + theme_light() + 
    geom_point(size=1) + 
    geom_segment(aes(y=Verslininkas, yend=Verslininkas, 
                     x=0, xend=diff, color=(diff>0))) +
    geom_point(size=1) + 
    theme(axis.text.y=element_text(size=6), axis.title=element_text(size=8)) + 
    guides(color=F) + ylab("") + 
    xlab("Verslininkų vertinimas, lyginant su politikais") 

Įdomu tai, kad politikai daug įtakos suteikia asociacijų ir konfederacijų veikėjams, bet verslininkams jie įspūdžio nedaro: grafiko apačioje liko Danas Arlauskas bei Stasys Kropas. Matyt politikams su jais tenka nemažai bendrauti, bet reali jų įtaka kyla ne iš pačių asmenybių, o iš atstovaujamų interesų. Tuo tarpu verslininkai žymiai daugiau reikšmės suteikia Dariui Mockui bei Nerijui Numavičiui: asmenims, kurie atstovauja savo pačių interesus. Gal kiek netikėtai trečias tarp labiausiai politikų nuvertintų verslininkų yra Dalius Misiūnas: energetika verslininkams labai svarbu, bet ji kontroliuojama valstybės ir pačių politikų, tad politikai energetikų galios nesureikšmina.

Tarp didžiųjų bankų ekonomistų irgi įdomus prasilenkimas: Gitanas Nausėda bei Raimondas Kuodis yra politikų ekonomistai, o Nerijus Mačiulis ir Jekaterina Rojaka - labiau verslininkų.

Balsuojančiųjų koreliacijos

Ne visos balsuotojų grupės turi vienodą nuomonę. Galima paskaičiuoti koreliacijas tarp skirtingų balsuotojų.

cor(verslas %>% select(-Verslininkas, -diff))
##                      Politiku_balas Verslininku_balas Pop_balas
## Politiku_balas            1.0000000         0.9298451 0.6915122
## Verslininku_balas         0.9298451         1.0000000 0.8094200
## Pop_balas                 0.6915122         0.8094200 1.0000000
## Ziniasklaidos_balas       0.8891672         0.9622906 0.8549599
## Visuomenininku_balas      0.9585121         0.9400149 0.6876915
## Tarnautoju_balas          0.9715207         0.9244120 0.6896682
##                      Ziniasklaidos_balas Visuomenininku_balas
## Politiku_balas                 0.8891672            0.9585121
## Verslininku_balas              0.9622906            0.9400149
## Pop_balas                      0.8549599            0.6876915
## Ziniasklaidos_balas            1.0000000            0.8930495
## Visuomenininku_balas           0.8930495            1.0000000
## Tarnautoju_balas               0.8978414            0.9541088
##                      Tarnautoju_balas
## Politiku_balas              0.9715207
## Verslininku_balas           0.9244120
## Pop_balas                   0.6896682
## Ziniasklaidos_balas         0.8978414
## Visuomenininku_balas        0.9541088
## Tarnautoju_balas            1.0000000

Atrodo, jog labiausiai išsišoka Popkultūros ir sporto atstovų nuomonė. Jų atotrūkis dar geriau matosi spalvotame grafike:

qplot(x=Var1, y=Var2, 
      data=melt(cor(verslas %>% select(-Verslininkas, -diff))), 
      geom="tile", fill=value) +
  xlab("") + ylab("") + guides(fill=F) + theme_light() + 
  theme(axis.text.x=element_text(angle=90)) 

Nenuostabu, kad tarnautojai ir politikai turi labai panašias nuomones (koreliacijos koeficientas net 0.97). Šiose dviejose grupėse buvo apklausta net 160 + 196 = 356 respondentų, tad vienoda valdininkų/politikų nuomonė rinkimuose yra labai stipriai reprezentuojama. Žiniasklaida yra antra labiausiai „nepriklausoma“ grupė (koreliacija su kitomis grupėmis mažesnė nei 0.9), nors jos nuomonė geriausiai koreliuoja su verslininkų nuomone.

Vilniaus viešojo transporto duomenys

Niekada iki šiol nenaudojau dplyr R paketo, tad norėjau pasižiūrėti, kaip jis veikia (o veikia jis tikrai patogiai!). Kadangi neseniai buvo paviešinti Vilniaus Viešojo Transporto vėlavimų duomenys, tai kaip tik šis duomenų rinkinys pasirodė tinkamas pasižaidimui. Kadangi tai labiau techninis galimybių bandymas, tai didelių įžvalgų ir neieškojau, nors visgi radau, kad privatūs vežėjai vėluoja žymiai rečiau nei VVT, troleibusai yra patikimesni nei autobusai, o savaitgaliais viešasis transportas yra punktualesnis (kuo nereiktų stebėtis – juk eismo mažiau).

Nevėluojančių reisų dalis
Nevėluojančių reisų dalis

Detaliau ir techniškiau, su visu kodu: Notebook: Transportas-vėlavimai

Duomenų analitiko darbas dažniausiai yra duomenų valymas

Turbūt didžiausias skirtumas tarp mokykloje ar universitete darytų duomenų analizių ir realaus pasaulio yra turimų duomenų kokybė. Rašėm savaitgaliais magistrinius darbus, pasižiūrėdami į kursiokų failus darėm „statistikos laboratorinius“, sprendėm uždavinius bei iš vadovėlio atkartojom nelabai suprantamas ekonometrinius modelius – ir  beveik visada duomenys buvo duotybė. Ar tai būtų BVP augimo eilutė iš Statistikos departamento, ar Olimpiadų medalių suvestinė: beveik visada duomenys buvo švarūs, tvarkingi, be klaidų, be neužpildytų eilučių, be praleistų kablelių, romėniškų skaitmenų, sunkiai įskaitomo buhalterės Janinos rašto ir pasimetusių sąskaitų-faktūrų. Tereikėdavo tuos duomenis paimti, sudėti į modelį, sukalbėti kelis užkeikimus ir gaudavai vienintelę teisingą p reikšmę ir iš to sekančią išvadą. Didesnis nedarbas yra mažesnė infliacija. Narystė Europos Sąjungoje didina akcijų kainas. Marytė suvalgo daugiau obuolių nei Jonukas.

Skirtingai nei universitete, realybėje duomenys beveik niekada nebūna aiškūs ir tvarkingi. Dažniausiai tau reikiamų duomenų tiesiog nėra (ar daug kas kaupia duomenis apie kiekvienos fizinės parduotuvės kasvalandinį lankytojų srautą?). Jeigu jų galima rasti – jie nepatikimi, nes iki galo nežinai, ar kiekviena apskaitininkė visose Baltijos šalyse prieš penkerius metus vienodai koduodavo gautas sąskaitas. Jeigu jais galima pasitikėti, jie tikriausiai būna nepilni – vienur trūksta detalumo, kitur kažkas nusimušę, trečioje vietoje duomenys nepasiekiami, nes jie nesuskaitmenizuoti. Jau nekalbu apie tai, kad visur yra ir žmogiškas faktorius: kažkur vardas įvestas į pavardės grafą, kažkas sumas vietoje eurų įrašė litais. Kuo daugiau duomenų (ir ypač jei kalbam apie didelius duomenis be struktūros) tuo didesnė duomenų analitiko darbo laiko dalis yra ne sudėtingas duomenų modeliavimas ar rezultatų interpretavimas, o duomenų tvarkymas bei paruošimas analizei. Sakoma, kad šiam kruopščiam ir nuobodokam darbui analitikai sugaišta nuo 50 iki 80 procentų savo darbo laiko.

Gerai sutvarkyti duomenys yra aukso vertės. Tai tokie duomenys, kuriuose nebėra erdvės interpretacijoms, kuriuose nelikę klaidų ir kuriais tvirtai galima remtis darant verslo sprendimus. Tik juos išvalius galima kurti sudėtingus modelius bei algoritmus, o iki tol reikia praleisti ne vieną valandą rymant prie duomenų kokybės. Toks analitiko darbas.

Kada duomenys gali padėti priimti sprendimus?

Prieš pusantrų metų mano rašytas dienoraščio įrašas apie duomenų kultūrą organizacijose pastarosiomis savaitėmis vėl iš naujo užkabino skaitytojus: šia tema parašė „Verslo žinios“ ir apie tai nemažai buvo kalbama Login koridoriuose. Matyt, kompanijose duomenų atsiranda vis daugiau, tik dar nelabai aišku, kaip iš jų išpešti naudos.

Kad ir kaip skambėtų neįprastai, manau, jog duomenų analizėje sudėtingiausia yra ne algoritmai ir ne duomenų infrastruktūra. Svarbiausia ne kur stovi jūsų serveriai, kokia kalba parašytos jūsų duomenų apdorojimo programos ar kuris kietas matematikas darys statistinę jūsų klientų analizę. Svarbiausia, ar jūsų kompanijos kultūra leis jums priimti verslo sprendimus remiantis šaltais ir objektyviais duomenimis, nekreipiant dėmesio į vidinį politikavimą ir norą prieš vadovą pasirodyti geresniu nei esi. Iš duomenų analizės jokios naudos (o netgi sakyčiau dar blogiau – ji žalinga!), jeigu ji naudojama tik savo išankstinei nuomonei apginti bei parodyti, kad jūsų padalinys dirba puikiai. Analitikai turėtų būti skatinami ieškoti kontraargumentų vyraujančiai nuomonei, nes duomenys tam ir yra, kad sprendimai būtų priimami ne vien tik pagal vadovo šeštąjį jausmą. Tai nelengva, jei vadovas galvoja, jog jis geriausiai viską išmano, o jam dirba tik jo valią vykdantys pavaldiniai.

Būti atviram pačiam sau nelengva bet kuriam vadovui. Kartais, žvelgiant į duomenis, reikia giliai įkvėpti ir pripažinti klydus: gal visgi už krentančius pardavimus yra kalti ne konkurentai ar oro temperatūra, o ne itin tobulas pačios kompanijos darbas. Gal nepataikyta su rinkodara, gal buvo problema su sandėliu, gal pritrūko vadybininkų, gal buvo broko ar kokių kitų nesklandumų. Duomenų analizės nauda prasideda nuo atvirumo sau, nuo nuoširdaus noro išsiaiškinti, kur yra problemos šaknys ir noro ją išspręsti. O tai neįmanoma, jeigu kompanijoje vyrauja kaltų paieškos kultūra: natūralu, kad visi stengsis duomenis pagražinti ir parodyti save kuo geresnėje šviesoje.

Tad kai šiomis dienomis kas nors manęs paklausia, ko reikia imtis pirmiausia, kad duomenys padėtų priimti verslo sprendimus, atsakau, jog tai vadovų tikėjimas duomenų kultūra ir realus noras prisikasti iki tiesos. Net geriausi algoritmai jūsų verslui nepadės, jei sprendimai ir toliau bus priimami vien tik remiantis nenuginčijama aukščiausio vadovo nuomone arba jei save pagiriant analizės bus naudojamos tik gražesniam paveikslui valdybai pateikti. Pradėti reikia nuo kompanijos kultūros.

Telefonas žino, kada tu nuėjai miegoti

Iš anksto įspėju: tai techniškas įrašas, kuris bus įdomus tik stiprokai užkietėjusiems duomenų analitikams, kurių negąsdina R ar Ruby. Jei šie dalykai jus nelabai domina, štai trumpa įrašo santrauka: jūsų telefonas gali kaupti daug įdomios informacijos apie jūsų judėjimą, mat jis moka būti ir žingsniamačiu. Tuos duomenis galima išsitraukti ir pribraižyti visokių gudrių grafikų, kurie parodo, kad kažkodėl antradieniais ir ketvirtadieniais jūs keliatės valandą anksčiau nei įprastai, 2015 metų gegužę kelias savaites praleidote kitoje Atlanto pusėje ar bent jau panašioje laiko zonoje, o tų pačių metų rugsėjo pradžioje buvote vakarėlyje, iš kurio grįžote apie 2 valandą ryto.

Išsitraukti duomenis iš iPhone telefono nesudėtinga: keli mygtukų paspaudimai, keletas minučių laukimo, ir sugeneruojamas nemažas XML archyvas. Jame yra ne vien tik nueiti žingsniai ir kilometrai, bet ir visi kiti Health programėlės duomenys: gal ten kada vedėtės savo svorį, gal dar koks Runkeeper ten saugojo bėgimo rezultatus ar panašiai – viskas bus viename archyve. Duomenų nemažokai: per pusantrų metų vien žingsniamačio duomenų buvo virš 130 tūkstančių įrašų. Iki 2015 kovo pabaigos, kai Apple išleido Apple Watch ir atnaujino žingsniamačio programinę įrangą, telefonas per dieną jų sugeneruodavo po kelis tūkstančius eilučių. Vos tik stabteli ir atsiranda naujas įrašas: per paskutinės keturias sekundes nuėjai 3,5 metro. Vėliau jau duomenys užrašinėjami ne tokiu jautrumu, tad duomenų mažiau, ir jie nebe tokie smulkūs (nors suminis nueitų žingsnių/kilometrų kiekis nepakito).

XML su Ruby konvertavau į CSV:

require 'nokogiri'
puts "start,end,source,dist"
doc = File.open('export.xml') { |f| Nokogiri.XML(f) }
doc.xpath("//Record[@type='HKQuantityTypeIdentifierDistanceWalkingRunning']").each do |record|
  puts "#{record['startDate']},#{record['endDate']},#{record['sourceName']},#{record['value']}"
end

Tada su R po nedidelių duomenų pakeitimų (tais atvejais, kai judėjimas tęsiasi per vidurnaktį, reikėjo įrašą išskaidyti į du segmentus: iki vidurnakčio ir po jo) sudėjau visus duomenis ant vieno grafiko. Aišku, kai duomenų eilučių šimtas tūkstančių, tai jis labiau primena baltąjį triukšmą, nors kai kurie dalykai visgi matosi: tarkim, galima matyti, jog 2015 gegužę judėjimo ir ramybės laikas ryškiai pasistūmęs, nes tuo metu buvau už Atlanto.

library(lubridate)
library(ggplot2)
library(data.table)

foo = read.csv("distances.csv")
foo$start_hour = hour(foo$start) + minute(foo$start)/60 + second(foo$start)/3600
foo$end_hour = hour(foo$end) + minute(foo$end)/60 + second(foo$end)/3600

foo_overlap = foo[end_hour < start_hour]
foo_overlap[end_hour < start_hour, start_hour := 0]
foo_overlap[end_hour < start_hour, start := end]
foo$end_hour = ifelse(foo$end_hour < foo$start_hour, 24, foo$end_hour)
foo_awesome = rbind(foo, foo_overlap)

ggplot(foo_awesome) + 
  geom_segment( 
    aes(
      x    = start_hour,
      xend = end_hour,
      y    = as.Date(start),
      yend = as.Date(start)
    ),
    size=0.7) +
  xlab("Paros laikas") + ylab("Data") + 
  scale_x_continuous(breaks=c(0,2,4,6,8,10,12,14,16,18,20,22,24), limits=c(0,24), expand=c(0,0)) + 
  scale_y_date(expand=c(0,0), date_breaks="2 month", date_labels = "%Y %b") + 
  guides(colour=FALSE)
Visi duomenys yra beveik kaip baltas triukšmas
Kai sudedi visus duomenis į vieną grafiką gauni beveik tik triukšmą

Akivaizdu, kad norint pamatyti ką nors gudresnio, reikia duomenis kaip nors pjaustyti ar grupuoti. Parą galima suskaidyti į intervalus po 10 minučių, ir kiekviename šių intervalų pažymėti ar buvo judama ar ne: duomenų kiekis sumažėja ir juos galima žymiai lengviau analizuoti. Grupuojant pagal savaitės dienas grafikas žymiai iškalbingesnis.

Mano aktyvumas pagal savaitės dienas
Mano aktyvumas pagal savaitės dienas: žalia – neaktyvu, kuo raudoniau/balčiau tuo daugiau judėjimo

Čia aiškiai matosi, kad antradieniais ir ketvirtadieniais keliuosi anksčiau, mat nuo 8 ryto einu į baseiną. Darbo dienomis apie 10 valandą būna mažokai judėjimo – tuo metu skaitau elektroninį paštą bei geriu kavą, kaip ir mažiau judėjimo apie 14-15 valandą, kai dirbu produktyviausiai. Savaitgaliais miegu dar ilgiau, o sekmadieniais iš lovos išlipu 9.30. Šeštadienis – aktyviausia diena, o sekmadienio vakaras tingus jau nuo pat 18-19 valandos.

Lietuvos toponimų žemėlapis

Prieš keletą dienų užtikęs smagią Vokietijos miestų priesagų vizualizaciją, užsinorėjau ką nors panašaus papaišyti ir su Lietuvos duomenimis. Juolab, kad tai galimybė pažaisti su vis naujais ir dar nepažintais įrankiais bei programomis: ne vien ką nors įdomaus išpeši iš duomenų, bet ir išmoksti ką nors naujo. Duomenis ėmiau iš geonames, analizei ir piešimui naudojau QGIS, MMQGIS bei Mapbox.

-aičiai yra visiškai žemaitiška priesaga
-aičiai yra visiškai žemaitiška priesaga

Įdomiausios priesagos pasirodė -aičiai ir -onys: pirmieji ryškiai dominuoja Žemaitijoje, o antrųjų pas žemaičius beveik nerasi. -ininkai lyg ir Dzūkijos bei Panemunės mada. -upiai žymiai populiaresni nei -ežeriai, kurių net ežeringiausiuose kraštuose retai sutiksi. Visi žemėlapiai ir priesagos šiame puslapyje.

-onių Žemaitijoje nerasi
-onių Žemaitijoje beveik nerasi

Negalima pasitikėti tuo, ką skaitai apie maisto naudą ar žalą

„Įrodyti“, kad vienas ar kitas maisto produktas yra labai sveikas ar didina grėsmę ligoms yra labai labai LABAI sunku. Todėl ir tiek konfliktuojančių teorijų bei madingų dietų. O gal tiesiog geriausia nekreipti į nieką dėmesio ir valgyti tai, kas patinka.

Šaltinis: You Can’t Trust What You Read About Nutrition | FiveThirtyEight