构建有效的指标来描述用户

构建有效的指标来描述用户

原文:towardsdatascience.com/building-effective-metrics-to-describe-users-3212727c5a9e/

封面,图片由作者提供

封面,图片由作者提供

在几乎任何数字产品中,分析师常常面临构建数字客户档案的挑战——一组以某种方式描述客户状态和行为的参数。

这些指标有哪些潜在的应用?

  • 获取对用户行为的洞察

  • 在机器学习模型中作为特征利用

  • 制定个性化优惠的业务规则

一个简单的例子是电子商务,以下表列出了相关的指标。

图片由作者提供

图片由作者提供

这些指标无处不在,但它们有什么问题?它们没有考虑到特定用户的特定历史或这一特定指标的动态。对于用户 1 来说,花费$200 是否很多?这并不清楚。然而,这种区别显著影响了我们接下来做出的业务决策。

即使在单个用户的背景下,$200 对于业务来说可能根据用户与产品的生命周期阶段的不同而有不同的含义。用户在入职、选择活动和重新激活期间花费的$200 是不同的。

用户旅程,图片由作者提供

用户旅程,图片由作者提供

我们希望有一些标准化指标,以便能够在用户之间进行比较。类似于以下这样的:

图片由作者提供

图片由作者提供

那么,我们如何从客户行为的数值描述转移到更具有代表性的表示?例如,如何将“客户 7 天未进行交易”的事实转化为对这位特定客户来说这是否异常或典型的个性化评估?挑战在于在不失去可解释性的同时,保持业务相关性,并避免黑盒模型。

一种简单的方法是分析指标的分布,并确定观察当前结果(即计算 p-value)的概率。这有助于我们了解该值与用户历史相比有多极端。

正态分布,图片由作者提供

正态分布,图片由作者提供

但这里的挑战是什么?在大多数情况下,指标的分布不是正态的,这使得p-value的计算更加复杂。

随机指标可能具有与以下类似的分布:

PDF,图片由作者提供

PDF,图片由作者提供

我们可以应用一些小技巧,将概率密度函数转换为累积分布函数(CDF)。在这种情况下计算p-value要容易得多。

累积分布函数(CDF),图片由作者提供

累积分布函数(CDF),图片由作者提供

因此,我们只需要从用户的指标中重建 CDF,这可以通过使用样条函数高效完成。让我们创建一个玩具示例。


想象你是一个电子商务平台,旨在根据过去一周的用户活动来个性化你的电子邮件营销活动。如果一个用户的活动比之前几周少,你计划向他们发送折扣优惠。

你收集了用户统计数据,并注意到名为约翰的用户有以下情况:

  • 约翰 15 天前第一次访问了这个平台。

  • 在前 7 天(第 1 天至第 7 天),他访问了 9 次。

  • 在接下来的 7 天(第 2 天至第 8 天),他访问了 8 次。

  • 总共有 9 个值。

现在,你想评估最近值与之前值相比的极端程度。

import numpy as np
visits = np.array([9, 8, 6, 5, 8, 6, 8, 7])
num_visits_last_week = 6

让我们创建这些值的累积分布函数(CDF)。

import numpy as np
import matplotlib.pyplot as plt

values = np.array(sorted(set(visits)))
counts = np.array([data.count(x) for x in values])
probabilities = counts / counts.sum()
cdf = np.cumsum(probabilities)

plt.scatter(values, cdf, color='black', linewidth=10)

累积分布函数(CDF),图片由作者提供

累积分布函数(CDF),图片由作者提供

现在,我们需要根据这些值恢复函数。我们将使用样条插值。

from scipy.interpolate import make_interp_spline

x_new = np.linspace(values.min(), values.max(), 300)  
spline = make_interp_spline(values, cdf, k=3)         
cdf_smooth = spline(x_new)

plt.plot(x_new, cdf_smooth, label='Сплайн CDF', color='black', linewidth=4)
plt.scatter(values, cdf, color='black', linewidth=10)
plt.scatter(values[-2:], cdf[-2:], color='#f95d5f', linewidth=10, zorder=5)
plt.show()

使用样条插值的累积分布函数,图片由作者提供

累积分布函数(CDF),图片由作者提供

还不错。但我们观察到红色点之间有一个小问题——CDF 必须是单调递增的。让我们用分段三次 Hermite 插值多项式来解决这个问题。

from scipy.interpolate import PchipInterpolator

spline_monotonic = PchipInterpolator(values, cdf)
cdf_smooth = spline_monotonic(x_new)

plt.plot(x_new, cdf_smooth, color='black', linewidth=4)
plt.scatter(values, cdf, color='black', linewidth=10) 
plt.show()

使用分段三次 Hermite 插值的累积分布函数,图片由作者提供

累积分布函数(CDF)使用分段三次 Hermite 插值,图片由作者提供

好的,现在一切都完美了。

为了计算当前观察(上周 6 次访问)的 p 值,我们需要计算填充区域的面积。

临界区域,图片由作者提供

临界区域,图片由作者提供

为了做到这一点,让我们创建一个简单的函数_calculate_pvalue

def calculate_p_value(x):
    if x < values.min():
        return 0  
    elif x > values.max():
        return 1  
    else:
        return spline_monotonic(x)  

p_value = calculate_p_value(num_visits_last_week)
print(f"Probability of getting less than {num_visits_last_week} equals: {p_value}")

小于 6 的概率为:0.375

因此,概率相当高(例如,我们可以将其与阈值 0.1 进行比较),我们决定不向约翰发送折扣。我们需要为所有用户进行相同的计算。


结论

在这篇文章中,我们看到了如何将原始用户指标转换为个性化评估,从而可以做出更有效的商业决策。通过使用 CDF 和样条插值等统计方法,我们可以更好地理解用户行为背后的上下文,并提供基于数据的个性化、相关的优惠。

posted @ 2026-03-27 10:29  布客飞龙III  阅读(17)  评论(0)    收藏  举报