사전 확률을 사용한 매개변수 추정
이메일 전환율 예측
데이터에 따르면 이메일을 여는 처음 다섯 명 중 두 명이 링크를 클릭합니다.
import numpy as np
import pandas as pd
from scipy import stats, special
import itertools
from sympy import *
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")
def decorate_plot(xlab, ylab, title=None, size=(4,3)):
plt.figure(figsize=size)
plt.xlabel(xlab)
plt.ylabel(ylab)
plt.title(title)
ratio=np.linspace(0, 1, 100)
pdf=stats.beta.pdf(ratio, 2, 3)
decorate_plot("conversion ratio","PDF", f"Beta(2, 3)")
plt.plot(ratio, pdf)
plt.show()
위 분포에서 95% 신뢰 구간(즉, 실제 전환율이 그 범위 어딘가에 있을 확률 95%)은 더 쉽게 볼 수 있도록 표시되어 있습니다. 이 시점에서 우리의 데이터는 실제 전환율이 0.06에서 0.8 사이일 수 있다고 알려줍니다! 이는 지금까지 우리가 실제로 얻은 정보가 얼마나 적은지를 반영합니다.
ci=stats.beta.interval(0.95, 2, 3)
print(f"하한: {ci[0].round(3)}, 상한: {ci[1].round(3)}")
하한: 0.068, 상한: 0.806
사전 확률을 사용하여 더 넓은 맥락에서 살펴보기
이 데이터(80% 전환율)는 비현실적으로 보입니다. 더 넓은 맥락을 살펴보겠습니다. 귀하의 블로그와 같은 범주에 나열된 블로그의 경우, 제공자의 데이터에 따르면 이메일을 여는 사람 중 평균 2.4%만이 콘텐츠를 클릭한다고 합니다.
베이즈 정리를 적용하여 사전 확률과 우도 분포를 조합하여 사후 확률을 생성할 수 있습니다. 새 데이터(우도)가 들어오면 사전 확률이 변경됩니다. 이 프로세스를 베이지안 업데이트라고 합니다.
베이지안 용어로 관찰한 데이터는 우도이고, 외부 맥락 정보(이 경우 개인적 경험과 이메일 서비스에서 얻은 정보)는 사전 확률입니다. 이제 우리의 과제는 사전 확률을 모델링하는 방법을 알아내는 것입니다.
이메일 제공자의 2.4% 전환율은 시작점을 제공합니다. 이제 평균($\frac{\alpha}{\alpha + \beta}$)이 약 0.024인 베타 분포를 원한다는 것을 알고 있습니다. 이 평균비율에 대한 α와 β는 고유하지 않습니다. 즉, 평균으로부터 유추될 수 있는 다양한 베타분포가 존재합니다. 여기서 sympy 패키지의 여러 함수를 사용하여 가능한 두 매개변수의 조합을 알아봅니다.
a1, b1=symbols("alpha, beta")
eq=a1/(a1+b1)-0.024
b2=solve(eq, b1); b2
[[40.6666666666667*alpha]
[int(b2[0].subs(a1, i)) for i in [1,2,5,24]]
[40, 81, 203, 976]
ratio=np.linspace(0, 1, 1000)
a=[1,2,5,24]
b=[int(b2[0].subs(a1, i)) for i in a]
col=['b','r','g','k']
decorate_plot("conversion ratio","PDF")
for i in range(len(a)):
pdf=stats.beta.pdf(ratio, a[i], b[i])
plt.plot(ratio, pdf, color=col[i], label=f"Beta({a[i]}, {b[i]})")
plt.xlim(-0.01, 0.1)
plt.legend(loc="best", labelcolor="linecolor")
plt.show()
지금 문제는 우리가 가진 가장 관대한 옵션인 Beta(1,40)조차도 우리의 확률 밀도의 많은 부분을 매우 낮은 값으로 두기 때문에 약간 너무 비관적인 것처럼 보인다는 것입니다. 그럼에도 불구하고 이 분포를 고수할 것입니다. 왜냐하면 그것은 이메일 제공자의 데이터에서 2.4%의 전환율을 기반으로 하며 우리의 사전 확률 중 가장 약하기 때문입니다. Beta(2, 80)을 사용하지 않는 이유는 무엇일까요? 그렇게 약하지는 않지만 여전히 그다지 헌신적이지 않습니다. 제 생각에는 2.4%의 전환율을 제공하는 것이 더 나은 것 같습니다.
두 베타 분포에 대한 매개변수를 간단히 더함으로써 사후 분포(우도와 사전 확률의 조합)를 계산할 수 있습니다(베이지안 사전 확률과 확률 분포 참조).
| Beta(αposterior, βposterior) | (1) |
| = Beta(αlikelihood+αprior, βlikelihood+βprior) |
ratio=np.linspace(0, 1, 1000)
like=stats.beta.pdf(ratio,2, 3)
post=stats.beta.pdf(ratio, 1+2, 40+3)
decorate_plot("Conversion Ratio", "Density")
plt.plot(ratio, like, color="b", label="Likielihood")
plt.plot(ratio, post, color="g", label="posterior")
plt.legend(loc="best", labelcolor="linecolor")
plt.show()
이건 정말 놀라운 일이에요!
비교적 약한 사전 확률로 작업하고 있지만, 그것이 우리가 현실적인 전환율이라고 믿는 것에 큰 영향을 미쳤다는 것을 알 수 있습니다. 사전 확률 없이 가능성에 대해, 우리는 전환율이 80%에 달할 수 있다는 믿음이 있다는 점에 유의하세요. … 우도에 사전 확률을 추가하면 믿음이 조정되어 훨씬 더 합리적이 됩니다. 하지만 저는 여전히 업데이트된 믿음이 약간 비관적이라고 생각합니다.
우리는 몇 시간을 기다려 더 많은 결과를 수집했고, 이제 이메일을 연 100명 중 25명이 링크를 클릭했다는 것을 알게 되었습니다!
ratio=np.linspace(0, 1, 1000)
like=stats.beta.pdf(ratio,25, 75)
post=stats.beta.pdf(ratio, 1+25, 40+75)
decorate_plot("Conversion Ratio", "Density")
plt.plot(ratio, like, color="b", label="Likielihood")
plt.plot(ratio, post, color="g", label="posterior")
plt.legend(loc="best", labelcolor="linecolor")
plt.show()
아침에 우리는 300명의 구독자가 이메일을 열었고, 그 중 86명이 클릭했다는 것을 알게 되었습니다. 다음 그림은 업데이트된 신념을 보여줍니다.
ratio=np.linspace(0, 1, 1000)
like=stats.beta.pdf(ratio,86, 300-86)
post=stats.beta.pdf(ratio, 1+86, 40+300-86)
decorate_plot("Conversion Ratio", "Density")
plt.plot(ratio, like, color="b", label="Likielihood")
plt.plot(ratio, post, color="g", label="posterior")
plt.legend(loc="best", labelcolor="linecolor")
plt.show()





댓글
댓글 쓰기