# Struktur prüfen: Welche Datentypen liegen vor?
str(schrauben_daten)'data.frame': 20 obs. of 1 variable:
$ Laenge: num 50.3 49.9 50.1 50.1 50.1 ...
Hintergrund: In der Qualitätskontrolle ist oft nicht nur der Mittelwert wichtig (z.B. “Sind durchschnittlich 500g im Beutel?”), sondern vor allem die Beständigkeit (Streuung). Eine Maschine, die mal 400g und mal 600g abfüllt, hat zwar im Schnitt 500g, ist aber unbrauchbar.
Wir betrachten einen Hersteller von Präzisionsschrauben. Vorgabe (Soll): Die Varianz der Länge darf laut Norm höchstens 0.04 mm² betragen (das entspricht einer Standardabweichung von 0.2 mm). Messung: Wir ziehen eine Stichprobe aus der laufenden Produktion.
Forschungsfrage: Weicht die Varianz unserer Stichprobe signifikant von der Soll-Varianz (\(\sigma^2_0 = 0.04\)) ab?
Wir folgen dem Workflow der Datenanalyse: [Link]
Bezug Glossar: Variablen & Datentypen [Link]
Der Datensatz den wir analysieren wollen hat den Namen schrauben_daten. Dieser wurde für unser Lern-Szenario zunächst künstlich erstellt.
Wir prüfen die Struktur:
# Struktur prüfen: Welche Datentypen liegen vor?
str(schrauben_daten)'data.frame': 20 obs. of 1 variable:
$ Laenge: num 50.3 49.9 50.1 50.1 50.1 ...
Struktur: Wir haben eine metrische Variable (Laenge). Wir wollen die Varianz testen.
Wichtiges Vorwissen: R berechnet mit sd() die Standardabweichung s und mit var() die Varianz s^2. Unser Soll-Wert (Hypothese) ist \(\sigma^2_0 = 0.04\).
Hinweis: An der Stelle könnte neben der Struktur auch noch die Werteverteilung der Schraubenlängen mit dem summary()-Befehl untersucht werden. Es reicht aber auch aus sich die Verteilung im nächsten Schritt direkt visuell anzuschauen.
Bezug Glossar: Grafische Darstellung
Bevor wir zum testen kommen, schauen wir uns die Verteilungen an. Ein Boxplot [Link] eignet sich perfekt dafür, da uns die Breite der Box schon einen Hinweis auf die Streuung der daten gibt.
# Visualisierung mit Boxplot
boxplot(schrauben_daten$Laenge,
main = "Streuung der Schraubenlängen",
ylab = "Länge (mm)", col = "lightblue")Visuelle Interpretation: Die Box zeigt, dass die Schraubenlängen ca. zwischen 49.5 mm und 50.5 mm schwanken mit einem Median von ca. 50 mm. Wir berechnen zusätzlich noch die empirische Varianz der Stichprobe.
# empirische Varianz berechnen
var(schrauben_daten$Laenge)[1] 0.0724088
Interpretation: Die gemessene Varianz (ca. 0.072) ist deutlich höher als die erlaubte Varianz (0.04). Aber ist dieser Unterschied bei nur 20 Schrauben auch signifikant? Oder ist das Zufall?
Bezug Glossar: Chi-Quadrat-Verteilung
Der Einstichproben-Varianztest ist extrem empfindlich gegenüber Verletzungen der Normalverteilung. Anders als bei Tests für Mittelwertsvergleiche wie den t-Test [Link] (der robust ist), führt Nicht-Normalität hier schnell zu falschen Ergebnissen. Daher ist der Shapiro-Wilk-Test hier Pflicht.
# Histogramm [Alternative Verteilungsdarstellung zum Boxplot]
hist(schrauben_daten$Laenge, main = "Verteilung der Längen", col = "lightgrey", xlab = "Länge")Die Gaußsche Glockenkurve als visuelles Merkmal der NV ist hier nur schwach zu erahnen. Woran kann das liegen? - Die Antwort liegt in dem niedrigen Stichprobenumfang. Hier kann eine leichte Abweichung visuell noch stärker auffallen.
# Test auf Normalverteilung
shapiro.test(schrauben_daten$Laenge)
Shapiro-Wilk normality test
data: schrauben_daten$Laenge
W = 0.94403, p-value = 0.2854
Ergebnisauswertung: Die vorherige visuelle Interpretation des Histogramms spiegelt sich auch im Testergebnis wider. Die Hypothese der Normalverteilungsannahme wird nicht verworfen (p=0.29) und wir dürfen somit den Chi-Quadrat-Varianztest durchführen.
Bezug Glossar: Parametrische Verfahren (Varianzen)
Zur Durchführung des Tests für nur eine Stichprobe gibt es in Base-R keine spezielle Funktion. Deshalb laden wir uns das Paket EnvStats vorab herunter und führen den varTest() aus um eine statistische Aussage zu anfänglichen Forschungsfrage zu erhalten.
Hinweis: Eine wichtige Information wurde uns in der anfänglich gestellten Forschungsfrage bzgl. der Testrichtung [Link] gegeben. Da hier generell nach Abweichung untersucht werden soll, muss der Test two.sided durchgeführt werden. Die Alternativen dazu wären die Fragestellungen, ob die Stichproben-Varianz die Soll-Varianz signifikant über- bzw. unterschreitet. In dem Fall müsste der Funktion der Parameter alternative = "greater" bzw "less" übergeben werden.
library(EnvStats)
Attache Paket: 'EnvStats'
Die folgenden Objekte sind maskiert von 'package:stats':
predict, predict.lm
Das folgende Objekt ist maskiert 'package:base':
print.default
varTest(schrauben_daten$Laenge, alternative = "two.sided", sigma.squared = 0.04)$statistic
Chi-Squared
34.39418
$parameters
df
19
$p.value
[1] 0.03300912
$estimate
variance
0.0724088
$null.value
variance
0.04
$alternative
[1] "two.sided"
$method
[1] "Chi-Squared Test on Variance"
$data.name
[1] "schrauben_daten$Laenge"
$conf.int
LCL UCL
0.04187731 0.15446748
attr(,"conf.level")
[1] 0.95
attr(,"class")
[1] "htestEnvStats"
Interpretation des Outputs: Der relevante Wert für unsere Testauswertung ist unter $p.value zu finden. Der p-Wert liegt hier unter dem typischen Signifikanzniveau von 0.05. Womit eine signifikante Abweichung der Varianz der Schraubenlängen gemessen wurde.
Interpretation des Outputs: Der relevante Wert für unsere Testauswertung ist unter $p.value zu finden. Der p-Wert liegt hier unter dem typischen Signifikanzniveau von 0.05. Damit wurde eine signifikante Abweichung der Varianz der Schraubenlängen nachgewiesen.
Wir schauen uns nun den künstlich erstellten Datensatz kaffee_daten an.
Szenario: Eine Abfüllanlage für Kaffeepulver soll sehr präzise arbeiten. Das Füllgewicht darf eine Varianz von 4.0 (g2) nicht überschreiten. Wir ziehen eine Stichprobe von 30 Paketen.
Frage: Wird die vorgeschriebene Füllgewichts-Varianz eingehalten oder ist die Varianz höher?
# Struktur prüfen:
str(kaffee_daten)'data.frame': 30 obs. of 1 variable:
$ Gewicht: num 499 501 499 500 501 ...
Wir haben eine metrische Variable (Gewicht).
# Visualisierung --> Boxplot
boxplot(kaffee_daten$Gewicht,
main = "Streuung der Füllgewichte",
ylab = "Gewicht (g)", col = "lightblue")Visuelle Interpretation: Die Box zeigt, dass die Füllgewichte ca. zwischen 495 g und 504 g schwanken mit einem Median von ca. 500 g. Wir berechnen zusätzlich noch die empirische Varianz der Stichprobe.
# statistisch --> empirische Varianz berechnen
var(kaffee_daten$Gewicht)[1] 2.261773
Interpretation: Die gemessene Varianz (ca. 4.09) liegt numerisch leicht über der Grenze (4.0). Aber ist diese Überschreitung auch signifikant oder ist das Zufall?
# grafisch --> Histogramm [Alternative Verteilungsdarstellung zum Boxplot]
hist(kaffee_daten$Gewicht, main = "Verteilung der Gewichte", col = "lightgrey", xlab = "Gewicht")# Die Gaußsche Glockenkurve als erstes visuelles Indiz einer NV ist ungefähr zu erkennen.
# statistisch --> Test auf Normalverteilung
shapiro.test(kaffee_daten$Gewicht)
Shapiro-Wilk normality test
data: kaffee_daten$Gewicht
W = 0.96716, p-value = 0.4648
# Der Test bestätigt, dass die Voraussetzung nicht verletzt ist und die geplante Analyse durchgeführt werden kann.Wir testen, ob die Varianz signifikant höher ist als 4.0. (\(H_1: \sigma^2>4.0\))
# Analyse durchführen
library(EnvStats)
# alternative = "greater", da wir prüfen, ob der Grenzwert überschritten wird
varTest(kaffee_daten$Gewicht, alternative = "greater", sigma.squared = 4.0)$statistic
Chi-Squared
16.39786
$parameters
df
29
$p.value
[1] 0.9707275
$estimate
variance
2.261773
$null.value
variance
4
$alternative
[1] "greater"
$method
[1] "Chi-Squared Test on Variance"
$data.name
[1] "kaffee_daten$Gewicht"
$conf.int
LCL UCL
1.541262 Inf
attr(,"conf.level")
[1] 0.95
attr(,"class")
[1] "htestEnvStats"
Ergebnisformulierung: Der p-Wert ist 0.43. Wir können die Nullhypothese nicht verwerfen. Das bedeutet: Die Varianz ist nicht signifikant höher als 4.0. Die Maschine hält die Vorgaben ein. Statistisch gesehen gibt es keinen Hinweis auf eine Überschreitung der Toleranzgrenze, obwohl die empirische Varianz leicht über dem Grenzwert liegt.