{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Die gesammelten Daten analysieren\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir haben bereits viele Daten gesammelt, kennen jedoch bislang nur wenige ihrer Eigenschaften.\n", "\n", "Unser Ziel ist es, einen Überblick über die darin enthaltenen Informationen zu gewinnen.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vorab müssen wieder die benötigten Bibliotheken importiert und Konfigurationen gesetzt werden.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import json\n", "from collections import defaultdict\n", "\n", "filename = \"nationalrat_raw.json\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Im Folgenden definieren wir eine _Funktion_.\n", "Diese Funktion erlaubt es uns, Daten schöner auszugeben.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def print_dict(d: dict):\n", " maxlen_keys = max(map(len, map(str, d.keys())))\n", " maxlen_values = max(map(len, map(str, d.values())))\n", " for key in d.keys():\n", " print(f\"{key:.<{maxlen_keys}}{d[key]:.>{maxlen_values+1}}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dann folgt das Laden der Daten.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "candidates = json.load(open(filename, encoding=\"utf-8\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wie viele Personen kandidieren für jede Partei?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "party_count = defaultdict(int) # Definiert den Zähler für Parteien\n", "\n", "for candidate in candidates: # Iteriere über alle Kandidierenden\n", " party = candidate.get(\"partyAbbreviation\") # Hole die Parteiabkürzung des Kandidierenden\n", " if party: # Wenn eine Parteiabkürzung vorhanden ist\n", " party_count[party] += 1 # Erhöhe den Zähler für diese Partei um 1\n", "\n", "\n", "party_count = dict(sorted(party_count.items(), key=lambda item: item[1], reverse=True)) # Sortieren nach Anzahl Kandidierende pro Partei\n", "print_dict(party_count)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wie sieht's aus mit dem Frauenanteil der Kandidierenden?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ein Dictionary für Frauen und Männer, eins nur für Frauen. Kandidierende ohne Eintrag beim Feld \"gender\" werden ignoriert\n", "all_candidates = defaultdict(int) # Objekt für Frauen und Männer\n", "female_only = defaultdict(int) # Objekt nur für Frauen\n", "\n", "# Iteriert über alle Kandidierenden und zählt Frauen und Männer pro Partei\n", "for candidate in candidates:\n", " party = candidate.get(\"partyAbbreviation\")\n", " gender = candidate.get(\"gender\")\n", " # Wenn die Kandidierende Person einer Partei zugeordnet ist\n", " if party: # and party_count[party] >= 10: # Nur Parteien mit mindestens 10 Kandidierenden\n", " # Wenn die Kandidierende Person weiblich ist\n", " if gender == \"f\":\n", " female_only[party] += 1\n", " all_candidates[party] += 1\n", " # Wenn die Kandidierende Person männlich ist\n", " if gender == \"m\":\n", " all_candidates[party] += 1\n", "\n", "# Berechnet den Frauenanteil\n", "age_share = {}\n", "for party_name, young in female_only.items():\n", " ratio = young / all_candidates[party_name]\n", " age_share[party_name] = f\"{ratio:.0%}\"\n", "age_share = dict(sorted(age_share.items(), key=lambda item: int(item[1].strip('%')), reverse=True))\n", "\n", "print_dict(age_share)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dasselbe können wir auch mit dem Alter machen. Im Folgenden analysieren wir, wie die Altersverteilung ausschaut.\n", "\n", "Wir wollen den Anteil an Kandidierenden berechnen, die Jünger als 40 (definierbar) sind.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "age_cutoff = 40\n", "\n", "# Ein Dictionary für Frauen und Männer, eins nur für Frauen. Kandidierende ohne Eintrag beim Feld \"gender\" werden ignoriert\n", "all_candidates = defaultdict(int) # Objekt für Frauen und Männer\n", "younger_only = defaultdict(int) # Objekt nur für Frauen\n", "\n", "# Iteriert über alle Kandidierenden und zählt Frauen und Männer pro Partei\n", "for candidate in candidates:\n", " party = candidate.get(\"partyAbbreviation\")\n", " age = 2024 - candidate.get(\"yearOfBirth\")\n", " # Wenn die Kandidierende Person einer Partei zugeordnet ist\n", " if party:\n", " # Wenn die Kandidierende Person jünger ist\n", " if age <= age_cutoff:\n", " younger_only[party] += 1\n", " all_candidates[party] += 1\n", " # Wenn die Kandidierende Person älter ist\n", " else:\n", " all_candidates[party] += 1\n", "\n", "# Berechnet den Altersanteil\n", "age_share = {}\n", "for party_name, young in younger_only.items():\n", " ratio = young / all_candidates[party_name]\n", " age_share[party_name] = f\"{ratio:.0%}\"\n", "age_share = dict(sorted(age_share.items(), key=lambda item: int(item[1].strip('%')), reverse=True))\n", "\n", "print_dict(age_share)" ] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 2 }