invisible header

link zum pdf

In dieser Einheit lernt ihr, wie ihr Daten in R Einlesen und Inspizieren könnt. Zunächst arbeiten wir gemeinsam mit den Daten, die im Kurs erhoben wurden. Die Daten wurden anonymisiert. Klicke hier um den Datensatz kursdata_anon herunterzuladen.
Wir starten unser Skript wie immer mit dem Header.

# Statistik 1: R Tutorat
# Übungsskript zur Datenintegration
# Datum: 12.10.2023
# AutorIn: XXX

 

1. Installation und Aktivierung von Packages

Die Funktionalität von R beruht auf Apps bzw. “Packages”, in denen die verschiedenen Funktionen bzw. Befehle organisiert sind. Packages müssen vor Verwendung einmalig mit dem Befehl install.packages() installiert werden. Die Aktivierung von Packages erfolgt dann vor jeder Nutzung mit dem Befehl library(). Diese zwei Schritte sind vergleichbar mit dem Herunterladen und Öffnen einer Mobile App.

Wir arbeiten im Kurs, wenn immer möglich, mit Packages aus dem tidyverse-Pool. tidyverse ist eine Sammlung von sehr nützlichen R-Packages, welche eine Gestaltungsphilosophie & Grammatik teilen und zudem auf die Bearbeitung und Analyse von Daten in Matrix-Form ausgerichtet sind. Die Kernpakete aus dem tidyverse, die wir in diesem Kurs verwenden werden, sind u.a. ggplot2, dplyr und readr. Diese enthalten Befehle, die Daten modellieren, transformieren und visualisieren können. Wir starten daher mit der Installation und Aktivierung der tidyverse-Packages. Hierfür reicht der Verweis auf tidyverse im Installations- und Aktivierungsbefehl - es müssen nicht alle Teilpackages einzeln installiert werden.

# Package installieren
install.packages("tidyverse")
# Package aktivieren 
library(tidyverse)

Alternativ könnt ihr unten rechts in der Orientierung in RStudio über den Tab “Packages”-> “Install”-> Packagename-> “Install” euer gewünschtes Package installieren und dann in der Übersicht das Package durch Häkchen aktivieren (und es wieder wegnehmen um es ggf. zu deaktivieren).

Informationen zu den Packages und spezifischen Befehlen findet ihr über die Hilfsfunktion “?…”.

# Hilfe für Package
?dplyr
## starte den http Server für die Hilfe fertig
# Hilfe für Befehl 
?summary

 

2. Einlesen der Daten

R kann Daten bzw. Datenmatrizen unterschiedlicher Formate einlesen, z.B. .csv (Text-Dateien), .dta (Stata-Dateien), .sav (SPSS-Dateien), .sas (SAS-Dateien) oder .xls/.xlsx (Excel-Dateien). Datensätze können über die Funktion “Import Dataset” im Environmentfenster eingelesen werden. Da unser kursdata.anon.dta Datensatz als Stata-File angelegt ist, müsst ihr “from Stata” auswählen. Danach könnt ihr zum Datensatz auf eurem Rechner navigieren, solltet anschliessend zur Sicherung die Befehlssyntax kopieren (und dann in euer Skript einsetzen) und schliesslich auf “Import” klicken.

Alternativ könnt ihr den Einleseprozess direkt aus dem Skript heraus steuern. Dabei empfehlen wir, dass ihr zuvor über den Befehl setwd() (~definiere Arbeitsverzeichnis) R mitteilt, wo auf Eurem Rechner sich die Daten befinden (damit nicht mehr der ganze Pfad, sondern nur noch der Dateiname in den Befehl eingefügt werden muss).

# Working directory setzen (z.B. "c:/Tutorat_Statistik/Daten/")
setwd("mein_laufwerk/mein_datenverzeichnis/")
# Daten einlesen
library(haven)
kursdata_anon <- read_dta("kursdata_anon.dta")

 

3. Dateninspektion

3.1 Visuelle Inspektion

Der Befehl View() öffnet den Datensatz in einem separaten Fenster. Alternativ könnte im Environment der Datensatz direkt angeklickt werden.

View(kursdata_anon)

Wir werfen einen prüfenden Blick auf die Datenmatrix:

  • Sind die Daten sauber in der Matrix organisiert?
    • Befinden sich die Merkmale in den Spalten?
    • Befinden sich die Merkmalsträger in den Zeilen?
    • Befinden sich Werte in den Zellen?
  • Sind fehlende Werte als “NA” (not available) kodiert?
    • R erkennt fehlende Werte nur als solche, wenn sie als “NA” kodiert wurden.
    • Wenn Zellen leer sind, oder mit einem anderen Symbol belegt wurden (z.B. -99), müssen diese Variablen recodiert werden. Ansonsten laufen wir Gefahr, diese Zahlenwerte unbeabsichtigt z.B. bei der Berechnung von Mittelwerten zu berücksichtigen.

3.2 Systematische Inspektion

1. Ist die Anzahl an Fällen und Variablen plausibel?
Der dim() Befehl zeigt die Anzahl an Beobachtungen und Merkmalen.

dim(kursdata_anon)
## [1] 76 27

Der glimpse() Befehl listet alle im Datensatz enthaltenen Merkmale und Beobachtungen mit ihren Ausprägungen auf. Zusätzlich werden die Variablenklassen angezeigt.

glimpse(kursdata_anon)
## Rows: 76
## Columns: 27
## $ id         <dbl> 28, 41, 31, 34, 48, 50, 60, 54, 69, 63, 72, 74, 77, 76, 78,…
## $ dispcode   <dbl> 31, 31, 31, 31, 31, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31,…
## $ lastpage   <dbl> 95873, 95873, 95873, 95873, 95873, 95873, 95873, 95873, 958…
## $ lezufr     <dbl> 68, 74, 58, 65, 90, 46, -99, 65, 76, 75, 60, 69, 58, 60, 82…
## $ alter      <dbl> 24, 26, 25, 21, 21, 24, 21, 21, 26, 25, 22, 25, 25, 23, 22,…
## $ geschlecht <chr> "maennlich", "weiblich", "maennlich", "weiblich", "weiblich…
## $ qm         <dbl> 21, 33, 38, 14, 14, 15, 30, NA, 32, 23, 19, 25, 58, 33, 65,…
## $ rauchen    <dbl+lbl> 3, 2, 1, 3, 1, 3, 1, 1, 2, 2, 3, 3, 3, 1, 1, 2, 1, 1, 3…
## $ konsum     <dbl+lbl>  2,  1,  2,  1, NA,  1,  2,  2,  1,  2,  2,  1,  1,  2,…
## $ leftright  <dbl> 35, 32, 0, 10, 40, 0, 26, 16, 24, 25, 50, 50, 21, 28, 20, 6…
## $ intgender  <dbl+lbl> 2, 1, 2, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 3, 2, 1, 1, 1…
## $ intmig     <dbl+lbl> 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1…
## $ llezufr    <dbl> 71, 53, 73, 35, 70, 36, 80, 60, 89, 85, 50, 80, 31, 75, 62,…
## $ trust      <dbl> 4, 4, 3, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 2, 5, 3, 3, 2, 3, 1,…
## $ eltern     <dbl+lbl> 2, 3, 2, 3, 3, 3, 3, 2, 3, 3, 1, 3, 1, 3, 1, 3, 3, 2, 3…
## $ mathe      <dbl> 4.0, 3.0, 4.5, 5.5, 3.5, 5.0, 4.0, 4.5, 3.5, 4.0, 3.0, 4.0,…
## $ deutsch    <dbl> 4.0, 4.0, 4.5, 4.0, 4.5, 5.0, 5.0, 5.0, 4.5, 4.5, 5.5, 4.0,…
## $ fach       <dbl+lbl> 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1…
## $ semester   <dbl> 6, 1, 3, 4, 1, 3, 5, 4, 3, 6, 1, 1, 2, 3, 4, 3, NA, 4, 4, 1…
## $ statfreiw  <dbl+lbl> 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 3, 3, 2, 2, 1, 2, 3…
## $ sidejob    <dbl+lbl> 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2…
## $ covimpf    <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1…
## $ impftol    <dbl+lbl> 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2…
## $ impfpfl    <dbl+lbl>  1,  1,  2,  1,  1,  1,  1,  1, NA,  2,  2,  1,  1,  1,…
## $ buecher    <dbl> 2, 12, 30, 62, 100, 4, 2, 4, 5, 4, 3, 6, 4, 32, 2, 10, 63, …
## $ akback     <dbl+lbl> 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0…
## $ trustkat   <dbl+lbl> 3, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 1, 3, 2, 2, 1, 2…

 

2. Variablenübersicht: Sind alle relevanten Variablen enthalten?
Der look_for() Befehl aus dem labelled Package gibt euch alle vorhandenen Metainformationen zum Datensatz. Bei einem gut beschriebenen (bzw. “gelabellten”) Datensatz kann der look_for-Output daher (fast) die Datendokumentation bzw. ein offizielles Codebook ersetzen. Konkret werden alle Merkmale aufgelistet und zusätzlich deren Variablen- und Wertelables (wenn vorhanden) angezeigt. Ihr könnt den Output von look_for direkt in ein neues Objekt schreiben, welches dann automatisch in übersichtlicher Tabellenform organisiert ist. Wir empfehlen, diese im Environment (rechts oben) als Tab zu öffnen und über den gesamten Prozess des Datenmanagements & -analyse im Hintergrund geöffnet zu halten.

#install.packages("labelled")
library(labelled)
varlist <- look_for(kursdata_anon)

Der attributes() Befehl ist vor allem hilfreich, da er durch das $ Zeichen auf ein bestimmtes Merkmal zugreifen kann und dessen Labels zeigt.

attributes(kursdata_anon)
## $class
## [1] "tbl_df"     "tbl"        "data.frame"
## 
## $row.names
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
## [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
## [76] 76
## 
## $names
##  [1] "id"         "dispcode"   "lastpage"   "lezufr"     "alter"     
##  [6] "geschlecht" "qm"         "rauchen"    "konsum"     "leftright" 
## [11] "intgender"  "intmig"     "llezufr"    "trust"      "eltern"    
## [16] "mathe"      "deutsch"    "fach"       "semester"   "statfreiw" 
## [21] "sidejob"    "covimpf"    "impftol"    "impfpfl"    "buecher"   
## [26] "akback"     "trustkat"
attributes(kursdata_anon$lezufr)
## $label
## [1] "Lebenszufriedenheit derzeit"
## 
## $format.stata
## [1] "%8.0g"

 

3. Übersichtstatistiken (Summary Statistics): Plausible Werte?
Der summary() Befehl zeigt das Minimum und Maximum der Ausprägungen, die erste und dritte Quartilsgrenze, den Median und das arithmetische Mittel. Mit dem Dollarzeichen kann im Befehl wiederum eine spezifische Variable angesteuert werden (daten$variable). So könnt ihr leicht und übersichtlich erkennen, ob (1) die für Euch relevanten Variablen korrekte und sinnvolle Werte enthalten, (2) alle fehlenden Werte als solche erkennbar und kodiert sind und (3) die grundlegenden Verteilungseigenschaften mit Euren Erwartungen übereinstimmen.

summary(kursdata_anon)
##        id            dispcode        lastpage         lezufr      
##  Min.   : 28.00   Min.   :31.00   Min.   :95873   Min.   :-99.00  
##  1st Qu.: 74.75   1st Qu.:31.00   1st Qu.:95873   1st Qu.: 60.00  
##  Median : 98.50   Median :31.00   Median :95873   Median : 75.00  
##  Mean   :101.91   Mean   :31.09   Mean   :95873   Mean   : 65.53  
##  3rd Qu.:138.25   3rd Qu.:31.00   3rd Qu.:95873   3rd Qu.: 80.00  
##  Max.   :173.00   Max.   :32.00   Max.   :95873   Max.   :100.00  
##                                                                   
##      alter        geschlecht              qm           rauchen     
##  Min.   :19.00   Length:76          Min.   :10.00   Min.   :1.000  
##  1st Qu.:21.00   Class :character   1st Qu.:25.50   1st Qu.:1.000  
##  Median :22.00   Mode  :character   Median :35.00   Median :2.000  
##  Mean   :22.42                      Mean   :38.48   Mean   :2.171  
##  3rd Qu.:24.00                      3rd Qu.:55.00   3rd Qu.:3.000  
##  Max.   :26.00                      Max.   :65.00   Max.   :3.000  
##                                     NA's   :1                      
##      konsum        leftright      intgender         intmig     
##  Min.   :1.000   Min.   : 0.0   Min.   :1.000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.: 8.0   1st Qu.:1.000   1st Qu.:1.000  
##  Median :2.000   Median :23.5   Median :1.000   Median :1.000  
##  Mean   :1.629   Mean   :25.5   Mean   :1.533   Mean   :1.459  
##  3rd Qu.:2.000   3rd Qu.:40.0   3rd Qu.:2.000   3rd Qu.:2.000  
##  Max.   :2.000   Max.   :85.0   Max.   :3.000   Max.   :3.000  
##  NA's   :6                      NA's   :1       NA's   :2      
##     llezufr           trust           eltern          mathe     
##  Min.   :  0.00   Min.   :1.000   Min.   :1.000   Min.   :3.00  
##  1st Qu.: 40.00   1st Qu.:2.000   1st Qu.:1.000   1st Qu.:3.50  
##  Median : 63.00   Median :3.000   Median :2.000   Median :4.00  
##  Mean   : 59.93   Mean   :3.118   Mean   :2.013   Mean   :4.24  
##  3rd Qu.: 80.00   3rd Qu.:4.000   3rd Qu.:3.000   3rd Qu.:5.00  
##  Max.   :100.00   Max.   :5.000   Max.   :3.000   Max.   :6.00  
##                                                   NA's   :1     
##     deutsch           fach          semester       statfreiw    
##  Min.   :4.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.500   1st Qu.:1.000   1st Qu.:2.000   1st Qu.:1.000  
##  Median :5.000   Median :1.000   Median :3.000   Median :2.000  
##  Mean   :5.007   Mean   :1.276   Mean   :3.027   Mean   :1.842  
##  3rd Qu.:5.500   3rd Qu.:2.000   3rd Qu.:4.000   3rd Qu.:3.000  
##  Max.   :6.000   Max.   :2.000   Max.   :6.000   Max.   :3.000  
##  NA's   :1                       NA's   :3                      
##     sidejob         covimpf         impftol         impfpfl     
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
##  Median :2.000   Median :1.000   Median :1.000   Median :2.000  
##  Mean   :1.716   Mean   :1.079   Mean   :1.355   Mean   :1.587  
##  3rd Qu.:2.000   3rd Qu.:1.000   3rd Qu.:2.000   3rd Qu.:2.000  
##  Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
##  NA's   :2                                       NA's   :1      
##     buecher           akback          trustkat    
##  Min.   :  1.00   Min.   :0.0000   Min.   :1.000  
##  1st Qu.:  4.00   1st Qu.:0.0000   1st Qu.:1.000  
##  Median :  5.50   Median :1.0000   Median :2.000  
##  Mean   : 16.58   Mean   :0.6184   Mean   :2.132  
##  3rd Qu.: 20.50   3rd Qu.:1.0000   3rd Qu.:3.000  
##  Max.   :100.00   Max.   :1.0000   Max.   :3.000  
## 
summary(kursdata_anon$alter)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19.00   21.00   22.00   22.42   24.00   26.00
summary(kursdata_anon$lezufr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -99.00   60.00   75.00   65.53   80.00  100.00
summary(kursdata_anon$qm)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   10.00   25.50   35.00   38.48   55.00   65.00       1

Mit dem table() Befehl lassen sich einfache Häufigkeitstabellen erstellen - sinnvoll für die Inspektion kategorialer Variablen.

library(dplyr)
table(kursdata_anon$konsum)
## 
##  1  2 
## 26 44
table(kursdata_anon$semester)
## 
##  1  2  3  4  5  6 
## 12 16 20 15  3  7

 

4. Sind die Klassen der relevanten Variablen stimmig definiert?
Der class() Befehl zeigt uns die Klasse bzw. den Typ einer Variablen an (bei “double” - und ebenso “integer” - handelt es sich um Untertypen der Klasse “numeric”).

class(kursdata_anon$geschlecht)
## [1] "character"
class(kursdata_anon$leftright)
## [1] "numeric"
class(kursdata_anon$konsum)
## [1] "haven_labelled" "vctrs_vctr"     "double"

Bei Bedarf können wir die Variablenklasse auch ändern. Dies ist häufig bei kategorialen Variablen sinnvoll, falls diese im numerischen Format oder als character angelegt sind. factor und as.factor sind Basisvarianten der Faktorisierung, wobei erstes mit Zusatzargumenten (z.B. zur Rekodierung oder Umsortierung) angereichert werden kann, zweitesdagegen nicht. as_factor nutzt ein spezielles Feature aus dem oben aktivierten dplyr-Package und überschreibt die Wertelabel mit Kategorienwerten. Der Ergebnisoutput wird so oft besser lesbar:

table (kursdata_anon$konsum)
## 
##  1  2 
## 26 44
kursdata_anon$konsum_factor1 <- factor(kursdata_anon$konsum)
table (kursdata_anon$konsum_factor1)
## 
##  1  2 
## 26 44
kursdata_anon$konsum_factor2 <- as.factor(kursdata_anon$konsum)
table (kursdata_anon$konsum_factor2)
## 
##  1  2 
## 26 44
kursdata_anon$konsum_factor3 <- as_factor(kursdata_anon$konsum)
table (kursdata_anon$konsum_factor3)
## 
##    coop  migros anderen 
##      26      44       0

 

Hier gehts weiter zur Übung I

 

logo.knit

Conforti, E., Siefart, F., De Min, N., Dürr, R., Moos, M., Senn, S., Strassmann-Rocha, D., Giesselmann, M. (2022): “R für das Soziologiestudium an der UZH”