Rozdział 18 Test chi-kwadrat

18.1 Test chi-kwadrat — zastosowania

Test chi-kwadrat za każdym razem ma podobną konstrukcję, ale służy do wielu celów. Będziemy wykorzystywać następujące zastosowania testu chi-kwadrat:

  • testy zgodności rozkładu (sprawdzamy, czy rozkład w pewnej populacji jest zgodny z założonym rozkładem teoretycznym),

  • testy jednorodności (sprawdzamy, czy struktura zmiennych jakościowych jest taka sama, czyli jednorodna, w dwóch lub większej liczbie populacji),

  • testy niezależności (sprawdzamy, czy dwie zmienne jakościowe są od siebie w populacji niezależne).

18.2 Wzór

Choć test ma różne zastosowania, zobaczymy, że wzór służący do obliczenia statystyki testowej wygląda we wszystkich wypadkach podobnie. Możemy go zapisać w następujący sposób:

\[ \chi^2 = \sum_{i} \frac{(O_i-E_i)^2}{E_i}, \tag{18.1} \] gdzie:

\(i\) - to indeks wskazujący na poszczególne klasy lub na „przegródki” (komórki) w tabeli dwudzielczej,

\(O_i\) - liczebności zaobserwowane (ang. observed),

\(E_i\) - liczebności oczekiwane (ang. expected) - liczebności oczekiwane określone na podstawie zadanego rozkładu lub na podstawie założenia o niezależności, inaczej liczebności teoretyczne.

18.3 Hipotezy

W teście zgodności \(H_0\) mówi, że rozkład pewnej zmiennej jakościowej w populacji jest zgodny z założeniem, a \(H_A\) mówi, że jest inny.

W teście jednorodności \(H_0\) mówi, że rozkład zmiennej jakościowej w 2 lub większej liczbie populacji jest jednakowy („jednorodny”), zaś \(H_A\) mówi, że jest inny.

W teście niezależności \(H_0\) mówi, że dwie zmienne jakościowe są od siebie w populacji niezależne, zaś \(H_A\) mówi, że są zależne.

18.4 Liczebności oczekiwane

W teście zgodności liczebności oczekiwane wynikają z zakładanego rozkładu.

W testach jednorodności i niezależności liczebności oczekiwane należy wyznaczyć. W obu testach tabele liczebności mają postać tabeli dwudzielczej. Oczekiwaną liczebność należy wyznaczyć dla każdej komórki tej tabeli.

\[ \text{Liczebność oczekiwana} = \frac{\text{Liczebność wiersza} \cdot \text{Liczebność kolumny}}{\text{Liczebność całkowita}}\]

18.5 Warunki zastosowania testu

Test chi-kwadrat jest testem przybliżonym (podobnie jak test z dla średnich lub proporcji), wymaga więc — poza standardowym założeniem losowości i reprezentatywności próby — odpowiedniej wielkości próby. Najczęściej podaje się regułę, że minimalna liczebność oczekiwana w pojedynczej komórce wynosi 5.

18.6 Liczba stopni swobody

Statystyka testowa w teście chi-kwadrat ma rozkład chi-kwadrat o określonej „liczbie stopni swobody” (tak nazywa sie jedyny parametr rozkładu chi-kwadrat).

  • W testach zgodności z konkretnym rozkładem prawdopodobieństwa liczba stopni swobody to \(k-1\), gdzie \(k\) to liczba klas.

  • W przypadku testów zgodności z rozkładem o określonych parametrach, gdy te parametry są szacowane na podstawie tych samych danych, liczba stopni swobody to \(k-m-1\), gdzie \(k\) to liczba klas, zaś \(m\) to liczba szacowanych parametrów

  • W testach jednorodności rozkładów liczba stopni swobody to \(k-1\) w przypadku testowania dwóch populacji. W przypadku większej liczby porównywanych populacji liczba stopni swobody to \((k-1)\cdot(c-1)\), gdzie \(c\) to liczba populacji.

  • W testach niezależności Liczba stopni swobody to \((r-1)\cdot(c-1)\), gdzie \(r\) to liczba wierszy w tablicy dwudzielczej (liczba klas jednej zmiennej), a \(c\) to liczba kolumn (liczba klas drugiej zmiennej).

18.7 Obszar odrzucenia

We wszystkich wymienionych w tym rozdziale testach chi-kwadrat obszar odrzucenia jest prawostronny, tzn. odrzucamy hipotezę zerową, jeżeli statystyka testowa przekroczy wartość krytyczną.

Uwaga! W przypadku testu chi-kwadrat nie posługujemy się w stosunku do hipotezy alternatywnej sformułowaniami „lewostronna”, „prawostronna” czy „obustronna” (14.6) — hipoteza alternatywna ma raczej charakter „wielostronny”.

18.8 Testy chi-kwadrat i testy proporcji

Można zauważyć, że testy chi-kwadrat zgodności i jednorodności stanowią rozszerzenie testów dla proporcji. Mogą objąć więcej niż dwie klasy lub (w przypadku testów jednorodności) więcej niż dwie populacje.

W przypadku testów zgodności rozszerzenie polega na tym, że test dla 1 proporcji ogranicza nas do rozkładu dwupunktowego (rozkładu, w którym są tylko dwie klasy), natomiast test zgodności można zastosować dla również dla większej liczby klas. Obustronny test dla jednej proporcji jest praktycznie równoważny testowi zgodności chi-kwadrat dla zmiennej dychotomicznej9.

W przypadku testów jednorodności rozszerzenie może polegać na tym, że badamy więcej niż 2 populacje (test dla 3, 4, 5, 6 proporcji) albo zwiększamy liczbę klas, albo jedno i drugie. Obustronny test dla dwóch proporcji jest praktycznie równoważny testowi jednorodności chi-kwadrat dla dwóch populacji i zmiennej dychotomicznej10.

18.9 Wielkość efektu w teście niezależności

Dla tabel dwudzielczych, w których przedstawia się liczebności w ramach testu niezależności, zaproponowano wiele miar wielkości efektu. Najczęściej stosowaną miarą jest V Cramera:

\[ V = \sqrt{\frac{\chi^2}{n \cdot\text{min}(c-1, r-1)}} \tag{18.2} \]

W przypadku tabel 2×2 stosuje się współczynnik fi, który co do wartości bezwzględnej jest tożsamy ze współczynnikiem V Cramera, ale może przyjmować również wartości ujemne.

18.11 Szablony

Arkusze kalkulacyjne

Test chi-kwadrat — arkusz Google

Test chi-kwadrat — szablon w Excelu

Kalkulator rozkładu chi-kwadrat — arkusz Google

Kod w R

# Test niezależności/jednorodności chi-kwadrat

# Macierz z danymi (wektor wejściowy)
m <- c(
  21, 14,
  3, 10
)

# Liczba wierszy w macierzy
nrow <- 2

# Poziom istotności
alpha <- 0.05

# Przekształcenie wektora w macierz
m <- matrix(data=m, nrow=nrow, byrow=TRUE)

# Test chi-kwadrat bez poprawki Yatesa
test_chi <- chisq.test(m, correct=FALSE)

# Test chi-kwadrat z poprawką Yatesa w przypadku tabel 2x2
test_chi_corrected <- chisq.test(m)

# Test G
test_g <- AMR::g.test(m)

# Dokładny test Fishera
exact_fisher<-fisher.test(m)

print(c('Liczba stopni swobody' = test_chi$parameter, 
        'Wartość krytyczna' = qchisq(1-alpha, test_chi$parameter), 
        'Statystyka chi^2' = unname(test_chi$statistic),
        'Wartość p (test chi-kwadrat)' = test_chi$p.value,
        'V Cramera' = unname(sqrt(test_chi$statistic/sum(m)/min(dim(m)-1))),
        'Współczynnik fi (dla tabel 2x2)' = if(all(dim(m)==2)) {psych::phi(m, digits=10)},
        'Statystyka chi^2 z poprawką Yatesa' = unname(test_chi_corrected$statistic),
        'Wartość p (test chi^2 z poprawką Yatesa)' = test_chi_corrected$p.value,
        'Statystyka G' = unname(test_g$statistic),
        'Wartość p (test G)' = test_g$p.value,
        'Wartość p (test dokładny Fishera)' = exact_fisher$p.value
))
##                 Liczba stopni swobody.df                        Wartość krytyczna 
##                               1.00000000                               3.84145882 
##                         Statystyka chi^2             Wartość p (test chi-kwadrat) 
##                               5.16923077                               0.02299039 
##                                V Cramera          Współczynnik fi (dla tabel 2x2) 
##                               0.32816506                               0.32816506 
##       Statystyka chi^2 z poprawką Yatesa Wartość p (test chi^2 z poprawką Yatesa) 
##                               3.79780220                               0.05131990 
##                             Statystyka G                       Wartość p (test G) 
##                               5.38600494                               0.02029889 
##        Wartość p (test dokładny Fishera) 
##                               0.04899141
# Test zgodności chi-kwadrat

# Liczebności rzeczywiste:
observed <- c(70, 10, 20)

# Liczebności oczekiwane:
expected <- c(80, 10, 10)

# Ewentualna korekta liczebności oczekiwanych, żeby ich suma była na pewno równa sumie rzeczywistych:
expected <- expected / sum(expected) * sum(observed)

# Poziom istotności
alpha <- 0.05

test_chi <- chisq.test(x = observed, p = expected, rescale.p = TRUE)
test_g <- AMR::g.test(x = observed, p = expected, rescale.p = TRUE)


print(c('Liczba stopni swobody' = test_chi$parameter, 
        'Wartość krytyczna' = qchisq(1-alpha, test_chi$parameter), 
        'Statystyka chi^2' = unname(test_chi$statistic),
        'Wartość p (test chi-kwadrat)' = test_chi$p.value,
        'Statystyka G' = unname(test_g$statistic),
        'Wartość p (test G)' = test_g$p.value
))
##     Liczba stopni swobody.df            Wartość krytyczna             Statystyka chi^2 
##                  2.000000000                  5.991464547                 11.250000000 
## Wartość p (test chi-kwadrat)                 Statystyka G           Wartość p (test G) 
##                  0.003606563                  9.031492255                  0.010935443

Kod w Pythonie

# Test niezależności/jednorodności chi-kwadrat
import numpy as np
import scipy.stats as stats
from scipy.stats import chi2
from statsmodels.stats.contingency_tables import Table2x2

# Dane (macierz):
m = np.array([
  [21, 14],
  [3, 10]
])

alpha = 0.05

# Test chi-kwadrat bez poprawki Yatesa:
test_chi = stats.chi2_contingency(m, correction=False)

# Test chi-kwadrat z poprawką Yatesa:
test_chi_corrected = stats.chi2_contingency(m)

# Test G:
g, p, dof, expected = stats.chi2_contingency(m, lambda_="log-likelihood")

# Dokładny test Fishera:
exact_fisher = stats.fisher_exact(m)

# V Cramera:
cramers_v = np.sqrt(test_chi[0] / m.sum() / min(m.shape[0]-1, m.shape[1]-1))

# Współczynnik fi dla tabeli 2x2:
phi_coefficient = None
if m.shape == (2, 2):
    phi_coefficient = cramers_v*np.sign(np.diagonal(m).prod()-np.diagonal(np.fliplr(m)).prod())

# Wyniki
results = {
    'Liczba stopni swobody': test_chi[2],
    'Wartość krytyczna': chi2.ppf(1-alpha, test_chi[2]),
    'Statystyka chi-kwadrat': test_chi[0],
    'p-value (test chi-kwadrat)': test_chi[1],
    "V Cramera": cramers_v,
    'Współczynnik fi (dla tabeli 2x2)': phi_coefficient,
    'Statystyka chi-kwadrat z poprawką Yatesa': test_chi_corrected[0],
    'p-value (test chi-kwadrat z poprawką Yatesa)': test_chi_corrected[1],
    'Statystyka G': g,
    'p-value (test G)': p,
    'p-value (dokładny test Fishera)': exact_fisher[1]
}

for key, value in results.items():
    print(f"{key}: {value}")
## Liczba stopni swobody: 1
## Wartość krytyczna: 3.841458820694124
## Statystyka chi-kwadrat: 5.169230769230769
## p-value (test chi-kwadrat): 0.022990394092464842
## V Cramera: 0.3281650616569468
## Współczynnik fi (dla tabeli 2x2): 0.3281650616569468
## Statystyka chi-kwadrat z poprawką Yatesa: 3.7978021978021976
## p-value (test chi-kwadrat z poprawką Yatesa): 0.05131990358807137
## Statystyka G: 3.9106978537750194
## p-value (test G): 0.04797967015430134
## p-value (dokładny test Fishera): 0.048991413058947844
# Test zgodności chi-kwadrat

from scipy.stats import chisquare, chi2
import numpy as np

# Liczebności rzeczywiste:
observed = np.array([70, 10, 20])
# Liczebności oczekiwane:
expected = np.array([80, 10, 10])

# Ewentualna korekta liczebności oczekiwanych, żeby ich suma była na pewno równa sumie rzeczywistych:
expected = expected / expected.sum() * observed.sum()

# Test chi-kwadrat:
chi_stat, chi_p = chisquare(f_obs=observed, f_exp=expected)

# Liczba stopni swobody:
df = len(observed) - 1

# Poziom istotności:
alpha = 0.05  

# Wartość krytyczna:
critical_value = chi2.ppf(1 - alpha, df)

# Test G:
from scipy.stats import power_divergence
g_stat, g_p = power_divergence(f_obs=observed, f_exp=expected, lambda_="log-likelihood")

# Wyniki

results = {
    'Liczba stopni swobody': df,
    'Wartość krytyczna': critical_value,
    'Statystyka chi^2': chi_stat,
    'Wartość p (test chi-kwadrat)': chi_p,
    'Statystyka G': g_stat,
    'Wartość p (test G)': g_p
}

for key, value in results.items():
    print(f"{key}: {value}")
## Liczba stopni swobody: 2
## Wartość krytyczna: 5.991464547107979
## Statystyka chi^2: 11.25
## Wartość p (test chi-kwadrat): 0.0036065631360157305
## Statystyka G: 9.031492254964643
## Wartość p (test G): 0.010935442847719828

18.12 Zadania

Zadanie 18.1 Wylosowano próbę klientów bankowych i spytano o dochody oraz o produkt bankowy darzony największym zainteresowaniem. Uzyskano następujące wyniki:

Dochód Kredyty Lokaty Inwestycje Suma
Niski 34 18 10 62
Średni 19 30 21 70
Wysoki 20 18 31 69
Suma 73 66 62 201

Czy rodzaj zainteresowania ofertą produktową banku jest niezależny od poziomu dochodów?

Zadanie 18.2 (Aczel and Sounderpandian 2018) Pewne studium opisuje analizę 35 kluczowych kategorii produktów. W momencie przeprowadzania tych badań 72,9% sprzedawanych artykułów było produktami marki narodowej, 23% produktami marek prywatnych, a 4,1% produktami no name. Przypuśćmy, że chcemy sprawdzić, czy ten podział jest wciąż aktualny na dzisiejszym rynku. Gromadzimy losową próbę 1000 produktów z 35 analizowanych kategorii i stwierdzamy, że 610 artykułów jest produktami marek narodowych, 290 produktami marek prywatnych, a 100 jest produktami no name. Przeprowadź test i sformułuj wnioski.

Zadanie 18.3 Wykonano 200 rzutów zwykłą kostką do gry. Otrzymano 38 razy jedynkę, 35 razy dwójkę, 35 razy trójkę, 27 razy czwórkę, 31 razy piątkę i 34 razy szóstkę. Za pomocą testu chi-kwadrat zweryfikuj hipotezę, że kostka jest "uczciwa", tzn. dobrze wyważona.

Zadanie 18.4 Rozkład Benforda to rozkład prawdopodobieństwa występowania określonej pierwszej cyfry w wielu zbiorach danych empirycznych.

Według prawa Benforda jedynka jako pierwsza cyfra występuje w \(\log_{10}(1+1/1) \approx 30{,}1\%\) przypadków, dwójka jako pierwsza cyfra w \(\log_{10}(1+1/2) \approx 17{,}6\%\) przypadków, trójka w \(\log_{10}(1+1/3) \approx 12{,}5\%\) itd.

Należy sprawdzić, czy rozkład pierwszych cyfr w danych o rocznym wynagrodzeniu w funtach brytyjskich piłkarzy w poszczególnych ligach (w Bundeslidze, La Liga, Ligue 1, Premier League i Serie A, dla każdej z tych lig osobno) jest zgodny z rozkładem Benforda.

Dane: https://drive.google.com/file/d/1OPDlBv0yR-aUwYGYcnDGAffFhK2iUvD5/view?usp=share_link

Dane zostały zebrane przez Edda Webstera

Zadanie 18.5 (Aczel and Sounderpandian 2018) Istnieje przekonanie, że zwroty z pewnej inwestycji mają rozkład normalny z wartością średnią 11% (annualizowana stopa) i odchyleniem standardowym 2%. Firma brokerska chce przetestować hipotezę zerową, że stwierdzenie to jest prawdziwe, i zebrała następujące dane o zwrotach w % (zakłada się, że jest to próba losowa): 8,0; 9,0; 9,5; 9,5; 8,6; 13,0; 14,5; 12,0; 12,4; 19,0; 9,0; 10,0; 10,0; 11,7; 15,0; 10,1; 12,7; 17,0; 8,0; 9,9; 11,0; 12,5; 12,8; 10,6; 8,8; 9,4; 10,0; 12,3; 12,9; 7,0. Przeprowadź analizę z wykorzystaniem testu chi-kwadrat i sześciu przedziałów, oraz sformułuj wniosek.

Zadanie 18.6 (Aczel and Sounderpandian 2018) Wykorzystując dane z poprzedniego zadania, przeprowadź test hipotezy zerowej, że zwroty z inwestycji mają rozkład normalny, ale z nieznaną wartością średnią i nieznanym odchyleniem standardowym. Przetestuj jedynie ważność założenia o rozkładzie normalnym. Czym różni się ten test od testu z poprzedniego zadania?

Zadanie 18.7 (Aczel and Sounderpandian 2018) W miarę, jak rynki stają się coraz bardziej międzynarodowe, wiele firm inwestuje w badania mające określić maksymalny możliwy zakres sprzedaży na rynkach zagranicznych. Amerykański producent ekspresów do kawy chce sprawdzić, czy jego udziały w rynku i udziały dwóch jego konkurentów są mniej więcej takie same w trzech krajach europejskich, do których wszystkie trzy firmy eksportują swoje wyroby. Rezultaty badania rynku zebrano w poniższej tablicy. Dane pochodzą z losowych prób 150 konsumentów w każdym z krajów.

Francja Anglia Hiszpania Suma
Firma 55 38 24 117
Konkurent 1 28 30 21 79
Konkurent 2 20 18 31 69
Reszta 47 64 74 185
Suma 150 150 150 450

Zadanie 18.8 Za pomocą testu chi-kwadrat i danych z zadania 15.1 przetestuj hipotezę zerową mówiącą, że rozkład kierunku przechylania głowy przez całującą się parę ma parametry \(p_R = 0{,}5\) i \(p_L = 0{,}5\) (\(p_R\) to prawdopodobieństwo przechylenia głowy w prawo, \(p_L\) to prawdopodobieństwo przechylenia głowy w lewo). Jakiemu testowi 1 proporcji odpowiada przeprowadzony test? Porównaj wartości p-value.

Zadanie 18.9 W 1972 r. 48 menedżerów bankowych otrzymało te same akta osobowe. Każdego z nich poproszono o ocenę, czy dana osoba powinna zostać awansowana na stanowisko kierownika oddziału, czy też powinni zostać przesłuchani inni kandydaci. Akta były identyczne, z tym wyjątkiem, że w połowie przypadków poinformowano, że rozważana osoba jest kobietą, a w połowie, że mężczyzną. Spośród 24 przypadków „mężczyzn”, awans zaproponowano w 21 przypadkach, spośród 24 przypadków „żeńskich” do awansu zarekomendowano 14 (Rosen and Jerdee 1974). Czy to przekonujący dowód na to, że menedżerowie dyskryminowali aplikujące kobiety? Czy też różnicę w liczbach zalecanych do awansu można z wystarczającą pewnością przypisać przypadkowi? Przedstaw rozwiązanie za pomocą testu chi-kwadrat i porównaj otrzymane wyniki z uzyskanymi za pomocą testu 2 proporcji 17.2.

Zadanie 18.10 Powróć do danych z zadania 15.5. Przetestuj, czy można odrzucić hipotezę, że rozkład zgubionych kluczy w populacji (= w procesie generującym dane) jest równomierny (jednostajny dyskretny).

Literatura

Aczel, A. D., and J. Sounderpandian. 2018. Statystyka w Zarządzaniu. PWN. https://ksiegarnia.pwn.pl/Statystyka-w-zarzadzaniu,731934758,p.html.
Rosen, Benson, and Thomas H. Jerdee. 1974. “Influence of Sex Role Stereotypes on Personnel Decisions.” Journal of Applied Psychology 59: 9–14. https://doi.org/10.1037/h0035834.

  1. Jeżeli nasz rozkład jest dwupunktowy (np. tak/nie, choroba/brak) i porównujemy go z teoretycznym, możemy zastosować test dla 1 proporcji (15) lub test zgodności (można porównać zadania 15.1 i 18.8).↩︎

  2. Jeżeli porównujemy dwie proporcje, możemy zastosować test dla 2 proporcji (17) lub test jednorodności chi-kwadrat — por. zadania 17.2 i 18.9.↩︎