Lerneinheit 6: Varianztest für eine Stichprobe (Chi-Quadrat-Varianztest)

Szenario & Forschungsfrage

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]


1. Daten simulieren & verstehen

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.


2. Explorative Datenanalyse (Visualisierung)

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?


3. Voraussetzungen prüfen

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.


4 Die Analyse - Chi-Quadrat-Varianztest

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.


Übungsabschnitt

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?

1. Datenaufbereitung

# 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).

2. Explorative Datenanalyse

# 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?

3. Voraussetzung prüfen

# 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.

4. Analyse

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.