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

Kelionės trukmės žemėlapis Vilniuje

Vakar sėdėdamas kasdieniame Vilniaus kamštyje ir prisiminęs ryte skaitytą straipsnį apie paskutines vizualizacijos madas sugalvojau pabraižyti kelionės trukmių žemėlapį: gal čia tik man taip prastokai sekasi, kad tenka keliauti iš Lazdynų į Žirmūnų pabaigą. Per Google Maps API programiniu būdu gana nesunkiai galima išsitraukti planuojamą kelionės trukmę tarp kelių taškų (juos galima nurodyti ir geografinėmis koordinatėmis), tada duomenis sudėti į duomenų bazę ir su Tableau įvairiomis spalvomis perkelti ant žemėlapio. Žemėlapyje vaizduojama kelionės trukmė nuo Jonažolių gatvės Lazdynuose – pasirinkau savo namų atskaitos tašką: kuo žaliau, tuo kelionės trukmė trumpesnė, o kuo raudoniau, tuo keliauti teks ilgiau. Duomenys rinkti antradienio 10.00-10.30 valandą, tad kamščiai jau turėjo būti išsisklaidę.

Kelionės trukmė nuo Jonažolių gatvės
Kelionės trukmė nuo Jonažolių gatvės

Rezultatai gana gražūs ir labai aiškiai parodantys aplinkelių naudą: iš Lazdynų į Pilaitę, Pašilaičius ar Justiniškes patekti nesunku, lygiai taip kaip ir iki oro uosto. Užtat Žirmūnai, Antakalnis ir viskas į rytus nuo šiaurinės Geležinio Vilko gatvės dalies yra lyg kitas miestas: ten dominuoja geltona ir raudonos spalvos. Nors, ne piko metu skųstis nereiktų, mat vis tiek didžiausia prognozuojama kelionės trukmė automobiliu yra maždaug pusvalandis. Tiesa, piko metu vaizdas tikriausiai daug blogesnis: neretai pačiam tenka kamštyje prasėdėti virš valandos.

Duomenų analizė Twitter

Geras straipsnis apie tai, ką reiškia būti duomenų analitiku tokioje didelėje kompanijoje kaip Twitter: ką jie veikia, su kokiomis problemomis susiduria ir kodėl norinčiam knistis dideliuose duomenyse reikia mokėti programuoti. Jei sukūrei modelį R kalba savo kompiuteryje tai dar nereiškia, jog jį bus galima panaudoti praktikoje – ties juo dar nemažai turės prisidėti programuotojai, kol jis galės būti perkeltas į produkcinę aplinką.

Šaltinis: Doing Data Science at Twitter — Medium

Alaus degustavimas: pigūs ir stiprūs nebūtinai yra blogai

Prieš truputį daugiau nei metus su kolegomis darėme eksperimentą: degustuodami įvairaus brangumo vynus bandėme suprasti, ar kaina mums koreliuoja su skoniu. Koreliavo: brangiausias vynas pelnytai buvo populiariausias, net jeigu ir eksperimente dalyvavę somelje buvo ne profesionalūs vyno snobai. Šįmet gimtadienio vakarėlyje eksperimentą pakartojom su skirtingomis alaus rūšimis.

Alus – žymiai demokratiškesnis gėrimas nei vynas, tad šešeto kartų kainų skirtumą parduotuvėse ne taip jau lengva rasti (pernykštėje vynų degustacijoje bandomieji buteliai kainavo nuo 15 iki 100 Lt), bet gerai pasistengus – pavyko. Tiesa, teko pigiausių pavyzdžių ieškoti Kruonio miestelio parduotuvėje, nes tokių prekinių alaus ženklų nesu matęs dideliuose prekybos centruose: alaus „Vo!“, „Grifas“ bei „Žalčio Stipriojo“ litriniai bambaliai kainavo tik apie €0,85. Brangiausiųjų klasę atstovavo ispaniškas „Estrella“ (už litrą kiek daugiau nei €5) bei „London Pride“ (litras – €4). Nors pradžioje galvojau kaip kontrolinį pavyzdį įtraukti visiškai standartinį „Carlsberg“ alų, bet paskutinę minutę pakeičiau jį nealkoholiniu „Bavaria“. Bent jau kiek esu ragavęs nealkoholinio alaus, šis lyg ir buvo visai geriamas. Bent jau leidau sau taip galvoti.

Dešimt degustuotojų atsitiktine tvarka ragavo visas šešias alaus rūšis bei skalėje nuo 1 iki 5 turėjo įvertinti alaus kvapą, skonį bei savo norą testuojamą alų pakartoti. Rezultatai nebuvo visiškai netikėti: brangiausias „Estrella“ surinko daugiausiai balų (nors, net keli degustatoriai sumaišė jį su nealkoholiniu alumi – paragavus keletą stipriųjų Kruonio klasės alaus pavyzdžių, bet koks kitas alus atrodo be alkoholio), o antram brangiausiam „London Pride“ vertinimuose koją pakišo specifinis kartumas. Gal kiek netikėtai nuo nugalėtojo visai nedaug atsiliko alus „Vo!“ bei „Žalčio stiprusis“: tikėtina, jog nesofistikuotoje degustatorių kompanijoje jie būtų visiškai lygiaverčiai varžovai šešetą kartų prabangesniems konkurentams, jei tik turėtų savyje mažiau alkoholio. Bet net ir būdami stiprūs kaip kaimo vyrų prakaitas, kvapu bei skoniu jie gali lygintis su pasaulinio lygio aludarių gaminiais.

Aiškiausias degustacijos nusivylimas – nealkoholinis alus „Bavaria“: jokių šansų konkuruoti su alkoholio pertekusiais varžovais. Jeigu kvapo rungtyje dar buvo kažkokios vilties jog juo mėgautis galima, nuosprendis dėl skonio buvo negailestingas. Ar iš vis būna geriamo nealkoholinio alaus?

Alaus vertinimai
Alaus vertinimai

Visus rezultatus galima parsisiųsti Excel formatu.

Vilniaus savivaldybės nuomojami sklypai žemėlapyje

Vakar Vilniaus miesto savivaldybė atvėrė dar vieną duomenų rinkinį – viešais tapo savivaldybės sklypų nuomos duomenys. Duomenys dar neidealūs, bet judama tikrai teisinga linkme. Labiausiai gaila, kad kol kas negalima matyti kiekvieno sklypo nuomos pajamų, nes nuomininkų sumokėtos įmokos suagreguotos: jeigu Šilumos tinklai nuomojasi daugiau nei vieną sklypą, nesužinosi, kiek už kurį sklypą konkrečiai mokama.

Dar būtų galima patobulėti ir metaduomenyse: nors duomenys ir yra, bet dokumentacijos apie juos trūksta, tad apie kai kurių laukų prasmę tenka spėlioti. Pabandžiau sudėlioti sklypų duomenis žemėlapyje, bet tam reikėjo padaryti keletą prielaidų (tikiuosi, kad teisingų): sklypo plotas pateikiamas viso sklypo, laukai „vardiklis“ ir „skaitiklis“ nurodo nuomojamo sklypo dalį, surinktos sumos yra pateiktos už visą nuomos sutarties laikotarpį nuo jos įsigaliojimo ir pan. Atrinkti tik tie sklypai, kurių nuomininkai nuomavosi tik juos vienintelius – taip galima tiksliai žinoti, kokia nuomos suma buvo gauta už konkretų sklypą. Sklypų daug, tad žemėlapyje kol kas atsigulė ne visi: neužteko Google dienos limito išversti sklypų adresus į žemėlapio koordinates. Sudėta apie ketvirtadalis duomenų, po savaitgalio turėtų būti jau visi paviešinti.

Jeigu norite matyti didesniame formate, žemėlapį galima rasti Tableau svetainėje. Dėkui Remigijui Šimašiui už iniciatyvą viešinti duomenis.

ATNAUJINIMAS (2015.07.22): Sudėti visi sklypai, kurių adresus pavyko iškoduoti. Nuomos kainos yra teisingos, nebent jos yra lygios nuliui: tai nereiškia, kad sklypas nuomojamas už dyką, o tik tai, kad šiuo metu trūksta duomenų: stengiamės, kad ir jie atsirastų.