記述統計と正規性検定
scipy.statsで歪度と尖度を計算し、Shapiro-Wilk検定で正規性を検定して、p値を解釈します。
「記述統計と正規性検定」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
記述統計と推測統計
記述統計は、データに含まれる内容を要約します。平均、中央値、標準偏差、歪度などが該当します。推測統計は、標本に基づいて母集団についての主張を行います。仮説検定、信頼区間、p値などが該当します。SciPyのscipy.statsモジュールはこの2つの領域をつなぎます。Pandasのdescribe()を超える記述統計量と、古典的な仮説検定の一式を提供します。データ操作にPandas、統計的検定にSciPyを組み合わせる方法は、Pythonデータサイエンスで標準的なワークフローです。
拡張された記述統計
Pandasのdescribe()は、件数、平均、標準偏差、最小値・最大値、四分位数を提供します。scipy.statsでは、さらに歪度(分布の非対称性)と尖度(裾の重さ)を求められます。歪度が0なら対称です。正の歪度は、右側の裾が長いことを意味します(小さい値が多く、非常に大きい値が少ない状態です)。尖度が3(超過尖度では0)なら正規分布です。値が大きいほど裾が重く、正規分布の場合よりも極端な外れ値が多いことを示します。
import pandas as pd
from scipy import stats
import numpy as np
np.random.seed(0)
data = np.concatenate([
np.random.exponential(scale=2, size=500), # right-skewed
np.random.normal(loc=5, scale=1, size=500)
])
print('Mean:', round(data.mean(), 3))
print('Std:', round(data.std(), 3))
print('Skewness:', round(stats.skew(data), 3))
print('Kurtosis (excess):', round(stats.kurtosis(data), 3))歪度を理解する
歪度は、統計的検定や変換方法を選ぶ際に重要です。右に歪んだ(正の歪度を持つ)分布では、平均が中央値より大きくなります。所得データ、反応時間、売上金額などが典型例です。左に歪んだ(負の歪度を持つ)分布では、平均が中央値より小さくなります。経験則として、|skewness| < 0.5ならほぼ対称、0.5~1.0なら中程度の歪み、> 1.0なら大きく歪んでいると考えられます。正規性を仮定する検定を適用する前に、対数変換や平方根変換が有効な場合があります。
import numpy as np
from scipy import stats
# Right-skewed: income-like data
right_skewed = np.random.lognormal(mean=1, sigma=1, size=1000)
print('Right skew:', round(stats.skew(right_skewed), 3))
# After log transform
print('After log transform:', round(stats.skew(np.log(right_skewed)), 3))
# Symmetric normal
normal_data = np.random.normal(0, 1, 1000)
print('Normal skew:', round(stats.skew(normal_data), 3))正規性の検定が重要な理由
t検定、ANOVA、ピアソン相関など、多くの統計的検定では、データ(または残差)が正規分布(ガウス分布)に従うことを仮定します。小標本でこの仮定が満たされない場合、検定のp値が不正確になる可能性があります。正規性の検定では、この仮定が成り立つかを確認します。大標本(n > 100)では、正規性の検定は非常に敏感になり、わずかな偏差でもほぼ必ず正規性を棄却します。その場合は、生データを検定するのではなく、中心極限定理(標本平均はおおむね正規分布に従う)を頼りにしてください。
Shapiro-Wilk検定
Shapiro-Wilk検定(scipy.stats.shapiro(data))は、約5,000件までの標本に対して最も検出力の高い正規性検定です。W統計量とp値を返します。p > 0.05なら正規性を棄却できず、データは正規分布と矛盾しないと判断します。p ≤ 0.05なら正規性を棄却します。ただし、正規性を棄却できないことは、データが正規分布である証明ではありません。正規分布でないと判断する十分な証拠がないという意味に過ぎません。
import numpy as np
from scipy import stats
np.random.seed(42)
# Normal data
normal = np.random.normal(0, 1, 100)
stat, p = stats.shapiro(normal)
print(f'Normal data: W={stat:.4f}, p={p:.4f}')
print('Conclusion:', 'Looks normal' if p > 0.05 else 'Not normal')
# Skewed data
skewed = np.random.exponential(1, 100)
stat2, p2 = stats.shapiro(skewed)
print(f'Skewed data: W={stat2:.4f}, p={p2:.4f}')
print('Conclusion:', 'Looks normal' if p2 > 0.05 else 'Not normal')Kolmogorov-Smirnov検定
Kolmogorov-Smirnov(K-S)検定(scipy.stats.kstest(data, 'norm', args))は、標本が指定した分布に従うかを検定します。Shapiro-Wilk検定とは異なり、正規分布に限らず任意の分布に使用でき、大標本にも対応します。データの経験累積分布関数(CDF)と理論累積分布関数の差の最大値を計算します。2標本K-S検定(stats.ks_2samp(a, b))という派生形では、2つの標本が同じ分布に由来するかを検定できます。処理前後の分布の比較などに便利です。
import numpy as np
from scipy import stats
np.random.seed(0)
data = np.random.normal(loc=5, scale=2, size=200)
# One-sample K-S test against N(5, 2) distribution
stat, p = stats.kstest(data, 'norm', args=(5, 2))
print(f'K-S test: stat={stat:.4f}, p={p:.4f}')
print('Follows N(5,2)?', 'Yes' if p > 0.05 else 'No')
# Two-sample K-S test
data2 = np.random.normal(loc=5.5, scale=2, size=200)
stat2, p2 = stats.ks_2samp(data, data2)
print(f'Two-sample K-S: stat={stat2:.4f}, p={p2:.4f}')正規性の視覚的な確認:QQプロット
Q-Q(分位点-分位点)プロットは、正規性を視覚的に確認する方法です。データの分位点を正規分布の分位点に対してプロットします。データが正規分布なら、点は右上がりの直線上に並びます。直線からのずれは正規性からの逸脱を示します。S字曲線は尖度、曲がりは歪度を示します。統計的検定はずれが有意かどうかを示し、Q-Qプロットはずれの性質と位置を示します。scipy.stats.probplot()を使うと、Q-Qプロット用のデータを生成できます。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(1)
data = np.random.exponential(2, 200)
# Q-Q plot
(osm, osr), (slope, intercept, r) = stats.probplot(data, dist='norm')
print(f'R-squared of Q-Q fit: {r**2:.4f}') # Close to 1 = normal
# Visual inspection: if plotting, points on the line = normal
# plt.figure()
# stats.probplot(data, dist='norm', plot=plt)
# plt.show()実践で学ぶ中心極限定理
中心極限定理(CLT)は、母集団の分布に関係なく、標本サイズが大きくなるにつれて標本の平均の分布が正規分布に近づくことを示します。n ≥ 30なら、個々の観測値が歪んでいても標本平均はおおむね正規分布に従います。これが、大標本に対してt検定が頑健である理由です。検定しているのは平均の差であり、生データが正規分布でなくても平均はおおむね正規分布に従うためです。非正規母集団から取得した小標本には、ノンパラメトリック検定を使用してください。
import numpy as np
from scipy import stats
np.random.seed(0)
# Population: heavily right-skewed (exponential)
population = np.random.exponential(scale=1, size=10000)
print('Population skewness:', round(stats.skew(population), 3))
# Sample means are approximately normal (CLT)
sample_means = [np.random.choice(population, 50).mean()
for _ in range(1000)]
print('Sample means skewness:', round(stats.skew(sample_means), 3))
_, p = stats.shapiro(sample_means)
print('Shapiro p-value for means:', round(p, 4))グループ別の正規性
グループ比較検定(t検定、ANOVA)では、全体のデータではなく、各グループ内で正規性が必要です。地域によって売上が異なるかを検定する場合は、地域ごとに売上の正規性を個別に検定します。全体では正規分布でないデータでも、サブグループ内では正規性を満たす場合があります。Pandasのgroupby()を使ってグループごとに反復処理し、各グループにstats.shapiro()を適用して、仮定を体系的に確認してください。
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'region': ['N']*50 + ['S']*50 + ['E']*50,
'sales': np.concatenate([
np.random.normal(100, 20, 50),
np.random.normal(110, 25, 50),
np.random.normal(95, 15, 50)
])
})
for region, group in df.groupby('region'):
stat, p = stats.shapiro(group['sales'])
print(f'Region {region}: W={stat:.4f}, p={p:.4f} -> '
f'{"Normal" if p>0.05 else "Not normal"}')ノンパラメトリックな代替手法
正規性が満たされない場合は、分布に関する仮定を置かないノンパラメトリック検定を使用します。Mann-WhitneyのU検定(stats.mannwhitneyu)は独立t検定の代わりに、Wilcoxonの符号付順位検定(stats.wilcoxon)は対応のあるt検定の代わりに、Kruskal-Wallis検定(stats.kruskal)は一元配置ANOVAの代わりに使用します。これらの検定は生の値ではなく順位を使うため外れ値に対して頑健ですが、正規性が実際に成り立つ場合は、対応するパラメトリック検定より検出力が低くなります。
import numpy as np
from scipy import stats
np.random.seed(0)
# Non-normal data
group_a = np.random.exponential(2, 40)
group_b = np.random.exponential(2.5, 40)
# Parametric would be wrong here; use non-parametric
stat, p = stats.mannwhitneyu(group_a, group_b, alternative='two-sided')
print(f'Mann-Whitney U test: U={stat:.1f}, p={p:.4f}')
print('Groups differ?' , 'Yes' if p < 0.05 else 'No')複数列の統計量を要約する
EDAでは、すべての数値列について正規性と歪度を一度に確認することがよくあります。Pandasのselect_dtypesと、各列に対してstats.shapiro()およびstats.skew()を呼び出すループを組み合わせます。歪度、尖度、Shapiroのp値を列に持つ要約DataFrameを作成すると、どの列が非正規で、モデル化の前に変換を必要としているかを一覧できます。これは体系的なデータ品質チェックリストの一部です。
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'age': np.random.normal(35, 10, 200),
'income': np.random.lognormal(10, 1, 200),
'score': np.random.uniform(0, 100, 200)
})
rows = []
for col in df.select_dtypes(include='number').columns:
s = stats.skew(df[col])
_, p = stats.shapiro(df[col][:200])
rows.append({'column': col, 'skewness': round(s, 3),
'shapiro_p': round(p, 4), 'normal': p > 0.05})
print(pd.DataFrame(rows).to_string(index=False))クイックチェック
このレッスンで学んだデータ分析の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、scipy.stats.skew()とkurtosis()によって、describe()で得られる情報を超えて分布の形状を説明できること、scipy.stats.shapiro()によって正規性を検定でき、p > 0.05は正規性に反する証拠がないことを意味すること、そして中心極限定理により、データが非正規でも大標本ではt検定が頑健になることを学びました。次はt検定を使った仮説検定で、グループの平均を比較します。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「記述統計と正規性検定」レッスンは無料ですか?
はい。「記述統計と正規性検定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「記述統計と正規性検定」で何を学びますか?
scipy.statsで歪度と尖度を計算し、Shapiro-Wilk検定で正規性を検定して、p値を解釈します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「記述統計と正規性検定」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 記述統計と正規性検定
- 平均値を比較するt検定
- 独立性のカイ二乗検定
- ANOVAと事後検定