Rozdział 19 Analiza wariancji (ANOVA)

19.1 ANOVA — test

Jednoczynnikową analizę wariancji można uznać za test, w którym testujemy równość średnich w dwóch lub większej liczbie populacji. Jest to więc rozszerzenie testu t dla dwóch średnich (16), w tej wersji, w której zakładamy równe wariancje.

  1. Hipoteza zerowa w analizie wariancji mówi, że średnie we wszystkich porównywanych populacjach (\(r\) populacji) są równe:

\[ H_0: \mu_1 = \mu_2 = ... = \mu_r \]

  1. Hipoteza alternatywna stwierdza, że nie wszystkie średnie są równe.

  2. Statystyka testowa ma rozkład F. Koncepcyjnie można powiedzieć, że statystyka testowa przedstawia stosunek zróżnicowania między średnimi w grupach do zróżnicowania wewnątrz grup (precyzyjny wzór zostanie przedstawiony poniżej).

\[ F = \frac{\text{Zróżnicowanie między grupami}}{\text{Zróżnicowanie wewnątrz grup}} \]

  1. Obszar krytyczny

Obszar krytyczny w teście jest prawostronny. Podobnie jak w teście chi-kwadrat, o hipotezie alternatywnej można powiedzieć, że jest „wielostronna”.

  1. Założenia.

ANOVA wymaga następujących założeń:

  • próby są losowe i niezależne,

  • w każdej z populacji obserwowana zmienna ma (w przybliżeniu) rozkład normalny,

  • średnie w każdej populacji mogą być różne (równe, jeżeli \(H_0\) jest prawdziwa), ale wariancje w każdej z grup są takie same (\(\sigma_1^2 = \sigma_2^2 = ... = \sigma_r^2\)).

W praktyce dość często przyjmuje się, że analizę wariancji z testem F możemy przeprowadzić, jeżeli dane nie są ekstremalnie asymetryczne (brak bardzo odstających wartości) i zaobserwowane odchylenia standardowe nie różnią się znacznie (np. maksymalne < 2 * minimalne) oraz gdy próby są odpowiednio duże.

Jeżeli mamy podejrzenia, że założenia, nawet w przybliżeniu, nie są spełnione, możemy zastosować test nieparametryczny Kruskala-Wallisa opisany w rozdziale 20.

19.2 Statystyka testowa F - wzór

Wyznaczenie statystyki testowej opiera się na spostrzeżeniu, że całkowita zmienność (wyznaczona jako suma kwadratów odchyleń od ogólnej średniej) może zostać rozbita na zmienność wewnątrz grup (suma kwadratów odchyleń od grupowych średnich) i zmienność między grupami (suma kwadratów odchyleń średnich grupowych od ogólnej):

\[ SSTotal = SSTR + SSE \]

19.2.1 Zmienność między grupami

Zmienność między grupami (międzygrupową sumę kwadratów) będziemy oznaczać skrótem SSTR (SS — to sum of squares, czyli suma kwadratów, TR — treatment, czyli określenie poszczególnych grup11). Inne oznaczenia zmienności między grupami to SST, SS Groups, \(SS_{między}\) itp.

Wzór:

\[ SSTR = \sum_{i=1}^r n_i (\bar{x}_i-\bar{x})^2 \tag{19.1} \]

gdzie \(r\) to liczba grup, \(n_i\) to liczebność \(i\)-tej grupy, \(\bar{x}_i\) to średnia w \(i\)-tej grupie, zaś \(\bar{x}\) to średnia całkowita.

Średnia zmienność międzygrupowa (MSTR, mean sum of squares due to treatment) to SSTR podzielona przez \(r-1\) (\(r\) to liczba grup):

\[ MSTR = \frac{SSTR}{r-1} \tag{19.2} \]

19.2.2 Zmienność wewnątrz grup

Zmienność wewnątrz grup mierzymy za pomocą sumy kwadratów „błędów” (SSE — ang. sum of squares of errors):

\[ SSE = \sum_{j=1}^{n_1}(x_{1j}-\bar{x}_1)^2 + \sum_{j=1}^{n_2}(x_{2j}-\bar{x}_2)^2+ \dots + \sum_{j=1}^{n_r}(x_{rj}-\bar{x}_r)^2 \tag{19.3} \]

gdzie \(n_1\), \(n_2\), ... to liczebności poszczególnych grup \(x_{1j}\), \(x_{2j}\) to poszczególne obserwacje w grupie \(j\), a \(\bar{x}_1\), \(\bar{x}_2\) to zaobserwowane średnie w grupach.

Średnia suma kwadratów błędów (MSE, czasem nazywana wariancją błędu) to:

\[ MSE = \frac{SSE}{n-r} \tag{19.4} \]

Można zauważyć, że:

\[ SSE = ({n_1}-1)s_1^2 +({n_2}-1)s_2^2 + ... ({n_r}-1)s_r^2 \tag{19.5} \]

Czyli MSE to wariancja zbiorcza (jak teście dwóch średnich: 16.3).

19.2.3 Statystyka F

Statystyka F to stosunek średniej zmienności międzygrupowej do wariancji zbiorczej:

\[ F_{(r-1,n-r)}=\frac{MSTR}{MSE} \tag{19.6} \]

Statystyka F ma rozkład F (rozkład Fishera-Snedecora) o stopniach swobody \(df_1 = r-1\) i \(df_2 = n-r\).

19.3 Tabela wyników ANOVA

Tabela, w której przedstawiane są wyniki analizy wariancji ma najczęściej następujący format:

Źródło zmienności Suma kwadratów (SS) Stopnie swobody (df) Średnia suma kwadratów (MS) F
Między grupami SSTR r-1 MSTR F = MSTR/MSE
Wewnątrz grup SSE n-r MSE
Całość SSTotal n-1

19.4 Wielkość efektu

Wielkość efektu w ramach analizy wariancji mierzymy najczęściej za pomocą współczynnika \(\eta^2\) (eta-kwadrat). Można interpretować ten współczynnik jako „udział wyjaśnionej wariancji”, tzn. udział całkowitej wariancji badanej zmiennej ilościowej wyjaśnionej przez zmienność międzygrupową.

\[ \eta^2 = \frac{SSTR}{SSTotal} \tag{19.7} \]

Alternatywną opcją jest współczynnik \(\omega^2\) (omega-kwadrat), który jest uznawany za lepszy (mniej obciążony) estymator udziału wyjaśnionej wariancji w populacji:

\[ \omega^2 = \frac{SSTR-(r-1)\cdot MSE}{SSTotal+MSE} \tag{19.8} \]

Niekiedy jako miara wielkości efektu stosowana jest miara \(f\) Cohena:

\[ f = \sqrt{\frac{\eta^2}{1-\eta^2}} \tag{19.9} \]

Od dziedziny i konkretnego problemu zależy to, przy jakich wielkościach tych miar uznamy zaobserwowany efekt za silny. W przypadku braku innego punktu odniesienia, można kierunkowo w przypadku \(\eta^2\) i \(\omega^2\) przyjąć: 0,01 — efekt mały, 0,06 — efekt umiarkowany, 0,14 — efekt duży, zaś w przypadku \(f\): 0,10 — efekt mały, 0,25 — efekt umiarkowany, 0,40 — efekt duży.

19.5 Procedura post hoc

Jeżeli w ramach analizy wariancji odrzucimy hipotezę zerową o równości średnich we wszystkich populacjach, możemy chcieć sprawdzić, które pary średnich różnią się istotnie między sobą. Do tego służą tzw. testy post hoc. Popularnym testem tego typu jest tzw. test HSD (honestly significant difference) Tukeya. W teście post hoc porównuje się średnie parami i identyfikuje te pary, dla których różnica między średnimi w próbie jest statystycznie istotna.

19.6 Test Levene'a i test Browna-Forsythe'a

ANOVA (analiza wariancji) używana jest do porównywania średnich. Możemy jednak zastosować analizę wariancji do porównywania wariancji.

Test Levene'a jednorodności wariancji to test stosowany, gdy chcemy sprawdzić, czy zróżnicowanie w porównywanych populacjach jest takie samo („jednorodne”). H0 w tym teście stwierdza, że wariancje są jednorodne, zaś HA mówi, że przynajmniej jedna wariancja różni się od pozostałych.

Z punktu widzenia obliczeniowego test Levene'a polega na tym, że

  • dla każdej obserwacji obliczamy wartość bezwzględną odchylenia od grupowej średniej (lub mediany), a następnie

  • na tak przekształconych obserwacjach przeprowadzamy zwykły test ANOVA, czyli analizę wariancji (ze statystyką testową F).

Jeżeli dla każdej obserwacji obliczamy wartość bezwzględną odchylenia od grupowej średniej, test nazywamy testem Levene'a, natomiast gdy używamy odchyleń od grupowej mediany, test nazywany jest testem Levene'a z medianą lub testem Browna-Forsythe'a. Test Browna-Forsythe'a jest zwykle rekomendowany jako bardziej odporny i mające lepsze właściwości w praktycznych zastosowaniach.

19.7 Linki

Jednoczynnikowa ANOVA dla prób niezależnych (Pogotowie statystyczne): https://pogotowiestatystyczne.pl/aploud/2023/04/2023-06-Jednoczynnikowa-ANOVA-dla-prob-niezaleznych.pdf

Jednoczynnikowa ANOVA — aplikacja webowa: https://istats.shinyapps.io/ANOVA/

19.8 Szablony

ANOVA — arkusz Google

ANOVA — szablon w Excelu

Kalkulator rozkładu F — arkusz Google

Kalkulator rozkładu F — szablon w Excelu

# Przykładowe dane
group <- as.factor(c(rep("A",7), rep("B",7), rep("C",7), rep("D",7)))
result <- c(51, 87, 50, 48, 79, 61, 53, 82, 91, 92, 80, 52, 79, 73, 
            79, 84, 74, 98, 63, 83, 85, 85, 80, 65, 71, 67, 51, 80)
data<-data.frame(group, result)

#Aby obejrzeć dane, można uruchomić: View(data)            
#Aby zapisać dane do pliku tekstowego, można uruchomić: write.csv2(data, "data.csv")
#Aby wczytać dane z pliku tekstowego, można uruchomić: read.csv2("data.csv")

# Tabela z podsumowaniem
library(dplyr)
data %>% 
  group_by(group) %>% 
  summarize(n=n(), suma = sum(result), srednia = mean(result), odch_st=sd(result), mediana = median(result)) %>%
  data.frame() -> summary_table

# Tabela ANOVA
model<-aov(result~group, data=data)
anova_summary<-summary(model)

# Test Levene'a (Browna-Forsythe'a)
levene_result<-car::leveneTest(result~group, data=data)

# Procedura Tukeya
tukey_result<-TukeyHSD(x=model, conf.level=0.95)

print(list(`Podsumowanie` = summary_table, `Tabela ANOVA` = anova_summary, `Test Levene'a` = levene_result,
           `HSD Tukeya` = tukey_result))
## $Podsumowanie
##   group n suma  srednia  odch_st mediana
## 1     A 7  429 61,28571 15,56400      53
## 2     B 7  549 78,42857 13,45185      80
## 3     C 7  566 80,85714 10,76148      83
## 4     D 7  499 71,28571 11,61485      71
## 
## $`Tabela ANOVA`
##             Df Sum Sq Mean Sq F value Pr(>F)  
## group        3   1620   539,8   3,204 0,0412 *
## Residuals   24   4043   168,5                 
## ---
## Signif. codes:  0 '***' 0,001 '**' 0,01 '*' 0,05 '.' 0,1 ' ' 1
## 
## $`Test Levene'a`
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  3  0,1898 0,9023
##       24               
## 
## $`HSD Tukeya`
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = result ~ group, data = data)
## 
## $group
##          diff        lwr       upr     p adj
## B-A 17,142857  -1,996412 36,282127 0,0905494
## C-A 19,571429   0,432159 38,710698 0,0437429
## D-A 10,000000  -9,139270 29,139270 0,4870470
## C-B  2,428571 -16,710698 21,567841 0,9849136
## D-B -7,142857 -26,282127 11,996412 0,7340659
## D-C -9,571429 -28,710698  9,567841 0,5237024
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.anova import anova_lm

# Ramka danych
group = ['A']*7 + ['B']*7 + ['C']*7 + ['D']*7
result = [51, 87, 50, 48, 79, 61, 53,
          82, 91, 92, 80, 52, 79, 73, 
          79, 84, 74, 98, 63, 83, 85, 
          85, 80, 65, 71, 67, 51, 80]
data = pd.DataFrame({'group': group, 'result': result})

# Tabela z podsumowaniem danych
summary_table = data.groupby('group')['result'].agg(['count', 'sum', 'mean', 'std', 'median']).reset_index()
summary_table.columns = ['group', 'n', 'suma', 'srednia', 'odch_st', 'mediana']

# ANOVA
model = ols('result ~ group', data=data).fit()
anova_summary = anova_lm(model, typ=2)

# Test Levene'a (Browna-Forsythe'a)
levene_result = stats.levene(data['result'][data['group'] == 'A'],
                             data['result'][data['group'] == 'B'],
                             data['result'][data['group'] == 'C'],
                             data['result'][data['group'] == 'D'])

# Procedura HSD Tukeya
tukey_result = pairwise_tukeyhsd(endog=data['result'], groups=data['group'], alpha=0.05)

print('Podsumowanie:\n\n', summary_table, '\n\nTabela ANOVA:\n\n', anova_summary, '\n\nTest Levene\'a:\n\n', levene_result,
       '\n\nHSD Tukeya:\n\n', tukey_result)
## Podsumowanie:
## 
##    group  n  suma    srednia    odch_st  mediana
## 0     A  7   429  61.285714  15.564000     53.0
## 1     B  7   549  78.428571  13.451854     80.0
## 2     C  7   566  80.857143  10.761483     83.0
## 3     D  7   499  71.285714  11.614851     71.0 
## 
## Tabela ANOVA:
## 
##                 sum_sq    df         F    PR(>F)
## group     1619.535714   3.0  3.204282  0.041204
## Residual  4043.428571  24.0       NaN       NaN 
## 
## Test Levene'a:
## 
##  LeveneResult(statistic=0.18975139523084725, pvalue=0.9023335775328473) 
## 
## HSD Tukeya:
## 
##   Multiple Comparison of Means - Tukey HSD, FWER=0.05 
## =====================================================
## group1 group2 meandiff p-adj   lower    upper  reject
## -----------------------------------------------------
##      A      B  17.1429 0.0905  -1.9964 36.2821  False
##      A      C  19.5714 0.0437   0.4322 38.7107   True
##      A      D     10.0  0.487  -9.1393 29.1393  False
##      B      C   2.4286 0.9849 -16.7107 21.5678  False
##      B      D  -7.1429 0.7341 -26.2821 11.9964  False
##      C      D  -9.5714 0.5237 -28.7107  9.5678  False
## -----------------------------------------------------

19.9 Zadania

Zadanie 19.1 (McClave and Sincich 2012) Psycholog oceniał trzy metody zapamiętywania imion w kontrolowanych warunkach. Próbę 139 studentów podzielono losowo na trzy grupy; każda grupa w inny sposób uczyła się wzajemnie swoich imion. Grupa 1 wykorzystała „prostą grę”, w której pierwsza osoba podaje imię, druga podaje swoje imię oraz imię pierwszej osoby, trzecia podaje swoje imię i imiona dwóch pierwszych itd. Grupa 2 zastosowała „grę złożoną”, będącą modyfikacją prostej gry, w której uczniowie podają nie tylko swoje imiona, ale także ulubione zajęcia (np. sportowe). Grupa 3 stosowała „przedstawianie się parami”: każdy student musi przedstawić drugią osobę z pary. Rok później wszystkim badanym wysłano zdjęcia grupy i poproszono o podanie imion osób ze zdjęcia. Badacze zmierzyli odsetek imion zapamiętanych przez każdego respondenta. Przeprowadź analizę wariancji, aby ustalić, czy średni odsetek zapamiętanych imion różni się w przypadku trzech metod zapamiętywania. Użyj a = 0,05.

Prosta gra: 24, 43, 38, 65, 35, 15, 44, 44, 18, 27, 0, 38, 50, 31, 7, 46, 33, 31, 0, 29, 0, 0, 52, 0, 29, 42, 39, 26, 51, 0, 42, 20, 37, 51, 0, 30, 43, 30, 99, 39, 35, 19, 24, 34, 3, 60, 0, 29, 40, 40

Gra złożona: 39, 71, 9, 86, 26, 45, 0, 38, 5, 53, 29, 0, 62, 0, 1, 35, 10, 6, 33, 48, 9, 26, 83, 33, 12, 5, 0, 0, 25, 36, 39, 1, 37, 2, 13, 26, 7, 35, 3, 8, 55, 50

Pary: 5, 21, 22, 3, 32, 29, 32, 0, 4, 41, 0, 27, 5, 9, 66, 54, 1, 15, 0, 26, 1, 30, 2, 13, 0, 2, 17, 14, 5, 29, 0, 45, 35, 7, 11, 4, 9, 23, 4, 0, 8, 2, 18, 0, 5, 21, 14

Zadanie 19.2 (Agresti, Franklin, and Klingenberg 2016) Linia lotnicza zarządza infolinią, przez którą klienci dokonują rezerwacji. Czasem, kiedy liczba osób obsługujących infolinię jest zbyt mała w stosunku do zainteresowania klientów, niektórzy dzwoniący są przełączani w tryb oczekiwania na połączenie. Linia lotnicza przeprowadziła eksperyment, aby ustalić, czy to, co klient słyszy w tle podczas oczekiwania na połączenie, ma wpływ na jego gotowość do cierpliwego czekania. W ramach ekspekrymentu linia lotnicza losowo przełączała jedno na tysiąc połączeń w tryb oczekiwania. W tym trybie niektórzy dzwoniący słyszeli w tle reklamy aktualnych promocji, inni słyszeli muzykę funkcjonalną (nazywaną „muzyką windową” lub „muzak”), jeszcze inni w słuchawce usłyszeli muzykę klasyczną. Dla każdego dzwoniącego biorącego (mimowolny) udział w eksperymencie zarejestrowano czas do momentu przerwania przez niego połączenia:

  • Reklamy: 5; 1; 11; 2; 8

  • Muzak: 0; 1; 4; 6; 3

  • Muzyka klasyczna: 13; 9; 8; 15; 7

Za pomocą testu ANOVA sprawdź, czy istnieje zależność między tym, co dzwoniący na infolinię słyszy w tle, a czasem cierpliwego oczekiwania na połączenie.

Literatura

Agresti, Alan, Christine Franklin, and Bernhard Klingenberg. 2016. Statistics: The Art and Science of Learning from Data. 4th edition. Pearson.
McClave, J. T., and T. T. Sincich. 2012. Statistics. Pearson Education. https://books.google.pl/books?id=gcYsAAAAQBAJ.

  1. Stosowane na określenie grup w analize wariancji słowo „treatment” wywodzi się z terminologii medycznej / projektowania eksperymentów, gdzie poszczególne grupy poddane są różnym czynnikom / rodzajom leczenia / rodzajom postępowania (ang. treatments)↩︎