library(nortest)
library(tidyverse)
library(psych)
insurance <- read_csv("insurance.csv")
countries <- read_csv("countries of the world.csv")
Table of Content
- 1 Introduction
- 2 Chi2-test
- 3 Wilcoxon-test
- 4 Kruskal-Wallis-test
- 5 Conclusion
1 Introduction
Bei den zwei vorgestellten inferenzstatistischen Tests (“T-Test” und “ANOVA”) handelte es sich um so genannte parametrische Verfahren. Als Voraussetzung für parametrische Verfahren gilt, dass die unabhängige Variable mindestens intervallskaliert oder normalverteilt ist. Ist eine der beiden Voraussetzung nicht erfüllt, muss auf ein nonparametrisches Verfahren zurückgegriffen werden.
Für diesen Post wurden die Datensätze insurance und countries_of_the_world von der Statistik Plattform “Kaggle” verwendet. Eine Kopie der Datensätze ist unter https://drive.google.com/open?id=1_fK9j74lRidUOsC_tlCAYbaJLuWzgR-e (insurance) und https://drive.google.com/open?id=1QO_t4hySiqVsSDsVOsKZEOHOkLlWO006 (countries_of_the_world) abrufbar.
2 Chi2-test
Der Chi2-Test dient dazu, beobachtete Werte mit erwarteten Werten zu vergleichen. Dieser Test wurde bereits schon einmal in dem Post “Survive on the Titanic - Case Study” thematisiert. Aufbauend darauf, soll in diesem Abschnitt der Chi2-Anpassungstest sowie der Chi2-Test für zwei Variablen vorgestellt werden. Für diese Untersuchung wird der Datensatz insurance verwendet.
head(insurance)
## # A tibble: 6 x 7
## age sex bmi children smoker region charges
## <int> <chr> <dbl> <int> <chr> <chr> <dbl>
## 1 19 female 27.9 0 yes southwest 16885.
## 2 18 male 33.8 1 no southeast 1726.
## 3 28 male 33 3 no southeast 4449.
## 4 33 male 22.7 0 no northwest 21984.
## 5 32 male 28.9 0 no northwest 3867.
## 6 31 female 25.7 0 no southeast 3757.
Chi2-Anpassungstest
Im nachfolgenden wird untersucht, ob die Geschlechterverteilung in der vorliegenden Stichprobe von der Häufigkeitsverteilung in der Population abweicht.
geschl.tabelle <- table(insurance$sex)
geschl.tabelle
##
## female male
## 662 676
Man sieht, dass die Verteilung gleich ausfällt.
chisq.test(geschl.tabelle)
##
## Chi-squared test for given probabilities
##
## data: geschl.tabelle
## X-squared = 0.14649, df = 1, p-value = 0.7019
Der Chi2 Test zeigt ein nicht signifikantes Ergebnis (chi2=0,15, df=1,p=.702). Dies bedeutet, dass die Häufigkeitsverteilung in unserer Stichprobe nicht bedeutsam von der Häufigkeitsverteilung in der Population abweicht.
Chi2-Test für zwei Variablen
Der Chi2 Test kann ebenfalls dazu verwendet werden, um die Höhe des Zusammenhangs zwischen zwei nominalskalierten Variablen zu beschreiben. Es soll untersucht werden, ob in den verschiedenen Regionen unterschiedlich viele Männer oder Frauen leben.
tab1 <- table(insurance$sex, insurance$region)
addmargins(tab1)
##
## northeast northwest southeast southwest Sum
## female 161 164 175 162 662
## male 163 161 189 163 676
## Sum 324 325 364 325 1338
chisq.test(tab1)
##
## Pearson's Chi-squared test
##
## data: tab1
## X-squared = 0.43514, df = 3, p-value = 0.9329
Mit der addmargins Funktion wird eine Kontingenztabelle mit den absoluten Häufigkeiten erstellt. Der durchgeführte Test zeigt mit chi2=0,44, df=3, p=.933 ein nicht signifikantes Ergebnis. Frauen und Männer sind demnach in den unterschiedlichen Regionen gleich stark verteilt.
Wird der Chi2 Test auf eine 2x2 Tabelle angewendet, führt R automatisch die Korrektur von Yates durch. Für eine beispielhafte Darstellung wird nachfolgend untersucht, ob sich Männer und Frauen hinsichtlich ihres Raucherstatus (Raucher vs. Nichtraucher) unterscheiden.
tab2 <- table(insurance$sex, insurance$smoker)
addmargins(tab2)
##
## no yes Sum
## female 547 115 662
## male 517 159 676
## Sum 1064 274 1338
chisq.test(tab2)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab2
## X-squared = 7.3929, df = 1, p-value = 0.006548
Das Ergebnis ist signifikant (chi2=7,39, df=1, p<.001). Männer sind demnach häufiger Raucher als es Frauen sind.
3 Wilcoxon-test
Der Wilcoxon-Test stellt eine nonparametrische Alternative zum “T-Test” dar. In diesem Abschnitt wird lediglich die Verwendung des Wilcoxon-Tests für zwei unabhängige Stichproben behandelt. Dafür wird der Datensatz countries_of_the_world verwendet.
glimpse(countries)
## Observations: 227
## Variables: 20
## $ Country <chr> "Afghanistan", "Albania",...
## $ Region <chr> "ASIA (EX. NEAR EAST)", "...
## $ Population <int> 31056997, 3581655, 329300...
## $ `Area (sq. mi.)` <int> 647500, 28748, 2381740, 1...
## $ `Pop. Density (per sq. mi.)` <chr> "48,0", "124,6", "13,8", ...
## $ `Coastline (coast/area ratio)` <chr> "0,00", "1,26", "0,04", "...
## $ `Net migration` <chr> "23,06", "-4,93", "-0,39"...
## $ `Infant mortality (per 1000 births)` <dbl> 16307, 2152, 31, 927, 405...
## $ `GDP ($ per capita)` <int> 700, 4500, 6000, 8000, 19...
## $ `Literacy (%)` <dbl> 360, 865, 700, 970, 1000,...
## $ `Phones (per 1000)` <chr> "3,2", "71,2", "78,1", "2...
## $ `Arable (%)` <chr> "12,13", "21,09", "3,22",...
## $ `Crops (%)` <chr> "0,22", "4,42", "0,25", "...
## $ `Other (%)` <dbl> 8765, 7449, 9653, 75, 977...
## $ Climate <dbl> 1, 3, 1, 2, 3, NA, 2, 2, ...
## $ Birthrate <dbl> 466, 1511, 1714, 2246, 87...
## $ Deathrate <dbl> 2034, 522, 461, 327, 625,...
## $ Agriculture <chr> "0,38", "0,232", "0,101",...
## $ Industry <chr> "0,24", "0,188", "0,6", N...
## $ Service <chr> "0,38", "0,579", "0,298",...
Es soll untersucht werden, ob die Länder der Regionen “WESTERN EUROPE” und “OCEANIA” sich in ihrem Populationswert unterscheiden.
wilcox <- countries %>% filter(Region == "WESTERN EUROPE" | Region == "OCEANIA") %>%
select(Region, Population)
wilcox$Population.num <- as.numeric(wilcox$Population)
Wie auch beim “T-Test” wird untersucht, ob Normalverteilung der unabhängigen Variable (hier Population) vorliegt.
lillie.test(wilcox$Population.num)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: wilcox$Population.num
## D = 0.31988, p-value = 7.605e-14
Das signifikante Ergebnis zeigt uns, dass die Variable Population.num
nicht normalverteilt ist.
sampling.size <- describeBy(wilcox$Population.num, wilcox$Region, mat = TRUE)
sampling.size$n
## [1] 21 28
Auch der zentrale Grenzwertsatz greift hier nicht, da N1 und N2 jeweils < 30 liegen. Es muss daher anstelle des klassischen T-Tests der Wilcoxon-Test durchgeführt werden.
wilcox.test(wilcox$Population.num ~ wilcox$Region)
##
## Wilcoxon rank sum test
##
## data: wilcox$Population.num by wilcox$Region
## W = 166, p-value = 0.009101
## alternative hypothesis: true location shift is not equal to 0
Mit W=166 und p<.001 ist der Test signifikant. Die Länder der Regionen “WESTERN EUROPE” und “OCEANIA” unterscheiden sich in ihrem Populationswert.
4 Kruskal-Wallis-test
Der Kruskal-Wallis-Test stellt eine nonparametrische Alternative zur “einfaktoriellen Varianzanalyse” ohne Messwiederholung dar. Es soll hierbei untersucht werden, ob die Länder der Regionen “WESTERN EUROPE”, “OCEANIA” und “NEAR EAST” sich hinsichtlich ihrem Populationswert signifikant voneinander unterscheiden. Es wird erneut der Datensatz countries_of_the_world verwendet.
kruskal <- countries %>% filter(Region == "WESTERN EUROPE" | Region == "OCEANIA" | Region == "NEAR EAST") %>%
select(Region, Population)
kruskal$Population.num <- as.numeric(kruskal$Population)
kruskal
## # A tibble: 65 x 3
## Region Population Population.num
## <chr> <int> <dbl>
## 1 OCEANIA 57794 57794
## 2 WESTERN EUROPE 71201 71201
## 3 OCEANIA 20264082 20264082
## 4 WESTERN EUROPE 8192880 8192880
## 5 NEAR EAST 698585 698585
## 6 WESTERN EUROPE 10379067 10379067
## 7 OCEANIA 21388 21388
## 8 NEAR EAST 784301 784301
## 9 WESTERN EUROPE 5450661 5450661
## 10 WESTERN EUROPE 47246 47246
## # ... with 55 more rows
Die Variable Population.num
wurde unter Punkt 3 bereits auf Normalverteilung überprüft (das Ergebnis war signifikant, d.h. es liegt keine Normalverteilung vor). Diesen Schritt sparen wir uns daher an dieser Stelle. Es wird lediglich erneut die Stichprobengröße untersucht.
sampling.size <- describeBy(kruskal$Population.num, kruskal$Region, mat = TRUE)
sampling.size$n
## [1] 16 21 28
Erneut greift der zentrale Grenzwertsatz nicht, daher wird anstelle der einfaktoriellen Varinzanalyse der Kruskal-Wallis-Test angewendet.
kruskal.test(kruskal$Population.num ~ factor(kruskal$Region))
##
## Kruskal-Wallis rank sum test
##
## data: kruskal$Population.num by factor(kruskal$Region)
## Kruskal-Wallis chi-squared = 15.13, df = 2, p-value = 0.0005183
Die Prüfgröße des Kruskal-Wallis-Test ist chi2 verteilt. Wir erhalten ein signifikantes Ergebnis mit chi2=15,13, df=2 und p<.001. Die Länder der drei Regionen unterschieden sich demnach in ihren Populationswerten.
5 Conclusion
Zwar kommt es bei einer repräsentativen Studie eher selten dazu, dass die unabhängige Variable nicht normalverteilt ist bzw. die Stichprobengröße (pro Gruppe!) unter 30 fällt aber streng genommen ist eine Variable, die durch die Verwendung einer Likert-Skala erhoben wurde, nicht intervallskaliert. Demnach müssten, bei Verwendung solcher Variablen, nonparametrische Verfahren eingesetzt werden.
Source
Luhmann, M. (2011). R für Einsteiger.