Skip to content

Instantly share code, notes, and snippets.

@sebastiansauer
Created July 19, 2016 08:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebastiansauer/aa448aa44924275444f2498e80eec5e2 to your computer and use it in GitHub Desktop.
Save sebastiansauer/aa448aa44924275444f2498e80eec5e2 to your computer and use it in GitHub Desktop.
Beispiel-Analyse zum Datensatz "tips"
###############################################################################
### Beispiel-Analyse des Datensatzes "tips"
### von Sebastian Sauer, letztes Update: 2016-01-18
### Zugang zu den Daten: Der Datensatz findet sich im Paket "reshape2"
###############################################################################
# Hinweis: Es ist ganz normal, Syntax/Befehle nachzuschlagen :)
# Eine Möglichkeit dazu ist mit help(Befehl), z.B.
help(library) # oder mit google :)
# Datensatz und Pakete laden ---------------------------------------------------
#install.packages("reshape2")
# nur nötig, wenn das Paket noch nicht installiert ist, gilt für alle Pakete
library(reshape2) # Paket laden, in dem die Daten enthalten sind
data(tips) # Daten aus dem geladenen Paket laden
library(Rcmdr) # Unsere Allzweck-Waffe
# Weitere Pakete laden
library(ggplot2) # für Diagramme
# Diagramme können auch über andere Pakete bzw. über den
# R-Commander erstellt werden. Oder über Excel etc.
# Forschungsfrage --------------------------------------------------------------
# Ist die Höhe des Trinkgelds von typischen Restaurant-Variablen zu beeinflussen?
# Hypothesen -------------------------------------------------------------------
# H1: Die Höhe der Rechnung hängt mit der Höhe des Trinkgelds zusammen.
# H2: Männer geben mehr Trinkgeld als Frauen.
# H3: Raucher geben mehr Trinkgeld als Nicht-Raucher.
# H4: Abends wird mehr Geld ausgegeben als Mittags.
# H5: Die Anzahl der Personen am Tisch -- unabhängig von ihrer Restaurantrechnung --
# hat keinen Einfluss auf die Höhe des Trinkgelds
# H6: Männliche Raucher geben am meisten Trinkgeld.
# Dabei wird von Alpha = .05 ausgegangen.
# Ersten Eindruck verschaffen --------------------------------------------------
head(tips) # Die ersten Zeilen des Datensatzes anschauen
names(tips) # Die Namen der Variablen herauslesen
# Deskriptive Analyse (univariate Statistiken) ---------------------------------
summary(tips)
sd(tips$total_bill)
sd(tips$tip)
# Histogramm für das Trinkgeld (tip)
with(tips, Hist(tip, scale="frequency", breaks="Sturges", col="darkgray"))
# aus dem R-Commander kopiert
ggplot(tips, aes(x = tip)) + geom_histogram() # mit ggplot. Selber Effekt.
# Explorative Analyse nach Hypothesen ------------------------------------------
# H1: Die Höhe der Rechnung hängt mit der Höhe des Trinkgelds zusammen. ----
ggplot(tips, aes(x = total_bill, y = tip)) + geom_point()
# Im Streudiagramm erkennt man, einen Zusammenhang
# Bei höheren Werten wird die Korrelation offenbar schwächer,
# da die Punktewolke bei höheren Werten "fächerförmig" auseinander geht.
# Hinweis: Man hätte auch das Diagramm aus dem R-Commander nutzen können.
cor(tips$tip, tips$total_bill) # r = .68
# Es liegt eine starke Korrelation in der Stichprobe vor.
rcorr.adjust(tips[,c("tip","total_bill")], type="pearson", use="complete")
# Hinweis: Dieser Befehl ist aus dem R-Commander kopiert. Das ist ok!
# FAZIT: Insgesamt unterstützen die Daten die H1.
# H2: Männer geben mehr Trinkgeld als Frauen.----
numSummary(tips[,"tip"], groups=tips$sex, statistics=c("mean", "sd", "IQR",
"quantiles"),
quantiles=c(0,.25,.5,.75,1))
# auch dieser Befehl ist aus dem R-Commander kopiert.
# Hinweis: Das "Prompt-Zeichen" ("Rcmdr+") nicht mitkopieren.
# alternativ:
# Datensatz mit nur Männern erstellen:
tips_maenner <- tips[tips$sex == "Male", ] # Groß -und Kleinschreibung beachten!
# In einer Tabelle bei R steht als erstes die Zeile, danach (nach dem Komma)
# die Spalte. Hier werden also alle Zeilen ausgewählt, für die gilt, dass bei
# "sex" der Wert "Male" steht. Spalten werden alle ausgewählt.
# Datensatz mit nur Frauen erstellen:
tips_frauen <- tips[tips$sex == "Female", ]
# Variable, die das Trinkgeld der Männer (bzw. Frauen) speichert
tip_maenner <- mean(tips_maenner$tip, na.rm = TRUE) # "na.rm = TRUE" sorgt dafür,
# dass auch bei fehlenden Werten (NAs) ein Ergebnis zurückgeliefert wird
tip_frauen <- mean(tips_frauen$tip, na.rm = T)
tip_delta <- tip_maenner - tip_frauen # Das "Delta" ist die Differenz der beiden
# Mittelwerte
tip_delta # Maenner geben also im Schnitt 0.26$ mehr Trinkgeld als Frauen.
# Diagramm:
with(tips, Dotplot(tip, by=sex, bin=FALSE)) # ... wieder aus dem Rcmdr kopiert.
Boxplot(tip~sex, data=tips, id.method="y") # vom Rcdmr kopiert
# Der Boxplot zeigt, dass der Median der Männer größer ist.
# Außerdem sieht man, dass die Streuung bei den Männern größer ist.
ggplot(tips, aes(x = sex, y = tip)) + geom_boxplot()
# Ein Boxplot mit ggplot; das Ergebnis ist das gleiche
# FAZIT: Insgesamt unterstützen die Daten die H2.
# H3: Raucher geben mehr Trinkgeld als Nicht-Raucher. ----
# Hinweis: Das methodische Vorgehen ist identisch zur H2.
mean(tips$tip[tips$smoker == "Yes"]) # Mittleres Trinkgeld der Raucher
mean(tips$tip[tips$smoker == "No"]) # Mittleres Trinkgeld Nicht-Raucher
# Der Unterschied zwischen den Gruppen ist minimal: Ca. 0.01$
# Diagram
with(tips, plotMeans(tip, smoker, error.bars="se")) # aus Rcmdr
ggplot(tips, aes(x = smoker, y = tip)) +
stat_summary(fun.y = "mean", geom = "bar") # ggplot
# Die Diagramme bestätigen, dass der Rauchstatus kaum Unterschied bzgl.
# dem Trinkgeld macht.
# FAZIT: Die Daten unterstützen die H3 *nicht*.
# H4: Abends wird mehr Geld ausgegeben als Mittags. ----
# Datensatz mit Rechnungen nur vom "Dinner":
abends <- tips[tips$time == "Dinner", ]
# Datensatz mit Rechnungen nur vom "Lunch":
mittags <- tips[tips$time == "Lunch", ]
mean(abends$total_bill)
# wenn es keine NAs gibt, braucht man "na.rm = T" auch nicht
mean(mittags$total_bill)
# Der Unterschied beträgt ca. 3.50$.
# Das kann wieder mit verschiedenen Diagrammen dargestellt werden.
# FAZIT: Insgesamt unterstützen die Daten der Stichprobe die H4.
# H5: Die Anzahl der Personen am Tisch----
# -- unabhängig von ihrer Restaurantrechnung --
# hat keinen Einfluss auf die Höhe des Trinkgelds.
# Hinweis: Diese Hypothese involviert 3 Variablen, im Gegensatz zu
# den vorherigen, die nur 2 Variablen involviert haben.
# Eine Möglichkeit, diese Hypothese zu prüfen, ist mittels der multiplen
# Regression.
RegModel.1 <- lm(tip~size+total_bill, data=tips)
summary(RegModel.1) # aus dem Rcmdr kopiert!
# Die Ergebnisse zeigen, dass "size" *unabhängig* von "total_bill" einen
# Einfluss hat, das Trinkgeld ("tip) steigt pro Person am Tisch im Schnitt
# um 0.19$. Umgekehrt gilt ähnliches für total_bill: Pro Dollar Rechnung steigt
# das Trinkgeld um ca. 0.10$ im Schnitt.
# FAZIT: Die Ergebnisse unterstützen die H5.
# H6: Männliche Raucher geben am meisten Trinkgeld. ----
# Hier benötigt man zwei Datensätze: Einen mit den männlichen Rauchern,
# und einen mit allen übrigen Personen.
# Das kann man z.B. mit Excel machen. Oder z.B. mit den folgenden Befehlen.
# Auch der R-Commander hat diese Funktion mit "Teilmenge der aktiven Datenmatrix".
datenmatrix_mann_rauch <- subset(tips, sex == "Male" & smoker == "Yes")
# Wähle die Zeilen (das "Subset") aus der Datenmatrix tips,
# für die die beiden Bedingungen (sex == "Male" UND smoker == "Yes") wahr sind
# Wieder auf Groß- und Kleinschreibung aufpassen.
# Hinweis: Das "&" steht für das logische "UND".
datenmatrix_rest <- subset(tips, !(sex == "Male" & smoker == "Yes"))
# das "!" heißt hier "NICHT", es werden also die Zeilen gewählt, für die die
# beiden Bedingungen *nicht* zutreffen.
mean(datenmatrix_mann_rauch$tip, na.rm = T)
mean(datenmatrix_rest$tip, na.rm = T)
# Der Unterschied beträgt ca. 0.07$.
# Diagramme: Wie oben.
# FAZIT: Die Daten unterstützen die H6, wenn der Effekt auch schwach ist.
# Inferenzstatistik (Signifikanztets) nach Hypothesen --------------------------
# H1: Beim R-Commander kann im entsprechenden Menü unter "paarweise p-Werte" ----
# der p-Wert (Signifikanztest angefordert werden)
# Der p-Wert ist kleiner als Alpha (p < .001)
# FAZIT: Die Daten unterstützen die H1.
# H2: ----
t.test(tip~sex, alternative='greater', conf.level=.95, var.equal=FALSE, data=tips)
# aus dem Rcmdr kopiert.
# Der p-Wert ist nicht kleiner als Alpha (p = .93)
# FAZIT: Die Daten unterstützen die H2 nicht.
# H3: ----
t.test(tip~smoker, alternative='greater', conf.level=.95, var.equal=FALSE,
data=tips) # aus dem Rcmdr kopiert.
# Der p-Wert ist nicht kleiner als Alpha (p = .54)
# FAZIT: Die Daten unterstützen die H3 nicht.
# H4: ----
t.test(total_bill~time, alternative='greater', conf.level=.95,
var.equal=FALSE, data=tips) # aus dem Rcmdr kopiert.
# Der p-Wert ist kleiner als Alpha (p = .001)
# FAZIT: Die Daten unterstützen die H4.
# H5: ----
# Die multiple Regression liefert die p-Werte direkt mit.
RegModel.2 <- lm(tip~size+total_bill, data=tips)
summary(RegModel.2) # aus dem Rcmdr kopiert.
# Beide Prädiktoren sind signifikant (p < Alpha);
# p für size: .03
# p für total_bill: <.001
# FAZIT: Die Daten unterstützen die H4.
# H6: ----
# Achtung: Die Syntax für diesen t-Test ist etwas abgewandelt.
t.test(datenmatrix_mann_rauch$tip, datenmatrix_rest$tip, alternative =
"greater")
# Der p-Wert ist nucht kleiner als Alpha (p = .37)
# FAZIT: Die Daten unterstützen die H6 nicht.
# Effektstärken ----------------------------------------------------------------
# nicht implementiert
# Power-Analyse (Teststärke berechnen) -----------------------------------------
# nicht implementiert
# Sonstige Schnoerkel ----------------------------------------------------------
# nicht implementiert
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment