Python基礎

実務で使える統計の型12 | Pythonで最短習得

統計は“数式”ではなく、意思決定のためのリスク管理
平均や分散だけで判断せず、区間推定・検定・効果量・サンプルサイズ・A/Bテスト・ブートストラップまで、現場で使える順番でまとめました。

この記事で身に付く力

  • 現場で使う順番(要約統計 → 分布 → 区間推定 → 検定 → 効果量 → サンプルサイズ → A/B → ブートストラップ → 回帰 → 多重比較 → 再現性)を“型”として習得。

  • p値だけに依存しない:効果量と信頼区間をセットで語るレポート設計。

  • 最小コードで再現:NumPy / pandas / SciPy / statsmodels を使い、Notebook→スクリプト化まで見据える。

なぜ「統計は役に立たない」と感じやすいのか

現場でズレが起きる根っこはシンプルです。
平均だけで語る、p値だけで盛り上がる、検定を乱発する、サンプルサイズを決めずに走る
これらは意思決定のリスク管理という観点が抜け落ちているサインです。

本記事では、実務で迷わない最短ルートを“型”化して提供します。

現場メモ(ふみと)

役員会で刺さるのは数式ではなく、図1枚 + 95%信頼区間 + 意思決定の閾値
同じ型で毎回レビューできるように、Notebook→スクリプト化で再現性を担保しましょう。

この記事の使い方(前提と読み方)

Python 3.10+、NumPy、pandas、SciPy、statsmodelsを前提に、すべてコピペで動く最小コードを載せています。
図は2〜3色+強調1色、単位・軸・注釈を明記するルールで統一しましょう。

“実務の型” 12ステップ(コピペ可)

1) 要約統計(平均・中央値・分散・分位点)

何をする? データの“中心”と“ばらつき”を数値で把握します。外れ値に強い報告は中央値 + IQR(四分位範囲)

import numpy as np, pandas as pd
s = pd.Series([12, 14, 15, 19, 25, 100])
summary = {
  "count": s.count(),
  "mean": s.mean(),
  "median": s.median(),
  "std": s.std(ddof=1),
  "p25": s.quantile(0.25),
  "p75": s.quantile(0.75)
}
summary

どう読む? 分布が歪んでいれば、平均より中央値を中心に語ると安全です。

2) 可視化の定石(分布を掴む)

何をする? 形を先に見る。ヒストグラム + KDE、箱ひげ、時系列(移動平均 + 注釈)で歪み・裾・季節性を早押しチェック。
ヒント:可視化は“きれい”より“意思決定に効く注釈”。外れ値の取り扱い、期間、単位を図中に明記。

3) 確率分布(最短メモ)

何をする? 正規分布やt分布の“確率/臨界値”を即座に引く。

from scipy import stats
# 正規分布の片側確率、t分布の上側臨界値
stats.norm.cdf(1.96), stats.t.ppf(0.975, df=24)

4) 区間推定(平均/比率)

何をする? 点推定だけでなく、「どれくらいあり得るかの範囲(CI)」を示します。

import numpy as np
from scipy import stats
x = np.array([12,14,15,19,25])
mean, se = x.mean(), x.std(ddof=1)/np.sqrt(len(x))
ci = stats.t.interval(0.95, df=len(x)-1, loc=mean, scale=se)
ci  # (下限, 上限)

比率のCI(Wilson)

from statsmodels.stats.proportion import proportion_confint
succ, n = 48, 100
proportion_confint(succ, n, alpha=0.05, method="wilson")

レポート例点推定±誤差(例:0.48±0.07)と 95%CI=[0.41, 0.55] を併記。

5) 仮説検定(t検定/カイ二乗)

何をする? 差がある“可能性”を p値で評価。
ただしp値はゴールではない。必ず効果量とセットで示す。

from scipy import stats
import numpy as np
# 2群の平均差(分散が異なる想定:Welchのt検定)
A = stats.norm.rvs(loc=10, scale=2, size=50, random_state=42)
B = stats.norm.rvs(loc=11, scale=2, size=50, random_state=42)
res = stats.ttest_ind(A, B, equal_var=False)
res.statistic, res.pvalue
# 2x2の独立性(例:施策(有/無)×購入(有/無))
from scipy.stats import chi2_contingency
obs = np.array([[30, 70], [22, 78]])
chi2, p, dof, expected = chi2_contingency(obs)

6) 効果量(Cohen’s d / 比率差 / オッズ比)

何をする? “どれくらい効いたか”を単位を意識して表現。Cohen’s d の目安は 0.2/0.5/0.8 = 小/中/大。

import numpy as np
# Cohen's d(2群の標準化平均差)
def cohens_d(a, b):
    s1, s2 = np.var(a, ddof=1), np.var(b, ddof=1)
    sp = np.sqrt(((len(a)-1)*s1 + (len(b)-1)*s2) / (len(a)+len(b)-2))
    return (np.mean(a) - np.mean(b)) / sp

# 比率差とオッズ比(2x2)

def risk\_diff(a,b,c,d):
p1, p2 = a/(a+b), c/(c+d)
return p1 - p2

def odds\_ratio(a,b,c,d):
return (a/b)/(c/d)

実務では pt(パーセンテージポイント)など、意思決定に直結する単位で語ると伝わります。

7) サンプルサイズ設計(検出力)

何をする? 実験前に「**最小実用差(MDE)**を検出できる n」を決める。足りない n で“有意を取りに行かない”。

from statsmodels.stats.power import TTestIndPower
analysis = TTestIndPower()
# 効果量d=0.5, alpha=0.05, power=0.8, 2群同数
n = analysis.solve_power(effect_size=0.5, alpha=0.05, power=0.8, alternative='two-sided')
float(n)  # 各群に必要なn

8) A/Bテスト設計と解析

設計:指標を定義 → MDEをptで置く → パワー分析で n を決める → 停止ルール(期間/件数/外れ値/不正)を事前登録

import numpy as np
from statsmodels.stats.proportion import proportions_ztest
# A: 120/400, B: 150/400
count = np.array([120, 150]); nobs = np.array([400, 400])
stat, p = proportions_ztest(count, nobs, alternative='two-sided')
# 効果量(差分)
diff = count[1]/nobs[1] - count[0]/nobs[0]

多指標・多バリアントでは有意水準の調整(Bonferroni や BH法)を検討。

9) ブートストラップ(分布仮定を緩める)

何をする? 小標本・歪み・分位点など、正規性が怪しいときは置換抽出で区間を作る。

import numpy as np
rng = np.random.default_rng(42)
x = rng.normal(loc=10, scale=3, size=200)
B = 5000
means = np.array([rng.choice(x, size=len(x), replace=True).mean() for _ in range(B)])
ci = (np.percentile(means, 2.5), np.percentile(means, 97.5))
ci

:仮定に敏感な場面ではブートストラップCIが安全。

10) 回帰の超要点(最小二乗/線形モデル)

何をする? 目的変数に対し、説明変数の符号・大きさ・統計的有意性を確認。

import statsmodels.api as sm
import pandas as pd
# 例:売上 ~ 価格 + 広告 + 季節ダミー
df = pd.DataFrame({"sales":[...], "price":[...], "ad":[...], "month":[...]})
X = pd.get_dummies(df[["price","ad","month"]], drop_first=True)
X = sm.add_constant(X)
model = sm.OLS(df["sales"], X).fit()
model.summary()

読む順番:①係数の符号 → ②大きさ(実務単位に換算) → ③有意性。残差の独立・等分散・正規性は軽く点検

11) 多重比較と偽陽性管理(実務の最短)

何をする? 探索段階は FDR(q値)で管理。本命指標は事前登録(α=0.05)
レポートは効果量 + 区間が主役、p値は補助。

import numpy as np
from statsmodels.stats.multitest import multipletests
pvals = np.array([0.001, 0.02, 0.15, 0.04, 0.005])
_, qvals, _, _ = multipletests(pvals, alpha=0.05, method='fdr_bh')
qvals

12) 再現性とレビュー観点(チェックリスト)

  • KPI定義 / 除外 / 粒度を README に明記
  • 区間推定の仮定(正規/非正規/ブートストラップ)を明示
  • 検定は効果量とセット、多重比較の扱いを記載
  • サンプルサイズ事前計画の根拠(MDE / α / β)
  • Notebook は上から実行で通る → スクリプト化 / CI(pytest など)

読者タイプ別の重点(言い換えテンプレ)

  • 社会人(転職):効果量 / CI / サンプルサイズを前面に。ポートフォリオへ AB設計書 + 結果レポート を追加。
  • 副業(稼ぎたい):Wilson区間 + 差分検定 + 実用差をテンプレ化。月次レポートに 区間/注釈 を標準搭載。
  • 主婦/夫(在宅):ブートストラップで仮定依存を下げ、図 + 区間で納品。

ミニプロジェクト(提出推奨)

課題:「ECのCVR改善施策のA/Bテスト」を想定し、MDE=+2ptでn計画→データ生成→解析(差分・区間・p値・効果量)→レポート(図1枚+結論3行)を作成。

  1. proportions_ztestでp値、差分の95%CI(Wilson)を併記
  2. 効果量:差分ptとオッズ比
  3. サンプルサイズ:TTestIndPowerNormalIndPowerで根拠提示
  4. 図:棒グラフ(CVR±CI)と差分の区間
  5. README:仮定・停止ルール・再現コマンド

付録

A. p値の解釈(最短)

  • p値=「帰無仮説が真と仮定した時、このデータ以上の極端さが出る確率」
  • 小さいpは差がある可能性の示唆で、効果の大きさではない
  • CIは「あり得る値の範囲」。p値とCIはセットで

B. 正規近似と非正規(いつどちら?)

  • 標本が十分大きく、分布が極端でなければ正規近似
  • 小標本/歪み/分位点統計ならブートストラップ

C. 多重比較の調整(BH法の例)

import numpy as np
from statsmodels.stats.multitest import multipletests
pvals = np.array([0.001,0.02,0.15,0.04,0.005])
_, qvals, _, _ = multipletests(pvals, alpha=0.05, method='fdr_bh')
qvals

学習の次の一歩

可視化
【保存版】可視化入門:Matplotlib/Plotlyの使い分けと“伝わるグラフ設計”10ステップ

結論:可視化は「きれいに描く」ことではなく、意思決定を動かすための設計です。 本稿では、未経験〜初学者が 週10時間×1〜2週 で、Matplotlib/Plotlyを軸に “伝わるグラフ”の設計と実 ...

モデル評価
【保存版】モデル評価:指標の選び方・交差検証・閾値最適化・ビジネス接続を“実務の型”で解説

精度が上がらない原因の多くは「評価設計の誤り」にあります。 評価は「何点取れたか」を競うものではなく、意思決定に耐えうるか を検証する営みです。本記事は、回帰/分類/ランキングの 指標選定 → 交差検 ...

スキルアップ
【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得

基礎文法の次は、実務で毎回出る処理を“型”として覚える段階です。 本記事は、pandas 2.x を前提に、欠損・外れ値・結合・ウィンドウ関数・時系列・カテゴリ処理・集計の自動化・大規模データの分割処 ...

Numpy基礎
【保存版】NumPy基礎:配列・ブロードキャスト・ベクトル化・乱数・線形代数を“実務の型”で最短習得

結論:pandas を正しく速く使う土台は NumPy です。データ分析や機械学習で速く・正確に前処理を進めるには、Pythonのfor文ではなく配列演算(=ベクトル化)に乗せるのが近道。 本記事は、 ...

ポートフォリオ
【保存版】データ職のポートフォリオ完全ガイド|再現性・評価・LTまで

ポートフォリオって「作ったものの置き場」でしょ? いいえ。採用側が見たいのは「意思決定に効いた証拠」と「再現性」です。 本ガイドは、未経験〜初学者が週10時間×4〜6週で、テーマ選定→要件定義→データ ...

TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

TechAcademy 無料相談

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

キカガク 無料相談

最近のコメント

    • この記事を書いた人
    • 最新記事

    ふみと

    このブログでは、データサイエンティストとして市場価値を上げる方法を独自にまとめて発信しています。

    【プロフィール】
    ・大手企業データサイエンティスト/マーケティングサイエンティスト(10年、年収900万円台)/案件100件以上
    ・資格:JDLA E資格(日本ディープラーニング協会主催)/JDLA Community(CDLE会員)/Advanced Marketer/ビジネス統計スペシャリスト/統計検定2級/TOEIC 805
    ・スキル:Python/Tableau/SQL/機械学習/Deep Learning/RPA

    -Python基礎