こんにちは。Anagraftの伊藤です。
「データドリブン経営」という言葉が当たり前になり、生成AIがレポートの下書きまで書いてくれる時代になりました。それでもなお、データから引き出された結論が正しいかどうかを最終的に判断するのは人間です。そしてその判断の質を支えているのが、統計学という長い歴史を持つ「不確実なデータから結論を導くための作法」だと考えています。実際のところ、AIプロジェクトの成否を分ける論点の多く、たとえば「この効果検証は信頼できるのか」「このサンプル数で判断してよいのか」「この数字の差は偶然の範囲ではないのか」といった問いは、最新のAI技術ではなく、古典的な統計学が答えを持っている問題です。
ところが統計学は、学ぼうとすると意外に手ごわい分野でもあります。教科書は数式が中心で実務との接点が見えにくく、かといってビジネス書は「平均だけ見てはいけない」といった心得で終わってしまい、実際に検定を回せるところまで連れて行ってくれない。この両者の間を埋めるものが必要だと感じ、記述統計の初歩から仮説検定の実践、そして「数字にだまされないための落とし穴」まで、一続きの流れで学べるガイドとして本コラムをまとめました。
本コラムは、当社のデータサイエンスシリーズの第1冊にあたります。数式は本質の理解に必要な最小限に抑え、その代わりに「ビジネスの意思決定にどう効くか」という視点を全編に通しました。また、主要な概念にはPythonのコード例を添えましたので、手を動かしながら確かめることもできます。別途ご用意している「データ分析と機械学習のレシピ100選」「データ可視化レシピ106選」がコードの逆引き集だとすれば、本コラムは考え方を順序立てて積み上げる側の1冊です。
想定している読者は次のような方々です。
全12章は、データを要約する(記述統計)→ 確率でモデル化する → 一部から全体を推測する(推測統計)→ 差が本物かを判定する(仮説検定)→ 落とし穴を避ける、という順に積み上げる構成です。一方で、各章はできるだけ独立して読めるように作りましたので、業務で検定が必要になったときに該当章だけを参照する、という使い方も想定しています。
目次
生成AIの普及によって、データの集計もグラフの作成も分析レポートの文章化も、かつてないほど手軽になりました。しかし、ここで見落とされがちなことがあります。分析の「作業」がいくら自動化されても、分析の「判断」は自動化されていないということです。出てきた数字の差が意味のあるものなのか、そのデータの取り方に偏りはないのか、その結論はどの範囲まで一般化してよいのか。こうした判断には、依然として人間の統計リテラシーが必要です。
むしろ、誰でも分析結果を量産できるようになったぶん、怪しい分析が意思決定の場に持ち込まれる機会は増えているように思います。AIが自信を持って提示するもっともらしい集計結果を、確からしさの観点から吟味できる人が組織にいるかどうか。これが、データ活用の成果を左右する分かれ目になりつつあると感じています。

統計学と聞くと、平均や標準偏差の計算方法を思い浮かべる方が多いかもしれません。しかし統計学の本質は計算ではなく、「限られた不確実なデータから、どこまでの結論を、どのくらいの確からしさで言ってよいか」を定める作法にあります。
手元のデータは常に全体の一部でしかなく、そこには偶然のばらつきが必ず混ざっています。その偶然に振り回されずに本物のシグナルを見つけ出すための道具立てが、これから学ぶ記述統計であり、確率分布であり、推定と検定です。この作法は、対象がアンケートでも、製造ラインの計測値でも、Webサイトのアクセスログでも変わりません。だからこそ統計学は、業種や部門を越えた「データの共通言語」として機能します。
当社はAI導入のご支援を専門としていますが、AIプロジェクトの現場で最終的に問われるのは、多くの場合、統計学の問題だと考えています。たとえば次のような場面です。
機械学習のアルゴリズムがどれほど進化しても、これらの問いは残り続けます。統計学は、AI時代に古びるどころか、AIの出力を正しく評価するための土台として重要性を増している。本コラムはその立場で書いています。
執筆にあたっては、次の3点にこだわりました。第一に、「なぜそうなるのか」の直感的な説明を省略しないこと。不偏分散はなぜn-1で割るのか、95%信頼区間の95%とは何の確率なのか。こうした「分かったつもりで通り過ぎやすい急所」ほど、丁寧に言葉を尽くしました。第二に、すべての概念にビジネスの文脈を添えたこと。検定力の話は品質検査やA/Bテストの設計に、分布の話はコールセンターの人員計画に、というように、明日の実務と結びつく形で書いています。第三に、「使い方」だけでなく「誤用の避け方」に全体の4分の1を割いたこと。第10章から第12章は、p値の誤用、多重比較、シンプソンのパラドックスなど、実務で本当に事故が起きやすい論点に充てました。
統計学の価値は、高度な計算ができることではなく、「そのデータから、その結論を言ってよいのか」を判断できることにあります。本ガイドの12章は、すべてこの一点に向かって積み上げていきます。
Anagraftでは、AIプロジェクトの構想・課題設計から、データ分析・機械学習モデルの開発、AI人材の育成まで一貫したご支援を行っています。ご相談は、以下よりお問い合わせください。
お問い合わせ
本ガイドの構成です。第1部から順に積み上がりますが、各章は参照用に独立して読める形にもしています。
| 部 | 章 | 扱う内容 | こんな場面で効く |
|---|---|---|---|
| 第1部 データを記述する | 第1章 代表値と散布度 | 平均・中央値・分散・標準偏差・不偏分散 | ダッシュボードに載せる数字の選定 |
| 第2章 標準化と分布の形 | z得点・偏差値・ヒストグラム・歪度・対数変換 | 異なる指標の比較、外れ値の検出 | |
| 第3章 相関と単回帰 | 相関係数・その落とし穴・最小二乗法・決定係数 | KPI間の関係分析、要因の当たり付け | |
| 第2部 確率でモデル化する | 第4章 確率変数と確率分布 | 確率質量・密度・累積分布・期待値 | 不確実性を数字で扱う土台づくり |
| 第5章 実務で頻出する確率分布 | 二項・ポアソン・指数・正規分布と使い分け | 件数予測、待ち時間、キャパシティ設計 | |
| 第3部 一部から全体を推測する | 第6章 推測の仕組み | 母集団と標本・大数の法則・中心極限定理・標準誤差 | 「このデータで判断してよいか」の見極め |
| 第7章 区間推定 | 信頼区間・t分布・ブートストラップ | 調査結果やKPIの報告に幅を添える | |
| 第4部 差が本物かを判定する | 第8章 仮説検定の考え方 | 帰無仮説・p値・有意水準の正確な理解 | 施策効果の判定、A/Bテストの読み解き |
| 第9章 検定手法の使い分け | Z検定・t検定・カイ二乗検定・ノンパラメトリック検定 | 目的とデータに合う検定の選択 | |
| 第10章 過誤と検定力 | 第1種・第2種の過誤・効果量・サンプルサイズ設計 | 実験・テストの事前設計 | |
| 第5部 落とし穴を避ける | 第11章 p値の誤用と再現性 | p-hacking・多重比較・ASA声明・分析の作法 | 分析レポートの品質管理・監査 |
| 第12章 統計の落とし穴 | シンプソンのパラドックス・各種バイアス・グラフの印象操作 | 数字にだまされない目を養う |
こんにちは、Anagraftの伊藤です。統計学と聞くと、複雑な数式や検定の手順を思い浮かべる方が多いかもしれません。しかし出発点は非常にシンプルで、手元にある大量の数字を、人間が理解できる少数の指標に要約することにあります。売上データが1万行あっても、そのまま眺めて意思決定できる人はいません。平均・中央値・標準偏差といった数値に圧縮して初めて、「今月は好調だったのか」「地域による差はどれくらいあるのか」を判断できるようになります。この、データの分布の特徴を数値や図で表す営みを記述統計と呼びます。
記述統計は、後続の章で扱う確率分布や仮説検定といった推測統計の土台にもなります。母集団の性質を推測するにも、まずは手元のデータを正しく要約できていなければ話になりません。本章では、データの「中心」を表す代表値と、データの「広がり」を表す散布度という、記述統計の二本柱を扱います。この2つを押さえるだけでも、ダッシュボードの数字の見え方は大きく変わってきます。
例えば、コールセンターの平均応答時間が「30秒」だったとします。この数字だけを見れば十分に短く感じられますが、実際には8割の問い合わせが10秒以内に処理され、残り2割が数分待たされているという分布かもしれません。この場合、平均という代表値の裏に隠れた散布度(ばらつき)の情報が抜け落ちており、クレームにつながっている顧客体験の悪化を見逃してしまいます。代表値と散布度をセットで扱う視点は、こうした「平均に隠れた実態」を掘り起こすための基本の道具になります。
「平均」という言葉は日常的に使われますが、実は用途に応じて複数の計算方法が存在します。使い分けを誤ると、意思決定を誤らせる数字を出してしまうことがあります。
最もよく使われるのが算術平均です。全データを合計してデータ数で割るもので、\( \bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i \) と定義されます。月次売上の平均や、テストの平均点など、同じ性質のデータを単純に足し合わせて代表値を出したい場合に適しています。
データの重要度や重みが異なる場合には、加重平均を使います。例えば複数の事業部の顧客満足度スコアを全社の代表値としてまとめたいとき、事業部ごとの回答者数が大きく異なるなら、単純平均ではなく回答者数を重みとした加重平均を使うべきです。加重平均は \( \bar{x}_w = \frac{\sum_i w_i x_i}{\sum_i w_i} \) と表され、重み \( w_i \) を大きくするほどそのデータの影響力が増します。
成長率や倍率のように、掛け合わせていく性質の数値を平均したいときは、幾何平均が適しています。例えば、ある事業の売上成長率が1年目に10%、2年目に20%、3年目にマイナス5%だったとします。この3年間の「平均成長率」を単純平均で計算すると (10 + 20 – 5) / 3 = 8.3% となりますが、これは正しい代表値ではありません。実際の3年間の成長を再現する平均成長率は、各年の成長倍率(1.10、1.20、0.95)を掛け合わせて3乗根を取る幾何平均で求める必要があります。算術平均は複利的な変化を持つ系列を要約すると、実態より高い成長率を示してしまう性質があるためです。
速度や比率のように、分母と分子の単位が異なる量を平均するときは、調和平均が適切な場合があります。典型例は「往復の平均速度」です。行きを時速60kmで走り、帰りを時速40kmで同じ距離を走った場合、単純平均では時速50kmになりますが、実際の平均速度は距離を所要時間の合計で割った調和平均であり、時速48km程度になります。行きよりも帰りに長い時間がかかっているため、遅い方の速度がより強く反映されるのが調和平均の特徴です。株価収益率(PER)のような比率指標をポートフォリオ全体で平均するときにも、調和平均が使われることがあります。
| 平均の種類 | 計算の考え方 | 向いている場面 |
|---|---|---|
| 算術平均 | 合計 ÷ 個数 | 同質なデータの単純な代表値(月次売上、テスト点数など) |
| 加重平均 | 重み付き合計 ÷ 重みの合計 | データごとに重要度や母数が異なる場合(部門別スコアの全社集計など) |
| 幾何平均 | 積のn乗根 | 成長率・倍率など掛け算的に変化する系列(年平均成長率など) |
| 調和平均 | 個数 ÷ 逆数の合計 | 速度・比率など分母単位が異なる量の平均(平均速度、PERの平均など) |
Pythonでは、それぞれの平均をnumpyやscipyを使って簡潔に計算できます。以下は算術平均・加重平均・幾何平均・調和平均を並べて計算する例です。
import numpy as np
from scipy import stats
# 3年間の成長率(%)
growth_rate = np.array([10, 20, -5])
growth_factor = 1 + growth_rate / 100
arithmetic_mean = np.mean(growth_rate)
geometric_mean = (stats.gmean(growth_factor) - 1) * 100
print(f"算術平均による年平均成長率: {arithmetic_mean:.2f}%")
print(f"幾何平均による年平均成長率: {geometric_mean:.2f}%")
# 加重平均: 部門別満足度スコアと回答者数
scores = np.array([4.2, 3.8, 4.5])
respondents = np.array([120, 450, 30])
weighted_mean = np.average(scores, weights=respondents)
print(f"全社の加重平均満足度: {weighted_mean:.2f}")
# 調和平均: 往復の平均速度(行き60km/h, 帰り40km/h)
speeds = np.array([60, 40])
harmonic_mean = stats.hmean(speeds)
print(f"往復の平均速度: {harmonic_mean:.1f}km/h")
実行すると、算術平均による成長率は8.33%であるのに対し、幾何平均による成長率は約7.84%と、やや低い値になります。この差は成長率が小さいうちは目立ちませんが、変動が大きい系列ほど乖離が広がっていく点に注意が必要です。DX施策の効果を「年平均◯%改善」という形で報告する際に、単純平均で計算した数字を使ってしまうと、実際に3年後・5年後に積み上がる効果を過大に見積もってしまうことがあるため、複数年の成長率を1つの数字にまとめる場面では幾何平均を使うことを基本にすると安全です。
算術平均には弱点があります。極端に大きい、あるいは小さい値(外れ値)が1つ混じるだけで、大きく引っ張られてしまうことです。代表例が年収や世帯所得の分布です。大多数の人は中程度の年収に集まっていても、ごく一部の高額所得者がいるだけで平均値は実態よりかなり高く算出されます。「平均年収」のニュースを見て「自分は平均以下だ」と感じる人が多いのは、まさにこの現象が原因です。
このような歪んだ分布(裾が片側に長く伸びる分布)では、データを小さい順に並べたときにちょうど真ん中に来る値、すなわち中央値の方が実態を反映した代表値になります。中央値は外れ値の影響をほとんど受けません。年収の分布であれば、一部の富裕層がどれほど稼いでいても、中央値はデータの「真ん中の人」の値のまま動かないためです。同様に、最も出現頻度が高い値である最頻値も、カテゴリカルなデータ(最も売れた商品、最も多い問い合わせ内容など)を要約する際に有効です。
実務上とりわけ重要なのは、平均値と中央値の差そのものが分布の歪みを示すシグナルになるという点です。平均が中央値より大きく上回っているなら、少数の大きな値が分布の右側に伸びている(右に歪んだ分布)ことを示します。逆に平均が中央値より小さいなら、少数の小さな値が左側に伸びていることになります。売上データや所得データ、Webサイトの滞在時間データなど、ビジネスで扱う数値の多くはこの右に歪んだ分布を示すため、平均だけでなく中央値も併記する習慣が有効です。
また、最頻値を見る際には、山が1つとは限らない点にも注意が必要です。ヒストグラムを描いたときに山が2つ以上現れる分布を多峰性(マルチモーダル)の分布と呼びます。例えば、あるサービスの利用時間データが「数分で離脱するライトユーザー」と「30分以上使い込むヘビーユーザー」の2つの山を持つ場合、全体の平均値や中央値を1つ計算しても、どちらの利用者層の実態も正しく代表できません。このような場合は、平均や中央値を1つ求める前に、ヒストグラムで分布の形を確認し、必要であればユーザー層ごとにセグメントを分けて統計量を計算する方が実態に近い意思決定につながります。
import numpy as np
import pandas as pd
# 大多数は年収400万円台、一部の高所得者が混在する仮想データ
np.random.seed(0)
typical_income = np.random.normal(loc=420, scale=60, size=950)
high_income = np.random.normal(loc=2500, scale=800, size=50)
income = np.concatenate([typical_income, high_income])
income_series = pd.Series(income, name="年収(万円)")
print(income_series.describe())
print(f"平均と中央値の差: {income_series.mean() - income_series.median():.1f}万円")
このコードを実行すると、平均は中央値よりも数百万円単位で高く出ます。これは分布の右側にごく少数の高所得者がいるためで、平均だけを「代表的な年収」として報告すると、実態より豊かな印象を与えてしまいます。

代表値だけでは「どのくらいばらついているか」が分かりません。同じ平均点60点のテストでも、全員が55点から65点に収まっているクラスと、0点と100点が入り混じっているクラスでは、意味がまったく異なります。ばらつきを測る指標が散布度です。
最も単純な散布度は範囲(レンジ)で、最大値から最小値を引いた値です。計算は容易ですが、外れ値が1つあるだけで大きく変動してしまう欠点があります。そこでよく使われるのが四分位数です。データを小さい順に並べて4等分し、下から25%の位置にある値を第1四分位数(Q1)、50%の位置(中央値と同じ)を第2四分位数(Q2)、75%の位置を第3四分位数(Q3)と呼びます。Q3からQ1を引いた値が四分位範囲(IQR: Interquartile Range)で、データの中央50%がどの程度の幅に収まっているかを示します。IQRは範囲と違い、両端の外れ値の影響をほとんど受けないため、歪んだ分布のばらつきを見るのに適しています。
四分位数とIQRを視覚化したものが箱ひげ図(ボックスプロット)です。箱の下端がQ1、上端がQ3、箱の中の線が中央値を表し、箱からひげが伸びて、Q1から1.5×IQRを引いた値、Q3に1.5×IQRを足した値までの範囲にあるデータの最小値・最大値まで届きます。このひげの外側に位置する点は外れ値の候補として個別にプロットされます。複数のカテゴリ(店舗別、製品別など)の分布を1つの図に並べて比較する際に、平均値の棒グラフよりもはるかに多くの情報(中心・散らばり・歪み・外れ値)を一度に示せるのが箱ひげ図の強みです。
なお、四分位数は「データを4等分する値」という考え方自体は共通していますが、境界の値がちょうどデータ点の間に来る場合の補間方法にはいくつかの流儀があり、numpyやpandas、Excelなどツールによって微妙に異なる値が出ることがあります。厳密な一致を求める場面では、使用しているツールの補間方法(numpyのquantile関数であればmethod引数など)を確認しておくと安心です。また、SLA(サービス品質保証)の管理のように「99%のリクエストが◯秒以内に完了すること」を追いたい場面では、四分位数よりもさらに極端な99パーセンタイルや95パーセンタイルを監視指標として使うことが一般的です。平均応答時間だけを見ていると、ごく一部のユーザーが長時間待たされている問題を見逃してしまうためです。
import matplotlib.pyplot as plt
q1 = income_series.quantile(0.25)
q3 = income_series.quantile(0.75)
iqr = q3 - q1
print(f"Q1: {q1:.1f}, Q3: {q3:.1f}, IQR: {iqr:.1f}")
fig, ax = plt.subplots()
ax.boxplot(income_series, vert=False)
ax.set_xlabel("年収(万円)")
plt.show()

四分位数やIQRは分布の一部(中央50%)だけを見る指標ですが、すべてのデータ点が平均からどれだけ離れているかを反映した指標が分散と標準偏差です。分散は、各データ点と平均との差(偏差)を2乗して平均したもので、\( \sigma^2 = \frac{1}{n}\sum_{i=1}^{n} (x_i – \bar{x})^2 \) と定義されます。
偏差をそのまま平均すると、常にゼロになってしまいます。平均より大きい値のプラスの偏差と、平均より小さい値のマイナスの偏差が、定義上ちょうど打ち消し合うためです。この打ち消し合いを防ぐために偏差を2乗します。2乗すればすべての値が正になり、平均から離れているデータほど大きく効いてくるようになります(絶対値を使う方法もありますが、微分ができない点や数学的な扱いにくさから、統計学では2乗が標準的に使われます)。
ただし分散には1つ実務上扱いにくい点があります。単位が2乗されてしまうことです。「年収(万円)のばらつき」を分散で表すと、単位は「万円の2乗」という直感的に理解しにくいものになります。そこで分散の平方根を取り、元のデータと同じ単位に戻したものが標準偏差です。\( \sigma = \sqrt{\sigma^2} \) となり、「年収は平均から標準偏差分だけばらついている」という形で、元の単位のまま解釈できるようになります。ダッシュボードや報告資料では、分散そのものより標準偏差の方が読み手にとって理解しやすい指標です。
さらに、標準偏差を平均値で割った変動係数(CV: Coefficient of Variation、\( CV = \sigma / \bar{x} \))という指標もあります。標準偏差は元のデータと同じ単位を持つため、単位や規模が異なる複数のデータ系列同士のばらつきをそのまま比較することはできません。例えば「月商1,000万円の店舗の標準偏差100万円」と「月商100万円の店舗の標準偏差30万円」を比べる場合、標準偏差の絶対値だけを見ると前者の方がばらついているように見えますが、平均に対する相対的なばらつきである変動係数で見ると、後者(30%)の方が前者(10%)よりもばらつきが大きいと分かります。規模の異なる店舗や商品カテゴリ間で「安定度」を比較したいときには、変動係数を使うと公平な比較がしやすくなります。
分散を計算する際、実務では「nで割る分散」と「n-1で割る分散」の2種類が使われており、この違いでつまずく方が少なくありません。手元にある有限個のデータ(標本)だけから計算した分散を標本分散と呼び、\( \frac{1}{n}\sum (x_i – \bar{x})^2 \) で計算します。一方、本当に知りたい母集団全体の分散を、標本から偏りなく推定するために調整したものが不偏分散で、\( \frac{1}{n-1}\sum (x_i – \bar{x})^2 \) と定義されます。
なぜn-1で割ると「偏りがない」推定になるのでしょうか。直感的な理由は、標本平均\( \bar{x} \)がその標本自身から計算されているため、標本の各データ点に「寄り添って」しまう性質にあります。標本平均は、その標本内での偏差の2乗和を最小にする値として定義上決まります。つまり標本平均を使って計算した偏差の2乗和は、真の母平均を使って計算した場合よりも必ず小さくなる(あるいは同じ)という性質があります。標本というのは母集団のごく一部を覗き見ているに過ぎず、母平均そのものを知ることはできないため、代わりに標本平均を使うわけですが、この代用によって分散は必ず本来の値より小さめに出てしまいます。この「小さく出過ぎる」分をあらかじめ補正するために、割る数をnより1つ小さいn-1にし、結果を少し大きくしているのが不偏分散です。この補正はベッセルの補正と呼ばれます。
実務上重要なのは、標本から母集団の性質を推測したい場面では不偏分散(および、その平方根である不偏標準偏差)を使うのが原則という点です。numpyのデフォルトはnで割る標本分散(ddof=0)ですが、pandasのSeriesやDataFrameが持つ.std()や.var()メソッドはデフォルトでn-1で割る不偏分散(ddof=1)になっています。同じデータでもライブラリによってデフォルトの挙動が異なるため、どちらを使っているかを意識しないと、微妙に異なる数値が集計資料に混在してしまうことがあります。
この「割る数を1つ減らす」という考え方は、自由度(degrees of freedom)という概念の一例でもあります。n個のデータから標本平均を1つ計算してしまうと、その標本平均という制約のもとでは、n個の偏差のうち自由に値を取れるのはn-1個までに限られます(最後の1個の偏差は、残りのn-1個の偏差の値から自動的に決まってしまうためです)。分散の計算で実質的に独立な情報を持つのがn-1個分ということになるため、割る数もn-1にするのが自然だという捉え方もできます。自由度という考え方は、後の章で扱うt分布やカイ二乗分布、回帰分析の係数の検定などでも繰り返し登場する重要な概念です。
import numpy as np
import pandas as pd
data = pd.Series([12, 15, 14, 10, 18, 13, 16])
# numpyのデフォルトはddof=0(標本分散、nで割る)
var_population = np.var(data)
# ddof=1を指定するとn-1で割る不偏分散になる
var_unbiased_np = np.var(data, ddof=1)
# pandasの.var()/.std()はデフォルトでddof=1(不偏分散)
var_unbiased_pd = data.var()
std_unbiased_pd = data.std()
print(f"numpy ddof=0 (標本分散): {var_population:.3f}")
print(f"numpy ddof=1 (不偏分散): {var_unbiased_np:.3f}")
print(f"pandas .var() (デフォルトddof=1): {var_unbiased_pd:.3f}")
print(f"pandas .std() (デフォルトddof=1): {std_unbiased_pd:.3f}")
データ数が数千、数万件と多くなれば、nとn-1の差は誤差程度になり実務上ほぼ影響しません。しかし数十件程度の標本(A/Bテストの初期段階や、店舗数の少ない比較分析など)を扱う際には、この差が結果の解釈に影響することがあるため、どちらの分散を使っているかを常に意識しておく価値があります。
ここまで見てきた代表値と散布度は、それぞれ単独で見るのではなく、組み合わせて初めて実務的な意味を持ちます。平均だけを見て「今月の顧客単価は前月比で改善した」と判断するのは危険です。平均が上がっていても、それが一部の大口顧客による押し上げなのか、顧客層全体が底上げされたのかによって、次に取るべき施策はまったく異なります。中央値や標準偏差、四分位数を併せて確認することで、こうした見誤りを防げます。
平均は「代表値の1つ」に過ぎず、それだけで分布の全体像を語ることはできません。平均と中央値の差は分布の歪みを、標準偏差やIQRは分布の広がりを示しており、この3種類の情報を揃えて初めて、データが表す実態に近づくことができます。
ダッシュボードやレポートを設計する際には、平均値1つだけを大きく表示するのではなく、次のような統計量をセットで載せることを検討する価値があります。
特に、複数の部門・店舗・キャンペーンなどを横並びで比較するダッシュボードでは、平均値の棒グラフだけでなく、箱ひげ図やパーセンタイル帯を使った可視化を併用することで、「平均は同程度だがばらつきが大きく違う」といった、経営判断上見落とされがちな差異を捉えやすくなります。次章では、こうした代表値・散布度をベースに、データを標準化して比較可能にする方法と、2つの変数の関係を捉える相関について扱います。
『完全独習 統計学入門』(小島寛之、ダイヤモンド社):数式を最小限に抑えながら、分散や標準偏差がなぜそのように定義されるのかを丁寧に説明しており、本章で扱った代表値・散布度の直感的な理解を補強するのに適した1冊です。統計学を初めて学ぶ経営層やビジネスパーソンにも読み進めやすい構成になっています。
前章では、平均・分散・標準偏差といった代表的な指標を使って、データの位置とばらつきを要約する方法を扱いました。この章では、その先にある2つのテーマを取り上げます。1つは、単位や尺度が異なるデータどうしを同じものさしに載せて比較するための「標準化」という考え方です。もう1つは、平均や標準偏差という数値だけを眺めていては見えてこない「分布の形」を読み取る視点です。テスト科目間の比較、部門別KPIの評価、外れ値の発見、そして機械学習の前処理まで、標準化と分布の形という2つのテーマは、ビジネスの分析実務のあちこちに顔を出します。
この章では次の内容を順に扱います。
異なる尺度で測られた2つの数字は、そのままでは比較できません。営業部門の「新規商談数」と製造部門の「不良率」を並べて「どちらの成績が良いか」を論じることはできませんし、国語のテストで70点、数学のテストで70点だったとしても、それぞれの試験の難易度やばらつきが違えば、同じ70点の意味は違います。この「尺度の違いをそろえる」ための最も基本的な道具が標準化(standardization)、別名z得点(z-score)です。
z得点は、ある値がその集団の平均からどれだけ離れているかを、標準偏差を単位として測り直したものです。計算式は次の通りです。
\( z = \frac{x – \mu}{\sigma} \)
ここで \( x \) は個々の観測値、\( \mu \) はその集団の平均、\( \sigma \) は標準偏差です。この変換を行うと、元の単位が何であっても、変換後の値は必ず平均0・標準偏差1という同じ尺度に乗ります。z得点が1.0であれば「平均より標準偏差1個分だけ高い」ことを、マイナス2.0であれば「平均より標準偏差2個分だけ低い」ことを意味します。単位が金額であれ件数であれ点数であれ、z得点に直せば「平均から見て相対的にどれだけ離れているか」という共通の尺度で語れるようになります。
具体例で確認します。国語の平均点が60点・標準偏差10点、数学の平均点が50点・標準偏差20点だったとします。ある生徒が国語70点、数学70点を取った場合、素点だけを見ればどちらも同じ70点ですが、z得点に直すと国語は \( (70-60)/10=1.0 \)、数学は \( (70-50)/20=1.0 \) となり、実はどちらも「平均より標準偏差1個分だけ上」という、同じ位置にいることが分かります。逆に、国語75点(z得点1.5)と数学65点(z得点0.75)を比べれば、素点は数学の方が低くても、集団内での相対的な位置は国語の方が高いという評価になります。部門別のKPIでも考え方は同じです。営業部門の新規商談数と、製造部門の不良率削減幅のように単位も方向性も異なる指標を、それぞれの部門内でz得点に変換すれば、「自部門の中でどれだけ高い(低い)水準にあるか」という共通の物差しで並べて評価できます。

ここで注意しておきたいのは、z得点はあくまで「その集団の中での相対的な位置」を表す指標であって、絶対的な優劣や実力そのものを示すものではないという点です。z得点は基準にする集団(部署、学年、地域など)が変われば同じ観測値でも値が変わります。比較対象の集団をどう区切るかによって結論が変わりうることは、標準化を使う際に常に意識しておく必要があります。
日本の教育現場でよく使われる「偏差値」は、このz得点を扱いやすい数字に変換したものにすぎません。偏差値(T得点と呼ばれることもあります)は、次の式でz得点を平均50・標準偏差10の尺度に変換します。
\( T = 50 + 10z \)
z得点がそのまま「平均50・標準偏差10」というスケールに乗るだけなので、性質はz得点と全く同じです。平均的な人の偏差値は50前後になり、平均より標準偏差1個分高ければ偏差値60、標準偏差2個分高ければ偏差値70、というように機械的に対応します。マイナスの値やごく小さい小数を避け、直感的に扱いやすい2桁の整数に近い数字にする、という表示上の工夫がされているだけで、統計的に新しい情報が加わっているわけではありません。
この正体を理解しておくと、偏差値という数字の限界も見えてきます。偏差値はあくまで「その母集団の中での相対的な位置」であり、母集団(どの模試を受けたか、どの学年の集団かなど)が変われば同じ実力でも偏差値は変わります。また、偏差値の計算自体はどんな分布に対しても可能ですが、「偏差値70なら上位2%程度」といった解釈の目安は分布が正規分布に近いことを前提にしているため、分布の形が大きく歪んでいる集団ではこの感覚がそのまま当てはまらないこともあります。この分布の形の話は、この章の後半で改めて扱います。ビジネスの現場でT得点そのものを使う場面は多くありませんが、「平均50・標準偏差10にそろえて相対評価する」という発想自体は、複数の評価軸を統合した総合スコアを作るときなどに応用できる考え方です。
z得点は、教育現場の偏差値だけでなく、ビジネスの分析実務でも幅広く使われています。代表的な用途を2つ紹介します。
1つ目は外れ値(異常値)の検出です。データがおおむね正規分布に近い形をしている場合、z得点の絶対値が3を超える観測値は、全体の中でもかなり稀な値だと判断できます。後述する68-95-99.7ルールに基づけば、正規分布において \( |z|>3 \) となる観測値の割合は理論上0.3%程度にすぎません。この性質を利用して、「\( |z|>3 \) の観測値をひとまず異常値の候補としてリストアップする」というスクリーニングが、品質管理やシステム監視、経理データのチェックなどで広く行われています。ただし、この \( |z|>3 \) という目安はあくまで分布が正規分布に近いことを前提にした経験則であり、絶対的な基準ではない点に注意が必要です。分布が右に大きく裾を引いている場合(この章の後半で扱う歪度が大きいデータ)には、平均や標準偏差自体が少数の極端な値に引っ張られてしまい、z得点による判定がうまく機能しないことがあります。そうした場合は、中央値と四分位範囲を使う方法(四分位範囲の1.5倍を超えて離れた値を外れ値とみなす、いわゆる箱ひげ図の基準)や、分布の形を問わずに使えるチェビシェフの不等式(後述)を併用するのが安全です。
2つ目は機械学習の前処理としての標準化です。距離や内積の計算をベースにするアルゴリズム、例えばk近傍法やサポートベクターマシン、主成分分析、また勾配降下法でパラメータを最適化する線形回帰・ロジスティック回帰・ニューラルネットワークなどは、特徴量ごとの尺度の違いに敏感です。ある特徴量が「円」単位で数百万の値を取り、別の特徴量が「割合」で0から1の値しか取らない場合、尺度の大きい特徴量が計算上ことさら支配的に扱われてしまい、モデルの学習が歪んだり収束が遅くなったりします。すべての特徴量をあらかじめz得点に変換して平均0・標準偏差1にそろえておけば、この問題を避けられます。一方、決定木や勾配ブースティング木のように、値を1つずつのしきい値で分岐させていくモデルは、特徴量を単調変換しても分岐の順序が変わらないため、標準化の有無による影響を受けにくいという違いもあります。どのアルゴリズムを使うにせよ、「なぜ標準化が必要なのか(あるいは不要なのか)」を理解した上で前処理を設計することが大切です。
import numpy as np
import pandas as pd
from scipy import stats
# 部門別の月次売上データ(単位:万円)を想定
rng = np.random.default_rng(42)
sales = np.concatenate([rng.normal(500, 80, 29), [950]]) # 最後の1件を外れ値として追加
df = pd.DataFrame({"sales": sales})
# z得点を計算(自前計算とscipyの両方)
df["z_manual"] = (df["sales"] - df["sales"].mean()) / df["sales"].std(ddof=0)
df["z_scipy"] = stats.zscore(df["sales"])
# |z| > 3 を外れ値候補として抽出
outliers = df[df["z_scipy"].abs() > 3]
print(outliers)
# 機械学習の前処理としての標準化(scikit-learn)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df["sales_scaled"] = scaler.fit_transform(df[["sales"]])
print(df["sales_scaled"].mean(), df["sales_scaled"].std(ddof=0)) # 0と1に近づく
このコードでは、ほとんどが平均500万円前後に収まる売上データに、950万円という突出した1件を混ぜています。z得点で見ると、この1件だけが \( |z|>3 \) の条件に引っかかり、外れ値候補として自動的に抽出されます。scikit-learnのStandardScalerは、fit_transformを呼ぶだけでデータ全体を平均0・標準偏差1に変換してくれる、機械学習パイプラインでの標準化の標準的な手段です。
平均や標準偏差、そしてそこから計算されるz得点は、いずれもデータを「1つの数字」に要約する指標です。しかし、要約する過程で失われる情報も多くあります。平均と標準偏差が全く同じ2つのデータセットでも、分布の形(山が1つか複数か、左右対称か、裾がどちらに長いか)がまるで違う、ということは珍しくありません。分布の形を直接確認する最も基本的な道具がヒストグラムです。
ヒストグラムは、データの取り得る範囲をいくつかの区間(ビン)に区切り、各区間に含まれるデータの件数を棒の高さで表した図です。作り方自体は単純ですが、ビンの数(あるいはビンの幅)をどう決めるかによって、同じデータから全く違う印象の図ができあがります。ビンの数が少なすぎる(ビン幅が広すぎる)と、複数の山があるような細かい構造が1つの大きな山にならされて見えなくなります。逆にビンの数が多すぎる(ビン幅が狭すぎる)と、標本のばらつきに由来する細かいギザギザが目立ち、本質的な形が読み取りにくくなります。適切なビン幅を機械的に決めるための経験則もいくつか知られており、代表的なものにビンの数を \( k = \lceil \log_2 n \rceil + 1 \)(\( n \) はデータ件数)とするスタージェスの公式、四分位範囲を使ってビン幅を \( 2 \times \mathrm{IQR} \times n^{-1/3} \) とするフリードマン・ダイアコニスの公式があります。どちらも便利な出発点ですが、最終的には複数のビン幅を試して図を見比べ、分析の目的に照らして納得できる形を選ぶという手間を惜しまないことが大切です。

ヒストグラムを見るときにまず確認したいのが、山(峰)がいくつあるかです。山が1つだけの分布を単峰(unimodal)、山が2つ以上ある分布を多峰(multimodal)と呼びます。単峰の分布であれば、平均や中央値といった1つの代表値でおおよその中心を語ることに一定の意味がありますが、多峰の分布に対して平均だけを報告すると、実態を大きく見誤ります。多峰性は多くの場合、性質の異なる複数の集団が1つのデータセットに混在しているというシグナルです。例えば、ある製品の顧客単価のヒストグラムに2つの山が現れたなら、それは「個人客の少額購入層」と「法人の大口購入層」という異なる性質の顧客層が混ざっている可能性を示しています。この場合、全顧客をひとまとめにした平均単価を目標に据えても、どちらの層に対しても実態に合わない数字になりがちです。多峰性を見つけたら、まず「なぜ山が分かれているのか」を考え、可能であれば属性(顧客セグメント、店舗、時間帯など)でデータを分割してから改めて分析し直す価値があります。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
# 個人客(少額・多数)と法人客(高額・少数)が混在した顧客単価を模した多峰データ
retail = rng.normal(3000, 800, 800)
wholesale = rng.normal(28000, 4000, 150)
unit_price = np.concatenate([retail, wholesale])
fig, axes = plt.subplots(1, 3, figsize=(12, 3))
for ax, bins, title in zip(
axes, [5, "auto", 200], ["ビンが粗すぎる例(5個)", "自動選択(auto)", "ビンが細かすぎる例(200個)"]
):
ax.hist(unit_price, bins=bins)
ax.set_title(title)
plt.tight_layout()
plt.show()
# ビン幅の目安を数値でも確認(スタージェスの公式とFD法)
edges_sturges = np.histogram_bin_edges(unit_price, bins="sturges")
edges_fd = np.histogram_bin_edges(unit_price, bins="fd")
print(len(edges_sturges) - 1, len(edges_fd) - 1)
ビンを5個に粗く区切ると、法人客の山が個人客の山に埋もれて単峰に近い形に見えてしまう一方、200個まで細かくすると標本のノイズが強調されて2つの山の存在が読み取りにくくなります。matplotlibのbins=”auto”やnumpyのhistogram_bin_edgesを使えば、スタージェスの公式やフリードマン・ダイアコニスの公式に基づくビン数を自動的に得られますが、それでも最終的には複数の設定を見比べる一手間が有効です。
分布の形を数値で要約する指標として、歪度(skewness)と尖度(kurtosis)があります。歪度は分布の左右の非対称さを表す指標で、代表的な定義式(フィッシャー・ピアソンの歪度係数)は次の通りです。
\( g_1 = \frac{1}{n}\sum_{i=1}^{n}\left(\frac{x_i-\mu}{\sigma}\right)^3 \)
歪度が0に近ければ左右対称、正の値であれば右に長い裾を引く分布(右に裾が伸びている状態)、負の値であれば左に長い裾を引く分布であることを示します。売上、所得、待ち時間、クレームの処理時間といったビジネスデータの多くは、ゼロを下回れない(値の下限がある)一方で、少数のとても大きな値が存在しうるため、右に裾を引く分布になりやすいという特徴があります。例えば従業員の年収データでは、大多数が平均的な水準に集まる一方、経営層やごく一部の高所得者が平均を大きく引き上げる方向に裾を伸ばします。この種の分布では、平均が中央値よりも大きくなる傾向があります。少数の極端に大きな値が平均を押し上げる一方、中央値(データを順に並べたときのちょうど真ん中の値)はそうした極端な値の影響を受けにくいためです。「平均年収」だけを見て「従業員の典型的な年収」を語ると、実態より高い印象を与えてしまう典型的な例です。
尖度は分布の裾の重さ、つまり極端な値がどれだけ出やすいかを表す指標です。正規分布を基準(超過尖度0)としたとき、尖度が正であれば正規分布よりも裾が重く、中心に鋭く尖った形(極端な値が正規分布の想定より頻繁に出る状態)になり、負であれば正規分布よりも裾が軽く、なだらかな形になります。金融の日次リターンのように「普段は小さな変動が多いが、稀に非常に大きな変動が起きる」タイプのデータは、尖度が高くなりやすいことが知られています。歪度と尖度を数値で確認しておくと、「このデータに正規分布を前提にした手法(先述のz得点による外れ値検出や、後述の68-95-99.7ルールなど)をそのまま当てはめてよいか」を判断する材料になります。
import numpy as np
from scipy import stats
rng = np.random.default_rng(1)
# 右に裾を引く分布の例として対数正規分布に従う売上データを生成
sales = rng.lognormal(mean=6.0, sigma=0.6, size=2000)
mean_val = sales.mean()
median_val = np.median(sales)
skewness = stats.skew(sales) # 歪度(正なら右に裾を引く)
kurt = stats.kurtosis(sales) # 超過尖度(正規分布を0とする定義)
print(f"平均: {mean_val:.1f}, 中央値: {median_val:.1f}")
print(f"歪度: {skewness:.2f}, 超過尖度: {kurt:.2f}")
対数正規分布に従う売上データでこのコードを実行すると、平均が中央値よりも明確に大きくなり、歪度は正の大きな値を示します。「平均だけを見ていると、典型的な売上水準を過大に見積もってしまう」というこの章の後半で述べる論点を、数値の上でも確認できます。
正規分布に近い形をしたデータについては、平均と標準偏差から「だいたいどの範囲にデータの何%が収まるか」を見積もる便利な経験則があります。68-95-99.7ルールと呼ばれるもので、平均から標準偏差1個分の範囲(\( \mu\pm1\sigma \))に全体の約68%、標準偏差2個分の範囲(\( \mu\pm2\sigma \))に約95%、標準偏差3個分の範囲(\( \mu\pm3\sigma \))に約99.7%のデータが収まる、というものです。先述した「\( |z|>3 \) を外れ値候補とする」という目安は、このルールの「99.7%が範囲内に収まる、裏を返せば範囲外は0.3%しかない」という性質に基づいています。
ただし、この68-95-99.7ルールはデータが正規分布に近い形をしていることが前提です。この章で見てきた通り、売上や所得のように右に裾を引く分布では、このルールをそのまま当てはめると外れ値の見積もりを誤ります。分布の形が分からない、あるいは正規分布から離れていることが分かっている場合に使える、より緩やかだが分布の形を問わない一般的な経験則がチェビシェフの不等式です。この不等式は、平均が \( \mu \)、標準偏差が \( \sigma \) であるどのような分布についても、平均から標準偏差 \( k \) 個分より離れたデータの割合は \( 1/k^2 \) 以下である、つまり平均から標準偏差 \( k \) 個分の範囲内に、少なくとも \( 1-1/k^2 \) の割合のデータが収まることを保証します。
| 範囲 | 正規分布(68-95-99.7ルール) | チェビシェフの不等式(分布形状を問わない下限) |
|---|---|---|
| \( \mu\pm1\sigma \) | 約68% | 保証なし(0%) |
| \( \mu\pm2\sigma \) | 約95% | 少なくとも75% |
| \( \mu\pm3\sigma \) | 約99.7% | 少なくとも約88.9% |
表からも分かる通り、チェビシェフの不等式が保証する割合は68-95-99.7ルールよりもかなり緩め(小さめ)です。これは、分布の形について何も仮定していない分、どのような分布にも当てはまる汎用的な保証にせざるを得ないためです。逆に言えば、正規分布に近いことが確認できているデータには68-95-99.7ルールを、分布の形が不明あるいは明らかに正規分布から外れているデータには(緩めではあるものの)チェビシェフの不等式を、使い分けるとよいということになります。どちらの経験則も、まず分布の形そのものを確認するという、この章で繰り返し述べている作法があってこそ正しく活きてきます。
右に長い裾を引く分布を扱う際によく使われる実務上の手段が、対数変換です。売上や所得、待ち時間、Webサイトの滞在時間のように、ゼロより大きい値だけを取り、少数の極端に大きな値によって右に裾が伸びるデータに対して、値を対数に変換すると、大きな値ほど強く圧縮され、小さな値の差は相対的に保たれるため、分布の形が左右対称に近づき、正規分布に近い形になることがよくあります。これは、こうしたデータの多くが「掛け算的な」プロセス(例えば、複数の要因が乗じ合って結果が決まるようなプロセス)から生まれる対数正規分布に従っていると考えられるためです。対数を取ることで、掛け算のプロセスが足し算のプロセスに変換され、扱いやすくなるという理屈です。
対数変換は、幾何平均という指標とも密接に関係しています。幾何平均とは、\( n \) 個の値の積の \( n \) 乗根、\( \left(\prod x_i\right)^{1/n} \) として定義される代表値で、売上の前年比や投資のリターンのように「比率」や「掛け算的な変化」を平均するのに適した指標です。実は、対数変換したデータの通常の平均(算術平均)を計算し、それを指数変換で元のスケールに戻すと、元のデータの幾何平均と一致するという関係があります。つまり「データを対数変換してから算術平均を取る」ことと「元のデータの幾何平均を取る」ことは、数学的に同じ操作を表と裏から行っていることになります。対数変換したデータに対して分析を行うということは、暗黙のうちに算術平均ではなく幾何平均的なものの見方を採用しているとも言えます。年率成長率の平均を求めるときに単純な算術平均ではなく幾何平均を使うべきだ、とされるのも同じ理由からです。
import numpy as np
from scipy import stats
rng = np.random.default_rng(2)
sales = rng.lognormal(mean=6.0, sigma=0.6, size=2000)
# 対数変換前後で歪度を比較
skew_before = stats.skew(sales)
skew_after = stats.skew(np.log(sales))
print(f"変換前の歪度: {skew_before:.2f}, 変換後の歪度: {skew_after:.2f}")
# 「対数変換してから算術平均、指数で戻す」と「元データの幾何平均」が一致することを確認
log_mean_back = np.exp(np.mean(np.log(sales)))
geometric_mean = stats.gmean(sales)
print(f"対数経由の平均: {log_mean_back:.2f}, 幾何平均: {geometric_mean:.2f}")
このコードを実行すると、対数変換後の歪度は変換前に比べてゼロに近づき、分布が左右対称に近づいたことが数値でも確認できます。また、対数変換を経由して求めた平均と、scipyのgmean関数で直接求めた幾何平均が一致することも確かめられます。なお、値がゼロを含む可能性があるデータに対数変換を使う場合は、対数の定義域の都合上そのままlogを取れないため、\( \log(1+x) \) を計算するnp.log1pを使うのが定石です。
この章の内容を実務に持ち帰るときに強調しておきたいのは、「平均±標準偏差」という2つの数字だけで報告を済ませるレポートには限界があるという点です。平均と標準偏差は、分布が単峰かつおおよそ左右対称であることを暗黙の前提にして初めて、直感的に分かりやすい要約になります。しかし、この章で見てきた通り、顧客単価のように複数の層が混在して多峰になっているデータや、売上・所得のように右に大きく裾を引くデータでは、平均と標準偏差だけを報告すると、実態とかけ離れた印象を与えてしまいます。多峰の分布に対して「平均から標準偏差の範囲」を語ることにはほとんど意味がありませんし、右に裾を引く分布に対して平均を「典型的な値」として扱うと、少数の大口顧客や高所得者に引っ張られた、実感と合わない数字になりがちです。
「平均±標準偏差」は、分布が単峰でおおむね左右対称であるという前提の上に成り立つ要約です。数字だけを鵜呑みにする前に、ヒストグラムで分布の形そのものを確認する、中央値や四分位数といった外れ値に強い指標もあわせて見る、多峰であれば集団を分けて考える、右に裾を引いていれば対数変換や幾何平均を検討する。こうした一手間を組織の分析文化として定着させることが、数字による誤った意思決定を防ぐ土台になります。
実務では、平均・標準偏差・中央値・四分位数といった要約指標に加えて、可能であればヒストグラムや箱ひげ図を添えて報告する習慣を持つことが望ましいといえます。ダッシュボードに「平均」の数字を1つ表示するだけでなく、分布の形を示す図を並べて置くだけでも、多峰性や歪みへの気づきが格段に得やすくなります。標準化や分布の形といったこの章のテーマは、次章以降で扱う確率分布や仮説検定の土台にもなる考え方です。データを扱う際にはまず分布の形そのものに目を向ける、という姿勢を持っておくと、この先の章で学ぶ手法もより的確に使いこなせるようになります。

『統計学入門』(東京大学出版会):日本の統計学の基礎テキストとして長く読まれてきた1冊で、代表値・散布度・標準化・分布の形といった記述統計の考え方が体系的にまとめられています。この章で扱ったz得点や歪度・尖度の定義を、数式の背景も含めてより深く確認したい場合の土台になります。
前章までは、1つの変数の分布や散らばりを、代表値や分散・標準偏差といった指標で要約する方法を見てきました。しかし実務のデータ分析で本当に知りたいのは、多くの場合「1つの変数」の性質ではなく、「2つの変数の間にどんな関係があるか」です。広告費を増やすと売上はどれくらい伸びるのか。残業時間と離職率には関係があるのか。気温とアイスクリームの売上はどう連動するのか。こうした問いに答える最も基本的な道具が、本章で扱う共分散・相関係数・単回帰分析です。
これらは統計学の中でもとりわけ誤用が多い分野でもあります。相関係数が高いというだけで因果関係を主張してしまう、外れ値1つに引きずられた相関を鵜呑みにしてしまう、といった事例は珍しくありません。本章では、指標の定義や計算方法だけでなく、「どこで判断を誤りやすいか」という落とし穴の整理に重点を置いて解説します。
2つの変数 \( x \) と \( y \) が、それぞれ平均からどれだけ、どちら向きに離れているかを掛け合わせて平均したものが共分散(covariance)です。\( n \) 個のデータについて、標本共分散は次の式で定義されます。
\( s_{xy} = \frac{1}{n-1} \sum_{i=1}^{n} (x_i – \bar{x})(y_i – \bar{y}) \)
直感的に考えると、ある観測値で \( x \) が平均より大きく、同時に \( y \) も平均より大きいなら、その積 \( (x_i – \bar{x})(y_i – \bar{y}) \) はプラスになります。逆に \( x \) が平均より大きいのに \( y \) は平均より小さい場合、積はマイナスになります。この積を全データで足し合わせて平均をとった共分散がプラスに大きければ、「\( x \) が大きいときは \( y \) も大きく、\( x \) が小さいときは \( y \) も小さい」という、2変数が同じ方向に動く傾向を意味します。共分散がマイナスなら逆方向に動く傾向、ゼロに近ければ目立った連動は見られない、という読み方になります。
ただし共分散には大きな弱点があります。値の大きさが、もとの変数の単位に強く依存してしまう点です。たとえば広告費(万円)と売上(万円)の共分散を計算したとします。ここで広告費の単位を万円から円に変えるだけで、共分散の値は単純に10,000倍になります。関係の強さが変わったわけではないのに、単位を変えただけで数値が大きく変わってしまうため、共分散の絶対値だけを見て「関係が強い・弱い」を判断したり、異なる変数の組み合わせ同士で共分散の大きさを比べたりすることはできません。この弱点を解消するために考え出されたのが、次に説明するピアソンの相関係数です。
ピアソンの積率相関係数(単に相関係数と呼ばれることが多い指標)は、共分散を \( x \) と \( y \) それぞれの標準偏差で割ることで、単位の影響を取り除いたものです。
\( r = \frac{s_{xy}}{s_x s_y} \)
この割り算によって、相関係数 \( r \) は必ず \( -1 \) から \( +1 \) の範囲に収まります。\( r = 1 \) はすべての点が右上がりの直線上に完全に乗っている状態、\( r = -1 \) はすべての点が右下がりの直線上に完全に乗っている状態を表します。\( r = 0 \) は、少なくとも直線的な関係については見られないことを意味します(この「少なくとも直線的には」という留保が、後述する落とし穴の1つに関わってきます)。
相関係数の絶対値をどう解釈するかについては、分野によって基準は異なりますが、社会科学や経営分析の実務でよく参照される目安を表にまとめます。あくまで大まかな目安であり、業界やデータの性質によって「強い」の基準は変わる点には注意が必要です。
| 相関係数の絶対値 | 目安となる解釈 |
|---|---|
| 0.7 ~ 1.0 | 強い相関 |
| 0.4 ~ 0.7 | 中程度の相関 |
| 0.2 ~ 0.4 | 弱い相関 |
| 0.0 ~ 0.2 | ほとんど相関がない |
ここで統計学の用語として重要な区別が、「無相関」と「独立」の違いです。2つの変数が独立であるとは、一方の値を知っても他方の分布についての情報が一切得られない、という強い条件を指します。変数 \( x \) と \( y \) が独立であれば、両者の相関係数は必ずゼロになります。しかし逆は成り立ちません。相関係数がゼロだからといって、2つの変数が独立であるとは限らないのです。
具体例で確認します。\( x \) が \( -1 \) から \( 1 \) の範囲で左右対称に分布しているとして、\( y = x^{2} \) という完全に決まった関係があるとします。\( x \) が分かれば \( y \) は一意に定まりますから、両者は強く依存し合っています。ところが \( x \) の分布が原点対称であるため、共分散を計算すると \( x \) の3乗の期待値が絡み、これがゼロになります。結果として相関係数はゼロになります。つまり「\( y \) は \( x \) によって完全に決定されているのに、相関係数はゼロ」という、直感に反する状況が起こり得るのです。この例が示すとおり、ピアソンの相関係数はあくまで「直線的な関係の強さ」だけを測る指標であり、関係の有無そのものを判定する万能の指標ではありません。

相関係数は1つの数値に情報を凝縮できる便利な指標ですが、その手軽さゆえに誤読も起こりやすい指標です。実務で相関係数を扱う際に必ず押さえておきたい落とし穴を4つ整理します。
1つ目は、外れ値に弱いという性質です。相関係数は平均や分散と同様、すべてのデータ点を使った計算に基づくため、ごく少数の外れ値によって値が大きく変わってしまうことがあります。この問題を象徴的に示すのが、統計学者フランク・アンスコムが1973年に発表した「アンスコムの数値四重奏(Anscombe’s quartet)」と呼ばれる4つのデータセットです。この4組のデータは、\( x \) の平均・分散、\( y \) の平均・分散、両者の相関係数、さらに単回帰直線の係数まで、小数点以下2桁程度まで一致するように作られています。ところが実際に散布図を描くと、1組目はきれいな直線関係、2組目は明確な曲線(非線形)の関係、3組目はほぼ完全な直線に1点だけ外れ値が乗っている状態、4組目は \( x \) の値がほぼ1点に集中する中で1つだけ極端な外れ値があるためだけに相関係数が高く見える状態、と全く異なる姿を見せます。相関係数という要約統計量だけを見て「関係の強さ」を判断すると、この違いを完全に見落としてしまいます。相関係数を計算したら、必ず散布図を目で確認するという習慣が欠かせません。

次のコードは、アンスコムの4組のデータそれぞれについてscipy.stats.pearsonrで相関係数を計算する例です。数値上はほぼ同じ相関係数が並ぶ一方で、実際の分布はまったく異なることを、手元で散布図を描いて確認してみることを推奨します。
import numpy as np
from scipy import stats
# アンスコムの数値四重奏(Anscombe, 1973)
x1 = np.array([10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5])
y1 = np.array([8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68])
y2 = np.array([9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74])
y3 = np.array([7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73])
x4 = np.array([8, 8, 8, 8, 8, 8, 8, 19, 8, 8, 8])
y4 = np.array([6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89])
datasets = [('I', x1, y1), ('II', x1, y2), ('III', x1, y3), ('IV', x4, y4)]
for name, x, y in datasets:
r, p_value = stats.pearsonr(x, y)
print(f'データセット{name}: r = {r:.3f}, p値 = {p_value:.3f}')
実行すると、4組とも相関係数はおよそ0.816前後とほぼ同じ値になります。数値だけを報告資料に載せれば「4組とも同程度の強い相関がある」という結論になりますが、散布図を描けばまったく違う実態が見えてきます。これがアンスコムの数値四重奏の教訓です。
2つ目の落とし穴は、非線形な関係を捉えられないことです。前節で見た \( y = x^2 \) の例のとおり、相関係数はあくまで直線的な関係の強さを測る指標であり、U字型や指数的な増加のような非線形の関係が存在していても、その強さを正しく反映しないことがあります。強い規則性があるにもかかわらず相関係数が低く出た場合、関係が「ない」のではなく「直線的ではない」だけかもしれない、という可能性を疑う必要があります。
3つ目は、範囲の制限(truncation)によって相関係数が見かけ上変化してしまう問題です。分析対象のデータが、もともとの母集団の一部分、それも \( x \) や \( y \) の値があらかじめ絞り込まれた部分集合になっている場合、観測される相関係数は本来の相関係数よりも弱く(まれに強く)見えることがあります。典型例は入学試験のスコアと入学後の成績の関係です。合格者だけを対象に相関を計算すると、そもそも試験で一定の得点を取れなかった人はデータに含まれていません。母集団全体では試験得点と入学後の成績に明確な相関があったとしても、上位層に絞り込まれたサンプルの中では、得点の散らばりが小さくなるぶん、相関係数は本来より弱く算出されてしまいます。採用試験の妥当性検証や、既存顧客だけを対象にした分析でも同様の現象が起こり得るため、「そのデータはどのような条件で選ばれた部分集合か」を常に意識しておく必要があります。
4つ目は、交絡による疑似相関です。2つの変数の間に直接の関係がなくても、両方に影響を与える第三の変数(交絡因子)が存在すると、見かけ上の相関が生まれます。よく引用される例が、アイスクリームの売上と水難事故の発生件数です。この2つには正の相関が見られますが、アイスクリームが水難事故を引き起こすわけではありません。実際には「気温(季節)」という共通の要因があり、気温が高い時期にはアイスクリームがよく売れると同時に、海や川で泳ぐ人が増えて水難事故も増加します。相関係数だけを見て「アイスクリームの売上を抑えれば水難事故が減る」と考えるのは明らかな誤りです。ビジネスの現場でも、季節性や景気動向、母集団の変化など、共通の背景要因が2つの指標を同時に動かしているケースは多く、相関が見えたらまず交絡因子の存在を疑う姿勢が欠かせません。
相関係数は便利な要約統計量ですが、外れ値・非線形性・範囲の制限・交絡という4つの落とし穴を常に伴います。相関係数を計算したら数値だけで判断せず、必ず散布図を描いて分布の形を目で確認すること、そして相関が見えた際にはその背後に共通の要因がないかを検討することが、誤読を避けるための基本動作です。
ピアソンの相関係数が直線的な関係しか捉えられない弱点を補うために使われるのが、スピアマンの順位相関係数です。考え方はシンプルで、\( x \) と \( y \) の実際の値ではなく、それぞれを順位(1位、2位、3位…)に変換したうえで、その順位同士のピアソン相関係数を計算します。
この方法が有効なのは、2変数の関係が直線ではないものの、一方が増えれば他方も一貫して増える(または減る)という単調な関係が成り立っている場合です。たとえば経験年数と年収の関係が、直線ではなく右肩上がりに緩やかにカーブしながら増えていくような場合、ピアソンの相関係数は関係の強さをやや過小に評価してしまいますが、スピアマンの順位相関係数は順位という尺度で見るため、単調な増加関係を高く評価できます。また、アンケートの5段階評価のような順序尺度のデータや、外れ値の影響を抑えたい場面でもスピアマンの順位相関係数が使われます。順位に変換する時点で極端な値の影響が緩和されるためです。
次のコードは、指数的に増加する非線形の関係を持つ人工データに対して、ピアソンの相関係数とスピアマンの順位相関係数をそれぞれ計算し、両者の違いを確認する例です。
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
x = np.linspace(1, 10, 50)
# xに対してyが指数的に増加する、非線形だが単調な関係
y = np.exp(x / 3) + rng.normal(0, 5, size=50)
r_pearson, _ = stats.pearsonr(x, y)
r_spearman, _ = stats.spearmanr(x, y)
print(f'ピアソンの相関係数: {r_pearson:.3f}')
print(f'スピアマンの順位相関係数: {r_spearman:.3f}')
このような指数的な単調増加の関係では、ピアソンの相関係数よりもスピアマンの順位相関係数のほうが1に近い値を示す傾向があります。関係の形が直線から離れるほど、この差は大きくなります。相関係数を1種類しか計算していないのに関係が弱いと結論づける前に、関係の形自体を散布図で確認し、必要に応じてスピアマンの順位相関係数も併用することが望ましいと言えます。
相関係数は2変数の関係の強さと向きを1つの数値で表しますが、「\( x \) が1単位増えると \( y \) がどれだけ変化するか」を具体的に予測したい場合には、回帰分析が必要になります。説明変数(独立変数)を1つだけ使う最も単純な形が単回帰分析です。単回帰モデルは次のように書かれます。
\( y = \beta_0 + \beta_1 x + \varepsilon \)
ここで \( \beta_0 \) は切片(\( x = 0 \) のときの \( y \) の予測値)、\( \beta_1 \) は回帰係数(傾き)、\( \varepsilon \) は直線では説明しきれない誤差項です。この \( \beta_0 \) と \( \beta_1 \) をデータから推定する最も標準的な方法が最小二乗法(Ordinary Least Squares, OLS)です。
最小二乗法の考え方は、「実際の観測値 \( y_i \) と、直線が予測する値 \( \hat{y}_i = \beta_0 + \beta_1 x_i \) との差(残差)を2乗し、その総和が最小になるように \( \beta_0 \) と \( \beta_1 \) を選ぶ」というものです。差をそのまま足し合わせるとプラスとマイナスが打ち消し合ってしまうため、2乗してから合計します。この残差平方和を最小にする \( \beta_1 \) は、実は前節までに登場した共分散と分散を使って、次のようにシンプルに書けます。
\( \hat{\beta_1} = \frac{s_{xy}}{s_x^2} \)
そして切片は \( \hat{\beta_0} = \bar{y} – \hat{\beta_1} \bar{x} \) として求まります。この式から、回帰係数 \( \beta_1 \) と相関係数 \( r \) の関係も見えてきます。相関係数の定義 \( r = s_{xy} / (s_x s_y) \) を使って書き換えると、次の関係が成り立ちます。
\( \hat{\beta_1} = r \times \frac{s_y}{s_x} \)
つまり回帰係数は、相関係数に \( y \) と \( x \) の標準偏差の比をかけたものです。相関係数がプラスであれば回帰係数もプラス、マイナスであれば回帰係数もマイナスになり、符号は必ず一致します。また、もし \( x \) と \( y \) をあらかじめ標準化(平均0、標準偏差1に変換)しておけば、\( s_x = s_y = 1 \) となるため、\( \hat{\beta_1} = r \) となり、回帰係数と相関係数はぴったり一致します。回帰係数は「相関係数を、実際の変数の尺度に合わせて引き伸ばしたもの」と理解すると整理しやすくなります。
単回帰分析でしばしば見落とされるのが、「\( x \) から \( y \) を予測する回帰直線」と「\( y \) から \( x \) を予測する回帰直線」が、一般には異なる直線になるという点です。最小二乗法は、縦方向(\( y \) 軸方向)の残差の2乗和を最小にすることで \( x \) から \( y \) への回帰直線を求めています。これに対して \( y \) から \( x \) を予測したい場合は、横方向(\( x \) 軸方向)の残差の2乗和を最小にする、別の最適化問題を解くことになります。
この2本の直線は、どちらも点 \( (\bar{x}, \bar{y}) \) を通る点では共通していますが、傾きは一般に異なります。\( x \) から \( y \) への回帰直線の傾きが \( r \times (s_y / s_x) \) であるのに対し、\( y \) から \( x \) への回帰直線を \( x = a + b y \) の形で求めると、その傾き \( b \) は \( r \times (s_x / s_y) \) となります。この \( x = a + by \) の式を \( y \) について解き直すと、傾きは \( 1 / b = (s_y) / (r \, s_x) \) となり、最初の \( x \) から \( y \) への回帰直線の傾き \( r \times (s_y / s_x) \) とは一致しません。両者が完全に一致するのは、相関係数が \( r = \pm 1 \) の場合、つまりすべての点が1本の直線上に乗っている場合に限られます。
実務での含意は明確です。「\( x \) から \( y \) を予測する回帰式」を単純に逆算して「\( y \) から \( x \) を予測する式」として使い回すことはできません。何を目的変数(予測したい対象)とし、何を説明変数(予測に使う手がかり)とするかによって、当てはめるべき回帰直線そのものが変わる、という点を押さえておく必要があります。

回帰直線を当てはめたら、その直線がデータをどれだけうまく説明できているかを評価する必要があります。そのための代表的な指標が決定係数(\( R^2 \))です。決定係数は、\( y \) の全体のばらつき(全変動)のうち、回帰モデルによって説明できた割合として定義されます。
\( R^2 = 1 – \frac{\sum (y_i – \hat{y}_i)^2}{\sum (y_i – \bar{y})^2} \)
分子は回帰直線でも説明しきれずに残った残差の2乗和、分母は \( y \) がもともと持っていたばらつきの2乗和です。モデルの予測が実際の値にぴったり一致していれば残差はゼロになり \( R^2 = 1 \) に、モデルが平均値をそのまま予測するのと変わらないほど当てはまりが悪ければ \( R^2 \) は0に近づきます。単回帰分析に限っては、この決定係数はピアソンの相関係数の2乗、すなわち \( R^2 = r^2 \) にちょうど一致するという性質があります。相関係数が0.8であれば決定係数は0.64、つまり \( y \) のばらつきの64パーセントが \( x \) によって説明できている、という読み方になります。
ここで注意したいのは、決定係数が高いことが、そのまま「良いモデル」を意味するわけではないという点です。決定係数はあくまで直線への当てはまりの良さを示す統計的な指標であり、そのモデルが業務上意味のある変数を使っているか、将来のデータにも当てはまるか、変数間に因果関係があるかといった点は何も保証しません。たとえば、互いに無関係な2つの時系列データであっても、両方が同じように右肩上がりのトレンドを持っているだけで、決定係数が非常に高い回帰式ができあがることがあります。決定係数だけを根拠にモデルの妥当性を判断するのではなく、残差の分布に規則的なパターンが残っていないか、変数同士の関係が理論的に説明できるか、といった点も合わせて確認する姿勢が求められます。
本章で見てきた相関係数や決定係数は、あくまで2つの変数が「どの程度、どのように連動しているか」を数値化するものであり、一方がもう一方の原因になっているかどうかを直接示すものではありません。アイスクリームと水難事故の例で見たとおり、強い相関の背後に共通の交絡因子が隠れていることは珍しくありませんし、単なる偶然の一致(見せかけの相関)が高い相関係数を生むこともあります。「相関があるからには何らかの施策的な意味がある」と早合点せず、その関係が本当に因果的なものかを見極めるには、相関係数とは別の分析の枠組みが必要になります。ランダム化比較試験(RCT)や差分の差分法(DID)、操作変数法、傾向スコアといった因果推論の手法群がそれにあたり、本シリーズでも独立した1冊としてあらためて扱う予定です。
最後に、statsmodelsを使って単回帰分析を実行し、回帰係数や決定係数を含む要約結果を出力する例を示します。広告費(万円)と売上(万円)という架空のデータを用います。
import pandas as pd
import statsmodels.api as sm
df = pd.DataFrame({
'ad_spend': [120, 150, 200, 90, 180, 220, 130, 160, 210, 100], # 広告費(万円)
'sales': [980, 1120, 1360, 780, 1300, 1500, 1010, 1150, 1420, 830], # 売上(万円)
})
# 説明変数に切片項を加える(add_constantを忘れると切片0の回帰になってしまう)
X = sm.add_constant(df['ad_spend'])
model = sm.OLS(df['sales'], X).fit()
print(model.summary())
コードのポイントを補足します。statsmodelsのOLSは、切片を自動では加えないため、sm.add_constantで定数項の列をあらかじめ説明変数に追加しておく必要があります。これを忘れると、切片が強制的にゼロに固定された回帰式になってしまい、通常想定する単回帰とは異なる結果になるため注意が必要です。fit()を呼び出すことで最小二乗法によるパラメータ推定が実行され、summary()の出力には、回帰係数(coef)とその標準誤差・t値・p値、決定係数(R-squared)、自由度調整済み決定係数などがまとめて表示されます。coefの列に並ぶad_spendの係数が、広告費が1万円増えたときに売上が何万円増えると推定されるかを示す値であり、R-squaredの値は、このデータについてピアソンの相関係数を計算して2乗した値と一致します。p値が小さければ、その回帰係数が統計的に見て偶然のばらつきでは説明しにくい値であることを示しますが、p値の正確な解釈やその落とし穴については、第8章と第11章で詳しく扱います。
『入門統計解析』(倉田博史・星野崇宏、新世社):相関係数と回帰分析を、行列やベクトルを使わない範囲で数式的に丁寧に解説しており、本章で示した最小二乗法の導出や決定係数と相関係数の関係を、より厳密な形で確認したい読者に適しています。演習問題も多く、手を動かして理解を固めたい場合の副読本としても有用です。
前章までは、手元にあるデータをそのまま要約する「記述統計」の考え方を見てきました。平均や分散、標準化、相関係数といった道具は、いずれも「今、目の前にあるデータの姿をどう数値で表すか」という問いに答えるためのものです。
本章からは視点を少し変えます。ビジネスの現場でデータを扱う目的は、手元のデータをきれいに要約するだけでは終わりません。今月の売上データから来月の売上を見積もる、一部の顧客アンケートから全顧客の満足度を推測する、といったように、手元のデータの向こう側にある「まだ見ぬ値」や「全体の姿」を推し量ることが、実務ではむしろ本題になることが多いように思います。この「手元のデータから、その先にあるものを推測する」という営みを扱うのが推測統計であり、本コラムの後半で扱う区間推定や仮説検定は、すべてこの推測統計の枠組みの中にあります。
推測統計が成り立つためには、一つの前提となる発想が必要です。それは「観測されたデータは、何らかの確率的な仕組みによって生成された結果である」とみなす考え方です。例えば、ある商品の1日あたりの販売個数が日によって5個だったり8個だったりするのは、単なる気まぐれではなく、背後に「1日の販売個数はこういう確率で分布する」という仕組みがあり、そこから毎日1つの値がサンプルとして生成されている、と捉えます。この「確率的な生成の仕組み」を数学的に記述する道具が、本章で扱う確率変数と確率分布です。記述統計から推測統計への橋渡しとして、まずこの基礎を丁寧に押さえておきます。
確率変数の話に入る前に、確率そのものについて最小限の言葉を整理しておきます。厳密な公理論に立ち入る必要はありませんが、以降の章で繰り返し使う語彙なので、ここで一度そろえておきます。
まず「試行」とは、結果が偶然に左右される実験や観測の行為そのものを指します。サイコロを1回振る、顧客が来店するかどうかを1件観測する、といった行為が試行にあたります。「事象」とは、その試行の結果として起こりうる出来事のまとまりのことです。サイコロを振って「偶数の目が出る」というのも一つの事象ですし、「6の目が出る」というより細かい事象もあります。そして「確率」は、それぞれの事象がどのくらい起こりやすいかを、0以上1以下の数値で表したものです。互いに重ならない形で全体を尽くす事象(サイコロなら1から6の各目)の確率をすべて足し合わせると必ず1になる、という性質は、以降のPMFやPDFの説明でも土台になります。
実務でとりわけ重要になるのが「条件付き確率」という考え方です。これは「ある事象Bが起きたという条件のもとで、別の事象Aが起きる確率」を表すもので、\( P(A \mid B) \)と書きます。例えば「広告Xを見た人が実際に購入する確率」は、「購入する確率」を無条件に考えるのではなく、「広告Xを見た」という条件をつけたうえでの確率です。条件をつけることで確率の値が変わりうる、という点が条件付き確率の本質です。
この条件付き確率と関連が深いのが「独立」という概念です。2つの事象AとBについて、Bが起きたかどうかを知っても、Aが起きる確率がまったく変わらない場合、AとBは独立であるといいます。数式で書くと\( P(A \mid B) = P(A) \)が成り立つ状態です。逆に言えば、片方の事象を知ることでもう片方の起こりやすさの見立てが変わるなら、その2つの事象は独立ではなく、何らかの関連があるということになります。マーケティング施策の効果検証や、複数の要因が絡む分析では、変数どうしが独立とみなせるかどうかが、モデルの妥当性を左右する重要な論点になります。
なお、条件付き確率を使って「結果から原因を推測する」ための強力な道具として、ベイズの定理という定理が知られています。「事後に得られた情報をもとに、事前の見立てを更新する」という考え方の土台になるもので、迷惑メールの判定や品質検査、A/Bテストの解釈など幅広い場面で応用されています。ベイズの定理そのものの解説と実務への応用は、別のコラムであらためて詳しく取り上げる予定ですので、本章では名前とおおまかな位置づけの紹介にとどめます。
本章の中心となるのが確率変数です。「確率変数」とは、ひとことで言えば「試行の結果として、確率的にどの値が出るかが決まる変数」のことです。記号としては大文字の\( X \)や\( Y \)を使い、その確率変数が実際にとる個々の値は小文字の\( x \)や\( y \)で表す、という書き分けが慣習になっています。
確率変数は、とりうる値の性質によって大きく2種類に分けられます。一つは「離散型確率変数」で、飛び飛びの値、多くの場合は整数のような数え上げられる値をとるものです。もう一つは「連続型確率変数」で、ある範囲の中のどんな実数値でも(理論上は)とりうるものです。
身近な例で整理してみます。
この離散型と連続型の区別は、以降で説明する「確率をどう表現するか」という道具立てに直結します。離散型では確率質量関数(PMF)、連続型では確率密度関数(PDF)という、似て非なる2つの関数を使い分ける必要があるためです。
実務でデータを扱う際には、ある変数を離散型として扱うか連続型として扱うかを、必ずしも厳密に決めなければならないわけではありません。例えば「顧客満足度アンケートの5段階評価」は、値そのものは1・2・3・4・5という飛び飛びの整数ですから離散型ですが、集計の都合上、平均点を出して連続的な指標のように扱うことも多くあります。逆に「年齢」は本来連続的な量ですが、分析の目的によっては「20代・30代・40代」という離散的なカテゴリに区切って扱うこともあります。どちらの型として捉えるかは、その変数の性質だけでなく、分析の目的や使う手法によっても変わってくる、という点は覚えておくとよいでしょう。

離散型確率変数\( X \)について、それぞれの値\( x \)がどのくらいの確率で出現するかを表す関数を、確率質量関数(Probability Mass Function、以下PMF)と呼びます。記法としては\( P(X = x) \)、あるいは\( p(x) \)と書きます。
サイコロの出目を例にとると、公正なサイコロであれば1から6までのどの目も等しい確率で出るはずですから、PMFは次のようになります。
| 出目 x | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| P(X=x) | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 |
このように、確率変数がとりうるすべての値とその確率を並べた表を「確率分布表」と呼びます。PMFが満たすべき性質として重要なのは、次の2点です。
先ほどの来店客数の例であれば、「明日の来店客数が0人である確率」「1人である確率」「2人である確率」というように、来店客数がとりうる値それぞれについて確率を対応づけたものがPMFであり、それを一覧にしたものが確率分布表になります。実務では、過去の来店実績データから経験的にこの分布表を推定し、在庫計画や人員配置の判断材料に使うことがあります。なお、来店客数のように「単位時間あたりに何回何かが起こるか」を表す離散型の確率分布としては、次章以降で扱うポアソン分布がよく用いられます。
連続型確率変数になると、話が少しだけ複雑になります。処理時間のように理論上は無限に細かい値をとりうる変数について、「ちょうど3.271秒になる確率」を考えようとすると、実はその確率は限りなくゼロに近づいてしまいます。とりうる値が無数にありすぎるため、その中のたった一点がぴったり選ばれる確率は、事実上ゼロになってしまうのです。
連続型確率変数を扱ううえで最も誤解されやすいのが、この「一点の確率はゼロである」という性質です。連続型確率変数\( X \)については、ある特定の値\( a \)ちょうどになる確率\( P(X = a) \)は常にゼロとみなします。意味のある確率を考えたいときは、必ず「ある区間に収まる確率」、例えば\( P(8 \leq X \leq 12) \)のように区間で問いを立てる必要があります。
そこで連続型確率変数では、PMFの代わりに「確率密度関数」(Probability Density Function、以下PDF)という関数\( f(x) \)を使います。ここで注意したいのは、PDFの値\( f(x) \)そのものは確率ではない、という点です。密度という言葉が示すとおり、\( f(x) \)は「その付近にどれだけ確率が密集しているか」を表す尺度であり、1を超える値をとることも珍しくありません。実際に確率として意味を持つのは、PDFをある区間で積分した面積の部分です。区間\( [a, b] \)に\( X \)が収まる確率は、次のようにPDFの積分として定義されます。
\( P(a \leq X \leq b) = \displaystyle\int_a^b f(x)\,dx \)
PDFが満たすべき性質も、PMFと対応する形で整理できます。
実務でよく使われる代表的な連続型分布としては、正規分布(釣り鐘型の左右対称な分布で、身長や測定誤差など多くの自然・社会現象の近似に使われます)や、指数分布(次の出来事が起こるまでの待ち時間を表すのによく使われます)などがあります。これらの具体的な形と使いどころは、次章以降であらためて詳しく扱います。

離散型・連続型のどちらの確率変数についても共通して定義できる、もう一つ重要な関数があります。それが累積分布関数(Cumulative Distribution Function、以下CDF)です。CDFは、確率変数\( X \)がある値\( x \)以下になる確率を表す関数で、次のように定義されます。
\( F(x) = P(X \leq x) \)
離散型であれば、\( x \)以下のすべての値についてPMFを足し合わせたものがCDFになります。連続型であれば、マイナス無限大から\( x \)までPDFを積分したものがCDFです。CDFは必ず0から1の範囲におさまり、\( x \)が大きくなるにつれて単調に増加していく(減少することはない)という性質を持ちます。
CDFを使うと、「ある区間に収まる確率」を簡単に計算できます。連続型であれば\( P(a \leq X \leq b) = F(b) – F(a) \)という形で、2つのCDFの差として求められます(離散型では境界の扱いに注意が必要で、整数値をとる変数なら\( F(b) – F(a-1) \)とします)。連続型確率変数の区間確率を都度積分で求めるのは実務上手間がかかりますが、CDFさえ分かっていれば引き算だけで済みます。
CDFの応用として実務でよく使われるのが「パーセンタイル」です。パーセンタイルとは、CDFの逆の発想で、「累積確率がちょうどある値になるような\( x \)は何か」を求めるものです。例えば「処理時間の90パーセンタイル」とは、「全体の90%がその時間以内に収まるような処理時間の値」を意味します。CDFを\( F \)としたとき、90パーセンタイルは\( F(x) = 0.90 \)を満たす\( x \)であり、これはCDFの逆関数を使って\( x = F^{-1}(0.90) \)と表せます。この逆関数は、システムの性能指標(レイテンシのp95、p99など)や、品質管理の許容範囲を定める場面で頻繁に登場する考え方です。
特にIT系のシステム運用の現場では、平均応答時間だけを見て「問題なし」と判断してしまうと、ごく一部のユーザーが極端に長い待ち時間を経験している状況を見落とすことがあります。p95(95パーセンタイル)やp99(99パーセンタイル)を合わせて監視するのは、こうした分布の裾野に隠れた問題を見逃さないための工夫だといえます。
確率分布の形が分かったところで、その分布を代表する数値として最も基本的なものが「期待値」です。期待値は、確率変数がとりうる値を、その値が出る確率で重みづけして平均をとったもので、分布の「重心」にあたる値です。離散型確率変数の期待値は次のように定義されます。
\( E[X] = \displaystyle\sum_i x_i\, p(x_i) \)
連続型確率変数であれば、和の代わりに積分を使い、\( E[X] = \int_{-\infty}^{\infty} x f(x)\,dx \)となります。サイコロの例であれば、期待値は\( 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + \cdots + 6 \times \frac{1}{6} = 3.5 \)と計算でき、これは「サイコロを非常に多くの回数振ったとき、出目の平均が近づいていく値」という解釈ができます。
期待値には「線形性」という、実務上とても扱いやすい性質があります。これは、確率変数の和の期待値は、それぞれの期待値の和に等しい、というものです。
\( E[X + Y] = E[X] + E[Y] \)
この性質は、\( X \)と\( Y \)が互いに独立かどうかに関わらず常に成り立つという点が重要です。例えば「複数の店舗の売上を足し合わせた全社売上の期待値」は、各店舗が互いに影響し合っていようがいまいが、各店舗の売上の期待値を単純に足し合わせるだけで求められます。定数倍についても\( E[aX] = aE[X] \)が成り立つため、期待値は非常に扱いやすい指標だといえます。
もう一つ欠かせないのが「分散」です。分散は、確率変数の値が期待値からどれだけばらついているかを表す指標で、次のように定義されます。
\( V[X] = E[(X – E[X])^2] \)
期待値からの偏差を2乗して、その期待値をとったものが分散です。分散の正の平方根をとったものが標準偏差で、こちらは元の変数と同じ単位で解釈できるため、実務ではむしろ標準偏差のほうがよく使われます。
実務における意思決定では、「期待値だけを見て判断する」ことの限界を意識しておく必要があります。期待値はあくまで分布の重心を示す一つの代表値にすぎず、その周りにどれだけばらつきがあるか(分散・標準偏差)、さらには極端に悪い結果がどの程度の確率で起こりうるか(裾野のリスク)までを合わせて見て、初めて分布の全体像を捉えたことになります。期待収益が同じ2つの投資案件があったとしても、一方は結果が安定しており、もう一方は大きく上振れも下振れもする、ということは珍しくありません。期待値という一つの数字に判断を委ねきってしまうと、こうしたリスクの違いを見落としてしまいます。
例えば、ある新規事業案Aと案Bがあり、どちらも期待利益が同じ1,000万円だったとします。案Aは常にほぼ1,000万円前後で着地する見込みである一方、案Bは50%の確率で3,000万円の利益が出るが、残り50%の確率で1,000万円の損失が出る、という分布だったとしましょう。期待値だけを比べれば両者は互角ですが、分散(ばらつき)を見れば案Bのほうがはるかにリスクが大きいことが分かります。どちらを選ぶべきかは、その組織がどれだけリスクをとれるかという方針次第であり、期待値という一つの数字だけでは決められない判断です。
本章の締めくくりとして、離散型確率変数の中でもとりわけ基本的な「ベルヌーイ試行」を紹介します。ベルヌーイ試行とは、結果が「成功」か「失敗」の2通りしかない試行のことです。コインを1回投げて表か裏か、広告を1回配信してクリックされるかされないか、製品を1個検査して不良品か否か、といったものがすべてベルヌーイ試行にあたります。
ベルヌーイ試行に従う確率変数\( X \)は、成功を1、失敗を0という値で表すのが一般的です。成功する確率を\( p \)とすると、そのPMFは次のように書けます。
\( P(X=1) = p, \quad P(X=0) = 1-p \)
このとき期待値は\( E[X] = p \)、分散は\( V[X] = p(1-p) \)という、非常にシンプルな形になります。1回だけのベルヌーイ試行そのものは単純ですが、実務で本当に知りたいのは「このベルヌーイ試行をn回繰り返したとき、成功が何回起こるか」という問いであることがほとんどです。例えば「広告をn回配信したとき、クリックされる回数は何回になりそうか」「n個の製品を検査したとき、不良品は何個見つかりそうか」といった問いです。
このように、独立なベルヌーイ試行をn回繰り返した際の成功回数を表す確率変数が従う分布を「二項分布」と呼びます。次章では、この二項分布を中心に、離散型分布の代表的な顔ぶれと、それぞれの実務での使いどころを詳しく見ていきます。
ここまでの内容を、Pythonのscipy.statsライブラリを使って手を動かしながら確認してみます。scipy.statsでは、多くの確率分布についてpmf(離散型)、pdf(連続型)、cdf(累積分布)、ppf(パーセンタイル、CDFの逆関数)といったメソッドが共通のインタフェースで用意されています。
まずは離散型の例として、サイコロの出目を一様分布(randint)で表し、PMFとCDFを計算してみます。
from scipy import stats
# サイコロの出目(1~6)を表す確率変数。randint(low, high)はlow以上high未満の一様分布
dice = stats.randint(1, 7)
for x in range(1, 7):
print(f"P(X={x}) = {dice.pmf(x):.4f}")
# 出目が3以下になる確率(CDF)
print(f"P(X<=3) = {dice.cdf(3):.4f}")
# 期待値と分散もメソッドで確認できる
print(f"E[X] = {dice.mean():.4f}, V[X] = {dice.var():.4f}")
実行すると、いずれの目についても確率が約0.1667(1/6)であること、出目が3以下になる確率が0.5であること、期待値が3.5であることが確認できます。
続いて、連続型の例として、ある処理にかかる時間が平均10分・標準偏差2分の正規分布に従うと仮定し、区間の確率とパーセンタイルを計算してみます。
from scipy import stats
# 処理時間(分)が平均10分、標準偏差2分の正規分布に従うと仮定
proc_time = stats.norm(loc=10, scale=2)
# 処理時間がちょうど10分になる「density(PDF値)」であって確率ではない点に注意
print(f"f(10) = {proc_time.pdf(10):.4f} (これは確率ではなく密度)")
# 処理時間が8分から12分の間に収まる確率(区間で計算する)
prob = proc_time.cdf(12) - proc_time.cdf(8)
print(f"P(8<=X<=12) = {prob:.4f}")
# 上位10%、つまり90パーセンタイルに相当する処理時間
p90 = proc_time.ppf(0.90)
print(f"90パーセンタイル(p90) = {p90:.2f}分")
このコードを実行すると、8分から12分の間に収まる確率が約68.3%であること、また90パーセンタイルがおよそ12.56分であることが分かります。pdf(10)の値そのもの(密度)は約0.1994となりますが、これは確率ではなく、あくまで区間積分の材料になる密度の値である点に注意してください。
最後に、期待値の考え方をシミュレーションで体感してみます。サイコロを何度も振ったときの標本平均が、理論的な期待値3.5に近づいていく様子を確認します。
import numpy as np
rng = np.random.default_rng(42)
for n in [10, 100, 1000, 100_000]:
samples = rng.integers(1, 7, size=n) # サイコロをn回振る(1~6の整数)
print(f"n={n:>7,}回: 標本平均 = {samples.mean():.4f}")
print("理論的な期待値 E[X] =", sum(x * (1 / 6) for x in range(1, 7)))
試行回数nを増やすほど、標本平均が理論値の3.5に近づいていく様子が確認できます。この「試行回数を増やすほど標本平均が理論的な期待値に近づいていく」という性質は大数の法則と呼ばれるもので、次章以降で扱う中心極限定理とあわせて、推測統計の土台を支える重要な性質です。詳しくは後続の章であらためて扱います。

『はじめての統計学』(鳥居泰彦、日本経済新聞出版):確率変数や確率分布の基礎を、数式の展開を丁寧に追いながら解説している定番の入門書です。本章で最小限にとどめた確率の公理的な整理や、期待値・分散の導出過程をじっくり数式で追いたい読者にとって、良い補完になる一冊だと思います。
ここまでの章では、平均や分散といった記述統計の道具、そしてデータの散らばりを整理する考え方を扱ってきました。本章からは視点を少し変え、「データがどのような仕組みで生まれてくるのか」というモデル化の話に入ります。ここで登場するのが確率分布です。
確率分布は、単に数式やグラフの形として覚えるものではありません。確率分布とは、目の前の現象を生み出している背後のプロセスについての、ひとつの仮説だと捉えるのが実務では有効です。コンバージョン数、コールセンターへの着信、機械の故障間隔、営業の成約までの試行回数。これらはどれも一見バラバラな現象ですが、「何が起きているか」を分解すると、共通する構造がいくつかのパターンに収まります。そのパターンにあらかじめ名前と数式を与えておいたものが、二項分布やポアソン分布といった確率分布です。
現象に合った分布を選べれば、平均的な振る舞いだけでなく、「どれくらいの幅でばらつくか」「どのくらいの確率で極端な値が起きるか」まで見積もれるようになります。逆に分布の選び方を誤ると、リスクの見積もりや必要な人員・在庫の計算が的外れになりかねません。本章では、ビジネスの現場で特に登場頻度の高い5つの分布、二項分布、ポアソン分布、幾何分布、指数分布、正規分布を取り上げ、それぞれがどのような生成プロセスを表しているのか、どう使い分ければよいのかを整理します。

最初に扱うのは二項分布です。二項分布が表す生成プロセスは非常に単純で、「成功確率が \( p \) で一定の試行を、独立に \( n \) 回繰り返したとき、成功が何回起きるか」というものです。試行のたびに成功か失敗かの2択しかなく、かつ1回ごとの結果が他の回の結果に影響を与えない、という2つの前提が成り立つ場面で当てはまります。
ちょうど \( k \) 回成功する確率は次の式で表されます。
\( P(X=k) = \binom{n}{k}p^k(1-p)^{n-k} \)
\( \binom{n}{k} \) は「\( n \) 回のうちどの \( k \) 回で成功したか」という組み合わせの数を表しています。この分布の期待値(平均的にどれくらい成功するか)は \( np \)、分散は \( np(1-p) \) というシンプルな形になります。試行回数が多いほど、また成功確率が0.5に近いほど分散は大きくなり、成功確率が0や1に近づくほど結果が安定する、という直感とも一致します。
ビジネスの現場では、二項分布は驚くほど頻繁に登場します。代表的なのはWebサイトのコンバージョン数です。1日に1,000人が訪問し、1人あたりの購入確率が3パーセントで一定とみなせるなら、その日の購入者数は \( n=1000 \)、\( p=0.03 \) の二項分布に従うとモデル化できます。期待値は30人、分散は \( 1000 \times 0.03 \times 0.97 \approx 29.1 \) となり、標準偏差はおよそ5.4人です。つまり「30人前後、だいたい20人台後半から30人台後半の範囲で日々ぶれる」という見通しが、平均値だけを見ているときよりずっと具体的に立てられます。
製造業の品質管理も典型例です。1ロット500個の製品のうち、工程の不良率が1パーセントで安定しているなら、そのロットに含まれる不良品の個数は \( n=500 \)、\( p=0.01 \) の二項分布でモデル化できます。期待値は5個ですが、実際には0個の日もあれば10個を超える日もあり得ます。この「ばらつきの幅」を二項分布から計算しておくことで、何個以上の不良が出たら工程異常を疑うべきか、という管理基準を設計する土台になります。A/Bテストの成約数、メール配信の開封数、採用面接での合格者数なども、条件が満たされる限り同じ枠組みで扱えます。
二項分布には、成功確率 \( p \) が非常に小さく、試行回数 \( n \) が非常に大きいという極端な状況があります。「1年間に交通事故に遭う確率」のように、1回あたりの発生確率はごくわずかでも、試行の機会そのものは無数にある、という状況です。この極限で二項分布がどんな形に近づくかを考えたのがポアソン分布です。
直感的に説明すると、1時間という区間を非常に細かい時間の断片(たとえば1秒ごと)に分割し、それぞれの断片で「事故が起きるか起きないか」という二択の試行が行われていると考えます。断片の数 \( n \) は膨大ですが、1つの断片で事故が起きる確率 \( p \) は極めて小さく、その積 \( np \) だけが一定の値 \( \lambda \) に収束するように \( n \) を大きくしていきます。この極限操作を実際に計算すると、二項分布の式は次のポアソン分布の式に収束することが数学的に示されます。
\( P(X=k) = \dfrac{\lambda^k e^{-\lambda}}{k!} \)
ポアソン分布が表しているのは、「平均して \( \lambda \) 回起きる稀な事象が、ある一定の期間や区域の中で、実際に何回起きるか」という回数そのものです。この分布の際立った性質は、期待値と分散がどちらも同じ \( \lambda \) になることです。二項分布では分散が \( np(1-p) \) と期待値より小さくなるのに対し、ポアソン分布では平均を知れば分散も同時に定まります。この性質は理論上便利である一方、後述するように現実のデータでは崩れることも多く、注意が必要な点でもあります。
ポアソン分布の応用範囲は極めて広く、「単位時間あたり、あるいは単位面積・単位個数あたりに、ランダムに散発する稀な事象の回数」を扱う場面全般に当てはまります。コールセンターへの1時間あたりの着信数、生産ラインでの1日あたりの設備故障件数、工場の労働災害件数、交通事故の発生件数、店舗への1時間あたりの来店客数などが典型例です。たとえばコールセンターで過去の実績から1時間あたりの平均着信数が \( \lambda=20 \) 件だと分かっていれば、「1時間に30件以上の着信が来る確率」をポアソン分布から直接計算でき、繁忙時間帯に必要なオペレーター人数の設計に使えます。
ここで、二項分布とポアソン分布の関係を実際にコードで確認しておきます。試行回数 \( n \) が大きく成功確率 \( p \) が小さい状況を用意し、両者の確率質量関数がどれだけ近い値になるかを比較します。
from scipy import stats
import numpy as np
# コールセンターへの1時間あたりの着信を、二項分布とポアソン分布の
# 両方でモデル化して近似の精度を確認する
n = 1000 # 1時間のうちに着信が発生しうる機会の数(目安)
p = 0.02 # 1回の機会あたりの着信確率
lam = n * p # ポアソン分布のパラメータ lambda = np = 20
k = np.arange(0, 41)
binom_pmf = stats.binom.pmf(k, n, p)
poisson_pmf = stats.poisson.pmf(k, lam)
for kk in [10, 15, 20, 25, 30]:
print(f"着信数k={kk}: 二項分布={binom_pmf[kk]:.4f} "
f"ポアソン分布={poisson_pmf[kk]:.4f}")
# 30件以上の着信が来る確率(生存関数 sf = 1 - cdf を利用)
print("30件以上になる確率(ポアソン近似):",
stats.poisson.sf(29, lam).round(4))
実行すると、\( n \) が大きく \( p \) が小さいこの設定では、二項分布とポアソン分布の確率値がほとんど一致することが確認できます。実務上は、成功確率が数パーセント以下で試行回数が数百から数千に及ぶような稀な事象のカウントであれば、計算がより簡単なポアソン分布で近似してしまって差し支えないケースが大半です。
二項分布やポアソン分布が「決まった回数や期間の中で何回成功するか」を数えるのに対し、視点を変えて「初めて成功するまでに何回試行が必要か」を考えるのが幾何分布です。成功確率が \( p \) で一定の独立試行を繰り返したとき、\( k \) 回目で初めて成功する確率は次の式になります。
\( P(X=k) = (1-p)^{k-1}p \)
これは「\( k-1 \) 回連続で失敗し、\( k \) 回目にようやく成功する」という事象の確率をそのまま式にしたものです。期待値は \( \frac{1}{p} \) となり、成功確率が低いほど、初めての成功までに必要な試行回数の見込みが大きくなるという、直感どおりの結果が導かれます。
幾何分布のビジネス上の典型例は営業活動です。ある営業担当者の1回のアプローチあたりの成約確率が25パーセントだとすると、初めて成約に至るまでに必要なアプローチ回数は幾何分布に従い、期待値は \( 1/0.25=4 \) 回になります。この考え方は、新規開拓の営業パイプライン設計や、必要な見込み客リストの規模を見積もる際の基礎になります。ほかにも、求人応募が初めて採用に至るまでの応募社数、あるいは品質検査で初めて不良品を発見するまでの検査個数なども、同じ枠組みで捉えられます。実務でしばしば誤解されるのは、「4回やれば必ず成約する」という理解ですが、これは誤りです。期待値の4回はあくまで平均的な見込みであり、1回目で成約することもあれば、10回失敗しても成約に至らないことも起こり得ます。この幅を含めて計画に織り込むことが重要です。
ポアソン分布が「一定期間に何回起きるか」という回数を扱うのに対し、その裏側で「次の事象が起きるまでどれだけ時間がかかるか」という間隔を扱うのが指数分布です。ポアソン分布と指数分布は、同じ現象を回数の側から見るか、時間の側から見るかという、いわば表と裏の関係にあります。単位時間あたり平均 \( \lambda \) 回のペースでランダムに事象が発生するとき、次の事象が起きるまでの待ち時間 \( X \) は、次の確率密度関数を持つ指数分布に従います。
\( f(x) = \lambda e^{-\lambda x} \quad (x \geq 0) \)
期待値は \( \frac{1}{\lambda} \) です。たとえばコールセンターへの着信が1時間あたり平均20件のペースで発生している(ポアソン分布で \( \lambda=20 \))なら、次の着信までの平均待ち時間は \( 1/20 \) 時間、つまり3分になります。機械の故障が年平均2回のペースで起きるなら、次の故障までの平均間隔は0.5年、という具合です。
指数分布の性質でとりわけ興味深いのが無記憶性です。これは、「すでにどれだけの時間が経過しているか」が、これから先の待ち時間の分布にまったく影響しないという性質です。数式で書くと、任意の \( s, t \geq 0 \) について次が成り立ちます。
\( P(X > s+t \mid X > s) = P(X > t) \)
たとえば、ある機械が500時間ノートラブルで稼働してきたとしても、指数分布に従う限り、そこから先の残り寿命の分布は「まっさらな新品の機械」の寿命分布とまったく同じになります。「これだけ長く壊れずに動いているのだから、そろそろ寿命だろう」という直感は、指数分布の世界では成り立ちません。これは経年劣化や摩耗によって故障しやすくなる実際の機械の振る舞いとは相容れない側面でもあり、指数分布が「偶発的な故障」をモデル化するには適していても、「摩耗による故障」を扱うには不向きであることを示しています。摩耗を考慮したい場合は、指数分布を一般化したワイブル分布が使われることが多く、これは信頼性工学の分野で標準的に採用されている手法です。
幾何分布と指数分布、そしてポアソン分布の関係を、乱数生成を通じて確認してみます。幾何分布は離散的な試行回数を、指数分布は連続的な待ち時間を扱う点が異なりますが、どちらも「無記憶性」という共通の性質を持つ点に注目してください。
from scipy import stats
import numpy as np
rng = np.random.default_rng(42)
# 幾何分布: 成約確率p=0.25の営業活動で、初めて成約するまでの回数
p = 0.25
geo_samples = stats.geom.rvs(p, size=10000, random_state=rng)
print(f"平均アプローチ回数: {geo_samples.mean():.2f}"
f" (理論値 1/p = {1/p:.2f})")
# 指数分布: 平均故障間隔が500時間の機械
scale = 500 # scipyのexponはscale = 1/lambdaで指定する
exp_samples = stats.expon.rvs(scale=scale, size=10000, random_state=rng)
print(f"平均故障間隔: {exp_samples.mean():.1f}時間"
f" (理論値 {scale}時間)")
# 無記憶性の確認: 300時間まで生き延びた個体だけを取り出し、
# そこからの残り時間の平均を、全体の平均寿命と比較する
t0 = 300
survivors = exp_samples[exp_samples > t0]
remaining = survivors - t0
print(f"300時間経過後の残り時間の平均: {remaining.mean():.1f}時間")
このコードを実行すると、「300時間経過後の残り時間の平均」が、全体の平均故障間隔である500時間とほぼ同じ値になることが確認できます。これが無記憶性を数値の上で体感する方法です。
ここまでの4つの分布は、いずれも「成功か失敗か」「稀な事象の回数」「初めての成功までの試行」「事象間の待ち時間」という、比較的具体的な生成プロセスに紐づいていました。これに対して正規分布は、もう少し抽象度の高い理由で、統計学のあらゆる場面に登場します。
正規分布が広く現れる最大の理由は、「独立した複数の小さな要因が積み重なって1つの測定値を作り出すとき、その合計はほぼ正規分布に近づく」という中心極限定理にあります。中心極限定理そのものは次章で詳しく扱いますが、ここでは直感だけ押さえておきます。たとえば製品の重量には、原材料のわずかな配合誤差、機械の振動、温度や湿度の微妙な変化など、無数の小さな要因が影響します。個々の要因がどんな分布に従っていようと、それらが独立に足し合わさった結果としての重量のばらつきは、驚くほど正規分布に近い形に収束する傾向があります。測定誤差や自然界の多くの量が正規分布に従って見えるのは、偶然ではなくこの「小さな要因の積み重ね」という構造がバックグラウンドにあるためです。
正規分布のもう1つの重要な性質が再生性です。正規分布に従う複数の確率変数を独立に足し合わせると、その和もまた正規分布に従います。具体的には、平均 \( \mu_1 \)、分散 \( \sigma_1^2 \) の正規分布と、平均 \( \mu_2 \)、分散 \( \sigma_2^2 \) の正規分布に従う独立な確率変数の和は、平均 \( \mu_1+\mu_2 \)、分散 \( \sigma_1^2+\sigma_2^2 \) の正規分布に従います。この性質があるおかげで、複数の工程を経て積み上がる誤差の分布や、複数商品の売上を合算した際の総売上のばらつきを、個々の分布の情報から直接計算できます。分布の形が計算の途中で崩れず正規分布のまま維持される、という扱いやすさが、正規分布が理論・実務の両面で重宝される理由の1つです。
実務上とりわけ便利なのが、二項分布の正規近似です。試行回数 \( n \) が十分大きいとき、二項分布は平均 \( np \)、分散 \( np(1-p) \) の正規分布でよく近似できることが知られています。目安として、\( np \) と \( n(1-p) \) がともに5以上、実務ではより安全側に見て10以上あれば、この近似は十分な精度を持つとされています。この近似を使うと、コンバージョン数や不良品数のような二項分布に従う量について、「何個から何個の範囲に何パーセントの確率で収まるか」といった区間の見積もりを、正規分布の性質を使って簡単に計算できるようになります。次の章で扱う区間推定や仮説検定の多くも、この正規近似を土台にしています。
二項分布と、それを近似する正規分布を実際に重ねて描き、近似の様子を確認します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
n, p = 200, 0.3
k = np.arange(n + 1)
binom_pmf = stats.binom.pmf(k, n, p)
mu = n * p
sigma = np.sqrt(n * p * (1 - p))
normal_pdf = stats.norm.pdf(k, loc=mu, scale=sigma)
fig, ax = plt.subplots(figsize=(8, 4))
ax.bar(k, binom_pmf, alpha=0.5, label=f"二項分布 Binom({n}, {p})")
ax.plot(k, normal_pdf, color="crimson", linewidth=2,
label=f"正規近似 N({mu:.0f}, {sigma:.1f}^2)")
ax.set_xlim(mu - 4 * sigma, mu + 4 * sigma)
ax.set_xlabel("成功回数")
ax.set_ylabel("確率")
ax.legend()
plt.tight_layout()
plt.savefig("binom_normal_overlay.png", dpi=150)
# 70回以上成功する確率を、二項分布の厳密計算と正規近似の両方で求める
exact = stats.binom.sf(69, n, p)
approx = stats.norm.sf(69.5, loc=mu, scale=sigma) # 連続性補正込み
print(f"厳密値(二項分布): {exact:.4f}")
print(f"近似値(正規分布、連続性補正あり): {approx:.4f}")

このコードで得られるグラフでは、棒グラフで示した二項分布の確率質量関数に、赤い曲線の正規分布がほぼ重なって見えます。連続性補正(離散分布を連続分布で近似する際に0.5だけ境界をずらす調整)を加えると、近似値と厳密値の差はさらに小さくなります。
本章で扱った5つの分布は、それぞれ異なる生成プロセスに対応しています。分布を選ぶ際にまず確認すべきは、パラメータの数値そのものより先に、「自分が扱っているデータは、成功と失敗の繰り返しなのか、稀な事象の回数なのか、初めての成功までの試行数なのか、事象間の待ち時間なのか、それとも多数の要因の積み重ねなのか」という生成プロセスの見極めです。この見極めを飛ばして数式だけを当てはめると、期待値は合っていてもばらつきの見積もりが的外れになる、という事態が起こりやすくなります。
ここまで見てきた分布同士の関係を整理すると、以下の表のようにまとめられます。扱う量の種類とパラメータの意味を押さえておくと、初めて出会うデータに対してもどの分布を候補にすべきか見当がつけやすくなります。
| 分布名 | 扱う量 | パラメータ | 代表的なビジネス適用例 |
|---|---|---|---|
| 二項分布 | n回の試行のうち成功した回数 | 試行回数n、成功確率p | コンバージョン数、不良品数、A/Bテストの成約数 |
| ポアソン分布 | 一定期間・区域内で発生する稀な事象の回数 | 平均発生回数λ | コールセンターの着信数、設備の故障件数、事故件数 |
| 幾何分布 | 初めて成功するまでの試行回数 | 成功確率p | 初回成約までの営業アプローチ回数、初めて不良を検出するまでの検査数 |
| 指数分布 | 次の事象が起きるまでの待ち時間 | 発生率λ(平均間隔は1/λ) | 機械の故障間隔、次の着信までの待ち時間 |
| 正規分布 | 多数の独立な要因が積み重なった連続量 | 平均μ、分散σ² | 製品重量・寸法のばらつき、測定誤差、二項分布の近似 |
この表からも分かるとおり、二項分布とポアソン分布、幾何分布と指数分布は、それぞれ離散版と連続版のような対応関係にあります。二項分布の極限がポアソン分布であるように、幾何分布(何回目の試行で成功するか、という離散的な回数)を連続時間に置き換えたものが指数分布(いつ事象が起きるか、という連続的な時間)にあたります。そして正規分布は、それらの個別の生成プロセスとは別の理由、すなわち多数の要因の積み重ねという理由で、あらゆる分布の近似先として顔を出します。
ここまで紹介してきた分布は、いずれも現実の複雑な現象を単純化した数学的なモデルです。モデルである以上、実際のデータが理論分布どおりに振る舞うとは限らない、という点は常に意識しておく必要があります。
代表的な落とし穴が過分散です。ポアソン分布では期待値と分散が理論上一致しますが、実際のカウントデータでは分散が期待値を大きく上回るケースが頻繁に観測されます。これを過分散と呼びます。原因としてよくあるのは、本来は一定であるべき発生率λが、実は日や店舗、担当者によって異なっているのに、それを無視して1つのポアソン分布で全体をまとめて扱ってしまうケースです。たとえば店舗ごとの来店客数を1つのポアソン分布でモデル化すると、繁盛店と閑散店の差が「ばらつきの過大評価」として現れ、分散が理論値より膨らみます。過分散が疑われる場合には、ポアソン分布よりパラメータが1つ多く、ばらつきを柔軟に表現できる負の二項分布が代替の選択肢としてよく使われます。
もう1つの注意点は裾の重い分布の存在です。正規分布は、平均から大きく離れた極端な値が出現する確率が、理論上は指数関数的な速さで急激に小さくなっていきます。ところが金融市場のリターンやWebサイトのアクセス数、自然災害の被害規模といったデータでは、正規分布が想定するよりもはるかに高い頻度で極端な値が観測されることが知られています。このような性質を裾が重いと表現し、正規分布だけでリスクを見積もると、「めったに起きないはずの極端な事象」の発生確率を実際より小さく見積もってしまう危険があります。裾の重いデータには、t分布やパレート分布、対数正規分布など、極端な値をより許容する形の分布を検討する必要があります。
実務での対処としては、まず理論分布を当てはめる前に、実際のデータのヒストグラムを描いて理論分布の形と見比べること、そして平均と分散の関係(ポアソン分布なら両者が一致しているか)や、極端な値の出現頻度(正規分布が想定する頻度と比べて多すぎないか)を確認することが基本になります。理論分布はあくまで出発点であり、データがそこから外れているという発見自体が、その現象について何かを教えてくれる重要な手がかりになります。
『Pythonで理解する統計解析の基礎』(谷合廣紀、技術評論社)は、確率分布の数式的な定義とPythonによる実装を並行して学べる構成になっており、本章で扱った二項分布・ポアソン分布・正規分布などをscipy.statsで実際に手を動かしながら確認したい読者に適しています。数式の導出も丁寧に示されているため、パラメータの意味を数式レベルで理解し直したい場合の副読本としても役立ちます。
ここまでの章では、手元にあるデータそのものの特徴を要約する記述統計と、コインの表裏や不良品の発生確率といった不確実な現象をモデル化する確率分布を扱ってきました。本章からは、統計学のもう一つの大きな柱である推測統計に入ります。記述統計が「今ここにあるデータの中身を語る」ための道具だとすれば、推測統計は「手元にある限られたデータから、まだ見ていない全体について語る」ための道具です。
企業のマーケティング調査や品質管理、Webサービスのアクセス解析で扱うデータのほとんどは、本当に知りたい対象のすべてではなく、その一部にすぎません。それでも多くの意思決定では、手元のデータの先にある全体像、つまり全顧客の反応や市場全体の動向について結論を出す必要があります。この「一部から全体を推し測る」という飛躍を、勘や思い込みではなく数学的な裏付けをもって行うための考え方が、本章で扱う推測統計の骨格です。大数の法則と中心極限定理という2つの定理が、その骨格を支える土台になります。
統計学では、知りたい対象の集団全体を母集団(ぼしゅうだん)と呼びます。国内の全消費者、自社製品を使う可能性のあるすべての潜在顧客、工場で製造される製品のすべて、といった対象がこれにあたります。これに対して、母集団から実際に取り出して観測した一部分を標本(サンプル)と呼びます。推測統計とは、この標本の情報をもとに、母集団の性質(平均や比率、ばらつきなど)を推し量り、あわせてその推測がどの程度確からしいかを定量的に評価するための一連の考え方です。
母集団のすべてを調べ尽くす調査を全数調査(センサス)と呼びます。国勢調査はその代表例ですが、これは国家規模の予算と時間をかけて初めて実現できる例外的な調査です。企業の実務においては、全顧客・全ユーザーの意見を一人残らず聞く、製造したすべての製品を検査する、といった全数調査は、コストや時間の制約から現実的でないことがほとんどです。製品の耐久性を調べる検査のように、検査そのものによって製品が壊れてしまう破壊検査では、そもそも全数検査という選択肢自体が存在しません。だからこそ、一部の標本から全体を推測する技術が必要になります。
ここで重要なのは、発想の転換です。手元にあるデータを「これがすべてだ」と捉えてしまうと、そこから得られる示唆は手元のデータの範囲にとどまってしまいます。しかし手元のデータを「水面に浮かぶ氷山のうち、水面上に見えている一角にすぎない」と捉え直すと、見え方が変わります。水面上に見えている部分の形や大きさから、水面下に広がる氷山全体の輪郭を、一定の不確かさを認めたうえで推し量ろうとする営みこそが推測統計です。手元のデータの奥に、まだ見ていないはるかに大きな母集団が広がっている、という前提に立つことが、本章以降を理解するうえでの出発点になります。

推測統計の理論、とりわけ本章で扱う大数の法則や中心極限定理は、標本が母集団から無作為に抽出されていることを前提として成り立っています。無作為抽出(ランダムサンプリング)とは、母集団に含まれるどの要素も、等しい確率で標本に選ばれるように抽出する方法のことです。この前提が崩れた標本、つまり偏った方法で集められた標本からは、どれだけ精緻な計算を行っても、母集団全体に対して正しい結論を導くことはできません。
偏った標本抽出が引き起こす失敗として広く知られているのが、1936年のアメリカ大統領選挙をめぐる世論調査の事例です。ある雑誌社が実施した調査では、約1000万人に調査票を送付し、230万件を超える回答を集めました。件数だけを見れば当時としては大規模な調査でしたが、調査対象を電話帳や自動車登録者名簿などから選んだため、当時まだ電話や自動車を所有していた相対的に裕福な層に回答者が偏り、結果として実際の選挙結果とは大きく異なる予測を発表することになりました。この事例が示すのは、標本の件数を増やすことでは、抽出方法の偏りそのものは解消できないという教訓です。
実務で起こりやすい偏りには、いくつかの典型パターンがあります。整理すると次のとおりです。
この論点は、ビッグデータを扱う現在の実務でこそ、あらためて意識する価値があります。自社が保有するCRMの顧客データ、ECサイトのアクセスログ、会員アプリの利用履歴は、件数だけで見れば数百万件、数千万件に達することも珍しくありません。しかし、これらのデータは市場全体、あるいは潜在顧客全体からの無作為抽出では全くありません。実際には、すでに自社の商品やサービスを認知し、購入や登録に至った人という、時点ですでに選別された集団のデータです。競合他社を選んだ人、そもそも自社の存在を知らなかった人、興味を持ったが離脱してしまった人の情報は、この標本には含まれていません。データの件数が多いという事実は、そのデータが母集団を代表していることを何ら保証しないのです。
データの件数が多いことと、そのデータが母集団を代表していることは、まったく別の話です。自社の保有データがどれほど大規模であっても、それは「すでに自社と接点を持った人々」という条件で選別された標本にすぎず、市場全体や潜在顧客全体を無作為に代表しているわけではありません。分析結果を社外や将来の顧客層にまで一般化する際には、この前提を常に意識しておく必要があります。
推測統計を学び進めるうえで、最初につまずきやすいのが記号の使い分けです。母集団の性質を表す値を母数(パラメータ)と呼び、通常は真の値が未知の定数として扱われます。これに対して、標本から実際に計算した値を標本統計量と呼び、どの標本を取り出したかによって値が変動する確率変数として扱われます。この2つを区別するため、統計学では慣習として、母数にはギリシャ文字を、標本統計量にはローマ字を用います。整理すると次のとおりです。
| 概念 | 母集団(母数) | 標本(標本統計量) |
|---|---|---|
| 大きさ | N(母集団の大きさ) | n(標本サイズ) |
| 平均 | μ(母平均、ミュー) | x̄(標本平均、エックスバー) |
| 標準偏差 | σ(母標準偏差、シグマ) | s(標本標準偏差) |
| 分散 | σ²(母分散) | s²(標本分散、不偏分散) |
| 比率 | p(母比率) | p̂(標本比率、ピーハット) |
μやσのようなギリシャ文字が出てきたら「これは通常知りえない、母集団の真の値の話をしている」と読み、x̄やsのようなローマ字が出てきたら「これは手元の標本から実際に計算できる値の話をしている」と読む、という区別を意識してください。推測統計とは、突き詰めればx̄からμを、sからσを、p̂からpを、どの程度の確からしさで言い当てられるかを扱う分野だと言い換えることもできます。この記号の対応関係を頭に入れておくと、以降の章で登場する式の意味を素早く読み取れるようになります。
大数の法則とは、母集団から無作為に抽出した標本のサイズnを大きくしていくと、標本平均x̄が母平均μに限りなく近づいていく、という性質を指します。イメージしやすい例で言うと、表が出る確率がちょうど2分の1であるコインを投げる場合、10回程度の試行では表が6割、7割出ることも珍しくありません。しかし、これを1万回、10万回と繰り返していくと、表が出た割合は0.5に極めて近い値へと収束していきます。標本サイズが小さいうちは偶然のばらつきが結果を大きく左右しますが、標本サイズが大きくなるにつれて、そのばらつきの影響は相対的に小さくなっていくのです。
この性質をサイコロの目の平均でシミュレーションして確認してみます。1から6の目が等しい確率で出るサイコロを繰り返し振り、振った回数(標本サイズ)を増やしながら、それまでの標本平均がどう推移するかを見ます。サイコロの目の母平均は\( \mu = (1+2+3+4+5+6)/6 = 3.5 \)です。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
# サイコロを10,000回振ったとみなす
n_max = 10000
rolls = rng.integers(1, 7, size=n_max) # 1から6の目が等確率で出る
# 標本サイズを1からn_maxまで増やしながら、そのつどの標本平均を計算する
running_mean = np.cumsum(rolls) / np.arange(1, n_max + 1)
true_mean = 3.5 # サイコロの母平均
plt.figure(figsize=(8, 4))
plt.plot(running_mean, linewidth=1)
plt.axhline(true_mean, color='red', linestyle='--', label='母平均 3.5')
plt.xscale('log')
plt.xlabel('標本サイズ n(対数軸)')
plt.ylabel('標本平均')
plt.legend()
plt.title('大数の法則: 標本サイズを増やすと標本平均は母平均に近づく')
plt.show()
print(f'n=10 の標本平均: {running_mean[9]:.3f}')
print(f'n=100 の標本平均: {running_mean[99]:.3f}')
print(f'n=10000 の標本平均: {running_mean[-1]:.3f}')
このコードを実行すると、標本サイズが10や100程度のうちは、標本平均が3.5から離れた値を取ることがある一方で、標本サイズが1万に達するころには、標本平均は3.5にかなり近い値に落ち着いていく様子が確認できます。横軸を対数軸にして描画すると、標本サイズが桁違いに大きくなるにつれて、標本平均が母平均のまわりで小刻みに揺れながら収束していく様子が視覚的に分かりやすくなります。この「標本を増やせば標本平均は母平均に近づく」という性質こそが、無作為抽出された十分な量のデータがあれば、母集団の平均をかなりの精度で推測できることの理論的な根拠になっています。
大数の法則が「標本平均はどこに近づいていくか」を教えてくれるのに対し、中心極限定理(central limit theorem)は「標本平均はどのようなばらつき方をするか」を教えてくれる定理です。その主張は次のように述べられます。母集団の分布がどのような形をしていても、つまり正規分布のような左右対称の山型であっても、一様分布のようにどの値も等しく出やすい形であっても、あるいは大きく左右非対称に歪んだ形であっても、そこから無作為に取り出した標本の平均の分布は、標本サイズnが大きくなるにつれて正規分布に近づいていきます。
この定理が推測統計の土台であると言われるのは、次のような理由からです。実務で扱うデータの母集団の分布は、正規分布であることは稀で、多くの場合は形が分からないか、あるいは明らかに歪んでいます。それにもかかわらず、標本平均という統計量に注目する限り、その分布はサンプルサイズが十分であれば正規分布で近似できます。次章以降で扱う信頼区間の推定やt検定・Z検定といった手法の多くは、この「標本平均の分布は正規分布に近い」という性質を前提として組み立てられています。元の母集団の分布の形がどうであれ標本平均については同じ枠組みで議論できる、という汎用性の高さが、中心極限定理を推測統計の中心に据える理由です。
この様子を、一様分布であるサイコロの目と、大きく右に歪んだ分布である指数分布の2つで確認してみます。それぞれの分布から標本サイズn件を取り出して標本平均を計算する、という試行を2万回繰り返し、得られた標本平均の分布をヒストグラムに描きます。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
n_trials = 20000
sample_sizes = [1, 5, 30]
fig, axes = plt.subplots(2, len(sample_sizes), figsize=(12, 6))
for col, n in enumerate(sample_sizes):
# 上段: サイコロの目(一様分布、1から6)からの標本平均
dice_samples = rng.integers(1, 7, size=(n_trials, n))
dice_means = dice_samples.mean(axis=1)
axes[0, col].hist(dice_means, bins=30, density=True, color='steelblue')
axes[0, col].set_title(f'サイコロ(一様分布) n={n}')
# 下段: 指数分布(右に大きく歪んだ分布)からの標本平均
skewed_samples = rng.exponential(scale=1.0, size=(n_trials, n))
skewed_means = skewed_samples.mean(axis=1)
axes[1, col].hist(skewed_means, bins=30, density=True, color='darkorange')
axes[1, col].set_title(f'指数分布(歪んだ分布) n={n}')
plt.tight_layout()
plt.show()
n=1の列は、元の分布そのものの形を示しています。サイコロの目はどの値も同じ高さのフラットな分布に、指数分布は0付近が高く右に長く裾を引く分布になります。ところがn=5、n=30と標本サイズを増やしていくと、どちらの列でもヒストグラムの形は左右対称の山型、つまり正規分布に近い形へと変化していきます。特に指数分布のように元の形が大きく歪んでいる場合でも、n=30程度まで標本サイズを増やせば、標本平均の分布はかなり正規分布に近づく点は印象的です。この「元の分布の形状によらず標本平均は正規分布に近づく」という頑健な性質があるからこそ、実務のデータが正規分布に従っているかどうかを厳密に確認できない場面でも、標本平均を扱う推測統計の手法を安心して適用できるのです。

中心極限定理は、標本平均の分布が正規分布に近づくことに加えて、その分布のばらつきの大きさについても教えてくれます。標本平均という統計量自体のばらつきを表す指標を標準誤差(standard error、SEと略します)と呼び、母標準偏差をσ、標本サイズをnとすると、次の式で表されます。
\( SE = \dfrac{\sigma}{\sqrt{n}} \)
ここで注意したいのが、標準偏差(SD)と標準誤差(SE)は名前が似ているために混同されやすいものの、まったく異なる概念だという点です。標準偏差は、母集団や標本に含まれる個々のデータが、平均からどれだけばらついているかを表す指標です。これは標本サイズを増やしたからといって小さくなるものではなく、母集団や標本に内在する性質そのものです。一方の標準誤差は、標本平均という「標本ごとに計算される統計量」自体が、標本を取り直すたびにどれだけばらつくかを表す指標です。標準誤差は標本サイズnを増やせば増やすほど小さくなり、標本平均の推定精度が上がっていくことを意味します。この違いを整理すると次のとおりです。
| 標準偏差(SD) | 標準誤差(SE) | |
|---|---|---|
| 何のばらつきか | 個々のデータが平均からどれだけばらついているか | 標本平均という統計量が標本ごとにどれだけばらつくか |
| 標本サイズnとの関係 | nを増やしても基本的に変化しない | nを増やすほど\( \sigma/\sqrt{n} \)に従って小さくなる |
| 意味するもの | データ1件1件のばらつきの大きさ | 標本平均による母平均の推定の信頼性 |
この式が示すもう一つの重要な関係が、標本サイズと推定精度の間の平方根則です。標準誤差はnの平方根に反比例するため、標準誤差を半分にしたい、つまり推定精度を2倍にしたい場合には、標本サイズを4倍に増やす必要があります。同様に精度を3倍にしたければ標本サイズは9倍、精度を10倍にしたければ標本サイズは100倍必要になります。標本サイズを増やせば推定精度は確実に向上しますが、その向上のペースは徐々に緩やかになっていく、収穫逓減の関係にあるという点は、調査コストと精度のバランスを考えるうえで押さえておく価値があります。
この関係を、先ほど使った指数分布からのシミュレーションで数値的に確認してみます。標本サイズnを5、20、80、320と4倍ずつ増やしながら、標本平均の実際のばらつき(実測の標準偏差)と、理論式\( \sigma/\sqrt{n} \)から求めた値を比べます。
import numpy as np
rng = np.random.default_rng(1)
population_sigma = 1.0 # 指数分布(scale=1)の母標準偏差は1
n_trials = 50000
for n in [5, 20, 80, 320]:
samples = rng.exponential(scale=1.0, size=(n_trials, n))
sample_means = samples.mean(axis=1)
empirical_se = sample_means.std(ddof=1)
theoretical_se = population_sigma / np.sqrt(n)
print(f'n={n:>4}: 標本平均の標準偏差(実測)={empirical_se:.4f}, '
f'理論値 σ/√n={theoretical_se:.4f}')
実行すると、実測値と理論値がほぼ一致することに加えて、nを5から20、20から80、80から320へと4倍ずつ増やすたびに、標準誤差がおおよそ半分ずつに減っていく様子が確認できます。標本サイズを2倍にしても精度は約1.41倍にしか向上しないのに対し、4倍にすればちょうど2倍になる、という平方根則の関係が、シミュレーション上の数値からも裏付けられます。
標本から母数を推測するために計算する値のことを推定量と呼びますが、推定量であれば何でもよいわけではありません。統計学では、推定量が満たしていることが望ましい性質がいくつか定義されています。ここでは代表的な2つ、不偏性と一致性を取り上げます。
不偏性(unbiasedness)とは、推定量の期待値が、推定しようとしている真の母数と一致する性質のことです。記述統計を扱った章で、標本分散を計算する際に、標本サイズnではなくn−1で割った不偏分散を用いる理由に触れました。標本平均は、その標本内のデータとの差の2乗和を最小にするように定まる値であるため、標本分散をそのままnで割って計算すると、母分散を系統的に小さく見積もってしまう偏りが生じます。n−1で割ることで、この偏りを補正し、期待値が母分散に一致する不偏推定量になるようにしているのでした。不偏性とは、まさにこの「特定の1つの標本ではなく、あらゆる標本について平均すれば、真の値からずれない」という性質を指します。
一致性(consistency)とは、標本サイズnを大きくしていくと、推定量が真の母数に確率的に収束していく性質のことです。これは、本章で見てきた大数の法則がまさに保証している内容そのものです。標本平均x̄は、標本サイズが大きくなるほど母平均μに近づいていくため、一致性を満たす推定量だと言えます。不偏性は「標本サイズによらず、平均すればずれない」という性質であるのに対し、一致性は「標本サイズを増やせば真の値に近づいていく」という性質であり、両者は似ているようで異なる観点からの評価基準です。標本平均は不偏性と一致性の両方を満たす、推定量として望ましい性質を兼ね備えた統計量です。
もう1つ、複数の不偏推定量が存在する場合に、そのばらつき(分散)がより小さいものほど望ましいとする有効性(efficiency)という観点もあります。詳細な議論は本書の範囲を超えますが、望ましい推定量とは、偏りがなく(不偏性)、標本を増やせば真の値に近づき(一致性)、かつ同じ条件下ではできるだけばらつきが小さい(有効性)、という3つの観点から評価されるものだと理解しておけば十分です。
ここまで見てきた大数の法則、中心極限定理、標準誤差の考え方は、実務における意思決定に直接結びついています。まず、顧客満足度調査やマーケティング調査で回答者数(サンプルサイズ)をどう設計するかという問題です。標準誤差は標本サイズの平方根に反比例するため、回答者数が少ないアンケートでは標準誤差が大きくなり、得られた平均値や比率の推定値は、真の値から大きくずれている可能性を抱えたまま報告されることになります。逆に回答者数を増やせば精度は向上しますが、収集コストや調査期間とのトレードオフが生じるため、どの程度の精度を確保したいかを先に定めたうえで、必要な回答者数を逆算するという考え方が実務的です。この見積もりの具体的な手順は、次章以降で扱う区間推定とあわせて詳しく説明します。
もう1つの含意は、少数のデータだけを根拠にした意思決定の危うさです。Webサイトの施策効果を検証するA/Bテストで、コンバージョン数が十数件程度しかない段階で、片方の施策が優れていると判断してしまう場面は実務でしばしば見られます。標本サイズが小さいと標準誤差が大きくなるため、たまたま観測された差が、母集団における真の差を反映しているのか、単なる偶然のばらつきによるものなのかを区別することが難しくなります。少人数の意見や少数の成功事例だけを根拠に大きな投資判断や施策の継続判断を下すことには、統計学的な観点からも相応のリスクが伴います。
そのうえで強調しておきたいのは、全数調査が不可能な状況であっても、統計学は手をこまねいているわけではないという点です。無作為抽出された標本と、ある程度のサンプルサイズさえ確保できれば、大数の法則によって標本平均は母平均に近づき、中心極限定理によってそのばらつきの姿を正規分布として捉えることができます。この2つの定理が土台になっているからこそ、限られた標本から母集団についてかなりの確度で語り、その確からしさの程度までも数値として示すことができるのです。次章では、この土台の上に立って、標本から母数の値そのものをどの範囲で見積もるかという区間推定の考え方に進みます。
大数の法則は「標本を増やせば標本平均は母平均に近づく」ことを、中心極限定理は「元の分布の形によらず標本平均の分布は正規分布に近づく」ことを保証します。この2つの定理があるからこそ、全数調査を行わなくても、無作為に抽出した限られた標本から母集団についてかなりの確度で語ることができます。推測統計は、この2つの土台の上に成り立っています。
『データ分析に必須の知識・考え方 統計学入門』(阿部真人、ソシム):母集団と標本の関係、大数の法則、中心極限定理といった推測統計の基礎を、平易な言葉と具体的な例を用いて丁寧に解説している入門書です。数式を機械的に覚えるのではなく、なぜその考え方が必要になるのかという背景から理解したい読者に向いており、本章で扱った標準誤差や不偏性・一致性の考え方を、別の角度からじっくり復習する際の参考になります。
これまでの章では、標本平均や標本比率といった1つの数値で母集団の性質を言い当てようとする、点推定という考え方を扱ってきました。標本から計算した1つの値を、そのまま母数(母平均や母比率など、知りたい母集団の性質)の推定値として使う方法です。標本平均の分布や中心極限定理を踏まえると、この点推定にはある根本的な限界があることが見えてきます。標本平均は連続的な値を取り得るため、ある特定の1点が母平均と寸分違わず一致する確率は、理論上ほぼゼロだということです。
例えば「今月の顧客単価は8,412円です」という報告を受けたとき、この数字は標本から計算された1つの点推定値に過ぎず、真の母平均が本当に8,412円ぴったりである保証はどこにもありません。標本を取り直せば8,405円になるかもしれませんし、8,430円になるかもしれません。1つの点だけを示すことは、この標本ごとのばらつきという情報を報告から丸ごと消し去ってしまう行為でもあります。
そこで統計学では、母数が「だいたいこのあたりにありそうだ」という幅を、一定の信頼度とともに示す区間推定という考え方を使います。「母平均はおよそ8,000円から8,800円の間にある可能性が高い」という形で示せば、点推定値だけでは伝わらなかった、推定の確からしさや誤差の大きさまで伝えることができます。本章では、この区間推定の考え方を、比率の推定と平均の推定という2つの代表的な場面で具体的に見ていきます。
比率の区間推定は、ビジネスの現場でも馴染み深い場面で頻繁に登場します。テレビ番組の視聴率調査、世論調査における内閣支持率、Webサイトのコンバージョン率(訪問者のうち購入や申込に至った割合)は、いずれも「全体のうちの一部を観測して、全体における比率を推定する」という同じ構造を持っています。
標本の大きさを\( n \)、標本の中で条件を満たした件数の割合を標本比率\( \hat{p} \)とすると、\( \hat{p} \)は標本ごとに値がばらつく確率変数です。標本サイズ\( n \)が十分に大きい場合、この標本比率の分布は、平均\( p \)(真の母比率)、標準誤差\( \sqrt{\dfrac{p(1-p)}{n}} \)の正規分布で近似できることが知られています。これは、二項分布に従う「条件を満たした件数」を正規分布で近似する考え方と、中心極限定理の応用にあたります。
この性質を使うと、標本比率\( \hat{p} \)を中心とした95%信頼区間は、次の式で計算できます。
\( \hat{p} \pm z_{0.025} \sqrt{\dfrac{\hat{p}(1-\hat{p})}{n}} \)
ここで\( z_{0.025} \)は標準正規分布の上側2.5%点、つまり右側の裾の確率が0.025になる位置を指し、約1.96という値になります。左右対称なので、この値を中心から両側に取ると、内側に95%が収まります。実際に、600世帯を対象にした視聴率調査で320世帯が視聴したと回答したケースを、scipy.statsで計算してみます。
import numpy as np
from scipy import stats
# 600世帯を対象にした視聴率調査で、320世帯が視聴と回答したケース
n = 600
x = 320
p_hat = x / n
se = np.sqrt(p_hat * (1 - p_hat) / n)
z = stats.norm.ppf(0.975) # 両側95%信頼区間に対応するz値(片側97.5%点)
ci_lower = p_hat - z * se
ci_upper = p_hat + z * se
print(f"標本比率: {p_hat:.3f}")
print(f"95%信頼区間: [{ci_lower:.3f}, {ci_upper:.3f}]")
print(f"誤差の範囲(ポイント): ±{z * se * 100:.1f}pt")
このコードを実行すると、標本比率は53.3%、95%信頼区間はおよそ49.3%から57.3%となり、「誤差の範囲は±4.0ポイント程度」という結果が得られます。世論調査の報道で見かける「支持率40%、誤差は±3ポイント」といった表現は、まさにこの計算に基づいています。標本サイズが小さいアンケートや、限定的なユーザーテストの結果を見るときほど、この誤差の幅を意識する必要があります。標本サイズが数十件程度しかない社内アンケートで「満足度は70%でした」とだけ報告されても、実際には55%から85%までの幅で母比率が動き得る、という状況は珍しくありません。
なお、この正規近似による信頼区間(ウォルド区間と呼ばれます)は、標本比率が0または1に極端に近い場合や、標本サイズが小さい場合には精度が落ちることが知られています。そうした場面では、ウィルソンのスコア区間など、より頑健な計算方法に切り替える選択肢もあります。標本サイズが数百件以上あり、比率も極端に偏っていない通常のビジネス場面では、上記の正規近似で実用上十分な精度が得られます。

比率だけでなく、平均についても同じ発想で区間推定ができます。区間推定の理屈を最も見通しよく理解するために、まず母分散(母集団全体のばらつき)\( \sigma^2 \)が既知である、という現実にはあまりない仮想的な状況を考えます。標本平均\( \bar{x} \)の標準誤差は\( \dfrac{\sigma}{\sqrt{n}} \)であり、母平均\( \mu \)の95%信頼区間は次の式になります。
\( \bar{x} \pm z_{0.025} \dfrac{\sigma}{\sqrt{n}} \)
この式は比率の信頼区間とまったく同じ形をしており、標準誤差の分だけ標本平均の前後に幅を持たせるという発想が共通していることが分かります。ただし実務では、母集団全体のばらつき\( \sigma \)をあらかじめ知っている状況はほとんどありません。知りたいのはまさに母集団の性質であり、その母集団の分散を先に知っているというのは、多くの場合矛盾した前提になってしまいます。
そこで実務で使われるのは、母分散\( \sigma^2 \)の代わりに、標本から計算した不偏分散(前章までに扱った、n-1で割る分散)の平方根である標本標準偏差\( s \)を用いる方法です。この場合、母平均の95%信頼区間は次の式になります。
\( \bar{x} \pm t_{\alpha/2, n-1} \dfrac{s}{\sqrt{n}} \)
\( z_{0.025} \)の代わりに\( t_{\alpha/2, n-1} \)という、自由度\( n-1 \)のt分布に基づく値を使っている点が、既知の場合との違いです。この違いがなぜ生じるのかを、次節で詳しく見ていきます。
母分散\( \sigma \)が分かっていれば、標本平均を標準化した\( z = \dfrac{\bar{x}-\mu}{\sigma/\sqrt{n}} \)は標準正規分布に従います。しかし実際には\( \sigma \)が分からないため、代わりに標本から計算した\( s \)を使って\( t = \dfrac{\bar{x}-\mu}{s/\sqrt{n}} \)という統計量を作ります。この\( t \)は、正規分布ではなく、自由度\( n-1 \)のt分布という別の分布に従うことが分かっています。
t分布は、標準正規分布と同じく0を中心とした左右対称の釣鐘型の分布ですが、正規分布に比べて裾がやや厚いという特徴を持ちます。これは、標本から\( \sigma \)の代わりに\( s \)を推定して使っていることで、\( \mu \)の推定に加えて\( \sigma \)の推定という、もう1つの不確実性が上乗せされるためです。この追加の不確実性の分だけ、t分布は正規分布よりも極端な値が出やすい(裾が厚い)分布になっています。
t分布の形は、自由度(標本サイズnからおおむね1を引いた値)によって変化します。自由度が小さい、つまり標本サイズが小さいうちは、裾の厚さが際立ち正規分布から大きく外れた形になります。しかし自由度が大きくなる、つまり標本サイズnが大きくなるにつれて、\( s \)が\( \sigma \)の真の値に近づいていくため、\( \sigma \)を代用することによる追加の不確実性が小さくなり、t分布の形は次第に標準正規分布に近づいていきます。目安として、自由度が30を超えるあたりからt分布と正規分布の差はかなり小さくなり、自由度が数百に達する頃にはほぼ見分けがつかなくなります。
この性質があるため、標本サイズnが小さい(目安としておよそ30未満の)場合には、正規分布ではなくt分布に基づいて信頼区間を計算する必要があります。標本サイズが大きい場合は正規分布で近似しても実務上大きな差は出ませんが、標本サイズを問わずt分布を使っておけば、大標本でも小標本でも通用する一貫した計算方法になるため、統計ソフトの多くはデフォルトでt分布に基づく信頼区間を採用しています。実際に、あるコールセンターの応対時間について、n=25件という比較的小さな標本から母平均の95%信頼区間を計算してみます。
import numpy as np
from scipy import stats
# あるコールセンターの応対時間(秒)。n=25件のサンプル
handling_time = np.array([
182, 195, 170, 210, 188, 175, 202, 190, 165, 198,
205, 178, 192, 184, 199, 172, 208, 187, 176, 194,
201, 183, 190, 179, 196
])
n = len(handling_time)
mean = np.mean(handling_time)
sem = stats.sem(handling_time) # 標準誤差(不偏標準偏差 / sqrt(n))
ci = stats.t.interval(confidence=0.95, df=n - 1, loc=mean, scale=sem)
print(f"標本サイズ: {n}")
print(f"標本平均: {mean:.1f}秒")
print(f"95%信頼区間: [{ci[0]:.1f}, {ci[1]:.1f}]秒")
このコードでは、stats.t.intervalにt分布の自由度(標本サイズから1を引いたn-1)と、標本平均、標準誤差を渡すことで、直接95%信頼区間の上限と下限を得ています。実行結果は、標本平均が約188.8秒、95%信頼区間はおよそ183.7秒から193.8秒となり、「この応対フローにおける平均応対時間は、おおむね184秒から194秒の間にあると考えられる」という報告ができるようになります。

信頼区間について、実務でも学習の場でも非常によく見られる誤解があります。「この95%信頼区間には、母数が入っている確率が95%である」という解釈です。この解釈は直感的には自然に思えますが、標準的な(頻度論的な)統計学の枠組みでは正しくありません。
頻度論の枠組みでは、母平均や母比率といった母数は、未知ではあるものの、ある1つの固定された値だと考えます。サイコロの目のようにランダムに変動するものではなく、いま話題にしている母集団に対して、動かない1つの値として存在しているという前提です。一方でランダムに変動するのは、標本の取り方によって毎回変わる、信頼区間の上限と下限の方です。標本を取り直せば、標本平均も標準誤差も変わるため、計算される信頼区間の位置も毎回変わります。
この前提に立つと、「95%信頼区間に母数が入っている確率」という表現そのものが、実は奇妙な問いになります。母数はすでに1つの値に固定されており、目の前にできあがった1つの信頼区間(例えば「184秒から194秒」)についても、その区間が母平均を含んでいるか含んでいないかは、確率的にではなく、すでに決まってしまっているからです。含んでいるなら確率は100%であり、含んでいないなら確率は0%です。ある1回の試行の結果に対して「95%の確率」という言葉を当てはめること自体が、頻度論の枠組みとは噛み合いません。
では95%という数字は何を意味しているのでしょうか。正しい解釈は、「同じ方法で標本抽出と信頼区間の計算を何度も繰り返した場合、計算されるすべての信頼区間のうち、およそ95%が真の母数を実際に含むことになる」という、計算方法そのものの性質に対する保証です。95%という数字は、目の前の1つの区間についての確率ではなく、区間を作る手順(標本を取り、標本平均や標準誤差を計算し、信頼区間の公式を当てはめるという一連の手続き)の長期的な成功率を表しています。
95%信頼区間の「95%」は、「この区間に母数が入っている確率」ではなく、「同じ手続きを繰り返したとき、作られる区間のおよそ95%が母数を含む」という、推定の手続きそのものに対する信頼度を表しています。母数は固定された値であり、ランダムに動いているのは標本ごとに変わる区間の方だという点を押さえておくと、この解釈のねじれを整理しやすくなります。
この違いは些細な言葉の綾ではありません。「95%の確率で母数がこの区間に入っている」という誤解に基づいて意思決定を行うと、信頼区間が持つ本来の意味以上の確実性を、その区間に対して感じてしまうことになりかねません。特に経営会議や社外への報告資料で信頼区間を説明する際には、「この幅の中に真の値がある確率が95%」という言い回しを避け、「同じ調査方法を繰り返した場合、95%の確率でこの幅の中に真の値を捉えられる、という調査方法自体の精度を示す幅」といった説明に置き換えると、誤解を防ぎやすくなります。

ここまで見てきた信頼区間の式は、いずれも「点推定値 ± 何らかの係数 × 標準誤差」という共通の形をしています。この形から、信頼区間の幅がどのような要因で変化するかが見えてきます。
| 信頼水準 | おおよそのz値(大標本の場合) | 幅の傾向 |
|---|---|---|
| 90% | 1.645 | 最も狭い。的中の保証はやや弱い |
| 95% | 1.960 | 実務・学術報告で最も広く使われる標準的な水準 |
| 99% | 2.576 | 最も広い。強い確実性が必要な場面向け |
信頼水準と幅はトレードオフの関係にあります。信頼水準を上げれば「区間が母数を含む」という保証は強くなりますが、その代償として区間そのものが広くなり、実務上の情報としての価値(どれだけ絞り込めているか)は下がっていきます。逆に信頼水準を下げれば区間は狭くなり一見有用に見えますが、母数を捉え損ねる可能性が高まります。どの信頼水準を採用するかは、その推定を使ってどれだけ重い意思決定をするかによって選ぶべきものであり、95%が万能の正解というわけではありません。医薬品の安全性評価など、誤りの許容度が極めて低い領域では99%やそれ以上の水準が使われることもあります。
ここまでの信頼区間は、標本平均や標本比率の分布が正規分布やt分布に従うという理論的な性質を前提に、公式を使って計算してきました。しかし実務で扱う統計量には、中央値や相関係数、比率どうしの比といった、その分布の形が理論的に簡単には求まらないものも数多くあります。こうした場面で威力を発揮するのが、ブートストラップ法という、計算機の力を使ったリサンプリング(再標本化)による区間推定の手法です。
ブートストラップ法の考え方はシンプルです。手元にある標本(サイズn)から、重複を許してランダムにn個を選び直すという操作を繰り返し、そのたびに関心のある統計量(平均や中央値など)を計算します。これを数千回から数万回繰り返すと、その統計量がどの程度ばらつくのかを表す、経験的な分布ができあがります。この経験分布の2.5パーセンタイルと97.5パーセンタイルを取れば、理論的な公式を使わずに95%信頼区間を作ることができます。
手元の標本を、母集団全体を映す縮図とみなし、その標本から重複ありで再抽出することによって、「もし同じ母集団からもう一度標本を取り直したら、統計量はどの程度違う値になり得るか」という標本のばらつきを、計算機上でシミュレーションしているとイメージすると分かりやすいと思います。理論分布を仮定しなくてよいため、分布の形が複雑な指標や、外れ値の影響を受けやすい中央値のような統計量にも、同じ手順で柔軟に適用できる点が大きな利点です。一部の大口注文が混ざり右に歪んだ購入金額データについて、中央値の95%信頼区間をブートストラップ法で求めてみます。
import numpy as np
from scipy import stats
rng = np.random.default_rng(42)
# 一部の大口注文が混ざった、右に歪んだ購入金額データ(円)を想定
typical = rng.normal(loc=8000, scale=1500, size=180)
large_orders = rng.normal(loc=45000, scale=8000, size=20)
purchase_amount = np.concatenate([typical, large_orders])
def median_stat(data, axis=-1):
return np.median(data, axis=axis)
res = stats.bootstrap(
(purchase_amount,),
median_stat,
n_resamples=9999,
confidence_level=0.95,
method="percentile",
rng=rng,
)
print(f"標本の中央値: {np.median(purchase_amount):.0f}円")
print(f"ブートストラップ95%信頼区間: [{res.confidence_interval.low:.0f}, "
f"{res.confidence_interval.high:.0f}]円")
scipy.stats.bootstrapは、リサンプリングによる信頼区間の計算を1行でまとめて実行してくれる関数です。第1引数にデータをタプルで渡し、第2引数に計算したい統計量の関数を渡すと、指定した回数だけリサンプリングを繰り返し、指定した信頼水準に対応する区間をconfidence_interval属性として返してくれます。中央値のように理論的な標準誤差の公式が扱いにくい統計量でも、平均のときとまったく同じ発想の手順で信頼区間を得られる点が、ブートストラップ法の実務上の強みです。なお、乱数を指定するrng引数はSciPy 1.15以降の書き方です。それより前のバージョンではrandom_stateを使います。

区間推定の考え方は、統計学の理論というだけでなく、ビジネスにおける報告や意思決定のあり方そのものに関わってきます。経営会議や事業報告の場では、「今月のコンバージョン率は3.2%でした」「新施策で顧客単価が8,412円に上がりました」といった、1つの点の数字だけが提示される場面が少なくありません。しかしここまで見てきた通り、こうした数字はいずれも標本から計算された点推定値であり、標本を取り直せば別の値になり得る、ある種の不確実性を内包しています。
1点の数字だけを見て「先月の3.0%から3.2%に上がった、施策の効果だ」と結論づけるのは、その差が両者の信頼区間から見て意味のある差なのか、それとも標本のばらつきの範囲に収まる程度の誤差なのかを確かめないまま、性急な判断をしてしまうリスクをはらんでいます。区間推定を併記する習慣があれば、「3.2%(95%信頼区間: 2.8%から3.6%)」という形で報告でき、その差が本当に語るに値する変化なのかどうかを、読み手自身が判断しやすくなります。
推定値に幅を添えるという文化は、単に統計的に厳密であるというだけでなく、意思決定における謙虚さを組織にもたらす効果もあります。1点の数字だけを一人歩きさせると、その数字がどれだけの標本から、どの程度の確からしさで算出されたのかという文脈が失われ、過信や誤解を招きやすくなります。逆に幅を伴う報告を徹底すれば、「この数字はまだ十分な標本に基づいていない」「この程度の変動は誤差の範囲内かもしれない」という健全な留保を、報告する側と受け取る側の双方が共有できるようになります。次章では、この信頼区間の考え方を土台にしながら、「観測された差が偶然のばらつきでは説明しにくいと言えるかどうか」を判定する仮説検定について扱います。
『まずはこの一冊から 意味がわかる統計学』(石井俊全、ベレ出版):数式の丸暗記ではなく、なぜその計算をするのかという意味づけを重視した解説で構成されており、本章で扱った信頼区間の考え方やt分布が登場する背景を、直感的に掴み直すのに適した1冊です。区間推定の解釈でつまずきやすい読者にとって、公式の意味を再確認する副読本として役立つと思います。
前章までで、記述統計から確率分布、そして推測統計の基礎(不偏性や中心極限定理、区間推定)までを見てきました。ここからは、ビジネスの現場で最も頻繁に登場する道具、仮説検定に入ります。
「新しいランディングページのコンバージョン率は、旧デザインより本当に高いと言えるのか」「新しい営業トークを導入したチームの成約率の変化は、たまたまのばらつきなのか、それとも施策の効果なのか」。こうした問いに、感覚や勢いではなく数値的な根拠を持って答えるための枠組みが仮説検定です。
仮説検定は、統計学の中でも特に誤解が多い分野です。p値の意味を取り違えたまま報告書に「有意差があった」と書いてしまう、あるいは逆に「有意差がなかったので効果はなかった」と断定してしまうといった誤用は、ビジネスの現場でも見られます。本章では、仮説検定がそもそも何を主張する枠組みなのかという出発点から、p値の正確な定義、有意水準の位置づけ、そして統計的な有意性と実務上の意味のある差の違いまでを、一つの具体例を通して確認していきます。
仮説検定とは、手元のデータが「偶然のばらつきの範囲内で起こり得るのか、それとも偶然では説明しにくいほど珍しいことが起きているのか」を、確率を根拠に判断する枠組みです。観測された差や関係が、単なるサンプリングの誤差なのか、それとも意味のある違いなのかを見極めるために使います。
ビジネスの現場で仮説検定が登場する典型的な場面としては、次のようなものがあります。
いずれの場面でも、観測された差(例えばコンバージョン率が5.0%から7.5%に上がった)を見ただけでは、それが施策の効果なのか、たまたまその期間にそうした数値になっただけなのかを区別できません。サンプルサイズが小さければ、指標は日によって、あるいは対象者によって自然にばらつきます。仮説検定は、このばらつきを踏まえたうえで「この程度の差は、偶然でも十分に起こり得るのか」を定量的に評価するための手続きです。
仮説検定を理解するうえで最初につまずきやすいのが、「証明したいこと」を直接検証するのではなく、その否定をいったん立てるという発想です。
例えば、新しい施策によってコンバージョン率が上がったことを示したいとします。素直に考えれば、「コンバージョン率は上がった」という主張を直接検証したくなります。しかし仮説検定では、まず「コンバージョン率に差はない」という仮説を立て、それを否定できるかどうかを調べるという回り道をとります。この「差はない」「効果はない」といったん仮に置く仮説を帰無仮説(null hypothesis、\( H_0 \))と呼び、本当に示したい「差がある」「効果がある」という主張を対立仮説(alternative hypothesis、\( H_1 \))と呼びます。
この発想は、数学の証明で使われる背理法とよく似ています。背理法では、証明したい命題の否定を仮定し、その仮定のもとで矛盾が生じることを示すことで、もとの命題が正しいと結論づけます。仮説検定も同じ構造を持っています。「差はない」(帰無仮説)を仮に正しいとしたときに、実際に観測されたデータが起こる確率を計算し、その確率があまりにも小さければ、「差はない」という仮定のほうを疑わしいと判断して棄却します。その結果として、対立仮説である「差がある」が支持される、という流れです。
なぜ、示したいこと(対立仮説)を直接検証しないのでしょうか。理由は、確率計算に必要な「基準となる分布」を用意できるかどうかにあります。「コンバージョン率に差はない」という帰無仮説は、2つのグループの母比率が等しいという1点に定まった主張です。1点に定まっているからこそ、その仮定のもとでデータがどのようにばらつくかという確率分布を具体的に計算できます。一方、「差がある」という対立仮説は、差が0.1ポイントなのか5ポイントなのか20ポイントなのかを特定しない、幅のある主張です。幅のある主張のままでは、基準となる確率分布を一意に決められません。そのため、まず1点に定まる帰無仮説を基準として置き、そこからのズレの大きさを確率で評価する、という手順を踏みます。
仮説検定は、次の4つのステップで進めます。
| ステップ | 内容 |
|---|---|
| 1. 仮説の設定 | 帰無仮説\( H_0 \)(差はない)と対立仮説\( H_1 \)(差がある)を立てる |
| 2. 有意水準の設定 | 帰無仮説を誤って棄却してよいと許容する確率\( \alpha \)(多くの場合5%)をあらかじめ決めておく |
| 3. 検定統計量の計算 | 手元のデータから、Z値やt値、カイ二乗値といった検定統計量を計算する |
| 4. p値の算出と判定 | 検定統計量に対応するp値を求め、\( p < \alpha \)であれば帰無仮説を棄却し「統計的に有意」と判断する |
この4ステップのうち、実務での判断に直結するのは2と4です。検定統計量やp値の計算自体は、ソフトウェアが自動的に行ってくれます。人間が理解し、かつ誤解なく扱う必要があるのは、有意水準をどこに設定するかという判断と、算出されたp値をどう解釈するかという部分です。次節から、この2点を順に見ていきます。

p値は、仮説検定の結果として報告される最も基本的な数値ですが、同時に最も誤解されやすい数値でもあります。正確な定義を確認します。
p値とは、「帰無仮説が正しいと仮定したときに、実際に観測された結果か、それよりも極端な結果が得られる確率」のことです。
この定義には、2つの条件が含まれている点に注意が必要です。1つ目は「帰無仮説が正しいと仮定したときに」という条件、2つ目は「観測された結果か、それ以上に極端な結果」という範囲の指定です。p値は、あくまで帰無仮説が正しいという前提のもとで計算される確率であって、帰無仮説が正しいかどうかそのものを直接示す数値ではありません。
この違いは、実務でよく見られる誤解の原因になっています。p値についての典型的な誤解を整理します。
p値は「観測データが帰無仮説と矛盾する度合い」を表す確率であり、「帰無仮説が正しい確率」ではありません。この違いを取り違えると、以降のすべての解釈が誤った方向に進んでしまうため、仮説検定を扱ううえで最も基本的な注意点だといえます。

p値を判定基準と照らし合わせるために使うのが、有意水準(多くの場合\( \alpha=0.05 \)、5%)です。p値が有意水準を下回れば「統計的に有意」と判断し、帰無仮説を棄却します。
ここで押さえておきたいのは、5%という数値そのものに、物理法則のような絶対的な根拠があるわけではないという点です。5%という基準は、統計学者ロナルド・フィッシャーが20世紀前半の著作の中で一つの目安として提示したものが、その後の学術界・産業界で広く踏襲されてきた慣習にすぎません。
実際、分野によって採用される有意水準は異なります。
このように、有意水準は「誤って帰無仮説を棄却してしまった場合に生じる損失の大きさ」に応じて調整されるべき値であり、あらゆる場面で一律に5%を当てはめてよいという性質のものではありません。
ビジネスの実務においても、5%を無条件に採用するのではなく、「帰無仮説を誤って棄却してしまうこと(本来は差がないのに、差があると判断してしまうこと)のコストがどれくらい大きいか」を踏まえて有意水準を決めるという考え方が本来は望ましいといえます。UIの一部を切り替えるような後戻りしやすい施策であれば10%程度でも許容できる場合がありますし、大規模なシステム移行のように後戻りが困難で影響が大きい意思決定であれば、5%よりも厳しい基準を採用する判断もあり得ます。5%はあくまで出発点であり、思考停止で採用してよい数値ではない、という理解が重要です。
検定統計量からp値を計算する際には、対立仮説の立て方に応じて片側検定と両側検定を使い分けます。
片側検定は、方向があらかじめ明確に定まっている場合(例えば、新しい施策が理論上コンバージョン率を下げることはあり得ないと分かっている場合など)には妥当な選択です。ただし、片側検定を選ぶかどうかは、データを見る前、分析を始める前に決めておく必要があります。
ここで注意したいのが、結果を見てから片側検定に切り替えるという不正です。両側検定で計算するとp値が0.08で有意水準5%を超えてしまったが、片側検定にすればp値がおよそ半分の0.04になり有意水準を下回る、といった理由で後から片側検定に変更してしまうケースがあります。これは、都合の良い基準を後付けで選んでいるにすぎず、有意水準を実質的に引き上げているのと同じことです。検定の方向は、データを見る前に、施策の設計段階で決めておくべき項目です。
p値が有意水準を上回り、帰無仮説を棄却できなかった場合、報告書には「有意差は見られなかった」と書かれることが多くあります。ここで注意したいのは、「有意差が見られなかった」ことと「差がないことが証明された」ことは、まったく別の主張だという点です。
仮説検定はもともと、帰無仮説を「正しいと積極的に証明する」ための手続きではありません。帰無仮説を「棄却できるかどうか」だけを判定する非対称な枠組みです。棄却できなかった場合に言えるのは、「今回のデータでは、帰無仮説を否定するだけの十分な証拠が得られなかった」ということだけであり、「帰無仮説が正しいと確認された」わけではありません。
有意差が検出されなかった原因は、本当に差がない場合だけでなく、サンプルサイズが不足していて、実際には存在する差を検出する力(検出力)が足りなかった場合にも起こり得ます。同じ大きさの効果であっても、サンプルサイズが小さければ検出力は低く、有意差は出にくくなります。検出力の考え方と、必要なサンプルサイズをどう設計するかについては、次章で詳しく扱います。
仮説検定を実務で使ううえで、もう一つ押さえておくべき考え方が、統計的な有意性と、実務上意味のある差(実務的有意性)は別物だという点です。
p値は、サンプルサイズが大きくなるほど小さくなりやすいという性質を持っています。同じ0.1ポイントの差であっても、サンプルサイズが100件のときには検出できなくても、100万件になれば統計的に有意と判定されることがあります。母集団全体に近いほどサンプルサイズが巨大な場合、ほとんどどのような微小な差であっても、統計的には「有意」という判定が出てしまいます。
つまり、「統計的に有意である」という結果は、「その差がビジネス上意味のある大きさである」ことを保証しません。コンバージョン率が5.00%から5.01%に変化したという差が、サンプルサイズ次第では立派に有意と判定される一方で、その0.01ポイントの差が売上や利益にどれほどの影響を与えるかは、また別に検討する必要があります。
p値が小さいことは「差が偶然とは考えにくい」ことを示すだけであり、「その差が大きい」ことや「対応する価値がある」ことを示すものではありません。差の大きさそのものを評価するには、効果量と呼ばれる指標を別途確認する必要があります。効果量の具体的な計算方法と読み方については、第10章で改めて取り上げます。
実務での報告においては、p値だけでなく、実際の差の大きさ(コンバージョン率であれば何ポイントの差か、金額であれば何円の差か)を必ず併記し、その差が投資や意思決定に見合うものかどうかを別途判断するという姿勢が求められます。
ここまでの内容を、コンバージョン率の改善検定という一つの例を使って、最初から最後まで確認します。用いるのは、2つの比率を比較するZ検定という枠組みです。
あるECサイトで、購入ボタンのデザインを変更するA/Bテストを実施したとします。設定は次のとおりです。
| グループ | 訪問者数 | 購入者数 | コンバージョン率 |
|---|---|---|---|
| A(旧デザイン) | 1,000人 | 50人 | 5.0% |
| B(新デザイン) | 1,000人 | 75人 | 7.5% |
見た目のコンバージョン率は5.0%から7.5%に上がっており、一見改善しているように見えます。しかし、この差が偶然のばらつきの範囲内かどうかを、仮説検定の手順に沿って確認します。
ステップ1:仮説の設定
帰無仮説\( H_0 \):AとBのコンバージョン率に差はない(\( p_A = p_B \))
対立仮説\( H_1 \):AとBのコンバージョン率には差がある(\( p_A \neq p_B \))
ステップ2:有意水準の設定
今回は一般的な慣習に従い、有意水準\( \alpha=0.05 \)(5%)、両側検定として事前に設定します。
ステップ3:検定統計量の計算
2つの比率の差を検定するZ検定では、まず両群を合わせた全体の比率(プールした比率)\( \hat{p} \)を求めます。
\( \hat{p} = \displaystyle\frac{50+75}{1000+1000} = \frac{125}{2000} = 0.0625 \)
この\( \hat{p} \)を使って、標準誤差を求めます。
\( SE = \sqrt{\hat{p}(1-\hat{p})\left(\displaystyle\frac{1}{n_A}+\frac{1}{n_B}\right)} = \sqrt{0.0625 \times 0.9375 \times 0.002} \approx 0.0108 \)
Z値は、2群の比率の差を標準誤差で割って求めます。
\( Z = \displaystyle\frac{p_B – p_A}{SE} = \frac{0.075 – 0.050}{0.0108} \approx 2.31 \)
ステップ4:p値の算出と判定
標準正規分布において、Z値が2.31以上(またはマイナス2.31以下)になる確率を両側で合計すると、p値はおよそ0.021(2.1%)となります。有意水準5%と比較すると\( p \approx 0.021 < 0.05 \)であるため、帰無仮説を棄却し、「AとBのコンバージョン率には統計的に有意な差がある」と判定します。
なお、事前に「新デザインは旧デザインより悪くなることはない」という前提のもとで片側検定を計画していた場合には、p値はおよそ半分の0.010程度になります。ただし前節で確認したとおり、この判断は結果を見る前に決めておくべきものであり、両側検定の結果を見てから片側検定に切り替えるのは不適切です。
この結果を社内に報告する際には、「p値が0.021だったので有意差があった」という一文だけで終わらせず、コンバージョン率が5.0%から7.5%へと2.5ポイント改善したこと、そしてその改善が偶然のばらつきでは説明しにくい水準であることの2点をあわせて伝えるようにします。p値はあくまで「偶然かどうか」を判断する材料であり、改善幅そのものの大きさや、施策を本格導入した場合に見込める売上への影響は、別途整理して示す必要があります。

先ほどの計算を、Pythonで確認します。まずは検定統計量の計算式をそのままコードに落とし込む方法です。
import numpy as np
from scipy.stats import norm
# 施策前後、または2群のコンバージョン数とサンプルサイズ
x_a, n_a = 50, 1000 # A(旧デザイン)
x_b, n_b = 75, 1000 # B(新デザイン)
p_a = x_a / n_a
p_b = x_b / n_b
# プールした比率(帰無仮説「差はない」のもとでの共通の比率)
p_pool = (x_a + x_b) / (n_a + n_b)
# 標準誤差
se = np.sqrt(p_pool * (1 - p_pool) * (1 / n_a + 1 / n_b))
# Z値とp値(両側検定)
z = (p_b - p_a) / se
p_value = 2 * (1 - norm.cdf(abs(z)))
print(f"p_a={p_a:.3f}, p_b={p_b:.3f}")
print(f"Z値={z:.3f}, p値={p_value:.3f}")
# Z値=2.309, p値=0.021 程度
計算式を毎回書くのは実務的ではないため、比率の差の検定には、statsmodelsのproportions_ztestを使うのが簡便です。同じデータで結果を確認します。
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
# 前のコード例と同じデータ
x_a, n_a = 50, 1000 # A(旧デザイン)
x_b, n_b = 75, 1000 # B(新デザイン)
# 各群のコンバージョン数とサンプルサイズを配列で渡す
count = np.array([x_b, x_a]) # [B, A] の順でコンバージョン数
nobs = np.array([n_b, n_a]) # [B, A] の順でサンプルサイズ
z_stat, p_val = proportions_ztest(count, nobs, alternative='two-sided')
print(f"Z値={z_stat:.3f}, p値={p_val:.3f}")
# Z値=2.309, p値=0.021 程度(手計算の結果と一致)
proportions_ztestは、既定の設定では帰無仮説「差はない」を前提としたプールした比率を使って標準誤差を計算するため、先ほどの手計算とほぼ同じ結果が得られます。alternative引数に'larger'や'smaller'を指定すれば、片側検定として計算することもできます。ただし、前述のとおり片側検定を選ぶかどうかは分析前に決めておくべき事項であり、結果を見てから引数を変更することのないよう注意が必要です。
本章では、仮説検定を「帰無仮説を立て、それが否定できるかどうかを確率で評価する」枠組みとして捉え直し、p値の正確な定義、有意水準の恣意性、片側・両側検定の使い分け、そして統計的有意性と実務的有意性の違いを確認しました。仮説検定の結果は、それ単体で意思決定の答えを与えてくれるものではありません。有意水準をどこに置くか、検出力は十分か、効果の大きさは投資に見合うかといった判断は、いずれも検定の外側で人間が下す必要があります。この視点を持ったうえで、次章では目的とデータの種類に応じた検定手法の使い分けを整理します。検出力とサンプルサイズの設計は第10章で扱います。
『統計的方法のしくみ』(永田靖、日科技連出版社):仮説検定を含む統計的方法の考え方を、数式の手前にある「なぜそう考えるのか」という部分から丁寧に説明している入門書です。帰無仮説を立てる発想や有意水準の意味づけについて、本章の内容をより基礎から確認したい場合の一冊としておすすめします。
前章までで、仮説検定の骨格(帰無仮説・対立仮説・p値・有意水準・検定力)を確認しました。本章では、その骨格の上に乗る具体的な検定手法を整理します。検定手法は数十種類存在しますが、実務で頻繁に使うものはそれほど多くありません。迷ったときに立ち返るべき問いは2つだけです。1つ目は「何を比べたいのか」、平均値なのか比率なのか、分布の形やカテゴリの偏りなのか。2つ目は「データがどんな性質を持っているか」、正規分布に近い間隔・比率尺度なのか、分布が歪んでいるのか、順序尺度やカテゴリデータなのか、という点です。この2軸を組み合わせると、使うべき検定はほぼ機械的に絞り込めます。
本章では、比率の差を比べるZ検定、平均値の差を比べるt検定(対応なし・対応あり)、分散の差を比べるF検定とLevene検定、カテゴリデータの関連や分布の適合を調べるカイ二乗検定、正規性が疑わしいときのノンパラメトリック検定、3群以上をまとめて比べる分散分析(ANOVA)の順に見ていきます。最後に、これらを一枚で見渡せる早見表を用意しました。

Webサイトの改善施策を試すA/Bテストでは、「コンバージョン率が改善したかどうか」を確かめたい場面が頻繁にあります。コンバージョン率のような「成功か失敗か」の二値データの比率を2群で比較する際に使われるのが、比率の差のZ検定です。
考え方はシンプルです。パターンAの標本比率を \( \hat{p}_1 \)、パターンBの標本比率を \( \hat{p}_2 \) とし、両群を合わせた全体の比率(プールした比率)を \( \hat{p} \) とすると、検定統計量は \( Z = \frac{\hat{p}_1 – \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \) となり、この \( Z \) が標準正規分布に従うとみなして検定します。標準正規分布への近似が成り立つには、各群でおおよそ「成功数」と「失敗数」がともに一定数(目安として5から10以上)確保されている必要があります。表示回数が数十件しかないような施策の初期段階では、この前提が崩れやすいため注意が必要です。
比率の差のZ検定は、母平均の差を扱うt検定と同じ発想に立つ検定です。標本サイズが大きければ、t検定を用いた場合と近い結果になります。実務ではstatsmodelsのproportions_ztest関数がよく使われますが、上記の式をnumpyで直接計算しても構いません。根底にあるのは「2つの比率の差を、そのばらつきの大きさで割って標準化する」という考え方です。
2つの独立したグループの平均値に差があるかを調べる、最も基本的な検定がt検定です。例えば、新しい研修プログラムを受けた社員グループと受けていないグループとで、業務処理時間の平均に差があるかを確認したい場合に使います。対応のない(独立な)2標本のt検定には、実は前提の異なる2種類が存在します。
1つ目はStudentのt検定です。2つの母集団の分散が等しい(等分散性)という仮定を置き、両群のデータをプールして共通の分散を推定したうえで検定統計量を計算します。もう1つはWelchのt検定で、等分散性の仮定を置かず、各群の分散をそのまま使い、自由度を近似式(Welch-Satterthwaite近似)で調整します。Welchのt検定では自由度が整数にならないことが多く、これは2群の分散・サンプルサイズの違いを反映した結果です。
ここで実務上重要なのが、scipy.stats.ttest_indのデフォルト挙動です。この関数はequal_varという引数を持ちますが、既定値はequal_var=Trueであり、何も指定しなければStudentのt検定が実行されます。Welchのt検定を使うには、equal_var=Falseを明示的に指定する必要があります。既定値を知らずに「scipyでt検定をした」というだけでは、実際にどちらの検定を使ったのか分からない状態になってしまいます。
では、実務ではどちらを既定にすべきでしょうか。2群の分散とサンプルサイズがともに揃っている場合、StudentとWelchの結果はほぼ一致します。しかし分散もサンプルサイズも異なる場合、Studentのt検定は第1種の過誤(本当は差がないのに「差がある」と判定する誤り)の実際の発生率が設定した有意水準からずれることが知られています。一方Welchのt検定は、そうした偏りがあっても検出力の損失はごくわずかで、過誤率を設定水準に近く保てます。この違いから、近年の統計学では「等分散性が確実な場合を除き、まずWelchを既定にする」という考え方が広がっています。
研修の前後で同じ社員のテスト点数を比較する、施策導入前後で同じ店舗の売上を比較するといった場面では、2つのグループは独立ではなく、同一の対象(人・店舗など)から得られた対応のあるデータになります。このような場合は、対応のあるt検定(paired t-test)を使います。
対応のあるt検定は、各ペアについて「後の値から前の値を引いた差」を計算し、その差の平均がゼロと異なるかを1標本のt検定として検定する考え方に基づきます。対応のない2標本のt検定と違い、個体差(もともと成績が良い社員、もともと売上が高い店舗といった固有のばらつき)が差を取る段階で相殺されるため、同じサンプルサイズでも小さな差を検出しやすくなります。Pythonではscipy.stats.ttest_relに前後2つの系列を対応する順序で渡して計算します。順序を対応させずに渡すと、ペアの関係自体が崩れるため注意が必要です。
Studentのt検定を使うかWelchのt検定を使うかを、事前に「等分散性の検定」で決めるという手順が、統計学の教科書では長らく紹介されてきました。この等分散性の検定として使われるのがF検定とLevene検定です。
F検定は、2群の分散の比 \( F = s_1^2 / s_2^2 \) を計算し、これが自由度 \( (n_1-1, n_2-1) \) のF分布に従うとみなして検定します。考え方は単純ですが、両群のデータが正規分布に従っていることを強く仮定しており、この前提から少しでも外れると検定結果の信頼性が大きく損なわれます。つまりF検定は正規性からの逸脱に非常に敏感で、分散の差を調べているつもりが実際には分布の形の違いを拾ってしまうことが起こりえます。
この弱点を補うのがLevene検定です。各データ点について群内の中心からの絶対偏差を計算し、その絶対偏差を使って一元配置分散分析と同様の手続きを行うという設計になっており、正規性への依存度がF検定よりはるかに低い(頑健な)検定です。scipy.stats.levene関数のcenter引数は既定でcenter=’median’になっており、中央値を中心に使うBrown-Forsythe型の変種が標準の挙動です。center=’mean’を指定すると平均を中心に使う古典的なLevene検定になり、既定の中央値版の方が、分布が歪んでいたり外れ値を含んでいたりするデータに対してより頑健とされています。
ここで問題になるのが、「まずF検定(またはLevene検定)で等分散性を確認し、その結果に応じてStudentかWelchかを選ぶ」という一見合理的な手順そのものです。この手順は、1つの分析の中で複数の検定を条件分岐的につなげる「検定の多段化」に当たります。等分散性の検定自体が誤りを含みうる確率的な手続きであるため、その結果で後続のt検定の種類を切り替えると、最終的な結論に対する全体の誤り率は個々の検定の有意水準どおりにはならず歪みます。加えてF検定自体が正規性に敏感で不安定なため、判定を誤り適切でない方のt検定に進んでしまうリスクも重なります。
等分散性を毎回検定してからt検定の種類を選ぶという古典的な手順は、検定を連続してつなげることで全体の誤り率を歪めてしまう「検定の多段化」の一例です。実務上は、等分散性が確実に分かっている特別な場合を除き、最初からWelchのt検定を既定として使う方が、手順もシンプルになり、結果の信頼性も安定します。
ここまでは間隔・比率尺度の数値データを扱ってきましたが、実務では「年代別に商品の好みは異なるか」「アンケートの回答傾向は部署によって違うか」といった、カテゴリ同士の関連を調べたい場面も多くあります。こうした名義尺度のデータに対して使われる代表的な手法がカイ二乗検定で、独立性の検定と適合度の検定という2つの用途があります。
独立性の検定は、2つのカテゴリ変数を掛け合わせたクロス集計表(分割表)を使い、行のカテゴリと列のカテゴリが互いに独立(無関係)かどうかを検定します。例えば、回答者の年代(3区分)とサービス継続意向(継続する/しない)のクロス集計表を作り、「年代によって継続意向の傾向が異なるか」を確認する場合がこれに当たります。scipy.stats.chi2_contingency関数にクロス集計表を渡すと、カイ二乗値・p値・自由度・各セルの期待度数がまとめて得られます。なお2行2列(2×2)の分割表では、この関数は既定でYatesの連続性補正を適用します。
適合度の検定は、手元の観測度数が、あらかじめ想定した理論上の比率(期待度数)にどれだけ一致しているかを検定します。例えばサイコロを600回振った結果が、6つの目それぞれ均等な確率(1/6)から得られていると言えるかを確認する場合に使います。Pythonではscipy.stats.chisquare関数に観測度数と期待度数を渡して計算します。
カイ二乗検定を使ううえで注意すべきなのが、期待度数が小さいセルが含まれる場合です。カイ二乗分布への近似は各セルの期待度数がある程度大きいことを前提にしており、目安として、いずれのセルの期待度数も5以上であることが望ましいとされています(全セルの2割を超えて期待度数5未満のセルがある場合や、期待度数が1未満のセルが1つでもある場合は近似の精度に疑いが生じるという経験則がよく使われます)。サンプルサイズが小さいアンケートやまれな事象を扱う集計表では、この条件を満たせないことが少なくありません。このような場合は、近似に頼らず正確な確率を計算するFisherの正確検定を使います。周辺度数(行・列の合計)を固定した条件のもとで、観測パターン以上に偏った表が得られる確率を超幾何分布から直接計算する手法で、主に2行2列の分割表に対してscipy.stats.fisher_exact関数で計算できます。
t検定は、特にサンプルサイズが小さい場合、データがおおむね正規分布に従うことを前提とします。しかし実務データには、外れ値が多い、分布が大きく片側に歪んでいる、あるいは間隔尺度ではなく順序尺度(5段階評価の満足度アンケートなど、数値の間隔に意味がないデータ)であるケースが少なくありません。こうした場合の選択肢が、観測値の大きさではなく順位(ランク)に変換して検定を行うノンパラメトリック検定です。
対応のない2群を比べる場合の代表格が、Mann-WhitneyのU検定(Wilcoxonの順位和検定とも呼ばれます)です。全データをまとめて順位付けし、各群の順位の合計や偏りから、一方の群の値がもう一方より系統的に大きい(小さい)傾向があるかを検定します。両群の分布の形がほぼ同じという条件のもとでは、中央値の差の検定とおおまかに解釈できます。scipy.stats.mannwhitneyu関数を使い、alternative引数で両側検定か片側検定かを明示します。
対応のある2群を比べる場合のノンパラメトリック版が、Wilcoxonの符号付き順位検定です。対応のあるt検定と同じく各ペアの差を計算しますが、差の値そのものではなく、差の絶対値の順位と符号を使って検定を行います。Pythonではscipy.stats.wilcoxon関数で計算します。
パラメトリック検定(t検定)とノンパラメトリック検定のどちらを選ぶべきかは、一律の正解があるわけではなく状況に応じた判断になります。サンプルサイズが十分大きい場合(目安として各群30程度以上)は、中心極限定理の働きにより元のデータが多少非正規でもt検定は比較的頑健に機能します。逆に小標本で正規性を確認しづらい場合や、データが明確に順序尺度である場合は、ノンパラメトリック検定を選ぶ方が無難です。ただしノンパラメトリック検定は情報を順位という粗い形に置き換えるため、実際に正規性が成り立つデータに使うと、t検定に比べて検出力がやや劣る傾向があります。
比較したいグループが2群ではなく3群以上になる場面も多くあります。3つの広告クリエイティブのクリック率を比べる、4つの営業拠点の平均成約日数を比べるといった場合です。ここで「2群ずつペアにしてt検定を繰り返せばよいのでは」と考えたくなりますが、これは避けるべき進め方です。
理由は、検定を繰り返すたびに「偶然差があると誤って判定してしまう確率」が積み上がっていくためです。仮に3群の比較で、AとB、AとC、BとCという3通りのペアにそれぞれ有意水準5%のt検定を独立に行うと、少なくとも1つのペアで誤って有意と判定してしまう確率は、単純計算で \( 1 – (1 – 0.05)^3 \approx 14.3\% \) まで上昇します。比較するグループの数が増えるほど、この上昇は加速します。個々の検定は5%の水準を守っていても、分析全体で見たときの誤り率(家族単位の有意水準)は、もはや5%ではなくなってしまうのです。
この問題を避けるために使われるのが、分散分析(ANOVA: Analysis of Variance)です。特に、要因が1つで3群以上の平均値を一度に比較する手法を一元配置分散分析と呼びます。全体のばらつきを「群間のばらつき(グループ間の平均の違いに由来する部分)」と「群内のばらつき(各グループ内の個体差に由来する部分)」に分解し、その比(F統計量)を使って「少なくとも1つの群の平均が他と異なるか」を1回の検定でまとめて判定します。Pythonではscipy.stats.f_oneway関数に、比較したい各群のデータを渡すことで計算できます。
注意すべきなのは、ANOVAで有意な結果が得られても「3群のどこかに差がある」ことを示すに留まり、「具体的にどのペアの間に差があるのか」までは教えてくれない点です。どのペアに差があるかを特定するには、ANOVAの後に行う追加の比較(post-hoc検定、TukeyのHSD検定やBonferroni補正付きの多重比較など)が必要になります。この考え方と具体的な補正手法は、次の第11章で詳しく扱います。

ここまで扱った検定を、「何を比べたいか」と「データの種類」という2軸で整理すると、次のようになります。実務で迷ったときは、まずこの表で候補を絞り込み、必要に応じて各節に戻って前提条件を確認する使い方を想定しています。
| 比べたいもの | 間隔・比率尺度で正規性がある(標本が大きい場合を含む) | 間隔・比率尺度で正規性が疑わしい、または順序尺度 | 名義尺度(カテゴリ) |
|---|---|---|---|
| 2群の代表値の差(対応なし) | Studentのt検定/Welchのt検定(等分散が確実でなければWelchを既定に) | Mann-WhitneyのU検定 | カイ二乗検定(独立性の検定、2×2ならZ検定でも可) |
| 2群の代表値の差(対応あり) | 対応のあるt検定 | Wilcoxonの符号付き順位検定 | McNemar検定(参考。本書では扱わない) |
| 3群以上の代表値の差 | 一元配置分散分析(ANOVA) | Kruskal-Wallis検定(参考。ANOVAのノンパラ版) | カイ二乗検定(独立性の検定、3群以上のクロス集計表) |
| 2群の比率の差 | 比率の差のZ検定 | (該当なし、比率データはそのままZ検定/カイ二乗検定で扱う) | カイ二乗検定(2×2表)、期待度数が小さければFisherの正確検定 |
| 2群のばらつき(分散)の差 | F検定(正規性の前提に注意) | Levene検定(頑健、正規性への依存が低い) | (該当なし) |
| 観測度数と理論比率の適合 | (該当なし) | (該当なし) | カイ二乗適合度検定(期待度数が小さい場合はカテゴリの統合や正確検定を検討) |
表中のMcNemar検定とKruskal-Wallis検定は本章では詳しく扱っていませんが、対応のあるカテゴリデータの比較(McNemar検定)、3群以上のノンパラメトリックな比較(Kruskal-Wallis検定)という位置づけを知っておくと、実務で新しい場面に出会ったときの手がかりになります。
ここまでの内容を、scipy.statsのコード例で確認します。まずはt検定です。対応のない2群でStudentとWelchのt検定を並べて計算し、続けて対応のある2群のt検定も計算します。
import numpy as np
from scipy import stats
# 研修導入群/非導入群の業務処理時間(分、対応なし2群)
trained_group = np.array([32, 28, 35, 30, 27, 33, 29, 31, 36, 26])
untrained_group = np.array([25, 27, 24, 26, 23, 28, 22, 25, 29, 24])
# equal_var=Trueがscipyの既定値(Student)
t_student, p_student = stats.ttest_ind(trained_group, untrained_group, equal_var=True)
# Welchはequal_var=Falseを明示指定
t_welch, p_welch = stats.ttest_ind(trained_group, untrained_group, equal_var=False)
print(f"Studentのt検定: t={t_student:.3f}, p={p_student:.4f}")
print(f"Welchのt検定 : t={t_welch:.3f}, p={p_welch:.4f}")
# 同一10店舗の施策前後の売上(万円、対応あり2群)
sales_before = np.array([120, 135, 110, 142, 128, 119, 133, 125, 138, 121])
sales_after = np.array([128, 140, 118, 150, 130, 125, 139, 130, 145, 126])
t_paired, p_paired = stats.ttest_rel(sales_before, sales_after)
print(f"対応のあるt検定: t={t_paired:.3f}, p={p_paired:.4f}")
equal_varを指定しない場合はStudentのt検定になる点、対応のある検定にはttest_relという別関数を使う点が見落としやすいポイントです。
続いてカイ二乗検定です。独立性の検定、適合度の検定、期待度数が小さい場合の代替手段であるFisherの正確検定をまとめて確認します。
import numpy as np
from scipy import stats
# 年代(3区分)×継続意向(継続/非継続)のクロス集計表
contingency_table = np.array([
[88, 42], # 20-30代
[95, 55], # 40-50代
[60, 60], # 60代以上
])
chi2, p_value, dof, expected = stats.chi2_contingency(contingency_table)
print(f"独立性の検定: カイ二乗値={chi2:.3f}, p値={p_value:.4f}, 自由度={dof}")
print("期待度数:\n", expected)
# サイコロ600回の出目が一様分布(各1/6)に従うか
observed_dice = np.array([88, 105, 96, 110, 102, 99])
expected_dice = np.array([100, 100, 100, 100, 100, 100])
chi2_gof, p_gof = stats.chisquare(observed_dice, f_exp=expected_dice)
print(f"適合度の検定: カイ二乗値={chi2_gof:.3f}, p値={p_gof:.4f}")
# 期待度数が小さい2×2表はFisherの正確検定を使う
small_table = np.array([[8, 2], [3, 9]])
odds_ratio, p_fisher = stats.fisher_exact(small_table)
print(f"Fisherの正確検定: オッズ比={odds_ratio:.3f}, p値={p_fisher:.4f}")
最後にノンパラメトリック検定です。外れ値を含む2群の比較にMann-WhitneyのU検定を、順序尺度の前後比較にWilcoxonの符号付き順位検定を使います。
import numpy as np
from scipy import stats
# 2営業チームの成約日数(外れ値あり、対応なし)
team_a_days = np.array([5, 6, 4, 30, 5, 7, 6, 5, 8, 6])
team_b_days = np.array([9, 10, 8, 11, 9, 35, 10, 9, 12, 10])
u_stat, p_mw = stats.mannwhitneyu(team_a_days, team_b_days, alternative="two-sided")
print(f"Mann-WhitneyのU検定: U={u_stat:.1f}, p={p_mw:.4f}")
# 研修前後の5段階満足度(順序尺度、対応あり)
satisfaction_before = np.array([2, 3, 2, 4, 3, 2, 3, 1, 3, 2])
satisfaction_after = np.array([3, 4, 3, 4, 4, 3, 3, 2, 4, 3])
w_stat, p_wilcoxon = stats.wilcoxon(satisfaction_before, satisfaction_after)
print(f"Wilcoxonの符号付き順位検定: W={w_stat:.1f}, p={p_wilcoxon:.4f}")
いずれのコードも、検定統計量とp値をペアで受け取る共通のインターフェースです。どの検定を使う場合でも、p値だけでなく前提条件(正規性、等分散性、対応の有無、期待度数の大きさなど)を満たしているかを事前に確認する習慣が重要です。
検定手法の選択は、「平均か比率か、分布の形やカテゴリの偏りか」という比較対象と、「正規性のある間隔尺度か、順序尺度か、カテゴリデータか」というデータの性質の組み合わせで、機械的に絞り込めます。前提条件を確認せずに手元の検定を当てはめるのではなく、早見表を起点に条件に合った検定を選ぶ姿勢が、誤った結論を避ける第一歩になります。
次章では、検定の判断が間違いうる2つのパターン(第1種・第2種の過誤)と検定力、効果量、そしてサンプルサイズの設計を取り上げます。p値の誤解と、3群以上の比較で予告した多重比較の補正手法は、第11章で詳しく扱います。
『入門 統計解析法』(永田靖、日科技連出版社):t検定、F検定、カイ二乗検定、分散分析を数式の導出も含めて体系的に解説しており、本章で扱った各検定の前提条件や検定統計量の成り立ちを深く理解したい読者に適した1冊です。
仮説検定は、手元のデータから「差がある」「効果がある」といった判断を下すための手続きですが、その判断は確率的な手続きの上に成り立っており、常に正しい結論を保証するものではありません。真実がどうであるかにかかわらず、検定は限られた標本から推測を行う以上、一定の確率で判断を誤ります。この誤りには性質の異なる2種類があり、両者を区別して理解しておくことが、検定を実務で正しく使いこなすための出発点になります。
1つ目は第1種の過誤(Type I error)と呼ばれる誤りで、確率記号のαで表されます。これは、本当は差がない(帰無仮説が真である)にもかかわらず、検定の結果「差がある」と判断してしまう誤りです。何もないところに何かがあると誤って報告してしまう、いわば「あわてて結論を出しすぎる」誤りといえます。2つ目は第2種の過誤(Type II error)で、確率記号のβで表されます。これは、本当は差がある(帰無仮説が偽である)にもかかわらず、検定の結果「差がない」と判断してしまう誤り、つまり本当にある効果を見逃してしまう誤りです。
この2種類の誤りと、2種類の正しい判断を合わせて整理すると、次のような2×2の表になります。仮説検定にまつわる議論の大半は、この表のどこに重みを置くかという話に帰着します。
| 判断: 差なし(帰無仮説を棄却しない) | 判断: 差あり(帰無仮説を棄却する) | |
|---|---|---|
| 真実: 実際には差がない | 正しい判断(確率 1-α) | 第1種の過誤(確率α) |
| 真実: 実際には差がある | 第2種の過誤(確率β) | 正しい判断・検定力(確率 1-β) |
この構造は、刑事裁判の比喩でイメージするとつかみやすくなります。「被告人は無罪である」を帰無仮説だとすると、無実の人を誤って有罪にしてしまうのが第1種の過誤(冤罪)であり、本当は有罪の人を証拠不十分で無罪にしてしまうのが第2種の過誤(見逃し)です。近代の刑事司法制度が「疑わしきは罰せず」という原則を採用し、有罪の立証に高いハードルを課しているのは、冤罪(第1種の過誤)をできるだけ小さく抑えようとする設計思想の表れだといえます。
製造業の品質検査にも、同じ構造がそのまま当てはまります。ロットの中身が実際には基準を満たす良品であるにもかかわらず、検査で不良と判定して出荷を止めてしまう誤りは、生産者にとっての損失であることから生産者危険と呼ばれ、第1種の過誤に対応します。逆に、実際には基準を満たさない不良品であるにもかかわらず、検査をすり抜けて良品と判定し出荷してしまう誤りは、それを受け取る顧客側の損失であることから消費者危険と呼ばれ、第2種の過誤に対応します。品質管理の分野でこの2つの言葉が古くから使われてきたこと自体、どちらの過誤が誰にとってどれだけ痛いかを常に意識する必要があったことを物語っています。

αとβはどちらも小さいに越したことはありませんが、同じサンプルサイズで検定を設計する限り、一方を小さくしようとすれば他方が大きくなるというトレードオフの関係にあります。そのため実務では、「自社の意思決定にとって、どちらの過誤がより痛手になるか」を先に見極め、そのうえで検定の設計に反映させる姿勢が求められます。
医療分野のがん検診を例に考えます。検診で本当は病気があるのに「異常なし」と判定してしまう第2種の過誤は、治療の機会を逃し、病状の進行を許してしまうという、取り返しのつかない結果につながりかねません。一方で、本当は健康なのに「要精密検査」と判定してしまう第1種の過誤は、受診者に心理的な負担と追加の検査費用を強いますが、精密検査によって最終的には健康であることが確認できます。この非対称性から、多くのスクリーニング検査は、第1種の過誤がある程度増えることを許容してでも、第2種の過誤(見逃し)を極力小さくする、すなわち検出力を高く設定する方向で設計されます。
品質管理の現場では、扱う製品の性質によって重みづけが変わります。人命に関わる部品(自動車のブレーキ部品や医療機器など)を扱う工程では、消費者危険(不良品を見逃して出荷してしまう第2種の過誤)を極小化することが最優先され、多少の良品を余分に廃棄するコスト(生産者危険、第1種の過誤の増加)は許容されるのが一般的です。一方、廃棄コストが高く安全性への影響が限定的な製品では、両者のバランスを取った検査基準が選ばれます。
マーケティング施策やA/Bテストの評価では、両者の痛みが比較的対称に近いことが多く見られます。効果のない施策を「効果あり」と誤認して展開を続けてしまう第1種の過誤は、その施策への投資と機会損失を生みます。逆に、本当に効果のある施策を「効果なし」と判断して見送ってしまう第2種の過誤も、得られたはずの成果を取り逃す機会損失を生みます。このような場面では、慣習的な水準であるα=0.05(有意水準5%)と検定力80%を出発点にしつつ、意思決定の重みに応じて微調整するという進め方が現実的です。
第2種の過誤の確率βの裏返しとして定義される 1-β を検定力(power)と呼びます。検定力とは、「本当に差がある(あるいは効果がある)状況で、検定がそれを正しく検出できる確率」のことです。βが「見逃してしまう確率」であるのに対し、検定力は「見逃さずに捉えられる確率」であり、実験やA/Bテストを設計する担当者にとっては、こちらの言い方の方が直感的に理解しやすいかもしれません。
検定力が低い検定は、たとえ本当に効果が存在していても、その効果を統計的に検出できないまま終わってしまう可能性が高くなります。逆に検定力が高い検定は、本当に存在する効果をきちんと拾い上げる力があります。心理学者ジェイコブ・コーエンが体系化した効果量・検定力の枠組みでは、検定力80%(β=20%)が実務上の目安として広く定着しており、実験計画やA/Bテストのサンプルサイズ設計においても、この80%という水準がデファクトスタンダードとして使われることが一般的です。医療分野など見逃しの代償が特に大きい領域では、90%やそれ以上の検定力を目標に設定するケースもあります。
検定力は単独で決まるものではなく、次の4つの要素が数学的に結びついた関係の中で決まります。
重要なのは、この4つのうち3つを固定すると、残りの1つは自動的に決まってしまうという点です。実務でよく使われるのは、次の2つの使い方です。1つは、検出したい効果量・有意水準・目標とする検定力を先に決め、そこから必要なサンプルサイズを逆算する使い方です。もう1つは、すでに確保できるサンプルサイズが決まっている状況で、有意水準と効果量から実現できる検定力を事前に見積もる使い方です。本章で扱うA/Bテストのサンプルサイズ設計は前者にあたり、実験を始める前にnを決めるという発想の中核をなします。
α・β・効果量・サンプルサイズの4つは独立には決まらず、互いに結びついたトレードオフの関係にあります。「有意水準を厳しくしたい」「検出力を高くしたい」「小さな差も検出したい」という要求は、いずれもサンプルサイズを増やす方向に働きます。この関係を理解しないまま検定を設計すると、必要なnを大きく見誤ることになります。
なお実務上のサンプルサイズ設計では、2つの群を必ずしも同じ人数ずつ割り付けるとは限りません。既存の運用(コントロール群)は普段どおり大量に流し続けられる一方、新しい施策(処置群)は運用コストやリスクの都合で少人数にしか割り付けられない、といった制約がしばしば生じます。statsmodelsのsolve_powerメソッドが受け取るratio引数は、まさにこの「2群の人数比」を調整するためのもので、ratio=1.0は均等割り付け、ratio=2.0はコントロール群を処置群の2倍にする設計を意味します。均等割り付けから離れるほど、同じ検定力を得るために必要な総サンプルサイズはやや増える傾向があるため、割り付け比率を変える場合はその点も踏まえて全体の必要人数を見積もる必要があります。
検定力の議論に欠かせないもう1つの概念が効果量(effect size)です。効果量とは、2つの群の差を、データのばらつきの大きさで割って標準化した指標であり、単位に依存せず「差の大きさ」そのものを表現できる点に特徴があります。2つの平均値を比較する場面で最もよく使われる効果量がCohen’s d(コーエンのd)で、次のように定義されます。
\( d = \dfrac{\bar{x}_1 – \bar{x}_2}{s_{pooled}} \)
分子は2群の平均の差、分母は2群を合わせて計算した標準偏差(プールされた標準偏差)です。同じ「平均の差が5点」であっても、ばらつきが小さい集団での5点差と、ばらつきが大きい集団での5点差では意味合いがまったく異なります。効果量は、この「ばらつきに対する相対的な差の大きさ」を1つの数値に圧縮したものだと考えると理解しやすくなります。
Cohen’s dの大きさをどう解釈すればよいかについては、提唱者のコーエン自身が経験則としての目安を示しており、現在でも広く参照されています。
| 効果量(Cohen’s d) | 目安 | イメージ |
|---|---|---|
| d ≈ 0.2 | 小さい効果 | 肉眼ではほとんど分からない程度の差 |
| d ≈ 0.5 | 中程度の効果 | 注意深く見れば分かる程度の差 |
| d ≈ 0.8 | 大きい効果 | 比較的はっきりと分かる程度の差 |
このコーエンの目安は、あくまで社会科学分野を念頭に置いた経験則にすぎません。業界や指標の性質によって「意味のある差」の大きさは異なるため、目安を機械的に当てはめるのではなく、自社のビジネス上、どの程度の差であれば意思決定に影響するかを踏まえて解釈する姿勢が欠かせません。
なぜp値だけでなく、効果量まで確認する必要があるのでしょうか。p値は「偶然では説明しにくい差かどうか」を表す指標であり、効果量とサンプルサイズの両方の影響を受けて決まります。同じ効果量であっても、サンプルサイズを増やせばp値はいくらでも小さくできてしまいます。つまりp値が小さい(統計的に有意である)ことは、その差が実務上意味のある大きさであることを何も保証しません。「統計的に有意」という言葉だけを見て意思決定をすると、実際にはごくわずかな、ビジネス上ほとんど無視できる差に対して、大きな投資判断を下してしまう危険があります。この点は本章の後半で改めて具体的に扱います。
効果量・有意水準・検定力の関係が分かれば、「この程度の差を検出したいなら、何人(何件)のデータが必要か」を、実験を実施する前に逆算できます。これがサンプルサイズ設計という考え方です。実務でありがちな失敗は、明確なnの目標を決めないままA/Bテストを開始し、日々の結果を眺めながら「そろそろ有意差が出たから終了しよう」と、都度検定を繰り返しながら判断してしまうことです。この進め方は、偶然による誤検出の確率を実質的につり上げてしまう問題をはらんでおり、詳しくは次章(第11章)で扱いますが、そもそもの前提として、事前にnを固定して設計しておくことが、この問題を避ける最も確実な方法になります。
Pythonでは、statsmodelsのpowerモジュールを使うことで、効果量・有意水準・検定力の3つから必要なサンプルサイズを簡単に計算できます。2群の平均を比較するt検定であれば、TTestIndPowerクラスのsolve_powerメソッドを使います。
from statsmodels.stats.power import TTestIndPower
analysis = TTestIndPower()
alpha = 0.05
power_target = 0.80
# 効果量(Cohen's d)ごとに必要なサンプルサイズ(1群あたり)を計算
for label, d in [("小(d=0.2)", 0.2), ("中(d=0.5)", 0.5), ("大(d=0.8)", 0.8)]:
n = analysis.solve_power(
effect_size=d,
alpha=alpha,
power=power_target,
ratio=1.0,
alternative="two-sided",
)
print(f"{label}: 1群あたり約{n:.0f}人が必要")
このコードを実行すると、有意水準5%・検定力80%という同じ条件のもとでも、検出したい効果量によって必要なサンプルサイズが大きく異なることが分かります。小さい効果(d=0.2)を検出するには1群あたり約390人以上、中程度の効果(d=0.5)であれば約60〜65人程度、大きい効果(d=0.8)であれば約25〜30人程度が目安になります。検出したい差が小さくなるほど、必要なnは急激に増えていく関係にあることが、この数値からも読み取れます。
Webサイトのボタン改善やキャンペーンの効果測定など、A/Bテストの多くは「成約率」「クリック率」「継続率」といった比率(コンバージョン率)の差を検定します。比率の差を扱う場合は、平均値の差とは異なる効果量の定義が必要になります。比率は0から1の範囲に収まるため、同じ「1ポイントの差」であっても、50%付近での差と1%付近での差では検出のしやすさが変わってしまうためです。この範囲の制約による歪みをならす変換がアークサイン変換で、変換後の2つの値の差をとった効果量がCohen’s h(コーエンのh)です。大きさの目安はCohen’s dと同様に、0.2で小さい効果、0.5で中程度の効果、0.8で大きい効果とされています。statsmodelsではproportion_effectsize関数で2つの比率からこの効果量を計算し、NormalIndPowerクラスで必要なサンプルサイズを求めます。
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
analysis = NormalIndPower()
alpha = 0.05
power_target = 0.80
# ケース1: ベースライン成約率5% -> 6%(相対+20%)の差を検出したい
effect_size_1 = proportion_effectsize(0.06, 0.05)
n1 = analysis.solve_power(effect_size=effect_size_1, alpha=alpha, power=power_target, ratio=1.0)
# ケース2: ベースライン成約率5% -> 10%(相対+100%)の差を検出したい
effect_size_2 = proportion_effectsize(0.10, 0.05)
n2 = analysis.solve_power(effect_size=effect_size_2, alpha=alpha, power=power_target, ratio=1.0)
print(f"5%→6%を検出するには1群あたり約{n1:.0f}人が必要")
print(f"5%→10%を検出するには1群あたり約{n2:.0f}人が必要")
このコードを実行すると、ケース1(5%を6%まで引き上げられたかを検出したい)では1群あたり約8,000〜8,500人程度、ケース2(5%を10%まで引き上げられたかを検出したい)では1群あたり約400〜450人程度という結果になります。ケース1で検出したい差は1ポイント、ケース2で検出したい差は5ポイントです。検出したい差が小さくなるほど必要なnは2乗のオーダーで急増するため、絶対差にしてわずか1ポイントの違いを検出しようとするだけで、必要なサンプルサイズは20倍近くに膨れ上がります。
この関係は、A/Bテストのテスト期間の見積もりにも直結します。例えば1群あたり1日500人ずつ新規に流入するテストを想定すると、ケース2(必要n約420人)であれば1日程度で目標サンプルサイズに到達しますが、ケース1(必要n約8,300人)では2群合わせて必要な人数を集めるのに2週間以上かかる計算になります。「検出したい差をどこまで小さく設定するか」という意思決定が、そのままテストの実施期間やコストに跳ね返ってくることが、この数値感覚から実感できます。

サンプルサイズの設計を怠ると、方向性の異なる2種類の問題が起こり得ます。1つ目は、サンプルサイズが不足しているために検定力が低くなってしまう問題です。検出力不足の状態で検定を行うと、たとえ本当は効果が存在していても、統計的に有意な結果が得られないまま「有意差なし」という結論に至ってしまうことがあります。ここで注意すべきは、「有意差なし」という結果は「差がないことが証明された」ことをまったく意味しない点です。検定力が低い検定における「有意差なし」は、「差を検出できるだけのデータが集まっていなかった」だけかもしれず、これを「効果がない」という結論と混同すると、本当は価値のある施策を誤って見送ってしまう(第2種の過誤)ことになります。検定力の低い実験や調査が積み重なると、組織全体として「効果があるものまで効果なしと判断してしまう」誤った安心が蔓延しかねません。実際、限られた期間・限られた対象者数でしか検証できない小規模な社内実験では、事前にサンプルサイズ設計を行わないまま実施され、結果として検定力が50%を大きく下回るケースも珍しくないとされています。検定力50%とは、本当に効果がある場合でもコインを投げるのと同程度の確率でしか検出できないという意味であり、そのような設計のまま「有意差が出なかったので効果なし」と結論づけるのは、判断の根拠として非常に弱いといえます。
2つ目は、逆にサンプルサイズが極めて大きい場合に起こる問題です。Webサービスのログデータのように数百万件規模のデータを扱う分析では、実務上ほとんど意味を持たないごくわずかな差であっても、サンプルサイズの大きさゆえにp値が極端に小さくなり、「統計的に有意」という結果が機械的に出てしまうことがあります。この場合、p値の小ささだけを見て「重要な差が見つかった」と判断するのは早計です。効果量を必ず併せて確認し、その差が実務上意味のある大きさなのかを見極める必要があります。例えば、コンバージョン率が0.1ポイントだけ改善したという結果が、数百万件規模のデータでp<0.001になったとしても、その0.1ポイントの改善が実装コストや運用コストに見合うものかどうかは、統計的有意性とは別に判断しなければなりません。
「有意差なし」は「効果がない」ことの証明ではなく、検定力不足による見逃しの可能性を常に含んでいます。逆に「有意差あり」も、サンプルサイズが大きければ機械的に得られてしまうことがあり、効果量を伴わない有意性には実務上の意味がありません。p値と効果量は必ずセットで確認する、という原則がここから導かれます。
ここまでの内容を踏まえると、A/Bテストや実験を始める前に確認しておくべき項目が見えてきます。次の3点を事前に整理しておくと、テスト終了後に「サンプルサイズが足りなかった」「いつまで続ければよいか分からない」といった手戻りを防ぎやすくなります。
A/Bテストの実務設計チェックリスト
この3点をテスト開始前に文書化しておくことは、テスト実施中や終了後の解釈のブレを防ぐ意味でも有効です。「途中経過を見て思ったより差が小さそうだから、期間を延ばして様子を見よう」といった場当たり的な判断は、次章で扱う検定の繰り返しに関わる問題を引き起こしやすいため、あらかじめ決めたサンプルサイズと期間を守り切ることが、健全な実験文化の土台になります。
『サンプルサイズの決め方』(永田靖、朝倉書店):検定力分析に基づくサンプルサイズ設計を、平均の差・比率の差・分散分析など多様な検定方式ごとに体系的に解説した専門書です。本章で扱った考え方をより厳密な数式とともに掘り下げたい場合や、statsmodelsでは対応していない特殊な検定方式のサンプルサイズを設計したい場合に、実務上の参照先として役立ちます。
p値は仮説検定の結果を要約する数値として、ビジネスの現場でも「有意差があるかどうか」を判断する基準として広く使われています。しかしp値は誤解されやすい指標でもあり、誤った理解のまま意思決定に使うと、存在しない効果を「効果あり」と報告してしまったり、逆に本当に意味のある差を見落としてしまったりします。まずは、実務でよく見かける誤解を整理しておきます。
| よくある誤解 | 誤解の内容 | 正しい理解 |
|---|---|---|
| p値=帰無仮説が正しい確率 | 「p値が0.03だから、帰無仮説(差がない)が正しい確率は3%だ」と解釈してしまう | p値は、帰無仮説が正しいと仮定したときに、観測された結果と同じか、それ以上に極端な結果が得られる確率であり、帰無仮説そのものが正しい確率ではない |
| p値=結果が偶然である確率 | 「p値が0.03だから、この差が偶然生じた確率は3%だ」と解釈してしまう | p値はあくまで特定の統計モデル(帰無仮説)を前提とした条件付き確率であり、「偶然かどうか」という命題そのものの確率を直接示すものではない |
| 1-pが再現確率 | 「p値が0.03だから、97%の確率で同じ結果が再現される」と解釈してしまう | p値は1回の検定における条件付き確率であり、追試における再現率を直接計算する式にはならない。再現性はサンプルサイズや真の効果量など、別の要因にも大きく左右される |
| p<0.05なら効果は大きい | 統計的に有意であることと、ビジネス上意味のある効果の大きさを混同してしまう | p値はサンプルサイズが大きいほど小さくなりやすく、実務的にごくわずかな差でも大量データがあれば有意と判定されうる。効果の大きさは別途、効果量(平均の差そのものや標準化した指標)で確認する必要がある |
| p>0.05なら差がない証拠 | 有意にならなかった結果を「効果がないことが証明された」と解釈してしまう | 有意にならないことは、差がないことの証明ではなく、多くの場合は「今回のデータでは差を検出できなかった」ことを意味するに過ぎない。サンプルサイズ不足が原因であることも多い |
これらの誤解に共通するのは、p値という1つの数値に「仮説の正しさ」や「結果の重要性」までをまとめて背負わせてしまっている点です。p値はあくまで、ある前提(帰無仮説)のもとでデータの極端さを測る道具の1つであり、単独で意思決定を完結させられる万能な指標ではありません。とりわけ「p<0.05なら意味のある差」「p>0.05なら差がないと証明された」という二値的な思考は、サンプルサイズや効果量といった、意思決定に本来必要な情報を見えなくしてしまう点で、実務上のリスクが大きい誤解だといえます。
p値の誤用が科学研究やビジネス分析に広く根を張っていることへの危機感から、米国統計学会(American Statistical Association、ASA)は2016年、学術誌The American Statisticianに「p値に関する声明(The ASA Statement on p-Values: Context, Process, and Purpose)」を発表しました。統計学の専門家団体が、p値の使い方についてまとまった公式見解を出した点で、これは統計学の実務史における重要な出来事とされています。声明では、p値の適切な使用に関する6つの原則が示されました。
この6原則を貫く考え方は、p値を「有意/非有意」の二値判定に矮小化せず、あくまで分析全体の文脈(サンプルサイズ、研究デザイン、効果量、これまでの知見の蓄積など)の中に位置づけて解釈すべきだという点にあります。ビジネスの現場でも、「p値が0.05を下回ったので施策を全社展開する」といった単純な運用ではなく、効果の大きさや実装コスト、再現性の確認まで含めた総合判断が求められます。

p-hackingとは、分析結果が有意になるまで、検証する変数、対象期間、セグメントの切り方などを次々と変えて試し、たまたま有意になった組み合わせだけを報告する行為を指します。「全体では効果が出なかったが、30代女性に限定すると有意だった」「先月のデータでは差がなかったが、直近2週間だけ見ると有意だった」といった報告の裏側に、意図的か無意識かを問わずp-hackingが潜んでいることがあります。
この行為が問題になる理由は、多重比較の考え方で説明できます。1回の検定で有意水準を5%に設定するということは、本当は効果がない(帰無仮説が真である)状況でも、5%の確率で偶然「有意」という結果が出てしまうことを許容しているという意味です。したがって、効果がない変数やセグメントの組み合わせを何十通りも試せば、そのうちのいくつかは偶然だけで有意な結果になります。分析者が「有意になった組み合わせ」だけを選んで報告してしまうと、実際には存在しない効果を「発見」したかのように見せてしまいます。
この背景には、分析者が意識せずに行使している「分析の自由度(researcher degrees of freedom)」という考え方があります。外れ値を除外するかどうか、期間をどこで区切るか、指標を売上にするか件数にするか、セグメントをどう分割するかといった選択肢は、分析の過程で無数に存在します。それぞれの選択自体はもっともらしい理由をつけられるものであっても、複数の選択肢を試して都合の良い結果を選び取ってしまえば、実質的には多重比較を行っているのと同じことになります。悪意がなくとも、有意な結果を求める過程で無意識のうちにこの自由度を使い切ってしまうケースは少なくないとされています。
本当は効果がない状況で、独立した検定を1回行ったときに偶然有意(p<0.05)になる確率は5%です。しかし同じ条件で検定をn回繰り返した場合、少なくとも1回は偶然有意になってしまう確率は、次の式で計算できます。
\( P(\text{少なくとも1回有意}) = 1 – (1 – \alpha)^n \)
ここで有意水準\( \alpha = 0.05 \)、検定回数\( n = 20 \)を代入すると、\( 1-(1-0.05)^{20} \approx 0.64 \) となります。つまり、本当は何の効果もない20個の変数やセグメントを検定した場合でも、約64%の確率でどれか1つは偶然「有意」という結果が出てしまう計算です。ダッシュボードで数十個のKPIを一斉に検定したり、A/Bテストの結果を年齢層・性別・地域などの切り口で細かく分割して繰り返し検定したりする分析は、まさにこの多重比較の罠にはまりやすい典型例です。
この問題に対処するための代表的な補正手法が、Bonferroni法、Holm法、Benjamini-Hochberg法(FDR: False Discovery Rateの制御)の3つです。それぞれ考え方と、適した使い分けの場面が異なります。
| 補正手法 | 考え方 | 向いている場面 |
|---|---|---|
| Bonferroni法 | 有意水準\( \alpha \)を検定回数\( n \)で割った\( \alpha/n \)を新たな判定基準にする、最もシンプルで保守的な補正。全体で1つでも誤って有意と判定する確率(FWER: Family-Wise Error Rate)を厳格に抑える | 検定数が少なく、誤検出を極力避けたい確認的な検証(重要な意思決定に直結する少数の主要指標の検定など) |
| Holm法 | p値を小さい順に並べ、段階的に基準を緩めながら判定するステップダウン方式のBonferroni法。FWERを制御しつつ、Bonferroni法より高い検出力(本当にある効果を見逃しにくい性質)を持つ | Bonferroni法と同じくFWERを厳格に制御したいが、Bonferroni法だと保守的すぎて効果を見逃しやすい場面 |
| Benjamini-Hochberg法(FDR) | 「誤って有意と判定してしまう1件」ではなく、「有意と判定した集団の中で誤りが占める割合(FDR)」を一定以下に抑える方式。FWER制御より基準が緩やかで、検出力が高い | 検定数が多く、多少の誤検出は許容したうえで、探索的に有望な候補を幅広く拾いたい場面(多数のセグメント・多数の指標を横断的にスクリーニングするA/Bテスト分析など) |
実務上の目安としては、少数の主要な仮説を厳密に検証する場面ではHolm法(Bonferroni法より無駄なく検出力を確保できる)、多数の指標やセグメントを探索的にスクリーニングする場面ではBenjamini-HochbergのFDR制御を使う、という使い分けが一般的です。Pythonでは、statsmodelsライブラリのmultipletests関数を使うことで、これらの補正を数行のコードで適用できます。
import numpy as np
from statsmodels.stats.multitest import multipletests
# 20個のセグメント×指標の組み合わせについて実施した検定のp値(例)
p_values = np.array([
0.001, 0.004, 0.012, 0.018, 0.022,
0.031, 0.039, 0.044, 0.048, 0.052,
0.061, 0.074, 0.088, 0.110, 0.150,
0.220, 0.310, 0.420, 0.580, 0.770
])
alpha = 0.05
for method in ["bonferroni", "holm", "fdr_bh"]:
reject, p_adjusted, _, _ = multipletests(p_values, alpha=alpha, method=method)
print(f"{method}: 有意と判定された件数 = {reject.sum()} / {len(p_values)}")
このコードを実行すると、補正なしでp<0.05を基準にした場合に比べて、Bonferroni法やHolm法では有意と判定される件数が大きく減り、FDR制御を行うBenjamini-Hochberg法はその中間に位置する結果になります。補正方法によって「有意」と判定される件数そのものが変わるという事実は、多重比較を無視した単純なp値の羅列がいかに危ういかを示しています。
多重比較がどの程度深刻な問題を生むかを体感するために、帰無仮説がすべて真である(本当は何の効果もない)状況を乱数でシミュレーションしてみます。
import numpy as np
rng = np.random.default_rng(0)
n_tests = 20
alpha = 0.05
n_simulations = 100000
at_least_one_significant = 0
for _ in range(n_simulations):
# 帰無仮説が真である(本当は差がない)状況で20回検定を行ったと仮定
# p値は一様分布からランダムに生成される
simulated_p_values = rng.uniform(0, 1, size=n_tests)
if (simulated_p_values < alpha).any():
at_least_one_significant += 1
empirical_prob = at_least_one_significant / n_simulations
theoretical_prob = 1 - (1 - alpha) ** n_tests
print(f"シミュレーションによる確率: {empirical_prob:.3f}")
print(f"理論値 1-(1-0.05)^20: {theoretical_prob:.3f}")
このシミュレーションを実行すると、経験的な確率は理論値の約0.64に非常に近い値になります。「効果がまったくないデータでも、20項目を検定すれば6割強の確率で何かが有意になる」という事実を数値で確認しておくと、探索的な分析結果を無補正のまま「発見」として扱うことの危うさが実感しやすくなります。
HARKingとは、Hypothesizing After the Results are Known(結果が分かった後に仮説を立てる)の略語で、データを探索して見つかったパターンを、あたかも分析前から想定していた仮説であったかのように報告する行為を指します。「このセグメントで差が出たのは、もともと〇〇という理由を想定していたからだ」という説明が、実際にはデータを見た後に後付けされた理屈であるケースがこれにあたります。
HARKingが問題視されるのは、p-hackingと同様に多重比較の構造を持つためです。データの中から「何か有意な差」を探す作業は、実質的に無数の仮説を同時に検定しているのと変わらず、たまたま見つかったパターンには偶然の産物が混じっている可能性が高くなります。それを後から尤もらしい理屈で仮説として提示してしまうと、検証(この仮説が正しいかどうかを新しいデータで確かめる)というプロセスが省略されたまま、「発見」が独り歩きしてしまいます。
この問題への対処として重要なのが、探索的分析(exploratory analysis)と検証的分析(confirmatory analysis)を明確に区別する規律です。探索的分析は、データの中から仮説の候補を見つけ出す段階であり、ここで見つかったパターンは「仮説の種」であって「結論」ではありません。検証的分析は、探索段階とは別に確保しておいたデータ、あるいは新しく取得したデータを使って、事前に立てた仮説を1回だけ検定する段階です。この2つの段階を混同せず、探索で見つけたものを検証データで裏付けるまでは「暫定的な仮説」として扱う姿勢が、HARKingを防ぐ実務上の基本になります。
A/Bテストの現場でよく見られる運用に、「毎日結果を確認し、p値が0.05を下回った時点でテストを終了して勝敗を判定する」というものがあります。これは一見合理的に思えますが、統計的には第1種の過誤(本当は差がないのに、差があると誤って判定してしまう誤り)の確率を大きく膨らませてしまう危険な運用です。
理由は、これも多重比較の一種だからです。テスト期間中、毎日p値を計算して「有意かどうか」を判定するという行為は、実質的に「本日までのデータで検定する」という検定を日数分だけ繰り返していることになります。本当は効果がない施策であっても、データを蓄積していく過程でp値は日々変動し、たまたまある日にp<0.05を下回る瞬間が訪れる確率は、テスト期間が長くなるほど、そして確認する頻度が高くなるほど上昇していきます。有意になった瞬間だけを捉えてテストを止めてしまうと、本来5%に抑えられているはずの誤検出率が、実際には数十%にまで膨らんでしまうことが知られています。
この問題への対処法としては、テスト開始前にサンプルサイズと実施期間を決めておき、その期間が終了するまでは結果を見ても意思決定をせず、定めた期間の終了時に1回だけ判定するという運用が基本になります。どうしても早期に打ち切りたい事情がある場合は、逐次検定(sequential testing)向けに設計された、有意水準の膨張を補正する専用の統計手法を使う必要があり、通常の検定を毎日繰り返し覗き見る運用とは区別して考える必要があります。
「毎日p値を確認して有意になった時点で止める」という運用が、なぜ深刻な過誤につながるのかは、多重比較の枠組みで捉えるとイメージしやすくなります。テストを30日間毎日確認する場合、実質的には最大30回の検定を繰り返し行い、そのうちどこか1回でも有意になった時点を「勝敗が決まった瞬間」として扱っていることになります。前節で確認した「検定を繰り返すほど、少なくとも1回は偶然有意になる確率が跳ね上がる」という構造がそのまま当てはまり、確認する頻度が高いテストほど、本来の意図に反して誤った勝敗判定を下しやすくなります。
p値の誤用や多重比較の軽視が積み重なった結果として顕在化したのが、2010年代以降、学術界で広く議論されるようになった「再現性の危機(replication crisis)」です。代表的な取り組みが、Open Science Collaborationという研究者グループが2015年に学術誌Scienceで発表した大規模な追試プロジェクトです。心理学の主要な学術誌に掲載された100件の研究について、元の研究と同じ手順で追試を行ったところ、元の研究では97件が統計的に有意な結果を報告していたのに対し、追試で有意な結果が再現されたのは全体の4割に満たない件数にとどまり、再現された効果の大きさも平均して元の研究のおよそ半分程度にまで縮小していたと報告されています。
この結果は心理学に固有の問題ではなく、統計的検定を用いる分析全般に共通する構造的な問題を映し出したものと理解されています。すなわち、有意になった結果だけが論文として採択・公表されやすいという構造(公表バイアス)、多重比較を十分に補正しないまま多数の指標を検定する慣行、サンプルサイズが小さいまま検定を繰り返す運用などが組み合わさると、公表される「有意な発見」の相当数が、実際には再現しない偶然の産物になってしまうという構造です。
ビジネスのデータ分析においても、この構造はそのまま当てはまります。社内で行われるA/Bテストや施策効果検証の多くは、学術論文のような外部の査読を経ないまま、「有意だった」という報告だけが社内資料として残り、次の意思決定の根拠として使われ続けます。似た構造の追試プロジェクトが企業内で行われることはまれであるため、実際には偶然の産物だった「成功施策」が、検証されないまま社内の定説として定着してしまうリスクは、学術界以上に見過ごされやすいと考えられます。

p値の誤用や再現性の問題を防ぐために、学術界では研究の実施前に仮説と分析計画を公開のレジストリに登録しておく「事前登録(pre-registration)」という取り組みが広がっています。この発想は、社内のデータ分析にもそのまま転用できます。以下のような運用を組織のルールとして定着させることが、再現性のある分析につながります。
p値は「仮説が正しい確率」でも「再現される確率」でもなく、特定の前提のもとでデータの極端さを測る1つの指標に過ぎません。多重比較や停止規則を軽視した検定の繰り返しは、本来5%に抑えられているはずの誤検出率を大きく膨らませます。分析前に仮説と計画を明文化し、効果量と信頼区間を併記し、探索で見つけた仮説は別データで検証するという規律を組織に根づかせることが、再現性のある分析への最も確実な道筋になります。
これらの原則を日々の分析業務に落とし込むためのチェック項目を、以下にまとめます。
社内データ分析の再現性チェックリスト
統計的検定は、正しく使えば「思い込みではなくデータに基づいて判断する」ための強力な道具になりますが、多重比較や停止規則、後付けの仮説といった落とし穴を軽視すると、かえって根拠のない結論を「統計的に裏付けられた事実」であるかのように見せかける道具にもなり得ます。p値という数値の限界を正しく理解し、効果量・信頼区間・再現確認とセットで運用する姿勢が、データドリブンな意思決定の信頼性を支える土台になります。
『ダメな統計学:悲惨なほど完全なる手引書』(アレックス・ラインハート、勁草書房):p値の誤用や多重比較、出版バイアスといった統計分析の落とし穴を、具体例とともに平易に解説した書籍です。本章で扱ったp値の誤解やp-hackingの構造を、より広い文脈と豊富な事例で補強したい読者に適しています。
ここまでの章では、データを要約し、確率分布でばらつきを扱い、仮説検定で意思決定を支える方法を見てきました。いずれも計算の手順自体は決まっており、正しく手順を踏めば正しい数値が得られます。しかし統計の落とし穴の多くは、計算式の間違いではなく、「どのデータをどう集計するか」という手前の設計や、「その数字が何を意味するか」という解釈の段階で発生します。計算は合っているのに、結論だけが実態とずれてしまうという厄介さがあります。
本章では、経営層やDX推進担当者が経営会議や施策の効果検証の場でよく遭遇する統計的な錯覚を、現象の説明とビジネスでの具体例、そして見抜き方・防ぎ方という3つの視点でまとめて紹介します。最終章として、この1冊で扱ってきた考え方を「数字にだまされないための実践知」として整理する位置づけになります。
シンプソンのパラドックスとは、データ全体を1つにまとめて集計した場合と、属性ごとに層別して集計した場合とで、傾向が逆転してしまう現象を指します。全体の数字だけを見て判断すると、実態と正反対の結論を導いてしまう危険があるため、統計の落とし穴の中でも特に注意が必要なものです。
採用活動を例に、架空の数値で確認します。ある企業がリファラル採用(社員紹介)と求人媒体経由の2つの採用チャネルの内定率を比較し、どちらが優秀な候補者を集められているかを検証しようとしています。エンジニア部門と営業部門、それぞれのチャネル別の応募者数と内定者数は次のとおりです。
| 採用チャネル | 部門 | 応募者数 | 内定者数 | 内定率 |
|---|---|---|---|---|
| リファラル採用 | エンジニア部門 | 500 | 350 | 70.0% |
| リファラル採用 | 営業部門 | 100 | 22 | 22.0% |
| 求人媒体経由 | エンジニア部門 | 100 | 75 | 75.0% |
| 求人媒体経由 | 営業部門 | 500 | 115 | 23.0% |
部門ごとに見ると、エンジニア部門ではリファラル採用の内定率70.0%に対して求人媒体経由は75.0%、営業部門ではリファラル採用22.0%に対して求人媒体経由は23.0%と、どちらの部門でも求人媒体経由の方がわずかに内定率が高くなっています。ところが、部門を合算した全体の内定率を計算すると様相が一変します。リファラル採用は応募者600人(500+100)のうち内定372人(350+22)で内定率62.0%、求人媒体経由は応募者600人(100+500)のうち内定190人(75+115)で内定率31.7%となり、全体で見るとリファラル採用の方が2倍近く内定率が高いという、部門別の結果とはまったく逆の結論になってしまいます。
この逆転が起きた原因は、応募者の部門への偏りにあります。リファラル採用の候補者は内定率が高いエンジニア部門に多く応募し(500人)、求人媒体経由の候補者は内定率が低い営業部門に多く応募していた(500人)ため、チャネルそのものの実力差ではなく、応募者がどの部門に集中していたかという構成比の違いが、全体の数字を大きく動かしてしまったのです。この構造は、部門を「診療科」、内定率を「治療成功率」に置き換えれば、2つの治療法のどちらが有効かを検証する臨床研究でも同様に起こり得ます。軽症患者が多く含まれる治療法の方が、全体の成功率では優れて見えてしまうことがあるためです。

全体の集計値だけを見て「AよりBの方が優れている」と判断する前に、必ず部門・年代・地域といった主要な属性で層別し、傾向が変わらないかを確認する習慣が欠かせません。特に、比較したい2つのグループの構成比(どの属性にどれだけの割合で人数が分布しているか)が大きく異なっている場合ほど、シンプソンのパラドックスが発生しやすくなります。
平均への回帰とは、極端に良い、あるいは極端に悪い結果が観測された対象は、次の測定では平均値に近づいて戻りやすいという統計的な性質です。これは施策の効果ではなく、測定値には常に運や偶然による振れ幅(ノイズ)が含まれているために起こります。ある回だけ極端な数値が出た背景には、実力に加えて偶然良い(悪い)方向にぶれた要素が混ざっており、次の回にはその偶然の要素がたまたま同じ方向に重なる可能性は低いため、平均的な水準に近づいて見えるというわけです。
ビジネスの現場では、この現象が施策の効果と混同されやすい形で現れます。典型的なのが、成績が特に振るわなかった店舗を選んで重点的にテコ入れ研修を実施するケースです。テコ入れ対象になるのは「たまたまその期に悪い数値が出た店舗」も含まれており、研修の有無にかかわらず、次の期には平均的な水準へ自然に戻る店舗が一定数存在します。この自然な回復を研修の効果だと解釈してしまうと、実際には効果のない施策を「成果が出た」と過大評価することになります。同様に、成績優秀な営業担当者を表彰した翌四半期に成績が落ち着くのも、表彰による気の緩みではなく、単に極端な好成績が平均へ回帰しただけという場合が少なくありません。
この錯覚を見抜くには、施策を実施したグループと同じ選び方(例えば「下位10店舗」)をしながら施策を実施していない対照群を用意し、両者の変化量を比較することが有効です。対照群でも同程度の改善が見られるなら、その改善の少なくとも一部は平均への回帰によるものであり、施策そのものの効果ではないと判断できます。極端な値だけを基準に対象を選び、その後の変化を無条件に施策の成果と結びつける前に、平均への回帰という自然現象が混ざっていないかを疑う視点が求められます。
選択バイアスとは、分析対象となる標本の集め方そのものに偏りがあり、母集団全体の実態を正しく反映していない状態を指します。計算方法がどれだけ正確でも、集めたデータ自体が偏っていれば、導かれる結論も偏ります。ビジネスでよく現れる選択バイアスには、主に次の3つの型があります。
1つ目は回答者バイアスです。顧客満足度調査やアンケートは、回答するかどうかを回答者自身が選ぶため、強い不満を持つ層や逆に強い満足を持つ層など、感情が強く動いた人ほど回答しやすい傾向があります。回答率が低い調査ほど、この偏りは大きくなります。全回答者の平均が「満足度3.8」だったとしても、それは声を上げやすい一部の顧客の意見であり、大多数を占める「特に強い感情を持たないサイレントな顧客層」の実態を反映していない可能性があります。
2つ目は生存者バイアスです。分析の対象に、途中で脱落・消滅したものが含まれておらず、生き残ったものだけを見て結論を出してしまう偏りです。第二次世界大戦中、帰還した爆撃機の被弾箇所を調べ、被弾が集中していた部位を補強しようとした軍の技術者に対し、統計学者エイブラハム・ウォールドは発想を逆転させました。分析すべきは帰還した機体ではなく、帰還できなかった機体だという指摘です。帰還機で被弾が少なかった部位(エンジン周辺など)こそ、そこを撃たれた機体が帰還できずに失われた、本当に致命的な急所である可能性が高いというわけです。ビジネスの文脈でも同様の偏りは頻繁に起こります。「成功している企業に共通する習慣」を分析する経営書の多くは、現存する成功企業だけを調査対象にしており、同じ習慣を持ちながら市場から退場した企業を分析対象に含めていません。その習慣が本当に成功要因なのか、それとも成功・失敗のどちらにも見られるありふれた特徴に過ぎないのかは、失敗した企業も含めて比較しなければ判断できません。
3つ目は脱落バイアスです。調査や実験の途中で対象者が離脱し、最後まで残った人だけでデータを分析することで生じる偏りです。例えば、あるサービスの利用継続者だけにアンケートを取って満足度を評価すると、不満を持って早期に解約した顧客の声が最初から母集団に含まれておらず、満足度は実態より高く見積もられます。同様に、複数月にわたる行動変容プログラムの効果を、プログラムを最後までやり切った人だけで評価すると、途中で挫折した人(効果が出にくかった可能性がある人)が除外されているため、効果が過大に評価されがちです。
2つの数値に相関関係が見られても、それが因果関係を意味するとは限りません。両者に共通して影響を与える別の変数(交絡因子)が存在し、見かけ上の相関を生み出している場合があるためです。第3章では、アイスクリームの売上と水難事故の件数が「気温」という共通の要因によって同時に押し上げられる例を取り上げました。あの例が分かりやすいのは、交絡因子が誰の目にも明らかだからです。実務で厄介なのは、交絡因子が気温のようにはっきりとは見えず、「その施策の対象者がどう選ばれたか」という手続きのなかに隠れている場合です。
例えば、ある研修プログラムの受講者の営業成約率が、非受講者より高かったとします。ここで「研修が成約率を高めた」と結論づけたくなりますが、研修が任意参加だった場合、そもそも意欲の高い、あるいは元々成績の良い営業担当者ほど自主的に研修に参加している可能性があります。この場合、「本人の意欲・実力」が交絡因子となり、研修の効果と本人の資質による効果が混ざり合ってしまい、研修単体の効果を過大評価することになります。同様に、ある機能を頻繁に使うユーザーほど解約率が低いというデータから「その機能に解約防止効果がある」と即断するのも危険です。そもそもサービスへの満足度や利用意欲が高いユーザーほど色々な機能を積極的に使う傾向があるとすれば、「満足度」が交絡因子となっている可能性があります。
交絡を完全に排除する最も確実な方法はランダム化比較実験(A/Bテストなど)で、対象をランダムに2群へ振り分けることで、交絡因子の影響を両群で均等にならすことができます。ランダム化が難しい観察データを扱う場合には、疑わしい交絡因子(年齢、契約年数、事前の利用頻度など)をあらかじめ測定しておき、回帰分析で統計的にコントロールした上で相関を評価する、あるいは同じような属性を持つ対象同士を比較するといった工夫が必要になります。
基準率の錯誤とは、ある事象がそもそもどれくらいの頻度で起きるか(基準率、ベースレート)を無視して、目の前の検査結果や予測結果だけをそのまま信じてしまう錯覚です。特に、発生頻度が低い希少な事象を扱う検査や予測モデルで問題になります。
ある病気の有病率が0.1%(1,000人に1人)であり、その病気を判定する検査の感度(病気の人を正しく陽性と判定する確率)が99%、特異度(健康な人を正しく陰性と判定する確率)が95%だとします。感度・特異度ともに高精度な検査に見えますが、この検査で陽性と判定された人が、実際に病気である確率はどの程度でしょうか。10万人を検査したと仮定して計算してみます。病気の人は10万人のうち100人(10万人×0.1%)、健康な人は99,900人です。病気の人のうち99人(100人×99%)が正しく陽性と判定される一方、健康な人のうち4,995人(99,900人×5%、特異度95%の裏返しである偽陽性率5%)も誤って陽性と判定されてしまいます。つまり陽性と判定される人は合計5,094人(99人+4,995人)にのぼり、そのうち本当に病気なのはわずか99人です。陽性適中率(検査で陽性だった人が実際に病気である確率)は99人÷5,094人で約1.9%にしかなりません。
感度99%という高精度な検査であっても、そもそもの有病率(基準率)が低いと、母数の大きい健康な人からの偽陽性が絶対数で上回ってしまい、陽性適中率は直感よりはるかに低くなります。この構造は病気の検査に限らず、不正利用検知や離反予測、需要の急増予測など、発生頻度が低い(希少な)事象を当てにいくビジネス上の予測モデル全般に共通します。「的中率99%のAIモデル」という触れ込みを見たときは、それが感度・特異度のどちらを指しているのか、そして分母となる基準率がどの程度かを必ず確認する必要があります。基準率を無視して的中率の高さだけで判断すると、実際の運用場面で大量の誤検知に悩まされることになります。

分析対象から一部のデータが体系的に抜け落ちることで生じる歪みも、実務でよく見過ごされる落とし穴です。ここでは性質の異なる2つのパターンを区別して押さえておく必要があります。
1つ目は欠測データによる歪みです。顧客満足度を、現在契約を継続している顧客だけにアンケートを取って算出する場合を考えます。すでに解約してしまった顧客は調査対象に含まれていません。解約者の多くは何らかの不満を抱えて離脱した可能性が高いため、残った顧客だけを対象にした満足度は、実際の顧客基盤全体の満足度よりも高く出やすくなります。解約者へのヒアリングやアンケートを別途実施し、解約理由・解約前の満足度を補完しない限り、「満足度は高水準を維持している」という数字が、実は離脱者の不満を見えなくしているだけという状態に陥ります。
2つ目は打ち切り(センサリング)データによる歪みです。現在在籍している社員の平均勤続年数を分析する場面を例にすると、在籍中の社員については「入社日から今日まで」の期間しか観測できておらず、その社員が最終的に何年勤めるかはまだ確定していません。観測が完了していないこの状態を統計学では打ち切りと呼びます。単純に「現時点までの勤続年数」の平均を取ると、まだ勤続年数を伸ばし続けている途中の社員が多く含まれるため、本来確定した値で計算すべき平均勤続年数を過小に見積もってしまいます。退職者だけを対象に勤続年数を集計する場合も、逆の歪みが生じます。早期に辞めた人ほど退職者データに反映されやすい一方、長く勤めている人はまだ退職者データに現れていないため、退職者ベースの平均は在籍者全体の実態とは異なる値になります。こうした打ち切りを正しく扱うには、生存時間分析(カプランマイヤー法など)のように、まだ観測が続いている対象を「打ち切りあり」として区別しながら推定する手法が本来必要になります。
欠測データも打ち切りデータも、共通して言えるのは「今、手元にあるデータだけで完結していない」という点です。分析の前提として、そもそもどのような人・ケースが対象から漏れているのか、漏れている理由に系統的な偏りがないかを確認する姿勢が欠かせません。
ここまでは主に集計や標本の設計に起因する落とし穴でしたが、数字そのものが正確でも、見せ方次第で受け手の印象を大きく歪めることができます。悪意がなくても、見栄えを優先した結果として誤解を招くグラフが作られてしまうことは珍しくありません。
代表的な手口の1つが縦軸の切り取りです。棒グラフの縦軸をゼロから始めず、途中の値から始めると、実際にはわずかな差でしかない数値の違いが、視覚的には数倍の差があるかのように誇張されます。売上や解約率の推移をわずかな変化でも劇的な変化に見せたいときに使われがちな手法であり、資料を作る側にも見る側にも注意が必要です。2つ目は二重軸グラフの乱用です。左右で異なる尺度の軸を1つのグラフに重ねると、軸の目盛りの取り方次第で2つの折れ線の交差点や乖離幅を恣意的に操作でき、実際には関係の薄い2つの指標があたかも連動しているかのような印象を作り出せてしまいます。3つ目は3D円グラフです。奥行きをつけることで手前の項目が実際の比率より大きく、奥の項目が小さく見える視覚的な歪みが生じるため、正確な比率の比較には不向きです。
誠実な可視化を行うための原則は、数値の比較を歪めないことに尽きます。量を比較する棒グラフの縦軸は必ずゼロから始める、複数の指標を比較するときは可能な限り同じ尺度の軸で揃える、比率の比較には3Dの装飾を避けて2Dの円グラフや積み上げ棒グラフを使う、といった基本を徹底することが、受け手に正確な実態を伝えるための最低条件になります。社内向けの資料であっても、経営判断に使われる数字である以上、見栄えよりも正確な伝達を優先する意識が求められます。

外挿とは、実際に観測したデータの範囲を超えて、その傾向をそのまま延長して未来や未観測の領域を予測することです。観測範囲の内側を予測する内挿と異なり、外挿には根拠となるデータが存在しないため、本質的に不確実性が高くなります。それにもかかわらず、直線や指数関数といった単純な回帰式を機械的に延長するだけで、もっともらしい予測に見えてしまう点が危険です。
新規サービスの初期数か月の会員数が急速に伸びているとき、その伸び率をそのまま数年先まで延長して事業計画を立ててしまうケースがよく見られます。しかし多くの成長過程は、認知拡大期には指数関数的に伸びても、市場に浸透するにつれて次第に成長が鈍化し、最終的にはS字カーブを描いて頭打ちになります。市場全体の規模には上限があり、いつまでも同じ角度で伸び続けることはできないためです。初期の急成長だけを見て指数関数的な延長を続けると、実際にはあり得ない規模の予測値を導いてしまいます。同様に、ある指標とある指標の間に見られた直線的な関係を、観測データの範囲をはるかに超えた領域(極端に大きい、あるいは小さい値)にまで当てはめる予測も危険です。関係性がその範囲の外側でも同じ形のまま続くという保証はどこにもありません。
外挿を伴う予測を扱う際には、その予測が観測データの範囲内にとどまっているかを常に確認し、範囲外に踏み出す場合は、単純な延長ではなく成長の上限(市場規模、生理的な限界など)を織り込んだモデル(ロジスティック曲線など)を検討する、あるいは予測に幅(将来の個別の値を見積もるなら予測区間)を持たせて不確実性を明示する、といった対応が求められます。
本章で扱った落とし穴と、それぞれを見抜くための一言をまとめると次のとおりです。
| 落とし穴 | 見抜き方・防ぎ方の一言 |
|---|---|
| シンプソンのパラドックス | 全体の数字だけで判断せず、必ず属性ごとに層別して確認する |
| 平均への回帰 | 極端な値の後の改善は、施策の効果か自然な揺り戻しかを対照群と比較する |
| 選択バイアス(回答者) | 回答率の低さと、回答者が声を上げやすい層に偏っていないかを疑う |
| 選択バイアス(生存者) | 分析対象から漏れている「脱落・消滅したもの」の存在を必ず探す |
| 選択バイアス(脱落) | 最後まで残った対象だけで評価していないか、途中離脱者の扱いを確認する |
| 交絡と疑似相関 | 相関が出たら、両方を動かす第3の変数(交絡因子)がないかを疑う |
| 分母の無視・基準率の錯誤 | 的中率や検査精度は、必ず基準率(そもそもの発生頻度)とセットで解釈する |
| 打ち切り・欠測データ | 対象から漏れている人・ケースと、その漏れ方の系統性を確認する |
| グラフによる印象操作 | 縦軸はゼロから始まっているか、尺度は揃っているかを確認する |
| 外挿の危険 | 予測が観測データの範囲内にとどまっているかを常に確認する |
本章で紹介した落とし穴は、それぞれ個別の現象に見えますが、根っこには共通の原因があります。それは、目の前の数字がどのような過程(データの生成プロセス)を経て手元に届いたのかを考えずに、数字そのものだけを鵜呑みにしてしまうことです。シンプソンのパラドックスは属性ごとの構成比を、平均への回帰は測定に含まれる偶然の振れ幅を、選択バイアスは標本が集められた経路を、交絡は変数同士の背後関係を、基準率の錯誤は事象の発生頻度を、打ち切り・欠測データは観測から漏れた対象を、それぞれ考慮せずに数字だけを見てしまうことから生じています。
数字を見たときに「この数字はどのように生成され、どのような経路で自分の手元に届いたのか」を一歩立ち止まって考える習慣こそが、本章で扱ったあらゆる落とし穴に共通する防御策です。集計方法、標本の集め方、測定のタイミング、観測から漏れているものの有無を意識するだけで、多くの誤った結論を未然に防ぐことができます。
本書ではここまで、記述統計から確率分布、推測統計、仮説検定、そして本章の落とし穴まで、統計学の基礎的な考え方を順に扱ってきました。個々の手法や検定の手順を暗記すること以上に、データの背後にある生成プロセスを問い続ける姿勢そのものが、経営判断やDX推進の現場で数字にだまされないための土台になります。
『統計でウソをつく法』(ダレル・ハフ、講談社ブルーバックス):グラフの印象操作や見せかけの相関など、数字が人を欺く典型的な手口を平易な語り口でまとめた古典的な入門書です。出版から時間が経っていますが、本章で扱った落とし穴の多くに通じる「数字を鵜呑みにしない視点」を養う入り口として、今なお参照される1冊です。
本ガイドでは、データを要約する記述統計から出発し、確率分布によるモデル化、標本から母集団を推測する仕組み、差が本物かを判定する仮説検定、そして分析を誤らせる落とし穴まで、統計学の背骨にあたる部分を一続きの流れで解説してきました。
振り返ってみると、全編を貫いていたのは「手元のデータは偶然のばらつきを含んだ一部にすぎない」という一つの認識だったと思います。平均だけでなくばらつきを見るのも、点推定に信頼区間を添えるのも、p値を効果量とセットで読むのも、すべてはこの認識から自然に導かれる作法です。逆に言えば、第12章で見た数々の落とし穴は、この認識を忘れたときに足をすくわれるものばかりでした。
統計学の知識は、個人が身につけるだけでは組織の意思決定を変えるところまで届きません。分析する側と、その報告を受けて判断する側の双方に共通の作法が根付いて、はじめて機能します。実務に取り入れやすい実践を3つ挙げます。
統計学が組織にもたらす最大の価値は、意思決定の「速さ」ではなく「壊れにくさ」です。偶然のばらつきに一喜一憂して方針が揺れることが減り、本当に意味のある変化にだけ資源を投じられるようになります。
本ガイドで扱ったのは、変数が1つか2つまでの統計学です。実務のデータ分析では、この土台の上に多変量の世界が広がっています。本シリーズでは、続刊として次のテーマを予定しています。
また、コードの書き方から学びたい方には「データ分析と機械学習のレシピ100選」を、分析結果の伝え方を磨きたい方には「データ可視化レシピ106選」を用意しています。統計検定2級の受験を考えている方であれば、本ガイドの第1章から第10章が試験範囲のかなりの部分と重なりますので、過去問演習と往復しながら使っていただけると思います。
Anagraftでは、AIプロジェクトの構想・課題設計から、データ分析・機械学習モデルの開発、AI人材の育成まで一貫したご支援を行っています。ご相談は、以下よりお問い合わせください。
お問い合わせ
各章末でご紹介した参考書籍の一覧です。学習の段階に合わせてお選びください。