作为记录,我认为这是非常适合数据科学 Stack Exchange 的问题类型。我希望我们能得到一堆真实世界的数据问题示例,以及如何最好地解决这些问题的几个观点。
我鼓励您不要使用 p 值,因为它们可能会产生误导(1、2)。我的方法取决于您能够在一些干预之前和之后总结给定页面上的流量。您关心的是干预前后的费率差异。也就是说,每天的点击次数如何变化?下面,我用一些模拟的示例数据解释了第一个 stab 方法。然后我将解释一个潜在的陷阱(以及我会怎么做)。
首先,让我们考虑一下干预前后的一页。假设干预使每天的点击量增加了大约 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=0 开始,并且在样本中的所有天数中简单地递增)。然后从每天的每个点击数中减去估计值 y_hat,以消除数据趋势。然后您可以执行上述程序并确信正百分比差异不是由于潜在趋势造成的。当然,趋势可能不是线性的,所以请谨慎使用!祝你好运!