import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline
#We are setting the seed to assure you get the same answers on quizzes as we set up
random.seed(43)
随机构造分组和转化数据,converted列表示转化了与否,group列的new_page代表新版网页,group列的old_page代表旧版网页。
ab_data.converted.mean()==0.100118
ab_data.query('group=="new_page"')['converted'].mean()==0.10010251582612997
ab_data.query('group=="old_page"')['converted'].mean()==0.10013357025675172
#随机数据
#ab_data = pd.DataFrame({'group':np.random.choice(['new_page','old_page'],size=499000),'converted':np.random.randint(0,2,size=499000)})
#ab_data.iloc[-400000:,1] = 0
#ab_data = pd.concat([ab_data,pd.DataFrame({'group':['new_page']*500,'converted':[1]*500})],axis=0)
#ab_data = pd.concat([ab_data,pd.DataFrame({'group':['old_page']*500,'converted':[0]*500})],axis=0)
#ab_data.to_pickle('ab_data.pkl')
ab_data = pd.read_pickle('ab_data.pkl')
ab_data.head()
平均转化率是多少?
ab_data.converted.mean()
假定一个用户处于new_page组中,他的转化率是多少?
ab_data.query('group=="new_page"')['converted'].mean()
假定一个用户处于old_page组中,他的转化率是多少?
ab_data.query('group=="old_page"')['converted'].mean()
截止目前并没有证据可以证明某一页面可以带来更多的转化率
请注意,由于与每个事件相关的时间戳,你可以在进行每次观察时连续运行假设检验。 然而,问题的难点在于,一个页面被认为比另一页页面的效果好得多的时候你就要停止检验吗?还是需要在一定时间内持续发生?你需要将检验运行多长时间来决定哪个页面比另一个页面更好?
零假设:$p_{new}-p_{old}<=0$
备择假设:$p_{new}-p_{old}>0$
每个页面的样本大小要与 ab_data.csv 中的页面大小相同。
执行两次页面之间 转化 差异的抽样分布,计算零假设中10000次迭代计算的估计值。
使用下面的单元格提供这个模拟的必要内容。如果现在还没有完整的意义,不要担心,你将通过下面的问题来解决这个问题。
p_new=ab_data.converted.mean()
p_new
p_old=ab_data.converted.mean()
p_old
n_new=ab_data.query('group=="new_page"').shape[0]
n_new
n_old=ab_data.query('group=="old_page"').shape[0]
n_old
random.seed(43)
#numpy.random.choice(a, size=None, replace=True, p=None)
#Generates a random sample from a given 1-D array
#p : 1-D array-like, optional
#The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a.
new_page_converted=np.random.choice(2,size=n_new,p=[1-p_new,p_new])
new_page_converted
random.seed(43)
old_page_converted=np.random.choice(2,size=n_old,p=[1-p_old,p_old])
old_page_converted
diff=new_page_converted.mean()-old_page_converted.mean()
diff
p_diffs=[]
for i in range(10000):
p_new_diff = np.random.choice(2,size=n_new,p=[1-p_new,p_new]).mean()
p_old_diff = np.random.choice(2,size=n_old,p=[1-p_old,p_old]).mean()
p_diffs.append(p_new_diff - p_old_diff)
p_diffs = np.array(p_diffs)
plt.hist(p_diffs,bins=100)
obs_diff=ab_data.query('group=="new_page"')['converted'].mean()-\
ab_data.query('group=="old_page"')['converted'].mean()
obs_diff
(p_diffs>obs_diff).mean()
import statsmodels.api as sm
convert_old = ab_data.query('group=="old_page" & converted==1').shape[0]
convert_new = ab_data.query('group=="new_page" & converted==1').shape[0]
n_old = ab_data.query('group=="old_page"').shape[0]
n_new = ab_data.query('group=="new_page"').shape[0]
z_score,p_value=sm.stats.proportions_ztest([convert_old, convert_new], [n_old, n_new],alternative='smaller')
z_score,p_value
#alternative='two-sided'时(z_score,p_value)==(-4.508061583981402, 6.542258869878914e-06)
#alternative='smaller'时(z_score,p_value)==(-4.508061583981402, 3.271129434939457e-06)
#alternative='smaller'时(z_score,p_value)==(-4.508061583981402, 0.999996728870565)
from scipy.stats import norm
# Critical Z score value for a one tailed test at confidence level of 95%
norm.ppf(1-(0.05))
# Tells how significant z_score is:
norm.cdf(z_score)
由于p-value为3.271129434939457e-06很小,我们应该拒绝零假设而接受备选假设,也就是新页面确实会促进转化,这与之前的结果一致。
z_score的显著程度就是p-value。
import statsmodels.api as sm
ab_data['ab_page']=ab_data.group.map({'new_page':1,'old_page':0})
ab_data['intercept']=1
logit_mod=sm.Logit(ab_data['converted'],ab_data[['intercept','ab_page']])
result=logit_mod.fit()
result.summary()
ab_page关联的p-值为0(3.271129434939457e-06),而第2部分中p-值为0(若能显示更多小数位数,其应该为6.542258869878914e-06),两种情况中p-值不同的原因是检验的方向性不同,在假设检验中的p-值(3.271129434939457e-06)使用的是单尾检验,而这里的p-值表示ab_page因素与转化率是否有相关性,应该为双尾检验。结果表明ab_page适合用来预测转化情况。
在实际应用中,可能会有多种因素会影响到响应变量,添加其他因素可以更好的分析影响结果的变量;但是随着附加项越多,发生错误推论的可能性就越大。比如自变量彼此相关就会造成多重共线性,导致回归系数偏离想要的方向。
注意特征里面有coef、std err、z P>|Z|、[0.025 0.975]。大胆猜测coef是模型特征的系数,std err是模型特征的系数的标准差,[0.025 0.975]模型特征的系数的95%置信区间,z是模型特征的系数的z分数,P>|Z|是模型特征的系数的p值。