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í.
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\)).
Je slabším testem než Shapiro-Wilků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)
##
## Asymptotic 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
##
## Asymptotic 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í
##
## Asymptotic 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
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: VSnormalni
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
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)
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))
##
## Exact 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žší.
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.
© 5. 4. 2015 Tomáš Bořil, borilt@gmail.com