fpwiki
TémaMASK upraveno 2026-10-02

Kontingenční tabulky

Kontingenční tabulky

Kontingenční tabulka

V rámci Metody aplikované statistiky navazují kontingenční tabulky na testování statistických hypotéz: místo jedné náhodné veličiny teď sledujeme dva kvalitativní (kategoriální) znaky současně a ptáme se, zda spolu souvisí.

Znak je kvantitativní, pokud nabývá číselných hodnot (stáří, stav tachometru), a kvalitativní (kategoriální), pokud nabývá slovních variant (vzdělání, kuřák/nekuřák). Kvalitativní znaky dále dělíme na alternativní (dvě varianty, např. vada ano/ne) a množné (více než dvě varianty, např. svobodný/rozvedený/ženatý).

Mějme nn opakování pokusu, při nichž sledujeme dva kvalitativní znaky AA (varianty A1,…,ArA_1,\dots,A_r) a BB (varianty B1,…,BsB_1,\dots,B_s). Výsledky zapíšeme do kontingenční tabulky: v políčku (i,j)(i,j) je simultánní četnost nijn_{ij}, tedy počet pokusů s variantou AiA_i zároveň s variantou BjB_j. Řádkové a sloupcové součty jsou marginální četnosti:

ni∙=∑j=1snij,n∙j=∑i=1rnij,n=∑i=1r∑j=1snijn_{i\bullet} = \sum_{j=1}^{s} n_{ij}, \qquad n_{\bullet j} = \sum_{i=1}^{r} n_{ij}, \qquad n = \sum_{i=1}^r\sum_{j=1}^s n_{ij}
A\BA \backslash BB1B_1B2B_2…BsB_sni∙n_{i\bullet}
A1A_1n11n_{11}n12n_{12}…n1sn_{1s}n1∙n_{1\bullet}
A2A_2n21n_{21}n22n_{22}…n2sn_{2s}n2∙n_{2\bullet}
⋮⋮⋮⋱⋮⋮
ArA_rnr1n_{r1}nr2n_{r2}…nrsn_{rs}nr∙n_{r\bullet}
n∙jn_{\bullet j}n∙1n_{\bullet 1}n∙2n_{\bullet 2}…n∙sn_{\bullet s}nn

Vydělením četností počtem opakování nn dostaneme odhady pravděpodobností:

p^ij=nijn,p^i∙=ni∙n,p^∙j=n∙jn\hat p_{ij} = \frac{n_{ij}}{n}, \qquad \hat p_{i\bullet} = \frac{n_{i\bullet}}{n}, \qquad \hat p_{\bullet j} = \frac{n_{\bullet j}}{n}

Test nezávislosti dvou kvalitativních znaků

Test ověřuje, zda varianty znaku AA a varianty znaku BB jsou na sobě nezávislé, tedy zda simultánní pravděpodobnost je součinem marginálních pravděpodobností.

Postup testu:

  1. H0:pij=pi∙ p∙jH_0: p_{ij} = p_{i\bullet}\,p_{\bullet j} pro všechna i=1,…,ri = 1,\dots,r, j=1,…,sj = 1,\dots,s (znaky jsou na sobě nezávislé) proti H1H_1: znaky jsou závislé.
  2. Testové kritériumχ2=∑i=1r∑j=1s(nij−np^ij)2np^ij,p^ij=p^i∙ p^∙j\chi^2 = \sum_{i=1}^{r}\sum_{j=1}^{s} \frac{(n_{ij} - n\hat p_{ij})^2}{n\hat p_{ij}}, \qquad \hat p_{ij} = \hat p_{i\bullet}\,\hat p_{\bullet j}
    má asymptoticky Pearsonovo (χ2\chi^2) rozdělení o (r−1)(s−1)(r-1)(s-1) stupních volnosti. Hodnota np^ij=ni∙n∙jnn\hat p_{ij} = \dfrac{n_{i\bullet}n_{\bullet j}}{n} je očekávaná četnost políčka (i,j)(i,j) — četnost, kterou bychom čekali, kdyby H0H_0 platila.
  3. Kritický obor: W={χ2:χ2≥χ1−α2((r−1)(s−1))}W = \{\chi^2 : \chi^2 \ge \chi^2_{1-\alpha}((r-1)(s-1))\}.
  4. Padne-li testové kritérium do WW, zamítáme na hladině α\alpha nulovou hypotézu o nezávislosti a přijímáme H1H_1; jinak nemáme důvod H0H_0 zamítnout.

V R počítá test i očekávané četnosti funkce chisq.test().

tab1 <- matrix(c(4, 13, 12,
                 31, 62, 71,
                 44, 58, 66,
                 3,  9, 12),
               nrow = 4, byrow = TRUE,
               dimnames = list(
                 vzdelani = c("SS bez maturity", "SS s maturitou nebo VOS", "VS", "ZS"),
                 nakup    = c("ano", "ne, ale planuji", "ne, neplanuji")))
chisq.test(tab1)
chisq.test(tab1)$expected
    Pearson's Chi-squared test

data:  tab1
X-squared = 5.4875, df = 6, p-value = 0.483

                         nakup
vzdelani                        ano ne, ale planuji ne, neplanuji
  SS bez maturity          6.176623       10.696104      12.12727
  SS s maturitou nebo VOS 34.929870       60.488312      68.58182
  VS                      35.781818       61.963636      70.25455
  ZS                       5.111688        8.851948      10.03636

Všechny očekávané četnosti jsou nad 5, aproximace je v pořádku. Testové kritérium χ2=5,49\chi^2 = 5{,}49 s 66 stupni volnosti dává p-hodnotu 0,483>0,050{,}483 > 0{,}05: H0H_0 nezamítáme, závislost mezi zkušeností s nákupem potravin na internetu a vzděláním respondenta se neprokázala.

tab2 <- matrix(c(20, 33, 39,
                 25, 28, 76),
               nrow = 2, byrow = TRUE,
               dimnames = list(
                 zverejnuje = c("ne", "ano"),
                 vzdelani   = c("SS", "VS", "ZS")))
chisq.test(tab2)
chisq.test(tab2)$expected
    Pearson's Chi-squared test

data:  tab2
X-squared = 6.8677, df = 2, p-value = 0.03226

          vzdelani
zverejnuje       SS       VS      ZS
       ne  18.73303 25.39367 47.8733
       ano 26.26697 35.60633 67.1267

I zde jsou všechny očekávané četnosti nad 5. Testové kritérium χ2=6,87\chi^2 = 6{,}87 s 22 stupni volnosti dává p-hodnotu 0,032<0,050{,}032 < 0{,}05: H0H_0 zamítáme — na rozdíl od předchozího příkladu tady vzdělání a zveřejňování citlivých údajů na Facebooku na sobě závisí.

Srovnání pozorovaných a očekávaných četností ukazuje, proč jeden příklad H0H_0 nezamítá a druhý ano — ve druhém se pozorované sloupce (zejména u ZŠ) systematicky odchylují od očekávaných, v prvním kolísají jen náhodně kolem nich:

Totéž je vidět na rozdělení testového kritéria: u prvního příkladu leží χ2\chi^2 hluboko pod kritickou hodnotou, u druhého uvnitř kritického oboru WW:

Cramérův koeficient kontingence

Test nezávislosti pouze rozhodne, zda jsou znaky závislé, nebo ne. Sílu závislosti měří Cramérův koeficient kontingence:

V=χ2n(m−1),m=min⁡(r,s)V = \sqrt{\frac{\chi^2}{n(m-1)}}, \qquad m = \min(r, s)

kde χ2\chi^2 je hodnota testového kritéria z testu nezávislosti. V=0V = 0 odpovídá úplné nezávislosti znaků, V=1V = 1 jejich úplné závislosti.

V1 <- sqrt(as.numeric(chisq.test(tab1)$statistic) / (sum(tab1) * (min(dim(tab1)) - 1)))
V2 <- sqrt(as.numeric(chisq.test(tab2)$statistic) / (sum(tab2) * (min(dim(tab2)) - 1)))
V1
V2
[1] 0.08441958
[1] 0.1762822

U nákupu potravin je V=0,084V = 0{,}084 zanedbatelné — ostatně H0H_0 jsme ani nezamítli. U zveřejňování údajů je V=0,176V = 0{,}176: H0H_0 jsme zamítli, ale samotná závislost je stále slabá.

Čtyřpolní tabulka

Čtyřpolní tabulka je speciální případ kontingenční tabulky, kdy oba znaky AA i BB mají jen dvě varianty (r=s=2r = s = 2):

A\BA \backslash BB1B_1B2B_2ni∙n_{i\bullet}
A1A_1n11n_{11}n12n_{12}n1∙n_{1\bullet}
A2A_2n21n_{21}n22n_{22}n2∙n_{2\bullet}
n∙jn_{\bullet j}n∙1n_{\bullet 1}n∙2n_{\bullet 2}nn

Pro n>40n > 40 se místo obecného vzorce používá zjednodušená varianta testového kritéria:

χ2=n (n11n22−n12n21)2n1∙n2∙n∙1n∙2\chi^2 = n\,\frac{(n_{11}n_{22} - n_{12}n_{21})^2}{n_{1\bullet}n_{2\bullet}n_{\bullet 1}n_{\bullet 2}}

s kritickým oborem Wα={χ2:χ2≥χ1−α2(1)}W_\alpha = \{\chi^2 : \chi^2 \ge \chi^2_{1-\alpha}(1)\} — formálně jde o stejný test nezávislosti jako výše, jen dosazený do zjednodušeného tvaru pro (r−1)(s−1)=1(r-1)(s-1) = 1 stupeň volnosti. V R dává tuto hodnotu chisq.test(tab, correct = FALSE). Bez correct = FALSE R u tabulky 2 × 2 použije Yatesovu korekci na kontinuitu a testové kritérium vyjde menší.

McNemarův test

Čtyřpolní tabulka z předchozí sekce porovnává dva různé znaky na stejném souboru. McNemarův test řeší jinou situaci: na prvcích základního souboru se měří jeden alternativní znak, a to dvakrát — před a po nějakém zásahu. Cílem je zjistit, zda zásah změnil pravděpodobnostní rozdělení variant tohoto znaku. Jde tedy o párová data (stejné prvky měřené opakovaně), ne o dva nezávisle naměřené znaky.

Kontingenční tabulka před/po má tvar:

před \ po+−ni∙n_{i\bullet}
+n11n_{11}n12n_{12}n1∙n_{1\bullet}
−n21n_{21}n22n_{22}n2∙n_{2\bullet}
n∙jn_{\bullet j}n∙1n_{\bullet 1}n∙2n_{\bullet 2}nn

Pole n11n_{11} a n22n_{22} jsou shodná (prvek zůstal ve stejné variantě), pole n12n_{12} a n21n_{21} jsou diskordantní (prvek mezi měřeními variantu změnil) — jen ta rozhodují o výsledku testu:

Postup testu:

  1. H0:p12=p21H_0: p_{12} = p_{21} — pravděpodobnost přechodu z varianty (+) do (−) je stejná jako pravděpodobnost přechodu z (−) do (+); zásah tedy nemá na rozdělení variant žádný vliv.
  2. Testové kritériumχ2=(n12−n21)2n12+n21\chi^2 = \frac{(n_{12} - n_{21})^2}{n_{12} + n_{21}}
    má asymptoticky Pearsonovo rozdělení o 11 stupni volnosti.
  3. Kritický obor: W={χ2:χ2≥χ1−α2(1)}W = \{\chi^2 : \chi^2 \ge \chi^2_{1-\alpha}(1)\}.
  4. Padne-li testové kritérium do WW, zamítáme H0H_0 a přijímáme H1H_1: zásah rozdělení variant změnil.

V R počítá tento test funkce mcnemar.test(). Vzorec výše neobsahuje korekci na kontinuitu — aby R vrátilo přesně tuto hodnotu, musí se volat s correct = FALSE (viz Časté chyby níže).

tab3 <- matrix(c(24, 68,
                 28, 50),
               nrow = 2, byrow = TRUE,
               dimnames = list(
                 pred = c("nezverejnuje", "zverejnuje"),
                 po   = c("nezverejnuje", "zverejnuje")))
mcnemar.test(tab3, correct = FALSE)
    McNemar's Chi-squared test

data:  tab3
McNemar's chi-squared = 16.667, df = 1, p-value = 4.456e-05

P-hodnota 0,00004456<0,050{,}00004456 < 0{,}05: H0H_0 zamítáme, přijímáme H1H_1 — informační kampaň měla vliv na změnu chování studentů ve zveřejňování údajů na Facebooku.

Časté chyby

chisq.test(tab3)
    Pearson's Chi-squared test with Yates' continuity correction

data:  tab3
X-squared = 1.4793, df = 1, p-value = 0.2239

P-hodnota 0,224>0,050{,}224 > 0{,}05 by vedla k nezamítnutí H0H_0 — opačný závěr než správný McNemarův test. Na párovaná data (stejné prvky měřené dvakrát) vždy patří mcnemar.test(), nikdy chisq.test().

mcnemar.test(tab3)
    McNemar's Chi-squared test with continuity correction

data:  tab3
McNemar's chi-squared = 15.844, df = 1, p-value = 6.879e-05

Oproti nekorigované hodnotě p=0,00004456p = 0{,}00004456 vyjde p=0,00006879p = 0{,}00006879 — v tomto příkladu obě vedou ke stejnému rozhodnutí, ale u hodnot blíž hranici α\alpha by korekce mohla rozhodnutí změnit. Aby R reprodukovalo nekorigovaný vzorec, je třeba vždy volat mcnemar.test(x, correct = FALSE).

Související stránky

Reference

KROPÁČ, J. Statistika A. 4. vyd. Brno: Fakulta podnikatelská VUT, 2011.

fpwiki
Nejde o oficiální materiály FP VUT. Obsah je výběrový a slouží jako pomůcka ke studiu. GitHub