• No results found

Who wins it? Predicting Elections based on CBS-data.

N/A
N/A
Protected

Academic year: 2021

Share "Who wins it? Predicting Elections based on CBS-data."

Copied!
40
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

Wie wordt de grootste? Verkiezingsvoorspellingen op basis van CBS-cijfers Andreas Vos Juli 2018 Begeleider: Dick Heinhuis 2e lezer: Loek Stolwijk

(2)

2 Table of Contents Abstract 3 1 Inleiding 3 2 Theoretisch kader 5 2.1 Politicologische en sociologische variabelen 5 2.2 Variabelen uit andere onderzoeken 6 2.3 Statistiek en algoritmes 7 2.3.1 Regressie 7 2.3.2 Classificatie 8 3 Methode 8 3.1 Dataverzameling: 9 3.2 Dataverwerking 10 3.3 Voorspellen 11 3.4 Beoordelen 11 4 Resultaten 12 4.1 Voorspellingen gebaseerd op 2010 12 4.1.1 Bevolkingsvariabelen 12 4.1.2 Onderwijsvariabelen 12 4.1.3 Inkomensvariabelen 13 4.1.4 Sociale Zekerheidsvariabelen 13 4.2 Voorspellingen gebaseerd op 2012 13 5. Conclusie 14 6 Discussie 15 6.1 Mogelijke verklaringen voor resultaten 15 6.2 Algoritmen en data 17 6.3 Variabelen 18 6.4 Verder onderzoek 18 7 Referenties 19 8. Appendix 24 8.1 SVC 24 8.2 Andere variabelen en PCA 29

(3)

3 Abstract

Vanwege het falen van traditionele peilingen rondom recente verkiezingen als het Brexit-referendum en de Amerikaanse verkiezingen is er een roep om verklaringen voor verkiezingsuitslagen. In dit onderzoek wordt gebruik gemaakt CBS-data over de bevolking en de economie om door middel van Machine Learning algoritmes de verkiezingen te voorspellen. De voorspellingen gaan over de grootste partij per gemeente in Nederland omdat er grote verschillen zijn tussen stad en platteland. Het LinearSVC-algoritme blijkt uiteindelijk het beste te presteren, gecombineerd met de data over de bevolking. De dataset over de verkiezingen van 2010 presteerde daarnaast beter dan die van 2012. Bevolkingsvariabelen en de omgeving waar iemand woont zijn goede variabelen toekomstige verkiezingsuitslagen te voorspellen. 1 Inleiding Bedrijven die kiezersonderzoek uitvoeren waren verbaasd dat hun peilingsmethodes het Brexit-referendum en de Amerikaanse presidentsverkiezingen niet goed hadden voorspeld. De traditionele methoden daarvoor werkten blijkbaar niet goed genoeg. In de nasleep van de verkiezingen werd gezocht naar andere variabelen zoals inkomen, onderwijsniveau en woonplaats om te verklaren welke keuze burgers maakten in de stemhokjes. Maar hoe werken de verkiezingen en waarom stemmen mensen op een bepaalde partij door de jaren heen? De democratie in Nederland, en daarom de verkiezingen zijn anders geconstrueerd dan in de Angelsaksische wereld. Er is sprake van evenredige vertegenwoordiging (Farrell, 2011) en geen sprake van kiesdistricten: Er is maar één district en alle partijen die de kiesdrempel van 0.67 procent halen komen in de Tweede Kamer die uit 150 zetels bestaat (Vossen, 2017). Dit systeem zou kunnen leiden tot grote verdeeldheid in volksvertegenwoordiging en gezien de laatste verkiezingsuitslagen is dat ook zo. Toch was dat in de jaren ‘50 en ‘60 anders. Er was toen sprake van verzuiling die zorgde voor stabiliteit. Pas toen de verzuiling in de jaren ‘70 afbrokkelde, kwam er meer verdeeldheid tot het voorlopige hoogtepunt in 2017 waar traditionele partijen een voorlopig dieptepunt in het aantal zetels kregen. Dit is een proces dat al langer zichtbaar was (Andeweg & Irwin, 2014). In 1960 haalden de christendemocraten (confessionelen),

(4)

4

sociaaldemocraten en liberalen gezamenlijk gemakkelijk 70 procent van de stemmen. Nu halen die partijen maximaal 40 procent van de stemmen. De meesten daarvan gaan dan ook nog naar de liberalen.

Vroeger was de verklaring voor stemgedrag het behoren tot een bepaalde religie of sociale klasse: de zuilen; maar dat verband heeft volledig afgedaan (Irwin & van Holsteyn, 1989). De verwachting was dat na de ontzuiling mensen zouden gaan stemmen op economische gronden, toch blijkt dat culturele waarden ook een belangrijke rol spelen bij stemgedrag. (Aarts & Thomassen, 2008). Daarnaast is er een verandering naar meer populisme sinds Pim Fortuyn in 2002 en ook al eerder met de Centrumdemocraten van Hans Janmaat in de jaren 80. (Bélanger & Aarts, 2006), ook dat hoort bij de trend van meer verdeeldheid.

Ondanks dat culturele waarden een rol spelen is er wel sprake van het feit dat kiezers succesvol economisch beleid steunen. (Swank & Eisinga, 1999) en dat gezocht moet worden naar meerdere variabelen uit verschillende domeinen om stemgedrag te verklaren. Cultuur is daarbij ook moeilijk te kwantificeren. Toch zijn er ook andere verklaringen voor verkiezingsuitslagen. Al bij Leighley & Nagler (1992) worden veel belangrijke variabelen genoemd zoals onderwijsniveau, leeftijd, huwelijkse staat en beroep. Parry & Shields (2001) voegen daar ook geslacht nog aan toe. De Voogd (2013) voegt daar een geografisch aspect aan toe omdat er verschillen zijn in stemgedrag in de stad en het platteland. Ook wonen er in de stad meer hoger opgeleiden. Ook Vrielink (2002) schrijft over een groter wordende kloof tussen hoger en lager opgeleide burgers en het verband met hun woonplaats. Er zijn veel verklaringen voor stemgedrag en er is behoefte naar voorspellingen die een andere methode gebruiken dan de huidige peilingsmethoden omdat die faalden. Statistiek en algoritmes kunnen daarbij helpen. In de traditionele zin worden enquêtes, ‘polls’ geëxtrapoleerd op basis van een representatieve steekproef maar er moet gezocht worden naar een nieuwe methode die meer en breder inzicht geeft in waarom mensen op een partij stemmen en welke variabelen daarbij een rol spelen.

Het probleem is: Hoe kunnen verkiezingsuitslagen anders dan traditionele polling methoden voorspeld worden met die variabelen. Deze verklaringen en voorspellingen geven weer welke variabelen voor verschillende soorten kiezers belangrijk zijn en dat inzicht kan helpen bij een betere campagne voor politieke partijen in maatschappelijke zin. Misschien voeren partijen wel campagne onder burgers die nooit om hen zouden stemmen. Wetenschappelijk en daarom binnen de context van Informatiekunde is het relevant hoe data verwerkt kan worden en maatschappelijke thema’s verklaard kunnen worden met behulp van data en statistiek. Informatiekunde gaat over het verwerken van data en het inzicht geven in

(5)

5 patronen van die data en in tegenstelling tot de normale politicologische voorspellingen zullen moeilijkere algoritmes gebruikt worden zoals in vergelijkbare Data Science en informatiekundige onderzoeken. Dit onderzoek richt zich dus specifiek op de context van Informatiekunde.

Hoofdvraag: In hoeverre kunnen maatschappelijke variabelen verkiezingen voorspellen in Nederland? Deelvragen: 1. 1. Welke variabelen hebben invloed op verkiezingsuitslagen? 2. Wat zijn methoden om verkiezingen te voorspellen? 3a. Welke methode voorspelt het beste verkiezingen? 3b. Welke variabelen voorspellen het beste verkiezingen? 2 Theoretisch kader Het theoretisch kader bevat drie onderdelen. Ten eerste een politicologisch en sociologisch deel waar wordt gezocht naar variabelen die verkiezingsuitslagen verklaren. Ten tweede een onderdeel waar wordt gekeken naar vergelijkbare onderzoeken als dit onderzoek, en welke variabelen die onderzoeken gebruiken. Ten derde een onderdeel waarbij wordt gekeken naar methoden om verkiezingsuitslagen te voorspellen.

2.1 Politicologische en sociologische variabelen

In dit deel wordt er gezocht naar politicologische en sociologische variabelen om verkiezingsuitslagen te verklaren. De variabelen bestaan vooral uit menselijke kenmerken die leiden tot een bepaalde keuze.

(6)

6

Auteur Omschrijving van het

Onderzoek Gevonden variabelen

De Voogd(2013) Zoeken naar verbanden

tussen verkiezingsuitslagen en woonplaats en bevolking.

Woonplaats,

onderwijsniveau, afkomst, omgeving: stad of dorp Achterberg & Houtman(2006) Analyse van

partijprogramma’s of partijen links of rechts zijn en welke mensen op die partijen stemmen.

Economische en sociale omstandigheden

Markus(1988) Analyse van economische

omstandigheden en op welke president werd gestemd.

Economische omstandigheden

D’Hooghe(2016) Zoeken naar verbanden

tussen stemgedrag en zelfingeschatte sociale klasse in Europa.

Sociale Klasse

Leighley, J. E., & Nagler, J.

(1992) Individuele variabelen die en systeem invloed hebben op waarom mensen stemmen.

Onderwijsniveau, Inkomen, leeftijd, huwelijkse staat Easly & Kleinberg (2010, h4) Hoe werkt homofilie in sociale

netwerken. Gelijke mensen wonen bij elkaar. 2.2 Variabelen uit andere onderzoeken Dit deel gaat over het zoeken naar variabelen uit onderzoeken die ook maatschappelijke variabelen hebben gebruikt om verkiezingen te voorspellen. Welke variabelen hebben zij gebruikt?

Auteur Omschrijving van het

onderzoek Gevonden variabelen

Lewis-Beck (2005) Vergelijken van verschillende methoden om verkiezingen te voorspellen.

Publieke opinie, economische omstandigheden

Cuzan et al. (2005) The Pollyvote: Het combineren van verschillende methoden, er is niet een beste voorspeller.

Economische

omstandigheden, publieke opinie.

(7)

7

Gibson & Lewis-Beck (2011) Vergelijken van verschillende methoden, surveys, uitslagen van eerdere verkiezingen.

Uitslagen van eerdere verkiezingen: trends.

Dassonneville et al. (2017) Een Nederlands structureel model maken om de grootste partij te voorspellen.

Percentage van de vorige verkiezingen, economische groei, hoe lang zit de partij al in de regering.

Aichholzer & Willmann (2014) Analyseren hoe partijen ten opzichte van economische trends hebben gepresteerd.

Werkloosheid, economische trends.

Walther (2015) Onderzoek naar een

meerpartijen systeem voorspellen: dus niet 1 of 2 partijen of kandidaten.

Langere trends

Holbrook & DeSart(1999) en

Rallings & Thrasher (1999) Een model creëren in hoeverre lokale trends invloed hebben op landelijke uitslagen. Lokale trends 2.3 Statistiek en algoritmes Het derde onderdeel behandelt welke voorspellingsmethoden kunnen worden gebruikt om de grootste partij te voorspellen. Dit binnen een context van Informatiekunde en Data Science omdat het onderzoek binnen dat domein valt. Er wordt dan gebruik gemaakt van Machine Learning technieken en bijbehorende algoritmes. Er zijn grofweg twee manieren van voorspellen: enerzijds een lineair verband zoeken en dus regressie, anderzijds classificatie waarbij gezocht wordt naar het juist label (Kurt et al. 2008). Regressie en Classificatie vallen binnen supervised learning. Neural networks die ook genoemd worden vallen meer onder Artificial Intelligence en Deep Learning en dus buiten de context van Informatiekunde en Machine Learning. 2.3.1 Regressie De bekendste manier om te voorspellen is de regressieanalyse zoals die ook wordt gebruikt in het onderzoek van Dassonneville et al. (2017) waar verschillende variabelen worden gecombineerd om een percentage uit te rekenen. Een regressieanalyse is lineair met een cijfermatige output zoals een percentage of een fractie (Sedgwick, 2013). Ook Hurtado Bodell(2016) en Stoltenberg(2013) gebruiken deze methode om hun analyse uit te voeren. Beiden door gebruik te maken van een dynamic linear model. Hetzelfde is te zien bij

(8)

8 Walther(2015). Een lineair model is geschikt om percentages uit te rekenen en op basis van die percentages zetelaantallen en verhoudingen tussen verschillende partijen. 2.3.2 Classificatie Er kan ook gebruik gemaakt worden van een classificatiealgoritme waar geen percentage wordt uitgerekend maar een label of een categorie wordt voorspeld (Patil,2013). Om verschillende partijen te voorspellen zijn er multivariable classification algoritmes nodig die meerdere variabelen kunnen voorspellen. De volgende algoritmes zijn mogelijke multivariable classification algoritmes.

Auteur Algoritme Beschrijving

Vapnik, 1995; Steinwart &

Christmann, 2008 SVM Trekt lijnen door een scatterplot heen. Er worden support vectors getrokken om de datapunten die dicht bij de lijnen liggen te classificeren.

Rokach et al, 2008 Decision Tree Beslisboom. Vertakt en

classificeert zo de data. Afhankelijk van de data en de instellingen hoeveel vertakkingen er zijn.

Ho, 1995 Random Forest Vergelijkbare techniek als

Decision Tree. Presteert vaak beter bij veel variabelen. Random Forest gebruikt meerdere Decision Trees. 3 Methode

Het doel van de onderzoeksvraag is om verkiezingen te voorspellen. Het is evident dat verschillende variabelen uit de literatuur een rol spelen en dat er niet een of twee variabelen zijn die alles voorspellen. Voor het verwerken van data door algoritmes is het logisch dat de variabelen kwantificeerbaar moeten zijn zodat er gerekend kan worden. De basis van het onderzoek zijn de ideeën van de Voogd (2013) en de variabelen zoals onderwijsniveau, afkomst en omgeving. Dit onderzoek richt zich daarom op gemeenten en niet op het gehele land. Volgens de Voogd zijn er namelijk verschillen tussen de landsdelen en tussen stad en platteland. Er wordt

(9)

9

dus gekozen om de uitslagen per gemeente te voorspellen en zo ook de eventuele verschillen zichtbaar te maken. Economische omstandigheden zijn goed te meten per gemeente maar publieke opinie niet. Hoe lang een partij in de regering zit is ook niet relevant per gemeente. Het werkloosheidscijfer hangt sterk samen met economische omstandigheden. Leeftijd en huwelijkse staat zijn ook variabelen die goed gemeten kunnen worden. Daarnaast worden trends meegenomen omdat cijfers over een langere periode worden gemeten, uit de onderzoeken bleek dat gebeurtenissen als een fors verlies van een partij, al langer zichtbaar waren in de data (Walther, 2015). Tenslotte wordt er gekozen om alleen de grootste partij te voorspellen, De Voogd gebruikt de grootste partij om de verschillen aan te geven tussen verschillende gebieden, het is immers de grootste gemene deler, ook Dassonneville et al. (2017) voorspellen alleen de grootste partij. Daarnaast zijn er de ideeën over homofilie zoals beschreven in Easly & Kleinberg (2010) en is er dus reden om aan te nemen dat mensen in een gebied voor het grootste gedeelte hetzelfde zijn en in andere gebieden echt anders en er zijn dus daadwerkelijk verschillen. Er wordt dus maar 1 partij per gemeente voorspeld.

De methodesectie zal eerst de dataverzameling en -verwerking behandelen en daarna het voorspellen van de grootste partij. Het doel van het onderzoek is namelijk om variabelen te gebruiken om uiteindelijk verkiezingen te voorspellen. Eerst wordt er data verzameld en op basis daarvan wordt er een voorspelling gemaakt die ook zal worden geëvalueerd.

3.1 Dataverzameling:

De variabelen uit de literatuur laten zich samenvatten in bevolkingsvariabelen en economisch-sociale variabelen. Bevolkingsvariabelen als leeftijd, huwelijkse staat, onderwijsniveau en omgeving. Economisch-sociale variabelen als werkloosheid en inkomen. Al deze variabelen zijn verkrijgbaar via het CBS (2018) per gemeente over tientallen jaren en zijn daar gedownload als CSV-bestand. Alle data is gedownload en er wordt pas in de code bij de berekeningen geselecteerd welke variabelen er worden gebruikt.

Daarnaast wordt voorspeld op basis van verkiezingsuitslagen uit het verleden. Uit de literatuur bleek dat verkiezingsuitslagen goed zijn te verklaren door trends te volgen (Walther, 2015). Het verleden zegt blijkbaar iets over het heden. De Kiesraad (2018) levert de verkiezingsuitslagen per Tweede Kamerverkiezing, per gemeente.

Het doel is om de verkiezingen van 2017 te voorspellen. Als data daarvoor worden twee voorgaande verkiezingen genomen omdat beiden uitmondden in kabinetten-Rutte. Er is sprake van samenhang en een trend. Het eerste jaar is daarom 2007, het begin van het laatste kabinet van Balkenende. Die ontwikkelingen leidden namelijk tot de verkiezingsuitslag van 2010.

(10)

10 3.2 Dataverwerking De data wordt gesplitst in 3 onderdelen: er worden drie Tweede Kamerverkiezingen vergeleken. De eerste verkiezingen zijn die van 2010 waarna het eerste kabinet Rutte werd geïnstalleerd en de VVD de verkiezingen won na 4 CDA-kabinetten. Er is sprake van verandering en dat maakt het interessant om daar te beginnen. Uiteindelijk wordt het tijdperk-Rutte tot nu toe bestudeerd. De data begint bij 2007 omdat toen het laatste vorige kabinet aantrad en die periode leidde tot de verkiezingsuitslag van 2010. In 2012 waren er al nieuwe verkiezingen en daarom gaat het tweede bestand over de periode 2010-2012. Het derde bestand gaat over 2013-2017, in 2017 waren er namelijk weer verkiezingen. De bestanden bestaan uit alle numerieke variabelen per gemeente die bij het CBS beschikbaar zijn. Er is niets aangepast aan de originele data, alleen de kolomnaam Regio’s is veranderd naar gemeente. Ook zijn de komma’s omgezet naar punten vanwege de internationale standaarden. De algoritmes konden anders de data niet lezen.

Over die drie verkiezingsperioden zijn er ook bestanden met verkiezingsuitslagen. De veronderstelling is dat CBS-cijfers X in zekere zin hebben geleid tot verkiezingsuitslag Y. Deze data van de Kiesraad waren iets moeilijker te verkrijgen. Over de verkiezingen van 2017 stond er een kant-en-klaar bestand online die direct te downloaden en klaar voor gebruik was. Voor 2012 had Ginfo (2018) een bestand gemaakt. Het bestand van 2010 was niet online te vinden en is zelf gemaakt door alle losse gemeentebestanden te downloaden en die samen te voegen zodat alle bestanden er hetzelfde uitzagen. De bestanden zien er als volgt uit: Gemeente – Partijen met het aantal stemmen. Voor dit onderzoek is er een kolom bijgemaakt met de naam van de partij met de meeste stemmen per gemeente. Dit is namelijk de waarde is die voorspeld moet worden. De partijnamen zijn iets aangepast zodat elke partij een woord is: VVD en geen Volkspartij voor Vrijheid en Democratie.

Voor de analyse zijn daarom de twee bestanden samengevoegd. De CBS-data samen met de verkiezingsuitslag van de grootste partij. Omdat gemeentenamen in beide bestanden voorkomen kunnen ze zo worden samengevoegd.

Om de algoritmes te trainen zijn alle gemeenten zonder waarden uit de data gehaald. Bij gemeenten waar maar sommige velden mistten zijn die velden gerecode en vervangen met -1000. Dit op basis van Datacamp(2018). Dit zorgt ervoor dat die waarden de voorspelling niet beïnvloedden.

Voor de analyse wordt de data ingeladen in een Jupyter notebook met de taal Python en dan in een pandas DataFrame. Voor de verschillende algoritmes wordt scikit-learn gebruikt, een standaard Python library met alle benodigde algoritmen (Pedregosa et al., 2011).

(11)

11

3.3 Voorspellen

In dit onderzoek zullen classificatiealgoritmes worden gebruikt om de grootste partij te voorspellen. Het voorspellen van de grootste partij in een gemeente is namelijk een classificatieprobleem omdat er een label wordt voorspeld. Het is geen regressieprobleem waar er een percentage wordt voorspeld. Deze multivariable-classification, omdat er meer dan twee partijen zijn, wordt uitgevoerd met drie verschillende algoritmes: DecisionTreeClassifier(), RandomForestClassifier() en LinearSVC(). Deze algoritmes volgden uit de literatuur en waren prominent in de scikit-learn documentatie. LinearSVC is de SVM-variant voor meer variabelen maar werkt hetzelfde als een normale SVM zoals eerder geïntroduceerd. De algoritmen leren op zowel de CBS-data uit 2010 als de data uit 2012. De voorspelling gebeurd op basis van de data van het verkiezingsjaar 2017. De twee perioden worden niet samengevoegd maar vergeleken. De verkiezingsuitslagen in 2010 en 2012 zijn namelijk anders en zijn niet op een goede manier samen te vatten. Er is veel data beschikbaar maar er wordt alleen gekeken naar de variabelen die voorkomen in de literatuur: De bevolkings- en sociaaleconomische variabelen. Er wordt gebruikt gemaakt van de CBS-categorieën Bevolking, Inkomen, Sociale zekerheid en Onderwijs voor het trainen van de algoritmes en het doen van voorspellingen. Die categorieën bevatten specifieke variabelen die terugkwamen in de literatuur zoals leeftijd en geslacht bij Bevolking. De categorieën worden samengevat en er wordt onderling vergeleken welke categorie zorgt voor de beste resultaten. 3.4 Beoordelen

Er is geen classificatiealgoritme dat altijd het beste presteert. Bij het evalueren van algoritmes worden measures gebruikt als Precision, Recall en F1-score (Powers, 2011). De accuracy, dus hoeveel procent goed is voorspeld is gelijk aan de Recall. Door deze measures te vergelijken kunnen algoritmes geëvalueerd worden en het beste algoritme gekozen voor een bepaalde taak.

Precision Hoe goed zijn de voorspelde resultaten?

Recall Hoeveel van de totale goede resultaten zijn

voorspeld?

F1-score Het harmonische gemiddelde tussen Precision

en Recall. Datgene wat de kwaliteit van het algoritme weergeeft.

(12)

12

Om de voorspellingen te beoordelen wordt er een classificatierapport gemaakt met een partij, de voorspelde waarde en de eigenlijke waarde: de verkiezingsuitslag in 2017. Het doel is een zo hoog mogelijke F1-score. Daarnaast zijn Precision en Recall ook belangrijk omdat de F1-score het harmonische gemiddelde is van die twee. Als er een groot verschil zit tussen enerzijds de Precision en anderzijds de Recall zegt de F1-score niet zoveel over het geheel en daarom moeten de drie measures altijd in ogenschouw worden genomen. Het classification report geeft een goed beeld over hoe goed elke algoritme presteert over alle data en specifiek per partij. 4 Resultaten

In dit onderdeel staan de resultaten van de gekozen onderzoeksmethode waarbij de CBS-categorieën Bevolking, Onderwijs, Inkomen en Sociale zekerheid worden vergeleken met drie verschillende algoritmen: DecisionTree, LinearSVC en RandomForest. Daarnaast worden op basis van twee verschillende datasets, die van 2010 en die van 2012 twee verschillende voorspellingen gemaakt en uiteindelijk vergeleken. 4.1 Voorspellingen gebaseerd op 2010 4.1.1 Bevolkingsvariabelen Dit is de voorspelling op basis van alle variabelen onder het kopje Bevolking van het CBS.

Algoritme Precision Recall F1

LinearSVC 0.72 0.76 0.72

DecisionTree 0.75 0.50 0.59

RandomForest 0.82 0.47 0.53

De Precision van de RandomForest is het hoogste maar de Recall is de laagste. De f1 score van LinearSVC het de hoogste en derhalve is dat het beste algoritme. In bijna driekwart van de gemeenten wist dat algoritme de goede partij te voorspellen. 4.1.2 Onderwijsvariabelen Dit is de voorspelling op basis van alle variabelen onder het kopje Onderwijs van het CBS.

(13)

13

Algoritme Precision Recall F1

LinearSVC 0.66 0.52 0.58 DecisionTree 0.68 0.30 0.41 RandomForest 0.72 0.28 0.36 Hetzelfde patroon is zichtbaar als bij de bevolkingsvariabelen. LinearSVC scoort het beste maar RandomForest heeft de hoogste Precision. Toch zijn de bevolkingsvariabelen een betere manier om te voorspellen. 4.1.3 Inkomensvariabelen Dit is de voorspelling op basis van alle variabelen onder het kopje Inkomen van het CBS.

Algoritme Precision Recall F1

LinearSVC 0.68 0.28 0.35

DecisionTree 0.65 0.38 0.44

RandomForest 0.67 0.67 0.67

Voor Inkomen scoort RandomForest goed en haalt bijna de hoge scores van LinearSVC bij Bevolking. De andere algoritmes hebben een veel lagere Recall en scoren daarom slechter.

4.1.4 Sociale Zekerheidsvariabelen

Dit is de voorspelling op basis van alle variabelen onder het kopje Sociale Zekerheid van het CBS.

Algoritme Precision Recall F1

LinearSVC 0.56 0.57 0.56 DecisionTree 0.59 0.52 0.55 RandomForest 0.63 0.52 0.55 Alle algoritmen scoren op sociale zekerheid bijna hetzelfde. De getallen zijn ook heel gemiddeld. 4.2 Voorspellingen gebaseerd op 2012 Dit is de voorspelling op basis van alle variabelen onder het kopje Bevolking van het CBS.

(14)

14

Algoritme Precision Recall F1

LinearSVC 0.65 0.59 0.61 DecisionTree 0.69 0.58 0.61 RandomForest 0.66 0.58 0.61 De voorspellingen van 2012 zijn slechter dan die van 2010. Maar alle algoritmen scoren allemaal ongeveer even goed en gemiddeld. Dit is de voorspelling op basis van alle variabelen onder het kopje Inkomen van het CBS.

Algoritme Precision Recall F1

LinearSVC 0.63 0.42 0.50 DecisionTree 0.60 0.66 0.62 RandomForest 0.61 0.67 0.62 De inkomensvariabelen scoorden uiteindelijk het beste met een score van 2/3 van het totaal. De Bevolkingsvariabelen scoorden iets slechter maar het verschil is verwaarloosbaar. Bij de andere variabelen waren vergelijkbare trends zichtbaar als in 2010 maar de uiteindelijke score was lager dan in 2010. 2012 is dus een slechtere voorspeller dan 2010. 5. Conclusie In dit onderzoek is gepoogd om op basis van variabelen in de samenleving zoals leeftijd, omgeving en onderwijsniveau te voorspellen wat de grootste partij zou worden per gemeente in Nederland. Dit om uit te zoeken in hoeverre die variabelen iets zeggen over de partij waar mensen op gaan stemmen en of die variabelen misschien wel bepalend zijn. Dit omdat traditionele polling methoden faalden tijdens verkiezingen. Uiteindelijk bleken de bevolkingsvariabelen de uitslag het beste te kunnen voorspellen en kreeg het LinearSVC-algoritme het ook voor elkaar om de groei van de VVD en het verlies van de PvdA goed te

(15)

15

voorspellen. Een score van 75 procent van het totaal is alleszins redelijk, zeker omdat de grootste foutmarges gevonden werden bij het CDA, een partij die ideologisch dicht bij de VVD staat en eenvoudig verwisseld kan worden. Een 100 procent score is dan ook onmogelijk omdat het fenomeen ‘swing states’ bestaat, waardoor bepaalde gebieden elke verkiezingsperiode veranderen van partijvoorkeur. Dit is ook te zien aan de grote verschillen in aantallen van partijen per verkiezingsperiode. De kleinere partijen werden helaas minder goed voorspeld maar het is interessant om te zien dat er blijkbaar typische CDA, SGP en PVV-gemeenten bestaan. Ook is het bijzonder dat veel PvdA gemeenten zijn vervangen door de VVD als grootste partij, er was deze verkiezingen niet echt een linkse partij die de grootste werd in gemeenten en de rol van de PvdA kon overnemen. Daarnaast scoorden de variabelen uit 2010 hoger dan uit 2012 wat in zekere zin verwacht werd omdat de PvdA en de VVD toen alle andere partijen hadden opgeslokt en bijvoorbeeld het CDA maar in een gemeente de grootste was. Bevolkingsvariabelen zijn het beste om verkiezingen te voorspellen, op de voet gevolgd door Inkomensvariabelen. Als algoritme kan er het beste gekozen worden voor LinearSVC met als een goede tweede RandomForest. LinearSVC scoort gewoonlijk beter bij de Recall-score waar RandomForest beter scoorde bij de Precision-score. Recall is feitelijk iets belangrijker dan Precision en die score gaf in dit onderzoek vaak de doorslag. Bevolkingsvariabelen zijn dus een goede methode om verkiezingen te voorspellen en geven veel inzicht in verkiezingsuitslagen.

6 Discussie

In dit deel zullen de beperkingen van het onderzoek naar voren komen en suggesties worden gedaan voor verder onderzoek. 6.1 Mogelijke verklaringen voor resultaten

De categorie bevolking en als tweede de categorie inkomen zijn de beste voorspellers voor verkiezingsuitslagen in de toekomst. Daarnaast scoort LinearSVC beter bij de bevolkingsvariabelen en RandomForest beter bij de Inkomensvariabelen. De maximaal haalbare score op basis van deze data ligt tussen de 67 tot 75 procent van het totaal waarbij de data van 2010 iets beter presteert dan de data van 2012.

Toch zijn er kanttekeningen te plaatsen bij de uitslagen wanneer er gedetailleerder wordt gekeken naar de uitslagen.

(16)

16 Aantal gemeenten met partij als grootste Partij 2010 2012 2017 CDA 63 1 49 CU 1 2 D66 3 GL 2 PVDA 68 66 0 PVV 31 1 21 SGP 11 8 13 SP 3 1 8 VVD 157 163 274 Score per partij

Partij Precision Recall F1

CDA 0.45 0.27 0.33 PVV 1.00 0.29 0.44 SGP 0.67 0.15 0.25 VVD 0.80 0.95 0.87 De VVD is sinds 2010 de grootste in de meeste gemeenten en het is daarom ook logisch dat die partij het beste wordt voorspeld. Het CDA is de tweede partij, PVV de derde en SGP de vierde partij. Toch is te zien dat de scores bij de kleinere partijen minder hoog zijn. De VVD, ondanks dat die partij in veel meer gemeenten de grootste is wordt toch goed voorspeld in heel veel andere gemeenten. Het hoge totaal hangt dan ook vooral af van de VVD. De PvdA, in 2010 nog de tweede partij wordt nergens meer goed voorspeld, maar ook vrijwel niet fout met deze data en het LinearSVC algoritme. De lagere scores bij de andere variabelen hebben te maken dat de PvdA nog vaak wel werd voorspeld ondanks dat de PvdA in 2017 nergens meer de grootste is. De PvdA was nog de grootste in 68 gemeenten in 2010. De PvdA wordt nog maar 3 keer goed voorspeld in gemeenten die nu VVD stemmen. Die trend is zichtbaar in 2017, 90 procent van de PvdA-gemeenten stemt nu VVD. De lage score van het CDA, terwijl die partij toch de tweede van het land is hangt samen met de grote overlap met de VVD. Waar CDA voorspeld had moeten worden werd vaak VVD voorspeld. De grootste foutmarge van de VVD is ook bij het CDA te vinden. Daarnaast is er nog 2012, de recentere verkiezingsuitslag maar scoorde wel lager dan die van 2010. De verklaring voor die lagere score is te zien in de tabel, PvdA en VVD slokten alle gemeenten op door de hevige verkiezingsstrijd die toen gevoerd is. De diversiteit van partijen is beter te zien bij de uitslagen van 2010. In die zin lijkt 2010 dus meer op 2017 dan op 2012 vanwege de specifieke situatie van die verkiezingen. Als de trend van meer diversiteit in

(17)

17 partijkeuze zich voortzet zal de data van de afgelopen verkiezingen wel geschikt zijn voor het voorspellen van de volgende verkiezingen. De bevolkingsvariabelen bleken de beste voorspeller voor de uitslagen maar die dataset bestaat uit veel verschillende losse variabelen zoals aantal inwoners, hoe stedelijk een gemeente is, de afkomst, de burgelijke staat en het geslacht. Allemaal variabelen die ook in de literatuur voorkomen. Met een PCA-analyse (Pearson, 1901) kan worden bestudeerd welke variabelen nu ten opzichte van elkaar invloedrijk zijn bij de data van 2017. Variabele PCA-score Bevolking/Bevolkingssamenstelling op 1 januari/Stedelijkheidsklasse/Zeer sterk stedelijk (aantal) 0.219241 Bevolking/Bevolkingssamenstelling op 1 januari/Stedelijkheidsklasse/Weinig stedelijk (aantal) 0.128517 Bevolking/Bevolkingssamenstelling op 1 januari/Migratieachtergrond/Migratieachtergrond/Nederlandse achtergrond (aantal) 0.096821 Bevolking/Bevolkingsontwikkeling/Bevolkingsgroei/Inwoners op 31 december (aantal) 0.048557 Bevolking/Bevolkingsontwikkeling/Bevolkingsgroei/Gemiddeld aantal inwoners (aantal) 0.046920

Wat opvalt is dat vooral de stedelijkheidsklasse belangrijk is, daarnaast het hebben van een Nederlandse achtergrond en het bevolkingsaantal. Het wonen in dan wel een stad of een dorp blijkt vooral relevant voor de keuze waar de burger op stemt. 6.2 Algoritmen en data De scores die werden weergegeven in de resultatentabellen laten niet de hele werkelijkheid zien. Door de werking van de algoritmen en de opbouw van de data verschillen de scores regelmatig bij het herhaaldelijk uitvoeren van het algoritme. Soms waren de scores maar de helft van wat er vermeld is in de tabellen. Er is gekozen om de hoogste gemeten score weer te geven naar een aantal keren herhalen. Daarnaast maakte het verwijderen van lege waarden een groot verschil

(18)

18 bij de uiteindelijke scores. De VVD scoorde een stuk hoger dan de andere partijen en omdat die partij zo groot was bepaalde die partij het grootste deel van de uiteindelijke score. Toch was dit onvermijdelijk omdat de uiteindelijke uitslag ook goed was voor de VVD. Het is opmerkelijk dat het algoritme die winst goed kon voorspellen op basis van oude data. Uiteindelijk bleek de Recall-score doorslaggevend. Als een algoritme de Recall-score van de VVD goed kon voorspellen haalde het algoritme als geheel een hoge score. Bij de Bevolkingsvariabelen van 2010 was de Precision score dan wel hoger van het RandomForest algoritme maar de Recall significant lager en daardoor scoorde LinearSVC uiteindelijk beter. Er is daarnaast een probleem bij het beoordelen van de algoritmes. De arrays van gemeenten zijn niet even groot. In 2017 zijn er minder gemeenten omdat er fusies tussen gemeenten hebben plaatsgevonden. Daarnaast zijn er in 2017 partijen als D66 en GL de grootste die in 2010 een stuk kleiner waren. Die gemeenten worden dus sowieso verkeerd geclassificeerd. Dit beïnvloed de score uiteraard want theoretisch had die hoger uit kunnen vallen. 6.3 Variabelen De variabelen uit de literatuur scoorden wisselend. Vooral de omgevingsfactoren die de Voogd (2013) aangaf scoorden goed. Er is wel degelijk een scheidslijn tussen stad en dorp te zien gezien de PCA-scores. Ook inkomen scoorde goed en de economische variabelen van Achterberg & Houtman (2006) en Leighley, J. E., & Nagler, J. (1992) zijn daarmee bewezen. Onderwijs en sociale zekerheid scoorden beduidend minder goed wat waarschijnlijk komt doordat die categorieën niet zo groot zijn en er veel lege velden waren. Er is daarom minder variantie te berekenen. Er is wel een effect maar het is significant lager dan bij de bevolkings- en inkomensvariabelen. Het samenvoegen van verschillende categorieën helpt ook niet. Er moet daadwerkelijk sprake zijn van genoeg data om het verschil aan te geven tussen de verschillende partijen en gemeenten. Een multivariable-classification is een moeilijke berekening en er zijn blijkbaar veel variabelen voor nodig om genoeg variantie te hebben. 6.4 Verder onderzoek Er zijn enkele onoverkomelijke problemen met dit onderzoek. Ten eerste wordt er gekeken naar de grootste partij in elke gemeente. Deze vraag had beter gesteld kunnen worden in een context van een 2-partijensysteem en een districtenstelsel zoals in de Verenigde Staten en het Verenigd Koninkrijk omdat de uitslag daar relevanter is. Elk kiesdistrict heeft namelijk een zetel in het parlement of een stem voor de president en de uitslag van het onderzoek is dan veel relevanter. Toch bewijst dit onderzoek zeker dat op basis van de plaats waar iemand woont en de resultaten

(19)

19

in het verleden goed te voorspellen is wat dat gebied gaat stemmen en de algoritmen zijn goed in staat veranderingen te voorspellen.

Ten tweede zou er een poging gedaan moeten worden om ook de andere partijen goed te voorspellen. In de eigenlijke uitslagen waren partijen als D66 en Groenlinks vrij groot maar die partijen zijn niet geclusterd in bepaalde gemeenten en zijn daarom moeilijk te voorspellen. Ook Dassonneville et al. (2017) probeerden de grootste partij te voorspellen en niet meerdere partijen. Het lijkt erop dat om meerdere partijen te voorspellen er echt polling methoden moeten worden gebruikt. Ook omdat er dan een uitspraak gedaan wordt over de gehele populatie en niet alleen maar over een deel. CBS-cijfers generaliseren ook natuurlijk dus de kleine partijen verliezen het altijd. 7 Referenties Aarts, K., & Thomassen, J. (2008). Dutch voters and the changing party space 1989–2006. Acta politica, 43(2-3), 203-234. Achterberg, P., & Houtman, D. (2006). Why do so many people vote ‘unnaturally’? A cultural explanation for voting behaviour. European Journal of Political Research, 45(1), 75-92.

Andeweg, R. B., & Irwin, G. A. (2014). Governance and Politics of the Netherlands. Palgrave macmillan. Aichholzer, J., & Willmann, J. (2014). Forecasting Austrian national elections: The grand coalition model. International journal of forecasting, 30(1), 55-64. Belanger, E., & Aarts, K. (2006). Explaining the rise of the LPF: issues, discontent, and the 2002 Dutch election. Acta politica, 41(1), 4-20. CBS(2018) Retrieved from in April 2018: https://opendata.cbs.nl/#/CBS/nl/navigatieScherm/zoeken?searchKeywords=Regionale%20ker ncijfers%20Nederland. Cuzán, A. G., Armstrong, J. S., & Jones, R. (2005, January). Combining methods to forecast the 2004 presidential election: The Pollyvote. In annual meeting of the Southern Political Science Association. New Orleans. January.

(20)

20 Dassonneville, R., Lewis-Beck, M. S., & Mongrain, P. (2017). Forecasting Dutch elections: An initial model from the March 2017 legislative contests. Research & Politics, 4(3), 2053168017720023.

Datacamp(2018) Retrieved from in April 2018: https://www.datacamp.com/courses/machine-learning-with-the-experts-school-budgets

D’Hooge, L. (2016). Objectieve klasse, inschatting van klasse en stemgedrag in Nederland. Sociologie, 12(1), 97-121.

Easley, D., & Kleinberg, J. (2010). Networks, crowds, and markets: Reasoning about a highly connected world. Cambridge University Press. Farrell, D. M. (2011). Electoral systems: A comparative introduction. Palgrave macmillan. Gibson, R., & Lewis-Beck, M. S. (2011). Methodologies of election forecasting: Calling the 2010 UK “hung parliament”. Electoral Studies, 30(2), 247-249. Ginfo (2018) http://www.ginfo.nl/verkiezingsuitslagen-en-dynamische-draaitabellen/ Hawkins, Douglas M. (2004), "The problem of overfitting", Journal of Chemical Information and Modeling, 44.1: 1-12. Ho, T. K. (1995, August). Random decision forests. In Document analysis and recognition, 1995., proceedings of the third international conference on (Vol. 1, pp. 278-282). IEEE.

(21)

21

Holbrook, T. M., & DeSart, J. A. (1999). Using state polls to forecast presidential election outcomes in the American states. International Journal of Forecasting, 15(2), 137-142.

Hurtado Bodell, M. (2016). Bayesian poll of polls for multi-party systems.

Irwin, G. A., & Van Holsteyn, J. J. (1989). Decline of the structured model of electoral competition. West European Politics, 12(1), 21-41.

Kiesraad(2018) Retrieved from in April 2018 https://www.verkiezingsuitslagen.nl/

Kurt, I., Ture, M., & Kurum, A. T. (2008). Comparing performances of logistic regression, classification and regression tree, and neural networks for predicting coronary artery disease. Expert systems with applications, 34(1), 366-374.

Leighley, J. E., & Nagler, J. (1992). Individual and systemic influences on turnout: Who votes? 1984. The Journal of Politics, 54(3), 718-740.

Lewis-Beck, M. S. (2005). Election forecasting: principles and practice. The British Journal of Politics & International Relations, 7(2), 145-164.

Lewis-Beck, M. S., & Tien, C. (2016). The Political Economy Model: 2016 US Election Forecasts. PS, Political Science & Politics, 49(4), 661.

Markus, G. B. (1988). The impact of personal and national economic conditions on the presidential vote: A pooled cross-sectional analysis. American Journal of Political Science, 137-154.

(22)

22 Miller, P. R., & Conover, P. J. (2015). Red and blue states of mind: Partisan hostility and voting in the United States. Political Research Quarterly, 68(2), 225-239. Parry, J. A., & Shields, T. G. (2001). Sex, age, and the implementation of the motor voter act: The 1996 presidential election. Social science quarterly, 82(3), 506-523. Patil, T. R., & Sherekar, S. S. (2013). Performance analysis of Naive Bayes and J48 classification algorithm for data classification. International Journal of Computer Science and Applications, 6(2), 256-261. Pearson, K. (1901). LIII. On lines and planes of closest fit to systems of points in space. The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science, 2(11), 559-572.

Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., ... & Vanderplas, J. (2011). Scikit-learn: Machine learning in Python. Journal of machine learning research, 12(Oct), 2825-2830.

Powers, D. M. (2011). Evaluation: from precision, recall and F-measure to ROC, informedness, markedness and correlation. Rallings, C., & Thrasher, M. (1999). Local votes, national forecasts–using local government by- elections in Britain to estimate party support. International Journal of Forecasting, 15(2), 153-162. Rokach, Lior; Maimon, O. (2008). Data mining with decision trees: theory and applications. World Scientific Pub Co Inc. ISBN 978-9812771711. Sedgwick, P. (2013). Simple linear regression. BMJ: British Medical Journal, 346.

(23)

23

Steinwart, I., & Christmann, A. (2008). Support vector machines. Springer Science & Business Media. Stoltenberg, E. A. (2013). Bayesian Forecasting of Election Results in Multiparty Systems (Master's thesis). Swank, O. H., & Eisinga, R. (1999). Economic outcomes and voting behaviour in a multi-party system: An application to the Netherlands. Public Choice, 101(3-4), 195-213. de Voogd, J. (2013). Nieuwe scheidslijnen op de kaart. Ministerie van Binnenlandse Zaken en Koninkrijksrelaties DGBK-Bureau Verkenning en Onderzoek. Vapnik Vladimir, N. (1995). Thw Nature of Statistical Learning Theory. Vossen, K. P. S. S. (2017). Een paradijs voor partijen: Nederland en zijn kleine partijen.

Vrielink, M. O. Is de doe-democratie een diplomademocratie? Een verkenning van sociale ongelijkheid. Walther, D. (2015). Picking the winner (s): Forecasting elections in multiparty systems. Electoral Studies, 40, 1-13.

(24)

24 8. Appendix Ook op github.com/acefoxy/scriptie 8.1 SVC # coding: utf-8 # In[58]: #import

(25)

25 import pandas as pd from sklearn.metrics import classification_report from sklearn.svm import LinearSVC import numpy as np #import bestanden, 2010, 2012 of 2017 df = pd.read_csv('TK2010_revised.csv', sep=',' ,encoding= 'latin1') df = df[['gemeente','Partij']] df2 = pd.read_csv('2010_all.csv',sep=',') df2 = df2.rename(columns={"Regio's": "gemeente"})

df2 = df2[np.isfinite(df2['Bevolking/Bevolkingssamenstelling op 1 januari/Totale bevolking (aantal)'])] df3 = pd.merge(df,df2, on='gemeente') #NUMBER = list(df3.columns[3:]) #selecteer variabelen NUMBER = list(df3.columns[pd.Series(df3.columns).str.startswith('Bevolking')]) # In[59]: import numpy as np numeric_data_only = df3[NUMBER].fillna(-1000)

(26)

26 X = numeric_data_only label_dummies = df3['Partij'] y = label_dummies print(X.shape) print(y.shape) #selecteer algoritme en fit clf2 = LinearSVC() clf2.fit(X,y) # In[63]: #selecteer 2017 om te voorspellen holdout = pd.read_csv('2017_all.csv',index_col=0, sep=',') holdout = holdout.rename(columns={"Regio's": 'gemeente'})

(27)

27

holdout = holdout[np.isfinite(holdout['Bevolking/Bevolkingssamenstelling op 1 januari/Totale bevolking (aantal)'])] holdout2 = pd.read_csv('TK2017_revised.csv', sep=',' ,encoding= 'latin1') holdout2 = holdout2[['gemeente','Partij']] holdout2 = holdout2.set_index('gemeente') X2 = holdout[NUMBER].fillna(-1000).values predictions = clf2.predict(X2) #make arrays of same length #Format predictions in DataFrame: prediction_df prediction_df = pd.DataFrame( index=holdout['gemeente'], data=predictions) prediction_df.rename(columns={0: "Partij2"},inplace=True) prediction_df = prediction_df.iloc[::5, :]

(28)

28 prediction_df = prediction_df[['Partij2']] final = pd.merge(holdout2, prediction_df, left_index=True, right_index=True) a = final.Partij.values b = final.Partij2.values from sklearn.metrics import accuracy_score print(accuracy_score(a,b,normalize=True)) #classificationreport print(classification_report(a, b)) # In[66]: a = final[final.Partij == 'PVDA'] a.Partij2.value_counts()

(29)

29 8.2 Andere variabelen en PCA # coding: utf-8 # In[1]: import pandas as pd #functions from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report from warnings import warn from sklearn.svm import LinearSVC from sklearn.feature_selection import SelectFromModel import numpy as np import pandas as pd import matplotlib.pyplot as plt # Import classifiers

(30)

30 from sklearn.pipeline import Pipeline from sklearn.linear_model import LogisticRegression from sklearn.multiclass import OneVsRestClassifier from sklearn.multiclass import OneVsOneClassifier from sklearn.gaussian_process import GaussianProcessClassifier from sklearn.svm import LinearSVC from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import label_ranking_average_precision_score from sklearn import tree def multilabel_sample(y, size=1000, min_count=5, seed=None): """ Takes a matrix of binary labels `y` and returns the indices for a sample of size `size` if `size` > 1 or `size` * len(y) if size =< 1. The sample is guaranteed to have > `min_count` of each label. """ try: if (np.unique(y).astype(int) != np.array([0, 1])).all(): raise ValueError() except (TypeError, ValueError): raise ValueError('multilabel_sample only works with binary indicator matrices') if (y.sum(axis=0) < min_count).any():

(31)

31

raise ValueError('Some classes do not have enough examples. Change min_count if necessary.') if size <= 1: size = np.floor(y.shape[0] * size) if y.shape[1] * min_count > size: msg = "Size less than number of columns * min_count, returning {} items instead of {}." warn(msg.format(y.shape[1] * min_count, size)) size = y.shape[1] * min_count rng = np.random.RandomState(seed if seed is not None else np.random.randint(1)) if isinstance(y, pd.DataFrame): choices = y.index y = y.values else: choices = np.arange(y.shape[0]) sample_idxs = np.array([], dtype=choices.dtype) # first, guarantee > min_count of each label for j in range(y.shape[1]): label_choices = choices[y[:, j] == 1] label_idxs_sampled = rng.choice(label_choices, size=min_count, replace=False) sample_idxs = np.concatenate([label_idxs_sampled, sample_idxs])

(32)

32 sample_idxs = np.unique(sample_idxs) # now that we have at least min_count of each, we can just random sample sample_count = int(size - sample_idxs.shape[0]) # get sample_count indices from remaining choices remaining_choices = np.setdiff1d(choices, sample_idxs) remaining_sampled = rng.choice(remaining_choices, size=sample_count, replace=False) return np.concatenate([sample_idxs, remaining_sampled]) def multilabel_sample_dataframe(df, labels, size, min_count=5, seed=None): """ Takes a dataframe `df` and returns a sample of size `size` where all classes in the binary matrix `labels` are represented at least `min_count` times. """ idxs = multilabel_sample(labels, size=size, min_count=min_count, seed=seed) return df.loc[idxs] def multilabel_train_test_split(X, Y, size, min_count=5, seed=None): """ Takes a features matrix `X` and a label matrix `Y` and returns (X_train, X_test, Y_train, Y_test) where all classes in Y are represented at least `min_count` times.

(33)

33 """ index = Y.index if isinstance(Y, pd.DataFrame) else np.arange(Y.shape[0]) test_set_idxs = multilabel_sample(Y, size=size, min_count=min_count, seed=seed) train_set_idxs = np.setdiff1d(index, test_set_idxs) test_set_mask = index.isin(test_set_idxs) train_set_mask = ~test_set_mask return (X[train_set_mask], X[test_set_mask], Y[train_set_mask], Y[test_set_mask]) # In[2]: #Selecteer goede bestand df = pd.read_csv('TK2010_revised.csv', sep=',' ,encoding= 'latin1') df = df[['gemeente','Partij']] df2 = pd.read_csv('2010_all.csv',sep=',') df2 = df2.rename(columns={"Regio's": "gemeente"})

df2 = df2[np.isfinite(df2['Bevolking/Bevolkingssamenstelling op 1 januari/Totale bevolking (aantal)'])]

(34)

34 df3 = pd.merge(df,df2, on='gemeente') #NUMBER = list(df3.columns[3:]) NUMBER = list(df3.columns[pd.Series(df3.columns).str.startswith('Bevolking')]) # In[3]: # Create the new DataFrame: numeric_data_only numeric_data_only = df3[NUMBER].fillna(-1000) X = numeric_data_only # Get labels and convert to dummy variables: label_dummies label_dummies = pd.get_dummies(df3['Partij']) y = label_dummies # Create training and test sets X_train, X_test, y_train, y_test = multilabel_train_test_split(numeric_data_only, label_dummies,

(35)

35 size=0.25,seed=25,min_count = 2) # Instantiate the classifier: clf clf = OneVsRestClassifier(LogisticRegression()) clf2 = tree.DecisionTreeClassifier() svc = RandomForestClassifier() # Fit the classifier to the training data clf.fit(X,y) clf2.fit(X,y) svc.fit(X,y) # Print the accuracy print("Accuracy: {}".format(clf.score(X_test, y_test))) print("Accuracy: {}".format(svc.score(X_test, y_test))) print("Accuracy: {}".format(clf2.score(X_test, y_test))) # Predict the labels of the test data: y_pred y_pred = clf2.predict(X_test) # Generate the confusion matrix and classification report

(36)

36 print(classification_report(y_test, y_pred)) print(label_ranking_average_precision_score(y_test, y_pred)) # In[4]: from sklearn.metrics import recall_score, precision_score from nltk.metrics import precision, recall holdout = pd.read_csv('2012_all.csv',index_col=0, sep=',') holdout = holdout.rename(columns={"Regio's": 'gemeente'})

holdout = holdout[np.isfinite(holdout['Bevolking/Bevolkingssamenstelling op 1 januari/Totale bevolking (aantal)'])] holdout2 = pd.read_csv('TK2012_revised.csv', sep=',' ,encoding= 'latin1') holdout2 = holdout2[['gemeente','Partij']] holdout2 = holdout2.set_index('gemeente') X2 = holdout[NUMBER].fillna(-1000) y2 = pd.get_dummies(holdout2['Partij'])

(37)

37 predictions = clf2.predict(X2) #make arrays of same length #Format predictions in DataFrame: prediction_df prediction_df = pd.DataFrame(columns=pd.get_dummies(df3['Partij']).columns, index=holdout['gemeente'], data=predictions) prediction_df = prediction_df.iloc[::5, :] prediction_df['Partij2'] = prediction_df.idxmax(axis=1) prediction_df = prediction_df[['Partij2']] final = pd.merge(holdout2, prediction_df, left_index=True, right_index=True) a = final.Partij.values b = final.Partij2.values print(classification_report(a, b))

(38)

38 from sklearn.metrics import accuracy_score print(accuracy_score(a,b,normalize=True)) # In[5]: a = final[final.Partij == 'SGP'] a.head(50) # In[6]: a = {name: importance for name, importance in zip(NUMBER, clf2.feature_importances_)} df = pd.DataFrame(list(a.items()), columns=['name', 'importance']) df2 = df.sort_values('importance',ascending=False) #pd.options.display.max_rows #pd.set_option('display.max_colwidth', -1) df2.set_index('name')

(39)

39 # In[7]: from sklearn.decomposition import PCA pca = PCA(n_components=8) pca.fit(X2,y2) # Dump components relations with features: z = pd.DataFrame(pca.components_,columns=X.columns,index=['CDA', 'CU', 'D66', 'GL', 'PVV', 'SGP', 'SP', 'VVD']) z = z.transpose() zz= z.corr().abs()

(40)

40 z['mean'] = z.mean(axis=1) partij = 'CDA' aaa = z[[partij]].sort_values(by = partij,ascending=False) aaa.head(10)

Referenties

GERELATEERDE DOCUMENTEN

Het idee is dat als de onderwijsinstellingen hun zaken wat betreft intern toezicht, bestuur, en kwaliteit goed op orde hebben, de rol van de Inspectie van het Onderwijs kan

Tegenstanders van een coalitie tussen VVD en PvdA - en die waren er vooral bij de politieke leiding van beide partijen - zagen hun politieke groeperingen als

„De problemen van het Noorden zijn omvangrijk en ingewikkeld, De verleiding is groot om aandacht te vragen voor tientallen andere projecten, die alle van belang zijn. Ik

The progressive members of Dutch soci- ety will have to think again about the issue of multiculturalism, and they should take to heart the words of William Pfaff (I n t e r n a t

Table 7.1 shows the confusion matrix of the best performing model of the dataset with input data types numerical and binary and output data type categorical (11 values). The

Onder het motto 'verbeter de wereld, maar begin niet bij jezelf', was het overigens ditzelfde bestuur dat kort geleden voorstellen heeft gepresenteerd voor verbetering

Onder het motto 'verbeter de wereld, maar begin niet bij jezelf', was het overigens ditzelfde bestuur dat kort geleden voorstellen heeft gepresenteerd voor verbetering

Nu de verkiezingen achter de rug zijn, de mist van de campagne is opgetrokken en de kaarten in ons politieke bestel opnieuw zijn geschud, blijft er voor de politiek als geheel maar