예측과 오즈

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로 살펴보는 회귀 소개

오즈(odds)

오즈(odds)는 어떤 일이 일어날 확률을 일어나지 않을 확률로 나눈 값입니다.

$$ \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로 살펴보는 회귀 소개

척도 비교

Scale 해석이 쉬운가? 변화 해석이 쉬운가? 정밀한가?
Probability
Most likely outcome ✔✔
Odds
Log odds
Python에서 statsmodels로 살펴보는 회귀 소개

연습해 봅시다!

Python에서 statsmodels로 살펴보는 회귀 소개

Preparing Video For Download...