目次
3.実装
statsmodelsで実装
pythonのstatsmodelsを使用して上記の美容室データ(仮)のポアソン回帰を実行したいと思います。
コードは以下です。
import statsmodels.api as sm
import statsmodels.formula.api as smf
# ポアソン回帰モデルの構築
formula = 'visits ~ campaign + age + gender'
poisson_model = smf.glm(formula=formula, data=data, family=sm.families.Poisson()).fit()
かなりあっさりですね。(笑)
以下で、分析の結果からキャンペーンの効果があったと言えるのかどうか、表示しています。
# 結果の表示
print(poisson_model.summary())
# キャンペーンの効果(β1)の抽出と解釈
beta_1 = poisson_model.params['campaign']
p_value = poisson_model.pvalues['campaign']
print(f"キャンペーンの効果 (β1): {beta_1}")
if p_value < 0.05:
print(f"キャンペーンは統計的に有意な効果があります (p値={p_value})。")
else:
print(f"キャンペーンの効果は統計的に有意ではありません (p値={p_value})。")
# クライアントに提供する示唆
if beta_1 > 0:
insight = "キャンペーンは顧客の来店回数を増加させる効果があると示されています。"
elif beta_1 < 0:
insight = "キャンペーンは顧客の来店回数を減少させる効果があると示されています。"
else:
insight = "キャンペーンによる明確な効果は見られません。"
print(f"クライアントへの示唆: {insight}")
キャンペーンが来店回数に対して効果ありという結果になりました!
つまり、キャンペーンをやっている方がその期間の顧客の来店を促進した、ということですね。
分析の問題点
今回の分析を実践で使用するには、データが少なかったり、いろいろ問題があります。
例えば、キャンペーンバイナリデータ以外の説明変数で目的変数である来店が完全に近い状態で説明できていない限り、このキャンペーン効果を”うのみ”にするのは危険である、と言えます。
この問題は、省略変数バイアス(Omitted Variable Bias)と言われます。
省略変数バイアスは、モデルが重要な説明変数を省略しているときに生じ、推定されたパラメータが真の値から偏ってしまう原因となります。
省略された変数がモデルの他の説明変数と相関している場合、このバイアスは特に顕著になります。
したがって、キャンペーンの効果を分析する際には、以下の点を考慮する必要があります
- 重要な説明変数の特定:来店頻度に影響を与える可能性があるすべての変数を特定し、モデルに含める。例えば、顧客の属性、季節や曜日の効果、過去のマーケティング活動、経済状況などが含まれる場合がある。
- 統計的手法の利用:省略変数バイアスの影響を緩和するために、手法の選択やモデルの仕様を慎重に検討。たとえば、固定効果モデルやランダム効果モデルを用いて、時間にわたる個々の変動や不観測の要因を捉えることができる。
- 感度分析:異なるモデル仕様で分析を実施し、推定結果がどの程度一貫しているかを確認する。また、重要な変数をモデルから除外した場合の影響を評価することも有用。
キャンペーンの効果を推定する際には、これらの点を考慮して慎重に分析を行い、モデルの結果を解釈する際には潜在的な限界や仮定を明確にすることが重要です。
また、このような効果検証には因果推論などの手法を用いるのも良いと思います。
でも今回はとりあえず使ってみようということで、ポアソン回帰を使って分析してみました。
ここでついでに、今回のモデルのベイズ版も実装してみようと思います。
ベイジアンポアソン回帰モデルの実装
モデルの定義とMCMCによるサンプリングを行います。
with pm.Model() as model:
# 切片と傾斜の事前分布
intercept = pm.Normal('intercept', mu=0, sigma=10)
beta_campaign = pm.Normal('beta_campaign', mu=0, sigma=10)
beta_age = pm.Normal('beta_age', mu=0, sigma=10)
beta_gender = pm.Normal('beta_gender', mu=0, sigma=10)
# λの計算
lambda_ = pm.math.exp(intercept + beta_campaign * df['campaign'] + beta_age * df['age'] + beta_gender * df['gender'])
# 観測データの尤度関数
observations = pm.Poisson('observations', mu=lambda_, observed=df['visits'])
# MCMCサンプリング
trace = pm.sample(draws=2000, tune=200, chains=4, return_inferencedata=True)
サンプリングできたので、結果を出力してみましょう。
az.plot_trace(trace, figsize=(13,15))
az.summary(trace)
pm.model_to_graphviz(model)



r-hatも良い感じで、きれいに収束していそうですね。
\(\beta1\)の平均も0.826で来店に正の影響をもたらしていることが確認できます。
以上、美容室経営におけるキャンペーン効果分析(ポアソン回帰偏)でした!
参考文献
マーケティング・モデル 第2版 (Rで学ぶデータサイエンス 13)
里村卓也(著)
Bayesian Modeling and Computation in Python (Chapman & Hall/CRC Texts in Statistical Science)
Osvaldo A. Martin (著), Ravin Kumar (著), Junpeng Lao (著)
