champagne anarchist | armchair activist

Data

Left-wing collaboration in Amsterdam

This weekend, PvdA (social-democrats), SP (socialists) and GroenLinks (green party) have announced a left-wing pact. The parties criticize the ‘worthless’ coalition agreement of the new right-wing national government and opt for a city that is sustainable and characterised by solidarity. At the same time, the pact is an indication that the signatories want to form a coalition after the local election in March 2018.

Such a far-reaching form of collaboration is quite remarkable by Amsterdam standards. Have there been signs that such an alliance was in the making? An interesting indicator is collaboration on motions and amendments. Jointly presenting a motion not only requires that you agree on substance, but also that you get along well.

The chart below shows the percentage of motions and amendments that were presented by PvdA, SP and GroenLinks, since the previous election (in order to iron out seasonal effects, the chart shows the 12-month moving average).

The numbers aren’t very large, so we shouldn’t draw too firm conclusions from this. That said, it appears that PvdA, SP and GroenLinks have increased their collaboration. This started around May, not very long after the national election in March.

Have there been similar overtures among right-wing parties? The chart below shows joint initiatives of right-wing VVD and christian-democrat CDA.

It appears that VVD and CDA have also increased their collaboration since the national election. The majority of their joint initiatives are from Werner Toonk (VVD) and Diederik Boomsma (CDA), often dealing with education. If the collaboration depends on the people involved, this doesn’t bode well for the future: Toonk has ended his membership of the city council.

D66 (green and pro-market) is in a bit of a quandary. Nationally, they’re part of the coalition with VVD; CDA and ChristenUnie, and locally they have commited to defend the national coalition agreement. On the other hand, in the Amsterdam council, D66 appears to have somewhat intensified its collaboration with GroenLinks and PvdA.

All in all, it appears that the national election has been a catalyst for changes at the Amsterdam level. Left-wing parties have increased their collaboration, which has now resulted in a quite remarkable pact. Right-wing parties also seem to explore closer collaboration, but it’s too early to say how sustainable this will be.

Examples of left-wing collaboration

The council members most actively involved in PvdA-SP-GroenLinks motions are Jorrit Nuijens (GroenLinks), Dennis Boutkan (PvdA) en Tiers Bakker (SP).

Recent motions dealt with topics including a municipal tax on «hot money» (Bakker, Roosma, Boutkan), transparency regarding the remuneration of board members of organisations that receive subsidies (Boutkan, Groot Wassink, Peters) and a cap on insecure jobs at the municipality (Boutkan, Ernsting, Peters).

Motions and amendments filed until 27 September have been published.

Het linkse pact in Amsterdam kwam niet helemaal uit de lucht vallen

Dit weekend hebben PvdA, SP en GroenLinks met een open brief in het Parool een links pact aangekondigd. De partijen zetten zich af tegen het ‘waardeloze’ regeerakkoord van het ‘christelijk-rechtse’ kabinet en kiezen voor een ‘een sociaal, duurzaam en solidair Amsterdam’. Het pact is tegelijk een aanwijzing dat de partijen na de verkiezing in maart 2018 samen een coalitie willen gaan vormen.

Zo’n verregaande vorm van samenwerking is voor Amsterdam best opmerkelijk. Zat dit er al aan te komen? Een aardige indicator is de samenwerking bij het indienen van moties en amendementen. Dit soort samenwerking vereist niet alleen dat je het inhoudelijk met elkaar eens bent, maar ook dat je samen door een deur kan en elkaar af en toe wat gunt.

De onderstaande grafiek laat zien hoeveel procent van de moties en amendementen zijn ingediend door PvdA, SP en GroenLinks, sinds de vorige verkiezing (om seizoenseffecten te corrigeren toont de grafiek telkens het gemiddelde over de voorgaande 12 maanden).

De aantallen zijn niet verschrikkelijk groot, dus we moeten hier geen al te ferme conclusies aan verbinden. Maar het lijkt erop dat PvdA, SP en GroenLinks vaker zijn gaan samenwerken. Dit begon ongeveer vanaf mei, niet zo lang na de Tweede Kamerverkiezing half maart.

Is er aan de rechterkant ook toenadering? De onderstaande grafiek toont gezamenlijke initiatieven van VVD en CDA.

Ook VVD en CDA lijken elkaar vaker op te zoeken sinds de landelijke verkiezing. Het gaat voor het overgrote deel om moties van Werner Toonk (VVD) en Diederik Boomsma (CDA), vaak over onderwerpen die te maken hebben met onderwijs. Als de samenwerking van personen afhangt, dan belooft dat weinig voor de toekomst: Toonk heeft inmiddels een punt gezet achter zijn raadslidmaatschap.

D66 zit een beetje in een spagaat. Aan de ene kant heeft de lokale D66-fractie zich voorgenomen het landelijke regeerakkoord van VVD, D66, CDA en ChristenUnie te steunen; aan de andere kant lijkt de partij in Amsterdam iets vaker de samenwerking met GroenLinks en PvdA te zoeken.

Al met al lijkt het erop dat de landelijke verkiezingsuitslag een katalysator is geweest voor de Amsterdamse politieke verhoudingen. Linkse partijen zijn meer gaan samenwerken, wat nu is uitgemond in een opmerkelijk samenwerkingspact. Rechts is er ook toenadering, maar het is te vroeg om te zeggen of die standhoudt (zeker als ze concurrentie krijgen van nieuwe partijen).

Voorbeelden van linkse samenwerking

De raadsleden die sinds mei het vaakst betrokken zijn geweest bij moties van PvdA, SP en GroenLinks zijn Jorrit Nuijens (GroenLinks), Dennis Boutkan (PvdA) en Tiers Bakker (SP).

Recente moties gingen over onderzoek naar het gemeentelijk belasten van flitskapitaal (Bakker, Roosma, Boutkan), transparantie over de beloning van bestuurders bij gesubsidieerde instellingen (Boutkan, Groot Wassink, Peters) en het inperken van flexibele contracten bij de gemeente (Boutkan, Ernsting, Peters).

Moties tot en met 27 september zijn gepubliceerd.

De 1.368 tabellen van Onderzoek en Statistiek

Op de website van de afdeling Onderzoek, Informatie en Statistiek van de gemeente Amsterdam zijn veel gegevens te vinden, maar die zijn niet altijd even makkelijk te vinden. Dat probleem los je ook niet op door te googelen naar filetype:xlsx site:ois.amsterdam.nl, want dat levert maar een fractie op van de beschikbare tabellen.

Daarom hier een overzichtje met alle (?) 1.368 tabellen op de website van OIS. Kan van pas komen als je cijfers zoekt over de fitnessexplosie van de afgelopen jaren, over de groei van het aantal uitgeleende buitenlandse jeugdboeken door bibliotheken, of over de afdelingen van de gemeente die het meeste uitgeven aan uitzendkrachten.

Stadsdelen te groot voor indeling CBS

Sinds vorig jaar zijn er in de Kerncijfers Wijken en Buurten van het CBS geen cijfers meer te vinden over de Amsterdamse stadsdelen. De wijziging heeft niets te maken met de afbrokkelende macht van de stadsdelen. De reden is dat de grootte van de wijken en buurten in Amsterdam teveel afweek van de rest van Nederland, aldus CBS Infoservice.

In de oude indeling vielen de wijken van het CBS samen met de Amsterdamse stadsdelen. Een gemiddeld stadsdeel had echter ruim 100 duizend inwoners, terwijl wijken in de rest van Nederland gemiddeld ruim 5 duizend inwoners hadden.

Vanaf 2016 worden daarom de oorspronkelijke Amsterdamse buurten als wijk aangeduid. De term buurt wordt voortaan gebruikt voor een gedetailleerdere indeling. In 2015 had Amsterdam 8 wijken (de stadsdelen plus Westpoort) en 97 buurten; in 2016 waren dat 99 wijken en 479 buurten.

Als je ontwikkelingen in de tijd wil analyseren, dan is het handig om de buurtcodes uit 2015 te kunnen vertalen naar wijkcodes uit 2016. Het CBS heeft zelf geen conversietabellen beschikbaar. Het lijkt erop dat je de codes vrij makkelijk kan omzetten, bijvoorbeeld met de Pythoncode:

def convert_code(x):
    x = 'WK' + x[2:]
    x = x[:6] + x[-2:]
    return x

Let op: er zijn ook kleine grenswijzigingen en wellicht ook naamswijzigingen doorgevoerd, zo laat het CBS weten.

Tussen 2010 en 2011 is de indeling voor Amsterdam ook al aangepast, maar toen ging het vooral om wijzigingen in de schrijfwijze van de buurtnamen, bijvoorbeeld Bijlmer-Centrum D, F en H versus Bijlmer-Centrum (D, F, H). Bovendien zijn de codes vaak ook veranderd. Je kan dit lijstje gebruiken om de buurtnamen uit 2010 te vertalen naar de buurtnamen uit 2011 (achtergrond). Let op: geen garantie dat het altijd klopt!

Informatie over de gebiedsindeling in Amsterdam is hier te vinden. In dat overzicht is de CBS-aanpassing uit 2016 nog niet verwerkt.

How to do fuzzy matching in Python

Statistics Netherlands (CBS) has an interesting dataset containing data at the city, district and neighbourhood levels. However, some names of neighbourhoods have changed, specifically between 2010 and 2011 for Amsterdam. For example, Bijlmer-Centrum D, F en H was renamed Bijlmer-Centrum (D, F, H).

In some of those cases the neighbourhood codes have changed as well, and CBS doesn’t have conversion tables. So this is one of those cases where you need fuzzy string matching.

There’s a good Python library for that job: Fuzzywuzzy. It was developed by SeatGeek, a company that scrapes event data from a variety of websites and needed a way to figure out which titles refer to the same event, even if the names have typos and other inconsistencies.

Fuzzywuzzy will compare two strings and compute a score between 0 and 100 reflecting how similar they are. It can use different methods to calculate that score (e.g. fuzz.ratio(string_1, string_2) or fuzz.partial_ratio(string_1, string_2). Some of those methods are described in this article, which is worth a read.

Alternatively, you can take a string and have Fuzzywuzzy pick the best match(es) from a list of options (e.g., process.extract(string, list_of_strings, limit=3) or process.extractOne(string, list_of_strings)). Here, too, you could specify the method to calculate the score, but you may want to first try the default option (WRatio), which will figure out which method to use. The default option seems to work pretty well.

Here’s the code I used to match the 2010 CBS Amsterdam neighbourhood names to those for 2011:

import pandas as pd
from fuzzywuzzy import process
 
# Prepare data
 
colnames = ['name', 'level', 'code']
 
data_2010 = pd.read_excel('../data/Kerncijfers_wijken_e_131017211256.xlsx', skiprows=4)
data_2010.columns = colnames
data_2010 = data_2010[data_2010.level == 'Buurt']
names_2010 = data_2010['name']
 
data_2011 = pd.read_excel('../data/Kerncijfers_wijken_e_131017211359.xlsx', skiprows=4)
data_2011.columns = colnames
data_2011 = data_2011[data_2011.level == 'Buurt']
names_2011 = data_2011['name']
 
# Actual matching
 
recode = {}
for name in names_10:
    best_match = process.extractOne(name, names_11)
    if best_match[1] < 100:
        print(name, best_match)
    recode[name] = best_match[0]
 

It prints all matches with a score below 100 so you can inspect them in case there are any incorrect matches (with larger datasets this may not be feasible). With the process option I didn’t get any incorrect matches, but with fuzz.partial_ratio, IJplein en Vogelbuurt was matched with Vondelbuurt instead of Ijplein/Vogelbuurt.

PS In case you’re actually going to work with the local CBS data, you should know that Amsterdam’s neighbourhoods (buurten) were reclassified as districts (wijken) in 2016, when a more detailed set of neighbourhoods was introduced. You can translate 2015 neighbourhood codes to 2016 district codes:

def convert_code(x):
    x = 'WK' + x[2:]
    x = x[:6] + x[-2:]
    return x

Pages