Tekstanalyse bij Datafryslân

Waarschijnlijk was ik de meest zuidelijke deelnemer: getipt door mijn daar werkende zus nam ik afgelopen donderdag deel aan het lab ‘Tekstanalyse’ van Datafryslân. DataFryslân is een community van 700 Friese dataprofessionals die zich tot doel hebben gesteld om datagedreven werken in Friesland te versterken.

Ik vond het een bijzonder geslaagd lab. Het zat professioneel in elkaar met een instructie op YouTube en overlegmogelijkheden via Slack. Er stond een R-script klaar dat iedereen kon doorlopen en daarna als basis gebruiken om mee verder te gaan. Je las een dataset in met reviews van toeristische accommodaties in Friesland. Deze werd dan eerst bruikbaarder gemaakt (alles naar kleine letters, leestekens en stopwoorden eruitfilteren) en vervolgens werden er analyses op losgelaten.

Verschillende visualisaties (staafdiagram, wordcloud) lieten zien welke woorden het vaakst voorkwamen. Daarna gingen we aan de slag met reeksen woorden (N-grams) en woordcorrelaties, die zich mooi lieten visualiseren in een graaf. Tenslotte werden positieve en negatieve reviews van elkaar gescheiden en werden ze tegen elkaar afgezet.

Erg leuk om hier eens kennis mee te maken. Zoals vaker bij dit soort labs vloog de tijd voorbij en waren we aan het eind nog lang niet uitgespeeld. We gingen uiteen met allerlei ideeën om tekstanalyse in te zetten in ons werk en/of in de hobbysfeer. Veel dank aan Datafryslân voor het organiseren. Nieuwsgierig? Het materiaal staat online.

Netatmo & Corona

Eind 2018 zat in het Nippur-kerstpakket een Netatmo weerstation, leuk voor dataverzamelaars zoals wij. Al snel verschenen in onze groepschat de eerste screenshots uit de Netatmo-app. Niet lang daarna schreven we scripts om de gegevens via de API te ontsluiten en weg te schrijven in een database in de cloud. En regelmatig raadpleegden we de data, enerzijds om thuis en op kantoor het CO2-gehalte in de gaten te houden, anderzijds voor de leuk: zo bleek in de gegevens van oktober duidelijk terug te zien wanneer de openingsborrel van het nieuwe kantoor was: CO2 en geluidsniveau gingen door het dak.

Ook deed het ons goed -we hadden niet anders verwacht- dat de verhuizing naar het nieuwe pand zoveel verschil bleek te maken. In het oude pand lunchten we soms met z’n tienen op een klein zoldertje en dat zag je terug in de CO2-cijfers. Het nieuwe pand is ruimer, moderner en beter geventileerd en het CO2-niveau ligt stukken lager.

 

Nu we inmiddels ruim een jaar aan gegevens hebben kunnen we de verschillende locaties gaan vergelijken. Maar eerst ging mijn speciale aandacht uit naar maart jl. Halverwege de maand ging immers de richtlijn ‘werk zoveel mogelijk thuis’ in. Het is terug te zien in de CO2-gegevens van kantoor Zuid:

Maar hoe zit het in de ’thuiskantoren’ van mijn collega’s?

Bij een optimaal kantoorklimaat zou de luchtvochtigheid tussen de 40 en 60% moeten liggen, de temperatuur tussen 20 en 25 graden Celsius, en de CO2 zou onder de 1000 ppm moeten blijven. Eens zien of dat een beetje goed zit.

Vier collega’s stuurden me de gegevens van hun weerstation. Ter vergelijking heb ik ook de gegevens van het Nippur-kantoor in Oirschot toegevoegd. Om te beginnen bij de luchtvochtigheid: die volgt, ongetwijfeld onder invloed van buiten, overal dezelfde trend:

Wanneer het niet regenachtig is (zoals tegen het einde van de maand), zakt de luchtvochtigheid bij de meeste collega’s onder de 40%. Alleen de collega uit Goirle blijft consequent binnen de bandbreedte. Op ons kantoor in Oirschot mogen we wel wat maatregelen gaan nemen, daar is het ook in vochtige tijden binnen nog aan de droge kant.

Qua temperatuur zit het overal wel aardig goed, al hebben we in Goirle en Wijchen twee tamelijk Spartaanse types zitten. In Oisterwijk spelen de kinderen graag met de knoppen van de verwarming:

Dan de CO2. Gaat overal uitstekend! Sinds het thuiswerken is er een lichte toename te zien, maar allevier de huishoudens blijven ruim binnen de marge en overschrijden maar zelden de 800 ppm.

Kortom, met het binnenklimaat in de thuiskantoren zit het wel goed. Alleen op het gebied van luchtvochtigheid is er her en der ruimte voor verbetering.

Voor de lol volgt hieronder nog het gemiddelde geluidsniveau per dag op de diverse locaties:

Raad zelf maar welke collega, als enige van deze vier, geen thuiswonende kinderen meer heeft.

Nawoord: de oplettende lezer merkt op dat er geen gegevens van mijzelf tussen staan. Dit heeft als banale oorzaak dat de stekker van het weerstation er geruime tijd niet in zat.

Ik heb voor mezelf wel andere gegevens beschikbaar: die van de Fitbit. De app gaf de laatste tijd consequent slaapscores van boven de 80 – uniek! Sinds het thuiswerken gaat de wekker om 7 in plaats van 6 uur, een uurtje langer slapen dus, en volgens de app is de slaapkwaliteit ook beter (vanwege minder prikkels overdag?). Ik ga nog kijken of ik dit ook terugzie in de uitgebreidere slaapgegevens.

Wat in elk geval al wel te zien is, is verminderde activiteit mijnerzijds op werkdagen:

Door omstandigheden begon die verminderde activiteit hier al in februari, maar sindsdien is het maar marginaal beter geworden. Al thuiswerkend kom je wat moeizamer aan beweging dan wanneer je naar het station fietst, van trein naar busstation loopt, en van bushalte naar kantoor. Op kantoor loop je regelmatig naar die collega die twee verdiepingen lager zit, en is de koffieautomaat een stuk verder weg dan hier in huis de keuken. Met veel moeite pers ik er tegenwoordig de befaamde 10.000 stappen per dag uit, die voorheen een fluitje van een cent waren, mede dankzij de dagelijkse lunchwandeling van ons team, in het prachtige park Mariëndaal. Dat we er maar gauw weer een rondje kunnen doen.

Cifla 2019: twee keer de wereld rond

92 lopers in Strava-groep ‘Ciflaten’ hebben in 2019 samen ruim 83.000 kilometers gemaakt: tweemaal rond de aarde dus! De meeste kwamen voor rekening van Michiel: die liep ongeveer tot aan Kabul. Tim J. bracht het tot bij Luxor in Egypte en Pim E. kon vanuit Nijmegen te voet naar de oevers van de Wolga. Dat gaat allemaal niet vanzelf: alledrie trokken ze daarvoor meer dan 300 keer de loopschoenen aan.

Zomaar wat lopers uit de lijst:

Eelco: Thessaloniki

Hans: Vilnius

Annie en Bart: Uppsala

Dave: Algiers

Christian en Aernout: Istanbul

De langste afstand in 1 dag legde Maarten H. af bij de Greinatrail, ruim 61km. Jan Fokke, Charlotte, Christian en Joeri liepen allemaal een keer om en nabij de 50km.

Dan liever de lucht in

Gemiddeld gingen we per loopje 87 meter de hoogte in. In totaal stegen we 644 kilometer, we haalden dus samen bijna 73 keer de top van de Mount Everest. De loopjes met de meeste hoogtemeters vonden plaats in het buitenland, zoals onderstaand lijstje laat zien. Die bovenste was al bijna een halve Mount Everest op zichzelf!

Duo’s

Welk duo liep het vaakst samen (of toevallig rond hetzelfde tijdstip ongeveer dezelfde afstand)? De nummer 1 zal niet verbazen:

Maar ook Annelies en Carine zijn trouwe maatjes: meer dan eenderde van hun loopjes deden ze samen.

Favoriete dagen van de week

Van de ruim 7400 keer dat Ciflaten gingen hardlopen viel dat meer dan 1500 keer op een zondag. Veruit het populairst daarna is de dinsdag, gevolgd door de donderdag. Kortom onze trainingsdagen. Maar ook de zaterdag valt in de smaak. Het minst vaak gaan we op woensdag, niet vreemd na de doorgaans pittige dinsdagavondtrainingen.

Hieronder zien we degenen met een duidelijke voorkeursdag. Van degenen die vorig jaar meer dan 25 keer liepen, komt vooral Edwin V. in het weekend pas goed op gang. Tweederde van zijn loopjes vielen op zaterdag:

I don’t like Mondays…

Mariët prijkt bovenaan de lijst van mensen met een duidelijk minst favoriete dag:

Sterkte morgen, Mariët!

Cifla-Strava: eerste kwartaal 2019

Als vervolg op Cifla-jaarstart in Strava: het overzicht over het eerste kwartaal van dit jaar. Ook hier geldt weer dat we niet alle Ciflaten met Strava in het overzicht terugzien, de vorige blog legt uit waarom.

Eerst een algemeen lijstje met iedereen wiens activiteiten ik heb kunnen ophalen: (klik om te vergroten).

Ontwikkeling in snelheid

(featuring David, Sabiena, Wiebe, Wietske, Arian, Roy, Mariët, Charlotte, Dave, Rens, Ruud, Pim, Tim, Jan, Jan Fokke, Wouter, Marieke)

Nu we gegevens hebben over drie maanden kunnen we zien wie de meeste vooruitgang boekten in snelheid en wie juist het meest stabiel bleven:

(om de stabiliteit duidelijker te laten zien is in het rechterplaatje ter contrast Jan Fokke toegevoegd, die na een snelle Nieuwjaarsloop daarna lange en pittige trails ging lopen en dus sterk daalde qua snelheid).

Overigens moeten we de snelheden met enige korrels zout nemen, want er wil weleens een activiteit doorheen glippen die niet helemaal een loopje is. Zie bijvoorbeeld:

Verdeling over de dag 

(featuring Dieuwertje, Christian, Jan, Arnoud, Jeroen, Steffie, Corné, Harry, Edwin, Indra, Thijs, Jasper, Michiel, Marc en vele anderen)

Nu we data hebben over meerdere maanden kunnen we ook zien rond welke tijden de meeste activiteiten plaatsvinden.

Voor onze club als geheel ligt de piek rond 9 uur ’s avonds. Leuk om te zien is dat de piek qua snelheid op heel andere momenten ligt: rond 16u (dan komen mensen wellicht terug van wedstrijden?). Daarnaast lijkt “even gauw voor/na het werk” ook tot relatief hoge snelheden te leiden (9:00 en 19:00. Bij 19:00 kan ook de baantraining meespelen). Later op de avond doen we het relatief rustig aan. Weliswaar zijn dan veel Cifla-trainingen, maar we gaan niet allemaal even hard en er zit ook weleens een rustige duurloop tussen.

Zoals hierboven te zien is doen wij ’s nachts niet aan hardlopen. Uitzondering zijn vakantiegangers en nighttrails:

Bij degenen die meer dan 10 keer actief waren in het afgelopen kwartaal kunnen we zien wie écht geen ochtendmensen zijn:

Dit zijn lopers met hartstikke veel activiteiten, maar hun vroegste looptijdstip ligt in de late ochtend of vroege middag. Daarentegen hebben we ook vroege vogels: onderstaande mensen waren er minimaal drie keer behoorlijk vroeg bij (of waren, zoals een enkeling hieronder, gewoon in een andere tijdzone):

Hieronder zien we het gemiddeld tijdstip per loper:

Vertikaal en horizontaal 

(met Hendrik, Hester, Jasper, Maarten, Charlotte, Marc, Jan Fokke, Dieuwertje, Edwin, Harry, Corné, Frans, Marieke, Tim, Roy, Indra, Wietske)

Vorige keer was al te zien wie er van heuvels houden. In het nieuwe overzicht (alleen mensen met meer dan 10 activiteiten zijn meegenomen) komen we deels dezelfde namen tegen. In het plaatje ernaast zien we wie het liever vlak houdt -of gewoon in de polder woont- met Hendrik er even naast gezet voor het contrast:

(Niet zo) langlopers 

(met Laurens, Linsey, Eelco, Bart, Dave, Christian, Tim, Jan Fokke, Hester, Michiel, Arian, Jasper, Hendrik, Wietske, Wouter, Jan, Ruud, Thijs, Mariët, Charlotte, Harry, Wiebe, Sabiena, Roy, Jasper, Dieuwertje, Frans, Indra, Aernout, Jeroen, Marc, Wiebe)

Wiens activiteiten duren gemiddeld het langst en wie houden het liever kort en krachtig?

De allerlangste afstand van dit kwartaal werd gerend door Charlotte, op de voet gevolgd door Christian (die het tegelijkertijd presteert om in het lijstje “gemiddeld kortst durende activiteiten” te komen, zie hierboven):

In de categorie “voor minder dan 8 km kom ik m’n bed niet uit”: lopers met minimaal 3 activiteiten waarvan de kortste langer is dan 8 km. Voor Lindsey moet het zelfs minimaal om Zevenheuvelenafstand gaan voor die de loopschoenen aantrekt:

Mooiweerlopers

(featuring Jeroen, Steffie, Annie, Laurens, Pim, Edwin, Dave enz.) 

Links het lijstje van consequente mooiweerlopers: gemiddeld was het minimaal tien graden als ze op pad gingen. Rechts ziet u de warmste momenten van het afgelopen kwartaal en degenen die op dat moment liepen te zweten.

(NB: mijn temperatuurmeter hangt regelmatig in de volle zon. Vandaar dat ie in februari al de 25 aantikte.)

IJskoningen

(met Ruud, Henk, Rens, Arian, Hester, Dave, Jeroen, Michiel, Laurens e.a.)

Hierboven zien we (links) wie gemiddeld bij de laagste temperaturen gingen rennen en (rechts) wie op de koudste momenten van de afgelopen drie maanden actief waren.

Tot slot een paar vermeldenswaardige titels van loopjes.

In de categorie ‘klein leed’:

Poëzie:

Plastisch:

strava_1_namen_4

Voor elke Ciflaat herkenbaar:

P.S: wil je liever niet in dit overzicht, laat het me weten, dan filter ik je eruit. Verder: er zijn ongeveer duizend-en-een haken en ogen aan de gebruikte manier van verzamelen en interpreteren v/d gegevens. Dus hartstikke leuk dit voor de grote lijnen, maar een grote disclaimer voor de details.

Cifla-jaarstart in Strava

Bij Strava kun je via de app je activiteiten en die van je clubgenoten zien, maar je kunt de gegevens ook geautomatiseerd ophalen via een zogeheten API. Daar zitten wat restricties aan (bij je eigen activiteiten krijg je bijvoorbeeld locatie en tijdstip door, maar bij clubgenoten, waarschijnlijk om privacyredenen, niet. Verder komen bij mij alleen die clubgenoten door die én zijn aangemeld bij de club ‘Cifla’ in Strava én wier activiteiten door mij opgehaald mogen worden (dat is als hun profiel op ‘voor iedereen zichtbaar’ staat, of als ze Strava-vrienden zijn met ondergetekende).

Dit betekent dat je verre van een representatief beeld hebt (ook al omdat lang niet iedereen Strava heeft), maar dat maakt het niet minder leuk om toch wat overzichtjes te maken. Zie hier hoe de Strava-Ciflaten het nieuwe jaar zijn begonnen:

We zien dat een groot deel fris en fruitig het nieuwe jaar in ging: maarliefst 18 activiteiten op de voor velen toch wel katerige Nieuwjaarsdag. De absolute piek ligt op 6 januari. Niet verrassend voor wie weet dat we die dag de Nieuwjaarsloop organiseerden. Verder valt op, ook weer voor de hand liggend, dat de dagen waarop er trainingen zijn onze actiefste dagen zijn. Plus de zaterdag, dan gaan er ook veel Ciflaten op pad.

Zoals gezegd geeft de API niet het tijdstip van de loopjes mee. Ik sla bij elke activiteit wel het tijdstip op waarop hij in mijn database verscheen (deze werk ik eens per uur bij). Ervan uitgaand dat de meeste activiteiten vrij kort na afronding naar Strava worden geüpload kunnen we toch een beeld krijgen van hoe laat mensen ongeveer actief waren. Er ligt een zwaartepunt in de avonden, dat zullen waarschijnlijk vooral de dinsdagen en donderdagen zijn. Echt vroege vogels hebben we niet. En de tijdstippen in het holst van de nacht komen bijna allemaal voor rekening van Frenske, die momenteel ergens uithangt waar er een flink tijdsverschil is met hier.

Als je de activiteiten sorteert op afstand en datum krijg je mooi bij elkaar wie er aan dezelfde wedstrijd of training deelnamen:

Kijken we naar het aantal activiteiten per loper, dan zien we the usual suspects in de hoogste regionen. Michiel heeft het zelfs gepresteerd om in de eerste zestien dagen van het jaar negentien activiteiten te loggen: gemiddeld meer dan 1 activiteit per dag. Als we daar verder op inzoomen zien we dat hij op de dag van de Nieuwjaarsloop vier keer aan het rennen is geslagen:

Overigens worden in Strava onder ‘Cifla’ alleen de hardloopactiviteiten van Ciflaten opgenomen. De wielerkoersen van Imme, de roeierijen van Patricia en de AnyTime Fitness-bezigheden van Corné zien we dus niet terug, anders hadden zij vast een stuk hoger gestaan in het overzicht.

Hier zien we van iedereen die door de API-privacy-barrière heenkomt (en die in 2019 al iets heeft gedaan op hardloopgebied) de langste afstand tot nu toe. Diegenen die richting 30km gaan zijn waarschijnlijk in training voor de marathon?

Verder is ook te zien wie er van heuvels houden:

Hester is queen of the hills: zij maakt gemiddeld de meeste hoogtemeters per run.

Dit zijn nog maar de eerste paar weken van het jaar. Ik wil dit de rest van het jaar laten draaien. Blijf dus aan de lijn voor een overzicht van activiteiten van Ciflaten in het voorjaar, in de zomer enz. Sta je niet in het overzicht en wil je er wel in, meld je dan in Strava aan bij club ‘Cifla’ en zet je Strava-profiel op ‘openbaar’ of word Strava-vrienden met ondergetekende. Wil je juist liever niet in dit overzicht, laat het me even weten, dan filter ik je eruit.

Weerstation-data: een kerstpakket en zijn gevolgen

Bij Nippur bestaat het kerstpakket altijd uit een gadget. Dit jaar zat o.a. in de doos: het Netatmo Slim Weerstation. Dat komt omdat 2018 bij ons in het teken stond van sensordata. Een aantal collega’s werkten aan een project met sensoren (ammoniakniveau, luchtvochtigheid, temperatuur enz.) in een varkensstal. De bedoeling was om te leren hoe je sensordata ontsluit naar Azure en wat daar dan allemaal mogelijk is qua opslag, transformaties enz. Daarnaast hebben onze data scientists op deze data wat analyses losgelaten die van nut kunnen zijn voor de boer.

Naar aanleiding hiervan kregen we met Kerst allemaal onze eigen sensordata, in de vorm van het persoonlijke weerstation. Er hoort een app bij die grafiekjes laat zien van bijvoorbeeld het geluidsniveau in je huis:

Op de afbeelding hierboven is goed te zien wanneer de kinderen van de betreffende collega wakker waren.

Al gauw wist iemand te melden dat er ook een API is, met een bijzonder heldere handleiding. Nou had ik al een tijdje lopen spelen met de Strava-API, om de activiteiten van mijn clubgenoten van de hardloopvereniging op te halen. Ik had een Python-scriptje gemaakt dat de gegevens binnenhaalt en wegschrijft naar een database. Na wat aanpassingen was het ook voor de weerstation-API bruikbaar. Het draait nu elke tien minuten:

en de verzamelde gegevens hebben al wat inzichten opgeleverd:

Ik las bijvoorbeeld ooit dat 16:00 het heetste moment van de dag is, maar dat zie ik bij mijn buitenstation niet terug: daar lag afgelopen maand (januari) de piek rond 12:00. De verklaring is simpel: je hoort het buitenstation eigenlijk in de schaduw te hangen, maar dat is op ons balkon (nog) niet mogelijk. En het balkon ligt op het zuidwesten….vandaar.

Verder bleek het CO2-niveau hier in huis door het dak te gaan tijdens en na het koken. Regelmatig werd de 1500 aangetikt. Sinds we dat weten zetten we op die momenten de ventilatie harder en blijven de maximale waarden hangen rond de 1000. (Zoals u ziet vergeten we het soms. Er zijn plannen om een avond te organiseren waarin we leren de mechanische ventilatie geautomatiseerd te laten aansturen m.b.v. een relais.)

Het gaat nu nog maar om drie weken aan (winter-) gegevens. Over een langere periode gaat het interessanter worden. Heb je nu de smaak te pakken en wil je ook het een en ander gaan verzamelen, weet dan dat API-aanbieders over het algemeen geweldige handleidingen online hebben staan. Netatmo geeft voorbeelden van stukjes code:

En Strava heeft zelfs een ‘playground’ op de website:

Het gratis programmaatje Postman kan verder behulpzaam zijn, je kunt daarmee gemakkelijk API-calls doen en zien welk format de output heeft:

Het verdere proces van “selecteer hieruit wat je wilt hebben en stop het in een database” kan op allerlei manieren, ik heb het m.b.v. een Python-script gedaan en dat gescheduled in Amazon Lightsail: een goedkope cloud-optie voor als je alleen maar dit soort kleine dingetjes wilt doen.

Voor mijzelf staat nog op de planning: publieke weerdata ophalen van mensen met een weerstation in omgeving Nijmegen en dit combineren met de Strava-gegevens. Je kunt dan grofweg zien wie er niet van regen houden en het wordt dan bijvoorbeeld ook duidelijk dat ondergetekende acuut haar hardloopactiviteiten staakt bij temperaturen boven de 20 graden. Wordt dus vervolgd, stay tuned.