6 Die Basics zur Datenanalyse

📢 Zielsetzung dieser Einheit

Am Beginn dieser Einheit werden zunächst die unterschiedlichen Phasen eines idealtypischen Analyseprozesses dargelegt. Danach schauen wir uns an, wie ein solcher Analyseprozess mit den Tools R und RStudio gelingen kann. dazu werden in einem ersten Schritt die Grundlagen des Datenhandlings mittels R behandelt.


6.1 Daten analysieren - aber wie?

Unabhängig von der gewählten Fragestellung bestehen Datenanalysen aus einer Abfolge unterschiedlicher Arbeitsschritte:

Ein idealtyptischer Analyseworkflow

Dieser idealtypische Workflow muss dabei nicht zwingend linear durchlaufen werden. Die Farbgebung in obiger Darstellung deutet bereits an, dass wir in diesem Prozess drei große Abschnitte unterscheiden können:

  1. Die initiale Datenbeschaffung
  2. Die Aufbereitung und Analyse dieser Daten
  3. Die Dokumentation der erzeugten Daten und Ergebnisse

6.2 Die Hilfsmittel R & RStudio

Um den zuvor beschriebenen Analyseprozess auch umzusetzen reichen theoretisch Stift und Papier. Praktisch kann man dazu aber auf ein breites Angebot an Software Lösungen zurückgreifen. Für eine am Grundsatz der Offenheit orientierten Forschung werden wir uns in weiterer Folge mit der Programmiersprache R auseinandersetzen. Einige rahmende Ausführungen zu R finden sich hier:


👉 Interessierte möchte ich an dieser Stelle auf Walter Grubers “Reinführung in RStudio” aufmerksam machen, die einen kurzweiligen Überblick auf die Entstehung der Programmiersprache R (und noch viel mehr) bietet.

Um den Umgang mit R komfortabler zu gestalten, kann auf sgn. integrierte Entwicklungsumgebungen (“integrated development environment - IDE”) zurückgegriffen werden. Klingt technisch, heißt praktisch lediglich dass IDEs wie RStudio helfen, Analyseprozesse mit R übersichtlicher umzusetzen. Lukas Burk und Tobias Anton bieten in ihrer lesenswerten Einführung “R für Psychos” eine gelungene Einführung in RStudio an. Kurz und gut: Lesen Sie bitte diese Einführung in RStudio dort nach.

6.3 Grundlegende Datenstrukturen in R


⏳ Work in Progress ⏳*

🔽Till then: Download it here🔽


6.4 Daten im- und exportieren

Der Im- und Export von Daten ist zentraler Bestandteil jeder Datenanalyse. R und RStudio bieten dazu die unterschiedlichsten Möglichkeiten, von denen wir uns einige näher ansehen wollen.

Ein Hinweis: Da R skriptbasiert ist, müssen die zu Locations der zu im- oder portierenden Datensätze als absolute oder meist als relative Pfadangaben gesetzt werden. Um dieses Referenzieren von Datensätzen einheitlicher zu gestalten, empfiehlt es sich, seinen Projekten folgende Minimalstruktur zu verpassen:

Projektfolder
| skript_1.R
| ...
| skript_n.R    
|
+-- data
    | datensatz_1.csv
    | ...
    | datensatz_n.csv

Verweise auf Datensätze beginnen damit einheitlich mit “data”. Ein Verweis auf datensatz_1.csv würde damit wie folgt aussehen: “data/datensatz_1.csv”

In den meisten Fällen ist man - wie in dem obigen Beispiel - mit relativen Pfadangaben gut bedient. Dadurch kann bestehender Code leicht zwischen unterschiedlichen Systemen umgezogen werden.

6.4.1 Der Datenimport

Nach dieser Einleitung wollen wir nun aber endlich Datensätze importieren. Was uns dazu noch fehlt? Daten!

🔽Ein paar Übungsdatensätze zum Importieren finden sich hier.🔽

Das ZIP-Archiv mit unseren Übungsdaten entpacken wir in den Ordner “data”.

Das Dateiformat MS-Excel (XLSX) ist wohl eines der bekanntesten. Der Import solcher Tabellenblätter kann mit einer Vielzahl von Packages bewerkstelligt werden. Das Package readxl verzichtet dazu auf Java etc., was es zu einer leichten und schnellen Lösung macht.

library(readxl)
xlsx.laender <- read_excel("data/laender.xlsx", sheet = "aut-de-ch")
xlsx.laender
## # A tibble: 3 x 6
##      ID land          area    ew eumitglied     creditrating
##   <dbl> <chr>        <dbl> <dbl> <chr>          <chr>       
## 1     1 Österreich   83800   8.9 Mitglied       AA          
## 2     2 Deutschland 357500  83.2 Mitglied       AAA         
## 3     3 Schweiz      41300   8.6 nicht Mitglied AAA

Im Gegensatz dazu können im Comma Sperated Values (CSV) Format abgelegte Daten sehr gut auch ohne zusätzliche Packages mit den Befehlen read.csv und read.csv2 importiert werden: Ersterer geht von Beistrichen als Feldtrennzeichen und Punkten als Dezimaltrennzeichen, letzterer von Strichpunkten als Feldtrennzeichen und Beistrichen als Dezimaltrennzeichen.

csv.laender <- read.csv2("data/laender.csv")
csv.laender
##   X        land   area   ew     eumitglied creditrating
## 1 1  Österreich  83800  8.9       Mitglied           AA
## 2 2 Deutschland 357500 83.2       Mitglied          AAA
## 3 3     Schweiz  41300  8.6 nicht Mitglied          AAA

📚 Exkurs:
Ein Klick auf ein Datenfile offenbart ein Feature namens “Import dataset …” das ein einfaches graphisches Interface zur Voransicht der zu importierenden Datensätze bietet.

Der Import von CSV-Datensätzen kann auch direkt über das HTTP-Protokoll angestoßen werden. dazu ein kurzes Beispiel aus dem COVID19-Dashboard der Österreichischen Agentur für Ernährungssicherheit (AGES):

CovidFaelle <- read.csv2("https://covid19-dashboard.ages.at/data/CovidFaelle_GKZ.csv",
                         encoding = "UTF-8",
                         dec = ".")
str(CovidFaelle)
## 'data.frame':    94 obs. of  6 variables:
##  $ Bezirk           : chr  "Eisenstadt(Stadt)" "Rust(Stadt)" "Eisenstadt-Umgebung" "Güssing" ...
##  $ GKZ              : int  101 102 103 104 105 106 107 108 109 201 ...
##  $ AnzEinwohner     : int  14895 2000 43861 25770 17109 40316 60397 37453 54209 101765 ...
##  $ Anzahl           : int  7209 910 20675 11878 7746 18791 28419 17072 24638 42875 ...
##  $ AnzahlTot        : int  22 2 69 95 42 82 83 63 145 276 ...
##  $ AnzahlFaelle7Tage: int  147 19 405 214 76 391 583 363 368 463 ...

Es können aber auch “ausgefallenere” Formate importiert werden: Eigentlich nicht so ausgefallen, dafür weniger bekannt ist das R-eigene RDS-Format. Dieses binäre Format unterstützt die Übergabe von Faktoren (= praktisch):

rds.laender <- readRDS("data/laender.rds")
str(rds.laender)
## 'data.frame':    3 obs. of  5 variables:
##  $ land        : chr  "Österreich" "Deutschland" "Schweiz"
##  $ area        : num  83800 357500 41300
##  $ ew          : num  8.9 83.2 8.6
##  $ eumitglied  : Factor w/ 2 levels "Mitglied","nicht Mitglied": 1 1 2
##  $ creditrating: Ord.factor w/ 10 levels "AAA"<"AA"<"A"<..: 2 1 1

Über Packages wie haven können auch die hauseigenen Formate anderer Statistikpakete - wie beispielsweise SPSS - eingelesen werden. Je nach Package werden dabei verschiedene Metadaten zu den einzelnen Variablen mit importiert:

library(haven)
spsslaender <- read_sav("data/laender.sav")
str(spsslaender)
## tibble [3 x 6] (S3: tbl_df/tbl/data.frame)
##  $ id          : num [1:3] 1 2 3
##   ..- attr(*, "format.spss")= chr "F1.0"
##  $ land        : chr [1:3] "Österreich" "Deutschland" "Schweiz"
##   ..- attr(*, "format.spss")= chr "A11"
##   ..- attr(*, "display_width")= int 11
##  $ area        : num [1:3] 83800 357500 41300
##   ..- attr(*, "format.spss")= chr "F6.0"
##  $ ew          : num [1:3] 8.9 83.2 8.6
##   ..- attr(*, "format.spss")= chr "F4.1"
##  $ eumitglied  : dbl+lbl [1:3] 1, 1, 0
##    ..@ format.spss  : chr "F14.0"
##    ..@ display_width: int 14
##    ..@ labels       : Named num [1:2] 0 1
##    .. ..- attr(*, "names")= chr [1:2] "kein Mitlgied" "Mitglied"
##  $ creditrating: chr [1:3] "AA" "AAA" "AAA"
##   ..- attr(*, "format.spss")= chr "A3"

Ein komplexerer Zugang zum Thema Datenimport:
Es können über Packages wie rvest auch einzelne HTML-Elemente aus Websites ausgelesen und importiert werden. Mit Code-Support der R Psychos Lukas Burk und Tobias Anton kann man beispielsweise die Rankings des World Happiness Reports 2020 aus Wikipedia absaugen:

library(rvest)    # Schnittstelle zum http(s) Protokoll
library(dplyr)    # Grammar of Data Manipulation (vgl. "Tidyverse") -> "pipes"
## 
## Attache Paket: 'dplyr'
## Die folgenden Objekte sind maskiert von 'package:stats':
## 
##     filter, lag
## Die folgenden Objekte sind maskiert von 'package:base':
## 
##     intersect, setdiff, setequal, union
happiness2020 <- read_html("https://en.wikipedia.org/wiki/World_Happiness_Report") %>%
  html_nodes("table") %>%   # liefert Lister aller table-Elemente
  .[11] %>%                 # 11tes table-Element (manuell ermittelt)
  html_table(header = NA, trim = TRUE, fill = TRUE) %>%
  .[[1]]                    # hä? html_table liefert eine Liste von Dataframes, wir wollen davon den ersten
head(happiness2020)
## # A tibble: 6 x 9
##   `Overall rank` `Country or region` Score `GDP per capita` `Social support`
##            <int> <chr>               <dbl>            <dbl>            <dbl>
## 1              1 Finland              7.81             1.28             1.5 
## 2              2 Denmark              7.65             1.33             1.50
## 3              3 Switzerland          7.56             1.39             1.47
## 4              4 Iceland              7.50             1.33             1.55
## 5              5 Norway               7.49             1.42             1.50
## 6              6 Netherlands          7.45             1.34             1.46
## # ... with 4 more variables: `Healthy life expectancy` <dbl>,
## #   `Freedom to make life choices` <dbl>, Generosity <dbl>,
## #   `Perceptions of corruption` <dbl>

6.4.2 Der Datenexport

Und wie können Daten nun wieder exportiert werden?

Bevor wir unsere Übungsdaten wieder exportieren, wollen wir noch flott zwei kleine Manipulationen vornehmen: Wir ermitteln für unsere kleine Ländersammlung die Bevölkerungsdichte und ordnen die Spalten inhaltlich konsistenter an.

# Bevölkerungsdichte auf 2 Nachkommastellen genau ermitteln
rds.laender$bevdichte <- round((rds.laender$ew*1000)/rds.laender$area, 2)

# Spalten noch etwas inhaltlich konsistenter anordnen
rds.laender.ex <- rds.laender[, c("land", "area", "ew", "bevdichte", "eumitglied", "creditrating")]
rds.laender.ex
##          land   area   ew bevdichte     eumitglied creditrating
## 1  Österreich  83800  8.9      0.11       Mitglied           AA
## 2 Deutschland 357500 83.2      0.23       Mitglied          AAA
## 3     Schweiz  41300  8.6      0.21 nicht Mitglied          AAA

Diesen kleinen Dataframe wollen wir nun in unterschiedliche Formate exportieren - beispielsweise in ein Excel-Sheet mittels des Packages writexl:

library(writexl)
write_xlsx(rds.laender.ex, "data/myLaender.xlsx")

… oder als CSV-Datei (sicherheitshalber mit Angabe des Encodings):

write.csv2(rds.laender.ex, "data/myLaender.csv", fileEncoding = "UTF-8")

… oder als RDS-Datei:

saveRDS(rds.laender.ex, "data/myLaender.rds")

… oder als SAV-Datei für SPSS mittels des haven-Packages:

write_sav(rds.laender.ex, "data/myLaender.sav")

… oder als reiner Text für die Zwischenablage:

# V1: in die Console zum manuellen Kopieren
write.table(rds.laender.ex)
## "land" "area" "ew" "bevdichte" "eumitglied" "creditrating"
## "1" "Österreich" 83800 8.9 0.11 "Mitglied" "AA"
## "2" "Deutschland" 357500 83.2 0.23 "Mitglied" "AAA"
## "3" "Schweiz" 41300 8.6 0.21 "nicht Mitglied" "AAA"
# V2: mit Tabulatoren als Feldtrennzeichen und keinen Zeilenbeschriftungen direkt in die Zwischenablage
write.table(rds.laender.ex, "clipboard", sep="\t", row.names=FALSE)

🏆 Nun wissen wir, …

  • welche Schritte eine Datenanalyse ausmachen.
  • welche grundlegenden Datenstrukturen in R vorhanden sind.
  • wie wir unterschiedlichen Skalenniveaus in R abbilden können.
  • wie wir Datensätze in R im- und aus R exportieren können.

And now it’s time for some action