我应该使用哪种统计模型来分析单个事件影响纵向数据的可能性


19

我试图找到一种公式,方法或模型来分析特定事件影响某些纵向数据的可能性。我很难弄清楚在Google上搜索什么。

这是一个示例方案:

您拥有一家每天平均有100个客户的公司。有一天,您决定要增加每天到达商店的客源客户的数量,因此您会在商店外进行疯狂的表演以引起注意。在下一周,您平均每天会看到125位客户。

在接下来的几个月中,您再次决定要获得更多的业务,也许还要维持更长的时间,因此您尝试其他一些随机的事情来在商店中吸引更多的客户。不幸的是,您不是最佳的营销人员,您的某些策略几乎没有效果,甚至没有效果,有些甚至产生了负面影响。

我可以使用哪种方法来确定任何一个单独事件正面或负面地影响到门顾客数量的可能性?我完全意识到关联并不一定等于因果关系,但是在特定事件发生之后,我可以使用哪些方法来确定您的业务在客户日常活动中可能增加或减少?

我不希望分析您尝试增加无障碍顾客数量之间是否存在关联,而是要分析一个事件是否独立于其他事件是否具有影响力。

我意识到这个示例是非常人为的和简单的,因此,我还将简要介绍一下我正在使用的实际数据:

我正在尝试确定特定的市场营销代理商在发布新内容,进行社交媒体宣传等活动时对其客户的网站的影响。对于任何一个特定的代理商,他们可能拥有1至500个客户。每个客户拥有的网站范围从5页到超过一百万个不等。在过去的5年中,每个代理商都为每个客户注释了他们的所有工作,包括已完成的工作类型,受影响的网站页面数量,花费的时间等。

使用我已经组装到数据仓库中的上述数据(放入一堆星型/雪花模式),我需要确定任何一件工作(及时发生的任何事件)对以下项目产生影响的可能性:流量触及受特定作品影响的任何/所有页面。我已经为网站上找到的40种不同类型的内容创建了模型,这些模型描述了从发布日期到现在,具有所述内容类型的页面可能遇到的典型流量模式。相对于适当的模型进行规范化之后,我需要确定由于特定工作而获得的特定页面所增加或减少的访问者的最高和最低数量。

虽然我有基本数据分析(线性和多元回归,相关性等)的经验,但我对如何解决这个问题一无所知。过去,我通常使用给定轴的多次测量数据来分析数据(例如,温度,口渴和动物之间的关系,并确定温度升高对动物的口渴的影响),但我觉得上面我正在尝试分析影响非线性但可预测(或至少可建模)的纵向数据集在某个时间点的单个事件的统计。我很沮丧:(

任何帮助,提示,指示,建议或指示都将非常有帮助,我将永远感激不已!


一整类统计分析致力于纵向数据建模。如果您对同一主题重复测量过,则混合模型通常被用作社会科学领域的最新技术,以确定干预是否有效。如果您有时间序列,则只能使用Arima之类的东西。
B_Miner 2014年

RDD方法可能对您也有用:austinclemens.com/blog/2014/06/08/436
B_Miner 2014年

Answers:


11

作为记录,我认为这是最适合数据科学Stack Exchange的问题类型。我希望我们能获得一堆关于数据问题的现实例子,以及关于如何最好地解决它们的几种观点。

我会鼓励你使用p值,因为他们可以很误导(12)。我的方法取决于您能够在进行干预之前和之后汇总给定页面上的点击量。您所关心的是干预前后比率的差异。也就是说,每天的点击次数如何变化?下面,我用一些模拟的示例数据说明第一种刺入方法。然后,我将解释一个潜在的陷阱(以及我将如何做)。

首先,让我们考虑一下干预前后的一页。假设干预将每天的点击率提高了约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,以消除数据趋势。然后,您可以执行上述步骤,并确信正百分比差异不是由于潜在趋势所致。当然,趋势可能不是线性的,请谨慎使用!祝好运!


非常感谢您提供如此详尽的说明!对此,我真的非常感激。在您和neone4373之间,我能够解决问题!这个社区动摇了!谢谢!
彼得·柯比

10

回到我的数据分析师时代,这类问题非常典型。基本上,市场营销中的每个人都会想到一个疯狂的想法,那就是卖给更高的顾客作为单个事件,可以将KPI提高2000%。上级领导会批准他们,然后他们将开始“测试”。结果将返回,而管理层将把结果转交给数据分析人员来确定有效的方法和执行者。

简短的答案是,您真的无法确定它是否不是在相同的时间段内作为随机A / B风格测试运行的。但是我非常清楚该答案的不足之处,特别是如果不存在纯粹答案的事实与未来业务决策的紧迫性无关时。在这种情况下,我将使用一些技巧来挽救分析,请记住,这更多的是艺术而不是科学。

提手

句柄是您可以保留的数据中存在的东西。根据您所处情况的告诉,您可以获得有关行销代理商是谁,他们何时尝试战术以及将其应用于哪个站点的很多信息。这些是您的起点,而此类信息将成为您分析的基石。

方法

该方法可能会对哪些机构获得的所有收益都产生最大的影响,因此您将需要确保它清楚地勾勒出轮廓,并且所有利益相关者都同意这是有意义的。如果您做不到,那么人们将很难相信您的分析。

转换就是一个例子。假设营销部门购买了一些潜在客户,然后他们到达了我们的着陆页,我们将跟踪他们3天,如果他们在这段时间内进行了购买,我们会将其视为已转换。为什么3天,为什么不5天或1天?只要每个人都同意,那并不重要,现在您可以建立一个定义。

比较

理想情况下,您将有一个很好的A / B测试来证明确定的关系,我将假设您在这些方面还不够,但是您仍然可以从类似数据的简单比较中学到一些东西。当公司试图确定广播广告的效果时,他们通常会在同一市场的偏移月份或一个市场的几个月内投放广告,并将其与在单独但相似的市场中的结果进行比较。它不会被科学所接受,但是即使有这么多噪音,几乎总是可以看到明显的结果。

在您的情况下,我将结合使用它们来确定事件需要多长时间来记录效果。一旦获得了该时间段的数据,就可以对建模的流量预测,每周一周的增长,每月一个月的数据进行运行。然后,可以在各个时间段之间对代理商进行有意义的比较。

实用主义

希望能够对因果关系有一个深刻的了解,但这可能不现实。由于外部因素使您的分析多么混乱,您将不断地反复遇到这个问题:此事件是否增加了销量/销售额/点击率,或者做任何事情都会产生相同的效果?为此,我可以提供的最佳建议是为您要衡量的目标设定非常现实的目标。一个好的起点是,在您使用的方法论范围内,哪个事件产生的影响最大。一旦有了这些,就可以从那里打开光圈。

摘要

弄清所有这些方面之后,就可以着手构建通用的解决方案,然后将其自动化。以这种方式设计解决方案的优点是已经内置了业务逻辑。这将使您的结果对于非技术业务负责人来说更加平易近人和直观。


@ 1代表疯狂的市场推广人员。市场研究工作和对不良统计数据的扭曲使我很难过……
Christian Sauer 2014年

2

编辑:警告,我留下我的信息,但我的回答似乎有误,请查看以下评论​​!

我不是专家,但是我想主要的问题是回答这个问题:

一个/任何事件是否影响了某天的点击数?

但是我不知道如何处理多个事件,所以我会尝试回答这个问题:

  • 事件X是否会影响某一天的点击次数?

可以使用带有p值的假设检验(例如,科学家评估药物是否会影响疾病)进行回答。

通过使用p值,您可以确定在正常情况下,一天中的点击数仅仅是随机的并且可以接受的,还是必须与您模型的变化相对应。

您可以在《统计手册简介》中阅读有关p值的更多信息,我实际上是从那里学到的。

然后,问题的其他部分是如何识别事件并计算必要的参数以回答您的问题(平均值/中位数,方差等),以及如何使该问题保持最新状态并正常工作。


1

几年前(2015年),Google发表了一篇关于特定事件在时间序列模型中的影响的研究论文。您可以在此处阅读更多详细信息,使用贝叶斯结构时间序列模型推断因果影响

在此GitHub页面上,您可以找到详细的示例及其工作方式的描述。简而言之,

该R包实现了一种方法,用于估计设计的干预措施对时间序列的因果影响。例如,一个广告系列产生了多少额外的每日点击?当无法进行随机实验时,很难回答这样的问题。

您使用事件前数据和事件后数据训练模型,并得到像这样的图

在此处输入图片说明

第一个面板显示了数据和后处理时期的反事实预测。第二个面板显示了观察到的数据与反事实预测之间的差异。由模型估算,这是逐点因果效应。第三个面板将第二个面板的点状贡献相加,得出干预的累积效果图。

运行以下命令summary(impact),您可以获得摘要以及事件对时间序列数据的估计影响。

同样的库也已移植到Python。例如这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.