8 Grafische Datenanalyse

8.1 Vorbereitung

Datensatz ‘WPStudis.RData’ öffnen (Sie muessen ggf. noch Ihren Pfad aendern bzw. den Workspace neu definieren):


load("WPStudis.Rdata")

8.2 Grafiken mit der plot() Funktion

wir fangen einfach mal an. Beim “plot” befehl sucht R automatisch die geeignete Darstellungsform basierend auf der Art der Variablen. Eine schöne Übersicht wann welche Grafik aufgerufen wird finden Sie in Luhmann(2015), S.154.

plot(WPStudis$F3_Geschlecht)

Die y-Achse könnte einen Tick höher sein

plot(WPStudis$F3_Geschlecht, ylim=c(0,100))

Oder lieber in rot?

plot(WPStudis$F3_Geschlecht, ylim=c(0,100), col="red", border=NA)

Es gibt auch andere Farben. Eine Übersicht über die in R mit Namen verfügbaren Farben erhält man mit dem Befehl colors(). Darüber hinaus gibt es jede mögliche RGB Farbe. Der Befehl hierfür ist col=“#009999”

plot(WPStudis$F3_Geschlecht, ylim=c(0,120), col="tomato", border=NA)

Wenn wir numerische Daten haben dann gibt der Befehl ein Streudiagramm (wenig Sinnvoll, x-Achse ist die Zeilennummer im Datensatz)

plot(WPStudis$F4_Koerpergroesse)

Bei zwei numerischen Daten macht dies schon mehr Sinn. Zwei Variablen lassen sich sehr einfach in ein Modell zusammenführen. Hierfür benutzern wir die Tilde “~”. Es Gilt AV ~ UV.

plot(WPStudis$F4_Koerpergroesse~WPStudis$F5_Schuhgroesse)

Falls eine Variable numerisch ist und die zweite Variable ein Faktor, bekommen wir mit dem selben Befehl einen Boxplot

plot(WPStudis$F4_Koerpergroesse~WPStudis$F3_Geschlecht)

Falls beide Variable Faktoren sind, bekommen wir mit dem selben Befehl ein Mosaik-Diagramm. Dies entspricht einem gestapelten Balkendiagram, wobei die Breite der Balken (x-Ausdehnung) dem jeweiligen relativen Anteil der Variable entspricht.

WPStudis$F21_01_Zufriedenheit_Leben<-as.factor(WPStudis$F21_01_Zufriedenheit_Leben)
plot(WPStudis$F21_01_Zufriedenheit_Leben ~ WPStudis$F3_Geschlecht)

Hier nochmal, jedoch angereichert um Beschriftungen der Achsen. xlab und ylab bezeichnen jeweils die Achsen-Beschriftungen (Label). main gibt den Diagramm-Titel an. Weitere Funktionen können Sie mit?plot() herausfinden.

plot(WPStudis$F21_01_Zufriedenheit_Leben ~ WPStudis$F3_Geschlecht,
     xlab = "Geschlecht", 
     ylab = "Zufriedenheit mit dem Leben",
     main = "Zufriedenheit der WPler nach Geschlecht")

Wenn wir wissen welche Art der Darstellung wir wollen, können wir es daher auch spezifizieren.

In diesem Video zeige ich wie das in R funktioniert:

8.3 Balkendiagramm:

Nehmen wir an wir wollen die Häufigkeiten der Antworten bei der Frage “Zufriedenheit mit dem Leben” darstellen:

barplot(table(WPStudis$F21_01_Zufriedenheit_Leben))

Nun wollen wir dies getrennt nach Geschlechter dargestellt haben. Wir nutzen dazu die Kreuztabelle aus dem Teil2 mit dem Parameter ,2 für die Spaltenprozente.

barplot(prop.table(table(WPStudis$F21_01_Zufriedenheit_Leben,WPStudis$F3_Geschlecht),2))

Lassen wir uns noch eine Legende anzeigen mit Legend=True

barplot(prop.table(table(WPStudis$F21_01_Zufriedenheit_Leben,WPStudis$F3_Geschlecht),2),legend=T)

Mit dem Argument beside=TRUE sorgt man dafür, dass statt gestapelten Balken, diese nebeneinander dargestellt werden

barplot(prop.table(table(WPStudis$F21_01_Zufriedenheit_Leben,WPStudis$F3_Geschlecht),2),beside=T,legend=T)

Wenn uns stört, dass die Legende einen Teil der Grafik überdeckt, dann können wir die Y-Achse erhöhen

barplot(prop.table(table(WPStudis$F21_01_Zufriedenheit_Leben,WPStudis$F3_Geschlecht),2),beside=T,legend=T,ylim=c(0,1.6),)

Hier ein Beispiel aus dem R Standarddatensatz zu Todesraten (pro 1000 Einwohner):

VADeaths
##       Rural Male Rural Female Urban Male Urban Female
## 50-54       11.7          8.7       15.4          8.4
## 55-59       18.1         11.7       24.3         13.6
## 60-64       26.9         20.3       37.0         19.3
## 65-69       41.0         30.9       54.6         35.1
## 70-74       66.0         54.3       71.1         50.0

Erzeugen wir ein einfaches Balkendiagramm:

barplot(VADeaths)

Die Lesbarkeit ist aufgrund der vielen Kategorien nicht optimal. Daher nun als gruppiertes Balkendiagramm mit dem Befehl beside=TRUE.

barplot(VADeaths, beside=TRUE, legend=TRUE, ylim=c(0,250),
        ylab="Tote pro 1000",
        main="Sterberaten in Virginia 1940")

In diesem Video zeige ich wie das in R funktioniert:

8.4 Aufgabe 3.1

  • Entwerfen Sie ein Balkendiagramm für die Schuhgroesse der WP Studierenden.
  • Versuchen sie die Balken rot und ohne Umrandung zu formatieren.
  • Wenn Sie die Beschriftung der X-Achse betrachten, was fällt Ihnen auf? Welche alternative Darstellung könnte man für die Daten wählen.

8.5 Vergleich von Mittelwerten

Auch Mittelwerte lassen sich als Balkendiagramm darstellen. Hierfür nutzen wir wieder den tapply Befehl. Sie können mit dem Befehl col übrigens auch zwei Farbwerte angeben.

barplot(tapply(WPStudis$F4_Koerpergroesse,WPStudis$F3_Geschlecht, mean, na.rm=TRUE ), ylim=c(0,200), col=c("#665588","#009999"))

In diesem Video zeige ich wie das in R funktioniert:

8.6 Fehlerbalkendiagramme

Über das “psych” Paket lassen sich sehr Einfach Mittelwerte und Konfidenzintervalle erstellen. Wollen wir Zum Beispiel die Mittelwerte der Körpergröße von Frauen und Männern vergleichen, gehen wir wie folgt vor. Hinweis: Standard sind sogenannte Katzenaugen. Wenn Sie die Fehlerbalken erhalten wollen müssen Sie also eyes=FALSE angeben.

library(psych)
error.bars.by(WPStudis$F4_Koerpergroesse,WPStudis$F3_Geschlecht,eyes=FALSE)

Leider benennt die Funktion die Gruppen immer mit “group1” etc. daher vergeben wir wieder die Richtigen Labels mit der v.labels funktion (Variablen-Labels)

error.bars.by(WPStudis$F4_Koerpergroesse,WPStudis$F3_Geschlecht,eyes=FALSE, v.labels=cbind("Männlich","Weiblich"))

Wer ist Zufriedener in der Beziehung, Männer oder Frauen?

error.bars.by(WPStudis$F21_03_Zufriedenheit_Partnerschaft,WPStudis$F3_Geschlecht,eyes=FALSE, v.labels=cbind("Männlich","Weiblich"))

Deskritiv ist der Wert der Frauen höher, aber wie man sieht überschneiden sich die Konfidenzintervalle, daher können wir es nicht sagen.

In diesem Video zeige ich wie das in R funktioniert:

8.7 Histogramm

Ein Histogram kann direkt mit hist() erstellt werden. Aus unserem Datensatz:

hist(WPStudis$F4_Koerpergroesse)

Versuchen wir mal schrittweise diese Grafik zu “verschönern”

Erhöhung der Balkenanzahl:

hist(WPStudis$F4_Koerpergroesse, breaks=15)

Über “Breaks” kann die Anzahl der Gruppierungen geändert werden - spielen Sie doch mal mit diesem Wert. Statt die Anzahl der Balken zu definieren kann man auch ein sog. Kerndichte-Diagramm erstellen, hierbei werden die Häufigkeiten nicht als Balken, sondern als durchgezogene Linie dargsetellt.

plot(density(WPStudis$F4_Koerpergroesse))

Titel verändern:

hist(WPStudis$F4_Koerpergroesse, breaks=15,
     main="Histogramm Körpergroesse")

Achsen verlängern:

hist(WPStudis$F4_Koerpergroesse, breaks=15,
     main="Histogramm Körpergroesse",
     xlim=c(150,190), ylim=c(0,12))

Achsenbeschriftung verändern:

hist(WPStudis$F4_Koerpergroesse, breaks=15,
     main="Histogramm Körpergroesse",
     xlim=c(150,190), ylim=c(0,12),
     xlab="groesse WP-Studierende",
     ylab="Häufigkeit")

Balkenfarbe verändern:

hist(WPStudis$F4_Koerpergroesse, breaks=15,
     main="Histogramm Körpergroesse",
     xlim=c(150,190), ylim=c(0,12),
     xlab="groesse WP-Studierende",
     ylab="Häufigkeit",
     col="tomato",
     border="white")

In diesem Video zeige ich wie das in R funktioniert:

8.8 Aufgabe 3.2

Entwerfen Sie ein Histogramm für die Anzahl der Freunde auf Facebook der WP Studierenden mit 10 Klassen (Balken).

8.9 Boxplot

Ein Boxplot kann direkt mit boxplot() erstellt werden. Aus unserem Datensatz:

boxplot(WPStudis$F2_Alter)

Auch Gruppierungen lassen sich leicht erzeugen:

boxplot(WPStudis$F4_Koerpergroesse~WPStudis$F3_Geschlecht)

Wir koennen die Beschriftung auch von Hand vornehmen:

boxplot(WPStudis$F4_Koerpergroesse~WPStudis$F3_Geschlecht,
        col=("darkgreen"),
        names=cbind("Männlich","Weiblich"))

In diesem Video zeige ich wie das in R funktioniert:

8.10 Aufgabe 3.3

Entwerfen Sie zwei Boxplots nebeneinander für die Schuhgroesse der weiblichen / männlichen WP Studierenden

8.11 Kreisdiagramm

Ein Kreis oder Tortendiagramm kann direkt mit pie() erstellt werden. Aus unserem Datensatz:

pie(table(WPStudis$F7_Brille), clockwise=T) 

Warum muss hier die Funktion “table” eingebaut sein?

Schauen Sie sich doch mal zugrunde liegenden Daten jeweils an:

Ohne Table Funktion:

WPStudis$F7_Brille
##  [1] Nein JA   Nein JA   JA   Nein JA   Nein Nein Nein <NA> Nein JA   JA   JA   JA   Nein JA   Nein Nein JA   Nein JA   Nein JA   Nein Nein Nein Nein JA  
## [31] Nein Nein Nein Nein Nein Nein Nein JA   Nein JA   Nein JA   JA   Nein JA   JA   Nein Nein Nein JA   Nein JA   Nein Nein Nein JA   Nein JA   Nein JA  
## [61] Nein JA   Nein Nein Nein Nein Nein Nein JA   Nein Nein JA   Nein Nein JA   Nein JA   JA   JA   JA   Nein Nein Nein Nein Nein JA   JA   JA   Nein JA  
## [91] JA   JA   JA  
## Levels: Nein JA

Mit Table Funktion:

table(WPStudis$F7_Brille)
## 
## Nein   JA 
##   53   39

In diesem Video zeige ich wie das in R funktioniert:

8.12 Übung

Erzeugen Sie ein Kreisdiagramm für das Geschlecht unserer Ersties (Datensatz WPStudis)

8.13 Streudiagramme

Streudiagramme haben wir schon kennengelernt, diese lassen sich mit der plot() Funktion sehr einfach generieren.

plot(WPStudis$F4_Koerpergroesse~WPStudis$F5_Schuhgroesse)

Eine Regressionsgrade können wir duch den Befehl abline sowie die spezifikation des linearen modells (lm) hinzufügen. Dieses besrprechen wir noch in den folgenden Kapiteln aber grundsätzlich gilt das in der lm() Funktion AV tilde (~) UV eingetragen wird.

plot(WPStudis$F4_Koerpergroesse~WPStudis$F5_Schuhgroesse)
abline(lm(WPStudis$F4_Koerpergroesse~WPStudis$F5_Schuhgroesse))

R kann allerdings auch sogenannte Streu-Diagramm-Matrizen erstellen, die übersichtlich den Zusammenhang von mehr als 2 Variablen darstellen. Hierfür benötigen wir das “psych” Paket Hierfür erstellen wir einen Data-Frame mit den gewünschten Variablen. Diese müssen alle als Vektoren formatiert sein.

Zusammenhang <- data.frame(WPStudis$F4_Koerpergroesse, WPStudis$F5_Schuhgroesse, WPStudis$F20_Einkommen_Glueck)
pairs.panels(Zusammenhang)

Wenn man die Funktion auf unseren ganzen DAtensatz anwendet, wird es jedoch unübersichtlich

pairs.panels(WPStudis)

Alternativ gibt es weitere Pakete mit denen Streudiagramm-Matrizen erstellt werden könnnen. Insbesondere wenn viele Variabelen betrachtet werden sollen ist z.B. corrgram eine gute Alternative. Hier einB eispiele:

Beispiel corrgramm

library("corrgram")
corrgram(WPStudis)

oder mit Piecharts:

corrgram(WPStudis, upper.panel=panel.pie)

In diesem Video zeige ich wie das in R funktioniert:

8.14 Übung

Wie haben echte Daten der Besucherfrequenz auf der Königsstrasse in Stuttgart.

Daten aus Excel laden:


library(readxl)
Passanten <- read_excel("Passanten2019.xlsx")

Schauen Sie sich die Daten einmal an:

View(Passanten)

Tipp: Sie müssen Tag in einen Factor umwandeln. Damit die Tage dann noch in unsrer gewohnten Reihenfolge erscheinen (Mo-So) können Sie einen ordered Factor erstellen. Dies geht so:

Passanten$Tag <- as.factor(Passanten$Tag)
Passanten$Tag <- ordered(Passanten$Tag,levels=c("Mo","Di","Mi","Do","Fr","Sa","So"))

Aufgabe Teil 1 Versuchen Sie Boxplots zu erzeugen, die uns sagen, an welchem Wochentag wieviele Menschen auf der Königsstrasse unterwegs sind.

Aufgabe Teil 2 Versuchen Sie Boxplots zu erzeugen, die die Standorte Königstrasse Mitte und Süd vergleichen.

8.15 Übung

Wir laden die Daten (Befragung von Paaren nach der Aufteilung der Hausarbeit, aufgeteilt in 13 klassische Hausarbeiten)

library(ade4)
data(housetasks)

Aufgabe: Betrachten Sie die Daten. Erzeugen Sie eine Grafik um die Daten möglichst gut zu visualisieren.

Tipp:

data<-as.matrix(housetasks)  #Erzeugt eine Daten-Matrix (Vorraussetzung für viele Plots bzw. die Umwandlung in eine Tabelle)
data<-100*prop.table(data, margin = 1)  #Erzeugt eine Kontinenztabelle mit Zeilenprozenten
data_trans <-t(data)  #Die Funktion t() erzeugt eine transponierte Matrix (X und Y Achse getauscht)

8.16 GGPlot2

ggplot2 ist der Goldstandard für Grafiken in R

Paket aktivieren

library(ggplot2)

Hauptbefehle: qplot() wenn es schnell gehen muss ggplot() hier kann alles einzeln kontrolliert werden

GGPlot2 laesst sehr komplexe Graphiken zu. Beispiele:

qplot()

qplot(data=WPStudis,x=F6_Sternzeichen,y=F5_Schuhgroesse,color=F3_Geschlecht)

Die gleiche Grafik mit ggplot()

ggplot() + geom_point(data=WPStudis,aes(x=F6_Sternzeichen,y=F5_Schuhgroesse,colour=F3_Geschlecht))

Mit Hilfe von ggplot2 können wir nun auch detailliertere Grafiken zu unseren WP Studierenden erstellen. z.B. das Schuhgroessen Beispiel von vorhin. Der aes() Befehl erlaubt eine flexible Gestaltung von Variablen

Schuhgroesse <- ggplot(data=WPStudis,aes(F5_Schuhgroesse))

Jetzt haben wir ggplot2 gesagt um welche Daten es geht. Um nun etwas anzuzeigen, müssen wir ein “Layer” erzeigen. Z.B. ein Bar Chart:

Schuhgroesse + geom_bar()

Nun wollen wir die Schuhgroessen nach Geschlecht aufgeteilt darstellen:

Schuhgroesse2 <- ggplot(data=WPStudis,aes(F5_Schuhgroesse, fill=F3_Geschlecht))
Schuhgroesse2 + geom_bar()

oder:

Schuhgroesse3 <- ggplot(data=WPStudis,aes(F3_Geschlecht,F5_Schuhgroesse))
Schuhgroesse3 + geom_boxplot()

Nehmen wir nun an wir wollen nicht die einzelnen Werte darstellen sondern die Mittelwerte vergleichen. Auch das kann ggplot2. Zunächst müssen wir als X-Achsenwerte Geschlecht und als Y-Achsenwerte die Schuhgroesse definiere.

Schuhgroesse_Mittel <- ggplot(data=WPStudis,aes(F3_Geschlecht, F5_Schuhgroesse))

Als nächsten benötigen wir hierfür die “stat-summary” funktion um die Mittelwerte auszurechnen.

Schuhgroesse_Mittel + stat_summary(fun = mean, geom ="point") 

Nun machen wir es noch etwas schöner

Schuhgroesse_Mittel + stat_summary(fun = mean, geom ="point", size=5 ) + labs(x="", y="Schuhgroesse")

Wir wollen nun den jeweiligen Standardfehler anzeigen Hierfür müssen wir das HMISC Package laden

library(Hmisc)
Schuhgroesse_Mittel + stat_summary(fun = mean, geom ="point", size=5 ) + labs(x="", y="Schuhgroesse")+  guides(colour="none") +
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", position=position_dodge(width=0.90), width=0.2)

In diesem Video zeige ich wie das in R funktioniert:

8.17 Übung

Erstellen Sie mit ggplot2 ein Histogramm zur Anzahl der Facebook-Freunde der WP Studierenden.