t検定で2群の平均を比べたい。分散分析(ANOVA)で複数群を比較したい。回帰分析の結果を信頼したい——こうした「定番の統計手法」の多くが、裏でこっそり「データ(または誤差)が正規分布に従う」という仮定に寄りかかっています。この仮定が大きく崩れていると、計算したp値も信頼区間も意味を失いかねません。だからこそ、本格的な解析に入る前に「このデータは正規分布とみなしてよいのか?」を確認する作業が欠かせません。
ところが、この確認作業には2つの流派があります。ひとつは QQプロット(quantile-quantile plot, 分位点-分位点プロット) による視覚的な判定。もうひとつは Shapiro-Wilk 検定や Kolmogorov-Smirnov 検定といった正規性検定による数値的な判定です。多くの初学者は「検定の方が客観的で偉い」と思いがちですが、実はここに大きな落とし穴があります。正規性検定は大標本で過敏になりすぎるという致命的な性質を持っていて、現場の統計家の多くは「まずQQプロットを見よ」という原則を共有しています。
この話題は応用範囲がとても広いです。たとえば、医療データで投薬前後の効果を t 検定で比べるとき、その前提として測定値の正規性を確認します。あるいは、機械学習の線形回帰モデルを評価するとき、残差が正規分布からどれくらいズレているかをQQプロットで診断します。本記事を読めば、これらの場面で「どの道具を、どう読み、どこで信用してはいけないか」を自分で判断できるようになります。
本記事の内容
- QQプロットの原理(分位点を突き合わせる仕組み)と、歪み・裾の重さがどう曲がりに現れるかの読み方
- Shapiro-Wilk 検定の統計量 $W$ が「QQプロットの直線当てはまり」を測っていること
- Kolmogorov-Smirnov 検定(経験累積分布と理論CDFの最大差)、Anderson-Darling、Jarque-Bera の理論と使い分け
- 「大標本で過敏」という正規性検定最大の落とし穴と、その数値的な実証
- 正規性が崩れたときの対処(対数変換・Box-Cox・ノンパラメトリック手法)
- Python での実装と、t検定・ANOVA・回帰残差診断への応用
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
なぜ正規性を確認するのか
「正規性を確認する」と言われても、なぜそんなことが必要なのかピンとこないかもしれません。具体例で考えてみましょう。あなたが新薬の効果を調べるために、投薬群と対照群の血圧の平均を t 検定で比べたいとします。t 検定は「各群のデータが正規分布に従う」ことを前提に、t 統計量が t 分布に従うと仮定してp値を計算します。もしデータが正規分布から大きく外れていると、t 統計量は本当は t 分布に従わないので、「p = 0.03 だから有意」という結論そのものが砂上の楼閣になりかねません。
正規性の仮定が顔を出す主な場面は次の通りです。
- t 検定・分散分析(ANOVA): 各群のデータ(厳密には標本平均の分布)の正規性を仮定する。
- 回帰分析: 誤差項(残差)が平均0の正規分布に従うことを仮定する。係数のp値や信頼区間はこれに依存する。
- 管理図・工程能力指数: 品質管理で測定値が正規分布に従うと仮定して不良率を見積もる。
ここで救いになるのが 中心極限定理 です。標本サイズが十分大きければ、元のデータが多少正規からズレていても標本平均は正規分布に近づきます。つまり「大標本では正規性のズレに寛容になれる」のです。逆に小標本(数十個以下)では、データそのものの正規性が結果を大きく左右します。この「小標本ほど正規性チェックが重要」という事実は、後で見る検定の使い分けの伏線になります。
では、データが正規分布に従うかどうかを、どうやって確かめればよいのでしょうか。最も直感的で、しかも最も信頼できる方法が QQプロットです。次のセクションでその仕組みを解きほぐしていきます。
QQプロットの原理
分位点という発想
QQプロットを理解する鍵は 分位点(quantile) です。分位点とは「下から何パーセントの位置にある値か」を表す数です。たとえば中央値は50パーセント点(0.5分位点)、第1四分位数は25パーセント点(0.25分位点)です。
QQプロットの発想はシンプルです。「2つの分布が同じ形なら、対応する分位点どうしは比例関係(直線)に乗るはずだ」というものです。データの分位点(実際に観測された値を小さい順に並べたもの)と、正規分布の理論上の分位点をペアにして散布図に描く。もしデータが正規分布なら、点は一直線に並びます。曲がっていれば、その曲がり方が「どう正規からズレているか」を教えてくれます。

この図は、QQプロットがどう作られるかを2段階で示しています。左側で、正規分布の理論分位点(緑)とデータの分位点(青)を、同じ累積確率 $p$ をもつ点どうしで対応づけます。右側で、その対応するペア(横軸=理論分位点、縦軸=データ分位点)を散布図に打ちます。点が基準線 $y=x$ に近ければ「データの分布の形が正規と一致している」という意味になります。この例ではデータが基準線から上に膨らんでおり、何らかのズレがあることが見て取れます。
数式で定式化する
QQプロットを正確に作るために、まず分位点を数式で定義します。$n$ 個のデータを小さい順に並べたものを 順序統計量 と呼び、$x_{(1)} \le x_{(2)} \le \dots \le x_{(n)}$ と書きます。$i$ 番目の順序統計量 $x_{(i)}$ には、おおよそ次の累積確率を割り当てます。
$$ p_i = \frac{i – 0.5}{n} $$
ここで $0.5$ を引くのは「連続な分布の分位点をデータ点の中央に対応づける」ための補正で、プロッティングポジションと呼ばれます($\frac{i-0.375}{n+0.25}$ など他の流儀もありますが、本質は同じです)。この累積確率に対応する標準正規分布の理論分位点は、標準正規の累積分布関数 $\Phi$ の逆関数を使って
$$ z_{(i)} = \Phi^{-1}(p_i) $$
と書けます。$\Phi^{-1}$ は「累積確率 $p_i$ を与えると、その下側確率を持つ標準正規の値(z値)を返す」関数です。QQプロットは、このペア $(z_{(i)},\ x_{(i)})$ を $i = 1, \dots, n$ について散布図に打つものです。
データが平均 $\mu$、標準偏差 $\sigma$ の正規分布に従うなら、$x_{(i)} \approx \mu + \sigma z_{(i)}$ が成り立つはずです。これは傾き $\sigma$、切片 $\mu$ の直線です。つまり「点が直線に乗るか」を見れば正規性が判定でき、しかもその直線の傾きと切片から $\sigma$ と $\mu$ まで読み取れるのです。
正規データなら直線に乗る
まず正解の姿を見ておきましょう。本当に正規分布から生成したデータのQQプロットがどうなるかです。

左のヒストグラムは見慣れた釣鐘型で、右のQQプロットでは点がほぼ完全に基準線(赤)に乗っています。両端で多少ばらつくのは標本のランダムさによるもので、これくらいの揺らぎは正規データでも普通に起こります。「点が直線に乗っていれば正規分布とみなしてよい」——これがQQプロットを読む際の基準となる「正常な姿」です。これを目に焼き付けておくと、次に見るズレのパターンとの対比がよくわかります。
データが正規からズレると、QQプロットはどう曲がるのでしょうか。代表的な2つのパターン——「歪み」と「裾の重さ」——を順番に見ていきます。
QQプロットの読み方 — 曲がりが語ること
歪んだデータ
まず、片側に裾が長い歪んだ分布の場合です。例として、右に裾が長い指数分布のデータを見てみましょう。

左のヒストグラムは右に長い裾を引いています。右のQQプロットでは、点が直線ではなく上に凸(下に湾曲)した曲線を描いています。この曲がり方には明確な意味があります。右の裾が長い(大きな値が正規よりもっと大きい)ため、右上のデータ分位点が基準線より上に跳ね、左下では基準線に張り付くように下がります。覚え方として、QQプロットが下向きに湾曲していたら右に歪んでいる(右裾が長い)、上向きに湾曲していたら左に歪んでいると整理できます。所得や反応時間、待ち時間のように「下限はあるが上に長く伸びる」データでよく見るパターンです。
裾の重いデータ
次に、歪みはないが裾が重い(外れ値が出やすい)分布です。自由度の小さい t 分布が典型例です。

左のヒストグラムは正規分布(赤)よりも中央が尖り、裾が広く広がっています。右のQQプロットでは、中央付近は直線に乗るのに両端が基準線から外側へ跳ね上がる「S字」を描いています。これは「正規分布が予想するより、極端に大きい値も極端に小さい値も出やすい」ことの現れです。下側(左下)の点は基準線より下に、上側(右上)の点は基準線より上に外れます。金融のリターンデータや、まれに巨大な値を取る測定値でよく見られます。逆に裾が軽い(一様分布のように、極端な値がほとんど出ない)場合は、両端が基準線の内側に折れ込むS字(上下が逆向き)になります。
QQプロットは曲がりのパターンから「どんなズレか」まで教えてくれる優れた道具です。しかし「曲がっているかどうか」の判断は主観的で、人によって意見が割れることもあります。そこで、ズレの大きさを数値で定量化したくなります。最初に紹介するのは、QQプロットそのものを数式化したような検定——Shapiro-Wilk 検定です。
Shapiro-Wilk 検定
直感: 直線当てはまりの良さを測る
Shapiro-Wilk 検定の発想は、実はQQプロットそのものです。「QQプロットの点がどれだけきれいに直線に乗っているか」を1つの数で表したい——それが統計量 $W$ です。直感的には、$W$ は順序統計量と、その正規分布における期待値との相関の二乗に近いものです。点が完全に直線なら相関は1、ズレるほど1から下がります。

この図は、横軸に「順序統計量の理論期待値 $m_{(i)}$」、縦軸に「標準化したデータ分位点」を取った散布図です。左の正規データは点線(最小二乗直線)にぴったり乗り、$W \approx 0.990$ と1に近い値になります。右の歪んだデータは直線から系統的に外れ、$W \approx 0.909$ と小さくなります。$W$ が1に近いほど正規に近く、小さいほど正規から遠い——これがShapiro-Wilk検定の核心です。QQプロットの「直線らしさ」を1つの数に凝縮したものだと考えれば理解しやすいでしょう。
統計量の定義
正確な定義を述べます。順序統計量を $x_{(1)} \le \dots \le x_{(n)}$、標本平均を $\bar{x}$ とすると、$W$ は次で定義されます。
$$ W = \frac{\left( \sum_{i=1}^{n} a_i\, x_{(i)} \right)^2}{\sum_{i=1}^{n} (x_{(i)} – \bar{x})^2} $$
分母は単なる偏差平方和(標本分散の $n-1$ 倍)です。分子は、順序統計量に重み $a_i$ を掛けた線形結合の二乗です。この重みベクトル $\bm{a} = (a_1, \dots, a_n)$ が肝心で、正規分布の順序統計量の期待値ベクトル $\bm{m}$ と、その共分散行列 $\bm{V}$ を使って
$$ \bm{a} = \frac{\bm{m}^\top \bm{V}^{-1}}{\sqrt{\bm{m}^\top \bm{V}^{-1} \bm{V}^{-1} \bm{m}}} $$
と定められます。複雑に見えますが、ねらいはシンプルで「正規分布なら順序統計量がこう並ぶはず」という理想の重みを最適に設計しているのです。重みの設計に正規分布の構造を直接組み込んでいるため、$W$ は正規性に対して非常に敏感になります。
検定の運用と特徴
帰無仮説は「データは正規分布に従う」です。$W$ が1より十分小さければ帰無仮説を棄却します(=正規ではないと判断)。$W$ の分布は複雑なので、実用上はソフトウェアが計算するp値を使います。p値が有意水準(例: 0.05)を下回れば「正規性が棄却された」と読みます。
Shapiro-Wilk 検定の最大の強みは、小〜中標本(おおむね $n \le 50$、または数千以下)での検出力の高さです。少ないデータからでも非正規性を鋭く見抜きます。後で各検定の検出力を比較しますが、Shapiro-Wilk は多くの場面で最も強力な選択肢になります。歴史的には1965年に Shapiro と Wilk が提案し、現在でも「迷ったらまずこれ」という定番です。
Shapiro-Wilk が「順序統計量と理論期待値の当てはまり」に注目したのに対し、まったく別の角度——「累積分布関数のズレ」に注目する検定もあります。それが Kolmogorov-Smirnov 検定です。
Kolmogorov-Smirnov 検定
直感: 累積分布の最大ギャップ
Kolmogorov-Smirnov 検定(KS検定)の発想は「データから作った階段状の累積分布と、理論上の滑らかな累積分布を重ねて、両者が最も離れている場所の差を測る」というものです。2つの曲線がぴたりと重なれば差は0、大きくズレていれば差も大きくなります。

この図では、滑らかな緑の曲線が理論CDF(正規分布の累積分布関数)、オレンジの階段が経験累積分布関数(経験CDF)です。経験CDFは「その値以下のデータが全体の何割か」をデータ点ごとに階段状に積み上げたものです。赤い縦棒が、2つの曲線の差が最大になる場所を示しており、その縦の長さが KS統計量 $D$(この例では $D \approx 0.306$)です。$D$ が大きいほど、データの分布が理論分布から離れていることを意味します。
統計量の定義
経験累積分布関数を $F_n(x)$、帰無仮説で仮定する理論累積分布関数を $F_0(x)$ とします。経験CDFは
$$ F_n(x) = \frac{1}{n}\sum_{i=1}^{n} \mathbb{1}(x_i \le x) $$
で定義されます。ここで $\mathbb{1}(\cdot)$ は条件が真なら1、偽なら0を返す指示関数です。つまり「$x$ 以下のデータの割合」です。KS統計量はこの2つの差の上限(最大値)として定義されます。
$$ D = \sup_{x} \, \bigl| F_n(x) – F_0(x) \bigr| $$
$\sup$ は上限(実質的に最大値)を表します。$D$ が大きいほど経験分布と理論分布がズレていることになります。$\sqrt{n}\, D$ は帰無仮説のもとで Kolmogorov 分布に従い、これを使ってp値を計算します。
重要な注意点 — パラメータ推定の罠
KS検定には見落とされがちな重大な落とし穴があります。本来のKS検定は理論分布のパラメータ(正規分布なら $\mu, \sigma$)が事前に分かっていることを前提にしています。ところが実務では、平均も分散もデータから推定するのが普通です。推定したパラメータをそのまま使ってKS検定を行うと、検定が保守的になりすぎて(p値が大きく出すぎて)、非正規性を見逃しやすくなります。
この問題を補正したのが Lilliefors 検定で、「平均・分散を推定する場合のKS検定」として知られています。Pythonの statsmodels には lilliefors 関数があります。「正規分布かどうか」を平均・分散推定込みで調べたいなら、素のKS検定ではなく Lilliefors を使うか、後述のShapiro-Wilkやアンダーソン・ダーリングを選ぶのが安全です。
KS検定は「分布全体のズレ」を見る一方で、裾の部分の検出力が弱いという弱点も持っています。これを克服したのが次に見る Anderson-Darling 検定です。
Anderson-Darling 検定と Jarque-Bera 検定
Anderson-Darling 検定 — 裾を重視する
Anderson-Darling 検定(AD検定)は KS検定の改良版で、分布の裾(端の部分)のズレを重く評価するように設計されています。KS検定が「最大の差」だけを見るのに対し、AD検定は全域の差を積分し、しかも裾では重みを大きくします。統計量 $A^2$ は次で定義されます。
$$ A^2 = -n – \frac{1}{n}\sum_{i=1}^{n} (2i – 1)\Bigl[ \ln F_0(x_{(i)}) + \ln\bigl(1 – F_0(x_{(n+1-i)})\bigr) \Bigr] $$
複雑な式ですが、ポイントは $\ln F_0$ と $\ln(1 – F_0)$ という対数項です。$F_0$ が0や1に近づく裾の領域では対数が大きな絶対値を取り、そこのズレが統計量に強く効きます。正規性の検定では、裾の挙動(外れ値の出やすさ)が重要なことが多いため、AD検定は実用的に優れた選択肢とされます。AD検定は統計量を臨界値(critical value)と比較して判定する形が一般的で、統計量が臨界値を超えれば正規性を棄却します。
Jarque-Bera 検定 — 歪度と尖度で見る
Jarque-Bera 検定(JB検定)は、まったく別のアプローチを取ります。正規分布は 歪度(skewness)= 0、尖度(kurtosis)= 3という明確な特徴を持ちます。歪度は分布の左右非対称性、尖度は裾の重さ(尖り具合)を測る指標です。JB検定は「データの歪度と尖度が、正規分布の理論値からどれくらいズレているか」を一つの統計量にまとめます。
$$ \mathrm{JB} = \frac{n}{6}\left( S^2 + \frac{(K – 3)^2}{4} \right) $$
ここで $S$ は標本歪度、$K$ は標本尖度です。$S = 0$(左右対称)かつ $K = 3$(正規の尖度)なら $\mathrm{JB} = 0$ になり、ズレが大きいほど $\mathrm{JB}$ が増えます。帰無仮説(正規)のもとで、$\mathrm{JB}$ は自由度2の カイ二乗分布に近似的に従います(自由度2は、歪度と尖度の2つの自由度に対応します)。詳しくはカイ二乗分布の記事を参照してください。
JB検定は計算が単純で、特に大標本での近似が良いため、計量経済学などでよく使われます。ただし歪度と尖度しか見ないので、それ以外の形でのズレ(多峰性など)は検出できません。各検定には得意・不得意があるのです。
どの検定を選ぶか
ここまで4つの検定を見てきました。実際にどれがどれくらい「非正規性を見抜く力(検出力)」を持つのか、シミュレーションで比べてみましょう。

この図は、右に歪んだ指数分布のデータを各検定にかけ、「正規ではない」と正しく棄却できた割合(=検出力)をサンプルサイズ別にプロットしたものです。Shapiro-Wilk と Anderson-Darling が最も強力で、小さなサンプルサイズから高い検出力を示します。Jarque-Bera はやや遅れて立ち上がり、素のKS検定(パラメータ推定込み)は明らかに最も弱いことが読み取れます。これがまさに前節で警告した「KS検定はパラメータ推定すると保守的になりすぎる」現象です。実務上の優先順位としては、小〜中標本ならShapiro-WilkまたはAnderson-Darlingが第一選択、KS検定を使うならLilliefors補正を併用する、と覚えておけば間違いありません。
ところが、ここまで「検出力が高いほど良い」かのように話してきましたが、実は検出力が高すぎることが裏目に出る重大な落とし穴があります。次のセクションでそれを暴きます。
検定の落とし穴 — 大標本での過敏性
「有意」と「重要」は違う
正規性検定の最大の罠は、サンプルサイズが大きいと、実用上は無視できるほどわずかなズレでも「正規ではない」と棄却してしまうことです。これは正規性検定に限らず、すべての仮説検定に共通する性質ですが、正規性検定では特に深刻です。
なぜこうなるのでしょうか。検定の統計量は、ズレの大きさだけでなくサンプルサイズ $n$ に比例して大きくなるように作られています。たとえば Jarque-Bera 統計量の式 $\mathrm{JB} = \frac{n}{6}(S^2 + (K-3)^2/4)$ を見てください。歪度 $S$ や尖度のズレ $K-3$ がどんなに小さくても、$n$ を大きくすれば $\mathrm{JB}$ はいくらでも大きくなります。現実のデータが完璧な正規分布であることはまずないので、$n$ を増やせば「ごくわずかなズレ」が必ず統計的に有意になってしまうのです。

この図は、ヒストグラム上では正規分布とほぼ見分けがつかない、ごくわずかに歪んだデータに対して、サンプルサイズを変えながらp値の中央値をプロットしたものです(縦軸・横軸とも対数)。$n$ が数十のときはp値が有意水準 $\alpha = 0.05$ を上回り「正規とみなしてよい」と判断されますが、$n$ が100を超えるあたりからp値が急落し、$n = 1000$ 以上ではp値が事実上0になります。つまり、まったく同じ「わずかな歪み」のデータでも、サンプルが多いだけで「正規ではない」と棄却されてしまうのです。
教訓: まずQQプロットを見よ
この事実から、実務における重要な原則が導かれます。
正規性検定のp値だけで判断してはいけない。まずQQプロットを見て、ズレが実用上問題になる規模かどうかを目で確かめよ。
大標本でp値が小さく出ても、QQプロットで点がほぼ直線に乗っていれば、そのズレは実害がないことが多いのです。逆に小標本では検定の検出力が足りず、本当は非正規でも見逃すことがあります。だからこそ「視覚(QQプロット)と数値(検定)の両輪で判断する」のが現場のベストプラクティスです。先ほどの併用例を改めて見ておきましょう。

この図は、4種類のデータについてヒストグラム(上段)とQQプロット(下段)を並べた診断パネルです。左から「正規」「右に歪み」「裾が重い」「一様(裾が軽い)」です。ヒストグラムだけでは微妙な違いも、QQプロットを併せて見れば一目瞭然です。右歪みは下向きの湾曲、裾の重さは両端の跳ね上がるS字、一様分布は両端が内側に折れるS字、とズレの種類がプロットの形に直結しているのがよくわかります。各QQプロットに添えたShapiro-Wilkのp値も参考になりますが、形を見る方が「どうズレているか」まで分かる分、情報量が多いのです。
では、もしQQプロットや検定で「正規ではない」と判断されたら、どうすればよいのでしょうか。次のセクションで対処法を見ていきます。
正規性が崩れたら — 変換とノンパラメトリック
正規性が成り立たないとき、選択肢は大きく3つあります。
1. データを変換する
歪んだデータは、適切な変換で正規に近づけられることがあります。最も手軽なのが対数変換 $y = \ln x$ です。右に裾が長い(正の歪み)データを正規に近づける効果があり、所得・面積・濃度など「正の値で右に伸びる」データに有効です。
より体系的な手法が Box-Cox 変換です。べき乗パラメータ $\lambda$ を導入し、
$$ y^{(\lambda)} = \begin{cases} \dfrac{x^{\lambda} – 1}{\lambda} & (\lambda \neq 0) \\[2mm] \ln x & (\lambda = 0) \end{cases} $$
という形でデータを変換します。$\lambda = 1$ なら(ほぼ)無変換、$\lambda = 0$ なら対数変換、$\lambda = 0.5$ なら平方根変換に対応し、データに最も合う $\lambda$ を最尤法で自動的に選べます。負の値を含むデータには Yeo-Johnson 変換という拡張版も使えます。変換後にもう一度QQプロットで正規性を確認するのが定石です。
2. ノンパラメトリック手法を使う
そもそも正規性を仮定しない手法に乗り換える、という割り切った選択肢もあります。これをノンパラメトリック検定と呼びます。
- t 検定の代わり → Mann-Whitney の U 検定(2群の比較)、Wilcoxon の符号順位検定(対応のある2群)
- 一元配置ANOVA の代わり → Kruskal-Wallis 検定
これらは「データの値」ではなく「順位」に基づくため、正規性も等分散性も仮定しません。外れ値にも頑健です。代償として、データが本当に正規なら検定の検出力がわずかに落ちますが、正規性が疑わしいときには安全な選択肢です。詳しくはノンパラメトリック検定の記事を参照してください。
3. 中心極限定理に頼る
最後に、標本サイズが十分大きければ気にしないという現実的な判断もあります。中心極限定理により、$n$ が大きければ標本平均は正規に近づくので、t 検定やANOVAは元データが多少非正規でも頑健に働きます(これを「漸近的に妥当」と言います)。実務では「$n \ge 30$ 程度あって、QQプロットで極端な外れがなければ、多少の非正規は許容する」という運用がよく行われます。
3つの対処法を押さえたところで、ここまでの理論をPythonで実際に動かして確かめましょう。
Pythonでの実装
QQプロットを描く
まず、numpy と scipy だけでQQプロットを自前で描き、正規・歪み・裾の重い3種類のデータを比較します。scipy.stats.probplot が便利ですが、原理を理解するため分位点の計算も併記します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
rng = np.random.default_rng(42)
n = 300
# 3種類のデータ
data_normal = rng.normal(0, 1, n) # 正規
data_skewed = rng.exponential(1.0, n) # 右に歪み
data_heavy = stats.t(df=3).rvs(n, random_state=rng) # 裾が重い
fig, axes = plt.subplots(1, 3, figsize=(15, 4.5))
for ax, data, title in zip(
axes, [data_normal, data_skewed, data_heavy],
["正規", "右に歪み", "裾が重い"]):
# probplot は (理論分位点, データ分位点) と回帰直線を返す
stats.probplot(data, dist="norm", plot=ax)
ax.set_title(f"QQプロット({title})")
ax.set_xlabel("理論分位点")
ax.set_ylabel("データ分位点")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このコードを実行すると、3つのQQプロットが並びます。「正規」は点が直線に乗り、「右に歪み」は下向きに湾曲、「裾が重い」は両端が跳ね上がるS字を描きます。前のセクションで図解した通り、ズレの種類がプロットの形に一対一で対応していることが、自分の手で生成したデータでも確認できます。probplot が返す回帰直線(赤)は、点が乗るべき理想の直線で、これからの外れ具合がそのまま非正規性の度合いになります。
4つの正規性検定を一度に実行する
次に、同じデータに4つの検定(Shapiro-Wilk・KS・Anderson-Darling・Jarque-Bera)をかけて、結果を比べます。
import numpy as np
from scipy import stats
def normality_report(data, name=""):
"""4つの正規性検定をまとめて実行し結果を表示"""
print(f"=== {name}(n={len(data)})===")
# Shapiro-Wilk
sw = stats.shapiro(data)
print(f"Shapiro-Wilk : W={sw.statistic:.4f}, p={sw.pvalue:.4g}")
# Kolmogorov-Smirnov(平均・分散を推定して標準化)
z = (data - data.mean()) / data.std(ddof=1)
ks = stats.kstest(z, "norm")
print(f"Kolmogorov-Smirnov: D={ks.statistic:.4f}, p={ks.pvalue:.4g}")
# Anderson-Darling(統計量を臨界値と比較)
ad = stats.anderson(data, dist="norm")
crit_5pct = ad.critical_values[2] # 5%水準の臨界値
verdict = "棄却" if ad.statistic > crit_5pct else "棄却せず"
print(f"Anderson-Darling: A^2={ad.statistic:.4f}, "
f"臨界値(5%)={crit_5pct:.4f} → {verdict}")
# Jarque-Bera
jb = stats.jarque_bera(data)
print(f"Jarque-Bera : JB={jb.statistic:.4f}, p={jb.pvalue:.4g}")
print()
rng = np.random.default_rng(42)
normality_report(rng.normal(0, 1, 300), "正規データ")
normality_report(rng.exponential(1.0, 300), "歪んだデータ")
実行すると、正規データではどの検定もp値が0.05を大きく上回り(AD検定は「棄却せず」)、「正規性を棄却できない」という結果になります。一方、歪んだ指数分布データでは、Shapiro-Wilk・Anderson-Darling・Jarque-Beraが軒並み小さなp値(あるいは臨界値超過)で正規性を棄却します。4つの検定が概ね一致して「歪んだデータは非正規」と判定する一方、検出の鋭さには差があり、Shapiro-WilkとAnderson-Darlingが特に小さいp値を返すことが確認できます。
大標本の過敏性を実証する
正規性検定最大の落とし穴——大標本での過敏性——を、自分の手で再現してみましょう。
import numpy as np
from scipy import stats
rng = np.random.default_rng(0)
# ヒストグラム上はほぼ正規に見える「わずかに歪んだ」データを作る
def slightly_skewed(n):
x = rng.normal(0, 1, n)
mask = rng.random(n) < 0.10 # 10%だけ
x[mask] = rng.gamma(2.0, 1.0, mask.sum()) # 右に歪んだ成分に置換
return x
print("わずかに歪んだデータの Jarque-Bera p値(中央値):")
for n in [30, 100, 300, 1000, 3000, 10000]:
pvals = [stats.jarque_bera(slightly_skewed(n)).pvalue
for _ in range(50)]
med = np.median(pvals)
verdict = "棄却(非正規)" if med < 0.05 else "正規とみなす"
print(f" n={n:>5} : p中央値={med:.2e} → {verdict}")
このコードを実行すると、まったく同じ「わずかな歪み」を持つデータが、サンプルサイズによって正反対の判定を受けることがわかります。$n = 30$ では「正規とみなす」(p値が大きい)のに、$n$ が100を超えるあたりから p値が急激に小さくなり、$n = 1000$ 以上ではp値が事実上0まで落ちて「棄却(非正規)」に変わります。これこそが「大標本では検定が過敏になる」現象の正体です。サンプルが多いだけで、実害のないズレが統計的に有意になる——この教訓を肝に銘じておけば、「p値が小さいから正規じゃない、解析を諦めよう」という早合点を避けられます。
Box-Cox 変換で正規に近づける
最後に、歪んだデータを Box-Cox 変換で正規に近づける処理を実装します。
import numpy as np
from scipy import stats
rng = np.random.default_rng(7)
# 右に強く歪んだデータ(対数正規分布)
data = rng.lognormal(mean=0.0, sigma=0.7, size=500)
# 変換前の正規性
sw_before = stats.shapiro(data)
print(f"変換前 Shapiro-Wilk: W={sw_before.statistic:.4f}, "
f"p={sw_before.pvalue:.3g}")
# Box-Cox 変換(最適なλを最尤推定)
transformed, lam = stats.boxcox(data)
sw_after = stats.shapiro(transformed)
print(f"推定された λ = {lam:.3f}")
print(f"変換後 Shapiro-Wilk: W={sw_after.statistic:.4f}, "
f"p={sw_after.pvalue:.3g}")
実行すると、変換前のShapiro-Wilk検定はp値がほぼ0で「明確に非正規」と判定されますが、Box-Cox変換後はp値が大きく上昇し「正規性を棄却できない」レベルまで改善します。推定された $\lambda$ は0に近い値(対数正規分布なので対数変換が最適)になるはずです。適切な変換によって、非正規データを正規が前提の手法に乗せられることが、数値で確認できました。歪んだデータに出会ったら、まずこうした変換を試すのが定石です。
実装で道具の使い方を押さえたところで、最後にこれらの正規性チェックが実際の解析でどう役立つか——回帰の残差診断という典型的な応用を見ておきましょう。
応用 — 回帰の残差診断
正規性チェックが最も活躍する現場のひとつが回帰分析の残差診断です。線形回帰では「誤差項が平均0の正規分布に従う」という仮定のもとで、係数のp値や信頼区間が計算されます。この仮定が崩れていないかを、残差(予測値と実測値の差)のQQプロットで確認するのが標準的な手続きです。

この図は、同じ回帰モデルに対して「正規誤差」(上段)と「歪んだ誤差」(下段)の2ケースを並べたものです。左列は残差プロット(予測値 vs 残差)、右列は残差のQQプロットです。正規誤差の場合、残差は0の周りに均一に散らばり、QQプロットは直線に乗ります(Shapiro-Wilkのp値も大きい)。歪んだ誤差の場合、残差プロットが非対称になり、QQプロットが湾曲します(p値が極端に小さい)。残差QQプロットが直線から外れていたら、回帰の前提が崩れているサインであり、変数変換や頑健回帰、一般化線形モデルへの切り替えを検討する合図になります。
この残差診断のコードは次の通りです。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
rng = np.random.default_rng(10)
n = 120
x = np.linspace(0, 10, n)
# 歪んだ誤差を持つデータで回帰
y = 2.0 * x + 1.0 + (rng.exponential(1.5, n) - 1.5)
# 最小二乗法で直線フィット
slope, intercept = np.polyfit(x, y, 1)
resid = y - (slope * x + intercept) # 残差
# 残差の正規性を検定
sw = stats.shapiro(resid)
print(f"残差の Shapiro-Wilk: W={sw.statistic:.4f}, p={sw.pvalue:.3g}")
# 残差のQQプロット
fig, ax = plt.subplots(figsize=(7, 5))
stats.probplot(resid, dist="norm", plot=ax)
ax.set_title("回帰残差のQQプロット")
ax.set_xlabel("理論分位点")
ax.set_ylabel("残差分位点")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このコードを実行すると、残差のShapiro-Wilk検定のp値が非常に小さく出て「残差は正規ではない」と判定されます。QQプロットでも点が直線から系統的に外れます。この場合、最小二乗法のp値や信頼区間をそのまま信用するのは危険です。対処としては、目的変数の変換(対数など)、頑健回帰、あるいは誤差分布を明示的に指定できる一般化線形モデルへの移行を検討します。回帰分析は「フィットして終わり」ではなく、残差診断までがワンセットなのです。
まとめ
本記事では、データが正規分布に従うかを判定するQQプロットと各種正規性検定について、原理から実装・応用まで解説しました。
- QQプロット: データの分位点 $x_{(i)}$ と正規分布の理論分位点 $z_{(i)} = \Phi^{-1}(p_i)$ をペアにして散布図に打つ。点が直線に乗れば正規、下向き湾曲は右歪み、両端の跳ね上がるS字は裾の重さを示す。
- Shapiro-Wilk 検定: 統計量 $W$ は「QQプロットの直線当てはまりの良さ」を測る。小〜中標本で最も強力で、迷ったらまずこれ。
- Kolmogorov-Smirnov 検定: 経験CDFと理論CDFの最大差 $D$ を見る。ただしパラメータを推定すると保守的になりすぎるため、正規性にはLilliefors補正やShapiro-Wilkが安全。
- Anderson-Darling・Jarque-Bera: AD検定は裾のズレを重視、JB検定は歪度と尖度のズレをカイ二乗分布で評価する。
- 大標本の落とし穴: 検定統計量はサンプルサイズ $n$ に比例して大きくなるため、$n$ が大きいと実用上無視できるズレでも棄却される。「まずQQプロットを見る」のが鉄則。
- 正規性が崩れたら: 対数変換やBox-Cox変換でデータを正規に近づける、Mann-Whitney等のノンパラメトリック手法に乗り換える、または中心極限定理に頼る。
- 応用: t検定・ANOVAの前提確認、そして回帰の残差QQプロットによる診断。
最も大切な教訓は、正規性検定のp値を機械的に信じるのではなく、QQプロットで「ズレの規模と種類」を目で確かめることです。視覚と数値の両輪で判断すれば、大標本の過敏性にも小標本の検出力不足にも惑わされません。
次のステップとして、以下の記事も参考にしてください。