Moties

Het probleem

Politieke partijen roepen een heleboel, en hun partijprogramma’s zijn keurig verzorgde brochures. Maar voegen ze de daad wel bij het woord wanneer er in de Kamer over moties, amendementen en andere zaken gestemd wordt? MediaGraphs heeft een website gebouwd om via crowdsourced labelen van moties e.d. daar duidelijkheid over te verschaffen. De site is beschikbaar via moties.mediagraphs.com.

Partij voor de Dieren is voor rituele slacht

Een voorbeeld van opvallend stemgedrag in 2018 was de Partij van de Dieren die tegen een verbod op rituele slacht stemde. Was dit een eenmalige uitzondering om onduidelijke redenen, of is de partij lang niet zo begaan met het lot van dieren als zij graag doet voorkomen?

De Partij voor de Dieren stemt tegen een verbod op rituele slacht.

Op basis van één stemvoorbeeld is het niet mogelijk om een goed beeld bij te vormen over het bredere stemgedrag. Wat nodig is, is een overzicht van alle moties over dierenwelzijn, en het bijhorende stemgedrag van deze partij.

Data

De overheid publiceert dagelijks nieuwe stemmingsuitslagen op www.tweedekamer.nl. Dat biedt ons de mogelijkheid om meer inzicht te verschaffen in kwesties als deze. Het enige dat ontbreekt, is metadata die ons vertelt waar een motie over gaat, en naar welke kant van deze ondewerpen een motie het beleid beoogt bij te sturen.

Voorbeeld. De eerder genoemde motie gaat over het onderwerp rituele slacht en is tegen. Dat de Partij van de Dieren tegen die motie stemt, kan gezien worden als een stem voor rituele slacht. Rijst natuurlijk de vraag waarom de partij tegen stemde deze keer, maar wanneer de partij daadwerkelijk tegen rituele slacht zou zijn, mag men verwachten dat ze vaker voor moties van die strekking zou stemmen dan tegen.

Open source labeling

Het handmatig labelen van duizenden moties e.d. is een monnikenwerk. Bovendien, wanneer bedrijven of instituten daar tijd in steken, dan plegen zij hun werk geheim te houden, en alleen de resultaten te publiceren. Dit is niet gunstig voor de transparantie, en doet vragen rijzen als “Heeft deze krant wel alle moties bekeken, of een beetje selectief gewinkeld in het aanbod?”

Een alternatief is om mensen te vragen een klein beetje werk te doen – het handmatig labelen van een handjevol stukken – en alle resultaten op een hoop te gooien, en voor iedereen beschikbaar te maken. Zo kan iedereen voor zichzelf bepalen of de moties goed gelabeld zijn, en nagaan of er geen onwelvallige resultaten weggemoffeld zijn. Herleidbaarheid van de resultaten is essentieel.

Aan de slag

Ga naar moties.mediagraphs.com, kies een team naam, en klik “Naar de moties!”

U krijgt nu de tekst van een willekeurige motie voorgeschoteld. Nadat u deze door heeft gelezen, kunt u bij “Onderwerpen” beginnen met het invoeren waar deze motie zoal over gaat.

De vergezellende motie spreekt zich uit voor ouderenzorg en hogere belastingdruk, en tegen hogere kosten van ons pensioenstelsel.

In beginsel worden alle onderwerpen die u aangeeft onder “Voor:” geplaats. Door op de onderwerpen te klikken kunt u ze naar “Tegen:” verplaatsen. Er is geen grens aan hoeveel onderwerpen u kunt kiezen, of de verdeling voor en tegen. Het is alleen niet mogelijk om een onderwerp zowel voor als tegen aan te merken.

Het is aan te bevelen onderwerpen te kiezen die in andere moties ook genoemd worden, omdat moties uiteindelijk gegroepeerd gaan worden naar de onderwerpen waar ze over gaan. Onder het invoerveld voor onderwerpen bevinden zich eventueel een aantal onderwerpen die anderen voor deze motie al gebruik hebben. Tevens, zodra u nieuwe onderwerpen in begint in te typen in het invoerveld, verschijnen vergelijkbare onderwerpen waar u uit kunt kiezen.

Wanneer u klaar bent, klikt up op “Klaar!” en worden de gegevens opgeslagen. Deze zijn nu definitief en niet meer te wijzigen of te verwijderen. Een nieuwe motie wordt direct ingeladen en u kunt verder met de volgende. Het is niet erg wanneer u bijvoorbeeld geen zin heeft om een bepaalde motie volledig uit te pluizen, of onvolledig bent bij het labellen. Alle beetjes informatie helpen.

Uitslagen

Op elk moment kunt u bij ‘Uitslagen’ de laatste stand van het stemgedrag van alle fracties bekijken. De manier waarop deze tot stand komen is als volgt. Wanneer een motie vaker gelabeled wordt voor een bepaald onderwerp te zijn dan tegen, dan wordt de motie als voor dat onderwerp beschouwd. Een fractie die tegen de motie heeft gestemd, heeft dan ook tegen het onderwerp gestemd, en vice versa.

Per fractie laten we alle genoemde onderwerpen in alle moties waar deze partij haar stem in heeft laten horen zien. Vervolgens groeperen we per onderwerp alle moties waar deze fractie op gestemd heeft, en bepalen of er voor of tegen het onderwerp is gestemd.

Voorst kunt u de labeling van de moties die tot deze stemverdeling heeft geleid inzien door op de tekst onder de groene en rode balken te klikken. En wanneer u slechts geinteresseerd bent in de labels die u zelf heeft ingevoerd, kunt u bij “Team” de uitslagen daarop aanpassen.

In dit voorbeeld gaan alle labels van het team mediagraphs over vuurwerk. In totaal heeft de VVD gestemd op 7 moties van de gelabelde moties. Hieruit is niet direct op te maken hoeveel moties zich uitspreken voor of tegen vuurwerk, alleen dat de VVD door haar stemgedrag zich 6 maal tegen vuurwerk heeft uitgesproken, en 1 maal voor. Via de blauwe links kunnen de betreffende moties en hoe zij gelabeld zijn worden bekeken.
Voor D66 zien het beeld er, op basis van dezelfde data, heel anders uit. Bij 9 moties in plaats van 7 zoals bij de VVD heeft zij haar stem uitgebracht, en zich daarbij in totaal 4 maal voor en 5 maal tegen vuurwerk uitgesproken.

Data and the Stack

What we do behind the scenes is not magic. It’s pure, down-to-earth data processing and visualization. The data we use is all public, the processing tools are common, and the visualizations are there just to represent the data in an insightful manner. The user chooses which data they want to explore, and we make sure it’s available and accessible.

We started with Twitter data, due to various beneficial aspects the platform provides for our purposes:

  • Wide adoption among politicians, government bodies, journalists, columnists, and media, precisely the demographics we are most interested in.
  • Textual focus, for in-depth searching and analysis
  • Powerful API to collect this data in a flexible and scalable manner
  • Volume, quality, and richness of the data, exposing the deeper patterns that exist within political and apolitical discourse.

From the backend, collection starts with the notion of a Feed, a data structure that keeps track of what data we are collecting, and what we’ve collected so far, so we can query the Twitter API to just give us data we do not have yet. Examples of Feeds are, colloquially, ‘Tweets by @realDonaldTrump’ or ‘Tweets that mention @NASA’ or ‘Tweets that contain #metoo’.

Feeds are periodically updated by a Python application that uses the Django ORM on MySQL, according to the volume at which they produce new items, to guarantee a certain level of data freshness. When a Feed produces new Tweets, they are are queued onto RabbitMQ, and then ingested into an Elasticsearch cluster for both permanent storage and easy access, i.e. retrieval, aggregation, and search, through a REST API.

On the frontend we have a Bootstrap / D3 web application built on ReactJS that allows the user to do two main things:

  • create Feeds
  • explore the data

Feeds we already covered. Central to exploring the data is the notion of a Query. Queries define subsets of the data to be considered for further processing, usually by some means of analysis and/or visualization. This can be a simple representation of individual data items, i.e. Tweets, something more complex like showing Tweet volume over time or a top 10 of common authors, or more comprehensive patterns like significant terms, sentiment, and topics.

In the middle, gluing frontend and backend together, we have a Django API that provides a REST API though which the frontend accesses the data stored in the Elasticsearch cluster. This is a high-level API that translates user requests, like “give me the most common authors in this week’s replies to Tweets to Trump”, into low-level API calls submitted to the Elasticsearch REST API. The Django API collects the data from Elasticsearch, and processes into a data structure that the frontend can use without much effort.

Vision

Trust in the media is in decline. News used to be handled by journalists. Trench coat, pencil and notepad, always close to a payphone to relay the latest news back to the editorial room just in time for tomorrow’s headlines. We relied on them for truth, relevance and objectivity. Then the internet got big and everything changed. We now enjoy, at our fingertips, many sources of many truths, endless feeds of little relevance, and with the fading boundary between information and opinion, more than ever we have to ask ourselves “Who is the source of this information, really?”, “Do they have an agenda?”, “What is the relevant context?”, and “Is this even true at all?”

Prevailing sentiment is for organisations to answer these questions for us, by filtering ‘fake news’, naming sources, presenting opposing views, et cetera. Yet ultimately these approaches do not satisfy, as they rely, again, on trust in the media, to carry out these tasks judiciously.

MediaGraphs strives to address this situation by creating an ecosystem in which we can explore and visualize online and offline media, and answer these questions for ourselves, side-stepping the trust issue altogether.

First Dig

Twitter is a gold mine for insights into political discourse. One would like to dig into that from time to time.

On 27 June 2019, there was a Democratic Primaries debate. Let’s see the activity on Trumps Twitter account, to see if he noticed.

@realDonaldTrump Twitter activity

Looks like he did! And what did he have to say?

Most-liked Tweets bij @realDonaldTrump

Hmm… he seems not all that impressed. And made a lot of people upset to boot, judging from the number of replies he got. Or did they mostly agree with his statement? Only the data can tell us. Certainly, much like his own Twitter activity, there was a similar rise in responses to Trump’s Tweets.

Volume of replies to Trump’s Tweets

We’ll zoom in to Trump’s “BORING!” Tweet, and here we see something interesting, though not unexpected. As soon as Trump Tweets, Twitter explodes, only to collapse almost just as sudden.

Volume of replies to Trump’s “BORING!” Tweet.

How short-lived in this attention span? Trump posted at 03:35h local Amsterdam time. And it looks like others have about 10 minutes to stand a chance of getting their reply noticed, although having a decent follower count yourself probably does help.

Most-liked replies to Trump’s “BORING!” Tweet

Digging one step deeper, we may wonder who are the most prolific respondents to Trump’s “BORING!” Tweet, and by what significant terms those responses are characterized.

Most prolific respondents to Trump’s “BORING!” Tweet (top), and significant terms used in replies to the same Tweet.

Certainly, @jls1125 and @martyandchris seemed to be having fierce debate, but whether that was between each other or in unrelated threads, who knows?

This is where we’ll leave things for now. The charts in the blog were created in MediaGraphs Explore, which you can also use! Create your account here and follow the instructions on the Wiki page to start exploring on your own.