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

数据挖掘 机器学习 数据挖掘 统计数据
2021-10-02 23:33:56

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

这是一个示例场景:

想象一下,您拥有一家平均每天有 100 名步入式客户的企业。有一天,您决定要增加每天到达您商店的步入式顾客的数量,因此您在商店外进行了一场疯狂的噱头以引起注意。在接下来的一周中,您平均每天会看到 125 位客户。

在接下来的几个月中,您再次决定要获得更多业务,并且可能会维持更长时间,因此您尝试了一些其他随机的方法来吸引更多客户进入您的商店。不幸的是,你不是最好的营销人员,你的一些策略几乎没有效果,还有一些甚至有负面影响。

我可以使用什么方法来确定任何单个事件对上门客户数量产生正面或负面影响的概率?我完全意识到相关性并不一定等于因果关系,但是我可以使用哪些方法来确定您的企业在特定事件后客户的日常走动可能增加或减少?

我没有兴趣分析您增加步入式客户数量的尝试之间是否存在相关性,而是分析是否有任何一个事件,独立于所有其他事件,是有影响的。

我意识到这个例子相当做作和简单化,所以我还将简要描述我正在使用的实际数据:

我试图确定特定营销机构在发布新内容、执行社交媒体活动等时对其客户网站的影响。对于任何一个特定机构,他们可能拥有 1 到 500 个客户。每个客户的网站大小从 5 页到超过 100 万不等。在过去的 5 年中,每个机构都为每个客户的所有工作进行了注释,包括完成的工作类型、网站上受影响的网页数量、花费的小时数等。

使用我已经组装到数据仓库中的上述数据(放置在一堆星形/雪花模式中),我需要确定任何一项工作(任何一个时间事件)对访问受特定工作影响的任何/所有页面的流量。我为网站上的 40 种不同类型的内容创建了模型,这些模型描述了具有所述内容类型的页面从发布之日到现在可能经历的典型流量模式。相对于适当的模型进行标准化,我需要确定作为特定工作的结果接收到的特定页面的访问者增加或减少的最高和最低数量。

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

任何帮助、提示、指示、建议或方向都会非常有帮助,我将永远感激不尽!

4个回答

作为记录,我认为这是非常适合数据科学 Stack Exchange 的问题类型。我希望我们能得到一堆真实世界的数据问题示例,以及如何最好地解决这些问题的几个观点。

我鼓励您不要使用 p 值,因为它们可能会产生误导(12)。我的方法取决于您能够在一些干预之前和之后总结给定页面上的流量。您关心的是干预前后的费率差异。也就是说,每天的点击次数如何变化?下面,我用一些模拟的示例数据解释了第一个 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,以消除数据趋势。然后您可以执行上述程序并确信正百分比差异不是由于潜在趋势造成的。当然,趋势可能不是线性的,所以请谨慎使用!祝你好运!

回到我的数据分析师时代,这类问题非常典型。基本上,营销中的每个人都会想出一个疯狂的想法,即把销售给上级作为一个单一的事件,可以将 KPI 提高 2000%。上级会批准他们,然后他们将开始他们的“测试”。结果会回来,管理层会将其转交给数据分析师,以确定什么有效,谁做了。

简短的回答是,您无法真正知道它是否不是在类似时间段内作为随机 A/B 样式测试运行的。但我非常清楚这个答案有多么不足,特别是如果一个纯粹的答案不存在这一事实与未来业务决策的紧迫性无关。以下是我在这种情况下用来挽救分析的一些技术,请记住,这更像是一门艺术而不是一门科学。

把手

句柄是您可以保留的数据中存在的东西。从你告诉我的情况来看,你有很多关于营销机构是谁、他们何时尝试某种策略以及他们将其应用于哪个网站的信息。这些是您的起点,这样的信息将成为您分析的基石。

方法

该方法可能会对哪些机构获得任何和所有收益的信用产生最强烈的影响,因此您需要确保它的轮廓清晰,并且所有利益相关者都同意它是有意义的。如果你不能做到这一点,人们将很难相信你的分析。

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

比较

在理想情况下,您将有一个很好的 A/B 测试来证明确定的关系,我将假设您在这些方面不够用,但是,您可以从类似数据的简单比较中学到一些东西。当公司试图确定广播广告的效果时,他们通常会在同一市场上以抵消月份投放广告,或者在一个市场上投放几个月的广告,并将其与另一个但相似的市场中的结果进行比较。它不适合科学,但即使有这么多噪音,强大的结果几乎总是会引人注目。

在你的情况下,我会结合这些来确定一个事件需要多长时间来注册一个效果。一旦您获得了该时间段的数据,就可以根据您建模的流量预测、每周增长、每月每月等运行它。然后,可以在机构之间和跨时间段进行有意义的比较。

实用主义

愿望是能够提供对因果关系的深刻理解,但这可能是不现实的。由于外部因素使您的分析变得如此混乱,您经常会一遍又一遍地遇到这个问题:这个事件是否提高了销量/销售额/点击率,或者做任何事情都会产生相同的效果?我可以为此给出的最好建议是为您要衡量的内容设定非常现实的目标。一个好的起点是,在您所拥有的方法中,哪个事件的影响最大。一旦你从那里打开你的光圈。

概括

一旦你推理出所有这些方面,你就可以着手构建一个通用的解决方案,然后可以自动化。以这种方式设计您的解决方案的优势在于业务逻辑已经内置。这将使您的结果对非技术业务领导者来说更加平易近人和直观。

编辑:警告,我留下了我的信息,但我的回答似乎是错误的,请查看下面的评论!

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

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

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

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

这可以通过使用 p 值的假设检验来回答(科学家做什么来评估,例如药物是否会影响疾病)。

通过使用 p 值,您可以确定某一天的命中数是否只是随机的并且在正常情况下是可以接受的,或者它们必须对应于模型的变化。

您可以在Open Intro to Statistics Book中阅读更多关于 p 值的信息,我实际上已经从那里了解了它们。

然后,问题的其他部分是如何识别您的事件并计算必要的参数来回答您的问题(平均值/中值、方差等),以及如何保持最新和有效。

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

在这个GitHub 页面中,您可以找到详细的示例和其工作原理的描述。简而言之,

这个 R 包实现了一种方法来估计设计干预对时间序列的因果影响。例如,广告活动产生了多少额外的每日点击次数?当没有随机实验时,回答这样的问题可能会很困难。

你用事件前数据和事件后数据训练你的模型,你会得到一个像这样的图

在此处输入图像描述

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

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

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