学習コースLearn

統計分析

データから確かな結論を導くための、推測統計と仮説検定を基礎から手を動かして学ぶモジュールです。各ステップは「概要 → 仕組み(座学)→ コードで動かす」の3層で進みます。ページ内には手を動かせるデモを3つ用意しました。

この教材は日本語のみで提供していますThis learning material is available in Japanese only.

はじめにIntroduction

このモジュールの全体像

統計分析(statistical analysis)とは、データにひそむパターンや規則を数量的に読み取り、手元のデータを超えて「確かなことは何か」を導く技術です。効果があったのか、差は偶然ではないのか、全体ではどうなっているのか。こうした問いに、あいまいな印象ではなく、根拠をもって答えるための道具立てです。

統計分析は大きく2つに分かれます。手元のデータそのものを要約する記述統計と、標本(サンプル)から背後の母集団を推し量る推測統計です。このモジュールは推測統計と仮説検定を核にしながら、次の流れ(パイプライン)に沿って進みます。

統計分析の基本の流れ

データ Data 記述統計 Describe 分布と推測 Infer 仮説検定 Test 結論 Conclusion 平均・分散・可視化 確率分布・推定 p値・有意差

このモジュールは、上の流れを左から順にたどります。各ステップは次の3層で構成します。

  • 概要:その考え方が何のためにあるのか、あらましをつかむ。
  • 仕組み(座学):背後にある定義・式・解釈を、ていねいに理解する。
  • コードで動かす:Python の定番ライブラリや、ページ内デモで実際に計算して確かめる。

手を動かす題材には、ページ内の小さなサンプルや、実在の公開データセット(scikit-learn 内蔵の iris・diabetes、seaborn の tips など)を使います。特別な環境がなくても、読みながら試せる構成です。

1

統計分析とは

What is statistical analysis

概要Overview

統計分析は「データ」と「結論」の橋渡しをする分野です。集めた数値をながめるだけでは、それが偶然なのか意味のある傾向なのか判断できません。統計は、不確かさを数量として扱い、根拠のある主張へと変えるための枠組みを与えます。

統計分析には、目的の異なる2つの柱があります。

  • 記述統計(descriptive statistics):手元のデータそのものを要約し、その特徴を平均・ばらつき・図で描き出す。
  • 推測統計(inferential statistics):手元のデータ(標本)から、その背後にある全体(母集団)の性質を推し量る。このモジュールの中心です。

仕組みHow it works

母集団と標本

推測統計のかなめは、母集団と標本の区別です。母集団(population)は本当に知りたい対象全体(たとえば「ある製品の全ユーザー」)、標本(sample)はそこから実際に観測できた一部です。全体を調べつくすのは多くの場合むずかしいので、標本から母集団を推測します。標本から計算した量(標本平均など)を統計量、母集団の真の値(母平均など)を母数(パラメータ)と呼び、統計量を手がかりに母数を推し量ります。

統計分析と機械学習のちがい

データからモデルを作る点で、統計分析と機械学習は重なります。ただし主眼が異なります。機械学習は予測の精度を第一に置き、未知のデータをどれだけ当てられるかを重視します。いっぽう統計分析は説明と結論を重視します。「この要因は結果に効いているか」「差は偶然の範囲か」を、解釈できる形で、不確かさとともに述べることを目指します。同じ回帰式でも、機械学習は予測誤差を、統計分析は各係数が偶然でないか(有意か)を見る、という違いです。

この Step のまとめ

統計分析は記述統計と推測統計の2本柱。標本から母集団を推し量るのが推測統計です。機械学習が「予測」を狙うのに対し、統計分析は「説明と結論」を、不確かさとともに述べることを目指します。

2

データを要約する

Descriptive statistics

概要Overview

分析の第一歩は、データの姿を「代表値」と「ばらつき」でつかむことです。数百個の数字も、中心はどこか、どれくらい散らばっているか、極端な値はないか、を要約すれば全体像が見えてきます。これが記述統計です。

仕組みHow it works

中心を表す(代表値)

  • 平均(mean):すべての値の合計を個数で割ったもの。mean = Σx / n。もっとも一般的だが、極端な値(外れ値)に引っぱられやすい。
  • 中央値(median):値を小さい順に並べたときの真ん中の値。外れ値に強く、分布が偏っているときの中心として頼れる。
  • 最頻値(mode):もっとも多く現れる値。カテゴリデータの中心として使う。

ばらつきを表す

中心だけでは足りません。同じ平均でも、値が密集しているか広く散っているかで意味は大きく変わります。

s² = Σ(xi − x̄)² / (n − 1)  s = √s² 標本分散 s² と標本標準偏差 s。平均からの隔たりを2乗して平均する(n−1 で割るのは母分散の偏りのない推定にするため)。標準偏差はその平方根で、元の値と同じ単位になる。

位置を表す(四分位)

データを小さい順に並べ、四等分する位置の値を四分位数と呼びます。第1四分位(Q1、下から25%)、第2四分位(中央値)、第3四分位(Q3、下から75%)です。Q3 と Q1 の差を四分位範囲(IQR)と呼び、外れ値の影響を受けにくいばらつきの指標になります。これらを図にしたのが箱ひげ図で、中心・広がり・外れ値を一目で示します。

分布の形も大切です。左右対称の山なりか、片側に裾を引いているか(歪み)。平均と中央値が大きくずれていれば、分布が偏っているサインです。

デモ 1Demo 1

記述統計電卓

数値をカンマや空白、改行で区切って入力すると、平均・中央値・標準偏差・四分位数を計算し、下に簡易的な箱ひげ図を描きます。値を書き換えると、代表値やばらつきがどう動くかを確かめられます。四分位数は線形補間(NumPy と同じ既定の方法)で求めます。

例

コードで動かすRun the code

pandas の describe() は、これらの要約をまとめて出してくれます。NumPy を使えば一つずつ計算することもできます。

Pythondescribe.py
import numpy as np
import pandas as pd

scores = pd.Series([72, 85, 90, 68, 95,
                    78, 88, 76, 83, 91])
print(scores.describe())          # 件数・平均・標準偏差・四分位など

# NumPy で個別に(標準偏差は ddof=1 で標本標準偏差)
x = scores.to_numpy()
print(np.mean(x), np.median(x), np.std(x, ddof=1))
print(np.percentile(x, [25, 50, 75]))
出力例 / Output
count    10.000000
mean     82.600000
std       8.846845
min      68.000000
25%      76.500000
50%      84.000000
75%      89.500000
max      95.000000
dtype: float64
82.6 84.0 8.846845012017937
[76.5 84.  89.5]

この Step のまとめ

データは「中心(平均・中央値)」と「ばらつき(分散・標準偏差・IQR)」で要約します。平均は外れ値に弱く、中央値と四分位は頑健です。pandas の describe() でひととおりの要約が得られます。

3

確率分布

Probability distributions

概要Overview

推測統計に進むには、「データがどんなふうに散らばるか」を数式で表す道具が要ります。それが確率分布です。分布がわかれば、「この値が出る確率」や「この範囲に入る確率」を計算でき、推定や検定の土台になります。

仕組みHow it works

代表的な分布

  • 正規分布(normal distribution):平均を中心に左右対称の釣鐘型。身長や測定誤差など、多くの連続量がこの形に近づく。平均 μ と標準偏差 σ の2つで形が決まる。
  • 二項分布(binomial distribution):成功確率 p の試行を n 回くり返したときの成功回数の分布。コイン投げやクリック率など、成功か失敗かの繰り返しに使う。
  • ポアソン分布(Poisson distribution):一定の時間や区間に、まれな事象が起きる回数の分布。単位時間あたりの平均発生数 λ で決まる。

中心極限定理と標準化

推測統計で正規分布が主役になる理由が中心極限定理です。もとの分布の形によらず、標本平均は標本サイズ n を大きくするほど正規分布に近づきます。だからこそ、多くの手法が正規分布を前提にできます。

正規分布どうしを比べるには、単位をそろえる標準化が便利です。値から平均を引き、標準偏差で割ると、平均0・標準偏差1の標準正規分布上の位置=z値になります。

z = (x − μ) / σ z値は「平均から標準偏差いくつ分はなれているか」を表す。たとえば z = 1.96 の外側(両側)にはおよそ 5% しか入らない。
デモ 2Demo 2

正規分布ビジュアライザ

平均と標準偏差のスライダを動かすと、正規分布の曲線が描き直されます。範囲スライダで下限と上限を決めると、その範囲に入る確率(=曲線と横軸で囲まれた面積)を計算し、色をつけて示します。曲線の面積の合計は必ず1になります。

平均 μMean μ50
標準偏差 σSD σ10
範囲 下限Lower40
範囲 上限Upper60

コードで動かすRun the code

SciPy の scipy.stats を使うと、各分布の確率密度 pdf や累積確率 cdf がそのまま計算できます。

Pythondistributions.py
from scipy import stats

# 標準正規分布(平均0, 標準偏差1)
print(stats.norm.pdf(0))              # 中心の密度
print(stats.norm.cdf(1.96))           # 1.96 以下の確率

# 範囲の確率 = cdf(上) - cdf(下)。P(-1.96 < Z < 1.96)
print(stats.norm.cdf(1.96) - stats.norm.cdf(-1.96))

# 二項分布 B(n=10, p=0.5): ちょうど5回成功する確率
print(stats.binom.pmf(5, 10, 0.5))
print(stats.binom.cdf(3, 10, 0.5))   # 3回以下の確率
出力例 / Output
0.3989422804014327
0.9750021048517795
0.950004209703559
0.24609375000000003
0.171875

この Step のまとめ

確率分布は「値の散らばり方」を数式で表す道具。正規分布・二項分布・ポアソン分布が基本です。中心極限定理により標本平均は正規分布に近づき、z値で位置を比べられます。範囲の確率は累積確率(cdf)の差で求めます。

4

標本から母集団を推し量る

Estimation & confidence intervals

概要Overview

手元の標本から、母集団の真の値(母平均など)を見積もるのが推定です。ここでカギになるのが「標本は取り直すたびに少しずつ変わる」という事実。この揺らぎを見積もることで、推定にどれだけ幅があるかを言えるようになります。

仕組みHow it works

標本分布と標準誤差

同じ母集団から標本を何度も取り直すと、標本平均は毎回わずかに違います。この標本平均そのものの分布を標本分布と呼び、その散らばりの大きさを標準誤差(standard error, SE)といいます。標準誤差は次のように、標本サイズ n が大きいほど小さくなります。

SE = s / √n s は標本標準偏差、n は標本サイズ。データを増やすほど推定の揺らぎ(標準誤差)は小さくなる。標準偏差(データ自体の散らばり)と標準誤差(平均の推定の揺らぎ)は別物なので混同しない。

点推定と区間推定

母平均を「82.6」のように1つの値で見積もるのが点推定です。しかし1つの値だけでは、それがどれだけ確からしいか伝わりません。そこで幅をもたせて「だいたいこの範囲」と示すのが区間推定で、代表が信頼区間(confidence interval, CI)です。95%信頼区間は、点推定の周りにおよそ「標準誤差の約2倍」の幅を取ります。

95%信頼区間の正しい読み方

ここは誤解の多いところです。「母平均が95%の確率でこの区間に入る」ではありません。母平均は動かない未知の定数です。正しくは、同じ手続きで標本を取り直して区間を作る作業を何度もくり返せば、そのうち約95%の区間が母平均を含む、という意味です。信頼は「区間を作る手続き」に対するもので、いま得た1本の区間に対する確率ではありません。

コードで動かすRun the code

母標準偏差が未知で標本が小さいときは、正規分布ではなくt分布を使って平均の信頼区間を求めます。SciPy なら数行です。

Pythonconfidence_interval.py
import numpy as np
from scipy import stats

x = np.array([72, 85, 90, 68, 95,
              78, 88, 76, 83, 91])
n = len(x)
mean = x.mean()
se = x.std(ddof=1) / np.sqrt(n)     # 標準誤差

# 平均の95%信頼区間(自由度 n-1 の t 分布)
ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=se)
print(round(mean, 2), round(se, 3))
print(tuple(round(v, 2) for v in ci))
出力例 / Output
82.6 2.798
(76.27, 88.93)

この Step のまとめ

推定は標本から母数を見積もる作業。標準誤差 SE = s / √n は平均の推定の揺らぎで、n を増やすほど小さくなります。95%信頼区間は「手続きをくり返せば約95%が母平均を含む」という意味で、いまの1本に対する確率ではありません。

5

仮説検定

Hypothesis testing

概要Overview

「新しい方法で成績は上がったか」「2つのグループに差はあるか」。こうした問いに、偶然のばらつきと区別して答えるのが仮説検定です。統計分析のもっとも実用的な部分で、推測統計の核心にあたります。

仕組みHow it works

帰無仮説と対立仮説

検定は、まず「差はない」という控えめな主張=帰無仮説(H₀)を立てるところから始めます。示したいこと(差がある)は対立仮説(H₁)です。そして「もし帰無仮説が正しかったら、観測されたデータはどれくらい起こりにくいか」を計算します。とても起こりにくければ、帰無仮説を棄却し、差があると判断します。

p値と有意水準

p値は、帰無仮説が正しいと仮定したときに、観測された以上に極端な結果が得られる確率です。あらかじめ基準となる有意水準 α(多くは0.05)を決めておき、p値が α を下回れば「有意差あり」と判断します。ここで大切な注意が2つあります。p値は「帰無仮説が正しい確率」でも「差の大きさ」でもありません。あくまで「帰無仮説のもとでの、データの起こりにくさ」です。

2種類の誤り

  • 第一種の誤り(Type I error):本当は差がないのに「差あり」としてしまう(偽陽性)。その確率が有意水準 α。
  • 第二種の誤り(Type II error):本当は差があるのに「差なし」としてしまう(偽陰性)。その確率が β で、1 − β を検出力という。

代表的な検定

  • t検定(t-test):平均の差を調べる。1標本(ある値との比較)・2標本(2群の比較)・対応あり(同じ対象の前後比較)がある。
  • カイ二乗検定(chi-square test):カテゴリ同士に関連があるか(分割表の独立性)を調べる。
  • 分散分析(ANOVA):3群以上の平均に差があるかを一度に調べる。

効果量と多重比較

p値は「差があるか」を答えますが、「差がどれくらい大きいか」は答えません。そこで効果量を併せて報告します。平均差の効果量がCohen's dで、差を標準偏差の単位で表します(目安は 0.2 で小、0.5 で中、0.8 で大)。また、同じデータで検定を何度もくり返すと偶然の有意が増えます(多重比較問題)。有意水準を検定回数で割って厳しくするボンフェローニ補正などで対処します。

t = (x̄₁ − x̄₂) / (sp √(1/n₁ + 1/n₂))  d = (x̄₁ − x̄₂) / sp 2標本 t 検定(等分散を仮定)と Cohen's d。sp はプールした標準偏差 √(((n₁−1)s₁²+(n₂−1)s₂²)/(n₁+n₂−2))、自由度は n₁+n₂−2。
デモ 3Demo 3

2群のt検定

2つのグループの数値を入力すると、平均の差・t値・p値・有意判定(α=0.05, 両側)・効果量 Cohen's d を計算します。等分散を仮定した2標本 t 検定です。p値は t 分布から数値計算で求めており、SciPy の ttest_ind と一致します。下の図は各群の平均と標準偏差の範囲を示します。

例

コードで動かすRun the code

SciPy の scipy.stats には主要な検定がそろっています。2標本 t 検定・カイ二乗検定・分散分析を続けて見てみます。

Pythontests.py
import numpy as np
from scipy import stats

A = [68, 72, 75, 70, 74, 69, 73]
B = [78, 82, 80, 85, 79, 83, 81]

# 2標本 t 検定(等分散を仮定)
t, p = stats.ttest_ind(A, B)
print(f"t={t:.3f}  p={p:.2e}")

# 効果量 Cohen's d(プールした標準偏差で割る)
a, b = np.array(A, float), np.array(B, float)
sp = np.sqrt(((len(a)-1)*a.var(ddof=1) +
              (len(b)-1)*b.var(ddof=1)) / (len(a)+len(b)-2))
print(f"Cohen d = {(a.mean()-b.mean())/sp:.2f}")

# カイ二乗検定(2x2 分割表の独立性, 既定でYates補正)
table = np.array([[30, 20], [15, 35]])
chi2, p2, dof, exp = stats.chi2_contingency(table)
print(f"chi2={chi2:.3f}  p={p2:.4f}  dof={dof}")

# 分散分析(3群以上の平均の差)
g1, g2, g3 = [85,88,90,86,89], [78,82,80,79,81], [92,95,91,94,93]
F, p3 = stats.f_oneway(g1, g2, g3)
print(f"F={F:.3f}  p={p3:.2e}")
出力例 / Output
t=-7.089  p=1.27e-05
Cohen d = -3.79
chi2=7.919  p=0.0049  dof=1
F=68.796  p=2.66e-07

この Step のまとめ

検定は「差はない」という帰無仮説を立て、p値が有意水準 α を下回れば棄却します。p値は「帰無仮説が正しい確率」でも「差の大きさ」でもありません。差の大きさは効果量(Cohen's d)で、くり返し検定にはボンフェローニ補正で備えます。

6

相関と回帰、そして因果へ

Correlation, regression, and causality

概要Overview

ここまでは1つの量を扱ってきました。最後に、2つ以上の量の関係を見ます。片方が増えるともう片方も増えるのか。その関係を数式で表せるのか。そして忘れてはならない、相関と因果は違うという大原則を確認します。

仕組みHow it works

相関

2つの量が一緒に動く度合いを表すのが相関係数です。もっとも一般的なピアソンの相関係数 rは、直線的な関係の強さを −1 から +1 の範囲で表します。+1 は完全な右上がり、−1 は完全な右下がり、0 は直線的な関係がないことを示します。ただし r が測るのは直線関係だけで、曲線的な関係は捉えられない点に注意します。

相関は因果ではない

強い相関があっても、一方が他方の原因とは限りません。よくあるのが交絡で、背後にある第3の要因が両方を動かしているだけ、という状況です。たとえば「アイスの売上」と「水難事故」は相関しますが、原因は共通の「気温」です。相関から因果を主張するには、実験(ランダム化)や、交絡を調整する専用の手法が要ります。この先は因果推論のモジュールで扱います。

説明のための線形回帰

関係を式で表す基本が線形回帰です。y = β₀ + β₁ x の係数を、残差(予測と実測の差)の二乗和が最小になるように決めます(最小二乗法)。統計分析では、各係数が偶然でないか(p値)、あてはまりの良さ(決定係数 R²、0から1で1に近いほど良い)を見ます。妥当な解釈には残差の前提(残差が独立・等分散・おおむね正規)が満たされていることの確認も欠かせません。

コードで動かすRun the code

説明のための回帰には statsmodels の OLS が向いています。summary() が係数・p値・R² を一枚にまとめて出します。

Pythonols_regression.py
import numpy as np
import statsmodels.api as sm

x = np.arange(1, 11, dtype=float)
y = np.array([5.1, 6.8, 9.2, 11.3, 12.9,
              15.4, 17.1, 18.8, 21.2, 23.0])

X = sm.add_constant(x)          # 切片の列を追加
model = sm.OLS(y, X).fit()      # 最小二乗法で当てはめ
print(model.summary())
出力例(抜粋) / Output (excerpt)
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          3.0867      0.148     20.845      0.000       2.745       3.428
x1             1.9988      0.024     83.756      0.000       1.944       2.054
==============================================================================
R-squared:                       0.999

この Step のまとめ

相関係数は直線関係の強さを −1 から +1 で表します。ただし相関は因果ではありません(交絡に注意)。線形回帰は関係を式で表し、係数の p値や R² で評価します。因果を主張するには、次の因果推論モジュールで扱う専用の手続きが必要です。

まとめWrap-up

学びの振り返りと、さらに学ぶために

このモジュールでは、データから確かな結論を導く道具を、流れに沿って順に手に入れました。

  • 記述統計:平均・中央値・標準偏差・四分位でデータを要約する。
  • 確率分布:正規分布などで散らばりを表し、中心極限定理と z値で扱う。
  • 推定:標準誤差と信頼区間で、標本から母集団を幅をもって見積もる。
  • 仮説検定:帰無仮説・p値・有意水準で差を判断し、効果量で大きさを見る。
  • 相関と回帰:関係を測り式で表す。ただし相関は因果ではない。

次に進むなら、下の道具と資料が役に立ちます。

公開データセット

  • seaborn tips:飲食店の会計データ。seaborn.load_dataset("tips") で取得でき、相関や群間比較の練習に向く。
  • iris / diabetes:scikit-learn 内蔵。load_iris() / load_diabetes() で分類・回帰の題材に。

ライブラリ

  • NumPy:数値計算の土台。
  • SciPy(scipy.stats):分布と検定の定番。
  • statsmodels:回帰・検定と詳しい統計サマリ。
  • pandas:データ整形と describe()。
  • matplotlib:可視化。

参考書

  • 東京大学教養学部統計学教室 編『統計学入門』東京大学出版会
  • Larry Wasserman『All of Statistics』
  • 涌井良幸・涌井貞美『統計学の図鑑』

次のモジュールへ

おつかれさまでした

ここで学んだ「要約する → 分布で考える → 推定する → 検定する」という流れは、どんな分野のデータにも共通の考え方です。3つのデモの数値を書き換えて、平均・p値・信頼区間・効果量がどう動くかを確かめると、理解がぐっと深まります。

発展トピックBeyond this module

このコースでは扱わない、関係する発展トピック

このモジュールでは、推測統計と仮説検定を軸に「データから結論を導く基礎の流れ」を扱いました。統計にはこの先に、より柔軟な考え方や手法が広がっています。ここでは、このコースでは踏み込まないものの、知っておくと視野が広がる発展的なトピックを紹介します。深掘りは各自の興味に合わせてどうぞ。因果推論は、因果推論のモジュールで改めて扱います。

ベイズ統計

  • ベイズ推定:事前分布に情報を足して事後分布を得る、確率の更新としての推論。頻度論とは別の立場。
  • MCMC とライブラリ:複雑な事後分布を数値的に扱う(マルコフ連鎖モンテカルロ)。PyMC や Stan が定番。

頑健・ノンパラメトリック

  • ノンパラメトリック検定:分布の形を仮定しない検定(Mann-Whitney U 検定・Wilcoxon 符号順位検定)。
  • ブートストラップ:データを再標本化して、信頼区間や標準誤差を数値的に見積もる。

モデルの一般化

  • 一般化線形モデル(GLM):ロジスティック回帰・ポアソン回帰など、正規分布以外にも回帰を広げる枠組み。
  • 多変量解析:主成分分析・因子分析など、多数の変数を同時に扱う手法。

設計と因果

  • 検定力分析:必要な標本サイズを事前に見積もり、検出力を確保する(実験計画)。
  • 因果推論:相関を超えて処置の効果を推定する(RCT・傾向スコア・差分の差分法)。因果推論のモジュールで扱います。