champagne anarchist | armchair activist

Python

Komen stadsdeelpolitici op landelijke TV? Gegevens uit de NPO Backstage API

Laatst heb ik gekeken hoe vaak Amsterdamse politici worden genoemd op de websites van het Parool en AT5. Voorlopige conclusie: de belangstelling voor de stadsdeelpolitiek lijkt te zijn ingezakt sinds de macht van de stadsdelen is ingeperkt per maart 2014.

Toen ik vervolgens een artikel tegenkwam waarin wordt uitgelegd hoe makkelijk je aan gegevens kan komen over NPO-programma’s, heb ik ook nog een blik geworpen op de belangstelling van de publieke omroep voor de Amsterdamse politiek.

Met een slag om de arm (zie hieronder, Methode) zijn de resultaten: in de raadsperiode tot maart 2014 werden gemeentepolitici 28 keer genoemd en stadsdeelpolitici 18 keer. Sinds de hervorming van het bestuurlijke stelsel in maart 2014 werden gemeentepolitici 11 keer genoemd en stadsdeelpolitici nog maar 3 keer (de grafiek toont het gemiddelde aantal vermeldingen per 100 dagen). Dit lijkt dus het beeld te bevestigen dat stadsdeelpolitiek in de ogen van de redacties minder relevant is geworden.

In de periode 2010–2014 zijn de volgende stadsdeelpolitici genoemd (of hun naamgenoten):

  • Fatima Elatik (4 keer): Over Marokkaanse jongeren, lipstick moslims en haar werk als stadsdeelvoorzitter.
  • Henk de Boer (2 keer): Iemand anders met dezelfde naam?
  • Ronald Mauer: Over de dood van een grensrechter in Nieuw-Sloten.
  • Jeroen Mirck: Kwam als internetjournalist aan het woord in een programma over Rutger Castricum.
  • Frans Icke: Over zweefvliegen. Iemand anders met dezelfde naam?
  • Jeroen van Spijk: Over parkeertarieven in Oost (AT5-fragment bij De Wereld Draait Door).
  • Boudewijn Oranje: Over de sloopplannen van de UvA voor het BG-terrein.
  • Jan Engel: Iemand anders met dezelfde naam?
  • Stefan de Bruijn: Over de vluchtkerk (aangekondigd als gemeenteraadslid, maar dat terzijde).
  • Martien Kuitenbrouwer: Naar aanleiding van de juwelier in de Jan Evertsenstraat die werd doodgeschoten bij een overval.
  • Coby van Berkum: Over het dreigende verlies van de PvdA bij de verkiezingen van maart 2014.
  • Ahmed Baâdoud: Over liquidaties.
  • Bart van der Linden: Iemand anders met dezelfde naam?
  • Joël Andoetoe: Over de VVD en de affaire-Van Reij.

En in de huidige periode:

  • Jeroen van Berkel: Iemand anders met dezelfde naam?
  • Frans Icke: Zie hierboven.
  • Alexander Hammelburg: Kwam als politicoloog aan het woord over Saoedisch ingrijpen in Jemen.

In verschillende gevallen lijkt er sprake te zijn van naamgenoten die niets te maken hebben met de stadsdeelpolitiek. Wanneer er daadwerkelijk stadsdeelpolitici op de landelijke TV komen, dan gaat het lang niet altijd over stadsdeelpolitiek. Maar in zijn algemeenheid kan je wel zeggen dat stadsdeelpolitici in de vorige periode vaker werden gezien als relevante bron over wat er speelt in Amsterdam.

Methode

Zoeken via de NPO Backstage API is op zich vrij eenvoudig en je hoeft niet eens te registreren (!). Bovendien staan op Github verschillende voorbeelden van Pythoncode die laten zien hoe de API werkt.

Ik stuitte wel op het probleem dat er aanvankelijk veel dubbelingen in m’n zoekresultaten zaten. Dit komt doordat de API verschillende soorten informatie bevat zoals een algemene beschrijving van een programma; een beschrijving van metadata en voor sommige programma’s de tekst van de complete ondertiteling voor slechthorenden.

Ik besloot om te zoeken in de ondertitelingen. Op die manier voorkom je veel dubbelingen en gebruik je een consistente dataset. Tegelijk is het wel zo dat de ondertiteling niet van alle programma’s beschikbaar is. Daardoor mis je bijvoorbeeld het radio-optreden van Rutger Groot Wassink bij de EO, waarin hij zijn boycot van de gemeentelijke nieuwjaarsreceptie toelicht.

Met een zoekopdracht binnen de set ondertitelingen hou je nog steeds dubbelingen over, omdat programma’s soms herhaald worden. Het item met Jeroen Mirck over Rutger Castricum bijvoorbeeld is drie keer uitgezonden. Die uitzendingen hebben allemaal een eigen prid (programma-ID), dus daarmee los je het probleem niet op.

De herhalingen heb ik geprobeerd eruit te filteren op basis van de eerste vijftig karakters van de programmabeschrijving (en vervolgens heb ik van alle bijbehorende uitzenddatums de oudste genomen). Deze methode is niet waterdicht: aan de ene kant kunnen er inconsistenties zitten in de programmabeschrijving en aan de andere kant wordt soms dezelfde omschrijving gebruikt voor alle afleveringen van een serie programma’s. Op die manier kan het gebeuren dat meerdere optredens bij Pauw en Witteman ten onrechte worden geteld als één optreden. Pragmatisch gezien denk ik dat de verstorende werking hiervan minder ernstig is dan wanneer je herhalingen meetelt als afzonderlijke optredens. Maar het blijft een beetje een los eindje.

Een voorbeeld van een url voor een zoekopdracht is http://backstage-api.npo.nl/v0/tt888/search?query=%22lodewijk%20asscher%22&size=100&from=0. Je bladert door de resultaten door de waarde van from telkens met 100 te verhogen totdat deze waarde hoger is dan het totale aantal resultaten. Vervolgens kan je voor elk resultaat details zoals de datum opzoeken via een url waarin de prid is verwerkt, bijvoorbeeld http://backstage-api.npo.nl/v0/prid/VARA_101279206.

Voor de manier waarop ik namen van politici heb verzameld en de uiteindelijke resultaten heb geanalyseerd, zie m’n eerdere artikel over lokale media.

De NPO Backstage API is ontwikkeld door de Open State Foundation die zich inzet voor toegankelijke overheidsinformatie. De stichting zat ook achter Politwoops, de site waar verwijderde tweets van politici werden gearchiveerd - totdat Twitter hier een stokje voor stak.

Apparently, it’s still possible to fool Google

Researchers have found that men are almost six times more likely than women to be shown ads on news websites for a career coaching service for $200k+ executive positions. The findings suggest some of the algorithms involved in tracking internet users have discriminatory outcomes. They might lead to «deeper investigations by either the companies themselves or by regulatory bodies», the authors add (via WP).

Not just the findings are interesting, but so is the research method. The researchers created AdFisher, basically a smart web scraper built with Python. AdFisher can create large numbers of «agents», have them visit certain websites or alter their profile via the Google Ad Settings, and then see what ads it gets shown on websites like the Times of India or the Guardian. Further, it will organise these activities in such a way that experimental and control conditions can be compared, and it will even analyse the results, using machine learning to figure out what may have triggered differences in what ads are shown.

Somehow this reminded me of the patent Apple (!) obtained for a cloning service to fool the companies that are tracking you. The service would mimick some of your normal online behaviour, but also do other stuff, such as faking an interest in basket weaving. This way it would contaminate the profile these companies keep of you, perhaps to the point of making it useless.

So would you be able to get away with that? If you open a bunch of browser windows with Google searches, Google will ask you to fill out a captcha to make sure you’re human («Our systems have detected unusual traffic from your computer network. This page checks to see if it’s really you sending the requests, and not a robot»). This is a very simple example, but given the fast-developing ability to analyse patterns in online behaviour, you’d expect that companies like Google and Facebook would have become eerily accurate at identifying (real) internet users and telling them from bots.

Against that background, it’s somehow reassuring that it’s apparently still possible to fool Google by creating a fake profile.

P.s. I’ve never been shown ads for a career coaching service for $200k+ executive positions, but if they do turn up I’ll just tell Google I’m a woman.

Tweeting #oxi

The responses of European leaders to the outcome of last Sunday’s referendum in Greece were pretty unanimous. Germany’s vice-chancellor Sigmar Gabriel (a social-democrat) said Tsipras had torn down the bridges between Greece and the rest of Europe. Spanish PM Mariano Rajoy said Greece must follow Europe’s rules. And Dutch PM Mark Rutte somewhat pedantically said he was «really angry» about the referendum and that the Greeks better not come up with a «lame story» (flutverhaal).

For a different perspective, I turned to Twitter. The hashtag #oxi, associated with a ‘no’ vote in the referendum, has become a bit of a symbol of opposition to EU-imposed austerity. I collected some 110,000 tweets containing #oxi (and not #nai) from around last Sunday. The #oxi tweets that are geotagged are shown on the map. It appears that quite a few tweets came from Spain and Italy, but also from the UK and Ireland, and - who’d have thought - the Netherlands (one wonders if bar de Druif in Amsterdam is an #oxi stronghold). In Spain, #oxi territory seems to overlap with areas where progressive party Podemos won in the mayoral elections earlier this year.

Note that only a small proportion of tweets are geotagged, so one shouldn’t rush to conclusions based just on the map. An alternative approach is to look at the language of tweets.

To interpret these findings properly one should take various factors into account, including the number of people who speak a language and how many are on Twitter. But whichever way you look at it, the number of Spanish-language #oxi tweets is impressive. There may well be a connection with the popularity of Podemos.

To get an idea of the contents of the #oxi-tweets I looked up the most-favourited tweets in some of the key languages. A few examples:

The joy of losing fear. Long live Greece! (es)

Today I’m going to eat a Greek tortilla. And what’s that? The same as the Spanish one, but with more huevos [eggs / balls]. (es)

Threats. Blackmail. Fear. Propaganda. The courageous Greek people defied it all. But now they desperately need our help. (en)

Tonight I feel truly European. As if Greece had voted for me against the technocrats and austerity. (fr)

A small, proud nation can change Europe. We should help them (it)

What if we take #oxi as an opportunity to rigorously curtail the world of banks, speculators and finance across the EU? (de)

Method

I searched the Twitter api for tweets using the search terms #oxi and #nai. I analysed tweets containing either #oxi or #nai (not both). Some have argued that ochi would be more appropriate than oxi; in French sometimes oki is used and of course the Greeks have their own alphabet. That said, #oxi appears to be a pretty universal symbol for a no vote in the Greek referendum and for opposition to austerity.

The number of #nai tweets was very small (less than two thousand). Locations of tweets were derived from the location data provided by the Twitter api. As indicated, only a small number of tweets contain this information; further, there may be cultural differences in the extend to which people allow their device to send location data with their tweets. Twitter also provides language data which appears to be pretty accurate (although they occasionally mistake Catalan for French). Note that language data cannot be simply linked to countries: for example, quite a few tweets in Dutch will be from Belgium while on the other hand, Dutch twitterers frequently tweet in English.

I used Python to collect and process the data, R for analysis and d3.js and Leaflet for visualisation.

GroenLinks, «lievelingetje van journalisten»?

Media hebben veel aandacht besteed aan het vertrek van Bram van Ojik als leider van GroenLinks en aan zijn opvolger, Jesse Klaver. Bij Telegraaf-columnist Paul Jansen viel dit verkeerd (paywall):

Het onderstreept wat iedereen aan het Binnenhof allang weet: GroenLinks is een lievelingetje van journalisten.

Klopt dat? Je kan die vraag op verschillende manieren beantwoorden. Ik heb geteld hoe vaak Tweede Kamerleden worden geciteerd in artikelen op de website van de NRC. De grafiek laat de resultaten zien.

De rode stippen tonen het gemiddeld aantal vermeldingen per fractie. Het lijkt erop dat de NRC relatief veel aandacht besteedt aan partijen die een sleutelrol vervullen bij het creëren van meerderheden voor regeringsbeleid. Daarnaast is er veel aandacht voor Geert Wilders (PVV) en Henk Krol (50PLUS). GroenLinks is bij NRC-journalisten niet echt favoriet; de krant noemt vaker Kamerleden van 50PLUS, PVV en D66.

De grijze stippen laten de score zien van individuele Kamerleden. Bij de PvdA en de VVD is de ongelijkheid tussen backbenchers en mediapolitici het grootst: daar is de hoogste score 50 keer zo hoog als de mediaan. Ook bij PVV en D66 is de ongelijkheid vrij groot.

Dan nog iets anders: De NRC noemt mannelijke Kamerleden gemiddeld bijna drie keer zo vaak als hun vrouwelijke collega’s. Bij de mannelijke Kamerleden zijn er enkele met extreem hoge scores die het gemiddelde omhoogtrekken, maar zelfs als je naar de mediaan kijkt worden mannen bijna twee keer zo vaak genoemd als vrouwen. Hier heeft de NRC iets uit te leggen.

Methode

Ik heb me op de NRC gericht omdat hun website relatief makkelijk doorzoekbaar is. Zoektermen heb ik opgebouwd als "voornaam tussenvoegsel achternaam" partij. Bij dubbele achternamen gescheiden door een koppelteken heb ik het laatste deel weggelaten (bijvoorbeeld Magda Berndsen in plaats van Magda Berndsen-Jansen). Als begindatum heb ik 20 september 2012 genomen, de datum waarop de huidige Tweede Kamer werd geïnstalleerd. Bij Kamerleden die korter in de Kamer zitten heb ik een correctie toegepast. Voor de overzichtelijkheid heb ik afsplitsingen weggelaten bij de analyse per partij. De scripts zijn hier beschikbaar.

Strava tweets II: after dinner rides and Sunday morning rides

The other day I posted an article about using Strava tweets to analyse road cycling patterns. I plan to do some more analysis on this but first I wanted to take another look at the time at which tweets are posted. Below is a chart that shows the number of Strava tweets per hour of the day.

Two things stand out: on weekdays, there’s an after-dinner peak, and on Sundays, many trips are finished before lunch. The pattern suggests that people tend to tweet pretty quickly after they finish their ride. This in turn seems to suggest that post times may well be a meaningful indicator of the time at which rides take place.

Gender

I used a variant of this script to determine the gender of people who tweeted their Strava rides, based on the first name of their Twitter screen name. According to the results, 9.7% are women. This is more than the 5.5% women in the SWOV survey among Dutch road cyclists, but then again people who use Strava (and tweet about it) are probably more likely to be young and young road cyclists more likely to be women.

For women the median distance of rides is 48km; for men 54km. The difference doesn’t appear very large.

In the chart above, you can select to see data for women instead of all riders (note that the scale changes). The main difference seems to be that for women, there’s much less of an after-dinner peak on weekdays. Perhaps something to do with the fact that women are less likely to have full-time jobs. But the numbers are relatively small so perhaps one shouldn’t read too much into it.

Pages