SciPy は Python のための科学的ツールのオープンソース・ライブラリとして開発されています。SciPyは、NumPy をベースにしていて、統計、最適化、積分、線形代数、フーリエ変換、信号・イメージ処理、遺伝的アルゴリズム、ODE (常微分方程式) ソルバ、特殊関数、その他のモジュールを提供しています。
本ブログの過去記事で、SciPy を利用して、データ集合の正規性を Shapiro-Wilk と Anderson-Darling の方法で検定しました [1]。やり方は判りましたが、Shapiro-Wilk 検定では p値が得られるのに対して、Anderson-Darling 検定では有意水準毎に判定するやり方で p値は算出されません。一方、R で同じ検定をしてみると、どちらの検定方法でも p値が得られます [2]。
Python/SciPy の Anderson-Darling 検定でも p値を算出できれば、運用上、Shapiro-Wilk 検定の出力と揃えられて便利です。そこでインターネット上で調べてみたところ、p値の算出方法が判りましたので、試してみました。
Anderson-Darling 検定で p値を計算
Anderson-Darling 検定で p値を計算する方法を調べてみると、下記の文献で紹介されている方法が広く使われているようです。
R.B. D'Augostino and M.A. Stephens, Eds., 1986, Goodness-of-Fit Techniques, Marcel Dekker参考サイト [3]に、英文ですが、読みやすくまとめられてあります。ここで説明されている内容を参考にして、p値を計算しました。
今回は、R で検証する際に同じデータを扱えるように、下記の CSV ファイルのデータを読み込んで検定しました。
データファイル | data_norm.csv |
Python のサンプルは下記のとおりです。上記データを読み込んで、Shapiro-Wilk と Anderson-Darling 検定をします。
以下に実行例を示しました。
[16.90967902 11.31394259 23.99799686 23.22058017 19.22506252 14.39123608
23.66679924 18.0984158 15.13635741 14.06169534 25.50485539 21.30470429
...
...
24.26806053 10.95348313 19.03384963 25.13764684 16.56651357 18.62142404
35.02739838 11.8489582 17.36250313 26.87388481 21.2282162 23.02356501]
> Shapiro-Wilk test
W = 0.98509, p-value = 0.1058
> Anderson-Darling test
A = 0.36927, p-value = 0.4229
R で検証
同じ CSV ファイルを読み込んで、検定の結果が同じになることを確認しました。
以下に実行例を示しました。
> library(nortest)
>
> # sample dataset
> name.file <- "data_norm.csv"
> data <- read.csv(name.file)$x
> print(data)
[1] 16.909679 11.313943 23.997997 23.220580 19.225063
[6] 14.391236 23.666799 18.098416 15.136357 14.061695
[11] 25.504855 21.304704 24.104321 18.417510 24.777343
...
...
[141] 19.033850 25.137647 16.566514 18.621424 35.027398
[146] 11.848958 17.362503 26.873885 21.228216 23.023565
>
> # Shapiro-Wilk test
> result.shapiro <- shapiro.test(data)
> print(result.shapiro)
Shapiro-Wilk normality test
data: data
W = 0.98509, p-value = 0.1058
>
> # Anderson-Darling test
> result.anderson <- ad.test(data)
> print(result.anderson)
Anderson-Darling normality test
data: data
A = 0.36927, p-value = 0.4229
>
こうやって Python/SciPy と R のスクリプトを比べてみると、R の方はずいぶんシンプルに記述できるものだと感心しますが、単に自分の Python のコーデイングが未熟なだけかもしれません。😅
次こそは GUI を利用して、Q-Q プロットやヒストグラムと一緒にしたサンプルを作成したいと考えています。
参考サイト
- bitWalk's: 正規性の検定 (SciPy) [2021-04-21]
- bitWalk's: 正規性の検定 (R) [2021-04-22]
- Anderson-Darling Test for Normality | BPI Consulting [June 2011]

にほんブログ村