Spaß mit R und Berlin Open Data II: ESF-Förderungen

Ein neuer Datensatz im Open Data-Portal Berlins: ESF-geförderte Vorhaben des Landes Berlin 2014-2020

Aus der Beschreibung:

In der Förderperiode 2014-2020 stehen der deutschen Hauptstadt Berlin rund 215 Mio. EUR aus dem Europäischen Sozialfonds (ESF) zur Verfügung, die in die hier lebenden Menschen investiert werden können.
Schwerpunkte sind dabei die soziale Eingliederung benachteiligter Gruppen, die bessere Qualifizierung für einen Arbeitsplatz, die Bekämpfung der Jugendarbeitslosigkeit sowie die Optimierung der allgemeinen und beruflichen Bildung.

Zunächst muss der Datensatz korrekt eingelesen werden – das brauchte bei mir mehrere Versuche:

esf <- read.csv("esf.csv", sep = ";", fileEncoding = "UTF-8", dec = ",")

Da die CSV-Datei nicht mit Kommata sondern Semikola als separierenden Zeichen angelegt wurde, muss R das mittels des Attributs sep mitgeteilt werden. Damit Sonderzeichen korrekt dargestellt werden, wird außerdem auf das fileEncoding UTF-8 hingewiesen. Zu guter Letzt muss R auch wissen, dass die „Nachkommastellen“ nicht hinter einem Punkt (amerikanische Schreibweise), sondern eben hinter einem Komma stehen. Nur so werden die Euro-Beträge auch als Zahlen (class = numeric) und nicht als hier eher unbrauchbare Faktoren erkannt.

Ein Blick in die Struktur dieses Data Frames ergibt, dass die Variablen territoriale_umsetzungsmechanismen und finanzierungsform jeweils nur eine Ausprägung haben, nämlich „07 : Nicht zutreffend“ und „Nicht rückzahlbare Finanzhilfe“. Die Variable land besteht ebenso und naheliegenderweise nur aus der einen Ausprägung DE300. Auf diese Spalten kann ich also verzichten, so dass ich sie mittels der select-Funktion aus dem dplyr-Package „lösche“:

esf <- select(esf, -c(11,13,15))

Die Tabelle weist 641 Zuwendungen an 182 verschiedene Empfänger aus. Interessant wäre es also zu wissen, wieviel die verschiedenen Empfänger insgesamt aus dem ESF erhalten haben:

summen <- tapply(esf$gesamtbetrag_förderfähiger_ausgaben, esf$name_des_begünstigten, sum)

Diese neue Tabelle summen sortiere ich absteigend:

summen <- sort(summen, decreasing = TRUE)

Und lasse mir dann die Top10 der 182 Empfänger ausgeben:

head(summen,10)

            Arbeit und Bildung e.V.         Stiftung Naturschutz Berlin                  WeTeK Berlin gGmbH 
                            9085780                             5667636                             4695658 
                   Chance BJS gGmbH Beuth Hochschule für Technik Berlin                           BUS gGmbH 
                            3349125                             3086155                             2958709 
               Personal_inform GmbH                     LKJ Berlin e.V.       ComFort-Schulungszentrum GmbH 
                            2882466                             2777685                             2776943 
  FrauenComputerZentrumBerlin e. V. 
                            2697057 

Das sind aber nur die Summen, die direkt aus dem ESF geflossen sind. Für jede ESF-Förderung muss – sofern ich die Tabelle wirklich richtig verstehe – die öffentliche Hand einen Teil beisteuern. Darüber gibt die Variable kofinanzierungssatz_in_prozent Auskunft:

summary(esf$kofinanzierungssatz_in_prozent)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
15.04   49.92   49.92   49.60   50.00   66.67 

Wir sehen: Der Kofinanzierungssatz bewegt sich zwischen 15,04 und 66,67 Prozent. In Mittel und Median liegt er bei knapp unter 50 Prozent. Dieser Prozentsatz wird auf die ESF-Fördersumme noch aufgeschlagen.

Mich stört die Variable Themenfeld, denn dort besteht jede Ausprägung aus einer ID-Nummer gefolgt von einer Beschreibung, bspw. 117 - Förderung des gleichen Zugangs zum lebenslangen Lernen für alle Altersgruppen im formalen, nichtformalen und informellen... Dadurch steht immer unerhört viel Text in den Zellen.

Also verwende ich die separate-Funktion aus dem tidyr-Package, um daraus zwei Spalten zu machen – das schreibe ich zur Sicherheit in eine neue Tabelle esf_sep:

esf_sep <- separate(esf, themenfeld, c("themenfeld", "beschreibung themenfeld"), " - ")

Und um ein paar weitere der für mich noch recht mysteriösen Funktionen aus dem dplyr-Package auszuprobieren, wende ich die group_by-Funktion auf die Empfänger an:

empf <- group_by(esf_sep, name_des_begünstigten)

Jetzt sollte ich mittels summarize, einigen Argumenten und ein wenig Magie schöne Übersichtstabellen erstellen können:

summarize(empf, Gesamtsumme = sum(gesamtbetrag_förderfähiger_ausgaben), 'Anzahl der Förderungen' = length(gesamtbetrag_förderfähiger_ausgaben))

# A tibble: 182 x 3
   name_des_begünstigten                                               Gesamtsumme `Anzahl der Förderungen`
                                                                                            
 1 A&QUA gGmbH                                                            1796959.                       23
 2 ABBV GmbH                                                               959359.                        8
 3 ABT gGmbH - Akademie für berufliches Training                          1712346.                       17
 4 abw - gemeinnützige Gesellschaft für Arbeit, Bildung und Wohnen mbH     370433.                        5
 5 agens Arbeitsmarktservice gGmbH                                         509435.                        9
 6 AGRARBÖRSE Deutschland Ost e. V.                                        542946.                        6
 7 ajb GmbH Gemeinnützige Gesellschaft für Jugendberatung                  692342.                        2
 8 Akelei e. V.                                                            418609.                        2
 9 all2gethernow e.V.                                                      321707.                        1
10 Allianz deutscher Designer AGD e.V.                                     113616.                        1
# ... with 172 more rows

Das ließe sich in ähnlicher Weise auf Postleitzahlen, Themenfelder oder sogar Zeiträume anwenden. Dafür müsste ich mich aber erst wieder mit den schrecklichen Datumsfunktionen vertraut machen.

Spaß mit R und Berlin Open Data I: Die Zuwendungsdatenbank

Zur Zeit beschäftige ich mich mit der statistischen Programmiersprache R, und weil das Üben mit echten Datensätzen mehr Spaß macht, habe ich mir auf OpenData Berlin einen interessanten Datensatz herausgesucht – die Zuwendungsdatenbank.

In der Zuwendungsdatenbank werden die von den Behörden ausgereichten Zuwendungen an juristische Personen veröffentlicht (ab einem Zuwendungsbetrag i. H. v. 100 Euro rückwirkend für die letzten 5 Jahre), aktuell die Zuwendungen des Jahres 2016.

Der Datensatz ist schön groß: 40.820 Zeilen, also Zuwendungen mit zehn (eigentlich neun – id ist nur eine fortlaufende Nummer) Variablen:
[1] "id" "name" "geber" "art" "jahr" "anschrift"
[7] "politikbereich" "zweck" "betrag" "empfaengerid"

Zunächst werfe ich einen Blick in die Spalte betrag:
summary(all$betrag)
Min. 1st Qu. Median Mean 3rd Qu. Max.
100 4673 16477 229216 61176 487261162

Der Mindestbetrag liegt bei 100 €, das wusste ich schon aus der Beschreibung des Datensatzes. Die Höchstzuwendung liegt bei stattlichen 487.261.162 €. Wer hat die erhalten und wofür?
> all[all$betrag == max(all$betrag),]

id name geber art jahr
9445 18889 BVG Senatsverwaltung für Stadtentwicklung und Umwelt Projektförderung 2013
anschrift politikbereich zweck betrag empfaengerid
9445 Holzmarktstraße 15-17, 10179 Berlin Verkehr U 8; Nord 487261162 hra_031152

Die BVG erhielt den Betrag für den Zweck „U 8; Nord“ in 2013.

Wieviel wurde insgesamt zugewendet?
> sum(as.numeric(all$betrag))
[1] 9356595690

Der Datensatz bildet also 9.356.595.690 € Gesamtzuwendungen in den Jahren 2012 bis 2016 ab.

Damit es auch mal etwas komplizierter wird, habe ich ein kleines Skript geschrieben, welches für jeden in der Spalte name vorkommenden Empfänger die Häufigkeit zählt, mit der er Zuwendungen erhalten hat. Das wird am Schluss per summary ausgegeben:

x <- unique(all$name)
vec <- c()
for (i in 1:length(x)) { vec <- c(vec,nrow(all[all$name == x[i],])) }
summary(vec)

Min. 1st Qu. Median Mean 3rd Qu. Max.
1.0 1.0 2.0 4.4 4.0 667.0

Die Mindestzahl an Zuwendungen liegt erwartbar bei 1, das Maximum hingegen bei imposanten 667. Inzwischen überrascht es niemanden mehr: Empfängerin war auch hier die BVG.

Fortsetzung folgt