Testování rozdělení

K odpovědi na otázku, zda náš VS pochází ze ZS s nějakým konkrétním rozdělením, slouží testy rozdělení. Úloha to však není zcela jednoduchá a existuje celá řada různých testů, každý má své výhody a nevýhody.

Testy jsou opatrné a raději zůstávají u odpovědi „nevím“ ve formě H0. Musí je něco výrazně přesvědčit, aby se rozhodly, že je rozdělení odlišné od námi testovaného (H1). Obecně platí, že z malého počtu hodnot ve VS příliš nepoznáme (testy jsou pak slabé, mají malou šanci odhalit H1). Výsledek H0 v nás tedy rozhodně nesmí vyvolat dojem, že se téměř jistě jedná o námi uvedené rozdělení.

Testování normality

Shapiro-Wilksův test

Poměrně silný test pro testování normality dat. Další výhodou je, že nemusíme specifikovat střední hodnotu a rozptyl. Nevýhodou je, že funkce v R zvládá testovat jen VS velikosti 3 až 5000 vzorků.

VSnormalni <- rnorm(n = 100, mean = 40, sd = 15) # pokusná data s norm. rozdělením
shapiro.test(VSnormalni)
## 
##  Shapiro-Wilk normality test
## 
## data:  VSnormalni
## W = 0.98945, p-value = 0.6201

Při \(\alpha = 0.05\) a velkém opakování různých VS test přesně v 5 % selže a mylně rozhodne pro H1 (chyba 1. druhu), nezávisí na velikosti VS (zda je to 100 vzorků, nebo jenom 5).

VSrovnomerny <- runif(n = 100, min = -5, max = 5) # pokusná data s rovn. rozdělením
shapiro.test(VSrovnomerny)
## 
##  Shapiro-Wilk normality test
## 
## data:  VSrovnomerny
## W = 0.93201, p-value = 6.484e-05
# Poznámka: zápis e-05 znamená krát 10^-5, tedy posun desetinné tečky o pět míst doleva,
# v tomto případě tedy číslo velmi blízké nule.

Při \(\alpha = 0.05\) a velkém opakování různých VS test přesně v \(100 \beta\) % případů selže a mylně rozhodne pro H0. Velikost \(\beta\) závisí mimo jiné na počtu vzorků ve VS. Čím větší VS, tím nižší \(\beta\).

VSrovnomerny2 <- runif(n = 5, min = -5, max = 5)
shapiro.test(VSrovnomerny2)
## 
##  Shapiro-Wilk normality test
## 
## data:  VSrovnomerny2
## W = 0.97258, p-value = 0.8916

Zde test zůstal u H0, nastala tedy chyba 2. druhu (\(\beta\)).

Kolmogorovův-Smirnovův test (K–S test)

Je slabším testem než Shapiro-Wilksův test, ale implementace v R umožňuje porovnávat i VS s více než 5000 vzorky. A pro takovéto velikosti už by měl být tento test také více než dostatečně silný.

K–S test je obecnější, umožňuje porovnávat VS s libovolným rozdělením, případně porovnávat, zda dva konkrétní VS pocházejí ze stejného rozdělení, aniž bychom konkrétně specifikovali, z jakého.

Konkrétní typ rozdělení zadáváme pomocí jména distribuční funkce, u které ale nelze specifikovat konkrétní parametry. V případě pnorm se tak jedá o standardní normální rozdělení.

Pozor! V případě testování na obecné normální rozdělení musíme náš VS nejdříve normalizovat odečtením průměru a vydělením směrodatnou odchylkou, abychom v případě normálního rozdělení obdrželi právě standardní normální rozdělení (tzv. z-skóre).

ks.test(VSnormalni, "pnorm", mean(VSnormalni), sd(VSnormalni))  # nutná specifikace parametrů rozdělení (zde jako odhad parametrů ZS)
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  VSnormalni
## D = 0.053229, p-value = 0.9395
## alternative hypothesis: two-sided
ks.test((VSnormalni - mean(VSnormalni)) / sd(VSnormalni), "pnorm")  # totéž jinak: normalizace
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  (VSnormalni - mean(VSnormalni))/sd(VSnormalni)
## D = 0.053229, p-value = 0.9395
## alternative hypothesis: two-sided
ks.test(VSnormalni, "pnorm", 40, 15)  # pokud máme přesný požadavek na parametry rozdělení
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  VSnormalni
## D = 0.067244, p-value = 0.7565
## alternative hypothesis: two-sided
ks.test(VSnormalni, "pnorm")  # špatně: porovnáváme se standardním normálním rozdělením
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  VSnormalni
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Q-Q plot

Názorné může být také zobrazení tzv. Q-Q plot, který porovnává kvantily z distribuční funkce teoretického rozdělení a zadaných dat. Pokud se rozdělení shodují, Q-Q plot má tvar rovné úhlopříčky.

qqnorm(VSnormalni)
qqline(VSnormalni)

qqnorm(VSrovnomerny)
qqline(VSrovnomerny)

Testování shodnosti rozdělení dvou VS

Vstupem K–S testu mohou být také dva výběry s obecným rozdělením a test rozhoduje o jejich podobnosti.

ks.test(runif(n = 30, min = -3, max = 5), runif(n = 100, min = -3, max = 5))
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  runif(n = 30, min = -3, max = 5) and runif(n = 100, min = -3, max = 5)
## D = 0.15667, p-value = 0.5719
## alternative hypothesis: two-sided

Zajímavé může být v některých situacích využití této funkce pro porovnání dvou rozdělení, kde dopředu víme, že zcela shodná z principu být nemohou, pouze podobná. V takovém případě je jasné, že čím větší data testu poskytneme, tím více p-hodnota odhalí rozdílnost souborů. Nicméně můžeme využít vnitřně počítané hodnoty D jako určité metriky „podobnosti“ rozdělení (na rozdíl od p-hodnoty se nemění s velikostí jednotlivých souborů). Čím jsou si podobnější, tím je D nižší.

Další testy

Pro specifická rozdělení s periodickým opakováním (např. počet přístupů na webové stránky nebo zatížení elektrické sítě – očekáváme např. týdenní periodicitu) se uvádí, že K–S test není zcela vhodný, jelikož je méně citlivý na okraje distribuční funkce, a proto je výhodnější využít Kuiperův test (viz např. funkce kuiper.test v package circular – provádí test na rovnoměrnost v rámci kruhu, je jedno, kdy stanovíme začátek období).

Pro diskrétní rozdělení můžeme využít \({\chi ^2}\) test (viz kapitola 15. Testování četností) – v podstatě porovnáváme histogramy.

Úlohy

  1. Pohrajte si s rozděleními, kde budete znát parametry ZS. Vygenerujte určitý počet hodnot ze zvoleného rozdělení a testujte, zda se jedná o jiné rozdělení (nebo to samé s jinými parametry). Zkoušejte, od jaké velikosti VS již test různost rozdělení odhalí.

© 5. 4. 2015 Tomáš Bořil,