{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# First steps in data exploration\n", "> Ideas on how to start with a new data set\n", "\n", "- toc: true\n", "- branch: master\n", "- badges: true\n", "- comments: true\n", "- author: Konrad Wölms\n", "- categories: [first steps, python, jupyter]" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests\n", "import os\n", "data_url = 'http://www.berlin.de/sen/finanzen/dokumentendownload/haushalt/haushaltsplan-/haushaltsplan-2018-2019/20180125_dhh18_19.csv'\n", "file = 'berlin_budget.csv'\n", "if not os.path.exists(file):\n", " with open(file, 'wb') as file:\n", " resp = requests.get(data_url)\n", " file.write(resp.content)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For sharing more complex data analyses on fastPages, a step like this might not be very\n", "interesting to the ready and might quite likely be hidden by starting the cell with `#hide`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Small nuisance when loading data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now even with a `.csv` file locally present the are a few annoying errors that that might prevent somebody from simply importing. What we would all like to to do, is to simply call `pd.read_csv('berlin_budget.csv')`\n", "\n", "\n", "### Encoding\n", "\n", "This is probably one of the most annoying data aspects that data scientists sometimes have to deal with. Unfortunately when encoding errors occur one has to deal with them, and manually inspecting the data files in a text editor or excel, generally does not help loading them into python. In practical terms most files today are encoded in what is called `UTF-8`, and that is the standard that python applications assume. The good thing is most functions that deal with files, like `open` or `pd.read_csv` let you specify the encoding. Unfortunately it can be overwhelming what to pick when confronted with this issue for the first time. Legacy windows applications, which have been and probably still are present in many public institutions and agencies, used different encodings. Most commonly (for western files) an encoding called `CP1252` was used. Therefore we will also specify this encoding when reading in the data.\n", "\n", "> Tip: When you get encoding errors for files using Latin characters, try CP1252.\n", "\n", "### Separator\n", "\n", "The next issue with this file is the separator, which is actually not `,`. In the best cases one can still read in the files and then realize this later on. Sometimes this can fail, however. As is the case with our budget data set. In such a case the file needs to be either inspected to find the right separator, or common separators can simply be tried (for instance `[',',';','\\t']`). In this case `;` lets us load the data, which is a typical separator for `.csv` files in Germany.\n", "\n", "### Number formatting\n", "\n", "While being annoying as well number formatting usually does not prevent one from loading data, but simply making manipulating it more difficult. Here we again set the typical German values `decimal = ','` and `thousands = '.'`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "berlin_budget_raw = pd.read_csv('berlin_budget.csv', sep=';', decimal=',', thousands='.', encoding='CP1252')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## First steps with raw data\n", "\n", "Now that we have imported the raw data we'll go through some typical starting points. These\n", "are \n", "- checking the shape\n", "- looking at example rows\n", "- looking at the data types\n", "- checking for missing data\n", "- check different values for discrete variables\n", "\n", "### Shape\n", "\n", "A first helpful thing is usually, to look at the shape of the data with `berlin_budget_raw.shape`. For this data set it shows that we have 20828 rows and 25 columns. This means that there are more rows, than we can look at manually and there are more columns than we can conveniently look it. This is often the case and the data was chosen as an example of how to deal with this. The strategy to deal with the rows, is to use function that help us analyze the entire content to get an impression. The strategy for the columns is to use additional information we find to exclude as many columns as possible for initial analyses, to make the data easier to handle." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(20828, 25)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#hide\n", "berlin_budget_raw.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example rows\n", "\n", "There are several methods to get sample rows of a dataframe. The most typical ones in pandas are `.head`, `.tail` and `.sample`, which return the first 5 rows, last 5 rows or a random 5 rows on a call." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TypBezeichnungBereichBereichsbezeichnungEinzelplanEinzelplanbezeichnungKapitelKapitelbezeichnungHauptgruppeHauptgruppenbezeichnung...HauptfunktionsbezeichnungOberfunktionOberfunktionsbezeichnungFunktionFunktionsbezeichnungTitelartTitelTitelbezeichnungAnsatz 2018 in €Ansatz 2019 in €
02.0Verfassungsorgane30.0Hauptverwaltung1.0Abgeordnetenhaus100.0Abgeordnetenhaus1.0Verwaltungseinnahmen, Einnahmen aus Schuldendi......Allgemeine Dienste1.0Politische Führung und zentrale Verwaltung11.0Politische FührungEinnahmetitel11201.0Geldstrafen, Geldbußen, Verwarnungs- und Zwang...1000.01000.0
12.0Verfassungsorgane30.0Hauptverwaltung1.0Abgeordnetenhaus100.0Abgeordnetenhaus1.0Verwaltungseinnahmen, Einnahmen aus Schuldendi......Allgemeine Dienste1.0Politische Führung und zentrale Verwaltung11.0Politische FührungEinnahmetitel11906.0Ersatz von Fernmeldegebühren1000.01000.0
22.0Verfassungsorgane30.0Hauptverwaltung1.0Abgeordnetenhaus100.0Abgeordnetenhaus1.0Verwaltungseinnahmen, Einnahmen aus Schuldendi......Allgemeine Dienste1.0Politische Führung und zentrale Verwaltung11.0Politische FührungEinnahmetitel11961.0Erstattung von Steuerbeträgen1000.01000.0
32.0Verfassungsorgane30.0Hauptverwaltung1.0Abgeordnetenhaus100.0Abgeordnetenhaus1.0Verwaltungseinnahmen, Einnahmen aus Schuldendi......Allgemeine Dienste1.0Politische Führung und zentrale Verwaltung11.0Politische FührungEinnahmetitel11979.0Verschiedene Einnahmen10000.010000.0
42.0Verfassungsorgane30.0Hauptverwaltung1.0Abgeordnetenhaus100.0Abgeordnetenhaus1.0Verwaltungseinnahmen, Einnahmen aus Schuldendi......Allgemeine Dienste1.0Politische Führung und zentrale Verwaltung11.0Politische FührungEinnahmetitel12401.0Mieten für Grundstücke, Gebäude und Räume45000.045000.0
\n", "

5 rows × 25 columns

\n", "
" ], "text/plain": [ " Typ Bezeichnung Bereich Bereichsbezeichnung Einzelplan \\\n", "0 2.0 Verfassungsorgane 30.0 Hauptverwaltung 1.0 \n", "1 2.0 Verfassungsorgane 30.0 Hauptverwaltung 1.0 \n", "2 2.0 Verfassungsorgane 30.0 Hauptverwaltung 1.0 \n", "3 2.0 Verfassungsorgane 30.0 Hauptverwaltung 1.0 \n", "4 2.0 Verfassungsorgane 30.0 Hauptverwaltung 1.0 \n", "\n", " Einzelplanbezeichnung Kapitel Kapitelbezeichnung Hauptgruppe \\\n", "0 Abgeordnetenhaus 100.0 Abgeordnetenhaus 1.0 \n", "1 Abgeordnetenhaus 100.0 Abgeordnetenhaus 1.0 \n", "2 Abgeordnetenhaus 100.0 Abgeordnetenhaus 1.0 \n", "3 Abgeordnetenhaus 100.0 Abgeordnetenhaus 1.0 \n", "4 Abgeordnetenhaus 100.0 Abgeordnetenhaus 1.0 \n", "\n", " Hauptgruppenbezeichnung ... \\\n", "0 Verwaltungseinnahmen, Einnahmen aus Schuldendi... ... \n", "1 Verwaltungseinnahmen, Einnahmen aus Schuldendi... ... \n", "2 Verwaltungseinnahmen, Einnahmen aus Schuldendi... ... \n", "3 Verwaltungseinnahmen, Einnahmen aus Schuldendi... ... \n", "4 Verwaltungseinnahmen, Einnahmen aus Schuldendi... ... \n", "\n", " Hauptfunktionsbezeichnung Oberfunktion \\\n", "0 Allgemeine Dienste 1.0 \n", "1 Allgemeine Dienste 1.0 \n", "2 Allgemeine Dienste 1.0 \n", "3 Allgemeine Dienste 1.0 \n", "4 Allgemeine Dienste 1.0 \n", "\n", " Oberfunktionsbezeichnung Funktion Funktionsbezeichnung \\\n", "0 Politische Führung und zentrale Verwaltung 11.0 Politische Führung \n", "1 Politische Führung und zentrale Verwaltung 11.0 Politische Führung \n", "2 Politische Führung und zentrale Verwaltung 11.0 Politische Führung \n", "3 Politische Führung und zentrale Verwaltung 11.0 Politische Führung \n", "4 Politische Führung und zentrale Verwaltung 11.0 Politische Führung \n", "\n", " Titelart Titel Titelbezeichnung \\\n", "0 Einnahmetitel 11201.0 Geldstrafen, Geldbußen, Verwarnungs- und Zwang... \n", "1 Einnahmetitel 11906.0 Ersatz von Fernmeldegebühren \n", "2 Einnahmetitel 11961.0 Erstattung von Steuerbeträgen \n", "3 Einnahmetitel 11979.0 Verschiedene Einnahmen \n", "4 Einnahmetitel 12401.0 Mieten für Grundstücke, Gebäude und Räume \n", "\n", " Ansatz 2018 in € Ansatz 2019 in € \n", "0 1000.0 1000.0 \n", "1 1000.0 1000.0 \n", "2 1000.0 1000.0 \n", "3 10000.0 10000.0 \n", "4 45000.0 45000.0 \n", "\n", "[5 rows x 25 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "berlin_budget_raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first 5 rows show us many numeric and string columns and show that repeating string columns seem to coincide with repeating numeric columns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data types\n", "\n", "It often helps to look at the data types of the data frame using `berlin_budget_raw.dtypes`. We find" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Typ float64\n", "Bezeichnung object\n", "Bereich float64\n", "Bereichsbezeichnung object\n", "Einzelplan float64\n", "Einzelplanbezeichnung object\n", "Kapitel float64\n", "Kapitelbezeichnung object\n", "Hauptgruppe float64\n", "Hauptgruppenbezeichnung object\n", "Obergruppe float64\n", "Obergruppenbezeichnung object\n", "Gruppe float64\n", "Gruppenbezeichnung object\n", "Hauptfunktion float64\n", "Hauptfunktionsbezeichnung object\n", "Oberfunktion float64\n", "Oberfunktionsbezeichnung object\n", "Funktion float64\n", "Funktionsbezeichnung object\n", "Titelart object\n", "Titel float64\n", "Titelbezeichnung object\n", "Ansatz 2018 in € float64\n", "Ansatz 2019 in € float64\n", "dtype: object" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collapse-output\n", "berlin_budget_raw.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows again that many columns with similar names come as a float column together with another object (string) column. We can also see that there are two columns containing €, which are likely to contain the actual budget data. This already suggest the following strategy for reducing the columns. For each pair of columns that seem to belong together, we might be able to drop one of the two for initial analyses. For the budget column, it is probably a good idea to start with only one of them.\n", "\n", "> Warning: Data types might be wrong if there were any problems or ambiguities when reading in a file. When in doubt columns with an object (string) data type should be inspected manually to check whether they really contain text." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Missing values\n", "\n", "Missing data can cause all sorts of issues. And it is a good idea to check for missing data and deal with it. One of the easiest checks is the following, which is a trick based on the ability to sum boolean values." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Typ 1\n", "Bezeichnung 1\n", "Bereich 1\n", "Bereichsbezeichnung 1\n", "Einzelplan 1\n", "Einzelplanbezeichnung 1\n", "Kapitel 1\n", "Kapitelbezeichnung 1\n", "Hauptgruppe 1\n", "Hauptgruppenbezeichnung 1\n", "Obergruppe 1\n", "Obergruppenbezeichnung 1\n", "Gruppe 1\n", "Gruppenbezeichnung 1\n", "Hauptfunktion 1\n", "Hauptfunktionsbezeichnung 1\n", "Oberfunktion 1\n", "Oberfunktionsbezeichnung 1\n", "Funktion 1\n", "Funktionsbezeichnung 1\n", "Titelart 1\n", "Titel 1\n", "Titelbezeichnung 1\n", "Ansatz 2018 in € 1\n", "Ansatz 2019 in € 1\n", "dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collapse-output\n", "berlin_budget_raw.isna().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows that there is exactly one missing value for each row, which is not too bad. Additionally it suggests, that there is probably an empty row, instead of randomly missing data. And true enough, if we were to check `berlin_budget_raw.tail()` we would see that every value in the last row is missing. Such cases are easy to deal with, because we can just drop that row." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Different values\n", "One of the most useful approaches to get an impression of categorical data is to count how many different values are in a columns. The build in `.nunique()` method in pandas does exactly this. To get a little more structure into it, it helps to sort the results right away." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Titelart 2\n", "Typ 3\n", "Bezeichnung 3\n", "Hauptfunktionsbezeichnung 9\n", "Hauptfunktion 9\n", "Hauptgruppenbezeichnung 10\n", "Hauptgruppe 10\n", "Bereichsbezeichnung 13\n", "Bereich 13\n", "Einzelplan 31\n", "Einzelplanbezeichnung 31\n", "Obergruppenbezeichnung 49\n", "Oberfunktionsbezeichnung 50\n", "Oberfunktion 52\n", "Obergruppe 58\n", "Funktionsbezeichnung 138\n", "Funktion 138\n", "Gruppenbezeichnung 150\n", "Gruppe 173\n", "Kapitelbezeichnung 284\n", "Kapitel 285\n", "Titel 1739\n", "Titelbezeichnung 1925\n", "Ansatz 2018 in € 3444\n", "Ansatz 2019 in € 3449\n", "dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collapse-output\n", "berlin_budget_raw.nunique().sort_values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many interesting information here. First of all `Titelart` only has two different values. For budget data this means that it is a good candidate to indicate whether something is an expense or a funding source. Furthermore many of the categories with similar names have very similar distinct value counts, supporting our earlier strategy idea of only using one of the in first analyses. We also see that some categories have only a small number of different values. These are more suited for initial analyses, because they keep it simple and allow an easy inspection of aggregated data, as will be illustrated below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Tip: When calculating several column based quantites `pd.concat` can help to summarize them." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dtypesmissingdistinct_values
Titelartobject12
Typfloat6413
Bezeichnungobject13
Hauptfunktionsbezeichnungobject19
Hauptfunktionfloat6419
Hauptgruppenbezeichnungobject110
Hauptgruppefloat64110
Bereichsbezeichnungobject113
Bereichfloat64113
Einzelplanfloat64131
Einzelplanbezeichnungobject131
Obergruppenbezeichnungobject149
Oberfunktionsbezeichnungobject150
Oberfunktionfloat64152
Obergruppefloat64158
Funktionsbezeichnungobject1138
Funktionfloat641138
Gruppenbezeichnungobject1150
Gruppefloat641173
Kapitelbezeichnungobject1284
Kapitelfloat641285
Titelfloat6411739
Titelbezeichnungobject11925
Ansatz 2018 in €float6413444
Ansatz 2019 in €float6413449
\n", "
" ], "text/plain": [ " dtypes missing distinct_values\n", "Titelart object 1 2\n", "Typ float64 1 3\n", "Bezeichnung object 1 3\n", "Hauptfunktionsbezeichnung object 1 9\n", "Hauptfunktion float64 1 9\n", "Hauptgruppenbezeichnung object 1 10\n", "Hauptgruppe float64 1 10\n", "Bereichsbezeichnung object 1 13\n", "Bereich float64 1 13\n", "Einzelplan float64 1 31\n", "Einzelplanbezeichnung object 1 31\n", "Obergruppenbezeichnung object 1 49\n", "Oberfunktionsbezeichnung object 1 50\n", "Oberfunktion float64 1 52\n", "Obergruppe float64 1 58\n", "Funktionsbezeichnung object 1 138\n", "Funktion float64 1 138\n", "Gruppenbezeichnung object 1 150\n", "Gruppe float64 1 173\n", "Kapitelbezeichnung object 1 284\n", "Kapitel float64 1 285\n", "Titel float64 1 1739\n", "Titelbezeichnung object 1 1925\n", "Ansatz 2018 in € float64 1 3444\n", "Ansatz 2019 in € float64 1 3449" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collapse-hide\n", "#collapse-output\n", "pd.concat(\n", " [\n", " berlin_budget_raw.dtypes.rename('dtypes'),\n", " berlin_budget_raw.isna().sum().rename('missing'),\n", " berlin_budget_raw.nunique().rename('distinct_values')\n", " ]\n", " ,axis=1\n", ").sort_values('distinct_values')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simplified Data\n", "\n", "With the analyses above we create the following simplified data as follows.\n", "\n", "1. We only keep categorical columns with a small number of values (<=13)\n", "2. We only keep the string version of the categorical category\n", "3. We only keep the 2018 budget column\n", "4. We drop the missing data\n", "\n", "We store results in `berlin_budget` and have a look at some samples." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#hide\n", "retained_columns = ['Titelart','Bezeichnung','Hauptfunktionsbezeichnung','Hauptgruppenbezeichnung','Bereichsbezeichnung','Ansatz 2018 in €']\n", "berlin_budget = berlin_budget_raw.loc[:,retained_columns].dropna()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TitelartBezeichnungHauptfunktionsbezeichnungHauptgruppenbezeichnungBereichsbezeichnungAnsatz 2018 in €
8616EinnahmetitelBezirkeSoziale Sicherung, Familie und Jugend, Arbeits...Einnahmen aus Zuweisungen und Zuschüssen mit A...Friedrichshain-Kreuzberg1000.0
9789EinnahmetitelBezirkeSoziale Sicherung, Familie und Jugend, Arbeits...Einnahmen aus Zuweisungen und Zuschüssen mit A...Pankow1000.0
19183AusgabetitelBezirkeSoziale Sicherung, Familie und Jugend, Arbeits...Ausgaben für Zuweisungen und Zuschüsse mit Aus...Lichtenberg1000.0
1344AusgabetitelSenatsverwaltungenSoziale Sicherung, Familie und Jugend, Arbeits...Ausgaben für Zuweisungen und Zuschüsse mit Aus...Hauptverwaltung490000.0
8132AusgabetitelBezirkeBildungswesen, Wissenschaft, Forschung, kultur...PersonalausgabenFriedrichshain-Kreuzberg182000.0
\n", "
" ], "text/plain": [ " Titelart Bezeichnung \\\n", "8616 Einnahmetitel Bezirke \n", "9789 Einnahmetitel Bezirke \n", "19183 Ausgabetitel Bezirke \n", "1344 Ausgabetitel Senatsverwaltungen \n", "8132 Ausgabetitel Bezirke \n", "\n", " Hauptfunktionsbezeichnung \\\n", "8616 Soziale Sicherung, Familie und Jugend, Arbeits... \n", "9789 Soziale Sicherung, Familie und Jugend, Arbeits... \n", "19183 Soziale Sicherung, Familie und Jugend, Arbeits... \n", "1344 Soziale Sicherung, Familie und Jugend, Arbeits... \n", "8132 Bildungswesen, Wissenschaft, Forschung, kultur... \n", "\n", " Hauptgruppenbezeichnung \\\n", "8616 Einnahmen aus Zuweisungen und Zuschüssen mit A... \n", "9789 Einnahmen aus Zuweisungen und Zuschüssen mit A... \n", "19183 Ausgaben für Zuweisungen und Zuschüsse mit Aus... \n", "1344 Ausgaben für Zuweisungen und Zuschüsse mit Aus... \n", "8132 Personalausgaben \n", "\n", " Bereichsbezeichnung Ansatz 2018 in € \n", "8616 Friedrichshain-Kreuzberg 1000.0 \n", "9789 Pankow 1000.0 \n", "19183 Lichtenberg 1000.0 \n", "1344 Hauptverwaltung 490000.0 \n", "8132 Friedrichshain-Kreuzberg 182000.0 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "berlin_budget.sample(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This already simplified the data a lot and brought it down from 25 to 6 columns!. At this point one can more easily get started with more concrete analyses. In This post we restrict ourselves to two simple examples. A consistency check regarding the budget's spending and funding. And a simple overview plot about different spending." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Budget Consistency\n", "\n", "We've already pointed out that `Titleart` is a good distinguish expenses and funding sources. Such a hypotheses can easily be checked with the data." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Titelart\n", "Ausgabetitel 2.860320e+10\n", "Einnahmetitel 2.860320e+10\n", "Name: Ansatz 2018 in €, dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "berlin_budget.groupby('Titelart')['Ansatz 2018 in €'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This works out. With a little bit of domain knowledge about Berlin itself we realized that the column `Bereichsbezeichung` contains mostly the different districts of Berlin. So a reasonable followup check is to do the same analysis on a district level. This also works out." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TitelartAusgabetitelEinnahmetitel
Bereichsbezeichnung
Charlottenburg-Wilmersdorf7.046985e+087.046985e+08
Friedrichshain-Kreuzberg7.189672e+087.189672e+08
Hauptverwaltung1.947634e+101.947634e+10
Lichtenberg8.912989e+088.912989e+08
Marzahn-Hellersdorf6.990315e+086.990315e+08
Mitte1.026627e+091.026627e+09
Neukölln9.115210e+089.115210e+08
Pankow9.365851e+089.365851e+08
Reinickendorf6.343956e+086.343956e+08
Spandau6.432431e+086.432431e+08
Steglitz-Zehlendorf5.855771e+085.855771e+08
Tempelhof-Schöneberg7.978415e+087.978415e+08
Treptow-Köpenick5.770762e+085.770762e+08
\n", "
" ], "text/plain": [ "Titelart Ausgabetitel Einnahmetitel\n", "Bereichsbezeichnung \n", "Charlottenburg-Wilmersdorf 7.046985e+08 7.046985e+08\n", "Friedrichshain-Kreuzberg 7.189672e+08 7.189672e+08\n", "Hauptverwaltung 1.947634e+10 1.947634e+10\n", "Lichtenberg 8.912989e+08 8.912989e+08\n", "Marzahn-Hellersdorf 6.990315e+08 6.990315e+08\n", "Mitte 1.026627e+09 1.026627e+09\n", "Neukölln 9.115210e+08 9.115210e+08\n", "Pankow 9.365851e+08 9.365851e+08\n", "Reinickendorf 6.343956e+08 6.343956e+08\n", "Spandau 6.432431e+08 6.432431e+08\n", "Steglitz-Zehlendorf 5.855771e+08 5.855771e+08\n", "Tempelhof-Schöneberg 7.978415e+08 7.978415e+08\n", "Treptow-Köpenick 5.770762e+08 5.770762e+08" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collapse-hide\n", "berlin_budget.groupby(['Bereichsbezeichnung','Titelart'])['Ansatz 2018 in €'].sum().unstack()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### First bar plots\n", "\n", "A quantities dependence on a few categories can be nicely visualized using bar plots. This is another advantage of starting with columns containing few different elements when analyzing a new data set. As an illustration we pick `Hauptfunktionsbezeichnung` and plot spending against it. often two simple tricks help with the visualization in these cases.\n", "1. The use of horizontal bar charts, because it makes category names easier to read.\n", "2. Sorting the values before plotting them, which makes everything easier to compare.\n", "\n", "In our example we get{% fn 1 %}:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "#hide\n", "import matplotlib.pyplot as plt\n", "plt.style.use('seaborn')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(\n", " berlin_budget\n", " .query('Titelart == \"Ausgabetitel\"')\n", " .groupby('Hauptfunktionsbezeichnung')['Ansatz 2018 in €'].sum()\n", " .sort_values()\n", " .plot.barh()\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "This article gave a concrete example how to start tackling a real life data set. We primarily showed how to analyze and most importantly reduce the available data to get a manageable starting point. This often boils down to identifying a meaningful subset of columns that are suited for initial analysis and plots. This is particularly helpful in the absence of documentation or good domain knowledge and we hope it will hep the readers to get started with data that interests them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "{{ 'We also used a matplotlib style for prettier output inside the post.' | fndetail: 1 }}" ] } ], "metadata": { "kernelspec": { "display_name": "datenguidepy-dev", "language": "python", "name": "datenguidepy-dev" }, "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.7.9" }, "toc-autonumbering": false, "toc-showcode": false, "toc-showmarkdowntxt": false, "toc-showtags": false }, "nbformat": 4, "nbformat_minor": 4 }