Stat2: Lösung 2.2 & 2.3S

Veröffentlichungsdatum

31. Oktober 2023

Musterlösung Übung 2.2

Kommentierter Lösungsweg

#lade die Daten
df <- readr::read_delim("datasets/stat1-4/Datensatz_novanimal_Uebung_Statistik2.1.csv", delim = ";")

# überprüft die Voraussetzungen für eine ANOVA
# Schaut euch die Verteilungen der Mittelwerte an (plus Standardabweichungen)
# Sind Mittelwerte nahe bei Null? 
# Gäbe uns einen weiteren Hinweis auf eine spezielle Binomial-Verteilung 
df |>
  group_by(label_content) |>
  summarise(
    tot_sold_mean = mean(tot_sold),
    tot_sold_sd = sd(tot_sold)
  )
# A tibble: 3 × 3
  label_content tot_sold_mean tot_sold_sd
  <chr>                 <dbl>       <dbl>
1 Fleisch               1136.       200. 
2 Hot and Cold           308.        23.5
3 Vegetarisch            739.       214. 
# Boxplot
ggplot(df, aes(x = label_content, y= tot_sold)) +
  # Achtung: Reihenfolge spielt hier eine Rolle!
  stat_boxplot(geom = "errorbar", width = 0.25) +
  geom_boxplot(fill="white", color = "black", size = 1, width = .5) +
  labs(x = "\nMenu-Inhalt", y = "Anzahl verkaufte Gerichte pro Woche\n") +
  # achtung erster Hinweis einer Varianzheterogenität, wegen den Hot&Cold-Gerichten
  mytheme

#alternative mit base
boxplot(df$tot_sold~df$label_content)

# definiert das Modell (vgl. Skript Statistik 2)
model <- aov(tot_sold ~ label_content, data = df)

summary.lm(model)  

Call:
aov(formula = tot_sold ~ label_content, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-290.250 -135.083    1.667  125.500  282.417 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                1135.58      48.92  23.211  < 2e-16 ***
label_contentHot and Cold  -827.25      69.19 -11.956 1.54e-13 ***
label_contentVegetarisch   -396.33      69.19  -5.728 2.15e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 169.5 on 33 degrees of freedom
Multiple R-squared:  0.8125,    Adjusted R-squared:  0.8012 
F-statistic: 71.52 on 2 and 33 DF,  p-value: 1.007e-12
# überprüft die Modelvoraussetzungen
par(mfrow = c(2,2))
plot(model)


Fazit: Beim Überprüfen der Modellannahmen haben wir festgestellt, dass der Residualplot deutliche Abweichungen aufweist, die einem “Trichter” ähneln (wie im Statistik-Skript 2 erklärt). Dies bedeutet, dass die Annahme der Homoskedastizität nicht erfüllt ist. Welche Schritte könnten wir als nächstes unternehmen?

  • Wir sollten das “Buffet”-Menü aus unserer Analyse entfernen, da es in Wirklichkeit keine vollständigen Menüinformationen enthält. Beachte jedoch, dass dies zu einem Informationsverlust führt. Wir können diesen Ausschluss damit begründen, dass das “Buffet” nicht den gleichen strukturierten Menüinhalt aufweist wie die anderen Menüs.

  • Wir könnten eine Daten-Transformation in Betracht ziehen, zum Beispiel die Anwendung einer logarithmischen Transformation, um die Daten besser zu analysieren.

  • Eine andere Option wäre die Verwendung eines nicht-parametrischen Tests. Beachte jedoch, dass auch solche Tests bestimmte Voraussetzungen erfüllen müssen, um verlässliche Ergebnisse zu liefern.

  • Eine weitere Möglichkeit wäre die Anwendung eines general linear models (glm) mit einer Poisson- oder Quasipoisson-Link-Funktion, wie im Statistik-Skript 4 erklärt. Weitere Informationen dazu findest du im Skript Statistik 4. Link

# überprüft die Voraussetzungen des Welch-Tests:
# Gibt es eine hohe Varianzheterogenität und ist die relative Verteilung der
# Residuen gegeben? (siehe Statistik 2)
# Ja Varianzheterogenität ist gegeben, aber die Verteilung der Residuen folgt
# einem "Trichter", also keiner "normalen/symmetrischen" Verteilung um 0
# Daher ziehe ich eine Transformation der AV einem nicht-parametrischen Test vor
# für weitere Infos:
# https://data.library.virginia.edu/interpreting-log-transformations-in-a-linear-model/

# achtung hier log10, bei einer Rücktransformation zwingend beachten
model_log <- aov(log10(tot_sold) ~ label_content, data = df)
par(mfrow = c(2, 2))
plot(model_log) # scheint ok zu sein

summary.lm(model_log) # Referenzkategorie ist Fleisch

Call:
aov(formula = log10(tot_sold) ~ label_content, data = df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.198920 -0.059343  0.003477  0.062579  0.150567 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                3.04908    0.02585 117.942  < 2e-16 ***
label_contentHot and Cold -0.56121    0.03656 -15.350  < 2e-16 ***
label_contentVegetarisch  -0.19792    0.03656  -5.413 5.45e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08956 on 33 degrees of freedom
Multiple R-squared:  0.8802,    Adjusted R-squared:  0.8729 
F-statistic: 121.2 on 2 and 33 DF,  p-value: 6.238e-16
TukeyHSD(model_log) # (vgl. Statistik 2)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = log10(tot_sold) ~ label_content, data = df)

$label_content
                               diff        lwr        upr   p adj
Hot and Cold-Fleisch     -0.5612085 -0.6509215 -0.4714955 0.0e+00
Vegetarisch-Fleisch      -0.1979175 -0.2876305 -0.1082044 1.6e-05
Vegetarisch-Hot and Cold  0.3632910  0.2735780  0.4530041 0.0e+00
# Achtung Beta-Werte resp. Koeffinzienten sind nicht direkt interpretierbar
# sie müssten zuerst wieder zurück transformiert werden, hier ein Beispiel dafür:
# für Fleisch
10^model_log$coefficients[1]
(Intercept) 
   1119.655 
# für Hot & Cold,
10^(model_log$coefficients[1] + model_log$coefficients[2])
(Intercept) 
   307.5216 
# ist equivalent zu
10^(model_log$coefficients[1]) * 10^(model_log$coefficients[2])
(Intercept) 
   307.5216 
# für Vegi
10^(model_log$coefficients[1] + model_log$coefficients[3])
(Intercept) 
   709.8501 

Methoden

Unser Ziel war es, die Unterschiede in den wöchentlichen Verkaufszahlen für verschiedene Menüinhalte zu untersuchen. Da die Anzahl der verkauften Menüs eine Zahlenangabe ist und die Menüinhalte kategorisch sind, haben wir eine einfaktorielle ANOVA durchgeführt.

Als wir das Modell überprüften, stellten wir fest, dass die Homoskedastizität stark verletzt war. Dies wurde auch durch den Boxplot bestätigt, den wir verwendet haben.

Um dieses Problem anzugehen, haben wir die Verkaufszahlen durchgeführt, um sie besser vergleichbar zu machen. Anschliessend haben wir erneut eine ANOVA durchgeführt und die Modellvoraussetzungen überprüft. Diesmal stellten wir fest, dass die Homoskedastizität (gleichmässige Streuung der Residuen) und die Normalverteilung der Residuen erfüllt waren.

Für weitere Informationen zur log-Transformation und zur Darstellung der Ergebnisse findest du hier zusätzliche Details.

Ergebnisse

Die wöchentlichen Verkaufszahlen für die verschiedenen Menüarten (Fleisch, Vegetarisch und Buffet) sind signifikant unterschiedlich (p < 0.001). Dies wird in Abbildung 1 anschaulich dargestellt, wo die Verkaufszahlen pro Menüart zu sehen sind.

Abbildung 24.1: Die wöchentlichen Verkaufzahlen unterscheiden sich je nach Menüinhalt stark. Das Modell wurde mit den log-tranformierten Daten gerechnet.

Musterlösung Übung 2.3S (SozWis)

Kommentierter Lösungsweg

# A tibble: 2 × 3
  article_description tot_sold_mean tot_sold_sd
  <chr>                       <dbl>       <dbl>
1 Fav_World                    623.       179. 
2 Kitchen                      128.        22.2

# definiert das Modell (Skript Statistik 2)
model <- aov(tot_sold ~ article_description * member, data = df)

summary.lm(model)

Call:
aov(formula = tot_sold ~ article_description * member, data = df)

Residuals:
   Min     1Q Median     3Q    Max 
-91.00 -17.33   0.50  14.83  83.00 

Coefficients:
                                             Estimate Std. Error t value
(Intercept)                                   452.333      9.734   46.47
article_descriptionKitchen                   -327.000     13.766  -23.75
memberStudierende                             340.667     13.766   24.75
article_descriptionKitchen:memberStudierende -334.333     19.469  -17.17
                                             Pr(>|t|)    
(Intercept)                                    <2e-16 ***
article_descriptionKitchen                     <2e-16 ***
memberStudierende                              <2e-16 ***
article_descriptionKitchen:memberStudierende   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 33.72 on 44 degrees of freedom
Multiple R-squared:  0.9864,    Adjusted R-squared:  0.9855 
F-statistic:  1063 on 3 and 44 DF,  p-value: < 2.2e-16
# überprüft die Modelvoraussetzungen (Statistik 2)
par(mfrow = c(2, 2)) # alternativ gäbe es die ggfortify::autoplot(model) funktion
plot(model)

Fazit: Die Überprüfung des Modells zeigt, dass die Residuen (Fehler) zwar nicht perfekt normal verteilt sind, aber die Abweichungen sind nicht allzu gross (das zeigt der Q-Q Plot). Da die Anwendung einer Log-Transformation auf die Verkaufszahlen nicht zu einer signifikanten Verbesserung führt, habe ich mich entschieden, eine ANOVA ohne die log-transformierten Verkaufszahlen durchzuführen.

# sieht aus, als ob die Voraussetzungen für eine Anova nur geringfügig verletzt sind
# mögliche alternativen:
# 0. keine Tranformation der AV (machen wir hier)
# 1. log-transformation um die grossen werte zu minimieren (nur möglich, wenn
# keine 0 enthalten sind und die Mittelwerte weit von 0 entfernt sind (bei uns wäre dies klar erfüllt)
# => bei Zähldaten ist dies leider nicht immer gegeben)
# 2. nicht parametrische Test z.B. Welch-Test, wenn hohe Varianzheterogenität
# zwischen den Residuen

# 0) keine Tranformation
# post-hov Vergleiche
TukeyHSD(model)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = tot_sold ~ article_description * member, data = df)

$article_description
                       diff      lwr       upr p adj
Kitchen-Fav_World -494.1667 -513.785 -474.5484     0

$member
                           diff      lwr      upr p adj
Studierende-Mitarbeitende 173.5 153.8817 193.1183     0

$`article_description:member`
                                                     diff        lwr        upr
Kitchen:Mitarbeitende-Fav_World:Mitarbeitende -327.000000 -363.75650 -290.24350
Fav_World:Studierende-Fav_World:Mitarbeitende  340.666667  303.91017  377.42317
Kitchen:Studierende-Fav_World:Mitarbeitende   -320.666667 -357.42317 -283.91017
Fav_World:Studierende-Kitchen:Mitarbeitende    667.666667  630.91017  704.42317
Kitchen:Studierende-Kitchen:Mitarbeitende        6.333333  -30.42317   43.08983
Kitchen:Studierende-Fav_World:Studierende     -661.333333 -698.08983 -624.57683
                                                  p adj
Kitchen:Mitarbeitende-Fav_World:Mitarbeitende 0.0000000
Fav_World:Studierende-Fav_World:Mitarbeitende 0.0000000
Kitchen:Studierende-Fav_World:Mitarbeitende   0.0000000
Fav_World:Studierende-Kitchen:Mitarbeitende   0.0000000
Kitchen:Studierende-Kitchen:Mitarbeitende     0.9672944
Kitchen:Studierende-Fav_World:Studierende     0.0000000
# 1) Alterativ: log-transformation
model_log <- aov(log10(tot_sold) ~ article_description * member, data = df)

summary.lm(model_log) # interaktion ist nun nicht mehr signifikant: vgl.

Call:
aov(formula = log10(tot_sold) ~ article_description * member, 
    data = df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.191372 -0.025043  0.003191  0.037604  0.182842 

Coefficients:
                                             Estimate Std. Error t value
(Intercept)                                   2.65417    0.01696 156.533
article_descriptionKitchen                   -0.56517    0.02398 -23.569
memberStudierende                             0.24438    0.02398  10.191
article_descriptionKitchen:memberStudierende -0.21726    0.03391  -6.407
                                             Pr(>|t|)    
(Intercept)                                   < 2e-16 ***
article_descriptionKitchen                    < 2e-16 ***
memberStudierende                            3.71e-13 ***
article_descriptionKitchen:memberStudierende 8.51e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.05874 on 44 degrees of freedom
Multiple R-squared:  0.9745,    Adjusted R-squared:  0.9728 
F-statistic: 561.4 on 3 and 44 DF,  p-value: < 2.2e-16
# nochmals euren Boxplot zu beginn, machen diese Koeffizienten sinn?

# überprüft die Modelvoraussetzungen (vgl. Skript Statistik 2)
# bringt aber keine wesentliche Verbesserung, daher bleibe ich bei den
# untransformierten Daten
par(mfrow = c(2, 2))
plot(model_log)

# post-hov Vergleiche
TukeyHSD(model_log) # gibt sehr ähnliche Resultate im Vergleich zum nicht-transformierten Model
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = log10(tot_sold) ~ article_description * member, data = df)

$article_description
                        diff        lwr        upr p adj
Kitchen-Fav_World -0.6738029 -0.7079755 -0.6396302     0

$member
                               diff       lwr       upr p adj
Studierende-Mitarbeitende 0.1357518 0.1015791 0.1699244     0

$`article_description:member`
                                                     diff         lwr
Kitchen:Mitarbeitende-Fav_World:Mitarbeitende -0.56517128 -0.62919652
Fav_World:Studierende-Fav_World:Mitarbeitende  0.24438333  0.18035809
Kitchen:Studierende-Fav_World:Mitarbeitende   -0.53805110 -0.60207634
Fav_World:Studierende-Kitchen:Mitarbeitende    0.80955461  0.74552937
Kitchen:Studierende-Kitchen:Mitarbeitende      0.02712017 -0.03690507
Kitchen:Studierende-Fav_World:Studierende     -0.78243444 -0.84645968
                                                      upr     p adj
Kitchen:Mitarbeitende-Fav_World:Mitarbeitende -0.50114604 0.0000000
Fav_World:Studierende-Fav_World:Mitarbeitende  0.30840857 0.0000000
Kitchen:Studierende-Fav_World:Mitarbeitende   -0.47402586 0.0000000
Fav_World:Studierende-Kitchen:Mitarbeitende    0.87357985 0.0000000
Kitchen:Studierende-Kitchen:Mitarbeitende      0.09114541 0.6726112
Kitchen:Studierende-Fav_World:Studierende     -0.71840920 0.0000000

Methode

Unser Ziel war es, herauszufinden, ob es Unterschiede zwischen den preisgünstigeren und teureren Menülinien in Bezug auf die Zugehörigkeit zur Hochschule gibt. Dafür haben wir eine ANOVA mit Interaktion durchgeführt, da wir eine Art von Zahlenangabe für unsere Ergebnisse und zwei Faktoren (Menülinie und Hochschulzugehörigkeit) hatten.

Im ersten Modell haben wir festgestellt, dass die Voraussetzungen für eine ANOVA grösstenteils erfüllt waren, abgesehen von der Normalverteilung der Abweichungen (Residuen). Aus diesem Grund haben wir uns entschieden, auf eine log-Transformation der Zahlenangabe zu verzichten. Anschliessend haben wir zusätzlich Einzelvergleiche nach Tukey durchgeführt, um spezifische Unterschiede zwischen den Gruppen zu ermitteln.

Ein wichtiger Punkt zu beachten: Die Verkaufsdaten sind in Wirklichkeit Zähldaten und haben eine binomiale Verteilung, da sie keine negativen Werte haben können. Bei der Analyse stelle ich mir immer zwei Fragen:

  1. Wie weit ist der Mittelwert von “Null” entfernt? Wenn die Daten keine starken Abweichungen von der Normalverteilung aufweisen, können wir trotzdem annehmen, dass sie normal verteilt sind.

  2. Enthalten die Daten viele “Nullen”? Wenn dies der Fall ist, müssen wir eine spezielle binomiale Verteilung berücksichtigen, wie beispielsweise die Verwendung einer negativen binomialen Transformation mit einem general linear model (GLM) (siehe Skript Kapitel 4).

Ergebnisse

Die wöchentlichen Verkaufszahlen der verschiedenen Menülinien sind abhängig von der Zugehörigkeit zur Hochschule und zeigen signifikante Unterschiede (p < 0.001). Das bedeutet, dass Studierende die preisgünstigere Menülinie “Favorite & World” signifikant häufiger kaufen als Mitarbeitende. Überraschenderweise gibt es jedoch keine signifikanten Unterschiede zwischen Studierenden und Mitarbeitenden beim Kauf der teureren Menülinie “Kitchen”. Um die möglichen Gründe dafür zu verstehen, sind weitere Analysen erforderlich, beispielsweise unter Einbeziehung des Menüinhalts als zus$tzlicher Faktor resp. Variable.

Abbildung 24.2: Box-Whisker-Plots der wöchentlichen Verkaufszahlen pro Menü-Inhalte. Kleinbuchstaben bezeichnen homogene Gruppen auf p < .05 nach Tukeys post-hoc-Test.