1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実務で使った重回帰分析による効果検証のメモ(Python)

Last updated at Posted at 2025-11-01

概要

  • 目的:教育関連データを題材に、補習・研修の参加が学習成果に与える影響を重回帰分析で検証
  • 手法:t検定+重回帰モデル(処置変数+制御変数)を用い、観測データの交絡因子を調整
  • 主な結果:処置変数「準備コース受講」が平均+5.50点上昇(p < 0.001)を示し、効果の可能性を示唆

はじめに

業務で施策や介入の効果を定量的に検証する機会があります。
教育データなので、観測できない因子があるという前提で検証しています。
特に「A/Bテストのような実験設計ができないケース」で、
重回帰分析を使った効果検証(因果推論の第一歩) を試しているので、備忘録としてまとめます。

※業務での知見を整理した学習メモです。

背景

現場では「完全なランダム実験(A/Bテスト)」を行うのが難しいです。
たとえば教育現場(実社会でも同様!?):

希望者のみが補習や研修に参加する

特定のクラスや部署だけ施策を実施する

こうした状況では、参加する人自体にバイアス(=交絡因子) があるため、
単純な平均比較では因果効果を正しく推定できません。

そこで、重回帰分析を使って、他の要因を統制した上で「施策の純粋な効果」を推定します。

データ概要

Kaggleの Students Performance in Examsを利用します。
(実務のデータは使えないので)
「テスト準備コースを受けた生徒は数学スコアが高いか?」を検証。

項目 内容
処置 test preparation course(completed=1, none=0)
アウトカム math score
共変量 gender, race/ethnicity, parental level of education, lunch
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt

# データ読み込み
df = pd.read_csv("StudentsPerformance.csv")
df.columns = [c.strip().lower().replace(" ","_").replace("/","_") for c in df.columns]
df["treat"] = (df["test_preparation_course"] == "completed").astype(int)
df["y"] = pd.to_numeric(df["math_score"], errors="coerce")

# Welchのt検定
treated, control = df[df.treat==1]["y"], df[df.treat==0]["y"]
t_stat, p_val = stats.ttest_ind(treated, control, equal_var=False)
print(f"t-stat = {t_stat:.2f}, p = {p_val:.4f}")

# 重回帰分析
model = smf.ols("y ~ treat + gender + C(race_ethnicity) + C(parental_level_of_education) + C(lunch)", data=df).fit()
print(model.summary())

# 可視化
plt.boxplot([control, treated], labels=["Control (none)", "Treated (completed)"], showmeans=True)
plt.title("Math Scores by Test Preparation Course")
plt.ylabel("Math Score")
plt.axhline(df["y"].mean(), color="red", linestyle="--", label="Overall Mean")
plt.legend()
plt.show()

実行結果

===== Welchのt検定結果 =====
t-statistic = 5.787, p-value = 0.00000
Mean(Treated) = 69.70, Mean(Control) = 64.08, Diff = 5.62

重回帰分析の結果(主要部分のみ抜粋):

変数 係数 標準誤差 P値 解釈
treat 5.50 0.87 0.000 コースを受けた生徒は平均+5.50点高い(統計的に有意)
C(lunch)[T.standard] 10.88 0.89 0.000 昼食が標準提供の生徒は約11点高い

可視化

image.png

赤い破線は全体平均です。
補習(treat=1)群の中央値と平均が、非参加群よりもやや高くなっていることが視覚的にも確認できます。

考察

t検定では単純な平均差を確認
重回帰分析では、性別・人種・昼食などを制御して処置効果を推定
treat が正で有意 → 準備コースがスコア上昇に寄与している可能性
ただし、実務で重要なのは「因果」と"断定"しないです
未観測交絡(やる気、家庭環境、外部塾など)が影響している可能性があるため、
**PSM(傾向スコア)やDID(差の差法)**などを併用して検証するのが理想です。

実務で感じているポイント

データ数が少ないと回帰係数が不安定
そもそも集められる観測因子が少ない
共線性をチェックしないと誤解を生む
p値よりも「仮説と現場理解」に基づく解釈が大事
分析は万能ではなく、「納得感のある議論を支える補助線」くらいの立ち位置がちょうど良い

今後の拡張

手法 目的
傾向スコア分析(PSM/IPW) 未観測バイアスの補正
DID(差の差法) 時系列前後の変化比較
RDD(回帰不連続) 閾値を使った準実験デザイン

まとめ

重回帰分析は「他要因を調整した効果検証」に有効
t検定と併せて使うことで、説得力のある分析が可能
実務では「統計+現場理解」の両面が大切

本分析で得た知見は、教育サービスや学習プラットフォームにおける個別指導支援や教材最適化に応用できると考えています。
今後はクラウド化・可視化・モデル運用の観点も含め、教育現場での実装を目指します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?