予測とオッズ

Pythonで学ぶstatsmodelsによる回帰入門

Maarten Van den Broeck

Content Developer at DataCamp

regplot() による予測

sns.regplot(x="time_since_last_purchase",
            y="has_churned",
            data=churn,
            ci=None,
            logistic=True)

plt.show()

解約と最終購入からの経過時間の散布図。ロジスティック回帰曲線が重ねて表示されている。

Pythonで学ぶstatsmodelsによる回帰入門

予測の実行

mdl_recency = logit("has_churned ~ time_since_last_purchase",
                    data = churn).fit()


explanatory_data = pd.DataFrame( {"time_since_last_purchase": np.arange(-1, 6.25, 0.25)})
prediction_data = explanatory_data.assign( has_churned = mdl_recency.predict(explanatory_data))
Pythonで学ぶstatsmodelsによる回帰入門

点予測の追加

sns.regplot(x="time_since_last_purchase",
            y="has_churned",
            data=churn,
            ci=None,
            logistic=True)

sns.scatterplot(x="time_since_last_purchase",
                y="has_churned",
                data=prediction_data,
                color="red")

plt.show()

解約と最終購入からの経過時間の散布図。ロジスティック回帰曲線と predict() の結果が重ねて表示され、曲線と完全に一致している。

Pythonで学ぶstatsmodelsによる回帰入門

最も可能性の高い結果の取得

prediction_data = explanatory_data.assign(
    has_churned = mdl_recency.predict(explanatory_data))

prediction_data["most_likely_outcome"] = np.round(prediction_data["has_churned"])
Pythonで学ぶstatsmodelsによる回帰入門

最も可能性の高い結果の可視化

sns.regplot(x="time_since_last_purchase",
            y="has_churned",
            data=churn,
            ci=None,
            logistic=True)

sns.scatterplot(x="time_since_last_purchase",
                y="most_likely_outcome",
                data=prediction_data,
                color="red")

plt.show()

解約と最終購入からの経過時間の散布図。ロジスティック回帰曲線と最も可能性の高い結果が重ねて表示されている。最終購入からの経過時間が短い場合は解約しない、長い場合は解約するという結果になっている。

Pythonで学ぶstatsmodelsによる回帰入門

オッズ

オッズとは、あるイベントが起こる確率を、起こらない確率で割った値です。

$$ \text{odds} = \frac{\text{probability}}{(1 - \text{probability)}} $$

$$ \text{odds} = \frac{0.25}{(1 - 0.25)} = \frac{1}{3} $$

オッズと確率の折れ線グラフ。確率が1に近づくにつれ、オッズは漸近的に無限大に増加する。

Pythonで学ぶstatsmodelsによる回帰入門

オッズの計算

prediction_data["odds"] = prediction_data["has_churned"] / 
                            (1 - prediction_data["has_churned"])

Pythonで学ぶstatsmodelsによる回帰入門

オッズの可視化

sns.lineplot(x="time_since_last_purchase",
             y="odds",
             data=prediction_data)


plt.axhline(y=1, linestyle="dotted")
plt.show()

最終購入からの経過時間に対するオッズの折れ線グラフ。オッズ=1の水平線が引かれている。経過時間が短いと解約しない可能性が高く、長くなるにつれてオッズは最大5倍まで増加する。

Pythonで学ぶstatsmodelsによる回帰入門

対数オッズの可視化

sns.lineplot(x="time_since_last_purchase",
             y="odds",
             data=prediction_data)

plt.axhline(y=1,
            linestyle="dotted")
plt.yscale("log")

plt.show()

最終購入からの経過時間に対するオッズの折れ線グラフ。オッズ=1の水平線が引かれ、y軸が対数スケールになっているためオッズの線が直線になっている。

Pythonで学ぶstatsmodelsによる回帰入門

対数オッズの計算

prediction_data["log_odds"] = np.log(prediction_data["odds"])
Pythonで学ぶstatsmodelsによる回帰入門

すべての予測結果

time_since_last_prchs has_churned most_likely_rspns odds log_odds
0 0.491 0 0.966 -0.035
2 0.623 1 1.654 0.503
4 0.739 1 2.834 1.042
6 0.829 1 4.856 1.580
... ... ... ... ...
Pythonで学ぶstatsmodelsによる回帰入門

スケールの比較

スケール 値の解釈が容易か? 変化の解釈が容易か? 精度は高いか?
確率
最も可能性の高い結果 ✔✔
オッズ
対数オッズ
Pythonで学ぶstatsmodelsによる回帰入門

練習しましょう!

Pythonで学ぶstatsmodelsによる回帰入門

Preparing Video For Download...