Created
July 19, 2016 08:12
-
-
Save sebastiansauer/aa448aa44924275444f2498e80eec5e2 to your computer and use it in GitHub Desktop.
Beispiel-Analyse zum Datensatz "tips"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################### | |
### 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