salonanarchist | leunstoelactivist

Data

My failed attempt to build an interesting twitter bot

In 2013, I created @dataanddataviz: a twitter account that retweets tweets about data analysis, charts, maps and programming. Over time, I’ve made a few changes to improve it. And @dataanddataviz did improve, but I’m still not satisfied with it, so I decided to retire it.

There are all sorts of twitter bots. Often, their success is measured by how many followers they gain or how much interaction they provoke. My aim was different. I wanted to create an account that is so interesting that I’d want to follow it myself. Which, of course, is a very subjective criterion (not to mention ambitious).

Timing

First a practical matter: it has been suggested that you can detect twitter bots by the timing of their tweets. The chart below (inspired by this one) shows the timing of posts by @dataanddataviz.

I randomized the time at which @dataanddataviz posts. The median time between tweets is about 100 minutes (I lowered the frequency last January, as shown by the dark green dots). There is no day/night pattern. If tweets were posted manually, you’d expect a day/night pattern.

Selecting tweets

Initially, I collected tweets using search terms such as dataviz, data analysis and open data. From those tweets, I tried selecting the most interesting ones by looking how often they had been retweeted or liked. @dataanddataviz would retweet some of the more popular recent tweets.

This was not a success. For example, there are quite a few people who tweet conspiracy theories and include references to data and charts as «proof». Sometimes, their tweets get quite a few likes and retweets, and @dataanddataviz ended up retweeting some of those tweets. Awkward.

I decided to try a different approach: follow people who I trust, and use their retweets as recommendations. If someone I trust thinks a tweet is interesting enough to retweet, then it may well be interesting enough for @dataanddataviz to retweet.

The people who I follow tweet about topics like data and charts, but sometimes they tweet about other topics too. To make sure tweets are relevant, I added a condition that the text of the tweet contains at least one «mandatory» term (e.g. python, d3, or regex). I also added a condition that none of a series of «banned» terms was in the text of the tweet. I used banned terms for two purposes: filter out tweets about job openings and meetings (hiring, meetup) and filter out hypes (bigdata, data science).

This approach was a considerable improvement, but I still wasn’t happy. Sure, most of @dataanddataviz’ retweets now were relevant and retweets of embarrassing tweets became rare. But too few retweets were really good.

Predict quality?

I tried if I could predict the quality of tweets. I created an interface that would let me rate tweets that met the criteria described above: retweeted by someone I follow; containing at least one of the required terms and containing none of the banned terms.

The interface shows the text of the tweet and, if applicable, the image included in it, but not the names of the person who originally posted the tweet and the recommender who had retweeted it. This way, I forced myself to focus on the content of the tweet rather than the person who posted it. Rating consisted in deciding whether I would retweet that tweet.[1]

I rated 1095 tweets that met the basic criteria. Only 130 were good enough for me to want to retweet them. That’s not much.

I looked if there are any characteristics that can predict whether a tweet is - in my eyes - good enough to retweet. For example: text length; whether the text contains a url, mention or hashtag; and characteristics of the person who originally posted the tweet, such as account age; favourites count; followers count; friends count; friends / followers ratio; statuses count and listed count. None of these characteristics could differentiate between OK tweets and good tweets.

I also looked whether specific words are more likely to appear in good tweets - or vice versa. This was the case, but most examples are unlikely to generalise (e.g., good tweets were more likely to contain the word air or #demography).

Conclusion

I didn’t succeed in creating a retweet bot I’d want to follow myself. @dataanddataviz’ retweets are generally OK but only occasionally really good.

Also, I couldn’t predict tweet quality. Perhaps it would make a difference if I used a larger sample, or more advanced analytical techniques, but I doubt it. Subjective quality appears to be difficult to predict - which shouldn’t come as a big surprise (in fact, Twitter itself isn’t very good at predicting which tweets I’ll like, judging by their You might like suggestions).

Meanwhile, I found that since November, more of the tweets retweeted by @dataanddataviz tend to have a political content. Retweeting political statements isn’t something I want to delegate to a bot, so that’s another reason to retire @dataanddataviz.


  1. Obviously, what is being measured is a bit complicated. Whether I’d want to retweet a tweet depends not only on its quality, but also on its subject. For example, I’m now less inclined to retweet tweets about R than I was a couple years ago, because I started using Python instead of R.  ↩

Zijn er genoeg stemlocaties

Open State heeft de locaties van stembureaus verzameld en ze als open data beschikbaar gesteld. Daaruit blijkt dat er woensdag op een kleine negenduizend plekken gestemd kan worden.

Is dat genoeg? Over ongeveer die vraag is vorig jaar een rechtzaak gevoerd. De Brabantse gemeente Son en Breugel had besloten om bij het Oekraïnereferendum drie stembureaus in te richten, in plaats van de gebruikelijke tien. Forum voor Democratie is toen samen met twee inwoners naar de rechter gestapt.

Uit onderzoek zou zijn gebleken «dat er causaal verband bestaat tussen, kort gezegd, de stemfaciliteiten die aan een kiezer worden geboden (aantal, afstand, locatie) en de mate waarin die kiezer gebruik zal maken van zijn stemrecht». Helaas ontbreekt een bronvermelding.

Uit het verslag van de rechtzaak blijkt dat er niet zoveel geregeld is. In de wet staat alleen dat een gemeente tenminste één stembureau moet inrichten. In de praktijk hanteren gemeenten een informele norm van 1.200 kiesgerechtigden per stembureau. De rechter neemt die informele norm niet zonder meer over, maar kwam wel met een nieuwe regel: je mag niet zomaar het aantal stembureaus drastisch verlagen. Met als argument dat gemeenten zich ‘servicegericht’ op moeten stellen.

Zoals gezegd deden twee inwoners uit Son en Breugel mee aan de rechtzaak. Ze kampen met gezondheidsklachten en wilden daarom graag dat hun ‘vaste’ stembureau om de hoek weer open zou gaan. Daar ging de rechter niet in mee: er is «geen recht voor de individuele burger op het instellen van een stembureau op een afstand op 50 meter van zijn woning, ook niet als die burger slecht ter been is».

Stemlocaties per gemeente

Een analyse van de stemlocaties in Nederland laat zien dat het aantal stemlocaties sterk samenhangt met het aantal kiesgerechtigden in een gemeente. Gezien de informele norm die gemeenten hanteren was dat ook wel te verwachten.

In een doorsnee gemeente is er een stemlocatie per ruim 1.400 kiesgerechtigden. Dat is meer dan de informele norm van 1.200, maar dat heeft wellicht te maken met het verschil tussen stemlocaties en stembureaus (zie Methode).

Er zijn relatief weinig stemlocaties in gemeenten als Haaren, Capelle a/d IJssel (allebei ongeveer 2.800 kiesgerechtigden per locatie) en Heerenveen (3.550). In Son en Breugel kan woensdag op 9 locaties worden gestemd; dat betekent gemiddeld 1.410 kiesgerechtigden per locatie. Een doorsnee gemeente, wat dat betreft. Maar het favoriete stembureau van de twee inwoners die naar de rechter waren gestapt, zit er niet meer bij.

Stemlocaties per wijk

Uit de referendumzaak blijkt dat er wel een informele norm bestaat over het aantal stembureaus in relatie tot het aantal kiesgerechtigden, maar niet over de afstand tot een stembureau. De meeste Amsterdammers zullen geen moeite hebben om een stembureau op loopafstand te vinden, maar hoe zit dat op het platteland? Daar valt wel iets over te zeggen met een analyse op wijkniveau.

Het aantal kiesgerechtigden per wijk is denk ik niet formeel bekend, maar het aantal inwoners natuurlijk wel. Ook dat hangt duidelijk samen met het aantal stemlocaties: hoe meer inwoners in een wijk, hoe meer stemlocaties. Maar de vraag is of er relatief meer stemlocaties zijn in dunbevolkte gebieden. De grafiek hierboven laat het antwoord zien: ja, hoe lager de bevolkingsdichtheid, hoe hoger het aantal stemlocaties per 10.000 inwoners.

Hoe dat in de praktijk ongeveer werkt, is te zien op de kaart hieronder.

kaart

Dunbevolkte gebieden van ons land hebben vaak relatief veel stemlocaties. Dit geldt bijvoorbeeld voor delen van Zeeland, Limburg, Oost-Nederland en vooral Noord-Nederland. Deels geldt dat ook voor de Waddeneilanden, maar daar zijn altijd extra stemmers vanwege het toerisme. De donkergroene wijken zijn vaak (maar zeker niet altijd) wijken met hoogstens een paar honderd inwoners, die toch een stembureau hebben gekregen.

Al met al lijkt het erop dat gemeenten bij de inrichting van stembureaus niet alleen kijken naar het aantal kiesgerechtigden, maar ook naar de afstand die ze moeten afleggen. Klinkt redelijk. Als je echt wil weten hoe het zit, dan zou je eigenlijk voor alle woonadressen in Nederland moeten uitrekenen hoe ver de dichtstbijzijnde stemlocatie is. Die klus laat ik graag aan iemand anders over.

UPDATE - DUIC heeft ondertussen voor de stad Utrecht de afstand van woonadressen tot stemlocaties laten berekenen. De maximale afstand is 3,5 kilometer; de mediaan 332 meter.

Methode

De gegevens over stemlocaties zijn verzameld en beschikbaar gesteld door Open State. Soms zijn er op een locatie meerdere stembureaus, althans in Amsterdam is dat vrij gebruikelijk. Open State lijkt in principe meerdere stembureaus op dezelfde locatie als één locatie te hebben opgevat. Toch komt het een enkele keer voor dat dezelfde locatie (identieke coördinaten) meer dan één keer in het bestand zit; ik denk dat die erdoor zijn geslipt. In het Open State-bestand zitten 9018 locaties; nadat ik de duplicaten had verwijderd waren dat er 8744.

Gegevens over kiesgerechtigden per gemeente zijn te vinden bij het CBS (in dit bestand zijn gemeenten Gennep, Schijndel en Sint Oedenrode nog opgenomen als aparte gemeenten).

Bij het samenvoegen van dit soort bestanden ontstaan altijd problemen doordat gemeentenamen niet consistent worden gespeld of omdat er problemen zijn met de weergave van namen met speciale tekens, zoals S√∫dwest-Frysl√¢n. Open State heeft dit ondervangen door netjes de gemeentecode in het bestand op te nemen. In de CBS-cijfers over kiesgerechtigden is dat helaas niet het geval.

Ik dacht dit op te lossen door elders bij CBS een bestand te downloaden met de gemeentecodes. Maar toen ik de twee CBS-bestanden aan elkaar wilde koppelen bleek dat het CBS zelf geen consistente schrijfwijze hanteert. Kortom, het zou fantastisch zijn als het CBS voortaan standaard in alle datasets met regionale gegevens de bijbehorende regiocodes zou opnemen…

Voor de analyse op wijkniveau heb ik de wijk- en buurtkaart van het CBS (editite 2015) gebruikt. Deze heb ik samen met de Open State-gegevens geopend in Qgis en bepaald hoeveel stemlocaties er zijn per wijk door middel van een points in polygon-analyse.

Hier is de code voor het verwerken van de gegevens.

Quitting Facebook

Last month, data scientist Vicki Boykis posted an interesting article about the kind of data Facebook collects about you. It’s one of those articles that make you think: I really should delete my Facebook account - and then you don’t.

One could argue that Google search data illustrates how people relate to Facebook. People know Facebook isn’t good for them, but they can’t bring themselves to quit. However, when it’s time for New Year’s resolutions, they start googling how to delete their account.

UPDATE - Vicki Boykis just suggested to label major news events. In the past Google Trends had a feature that did just that, but I think they killed it. Of course, you can still do Google or Google News searches for a particular period. As a start I added two stories that may have contributed to the mid–2014 peak. Let’s see if other people come up with more.

Method

Note that the Google search data is per week so each data point really refers to the week starting at that date.

I wanted to do a chart like this in December last year, which would perhaps have been a more appropriate moment. However, I didn’t get consistent data out of Google Trends using search terms like quit facebook. The other day, after deleting my own Facebook account, I realised I had probably used the wrong search term. People don’t search for quit facebook but more likely for delete facebook - they’re looking for technical advice on how to delete their account.

New Python package for downloading and analysing street networks

stationsplein

The image above shows square mile diagrams of cyclable routes in the area around the Stationsplein in Amsterdam, the Hague, Rotterdam and Utrecht. I made the maps with OSMnx, a Python package created by Geoff Boeing, a PhD candidate in urban planning at UC Berkeley (via).

Square mile diagrams are a nice gimmick (with practical uses), but they’re just the tip of the iceberg of what OSMnx can do. You can use it to download administrative boundaries (e.g. the outline of Amsterdam) as well as street networks from Open Street Map. And you can analyse these networks, for example: assess their density, find out which streets are connections between separate clusters in the network, or show which parts of the city have long or short blocks (I haven’t tried doing network measure calculations yet).

Boeing boasts that his package not only offers functionality that wasn’t (easily) available yet, but also that many tasks can be performed with a single line of code. From what I’ve seen so far, it’s true: the package is amazingly easy to use. All in all, I think this is a great tool.

Amsterdamse raadsleden stellen vooral vragen over stadsdeel Centrum

De gemeenteraad heeft een vernieuwde website met raadsinformatie (via AT5) waar je bijvoorbeeld op kan zoeken hoe raadsleden hebben gestemd, welke moties en amendementen ze hebben ingediend en welke vragen ze hebben gesteld. De belofte van open raadsinformatie is hiermee nog niet ingelost,[1] maar je kan er wel wat mee. Bijvoorbeeld: nagaan welke straten worden genoemd in raadsvragen (er zitten een paar haken en ogen aan, zie hieronder Methode).

Het kaartje laat zien welke straten zijn genoemd in raadsvragen. Vooral het centrum staat in de belangstelling. Het gebied buiten de ring krijgt weinig aandacht en dat geldt ook voor grote delen van Noord en Oost. De grafiek hieronder laat de aantallen per stadsdeel zien, waarbij ik heb gecorrigeerd voor het aantal inwoners.

Het beeld is duidelijk: straten in stadsdeel Centrum worden het vaakst genoemd. Relatief gezien zelfs bijna tien keer zo vaak als straten in Zuidoost, het stadsdeel dat het minste aandacht lijkt te krijgen van de gemeenteraad.

Is dat erg? Aan de ene kant komen veel Amsterdammers wel eens in het centrum en hebben ze een mening over wat daar gebeurt. Dus is het logisch dat gemeenteraadsleden wat meer aandacht hebben voor stadsdeel Centrum dan voor de rest van de stad. Aan de andere kant is het verschil wel groot en spelen er buiten het centrum ook zaken die de aandacht verdienen - denk bijvoorbeeld aan gentrification, etnisch profileren of fijnstof.

Type hieronder enkele letters om te kijken of de gemeenteraad vragen heeft gesteld over jouw straat (werkt niet met iOS / Safari, sorry).

Methode

Informatie over raadsvragen heb ik gedownload van de website van de gemeenteraad. Straatnamen heb ik uit dit bestand van de gemeente gehaald. Vervolgens heb ik gecheckt hoe vaak de straatnamen voorkomen in de tekst van raadsvragen. In de bijna 1.200 vragen wordt ruim 750 keer een straatnaam genoemd.

Sommige straatnamen heb ik buiten beschouwing gelaten. Amstel bijvoorbeeld, omdat dit het adres van de gemeente is dat altijd vermeld wordt. Daarnaast de straatnamen Samenwerking, Overleg, Inzet, Vertrouwen, Brink, Rusland. Even goed kan het voorkomen dat een woord wordt herkend als straatnaam terwijl er eigenlijk iets anders mee wordt bedoeld (bijvoorbeeld de naam Overtoom). Daarnaast zullen er ongetwijfeld ook vragen worden gesteld over lokaties zonder dat daarbij een straatnaam wordt genoemd.

Een ander praktisch punt is dat de tekst meestal zowel de vraag als de beantwoording bevat. Het kan daarom voorkomen dat een straatnaam niet wordt genoemd in de oorspronkelijke vraag, maar toch wordt meegeteld, omdat hij wordt genoemd in het antwoord op de vraag.

De coördinaten van de straten heb ik opgezocht met de Bing Maps api.


  1. Op initiatief van raadslid Zeeger Ernsting heeft de gemeenteraad besloten dat raadsinformatie beschikbaar moet komen als open data. Dat betekent dat je per raadslid bijvoorbeeld kan opzoeken wat ze gestemd hebben, maar ook dat die informatie beschikbaar komt in een vorm die je eenvoudig geautomatiseerd kan doorzoeken en analyseren. Dat laatste is nog niet het geval. Zo valt bij moties en vragen niet op een eenduidige manier te achterhalen wie de indiener was. Ook valt het stemgedrag van raadsleden niet eenduidig te koppelen aan de tekst van het voorstel waarover is gestemd. Informatie over moties en amendementen kan je downloaden als Excelbestand, maar het verwerken van die gegevens is (nog steeds) een hachelijk avontuur. De gemeente heeft afgelopen november laten weten dat de open raadsinformatie per september 2017 beschikbaar komt.  ↩

Pages