833 KiB
Data gemeenteraadsverkiezingen 2022 Nederland¶
Dit notebook is voor het verwerken van de data van de gemeenteraadsverkiezingen van 2022. Er zal hier stap voor stap door de data gelopen worden om het proces reproduceerbaar te maken voor latere verkiezingen. De eerste stap was de data ophalen van de bronnen, zowel de overheid als waar is mijn stemlokaal (voor geografische data van de stemlokalen). De bronnen gebruikt voor de data zijn voor de verkiezingen van 2022 is als volgt:
- Verkiezingsuitslagen Gemeenteraad 2022
- Waar is mijn stemlokaal stembureau data
- CBS Wijk- en buurtkaart 2021
- CBS bevolkingsdichtheid kaart 100 bij 100 meter
- CBS bevolkingsdichtheid kaart 500 bij 500 meter
De eerste stap die we moeten maken is de data importeren voor de analyse, daarna kunnen we kijken hoe goed de data is, hoe we het aan kunnen vullen, en wat er mee te doen. De makkelijkste structuur die we vonden was het geojson bestand van open state en de Volkskrant, daar staan alle stembureaus al in een lijst, en we hebben een makkelijk framework om het te importeren; geopandas. We laden deze dan ook als eerste in.
import pandas as pd
import geopandas as gpd
crs = {'init':'EPSG:4326'}
df_geojson = gpd.read_file(r'../data/2022gr.geo.json', crs=crs)
/home/lillian/.local/lib/python3.9/site-packages/fiona/collection.py:208: FeatureWarning: Empty field name at index 61 self._schema = self.session.get_schema() /home/lillian/anaconda3/lib/python3.9/site-packages/geopandas/geodataframe.py:600: UserWarning: Empty field name at index 61 for feature in features_lst:
We importeren nu de gemeente shapefile kaart van het CBS, om de overlay van onze stemlokalen eroverheen te kunnen doen.
nl_map = gpd.read_file(r'../data/shape/Netherlands_shapefile/gemeente_2021_v1.shp')
nl_map.to_crs(epsg=4326).plot()
<AxesSubplot:>
print(nl_map)
GM_CODE GM_NAAM H2O OAD STED BEV_DICHTH AANT_INW \ 0 GM0034 Almere JA -99999999 -99999999 -99999999 -99999999 1 GM0050 Zeewolde JA -99999999 -99999999 -99999999 -99999999 2 GM0060 Ameland JA -99999999 -99999999 -99999999 -99999999 3 GM0072 Harlingen JA -99999999 -99999999 -99999999 -99999999 4 GM0088 Schiermonnikoog JA -99999999 -99999999 -99999999 -99999999 .. ... ... ... ... ... ... ... 430 GM1966 Het Hogeland NEE 414 5 99 47834 431 GM1969 Westerkwartier NEE 476 5 176 63678 432 GM1970 Noardeast-Fryslân NEE 463 5 120 45481 433 GM1978 Molenlanden NEE 393 5 243 44130 434 GM1979 Eemsdelta NEE 692 4 170 45587 AANT_MAN AANT_VROUW P_00_14_JR ... P_TURKIJE P_OVER_NW OPP_TOT \ 0 -99999999 -99999999 -99999999 ... -99999999 -99999999 -99999999 1 -99999999 -99999999 -99999999 ... -99999999 -99999999 -99999999 2 -99999999 -99999999 -99999999 ... -99999999 -99999999 -99999999 3 -99999999 -99999999 -99999999 ... -99999999 -99999999 -99999999 4 -99999999 -99999999 -99999999 ... -99999999 -99999999 -99999999 .. ... ... ... ... ... ... ... 430 24052 23782 15 ... 0 3 90308 431 32034 31644 17 ... 0 3 36887 432 22879 22602 17 ... 0 2 51645 433 22317 21813 18 ... 0 2 19158 434 22841 22746 14 ... 2 5 36407 OPP_LAND OPP_WATER JRSTATCODE JAAR Shape_Leng Shape_Area \ 0 -99999999 -99999999 2021GM0034 2021 122665.358635 1.095623e+08 1 -99999999 -99999999 2021GM0050 2021 83290.773617 1.633050e+07 2 -99999999 -99999999 2021GM0060 2021 156406.894023 2.085914e+08 3 -99999999 -99999999 2021GM0072 2021 104274.683035 3.618323e+08 4 -99999999 -99999999 2021GM0088 2021 152568.858991 1.624101e+08 .. ... ... ... ... ... ... 430 48249 42059 2021GM1966 2021 321301.166576 4.875998e+08 431 36269 618 2021GM1969 2021 99030.762281 3.688457e+08 432 37783 13862 2021GM1970 2021 238426.959926 3.837930e+08 433 18173 986 2021GM1978 2021 88570.376691 1.915841e+08 434 26789 9618 2021GM1979 2021 173966.493452 2.727771e+08 geometry 0 MULTIPOLYGON (((150213.998 479503.726, 150087.... 1 MULTIPOLYGON (((170588.413 486792.192, 170570.... 2 POLYGON ((196000.000 610000.000, 196000.000 60... 3 MULTIPOLYGON (((158392.775 580357.500, 158387.... 4 POLYGON ((219000.000 616567.418, 219000.000 61... .. ... 430 MULTIPOLYGON (((217037.735 601967.991, 217043.... 431 POLYGON ((215186.661 595044.495, 215190.788 59... 432 MULTIPOLYGON (((207769.575 603284.528, 207773.... 433 POLYGON ((123569.533 440132.167, 123576.153 44... 434 MULTIPOLYGON (((269190.000 594253.046, 269190.... [435 rows x 38 columns]
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize = (10,10))
nl_map.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson.plot(ax=ax)
<AxesSubplot:>
We hebben hier een probleem dat sommige punten de coördinaten 0,0 hebben, dit is niet iets wat we willen weergeven. Laten we eerst kijken waarom dit het geval is in de data voordat we het er helemaal uithalen.
for index, row in df_geojson.iterrows():
if (row.geometry.centroid.x == 0.00000):
print(row)
Stembureau 32 Adres Locatie SB32 description Stembureau Mobiel Stembureau 1 Geldige stemmen 99 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 2520, Length: 973, dtype: object Stembureau 33 Adres Locatie SB33 description Stembureau Mobiel Stembureau 2 Geldige stemmen 115 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 2521, Length: 973, dtype: object Stembureau 157 Adres Locatie SB157 description Stembureau Stembureau Stembus Geldige stemmen 72 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 2918, Length: 973, dtype: object Stembureau 171 Adres Locatie SB171 description Stembureau Stembureau Stembureau op locatie al... Geldige stemmen 174 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 3579, Length: 973, dtype: object Stembureau 172 Adres Locatie SB172 description Stembureau Stembureau Stembureau op locatie al... Geldige stemmen 66 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 3580, Length: 973, dtype: object Stembureau 173 Adres Locatie SB173 description Stembureau Stembureau Stembureau op locatie al... Geldige stemmen 162 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 3581, Length: 973, dtype: object Stembureau 174 Adres Locatie SB174 description Stembureau Stembureau Stembureau op locatie al... Geldige stemmen 65 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 3582, Length: 973, dtype: object Stembureau 175 Adres Locatie SB175 description Stembureau Stembureau Stembureau op locatie al... Geldige stemmen 121 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 3583, Length: 973, dtype: object Stembureau 39 Adres Locatie SB39 description Stembureau Mobiel stembureau met beperkte toeg... Geldige stemmen 56 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 5494, Length: 973, dtype: object Stembureau 34 Adres Locatie SB34 description Stembureau Stembureau Mobiel stembureau verzor... Geldige stemmen 119 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 5784, Length: 973, dtype: object Stembureau 35 Adres Locatie SB35 description Stembureau Stembureau Mobiel stembureau verzor... Geldige stemmen 151 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 5785, Length: 973, dtype: object Stembureau 11 Adres Locatie SB11 description Stembureau Mobiel stembureau Ommedijk Geldige stemmen 14 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 6260, Length: 973, dtype: object Stembureau 12 Adres Locatie SB12 description Stembureau Mobiel stembureau Van Alphenstaete ... Geldige stemmen 68 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 6261, Length: 973, dtype: object Stembureau 70 Adres Locatie SB70 description Stembureau Mobiel stembureau Geldige stemmen 34 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 6738, Length: 973, dtype: object Stembureau 71 Adres Locatie SB71 description Stembureau Mobiel stembureau Geldige stemmen 43 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 6739, Length: 973, dtype: object Stembureau 699 Adres Locatie SB699 description Stembureau Stembureau Mobiel stembureau Geldige stemmen 59 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 6863, Length: 973, dtype: object Stembureau 32 Adres Locatie SB32 description Stembureau Mobielstembureau Geldige stemmen 63 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7348, Length: 973, dtype: object Stembureau 90 Adres Locatie SB90 description Stembureau Roll and Vote Geldige stemmen 339 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7364, Length: 973, dtype: object Stembureau 19 Adres Locatie SB19 description Stembureau Mobiel stembureau Geldige stemmen 77 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7857, Length: 973, dtype: object Stembureau 1428 Adres Locatie SB1428 description Stembureau Drive-thru parkeerplaats Rusheuvel 1 Geldige stemmen 163 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7912, Length: 973, dtype: object Stembureau 1437 Adres Locatie SB1437 description Stembureau Drive-thru parkeerplaats Rusheuvel 2 Geldige stemmen 239 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7913, Length: 973, dtype: object Stembureau 1528 Adres Locatie SB1528 description Stembureau Drive-thru parkeerplaats Rusheuvel 1 Geldige stemmen 323 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7923, Length: 973, dtype: object Stembureau 1537 Adres Locatie SB1537 description Stembureau Drive-thru parkeerplaats Rusheuvel 2 Geldige stemmen 208 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7924, Length: 973, dtype: object Stembureau 1541 Adres Locatie SB1541 description Stembureau Mobiel stembureau Geldige stemmen 125 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7926, Length: 973, dtype: object Stembureau 200 Adres Locatie SB200 description Stembureau Mobiel stembureau Ma Geldige stemmen 30 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7958, Length: 973, dtype: object Stembureau 201 Adres Locatie SB201 description Stembureau Mobiel stembureau Di Geldige stemmen 30 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7959, Length: 973, dtype: object Stembureau 202 Adres Locatie SB202 description Stembureau Mobiel stembureau Woe Geldige stemmen 44 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 7960, Length: 973, dtype: object Stembureau 30 Adres Locatie SB30 description Stembureau Stembureau voor de telling stembure... Geldige stemmen 2004 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8108, Length: 973, dtype: object Stembureau 40 Adres Locatie SB40 description Stembureau Stembureau voor de telling stembure... Geldige stemmen 2953 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8109, Length: 973, dtype: object Stembureau 990 Adres Locatie SB990 description Stembureau Mobiel stembureau (meerdere plaatsen) Geldige stemmen 47 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8161, Length: 973, dtype: object Stembureau 991 Adres Locatie SB991 description Stembureau Mobiel stembureau (meerdere plaatsen) Geldige stemmen 70 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8162, Length: 973, dtype: object Stembureau 992 Adres Locatie SB992 description Stembureau Mobiel stembureau (meerdere plaatsen) Geldige stemmen 39 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8163, Length: 973, dtype: object Stembureau 17 Adres Locatie SB17 description Stembureau Mobiel Stembureau dinsdag Geldige stemmen 115 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 8318, Length: 973, dtype: object Stembureau 228 Adres Locatie SB228 description Stembureau Stembureau Drive-in Geldige stemmen 80 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9093, Length: 973, dtype: object Stembureau 30 Adres Locatie SB30 description Stembureau Mobiel stembureau Geldige stemmen 25 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9151, Length: 973, dtype: object Stembureau 31 Adres Locatie SB31 description Stembureau Mobiel stembureau Geldige stemmen 8 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9152, Length: 973, dtype: object Stembureau 32 Adres Locatie SB32 description Stembureau Mobiel stembureau Geldige stemmen 24 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9153, Length: 973, dtype: object Stembureau 76 Adres Locatie SB76 description Stembureau Rondvaartboot Toerist VI Geldige stemmen 148 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9661, Length: 973, dtype: object Stembureau 68 Adres Locatie SB68 description Stembureau Drive Inn (evenemententerrein Het L... Geldige stemmen 285 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 9853, Length: 973, dtype: object Stembureau 14 Adres Locatie SB14 description Stembureau Mobiel Stembureau Geldige stemmen 24 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10427, Length: 973, dtype: object Stembureau 18 Adres Locatie SB18 description Stembureau Mobiel stembureau Geldige stemmen 50 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10431, Length: 973, dtype: object Stembureau 23 Adres Locatie SB23 description Stembureau Stembureau Mobiel: Wkp Zout Veere Geldige stemmen 55 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10497, Length: 973, dtype: object Stembureau 24 Adres Locatie SB24 description Stembureau Stembureau Mobiel: Okp Dom Geldige stemmen 35 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10498, Length: 973, dtype: object Stembureau 115 Adres Locatie SB115 description Stembureau Tent Nijverheidslaan Geldige stemmen 258 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10525, Length: 973, dtype: object Stembureau 116 Adres Locatie SB116 description Stembureau Tent Nijverheidslaan Geldige stemmen 377 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10526, Length: 973, dtype: object Stembureau 117 Adres Locatie SB117 description Stembureau Tent Peter Benenson park Geldige stemmen 285 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10527, Length: 973, dtype: object Stembureau 118 Adres Locatie SB118 description Stembureau Tent Peter Benenson park Geldige stemmen 329 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10528, Length: 973, dtype: object Stembureau 310 Adres Locatie SB310 description Stembureau Mobiel Bijzonder stembureau 1 Geldige stemmen 26 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10623, Length: 973, dtype: object Stembureau 311 Adres Locatie SB311 description Stembureau Mobiel Bijzonder stembureau 2 Geldige stemmen 55 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10624, Length: 973, dtype: object Stembureau 88 Adres Locatie SB88 description Stembureau Mobiel stembureau 1 Geldige stemmen 78 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10894, Length: 973, dtype: object Stembureau 89 Adres Locatie SB89 description Stembureau Mobiel stembureau 2 Geldige stemmen 35 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 10895, Length: 973, dtype: object Stembureau 31 Adres Locatie SB31 description Stembureau Stembureau Mobiel Stembureau Geldige stemmen 32 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 11032, Length: 973, dtype: object Stembureau 0 Adres Locatie SB0 description Stembureau - Geldige stemmen 0 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 11101, Length: 973, dtype: object Stembureau 132 Adres Locatie SB132 description Stembureau Stembureau IJsselhallen drive thoug... Geldige stemmen 52 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12038, Length: 973, dtype: object Stembureau 133 Adres Locatie SB133 description Stembureau Stembureau IJsselhallen drive throu... Geldige stemmen 48 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12039, Length: 973, dtype: object Stembureau 232 Adres Locatie SB232 description Stembureau Stembureau IJsselhallen drive thoug... Geldige stemmen 113 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12053, Length: 973, dtype: object Stembureau 233 Adres Locatie SB233 description Stembureau Stembureau IJsselhallen drive throu... Geldige stemmen 73 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12054, Length: 973, dtype: object Stembureau 358 Adres Locatie SB358 description Stembureau Stembureau Mobiel stembureau 1 Geldige stemmen 70 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12118, Length: 973, dtype: object Stembureau 359 Adres Locatie SB359 description Stembureau Stembureau Mobiel stembureau 2 Geldige stemmen 169 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12119, Length: 973, dtype: object Stembureau 360 Adres Locatie SB360 description Stembureau Stembureau Mobiel stembureau 3 Geldige stemmen 89 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12120, Length: 973, dtype: object Stembureau 361 Adres Locatie SB361 description Stembureau Stembureau Mobiel stembureau 4 Geldige stemmen 36 ... "Leefbaar 's-Hertogenbosch" Paul Kagie NaN RAADSGROEPERING ''BOSCH-BELANG'' NaN gewoon ge-DREVEN NaN VOOR Den Bosch Joep Gersjes NaN geometry POINT (0 0) Name: 12121, Length: 973, dtype: object Stembureau 114 Adres Locatie SB114 description Stembureau Stembureau Mobiel stembureau (beper... Geldige stemmen 109 ... "Leefbaar 's-Hertogenbosch" Paul Kagie 11.0 RAADSGROEPERING ''BOSCH-BELANG'' 8.0 gewoon ge-DREVEN 0.0 VOOR Den Bosch Joep Gersjes 1.0 geometry POINT (0 0) Name: 12504, Length: 973, dtype: object Stembureau 115 Adres Locatie SB115 description Stembureau Stembureau Mobiel Stembureau (beper... Geldige stemmen 80 ... "Leefbaar 's-Hertogenbosch" Paul Kagie 9.0 RAADSGROEPERING ''BOSCH-BELANG'' 5.0 gewoon ge-DREVEN 0.0 VOOR Den Bosch Joep Gersjes 3.0 geometry POINT (0 0) Name: 12505, Length: 973, dtype: object Stembureau 116 Adres Locatie SB116 description Stembureau Stembureau Mobiel Stembureau (beper... Geldige stemmen 119 ... "Leefbaar 's-Hertogenbosch" Paul Kagie 3.0 RAADSGROEPERING ''BOSCH-BELANG'' 3.0 gewoon ge-DREVEN 20.0 VOOR Den Bosch Joep Gersjes 3.0 geometry POINT (0 0) Name: 12506, Length: 973, dtype: object
Het zijn dus duidelijk allemaal mobiele stembureaus, die kunnen we in een aparte dataset houden voor later, voor nu zijn ze onbelangrijk voor de kaartweergave, laten we de dataset dus opsplitsen in drie dataframes, de originele, één frame zonder de mobiele stembureaus, en de mobiele stembureaus alleen.
#de waarschuwing over de projectie die niet klopt kan genegeerd worden, we zoeken naar data die x = 0 is, de projectie gaat geen effect hebben op die data in Nederland
#filter de data en print welke waardes 0 hebben op x
mobiel_mask = df_geojson['geometry'].centroid.x == 0
i = 0
for item in mobiel_mask:
if item:
print(i)
i = i + 1
/tmp/ipykernel_18605/291552514.py:3: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation. mobiel_mask = df_geojson['geometry'].centroid.x == 0
2520 2521 2918 3579 3580 3581 3582 3583 5494 5784 5785 6260 6261 6738 6739 6863 7348 7364 7857 7912 7913 7923 7924 7926 7958 7959 7960 8108 8109 8161 8162 8163 8318 9093 9151 9152 9153 9661 9853 10427 10431 10497 10498 10525 10526 10527 10528 10623 10624 10894 10895 11032 11101 12038 12039 12053 12054 12118 12119 12120 12121 12504 12505 12506
df_geojson_clean = df_geojson[~mobiel_mask]
df_geojson_mobiel = df_geojson[mobiel_mask]
print(df_geojson_clean)
Stembureau Adres Locatie \ 0 1 9461BH SB1 1 2 9461DA SB2 2 3 9461JA SB3 3 4 9451KD SB4 4 6 9454PL SB6 ... ... ... ... 12591 703 5391AR SB703 12592 705 5391AR SB705 12593 750 5382KE SB750 12594 751 5382KE SB751 12595 752 5283KE SB752 description Geldige stemmen \ 0 Stembureau Gemeentehuis Gieten (postcode: 9461... 784 1 Stembureau OBS Gieten (postcode: 9461 DA) 562 2 Stembureau Zorgcentrum Dekelhem (postcode: 946... 566 3 Stembureau Ontmoetingscentrum Boerhorn Rolde (... 1495 4 Stembureau Dropshuis de Eekhof (postcode: 9454... 347 ... ... ... 12591 Stembureau Stembureau Gemeenschapshuis de Meen... 268 12592 Stembureau Stembureau Gemeenschapshuis De Meen... 398 12593 Stembureau Stembureau Gemeenschapshuis 't Zijl... 663 12594 Stembureau Stembureau Gemeenschapshuis 't Zijl... 170 12595 Stembureau Stembureau Gemeenschapshuis 't Zijl... 222 Opgeroepen Ongeldig Blanco Geldige stempassen \ 0 2780 3 3 700 1 1396 0 0 518 2 1409 2 2 516 3 2209 2 4 1335 4 477 0 2 298 ... ... ... ... ... 12591 0 0 1 237 12592 0 1 0 359 12593 2321 2 0 552 12594 0 0 0 151 12595 0 0 0 193 Geldige volmachtbewijzen ... \ 0 90 ... 1 44 ... 2 54 ... 3 166 ... 4 51 ... ... ... ... 12591 32 ... 12592 40 ... 12593 113 ... 12594 19 ... 12595 29 ... Nationale Bond tegen Overheidszaken - DH Haags Belang INL Den Haag \ 0 NaN NaN NaN 1 NaN NaN NaN 2 NaN NaN NaN 3 NaN NaN NaN 4 NaN NaN NaN ... ... ... ... 12591 NaN NaN NaN 12592 NaN NaN NaN 12593 NaN NaN NaN 12594 NaN NaN NaN 12595 NaN NaN NaN Rosmalens Belang De Bossche Groenen \ 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN ... ... ... 12591 105.0 2.0 12592 174.0 6.0 12593 47.0 19.0 12594 8.0 11.0 12595 10.0 2.0 "Leefbaar 's-Hertogenbosch" Paul Kagie \ 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN ... ... 12591 6.0 12592 2.0 12593 53.0 12594 13.0 12595 22.0 RAADSGROEPERING ''BOSCH-BELANG'' gewoon ge-DREVEN \ 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN ... ... ... 12591 0.0 33.0 12592 3.0 31.0 12593 2.0 62.0 12594 1.0 22.0 12595 2.0 28.0 VOOR Den Bosch Joep Gersjes geometry 0 NaN POINT (6.75899 53.00524) 1 NaN POINT (6.75990 52.99975) 2 NaN POINT (6.76600 53.00494) 3 NaN POINT (6.64736 52.98281) 4 NaN POINT (6.60459 52.95269) ... ... ... 12591 0.0 POINT (5.43290 51.72810) 12592 2.0 POINT (5.43290 51.72810) 12593 5.0 POINT (5.45919 51.70595) 12594 1.0 POINT (5.45919 51.70595) 12595 0.0 POINT (5.45919 51.70595) [12532 rows x 973 columns]
fig, ax = plt.subplots(figsize = (15,15))
nl_map.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson_clean.plot(ax=ax)
<AxesSubplot:>
Nu we een mooie kaart hebben van nederland met de stemlokalen erop, kunnen we gaan kijken naar hoe dit verhoud met de bevolkingsdichtheid als eerste voorbeeld. De kaart is opgehaald van het CBS, eerst gaan we kijken hoe de kaart er op zichzelf met dezelfde projectie uitziet.
nl_map_cbs = gpd.read_file(r'../data/shape/Netherlands_shapefile/CBS_vk500_2020_v1.shp')
nl_map_cbs.to_crs(epsg=4326).plot()
<AxesSubplot:>
Het verwerken van de 100m bij 100m vierkanten kaar duurde heel lang (langer dan een half uur) op de laptop, en is dus niet ideaal tenzij we dit niveau van detail écht nodig hebben. Er is namelijk nog een andere kaart met dezelfde gegevens beschikbaar, maar met een grid van 500 bij 500 meter in plaats van 100 bij 100. Laten we dus kijken hoe vaak een stemlokaal dichterbij dan 100 meter van de dichtstbijzijnde andere is. De makkelijkste manier om dat te doen zonder alle punten met alle andere te vergelijken (heel veel moeite), is een extra dataframe maken als een kopie, alle indexen 1 opschuiven (want alle stemlokalen zijn al in een volgorde van clustering), en dan de laagste afstand bekijken.
df_shifted = df_geojson_clean.to_crs('EPSG:28992')
df_shifted['geometry (shifted)'] = df_shifted['geometry'].shift(periods=1)
df_shifted['distance'] = df_shifted['geometry'].distance(df_shifted['geometry (shifted)'])
df_shifted.sort_values(['distance'], inplace=True, ascending=True)
zero_mask_booth = df_shifted['distance'] == 0.000000
df_shifted = df_shifted[~zero_mask_booth]
print(df_shifted['distance'])
11165 0.002608 1021 0.004853 3196 0.004875 1923 2.693202 3757 3.609362 ... 7444 253385.654588 9711 263408.187856 4392 266925.200994 9297 271954.076837 0 NaN Name: distance, Length: 11670, dtype: float64
We kunnen dus vaststellen dat afstanden van onder de 500 meter waarschijnlijk zeldzaam zijn, en we verder kunnen gaan met de 500 meter bij 500 meter kaart. Laten we nu dus een projectie proberen te maken met de bevolkingsdichtheid erop om het te vergelijken met de stemlokalen en hun posities en clustering.
print(list(nl_map_cbs))
nl_map_dst = nl_map_cbs.drop(columns=['MAN', 'VROUW', 'INW_014', 'INW_1524', 'INW_2544', 'INW_4564', 'INW_65PL', 'P_NL_ACHTG', 'P_WE_MIG_A', 'P_NW_MIG_A', 'AANTAL_HH', 'TOTHH_EENP', 'TOTHH_MPZK', 'HH_EENOUD', 'HH_TWEEOUD', 'GEM_HH_GR', 'WONING', 'WONVOOR45', 'WON_4564', 'WON_6574', 'WON_7584', 'WON_8594', 'WON_9504', 'WON_0514', 'WON_1524', 'WON_MRGEZ', 'P_KOOPWON', 'P_HUURWON', 'WON_HCORP', 'WON_NBEW', 'WOZWONING', 'UITKMINAOW', 'OAD', 'STED'])
nl_map_dst
['c28992r500', 'INWONER', 'MAN', 'VROUW', 'INW_014', 'INW_1524', 'INW_2544', 'INW_4564', 'INW_65PL', 'P_NL_ACHTG', 'P_WE_MIG_A', 'P_NW_MIG_A', 'AANTAL_HH', 'TOTHH_EENP', 'TOTHH_MPZK', 'HH_EENOUD', 'HH_TWEEOUD', 'GEM_HH_GR', 'WONING', 'WONVOOR45', 'WON_4564', 'WON_6574', 'WON_7584', 'WON_8594', 'WON_9504', 'WON_0514', 'WON_1524', 'WON_MRGEZ', 'P_KOOPWON', 'P_HUURWON', 'WON_HCORP', 'WON_NBEW', 'WOZWONING', 'UITKMINAOW', 'OAD', 'STED', 'geometry']
c28992r500 | INWONER | geometry | |
---|---|---|---|
0 | E2260N6190 | -99997 | POLYGON ((226000.000 619000.000, 226000.000 61... |
1 | E2265N6190 | -99997 | POLYGON ((226500.000 619500.000, 227000.000 61... |
2 | E2270N6190 | -99997 | POLYGON ((227000.000 619500.000, 227500.000 61... |
3 | E2275N6190 | -99997 | POLYGON ((227500.000 619500.000, 228000.000 61... |
4 | E2280N6190 | -99997 | POLYGON ((228000.000 619500.000, 228500.000 61... |
... | ... | ... | ... |
151103 | E1995N3070 | -99997 | POLYGON ((199500.000 307500.000, 200000.000 30... |
151104 | E1905N3065 | -99997 | POLYGON ((190500.000 307000.000, 191000.000 30... |
151105 | E1910N3065 | -99997 | POLYGON ((191000.000 307000.000, 191500.000 30... |
151106 | E1920N3065 | 20 | POLYGON ((192000.000 307000.000, 192500.000 30... |
151107 | E1925N3065 | -99997 | POLYGON ((192500.000 307000.000, 193000.000 30... |
151108 rows × 3 columns
We kunnen zien dat er gemeente zijn die geen stemlokalen hebben, dit klopt. In de verkiezingen van 2022 hebben 12 gemeentes niet meegedaan. Er zijn dus in totaal 333 gemeentes met stemlokalen. We willen de bevolkingsdichtheiddata van de gemeentes die niet meededen dus weggooien, hiervoor moeten we eerst kijken welke alleen binnen de gemeentes vallen die we niet willen houden.
print(df_geojson['electionName'])
#get all municipalities that are in the election
gemeentes = df_geojson['electionName'].str.slice(13, -5).drop_duplicates()
print(gemeentes)
0 Gemeenteraad Aa en Hunze 2022 1 Gemeenteraad Aa en Hunze 2022 2 Gemeenteraad Aa en Hunze 2022 3 Gemeenteraad Aa en Hunze 2022 4 Gemeenteraad Aa en Hunze 2022 ... 12591 Gemeenteraad 's-Hertogenbosch 2022 12592 Gemeenteraad 's-Hertogenbosch 2022 12593 Gemeenteraad 's-Hertogenbosch 2022 12594 Gemeenteraad 's-Hertogenbosch 2022 12595 Gemeenteraad 's-Hertogenbosch 2022 Name: electionName, Length: 12596, dtype: object 0 Aa en Hunze 27 Aalsmeer 46 Aalten 74 Achtkarspelen 95 Alblasserdam ... 11976 Zwartewaterland 11997 Zwijndrecht 12031 Zwolle 12122 's-Gravenhage 12495 's-Hertogenbosch Name: electionName, Length: 333, dtype: object
#First let's remove the municipalities that don't have an Election from the municipality map
remove_lst = ["Boxtel", "Eemsdelta", "Oisterwijk", "Vught", "Heerhugowaard", "Langedijk", "Boxmeer", "Cuijk", "Sint Anthonis", "Mill en Sint Hubert", "Grave", "Landerd", "Uden", "Brielle", "Hellevoetsluis", "Westvoorne", "Purmerend", "Beemster", "Weesp"]
nl_map_clean = nl_map[~nl_map["GM_NAAM"].isin(remove_lst)]
nl_map_clean = nl_map_clean.query("H2O != 'JA'")
nl_map_clean = nl_map_clean.query("GM_NAAM != 'Buitenland'")
nl_map_election = nl_map[nl_map["GM_NAAM"].isin(gemeentes)]
nl_map_election = nl_map_election.query("H2O != 'JA'")
print("Shape of clean: {}".format(nl_map_clean.shape))
print("Shape of election: {}".format(nl_map_election.shape))
diff = pd.concat([nl_map_election, nl_map_clean]).drop_duplicates(keep=False)
diff
Shape of clean: (333, 38) Shape of election: (330, 38)
GM_CODE | GM_NAAM | H2O | OAD | STED | BEV_DICHTH | AANT_INW | AANT_MAN | AANT_VROUW | P_00_14_JR | ... | P_TURKIJE | P_OVER_NW | OPP_TOT | OPP_LAND | OPP_WATER | JRSTATCODE | JAAR | Shape_Leng | Shape_Area | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
113 | GM0164 | Hengelo | NEE | 1845 | 2 | 1332 | 81049 | 40776 | 40273 | 15 | ... | 6 | 7 | 6183 | 6084 | 99 | 2021GM0164 | 2021 | 47510.255914 | 6.183056e+07 | POLYGON ((251978.591 481220.258, 251979.382 48... |
191 | GM0373 | Bergen (NH.) | NEE | 819 | 4 | 300 | 29715 | 14317 | 15398 | 12 | ... | 0 | 3 | 12023 | 9896 | 2127 | 2021GM0373 | 2021 | 57488.474563 | 9.987418e+07 | POLYGON ((105976.650 529056.951, 106002.347 52... |
328 | GM0893 | Bergen (L.) | NEE | 318 | 5 | 127 | 13108 | 6568 | 6540 | 13 | ... | 0 | 3 | 10850 | 10324 | 525 | 2021GM0893 | 2021 | 61497.563571 | 1.084951e+08 | POLYGON ((199768.270 409749.960, 199758.060 40... |
3 rows × 38 columns
Nu we dezelfde lijst hebben van gemeentes die in de verkiezingen meededen kunnen we verder.
fig, ax = plt.subplots(figsize = (15,15))
nl_map_clean.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson_clean.plot(ax=ax)
<AxesSubplot:>
nl_map_dst['savedindex'] = nl_map_dst.index #Save the index values as a new column
intersecting = nl_map_clean.sjoin(nl_map_dst, how='inner')['savedindex'] #Find the polygons that intersect. Keep savedindex as a series
nl_map_dst = nl_map_dst.loc[nl_map_dst.savedindex.isin(intersecting)] #Filter away these, "savedindex is in intersecting"
nl_map_dst.to_crs(epsg=4326).plot()
<AxesSubplot:>
import folium
from folium import plugins
#Location is Amersfoort, the central point of the continental Netherlands
map = folium.Map(location = [52.155, 5.3875], zoom_start = 9, tiles="cartodbdark_matter", prefer_canvas=True)
nl_map_dst.to_crs(epsg=4326)
#Make sure the index is a string so folium can read it correctly as a key.
nl_map_dst['c28992r500'] = nl_map_dst['c28992r500'].apply(lambda x: str(x))
nl_map_dst_zero = nl_map_dst.copy()
zero_mask_pop = nl_map_dst['INWONER'] == -99997
nl_map_dst = nl_map_dst[~zero_mask_pop]
zero_mask_pop2 = nl_map_dst['INWONER'] == 0
nl_map_dst = nl_map_dst[~zero_mask_pop2]
folium.Choropleth(
geo_data = nl_map_dst,
name="Bevolkingsdichtheid",
data = nl_map_dst,
columns = ["c28992r500", "INWONER"],
key_on = 'feature.properties.c28992r500',
fill_color = 'RdPu',
nan_fill_color= 'white',
fill_opacity = 0.7,
nan_fill_opacity = 0.7,
line_opacity = 0,
legend_name = 'Bevolkingsdichtheid',
smooth_factor = 1.0,
show=False
).add_to(map)
map
# Renders the map to an HTML file and displays it in an embed.
def embed_map(m):
#from IPython.display import IFrame
m.save('index.html')
#return IFrame('index.html', width='100%', height='750px')
/home/lillian/anaconda3/lib/python3.9/site-packages/geopandas/geodataframe.py:1351: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy super().__setitem__(key, value)
df_geojson_clean_hmp = [[point.xy[1][0], point.xy[0][0]] for point in df_geojson_clean.geometry]
plugins.HeatMap(df_geojson_clean_hmp, name="Stemlokalen Heatmap").add_to(map)
folium.LayerControl().add_to(map)
embed_map(map)
nl_map_dst_points = nl_map_dst.copy()
nl_map_dst_points['geometry'] = nl_map_dst_points['geometry'].centroid
nl_map_dst_zero_points = nl_map_dst_zero.copy()
nl_map_dst_zero_points['geometry'] = nl_map_dst_zero_points['geometry'].centroid
nl_map_dst_zero_points
c28992r500 | INWONER | geometry | savedindex | |
---|---|---|---|---|
2 | E2270N6190 | -99997 | POINT (227250.000 619250.000) | 2 |
3 | E2275N6190 | -99997 | POINT (227750.000 619250.000) | 3 |
4 | E2280N6190 | -99997 | POINT (228250.000 619250.000) | 4 |
7 | E2265N6185 | -99997 | POINT (226750.000 618750.000) | 7 |
8 | E2270N6185 | -99997 | POINT (227250.000 618750.000) | 8 |
... | ... | ... | ... | ... |
151102 | E1990N3070 | -99997 | POINT (199250.000 307250.000) | 151102 |
151103 | E1995N3070 | -99997 | POINT (199750.000 307250.000) | 151103 |
151105 | E1910N3065 | -99997 | POINT (191250.000 306750.000) | 151105 |
151106 | E1920N3065 | 20 | POINT (192250.000 306750.000) | 151106 |
151107 | E1925N3065 | -99997 | POINT (192750.000 306750.000) | 151107 |
140002 rows × 4 columns
import numpy as np
from scipy.spatial import cKDTree
from shapely.geometry import Point
#Found on https://gis.stackexchange.com/questions/222315/finding-nearest-point-in-other-geodataframe-using-geopandas
def ckdnearest(gdA, gdB):
nA = np.array(list(gdA.geometry.apply(lambda x: (x.x, x.y))))
nB = np.array(list(gdB.geometry.apply(lambda x: (x.x, x.y))))
btree = cKDTree(nB)
dist, idx = btree.query(nA, k=1)
gdB_nearest = gdB.iloc[idx].drop(columns="geometry").reset_index(drop=True)
gdf = pd.concat(
[
gdA.reset_index(drop=True),
gdB_nearest,
pd.Series(dist, name='dist')
],
axis=1)
return gdf
#error bar is +- sqrt(250²*2)m ≈ +-353.553390593m
error = np.sqrt(250**2 + 250**2)
df_nearest = ckdnearest(nl_map_dst_points.to_crs(epsg=28992), df_geojson_clean.to_crs(epsg=28992))
df_nearest.head()
c28992r500 | INWONER | geometry | savedindex | Stembureau | Adres | Locatie | description | Geldige stemmen | Opgeroepen | ... | Nationale Bond tegen Overheidszaken - DH | Haags Belang | INL Den Haag | Rosmalens Belang | De Bossche Groenen | "Leefbaar 's-Hertogenbosch" Paul Kagie | RAADSGROEPERING ''BOSCH-BELANG'' | gewoon ge-DREVEN | VOOR Den Bosch Joep Gersjes | dist | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | E2050N6110 | 5 | POINT (205250.000 611250.000) | 267 | 1 | 9166LX | SB1 | Stembureau Gemeentehuis (postcode: 9166 LX) | 655 | 827 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1331.950309 |
1 | E2060N6110 | 15 | POINT (206250.000 611250.000) | 269 | 1 | 9166LX | SB1 | Stembureau Gemeentehuis (postcode: 9166 LX) | 655 | 827 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 688.536284 |
2 | E2055N6105 | 20 | POINT (205750.000 610750.000) | 292 | 1 | 9166LX | SB1 | Stembureau Gemeentehuis (postcode: 9166 LX) | 655 | 827 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 672.375861 |
3 | E2060N6105 | 185 | POINT (206250.000 610750.000) | 293 | 1 | 9166LX | SB1 | Stembureau Gemeentehuis (postcode: 9166 LX) | 655 | 827 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 228.220493 |
4 | E2065N6105 | 340 | POINT (206750.000 610750.000) | 294 | 1 | 9166LX | SB1 | Stembureau Gemeentehuis (postcode: 9166 LX) | 655 | 827 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 389.974214 |
5 rows × 977 columns
df_nearest['dist'].plot(kind="hist", weights=df_nearest['INWONER'], figsize=(13,13), density=False, log=True).set_ylabel('Bevolking (Millioenen)')
Text(0, 0.5, 'Bevolking (Millioenen)')
Het was mooier geweest als we het konden filteren op alleen stemgerechtigden en niet op de gehele populatiedichtheid, maar het CBS geeft geen data vrij die daarbij helpt. Er is een categorie voor 0-14 jaar oude mensen, maar niet alle minderjarigen of niet stemgerechtigde. Het moet dus maar met totale bevolkingsdichtheid om een idee te krijgen.
nl_map_dst_zero_points["INWONER"].mask(nl_map_dst_zero_points["INWONER"] == -99997, 0, inplace=True)
nl_map_dst_zero_points.head()
df_nearest_zero = ckdnearest(nl_map_dst_zero_points.to_crs(epsg=28992), df_geojson_clean.to_crs(epsg=28992))
df_nearest_zero["INWONER"].dropna()
df_nearest_zero["dist"].dropna()
df_nearest_zero
c28992r500 | INWONER | geometry | savedindex | Stembureau | Adres | Locatie | description | Geldige stemmen | Opgeroepen | ... | Nationale Bond tegen Overheidszaken - DH | Haags Belang | INL Den Haag | Rosmalens Belang | De Bossche Groenen | "Leefbaar 's-Hertogenbosch" Paul Kagie | RAADSGROEPERING ''BOSCH-BELANG'' | gewoon ge-DREVEN | VOOR Den Bosch Joep Gersjes | dist | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | E2270N6190 | 0 | POINT (227250.000 619250.000) | 2 | 43 | SB43 | Stembureau Dorpshuis Pieterburen | 327 | 568 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 17241.922230 | |
1 | E2275N6190 | 0 | POINT (227750.000 619250.000) | 3 | 43 | SB43 | Stembureau Dorpshuis Pieterburen | 327 | 568 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 17285.083033 | |
2 | E2280N6190 | 0 | POINT (228250.000 619250.000) | 4 | 43 | SB43 | Stembureau Dorpshuis Pieterburen | 327 | 568 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 17342.557734 | |
3 | E2265N6185 | 0 | POINT (226750.000 618750.000) | 7 | 43 | SB43 | Stembureau Dorpshuis Pieterburen | 327 | 568 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16713.659349 | |
4 | E2270N6185 | 0 | POINT (227250.000 618750.000) | 8 | 43 | SB43 | Stembureau Dorpshuis Pieterburen | 327 | 568 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16743.256019 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
139997 | E1990N3070 | 0 | POINT (199250.000 307250.000) | 151102 | 1 | 6291AT | SB1 | Stembureau Gemeentehuis (Trouwkamer) (postcode... | 384 | 1592 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1939.206985 |
139998 | E1995N3070 | 0 | POINT (199750.000 307250.000) | 151103 | 1 | 6291AT | SB1 | Stembureau Gemeentehuis (Trouwkamer) (postcode... | 384 | 1592 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1923.094050 |
139999 | E1910N3065 | 0 | POINT (191250.000 306750.000) | 151105 | 7 | SB7 | Stembureau Gemeenschapshuis 't Patronaat | 442 | 882 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2880.233287 | |
140000 | E1920N3065 | 20 | POINT (192250.000 306750.000) | 151106 | 7 | SB7 | Stembureau Gemeenschapshuis 't Patronaat | 442 | 882 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2746.345509 | |
140001 | E1925N3065 | 0 | POINT (192750.000 306750.000) | 151107 | 7 | SB7 | Stembureau Gemeenschapshuis 't Patronaat | 442 | 882 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2813.494018 |
140002 rows × 977 columns
df_nearest.sort_values(by=['dist'], inplace=True)
df_nearest
c28992r500 | INWONER | geometry | savedindex | Stembureau | Adres | Locatie | description | Geldige stemmen | Opgeroepen | ... | Nationale Bond tegen Overheidszaken - DH | Haags Belang | INL Den Haag | Rosmalens Belang | De Bossche Groenen | "Leefbaar 's-Hertogenbosch" Paul Kagie | RAADSGROEPERING ''BOSCH-BELANG'' | gewoon ge-DREVEN | VOOR Den Bosch Joep Gersjes | dist | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
47198 | E1005N4315 | 1420 | POINT (100750.000 431750.000) | 103081 | 1 | 2981EA | SB1 | Stembureau Gemeentehuis (postcode: 2981 EA) | 1059 | 1228 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.835321 |
32760 | E1435N4655 | 155 | POINT (143750.000 465750.000) | 78211 | 6 | 3749AA | SB6 | Stembureau Dorpshuis de Furs (postcode: 3749 AA) | 208 | 1109 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4.000517 |
46560 | E1970N4335 | 910 | POINT (197250.000 433750.000) | 101861 | 51 | 6686BS | SB51 | Stembureau Ontmoetingscentrum Doornenburg (ma ... | 179 | 0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4.465340 |
38896 | E1245N4505 | 880 | POINT (124750.000 450750.000) | 88659 | 1 | 3417HL | SB1 | Stembureau Zalencentrum St. Joseph (postcode: ... | 779 | 1795 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5.703409 |
12114 | E2665N5370 | 630 | POINT (266750.000 537250.000) | 33802 | 235 | SB235 | Stembureau Protestantse kerk (di) | 147 | 0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 6.770528 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
22441 | E1670N4920 | 5 | POINT (167250.000 492250.000) | 59539 | 128 | SB128 | Stembureau Drive-In op parkeerplaats P2 | 120 | 845 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8114.571903 | |
65831 | E2100N3555 | 20 | POINT (210250.000 355750.000) | 146962 | 9 | 6075CW | SB9 | Stembureau Brede School De Berensprong (postco... | 745 | 1783 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8117.463711 |
22439 | E1590N4920 | 10 | POINT (159250.000 492250.000) | 59523 | 22 | 8245HW | SB22 | Stembureau Gymzaal Kindcentrum Warande (postco... | 413 | 1228 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8135.260944 |
22440 | E1620N4920 | 5 | POINT (162250.000 492250.000) | 59529 | 33 | 8226TA | SB33 | Stembureau Gymzaal De Borg (postcode: 8226 TA) | 472 | 1719 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8402.730770 |
22583 | E1595N4915 | 10 | POINT (159750.000 491750.000) | 59865 | 22 | 8245HW | SB22 | Stembureau Gymzaal Kindcentrum Warande (postco... | 413 | 1228 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8685.023942 |
67995 rows × 977 columns
df_nearest.plot.scatter(x = 'INWONER', y = 'dist', figsize=(13,13), xlabel="Inwoners per 500m² (laagste is 5)", ylabel="Afstand tot stemlokaal (meter)")
<AxesSubplot:xlabel='Inwoners per 500m² (laagste is 5)', ylabel='Afstand tot stemlokaal (meter)'>
df_nearest_zero.plot.scatter(x = 'INWONER', y = 'dist', figsize=(13,13), xlabel="Inwoners per 500m² (inclusief lege (<5 inwoners) vierkanten)", ylabel="Afstand tot stemlokaal (meter)")
<AxesSubplot:xlabel='Inwoners per 500m² (inclusief lege (<5 inwoners) vierkanten)', ylabel='Afstand tot stemlokaal (meter)'>
df_wims = pd.read_csv(r'../data/wims.csv')
print(df_wims)
_id Gemeente CBS gemeentecode Nummer stembureau \ 0 1 Valkenswaard GM0858 1 1 2 Valkenswaard GM0858 2 2 3 Valkenswaard GM0858 3 3 4 Valkenswaard GM0858 4 4 5 Valkenswaard GM0858 5 ... ... ... ... ... 9236 38711 Putten GM0273 3 9237 38712 Putten GM0273 10 9238 38713 Putten GM0273 8 9239 38714 Putten GM0273 13 9240 38715 Putten GM0273 6 Naam stembureau \ 0 Zorgcentrum Kempenhof 1 Buurtgebouw De Horizon 2 Speeltuin Geenhoven 3 Ontmoetingscentrum De zoete inval 4 Gymnastiekzaal 't Gegraaf ... ... 9236 Nieuwe Kerk 9237 Sporthal de Meeuwen 9238 School de Pelikaan 9239 De Samaritaan 9240 Verenigingsgebouw Stenenkamer Gebruiksdoel van het gebouw \ 0 gezondheidszorgfunctie 1 bijeenkomstfunctie 2 bijeenkomstfunctie 3 bijeenkomstfunctie 4 sportfunctie ... ... 9236 bijeenkomstfunctie 9237 sportfunctie 9238 onderwijsfunctie 9239 bijeenkomstfunctie,gezondheidszorgfunctie 9240 bijeenkomstfunctie Website locatie Wijknaam \ 0 https://www.valkenhof.nl/ NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN ... ... ... 9236 https://www.hervormdputten.nl/ NaN 9237 https://www.kvdemeeuwen.nl/ NaN 9238 https://www.pcbdepelikaan.nl/ NaN 9239 https://www.desamaritaanputten.nl/ NaN 9240 https://verenigingsgebouwsteenenkamer.jouwweb.nl/ NaN CBS wijknummer Buurtnaam ... Visuele hulpmiddelen \ 0 NaN NaN ... leesloep 1 NaN NaN ... leesloep 2 NaN NaN ... leesloep 3 NaN NaN ... leesloep 4 NaN NaN ... leesloep ... ... ... ... ... 9236 NaN NaN ... leesloep 9237 NaN NaN ... leesloep 9238 NaN NaN ... leesloep 9239 NaN NaN ... leesloep 9240 NaN NaN ... leesloep Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie \ 0 ja Valkenswaard Valkenswaard NaN 1 NaN Valkenswaard Valkenswaard NaN 2 NaN Valkenswaard Valkenswaard NaN 3 NaN Valkenswaard Valkenswaard NaN 4 NaN Valkenswaard Valkenswaard NaN ... ... ... ... ... 9236 ja Putten Putten ja 9237 NaN Putten Putten ja 9238 NaN Putten Putten ja 9239 ja Putten Putten ja 9240 NaN Putten Putten ja Contactgegevens gemeente Verkiezingswebsite gemeente \ 0 verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen 1 verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen 2 verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen 3 verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen 4 verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen ... ... ... 9236 verkiezingen@putten.nl http://www.putten.nl 9237 verkiezingen@putten.nl http://www.putten.nl 9238 verkiezingen@putten.nl http://www.putten.nl 9239 verkiezingen@putten.nl http://www.putten.nl 9240 verkiezingen@putten.nl http://www.putten.nl Verkiezingen ID \ 0 NaN NLODSGM0858stembureaus20220316009 1 NaN NLODSGM0858stembureaus20220316009 2 NaN NLODSGM0858stembureaus20220316009 3 NaN NLODSGM0858stembureaus20220316009 4 NaN NLODSGM0858stembureaus20220316009 ... ... ... 9236 NaN NLODSGM0273stembureaus20220316009 9237 NaN NLODSGM0273stembureaus20220316009 9238 NaN NLODSGM0273stembureaus20220316009 9239 NaN NLODSGM0273stembureaus20220316009 9240 NaN NLODSGM0273stembureaus20220316009 UUID 0 3a612b2151fa4ab491b9e331355e6258 1 9a01d765af0a467ea37f08d92db114ba 2 fc5869d33fbc4b06be659149fa615f4c 3 4427cc0b39e040ba8f75c333f19d66f0 4 a893bb9add324ce29769f1c39afcc48d ... ... 9236 5ce3ef64ced64343b09f03a95d09d275 9237 03b7138951f1475b9ca8328ee7365491 9238 25eb2c3d547a420094ee2f691e8bd383 9239 8bc3926806a74105a593e6a133b1306f 9240 609fd2e24c5b40b394174a84f7ca91af [9241 rows x 39 columns]
#de eerste vijf rijen zijn meta-data en kunnen we gerust weghalen voor nu
df_gr_gr = pd.read_csv(r'../data/stemmen/01_Groningen/osv4-3_telling_gr2022_groningen.csv', skiprows=5, header=None, delimiter=';')
print(df_gr_gr)
0 1 2 3 4 \ 0 Lijstnummer Aanduiding Volgnummer Naam kandidaat Totaal 1 Gebiednummer NaN NaN NaN NaN 2 Postcode NaN NaN NaN NaN 3 NaN opgeroepenen NaN NaN 194113 4 NaN geldige stempas NaN NaN 96830 .. ... ... ... ... ... 445 NaN NaN 5 Oetomo, A.D. 38 446 NaN NaN 6 Smid, D. 25 447 NaN NaN 7 van Welij, P.Z. 10 448 16 Blanco (Dokter, T.) NaN NaN 100 449 NaN NaN 1 Dokter, T. 100 5 \ 0 GRID Grafisch Museum Groningen 1 101 2 9712 JN 3 1396 4 560 .. ... 445 0 446 0 447 0 448 0 449 0 6 \ 0 Gemeente Groningen (locatie Kreupelstraat) 1 102 2 9712 HW 3 1311 4 469 .. ... 445 0 446 0 447 0 448 0 449 0 7 8 9 \ 0 Gemeente Groningen (locatie Kreupelstraat) Der Aa-kerk Der Aa-kerk 1 103 104 105 2 9712 HW 9711 JB 9711 JB 3 1311 1311 1311 4 491 595 607 .. ... ... ... 445 0 0 0 446 0 0 0 447 0 0 0 448 0 0 0 449 0 0 0 ... 175 176 177 178 \ 0 ... MFC 't Vinkhuys De Fontein Trefpunt Beijum Wijkcentrum Het Dok 1 ... 827 828 829 830 2 ... 9743 BJ 9741 EZ 9737 AB 9733 CA 3 ... 0 0 0 0 4 ... 369 503 367 537 .. ... ... ... ... ... 445 ... 0 0 0 0 446 ... 0 2 0 0 447 ... 0 0 0 0 448 ... 2 2 1 0 449 ... 2 2 1 0 179 180 \ 0 PKN Blister Ten Boer Buurtcentrum Stadspark 1 831 832 2 9791 CP 9727 HW 3 0 0 4 218 283 .. ... ... 445 0 0 446 0 0 447 0 0 448 0 2 449 0 2 181 182 \ 0 Kerk van J.C. van de H. der Laatste Dagen Maranathakerk 1 833 834 2 9728 AR 9721 PE 3 0 0 4 302 473 .. ... ... 445 0 0 446 3 0 447 0 1 448 0 0 449 0 0 183 184 0 Tennispark Vorenkamp (GLTB) Gemeentehuis Haren 1 835 836 2 9722 HJ 9751 AN 3 0 0 4 495 815 .. ... ... 445 0 0 446 0 0 447 0 0 448 0 0 449 0 0 [450 rows x 185 columns]
De data is heel gecompliceerd, dus we moeten het bruikbaar maken in pandas. Met hoe de data eruit ziet in een CSV in libre office willen we een constructie maken van de verschillende onderdelen. We hebben de data van de stemlokalen apart al, die kunnen we dus negeren. We willen de data van de lijsten apart hebben.
#TODO:mobiele stemlokalen eruit filteren die NIET 0,0 zijn
#TODO:datastandaard duitse verkiezingen stemlokaalafstand opzoeken