library(tidyverse)
library(readxl)
<- read_excel("data/pracownicy.xlsx") pracownicy
2 Testowanie hipotez
2.1 Wprowadzenie
Do rozwiązania wybranych zagadnień analizy statystycznej wystarczą metody weryfikacji hipotez statystycznych. Taki proces można przedstawić w następujących krokach:
- Sformułowanie dwóch wykluczających się hipotez - zerowej
oraz alternatywnej - Wybór odpowiedniego testu statystycznego
- Określenie dopuszczalnego prawdopodobieństwo popełnienia błędu I rodzaju (czyli poziomu istotności
) - Podjęcie decyzji
Wymienione powyżej nowe pojęcia zostaną wyjaśnione poniżej.
2.2 Hipoteza statystyczna
Przypuszczenie dotyczące własności analizowanej cechy, np. średnia w populacji jest równa 10, rozkład cechy jest normalny.
Formułuje się zawsze dwie hipotezy: hipotezę zerową (
Z kolei hipoteza alternatywna zakłada coś przeciwnego:
Zamiast znaku nierówności (
2.3 Poziom istotności i wartość p
Hipotezy statystyczne weryfikuje się przy określonym poziomie istotności
Większość programów statystycznych podaje w wynikach testu wartość p. Jest to najostrzejszy poziom istotności, przy którym możemy odrzucić hipotezę
Generalnie jeśli
2.4 Testy statystyczne
W zależności od tego co chcemy weryfikować należy wybrać odpowiedni test. Tabela poniżej przedstawia dosyć wyczerpującą klasyfikację testów pobraną ze strony.
2.5 Zbiór danych
Będziemy działać na zbiorze danych dotyczącym pracowników przedsiębiorstwa. Poniżej znajduje się opis cech znajdujących się w tym zbiorze,
- id - kod pracownika
- plec - płeć pracownika (0 - mężczyzna, 1 - kobieta)
- data_urodz - data urodzenia
- edukacja - wykształcenie (w latach nauki)
- kat_pracownika - grupa pracownicza (1 - specjalista, 2 - menedżer, 3 - konsultant)
- bwynagrodzenie - bieżące wynagrodzenie
- pwynagrodzenie - początkowe wynagrodzenie
- staz - staż pracy (w miesiącach)
- doswiadczenie - poprzednie zatrudnienie (w miesiącach)
- zwiazki - przynależność do związków zawodowych (0 - nie, 1 - tak)
- wiek - wiek (w latach)
2.6 Test niezależności
Za pomocą testu niezależności
zmienne są niezależne, zmienne nie są niezależne.
W programie R test niezależności można wywołać za pomocą funkcji chisq.test()
z pakietu stats. Jako argument tej funkcji należy podać tablicę kontyngencji. W przypadku operowania na danych jednostkowych można ją utworzyć poprzez funkcję table()
. Jeżeli wprowadzamy liczebności ręcznie to należy zadbać o to, żeby wprowadzony obiekt był typu matrix
.
Przykład
Czy pomiędzy zmienną płeć, a zmienną przynależność do związków zawodowych istnieje zależność?
W pierwszym kroku określamy hipotezy badawcze:
oraz przyjmujemy poziom istotności - weźmy standardową wartość
W pierwszej kolejności popatrzmy na tabelę krzyżową (kontyngencji) zawierającą liczebności poszczególnych kombinacji wariantów.
table(pracownicy$plec, pracownicy$zwiazki)
0 1
0 194 64
1 176 40
Wartości w tej tabeli nie wskazują na liczniejszą reprezentację jednej z płci w związkach zawodowych. Zweryfikujemy zatem wskazaną hipotezę zerową z wykorzystaniem testu
chisq.test(table(pracownicy$plec, pracownicy$zwiazki))
Pearson's Chi-squared test with Yates' continuity correction
data: table(pracownicy$plec, pracownicy$zwiazki)
X-squared = 2.3592, df = 1, p-value = 0.1245
Przy poziomie istotności
Przykład
Czy pomiędzy płcią, a grupami bieżącego wynagrodzenia zdefiniowanymi przez medianę istnieje zależność?
W pierwszej kolejności tworzymy nową cechą zamieniając cechę bwynagrodzenie
na zmienną jakościową posiadającą dwa warianty: poniżej mediany i powyżej mediany.
<- pracownicy %>%
pracownicy mutate(bwyn_mediana=cut(x = bwynagrodzenie,
breaks = c(min(bwynagrodzenie),
median(bwynagrodzenie),
max(bwynagrodzenie)),
include.lowest = TRUE))
table(pracownicy$plec, pracownicy$bwyn_mediana)
[1.58e+04,2.89e+04] (2.89e+04,1.35e+05]
0 73 185
1 164 52
W tym przypadku wygląd tablicy krzyżowej może sugerować występowanie zależności.
chisq.test(table(pracownicy$plec, pracownicy$bwyn_mediana))
Pearson's Chi-squared test with Yates' continuity correction
data: table(pracownicy$plec, pracownicy$bwyn_mediana)
X-squared = 104.8, df = 1, p-value < 2.2e-16
Test
2.7 Test proporcji
Test proporcji pozwala odpowiedzieć na pytanie czy odsetki w jednej, dwóch lub więcej grupach różnią się od siebie istotnie. Dla jednej próby układ hipotez został przedstawiony poniżej:
lub lub
Układ hipotez w przypadku dwóch prób jest następujący:
lub lub
Dla
W takim przypadku hipoteza alternatywna oznacza, że co najmniej jeden odsetek różni się istotnie od pozostałych.
Funkcja prop.test
z pakietu stats umożliwia przeprowadzanie testu proporcji w programie R. Jako argumenty należy podać wektor, który zawiera licznik badanych odsetków - x
, oraz wektor zawierający wartości mianownika - n
. W przypadku jednej próby należy jeszcze dodać argument p
, którego wartość oznacza weryfikowany odsetek.
Przykład
Wysunięto przypuszczenie, że palacze papierosów stanowią jednakowy odsetek wśród mężczyzn i kobiet. W celu sprawdzenia tej hipotezy wylosowano 500 mężczyzn i 600 kobiet. Okazało się, że wśród mężczyzn było 200 palaczy, a wśród kobiet 250.
prop.test(x = c(200,250), n = c(500,600))
2-sample test for equality of proportions with continuity correction
data: c(200, 250) out of c(500, 600)
X-squared = 0.24824, df = 1, p-value = 0.6183
alternative hypothesis: two.sided
95 percent confidence interval:
-0.07680992 0.04347659
sample estimates:
prop 1 prop 2
0.4000000 0.4166667
Przy poziomie istotności 0,05 nie ma podstaw do odrzucenia H0 - odsetek palaczy jest taki sam w grupach płci.
2.8 Testowanie normalności - test Shapiro-Wilka
Testy parametryczne z reguły wymagają spełnienia założenia o normalności rozkładu. W celu weryfikacji tego założenia należy wykorzystać jeden z testów normalności.
W celu formalnego zweryfikowania rozkładu cechy można wykorzystać test Shapiro-Wilka. Układ hipotez z tym teście jest następujący:
- rozkład cechy ma rozkład normalny - rozkład cechy nie ma rozkładu normalnego
W przeprowadzonych dotychczas symulacjach wykazano, że test Shapiro-Wilka ma największą moc spośród testów normalności, niemniej jego ograniczeniem jest maksymalna liczba obserwacji, która wynosi 50001.
W programie R test Shapiro-Wilka można uruchomić za pomocą funkcji shapiro.test()
jako argument podając wektor wartości liczbowych, który chcemy zweryfikować.
2.9 Testowanie normalności - wykres kwantyl-kwantyl
Normalność rozkładu może także zostać zweryfikowana poprzez utworzenie wykresu przedstawiającego porównanie wartości oryginalnych oraz odpowiadającym im wartości pochodzących z rozkładu normalnego. Dodatkowo prowadzona jest linia regresji pomiędzy otrzymanymi wartościami. Punkty przebiegające w pobliżu tej linii oznaczają, że rozkład tej cechy jest normalny.
Na wykresie przedstawiony jest wykres kwantyl-kwantyl dla 50 wartości wylosowanych z rozkładu normalnego i z rozkładu jednostajnego.
Jak można zauważyć punkty na wykresie po lewej stronie nie odbiegają znacząco od linii prostej, zatem można przypuszczać, że rozkład tej cechy jest normalny. Z kolei na wykresie po prawej stronie obserwuje się odstępstwo od rozkładu normalnego - wartości na krańcach linii są od niej oddalone.
Przykład
Czy cecha doświadczenie ma rozkład normalny? Sprawdź za pomocą odpowiedniego testu oraz wykresu kwantyl-kwantyl.
shapiro.test(pracownicy$doswiadczenie)
Shapiro-Wilk normality test
data: pracownicy$doswiadczenie
W = 0.8136, p-value < 2.2e-16
Na poziomie
ggplot(pracownicy, aes(sample = doswiadczenie)) +
stat_qq() +
stat_qq_line()
2.10 Testowanie wariancji - test Bartletta
Oprócz założenia o normalności, niektóre metody statystyczne wymagają także równości wariancji.
Jeśli chcemy sprawdzić homogeniczność wariancji w dwóch lub więcej grupach to należy skorzystać z testu Bartletta:
Funkcja bartlett.test()
w programie R umożliwia zastosowanie tego testu. Argumenty do tej funkcji można przekazać na dwa sposoby. Pierwszy polega na przypisaniu do argumentu x
wektora zawierającego wartości cechy, a do argumentu g
wektora zawierającego identyfikatory poszczególnych grup. Drugi sposób to zadeklarowanie formuły w postaci zmienna_analizowa ~ zmienna_grupująca
oraz podanie zbioru danych przypisanego do argumentu data
.
Przykład
Sprawdźmy czy wariancje zmiennej doświadczenie
w grupach płci są takie same.
Funkcję weryfikującą
bartlett.test(x = pracownicy$doswiadczenie, g = pracownicy$plec)
Bartlett test of homogeneity of variances
data: pracownicy$doswiadczenie and pracownicy$plec
Bartlett's K-squared = 4.7659, df = 1, p-value = 0.02903
bartlett.test(pracownicy$doswiadczenie ~ pracownicy$plec)
Bartlett test of homogeneity of variances
data: pracownicy$doswiadczenie by pracownicy$plec
Bartlett's K-squared = 4.7659, df = 1, p-value = 0.02903
Przyjmując poziom istotności
2.11 Testowanie średnich
W przypadku testowania wartości przeciętnych należy wprowadzić pojęcie prób zależnych i niezależnych:
próby zależne (paired) - analizowane są te same jednostki, ale różne cechy.
próby niezależne (unpaired) - analizowane są różne jednostki, ale ta sama cecha.
W zależności od tego czy spełnione są odpowiednie założenia dotyczące normalności cechy oraz równości wariancji należy wybrać odpowiedni test według poniższego diagramu.
2.11.1 Test t-średnich
Weryfikacja równości średnich może odbywać się na zasadzie porównania wartości średniej w jednej grupie z arbitralnie przyjętym poziomem lub w dwóch różnych grupach. W pierwszym przypadku rozważamy układ hipotez:
lub lub
natomiast w drugim przypadku hipotezy będą wyglądać następująco:
lub lub
Alternatywnie hipotezę zerową można zapisać jako
W funkcji t.test()
z pakietu stats w przypadku jednej próby należy podać argument x
czyli wektor z wartościami, które są analizowane oraz wartość, z którą tą średnią porównujemy (argument mu
, który domyślnie jest równy 0). Dodatkowo w argumencie alternative
wskazujemy jaką hipotezę alternatywną bierzemy pod uwagę.
Dla weryfikacji równości średniej w dwóch próbach należy dodać argument y
z wartościami w drugiej próbie. W tym przypadku mamy także możliwość określenia czy próby są zależne (argument paired
) lub czy wariancja w obu próbach jest taka sama (var.equal
). Jeżeli wariancje są różne to program R przeprowadzi test t Welcha i liczba stopni swobody nie będzie liczbą całkowitą.
2.11.2 ANOVA
W przypadku większej liczby grup stosuje się jednoczynnikową analizę wariancji (ANOVA). Ta analiza wymaga spełnienia założenia o normalności rozkładu i równości wariancji w badanych grupach. Układ hipotez jest następujący:
Za pomocą funkcji aov()
można w R przeprowadzić jednoczynnikową analizę wariancji. Jako argument funkcji należy podać formułę przedstawiającą zależność zmiennej badanej do zmiennej grupującej wykorzystując w tym celu symbol tyldy (~
) w następującym kontekście: zmienna_analizowana ~ zmienna_grupująca
. Przy takim zapisie należy także w argumencie data
podać nazwę zbioru danych.
W porównaniu do wcześniej opisanych funkcji, aov()
nie zwraca w bezpośrednim wyniku wartości p. Aby uzyskać tę wartość należy wynik działania tej funkcji przypisać do obiektu, a następnie na nim wywołać funkcję summary()
.
W przypadku odrzucenia hipotezy zerowej można przeprowadzić test Tukeya w celu identyfikacji różniących się par wykorzystując funkcję TukeyHSD()
i jako argument podając obiekt zawierający wynik ANOVA.
W sytuacji, w której założenia użycia testu parametrycznego nie są spełnione, należy skorzystać z testów nieparametrycznych. W przypadku testowania miar tendencji centralnej różnica pomiędzy testami parametrycznymi a nieparametrycznymi polega na zastąpieniu wartości średniej medianą. Z punktu widzenia obliczeń w miejsce oryginalnych wartości cechy wprowadza się rangi czyli następuje osłabienie skali pomiarowej - z ilorazowej na porządkową.
2.11.3 Test Wilcoxona
Test Wilcoxona jest nieparametryczną wersją testu t. Hipotezy w tym teście dotyczą równości rozkładów:
Wartość statystyki testowej będzie zależna od typu testu, natomiast w R funkcja, której należy użyć to wilcox.test()
. Argumenty tej funkcji są takie same jak w przypadku testu t.
2.11.4 Test Kruskala-Wallisa
Z kolei test Kruskala-Wallisa jest nieparametrycznym odpowiednikiem ANOVA. Hipotezy są następujące:
W programie R korzysta się z funkcji kruskal.test()
, która przyjmuje takie same argumenty jak funkcja do metody ANOVA aov()
. Główną różnicą jest sposób podawania wyniku testu, ponieważ w tym przypadku od razu otrzymujemy wartość p. W przypadku odrzucenia hipotezy zerowej należy sprawdzić, które grupy różnią się między sobą. Można to zrobić za pomocą funkcji pairwise.wilcox.test()
.
Przykład
Sprawdzimy czy średnie doświadczenie w grupach płci jest takie same.
W związku z tym, że badana cecha nie ma rozkładu normalnego zostanie przeprowadzony test Wilcoxona. Mamy tutaj do czynienia z testem dla prób niezależnych - badana jest jedna cecha (doświadczenie) w ramach rozłącznych grup płci.
wilcox.test(pracownicy$doswiadczenie ~ pracownicy$plec)
Wilcoxon rank sum test with continuity correction
data: pracownicy$doswiadczenie by pracownicy$plec
W = 36295, p-value = 1.372e-08
alternative hypothesis: true location shift is not equal to 0
Przyjmując poziom istotności
Przykład
Czy początkowe i bieżące wynagrodzenie różni się od siebie w sposób istotny?
W pierwszej kolejności weryfikujemy normalność rozkładu analizowanych cech.
shapiro.test(pracownicy$pwynagrodzenie)
Shapiro-Wilk normality test
data: pracownicy$pwynagrodzenie
W = 0.71535, p-value < 2.2e-16
shapiro.test(pracownicy$bwynagrodzenie)
Shapiro-Wilk normality test
data: pracownicy$bwynagrodzenie
W = 0.77061, p-value < 2.2e-16
Wynagrodzenie w tym zbiorze danych zdecydowanie nie przypomina rozkładu normalnego. W tym przypadku analizujemy próby zależne - badamy dwie różne cechy dla tych samych jednostek (obserwacji).
wilcox.test(x = pracownicy$pwynagrodzenie,
y = pracownicy$bwynagrodzenie,
paired = TRUE)
Wilcoxon signed rank test with continuity correction
data: pracownicy$pwynagrodzenie and pracownicy$bwynagrodzenie
V = 0, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
Na podstawie podanej wartości p odrzucamy
Przykład
Analogicznie można także sprawdzić czy np. doświadczenie różni się w ramach więcej niż dwóch grup - w takim przypadku rozpatrujemy głównie próby niezależne.
kruskal.test(pracownicy$doswiadczenie ~ pracownicy$kat_pracownika)
Kruskal-Wallis rank sum test
data: pracownicy$doswiadczenie by pracownicy$kat_pracownika
Kruskal-Wallis chi-squared = 57.466, df = 2, p-value = 3.322e-13
Przyjmując poziom istotności
W przypadku liczniejszych prób można wykorzystać test Kołmogorowa-Smirnova.↩︎