Standort Nürnberg


Berufsbegleitender Studiengang zum Bachelor of Science (B. Sc.)


2. Semester


Hausarbeit im Modul Datenerhebung & Statistik




Mathematik ist auch eine Sprache - Arbeit am Datensatz “student” zur Untersuchung einseitiger Begabung


Thomas Lenk




Dozent: Prof. Dr. habil. Sebastian Sauer


Matrikelnummer: 531299


Abgabedatum 17.09.2020







Gliederung


  1. Hinführung zum Thema
  2. Forschungsfrage
  3. Das Hypothesenpaar
  4. Alpha
  5. Datenvorverarbeitung
  6. Deskriptive Statistik
  7. Inferenz
  8. Diskussion


1. Hinführung zum Thema

Während der Vorbereitung auf die Klausur dieses Moduls kam es unter den Studierenden vermehrt zu Annahmen, dass man selbst eher der “Mathe-” oder doch der “Sprachentyp” sei. Man sich also lieber in verbalen Darstellungen vergnügt oder eben in denen der Mathematik. Interessant wäre es also nun zu sehen, ob diese Typentrennungen durch Daten gestützt werden. Sind Stärken auf der mathematischen Seite quasi Prädiktor für Versagen auf der anderen? Vielleicht stehen mathematische und sprachliche Leistungen in keinem Zusammenhang. Vielleicht ist aber alles eine faule Bauernregel - man darf durchaus auf beiden Gebieten gut sein.

Der Datensatz entspringt dem Archiv für Maschinelles Lernen der University of California, Irvine. Erhoben wurden 33 sozial- bzw. leistungsbasierte Variablen bei ingesamt 1044 Mathe- & Portugiesisch-Kursteilnehmern der weiterführenden Schulen “Gabriel Pereira”, Évora, sowie “Mouzinho da Silveira” in Portalegre, Portugal. Bei dieser Erhebung wurden die Schulen zufällig gewählt, die Tests zufällig zugewiesen. Wir werden später also auf eine vergleichbare Population inferieren können. Wir schauen uns gezielt die Noten der Kurse Portugiesisch und Mathematik an. Anders als in unserem üblichen Bewertungssystem, 1 bis 5 bzw. 6, reichen diese Wertungen von 0 bis 20 - numerisch auf Verhältnisskalen. Als Anhaltspunkt sei bemerkt, dass ein Wert von 10 oder mehr zum bestehen des Moduls ausreicht.

2. Forschungsfrage

Ist die durchschnittliche Mathematikbegabung ein signifikanter, linearer Prädiktor der durchschnittlichen Höhe der Sprachbegabung als Kriterium?

3. Das Hypothesenpaar

\(H_0:\beta_1=0\), wobei \(\beta_1\) den Koeffizienten des Regressionsmodells der durchschnittlichen Portugiesisch-Noten als Funktion der durchschnittlichen Mathematiknoten darstellt. Die Steigung der Regressionsgeraden als Modell von Portugiesischnoten nach Mathematiknoten ist 0. Es gibt keinen Zusammenhang.

\(H_A: \beta_1≠0\), Die Steigung der Regressionsgeraden als Modell von Portugiesischnoten nach Mathematiknoten ist ungleich 0. Es gibt einen Zusammenhang.

4. Alpha setzen

Das Signifikanzniveau setzen wir vor Beginn der Untersuchung auf den üblichen Wert von 5%.

5. Datenvorverarbeitung

Wir laden unsere benötigten Pakete
library(broom)
library(mosaic)
library(cowplot)
library(lsr)
library(caret)
library(modelr)
library(gridExtra)
library(sjmisc)
library(knitr)
und binden die Datensätze ein
temp <- tempfile() 
download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/00320/student.zip",temp) 
MatheKurs <- read.csv2(unz(temp, "student-mat.csv")) 
PortugiesischKurs <- read.csv2(unz(temp, "student-por.csv")) 
remove(temp)
Sogleich die Prüfung, ob die relevanten Variablen vollständig sind.
Missing<- merge_df(PortugiesischKurs,MatheKurs)
inspect(Missing$G1,G2,G3)$missing
## [1] 0
Nichts fehlt. Weiter zum Feinschliff:
Da die Datensätze der beiden Schulen nach Kursen geteilt wurden, werden wir als ersten Schritt beide Datensätze wieder zusammenlegen.
Uns interessieren dabei nur Schüler, die beide Kurse besuchen.
Schueler=merge(MatheKurs,PortugiesischKurs,by=c("school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet","guardian","guardian","traveltime","studytime","failures","schoolsup","famsup","activities","higher","romantic","famrel","freetime","goout","Dalc","Walc","health","absences"))
print(nrow(Schueler))
## [1] 85

Wichtig ist, die Variable paid außen vor zu lassen, da sie nach Definition eine kursspezifische Variable darstellt und keine schülerspezifische:

(…)extra paid classes within the course subject (Math or Portuguese) (binary: yes or no)(…)

Es befinden sich also 85 Schüler sowohl in den Kursen Mathematik als auch Portugiesisch, welche nun die Grundlage für den Leistungsvergleich darstellen werden.

Gegeben sind uns 3 Perioden, G1-G3. Wir untersuchen aber den Einfluss der durchschnittlichen Noten. Erstellen wir diese…
SchuelerBeiderKurse<-Schueler %>%
  mutate(Matheschnitt=rowMeans(cbind(G1.x,G2.x,G3.x))) %>% 
  mutate(Portuschnitt=rowMeans(cbind(G1.y,G2.y,G3.y)))
…und schauen uns deren Verteilung beziehungsweise interessante Maße einmal genauer an.

6. Datenanalyse

Den Modus bestimmen wir ‘on-the-fly’, da zum Zeitpunkt der Erstellung keine kompatible “eingebackene”- oder paketeigene Funktion für die Darstellung des Modus im R 4.0.2 verfügbar war.

Visualisierung relevanter Maße

ModusMa<-count(SchuelerBeiderKurse, Matheschnitt) %>% arrange(-n) %>% top_n(1)
ModusPo<-count(SchuelerBeiderKurse, Portuschnitt) %>% arrange(-n) %>% top_n(1)

mh<-gf_dhistogram( ~ Matheschnitt, data = SchuelerBeiderKurse, binwidth = 2, xlab = "Durchschnittsnote Mathematik")  %>% 
  gf_dens(~Matheschnitt, data = SchuelerBeiderKurse,color = "#8b0000") %>%
  gf_vline(color = "#ffff74", size = 1, xintercept = ~mean(Matheschnitt, data=SchuelerBeiderKurse)) %>% 
  gf_vline(color = "#00008b", size = 1, xintercept = ~Matheschnitt, data = ModusMa)
  

ph<-gf_dhistogram( ~ Portuschnitt, data = SchuelerBeiderKurse, binwidth = 2, xlab = "Durchschnittsnote Portugiesisch")%>% 
  gf_dens(~Portuschnitt, data = SchuelerBeiderKurse,color = "#8b0000") %>% 
  gf_vline(color = "#ffff74", size = 3, xintercept = ~mean(Portuschnitt, data=SchuelerBeiderKurse)) %>% 
  gf_vline(color = "#00008b", size = 1, xintercept = ~Portuschnitt, data = ModusPo)

av<-gf_violin(Matheschnitt ~ 1, data = SchuelerBeiderKurse, fill = "#00008b",alpha = 0.3, ylab= "Durchschnittsnote Mathematik") %>% 
  gf_boxplot(Matheschnitt ~ 1, data = SchuelerBeiderKurse) %>% 
  gf_point(mean(Matheschnitt)~1, data = SchuelerBeiderKurse, color = "#ffff74", size = 6) %>% 
  gf_point(Matheschnitt~1, data = ModusMa, color = "#ff0000")

bv<-gf_violin(Portuschnitt ~ 1, data = SchuelerBeiderKurse, fill = "#00008b",alpha = 0.3, ylab= "Durchschnittsnote Portugiesisch") %>% 
  gf_boxplot(Portuschnitt ~ 1, data = SchuelerBeiderKurse) %>% 
  gf_point(mean(Portuschnitt)~1, data = SchuelerBeiderKurse, color = "#ffff74", size = 6) %>% 
  gf_point(Portuschnitt~1, data = ModusPo, color = "#ff0000") 

grid.arrange(mh, ph, av, bv, nrow = 2)

Die Verteilung der Mathematiknoten nimmt eine multimodale Form an. Zwei Gipfel um den Mittelwert(gelb) stellen zur Linken die “gerade so”-Bestehenden, zur Rechten die überdurchschnittlich Begabten, dar. Weiter links, ein wesentlich kleinerer Gipfel, die durchfallenden Schüler. Der Modus (blau) und damit die häufigste Merkmalsausprägung liegt ebenfalls dazwischen; nur leicht über der “kritischen 10”. Die Verteilung der Portugiesischnoten nähert sich einer unimodalen Form an. Die Mehrheit der Beobachtungen siedelt sich hier im mittleren bis oberen Wertebereich an und gipfelt dicht am Mittelwert beziehungsweise Modus.

Als konkrete Werte

Mathe_summary <- SchuelerBeiderKurse %>% 
  summarise(Mittelwert = mean(Matheschnitt),
            MAD = aad(Matheschnitt),
            Varianz = var(Matheschnitt),     
            sd = sd(Matheschnitt),
            Q_1 = favstats(Matheschnitt)$Q1,
            Median= median(Matheschnitt),
            Q_3 = favstats(Matheschnitt)$Q3,
            IQR = iqr(Matheschnitt),
            Modus= ModusMa$Matheschnitt,
            min = favstats(Matheschnitt)$min,
            max = favstats(Matheschnitt)$max,
            Range = favstats(Matheschnitt)$max-favstats(Matheschnitt)$min)


Portu_summary <- SchuelerBeiderKurse %>% 
  summarise(Mittelwert = mean(Portuschnitt),
            MAD = aad(Portuschnitt),
            Varianz = var(Portuschnitt), 
            sd = sd(Portuschnitt),
            Q_1 = favstats(Portuschnitt)$Q1,
            Median= median(Portuschnitt),
            Q_3 = favstats(Portuschnitt)$Q3,
            IQR = iqr(Portuschnitt),
            Modus= ModusPo$Portuschnitt,
            min = favstats(Portuschnitt)$min,
            max = favstats(Portuschnitt)$max,
            Range = favstats(Matheschnitt)$max-favstats(Matheschnitt)$min)


Zusammenfassung<-merge_df(Mathe_summary,Portu_summary) 
rownames(Zusammenfassung)[rownames(Zusammenfassung) == "1"] = "Mathematik"
rownames(Zusammenfassung)[rownames(Zusammenfassung) == "2"] = "Portugiesisch"

kable(Zusammenfassung)
Mittelwert MAD Varianz sd Q_1 Median Q_3 IQR Modus min max Range
Mathematik 12.10588 2.854717 12.058761 3.472573 10 12.00000 14.66667 4.666667 11.66667 3.666667 18.66667 15
Portugiesisch 12.92941 2.046228 6.804482 2.608540 11 12.66667 14.66667 3.666667 13.00000 4.333333 18.00000 15

Die Lagemaße, welche Werte also repräsentativ sind, zeigen, dass, bis auf den gleichen Q_3-Wert, im Fach Portugiesich typischerweise mit höheren Wertungen abgeschlossen wird. Bezogen auf die Streuungsmaße, d.h. wie unterschiedlich bzw. ähnlich die Werte sind: Die Daten streuen in der Mathematik mehr. Sowohl mittlerer absoluter Abstand, Varianz, Standardabweichung als auch Interquartilsabstand zeigen, dass es typisch für einzelne Mathematikbewertungen ist weiter auseinander zu liegen bzw. extremer streuen. So liegt z.B. das Q1 gerade am Schnitt, um den Kurs zu bestehen. 25% der Studenten liegen hier noch darunter. In Portugiesisch liegt Q1 um einen ganzen Punkt darüber. Dazu liegt es dichter am Q2 und hat letztlich auch den geringeren IQR, streut dichter.

Über die Spannweite 0-20 aller möglichen Wertungen, liegen beide Fächer dennoch nah beieinander. Portugiesisch scheint aber sicherer zu absolvieren.

Stimmt das?

SchuelerBeiderKurse<-SchuelerBeiderKurse %>%
  mutate(Kursergebnis_Mathe = case_when(Matheschnitt < 9.5 ~ "Durchgefallen",
                                        Matheschnitt >= 9.5 ~ "Bestanden",)) %>%
  mutate(Kursergebnis_Portugiesisch = case_when(Portuschnitt < 9.5 ~ "Durchgefallen",
                                        Portuschnitt >= 9.5 ~ "Bestanden")) 
  
  
  
bm<-gf_bar(~ nrow(SchuelerBeiderKurse), data = SchuelerBeiderKurse, fill = ~Kursergebnis_Mathe, xlab = "Absolventen")
bp<-gf_bar(~ nrow(SchuelerBeiderKurse), data = SchuelerBeiderKurse, fill = ~Kursergebnis_Portugiesisch, xlab = "Absolventen")
  
  plot_grid(bm, bp)

   SchuelerBeiderKurse %>% 
  select(Kursergebnis_Mathe, Kursergebnis_Portugiesisch) %>% 
  table()
##                   Kursergebnis_Portugiesisch
## Kursergebnis_Mathe Bestanden Durchgefallen
##      Bestanden            68             0
##      Durchgefallen        14             3
  tally( ~Kursergebnis_Mathe & Kursergebnis_Portugiesisch,format = "percent", data = SchuelerBeiderKurse)
##                   Kursergebnis_Portugiesisch
## Kursergebnis_Mathe Bestanden Durchgefallen
##      Bestanden     80.000000      0.000000
##      Durchgefallen 16.470588      3.529412

Unsere Vermutung spiegelt sich in beiden Balken wieder. Beinahe niemand fällt im sprachwissenschaftlichen Kurs durch (vorausgesetzt wird hier ein “aufrundungsgeneigter” Dozent).

68 Absolventen haben nach ihrem Notendurchschnitt in Mathematik bestanden, 17 nicht. 82 Absolventen schafften es entsprechend in Portugiesisch, 3 sind duchgefallen. Das entspricht einer Erfolgsquote von ≈80% in Mathematik und ≈96% in Portugiesisch. Die Zahlen lassen auf ein insgesamt positives Sentiment der Schüler gegenüber einem breiten Wissenspektrum schließen und “klammern”, zumindest bisher, den gesuchten Zusammenhang nicht aus.

Einer fliegt über das Kuckucksnest

Nachdem wir uns die Verhältnisse verdeutlicht haben, gehen wir nocheinmal auf den Ausreißer des Boxplot ein
Portu_IQR <- iqr(~ Portuschnitt, data = SchuelerBeiderKurse)
Portu_Q1 <- quantile(~Portuschnitt, p = .25, data = SchuelerBeiderKurse)
untere_Grenze <- Portu_Q1 - 1.5 * Portu_IQR

SchuelerBeiderKurse %>%
  filter(Portuschnitt < untere_Grenze) %>% 
  summarise(Mathe= Matheschnitt,
            Portugiesisch= Portuschnitt)
Wir werden diesen Schüler nicht entfernen. Zum einen kann nicht ohne weiteres festgestellt werden, ob es sich um “schlechte Daten” handelt, zum anderen widerspricht er dem gesuchten Zusammenhang nicht. Er ist also kein Bernoulli der Mathematik und gleichzeitig nicht sprachbegabt. Der “ausreißende” Schüler hat in beiden Dimensionen noch ausreichend Potential.

Test auf Normalverteilung

Ein kurzer Test auf eine Normalverteilung zeigt, dass nur in der Mathematikwertung die Nullverteilung nicht ausgeschlossen werden kann.
shapiro.test(SchuelerBeiderKurse$Matheschnitt)
## 
##  Shapiro-Wilk normality test
## 
## data:  SchuelerBeiderKurse$Matheschnitt
## W = 0.97725, p-value = 0.138
Da der p-Wert größer als 5% ist, wird die Nullhypothese, dass eine Normalverteilung vorliegt, nicht verworfen.
shapiro.test(SchuelerBeiderKurse$Portuschnitt)
## 
##  Shapiro-Wilk normality test
## 
## data:  SchuelerBeiderKurse$Portuschnitt
## W = 0.96622, p-value = 0.02509
Der p-Wert ist im Fall des Portugiesischunterrichts kleiner als 5, also wird die Nullhypothese verworfen.

Modell

SBKmodel<-lm(Portuschnitt~Matheschnitt, data = SchuelerBeiderKurse)
summary(SBKmodel)
## 
## Call:
## lm(formula = Portuschnitt ~ Matheschnitt, data = SchuelerBeiderKurse)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8780 -1.2929 -0.0383  0.8858  4.3766 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   6.16138    0.69325   8.888 1.10e-13 ***
## Matheschnitt  0.55907    0.05507  10.152 3.28e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.753 on 83 degrees of freedom
## Multiple R-squared:  0.5539, Adjusted R-squared:  0.5485 
## F-statistic: 103.1 on 1 and 83 DF,  p-value: 3.284e-16

Wir sehen, dass mit jedem Zuwachs eines Punktes im Fach “Mathematik” auch die Portugiesischnote um ≈0,56 verbessert (Steigung “Matheschnitt”). Im Modell haben Schüler selbst bei einer “0”-Punkte-Bewertung im Fach Mathematik, noch eine Wertung von ≈6,16 im Fach Portugiesisch (Intercept).

Der traditionelle Weg würde uns schon jetzt zeigen, dass eine solche Steigung unter Annahme einer H0-Verteilung quasi null entspricht
2 * pt(10.152, df = 83, lower.tail = FALSE)
## [1] 3.28237e-16

Wir gehen aber den simulationsbasierten Weg im letzten Abschnitt der Arbeit.

Hervorzuheben ist hier, dass das Bestimmtheitsmaß R² von ≈0,55 nicht nur zeigt, dass unser Modell einen um 55% kleineren Vorhersagefehler erbringt als ein reines Nullmodell, sondern auch ein Indiz für eine stark positive Korrelation der erbrachten Leistungen in den Kursen Mathematik und Portugiesisch andeutet, da sich der Korrelationskoeffizient aus der Quadratwurzel von R² ergibt.

Test:

Toleranzwert = 1e-15
abs((cor(Matheschnitt~Portuschnitt,data = SchuelerBeiderKurse)) %>% #Der Korrelationskoeffizient sollte sich mit
    -(sqrt(summary(SBKmodel)$r.squared)))<=Toleranzwert #der Quadratwurzel des R² quasi aufheben
## [1] TRUE
sqrt(summary(SBKmodel)$r.squared)
## [1] 0.7442518
Mit \(r≈0,74\) eine stark positive Korrelation

Wie uns der Datasaurus gelehrt hat, sollten diese Daten aber visualisiert werden, um das Bestimmtheitsmaß zu stützen:
gf_point(Portuschnitt~Matheschnitt, data = SchuelerBeiderKurse, alpha = 0.2, size = 2.5) %>% 
  gf_lm(alpha = 0.5)

Wir sehen, dass sich die zuvor angenommene positive Korrelation in dem Graphen widerspiegelt.

Prüfung der Annahmen der linearen Regression

Da der letzte Plot bereits die Linearität des Zusammenhangs zwischen Prädiktor und Kriterium visualisiert hat, prüfen wir gleich die weiteren Prämissen eines linearen Modells:
SchuelerBeiderKurse %>%
  add_residuals(SBKmodel) %>%
  ggplot +
  aes(x = resid) +
  geom_histogram(binwidth = .8, center=1) -> residh

qplot(sample = .stdresid, data = SBKmodel) +
  geom_abline(color = "green") +
  labs(x = "theoretical", y= "sample")-> residq



SchuelerBeiderKurse %>%
  add_predictions(SBKmodel) %>%
  add_residuals(SBKmodel) %>%
  ggplot() +
  aes(y = resid, x = pred) +
  geom_jitter(alpha = .2, width = .005) +
  geom_boxplot(aes(group = pred), alpha = .7) -> predbox

gf_point(resid(SBKmodel) ~ fitted(SBKmodel),ylab = "resid", xlab = "fitted") -> scatter

grid.arrange(residh, residq, predbox, scatter, nrow = 1)

(2) Die Residuen sind laut Histogram annähernd normalverteilt. Auch zeigt Quantil-Quantil-Diagramm, dass bis auf die “Enden” der Regressionsgeraden die Residuenpunkte eng angelegt sind - im Sinne der Normalverteilung.
(3) Das Residuenplot lässt zumindest keine eindeutigen Muster einer beipsielsweise exponentiellen oder sinusoidalen Funktion zu erkennen, jedoch liegt keine gleichmäßige Varianz vor und somit die Annahme der Homoskedastizität gewissermaßen verletzt. Bei geringen und hohen Vorhersagewerten, welche zugleich die seltener vertretenen sind, werden die Residuen vergleichsweise groß dargestellt, können also nicht so genau geschätzt werden.
(4) Extreme Ausreißer sind nur in geringem Maße vertreten
(5) Die Unabhängigkeit der Residuen scheint gegeben, da keine serienartigen Muster innerhalb des Residuenplots erkennbar sind, jedoch ist die Unabhängigkeit der Beobachtungen in Gruppen bzw. Klassen immer mit einem Augenzwinkern verbunden. Zumindest spricht in unserem Fall nichts gegen diese Unabhängigkeit.

Modellgüte

Ein Maß der Modellgüt haben wir bereits betrachtet; das R². Hierbei haben wir erkannt, dass unser Modell einen ≈55% kleineren Verhersagefehler, im Verhältnis zu einem Nullmodel, wiedergibt.
Zusätzlich betrachten wir, mit einem recht guten Ergebnis, den MSE, Mittelwert der Quadratfehler, oder auch die quadrierte Differenz der Vorhersage- & Beobachtungspunkte.
mean(SBKmodel$residuals^2) 
## [1] 2.999695
Deutlicher wird, dass das Ergebnis “recht gut” ist, wenn wir aus diesem Ergebnis noch die Wurzel ziehen, den RSME erhalten und so wieder in unseren “Noteneinheiten” sehen, dass eine mittlere Abweichung von ≈1,73 Notenpunkten vorliegt.
sqrt(mean(SBKmodel$residuals^2))
## [1] 1.731963
Bevor das Modell in die SBI geht, überprüfen wir nocheinmal, ob es einzelne Einflusspunkte gibt, die die Koeffizienten im Regressionsmodell zu stark beeinflussen.
any(cooks.distance(SBKmodel) > 1) 
## [1] FALSE
Wir finden keine Einflusspunkte, die schwer genug sind. Also weiter.

7. Inferenz

Zuerst erstellen wir eine Bootstrap-Verteilung, um die uns unbekannte Verteilung zu schätzen.
set.seed(1337)
  BootSBK <- do(10000) *lm(Portuschnitt~Matheschnitt, data = mosaic::resample(SchuelerBeiderKurse))
“Empmodel” wird hierbei im 2. Schritt der Wert unserer empirischen Beobachtung zugewiesen. Um darzustellen, wie sich die Bootstrapverteilung unseres Steigungskoeffizienten verteilt, erstellen wir ein Histogramm.
Empmodel<-coef(lm(Portuschnitt~Matheschnitt, data = SchuelerBeiderKurse))[2]
 ModelQ1<-quantile( ~ Matheschnitt, probs = c(0.025, 0.975), data = BootSBK)[1]
 ModelQ2<-quantile( ~ Matheschnitt, probs = c(0.025, 0.975), data = BootSBK)[2] 
 
   gf_histogram( ~ Matheschnitt, data = BootSBK) %>% 
     gf_vline(xintercept = ~Empmodel) %>% 
     gf_vline(color = c("blue"), xintercept = ~ c(ModelQ1, ModelQ2), data = NA)

confint(BootSBK)
sd( ~ Matheschnitt, data = BootSBK)
## [1] 0.06731947

Wir können erkennen, dass das 95%-Konfidenzintervall der Steigung nicht die Null oder gar negative Werte beinhaltet, sondern sich von ≈ 0,43 bis ≈ 0,69 erstreckt. Mit einer Sicherheit von 95% wird eine erneute Resampling-Stichprobe wieder einen Wert in diesem Intervall ausgeben und den wahren Wert der Population überdecken. Dieser Schätzkorridor hat einen Standardfehler von 0.06731947. Unsere Erwartungswerte liegen also zwischen dem “Estimate” unseres Koeffizienten “Matheschnitt” von 0.6080122 ± 2*0.06731947.
Das entsprechende Konfidenzintervall unseres Achsenabschnitts verläuft zwischen ≈ 4,39 und ≈ 7,79, das unseres R² zwischen ≈ 0,41 und ≈ 0,69.

Um nun zu sehen, wie plausibel unsere Daten sind, simulieren wir eine zweite (Permutations-)Verteilung: Wenn \(H_0\) gelten würde und \(\beta_1=0\), das heißt, die Mathematiknoten in keinem linearen Zusammenhang zu den Portugiesischnoten stehen würden.
set.seed(1337)
  SBKnull <- do(10000) *lm(Portuschnitt ~ shuffle(Matheschnitt), data = SchuelerBeiderKurse)
Wir untersuchen nun, ob man auch hier unseren empirischen Wert finden kann.
gf_histogram( ~ Matheschnitt, data = SBKnull) %>% 
  gf_vline(xintercept = ~Empmodel, color = "blue")

Die beobachtete Steigung ist visuell beinahe nicht in der Verteilung vertreten, die von Zusammenhangslosigkeit ausgeht. Genauer zeigt das der Standardfehler:
sdnull<-sd( ~ Matheschnitt, data = SBKnull)
(Empmodel-0)/sdnull
## Matheschnitt 
##     6.849185
Der beobachtete Wert der Stichprobe liegt vom angenommenen Wert 0 ca. 6,85 sd Einheiten entfernt, ist also extrem selten. Zur Verdeutlichung:
xpnorm(Empmodel, mean = mean(~Matheschnitt, data=SBKnull), sd = sdnull)

## Matheschnitt 
##            1
SBKnull <- SBKnull %>%
     mutate(effektnull = abs(Matheschnitt))
prop( ~ (effektnull >= Empmodel), data = SBKnull)
## prop_TRUE 
##         0
Sowohl die grafische als auch die Anteilsuntersuchung durch xpnorm zeigen, dass der p-Wert sehr nah an die 0 rückt, wir also die \(H_0\) verwerfen und die \(H_1\) annehmen können, da wir unter Annahme einer Nullhypothese nicht im Stande sind, vergleichbare Einflussgrößen der Mathematiknoten auf die Portugiesischnoten zu finden. Das Ergebnis ist also statistisch signifikant zum alpha von 5%.

8. Diskussion

Schlussfolgerungen

Innerhalb dieser Daten war in der Datenanalyse ersichtlich, dass die Leistungsergebnisse beider (dem Ursprung der Untersuchung nach entgegengerichteten) Kurse nicht einseitig verrissen sind. Ist ein positives Leistungsniveau im Fach Mathematik zu erkennen, ist nach unserem Modell auch ein vergleichbar positiver Wert im Fach Portugiesisch zu erwarten- also vielmehr eine gleichgerichtetes Verhältnis. Die Zusammenhangslosigkeit konnte anhand der Nullhypothese verworfen werden.

Interpretation

Mit der gegebenen Modellgüte lässt uns nun theoretisch innerhalb unseres Prognoseintervalls der Notendurchschnitt nach gegebenen Mathematikdurchschnitt prognostizieren.
predict(SBKmodel,newdata = data.frame(Matheschnitt = 5), interval = "prediction")
##        fit      lwr      upr
## 1 8.956727 5.364877 12.54858
Ausgehend von einem Schnitt “von”5" in Mathematik, zeigt das Modell, dass ein Notendurchschnitt zwischen ≈5,4 und ≈12,5 zu erwarten ist. Genau am Modell (fit) sind es ≈9.

Grenzen der Analyse

Bei der Analyse wurden die Durchschnittswerte von Periodenergebnissen berechnet, die wiederum auch nur Mittelwerte ihrer jeweiligen Periode darstellen. Sämtliche Einzelleistungen innerhalb der (unbekannten) Vektoren fallen so “unter den Tisch”.

Es wurden zudem lediglich Daten an zwei Schulen in Portugal erhoben. Wir können also maximal auf vergleichbare portugiesische Schüler schließen, sofern davon ausgegangen wird, dass die beiden Standorte repräsentativ sind. Zudem ist die Stichprobe recht knapp bemessen, um aus ihr heraus zu inferieren.

Auch gab es keine weitere Beschreibung äußerer Einflüsse oder zum Verhalten der Schüler. So kann man beispielsweise Störvariablen vermuten, aber eben nicht sicher nachweisen.

Unser p-Wert scheint zwar sehr eindeutig, jedoch ist er, so wie die Schätzung des Standardfehlers, durch die Verletzung der Annahme der Homoskedastizität beeinflusst. Die eigentliche Schätzung der Steigung bleibt dabei unberührt.

Anregungen für weiterführende Analysen

Der Datensatz bietet ein riesiges Spektrum individueller Daten nach sozialen, geschlechtsspezifischen aber auch leistungsbasierten Gesichtspunkten. Weiter kann analysiert werden, ob unser gezeigter Zusammenhang weiterhin in multiplen Regressionen besteht, abhängig vom Bildungsstand der Eltern, dem Status der eigenen Beziehung oder ob der Unterschied, vom Lande bzw. aus der Stadt zu kommen, hier ein aussagekräftigeres Einflussgewicht an den Tag bringt.