In dit artikel duiken we diep in de gegevens van Nederlandse gemeenten op basis van geboortelanden, van de ruwe data tot een boeiende interactieve visualisatie.
Met behulp van de cbsodata-bibliotheek verzamelen we gedetailleerde bevolkingsgegevens per nationaliteit voor het jaar 2023. Dankzij slimme filtering en coding identificeren we vervolgens per gemeente de twee meest voorkomende Nationaliteiten.
Code
import cbsodataimport pandas as pdimport geopandas as gpdimport altair as altimport topojson as tp# list of nationaliteit codesnatcodes_landen = ['NAT9278','NAT9281','NAT9292','NAT9300','NAT9301','NAT9303','NAT9307','NAT9310','NAT9322','NAT9324','NAT9326','NAT9330','NAT9332','NAT9336','NAT9338','NAT9345','NAT9346','NAT9348','NAT9349','NAT9350','NAT9351','NAT9353','NAT9356','NAT9357','NAT9368','NAT9372','NAT9377','NAT9387','NAT9403','NAT9406','NAT9409','NAT9410','NAT9415','NAT9416','NAT9417','NAT9418','NAT9436','NAT9440','NAT9442','NAT9444','NAT9448','NAT9454','NAT9458','NAT9470','NAT9473','NAT9480']filter_natcodes =''.join([f"(Nationaliteit eq '{natcode}') or "for natcode in natcodes_landen]).rstrip(' or ')filter_natcodes# collect data for selection of nationalitiesdf = pd.DataFrame(cbsodata.get_data( table_id='85644NED', select=['Bevolking_1', 'Nationaliteit', 'RegioS'], filters=f"((Geslacht eq 'T001038')) and ((Leeftijd eq '10000')) and ({filter_natcodes}) and ((Perioden eq '2023JJ00')) and ((substringof('GM',RegioS)))"))df = df.dropna(subset='Bevolking_1', how='any')# get 2nd largest groups for eacht gemeentedf_max_2per_gemeente = df.loc[df.groupby('RegioS')['Bevolking_1'].nlargest(2).reset_index(level=0, drop=True).index]# split in two dataframesdf_pop_one = df.loc[df_max_2per_gemeente.groupby('RegioS')['Bevolking_1'].head(1).index]df_pop_two = df.loc[df_max_2per_gemeente.groupby('RegioS')['Bevolking_1'].tail(1).index]# load IDs of each gemeentedf_regioscodes = pd.read_csv('RegioSCodes.csv', sep=';')df_gemcodes = df_regioscodes[df_regioscodes.Identifier.str.startswith('GM')]# combine with our data from CBSdf_pop_one_gemeente_id = pd.merge(df_gemcodes[['Identifier', 'Title']], df_pop_one, right_on='RegioS', left_on='Title', how='left').drop('Title', axis=1)df_pop_two_gemeente_id = pd.merge(df_gemcodes[['Identifier', 'Title']], df_pop_two, right_on='RegioS', left_on='Title', how='left').drop('Title', axis=1)# load geometry of each gemeentegeodata_url ='gemeenten_2023.geo.json'gemeentegrenzen = gpd.read_file(geodata_url, driver='GeoJSON')gemeentegrenzen = tp.Topology(gemeentegrenzen, toposimplify=1000, topoquantize=1000).to_gdf()# connect CBS-data to geometroe wit gemcodesdf_pop_one_gemeente_id_geom = pd.merge(gemeentegrenzen[['statcode', 'statnaam', 'geometry']], df_pop_one_gemeente_id, right_on='Identifier', left_on='statcode', how='left').drop(['RegioS', 'Identifier', 'statcode'], axis=1)df_pop_two_gemeente_id_geom = pd.merge(gemeentegrenzen[['statcode', 'statnaam', 'geometry']], df_pop_two_gemeente_id, right_on='Identifier', left_on='statcode', how='left').drop(['RegioS', 'Identifier', 'statcode'], axis=1)# rename columnsdf_pop_one_gemeente_id_geom.columns = ['Gemeente', 'geometry', 'Aantal', 'Nationaliteit']df_pop_two_gemeente_id_geom.columns = ['Gemeente', 'geometry', 'Aantal', 'Nationaliteit']
Met Altair zijn we in staat om levendige kaarten en staafdiagrammen te creëren. Kleurrijke details, vormen en interactieve elementen maken de data niet alleen toegankelijk, maar ook boeiend. Verken de gegevens op jouw eigen tempo met legenda’s en selectiemogelijkheden.
De kaart is hoverbaar en de legenda items zijn klikbaar. Ergens in de legenda niet op een naam klikken maakt de selectie ongedaan.
Deze analyse onthult inzichten in de diversiteit van nationaliteiten binnen Nederlandse gemeenten. De interactieve visualisatie nodigt je uit om verder te ontdekken, waardoor je een levendig beeld krijgt van de diverse culturen in Nederland.
Klaar om de diversiteit binnen Nederlandse gemeenten te verkennen? Ontdek de diversiteit van de Nederlandse samenleving per gemeente.