作为记录,我认为这是最适合数据科学Stack Exchange的问题类型。我希望我们能获得一堆关于数据问题的现实例子,以及关于如何最好地解决它们的几种观点。
我会鼓励你不使用p值,因为他们可以很误导(1,2)。我的方法取决于您能够在进行干预之前和之后汇总给定页面上的点击量。您所关心的是干预前后比率的差异。也就是说,每天的点击次数如何变化?下面,我用一些模拟的示例数据说明第一种刺入方法。然后,我将解释一个潜在的陷阱(以及我将如何做)。
首先,让我们考虑一下干预前后的一页。假设干预将每天的点击率提高了约15%:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def simulate_data(true_diff=0):
#First choose a number of days between [1, 1000] before the intervention
num_before = np.random.randint(1, 1001)
#Next choose a number of days between [1, 1000] after the intervention
num_after = np.random.randint(1, 1001)
#Next choose a rate for before the intervention. How many views per day on average?
rate_before = np.random.randint(50, 151)
#The intervention causes a `true_diff` increase on average (but is also random)
rate_after = np.random.normal(1 + true_diff, .1) * rate_before
#Simulate viewers per day:
vpd_before = np.random.poisson(rate_before, size=num_before)
vpd_after = np.random.poisson(rate_after, size=num_after)
return vpd_before, vpd_after
vpd_before, vpd_after = simulate_data(.15)
plt.hist(vpd_before, histtype="step", bins=20, normed=True, lw=2)
plt.hist(vpd_after, histtype="step", bins=20, normed=True, lw=2)
plt.legend(("before", "after"))
plt.title("Views per day before and after intervention")
plt.xlabel("Views per day")
plt.ylabel("Frequency")
plt.show()
我们可以清楚地看到,该干预平均每天增加了点击次数。但是,为了量化费率差异,我们应该使用一家公司的干预进行多页打印。由于每个页面的基础费率会有所不同,因此我们应计算费率的百分比变化(同样,此处的费率是每天的点击数)。
现在,让我们假设我们有n = 100
页面数据,每个页面都受到同一公司的干预。要获取百分比差异,我们取(平均值(之前每天的点击次数)-平均值(之后每天的点击次数)/平均值(之前每天的点击次数):
n = 100
pct_diff = np.zeros(n)
for i in xrange(n):
vpd_before, vpd_after = simulate_data(.15)
# % difference. Note: this is the thing we want to infer
pct_diff[i] = (vpd_after.mean() - vpd_before.mean()) / vpd_before.mean()
plt.hist(pct_diff)
plt.title("Distribution of percent change")
plt.xlabel("Percent change")
plt.ylabel("Frequency")
plt.show()
现在我们有了感兴趣参数的分布!我们可以用不同的方式查询此结果。例如,我们可能想知道此百分比变化的模式或(近似值):
def mode_continuous(x, num_bins=None):
if num_bins is None:
counts, bins = np.histogram(x)
else:
counts, bins = np.histogram(x, bins=num_bins)
ndx = np.argmax(counts)
return bins[ndx:(ndx+1)].mean()
mode_continuous(pct_diff, 20)
当我运行此代码时,我得到0.126,这很不错,考虑到我们的真实百分比变化是15。我们还可以看到积极变化的次数,它近似于给定公司的干预措施每天提高点击率的可能性:
(pct_diff > 0).mean()
在这里,我的结果是0.93,所以我们可以说这家公司很有效率。
最后,潜在的陷阱:每个页面可能都有一些您应该考虑的潜在趋势。也就是说,即使没有干预,每天的点击次数也可能会增加。为了解决这个问题,我将估算一个简单的线性回归,其中结果变量是每天的点击次数,自变量是day(从day = 0开始,并且在样本中的所有天数都简单增加)。然后从每天的每次点击次数中减去估算值y_hat,以消除数据趋势。然后,您可以执行上述步骤,并确信正百分比差异不是由于潜在趋势所致。当然,趋势可能不是线性的,请谨慎使用!祝好运!