Python基礎

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

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

この記事で身に付く力

  • 要約統計→分布→推定→検定→効果量→サンプルサイズ→A/B→ブートストラップの“実務の型”
  • p値に依存せず効果量+区間で語るレポーティング
  • Python(NumPy/pandas/SciPy/statsmodels)でコピペ実行できる最小コード

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

現場でズレが起きる根っこはシンプルです。平均だけで語る、p値だけで盛り上がる、検定を乱発する、サンプルサイズを決めずに走る――これらは意思決定のリスク管理という観点が抜け落ちているサインです。本記事では、実務で迷わない最短ルートを“型”化して提供します。

現場メモ(ふみと)

役員会で刺さったのは“難しい数式”ではなく、図1枚+95%信頼区間+意思決定の閾値でした。以降、Notebook→スクリプト化で再現性を担保し、同じ型でレビューを回す運用に落ち着いています。

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

Python 3.10+、NumPy、pandas、SciPy、statsmodelsを前提に、すべてコピペで動く最小コードを載せています。図は2〜3色+強調1色、単位・軸・注釈を明記するルールで統一しましょう(参考:[内部リンク:可視化入門])。

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

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

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

:外れ値に強い報告は中央値+IQR。分布が歪んでいれば、平均ではなく中央値主体で。

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

まず形を知る。ヒストグラム+カーネル密度、箱ひげ、時系列(折れ線+移動平均+注釈)で“歪み・裾・季節性”を早押し確認します(参考:[内部リンク:可視化入門])。

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

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

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

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  # (下限, 上限)
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検定/カイ二乗)

from scipy import stats
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)  # Welchのt検定
res.statistic, res.pvalue
import numpy as np
from scipy.stats import chi2_contingency
# 例:施策(有/無)×購入(有/無)
obs = np.array([[30, 70], [22, 78]])
chi2, p, dof, expected = chi2_contingency(obs)

:p値はゴールではなく前提。必ず効果量をセットで。

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

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)

目安:Cohen’s dは0.2/0.5/0.8が小/中/大。比率差はptで“実務の単位”に落とす。

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

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

:必ず事前に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

:小標本・歪み・変わった統計量ではブートストラップ区間が安全。

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) 多重比較と偽陽性管理(実務の最短)

探索段階はq値(FDR)を管理。本命指標は事前登録(α=0.05)、その他は探索と明記。レポートは効果量+区間が主役、p値は補助。

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

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

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

目的に応じて重み付けを変えると、成果に直結します。“ペルソナ”ではなく、読者タイプとして使い分けてください。

  • 社会人(転職)効果量/CI/サンプルサイズを前面に。ポートフォリオへAB設計書+結果レポートを追加。→ [内部リンク:ポートフォリオ完全ガイド]
  • 副業(稼ぎたい):Wilson区間+差分検定+実用差をテンプレ化。月次レポートに区間/注釈を標準搭載。→ [内部リンク:データレポート納品の型]
  • 主婦/夫(在宅):ブートストラップで仮定依存を下げ、図+区間で納品。→ [内部リンク:在宅×Python:子育てと両立する1日1時間学習術]

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

課題:「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文ではなく配列演算(=ベクトル化)に乗せるのが近道。本記事は、未経験〜初学者が週10 ...

ポートフォリオ
【保存版】データ職のポートフォリオ完全ガイド|再現性・評価・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基礎