様々な検定や推定において対象となる標本データの正規性を仮定している場合が多数あります。このような前提条件を無視して検定や推定を行った場合、結果の妥当性が疑問視される可能性が高いです。そこで、対象となる標本データに正規性があるかどうかを確認する必要があります。
標本データの正規性を確認する方法には以下のように主観的なものから検定のような客観的なものまで様々な方法があります。
- 分布形状の確認
- 正規確率プロット(正規QQプロット)
- 歪度と尖度
- 正規性の検定
以降、各方法に対してiris
データセットの萼片幅(Sepal.Width
)を用いて実際にどのようになるか見てみます。
Packages and Datasets
本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
Package | Version | Description |
---|---|---|
e1071 | 1.7.0 | Misc Functions of the Department of Statistics |
moments | 0.14 | Moments, cumulants, skewness, kurtosis and related tests |
nortest | 1.0.4 | Test for Normality |
qqplotr | 0.0.3 | Quantile-Quantile Plot Extensions for ‘ggplot2’ |
tidyverse | 1.2.1 | Easily Install and Load the ‘Tidyverse’ |
また、本ページでは以下のデータセットを用いています。
Dataset | Package | Version | Description |
---|---|---|---|
iris | datasets | 3.4.4 | Edgar Anderson’s Iris Data |
分布形状の確認
ヒストグラムを描くことで標本データの分布形状を確認することができます。概ね左右対象の山形状分布であれば正規分布にしたがっていると言えます。ただし、ヒストグラムは階級幅の取り方により形状が変わってしまいますので注意が必要です。
階級幅の求め方
階級幅を求めるには標本データに応じた階級数を決めて階級幅を決める方法があります。階級数を決める方法は様々ですが、以下のような方法が広く知られています。
方法 | Rでの関数 |
---|---|
スタージェスの公式(Sturges’ formula) | nclass.Sturges |
スコットの選択(Scott’s choice) | nclass.scott |
フリードマン-ダイアコニスの選択(Freedman–Diaconis’ choice) | nclass.FD |
上記以外にも平方根選択、\(L^2\)危険関数推定の最小化に基づく選択などがあります。また、標本データが金額のような場合には百円単位、千円単位というように分かりやすい階級幅が使われることもあります。
ヒストグラム
スタージェスの公式を用いてヒストグラムを描いてみます。
breaks <- pretty(iris$Sepal.Width, n = nclass.Sturges(iris$Sepal.Width))
iris %>%
tidyr::drop_na(Sepal.Width) %>%
ggplot2::ggplot(ggplot2::aes(x = Sepal.Width)) +
ggplot2::geom_histogram(breaks = breaks) +
ggplot2::labs(x = "萼片幅", y = "度数")
正規確率プロット
正規確率プロットは正規QQプロットとも呼ばれ、標本データが正規分布にしたがう場合の期待値と標本データそのものをプロットしたものです。プロットが一直線上に並べば標本データは正規分布にしたがっていると言えます。
iris %>%
tidyr::drop_na(Sepal.Width) %>%
ggplot2::ggplot(ggplot2::aes(sample = Sepal.Width)) +
qqplotr::stat_qq_band(distribution = "norm",
dparams = list(mean = 0, sd = 1)) +
qqplotr::stat_qq_line(distribution = "norm",
dparams = list(mean = 0, sd = 1)) +
qqplotr::stat_qq_point(distribution = "norm",
dparams = list(mean = 0, sd = 1)) +
ggplot2::theme_minimal() +
ggplot2::labs(x = "Theoretical Quantiles", y = "Sample Quantiles")
正規確率プロットの考え方
正規確率プロット(正規QQプロット)は名前の通り横軸を正規分布の分位数、縦軸を対象データの分位数を座標としてプロットします。
- 対象データを昇順に並べかえる
- 順位を割り当て分位数(%順位)を計算する
- 分位数(%順位)から(標準)Zスコアを計算する
- (標準)Zスコアを横軸に対象データを縦軸にプロットする
iris %>%
tidyr::drop_na(Sepal.Width) %>%
dplyr::arrange(Sepal.Width) %>% # 昇順に並べる
tibble::rownames_to_column("rank") %>% # 順位を割り当てる
dplyr::mutate(prank = as.numeric(rank)/n()) %>%
# %順位を計算する
dplyr::mutate(sz = qnorm(prank, mean = 0, sd = 1)) %>%
# 標準Zスコアを計算する
ggplot2::ggplot(ggplot2::aes(x = sz)) +
ggplot2::geom_point(ggplot2::aes(y = Sepal.Width)) +
ggplot2::labs(x = "Z Score(Theoretical Quantiles)",
y = "Sepal.Width(Sample Quantiles)")
なお、QQプロットの描画自体についてはこちらを参照してください。
歪度と尖度
歪度とは分布の非対象性を示す指標で尖度とは分布の尖り具合を示す指標です。
Rでの関数 | |
---|---|
歪度 | e1071::skewness , moments::skewness など |
尖度 | e1071::kurtosis , moments::kurtosis など |
正規分布の場合、一般的に歪度と尖度は下表のようになり、二種類の定義が存在していることに注意して下さい。RやExcelでは「尖度\(= 0\)」の定義を用いています。
定義 #1 | 定義 #2 | Sepal.Width | |
---|---|---|---|
歪度 | 0 | 0 | 0.3126147 |
尖度 | 3 | 0 | 0.1387047 |
歪度と尖度を用いた検定もありますが、ここでは省略します。検定の関数は[moments
パッケージ ][moments]などに実装されています。
正規性の検定
正規性の検定には以下のように様々な手法があります。
検定 | Rでの関数 | 備考 |
---|---|---|
Shapiro-Wilk | shapiro.test |
代表的な正規性の検定 |
Kolmogorov-Smirnov (Lillefors) | nortest::lillie.test |
標本データ数が大きな場合 |
Kolmogorov-Smirnov | ks.test |
|
Anderson–Darling | nortest::ad.test |
分布の裾を厳密に見たい場合 |
尖度と歪度によるオムニバス検定 | 本検定は扱いません | |
D’Agostino | 同上(歪度、尖度を用いた検定) |
シャピロ-ウィルク検定
恐らく正規性の検定の中でも最も有名な仮説検定がシャピロ-ウィルクの正規性検定だと思われます。
\[H_0 : \mbox{標本データは正規母集団からサンプリングされたものである}\]
shapiro.test(iris$Sepal.Width) %>%
broom::tidy()
## # A tibble: 1 x 3
## statistic p.value method
## <dbl> <dbl> <chr>
## 1 0.985 0.101 Shapiro-Wilk normality test
コルモゴロフ-スミルノフ検定
コルモゴロフ-スミルノフ検定は、改良版のリリフォース(Lilliefors)検定と元になったコルモゴロフ-スミルノフ検定の二つがあります。
リリフォース検定
正規分布に関する検定はリリフォースによる改良があり“Lilliefors検定”と呼ばれることがあります。標本数が大きい場合に向いていると言われており標本数2,000を目安にしてシャピロ-ウィルク検定と切り替える 統計ソフト もあります。
\[H_0 : \mbox{標本は正規母集団からサンプリングされたものである}\]
nortest::lillie.test(iris$Sepal.Width) %>%
broom::tidy()
## # A tibble: 1 x 3
## statistic p.value method
## <dbl> <dbl> <chr>
## 1 0.106 0.000314 Lilliefors (Kolmogorov-Smirnov) normality test
コルモゴロフ-スミルノフ検定
二つの標本を比較するノンパラメトリック検定。“KS検定”と略される場合もあります。
\[H_0 : \mbox{(対応のない)二標本の母集団の確率分布は等しい)}\]
ks.test(iris$Sepal.Width, "pnorm") %>%
broom::tidy()
## # A tibble: 1 x 4
## statistic p.value method alternative
## <dbl> <dbl> <chr> <chr>
## 1 0.979 0 One-sample Kolmogorov-Smirnov test two-sided
アンダーソン-ダーリング検定
アンダーソン-ダーリング検定はコルモゴロフ-スミノフ検定に比べると分布の裾(テール)での一致性が強く反映されるため裾(テール)の部分のリスクが重要な場合にに使われます。
\[H_0 : \mbox{標本は正規母集団からサンプリングされたものである}\]
nortest::ad.test(iris$Sepal.Width) %>%
broom::tidy()
## # A tibble: 1 x 3
## statistic p.value method
## <dbl> <dbl> <chr>
## 1 0.908 0.0202 Anderson-Darling normality test