{
"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",
"
Typ
\n",
"
Bezeichnung
\n",
"
Bereich
\n",
"
Bereichsbezeichnung
\n",
"
Einzelplan
\n",
"
Einzelplanbezeichnung
\n",
"
Kapitel
\n",
"
Kapitelbezeichnung
\n",
"
Hauptgruppe
\n",
"
Hauptgruppenbezeichnung
\n",
"
...
\n",
"
Hauptfunktionsbezeichnung
\n",
"
Oberfunktion
\n",
"
Oberfunktionsbezeichnung
\n",
"
Funktion
\n",
"
Funktionsbezeichnung
\n",
"
Titelart
\n",
"
Titel
\n",
"
Titelbezeichnung
\n",
"
Ansatz 2018 in €
\n",
"
Ansatz 2019 in €
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2.0
\n",
"
Verfassungsorgane
\n",
"
30.0
\n",
"
Hauptverwaltung
\n",
"
1.0
\n",
"
Abgeordnetenhaus
\n",
"
100.0
\n",
"
Abgeordnetenhaus
\n",
"
1.0
\n",
"
Verwaltungseinnahmen, Einnahmen aus Schuldendi...
\n",
"
...
\n",
"
Allgemeine Dienste
\n",
"
1.0
\n",
"
Politische Führung und zentrale Verwaltung
\n",
"
11.0
\n",
"
Politische Führung
\n",
"
Einnahmetitel
\n",
"
11201.0
\n",
"
Geldstrafen, Geldbußen, Verwarnungs- und Zwang...
\n",
"
1000.0
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
1
\n",
"
2.0
\n",
"
Verfassungsorgane
\n",
"
30.0
\n",
"
Hauptverwaltung
\n",
"
1.0
\n",
"
Abgeordnetenhaus
\n",
"
100.0
\n",
"
Abgeordnetenhaus
\n",
"
1.0
\n",
"
Verwaltungseinnahmen, Einnahmen aus Schuldendi...
\n",
"
...
\n",
"
Allgemeine Dienste
\n",
"
1.0
\n",
"
Politische Führung und zentrale Verwaltung
\n",
"
11.0
\n",
"
Politische Führung
\n",
"
Einnahmetitel
\n",
"
11906.0
\n",
"
Ersatz von Fernmeldegebühren
\n",
"
1000.0
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
2
\n",
"
2.0
\n",
"
Verfassungsorgane
\n",
"
30.0
\n",
"
Hauptverwaltung
\n",
"
1.0
\n",
"
Abgeordnetenhaus
\n",
"
100.0
\n",
"
Abgeordnetenhaus
\n",
"
1.0
\n",
"
Verwaltungseinnahmen, Einnahmen aus Schuldendi...
\n",
"
...
\n",
"
Allgemeine Dienste
\n",
"
1.0
\n",
"
Politische Führung und zentrale Verwaltung
\n",
"
11.0
\n",
"
Politische Führung
\n",
"
Einnahmetitel
\n",
"
11961.0
\n",
"
Erstattung von Steuerbeträgen
\n",
"
1000.0
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
3
\n",
"
2.0
\n",
"
Verfassungsorgane
\n",
"
30.0
\n",
"
Hauptverwaltung
\n",
"
1.0
\n",
"
Abgeordnetenhaus
\n",
"
100.0
\n",
"
Abgeordnetenhaus
\n",
"
1.0
\n",
"
Verwaltungseinnahmen, Einnahmen aus Schuldendi...
\n",
"
...
\n",
"
Allgemeine Dienste
\n",
"
1.0
\n",
"
Politische Führung und zentrale Verwaltung
\n",
"
11.0
\n",
"
Politische Führung
\n",
"
Einnahmetitel
\n",
"
11979.0
\n",
"
Verschiedene Einnahmen
\n",
"
10000.0
\n",
"
10000.0
\n",
"
\n",
"
\n",
"
4
\n",
"
2.0
\n",
"
Verfassungsorgane
\n",
"
30.0
\n",
"
Hauptverwaltung
\n",
"
1.0
\n",
"
Abgeordnetenhaus
\n",
"
100.0
\n",
"
Abgeordnetenhaus
\n",
"
1.0
\n",
"
Verwaltungseinnahmen, Einnahmen aus Schuldendi...
\n",
"
...
\n",
"
Allgemeine Dienste
\n",
"
1.0
\n",
"
Politische Führung und zentrale Verwaltung
\n",
"
11.0
\n",
"
Politische Führung
\n",
"
Einnahmetitel
\n",
"
12401.0
\n",
"
Mieten für Grundstücke, Gebäude und Räume
\n",
"
45000.0
\n",
"
45000.0
\n",
"
\n",
" \n",
"
\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",
"
dtypes
\n",
"
missing
\n",
"
distinct_values
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Titelart
\n",
"
object
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
Typ
\n",
"
float64
\n",
"
1
\n",
"
3
\n",
"
\n",
"
\n",
"
Bezeichnung
\n",
"
object
\n",
"
1
\n",
"
3
\n",
"
\n",
"
\n",
"
Hauptfunktionsbezeichnung
\n",
"
object
\n",
"
1
\n",
"
9
\n",
"
\n",
"
\n",
"
Hauptfunktion
\n",
"
float64
\n",
"
1
\n",
"
9
\n",
"
\n",
"
\n",
"
Hauptgruppenbezeichnung
\n",
"
object
\n",
"
1
\n",
"
10
\n",
"
\n",
"
\n",
"
Hauptgruppe
\n",
"
float64
\n",
"
1
\n",
"
10
\n",
"
\n",
"
\n",
"
Bereichsbezeichnung
\n",
"
object
\n",
"
1
\n",
"
13
\n",
"
\n",
"
\n",
"
Bereich
\n",
"
float64
\n",
"
1
\n",
"
13
\n",
"
\n",
"
\n",
"
Einzelplan
\n",
"
float64
\n",
"
1
\n",
"
31
\n",
"
\n",
"
\n",
"
Einzelplanbezeichnung
\n",
"
object
\n",
"
1
\n",
"
31
\n",
"
\n",
"
\n",
"
Obergruppenbezeichnung
\n",
"
object
\n",
"
1
\n",
"
49
\n",
"
\n",
"
\n",
"
Oberfunktionsbezeichnung
\n",
"
object
\n",
"
1
\n",
"
50
\n",
"
\n",
"
\n",
"
Oberfunktion
\n",
"
float64
\n",
"
1
\n",
"
52
\n",
"
\n",
"
\n",
"
Obergruppe
\n",
"
float64
\n",
"
1
\n",
"
58
\n",
"
\n",
"
\n",
"
Funktionsbezeichnung
\n",
"
object
\n",
"
1
\n",
"
138
\n",
"
\n",
"
\n",
"
Funktion
\n",
"
float64
\n",
"
1
\n",
"
138
\n",
"
\n",
"
\n",
"
Gruppenbezeichnung
\n",
"
object
\n",
"
1
\n",
"
150
\n",
"
\n",
"
\n",
"
Gruppe
\n",
"
float64
\n",
"
1
\n",
"
173
\n",
"
\n",
"
\n",
"
Kapitelbezeichnung
\n",
"
object
\n",
"
1
\n",
"
284
\n",
"
\n",
"
\n",
"
Kapitel
\n",
"
float64
\n",
"
1
\n",
"
285
\n",
"
\n",
"
\n",
"
Titel
\n",
"
float64
\n",
"
1
\n",
"
1739
\n",
"
\n",
"
\n",
"
Titelbezeichnung
\n",
"
object
\n",
"
1
\n",
"
1925
\n",
"
\n",
"
\n",
"
Ansatz 2018 in €
\n",
"
float64
\n",
"
1
\n",
"
3444
\n",
"
\n",
"
\n",
"
Ansatz 2019 in €
\n",
"
float64
\n",
"
1
\n",
"
3449
\n",
"
\n",
" \n",
"
\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",
"
Titelart
\n",
"
Bezeichnung
\n",
"
Hauptfunktionsbezeichnung
\n",
"
Hauptgruppenbezeichnung
\n",
"
Bereichsbezeichnung
\n",
"
Ansatz 2018 in €
\n",
"
\n",
" \n",
" \n",
"
\n",
"
8616
\n",
"
Einnahmetitel
\n",
"
Bezirke
\n",
"
Soziale Sicherung, Familie und Jugend, Arbeits...
\n",
"
Einnahmen aus Zuweisungen und Zuschüssen mit A...
\n",
"
Friedrichshain-Kreuzberg
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
9789
\n",
"
Einnahmetitel
\n",
"
Bezirke
\n",
"
Soziale Sicherung, Familie und Jugend, Arbeits...
\n",
"
Einnahmen aus Zuweisungen und Zuschüssen mit A...
\n",
"
Pankow
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
19183
\n",
"
Ausgabetitel
\n",
"
Bezirke
\n",
"
Soziale Sicherung, Familie und Jugend, Arbeits...
\n",
"
Ausgaben für Zuweisungen und Zuschüsse mit Aus...
\n",
"
Lichtenberg
\n",
"
1000.0
\n",
"
\n",
"
\n",
"
1344
\n",
"
Ausgabetitel
\n",
"
Senatsverwaltungen
\n",
"
Soziale Sicherung, Familie und Jugend, Arbeits...
\n",
"
Ausgaben für Zuweisungen und Zuschüsse mit Aus...
\n",
"
Hauptverwaltung
\n",
"
490000.0
\n",
"
\n",
"
\n",
"
8132
\n",
"
Ausgabetitel
\n",
"
Bezirke
\n",
"
Bildungswesen, Wissenschaft, Forschung, kultur...
\n",
"
Personalausgaben
\n",
"
Friedrichshain-Kreuzberg
\n",
"
182000.0
\n",
"
\n",
" \n",
"
\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",
"
Titelart
\n",
"
Ausgabetitel
\n",
"
Einnahmetitel
\n",
"
\n",
"
\n",
"
Bereichsbezeichnung
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Charlottenburg-Wilmersdorf
\n",
"
7.046985e+08
\n",
"
7.046985e+08
\n",
"
\n",
"
\n",
"
Friedrichshain-Kreuzberg
\n",
"
7.189672e+08
\n",
"
7.189672e+08
\n",
"
\n",
"
\n",
"
Hauptverwaltung
\n",
"
1.947634e+10
\n",
"
1.947634e+10
\n",
"
\n",
"
\n",
"
Lichtenberg
\n",
"
8.912989e+08
\n",
"
8.912989e+08
\n",
"
\n",
"
\n",
"
Marzahn-Hellersdorf
\n",
"
6.990315e+08
\n",
"
6.990315e+08
\n",
"
\n",
"
\n",
"
Mitte
\n",
"
1.026627e+09
\n",
"
1.026627e+09
\n",
"
\n",
"
\n",
"
Neukölln
\n",
"
9.115210e+08
\n",
"
9.115210e+08
\n",
"
\n",
"
\n",
"
Pankow
\n",
"
9.365851e+08
\n",
"
9.365851e+08
\n",
"
\n",
"
\n",
"
Reinickendorf
\n",
"
6.343956e+08
\n",
"
6.343956e+08
\n",
"
\n",
"
\n",
"
Spandau
\n",
"
6.432431e+08
\n",
"
6.432431e+08
\n",
"
\n",
"
\n",
"
Steglitz-Zehlendorf
\n",
"
5.855771e+08
\n",
"
5.855771e+08
\n",
"
\n",
"
\n",
"
Tempelhof-Schöneberg
\n",
"
7.978415e+08
\n",
"
7.978415e+08
\n",
"
\n",
"
\n",
"
Treptow-Köpenick
\n",
"
5.770762e+08
\n",
"
5.770762e+08
\n",
"
\n",
" \n",
"
\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": [
"