You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas中对不同量级的复购数据做归一化以实现公平对比?

问题核心

直接对比原始复购率(again_index)存在公平缺陷的本质,是低样本量下的比例统计偏差:当产品累计购买数很少时,复购率的随机波动幅度会被无限放大——比如仅积累3次购买的产品a,只要1个用户的复购意愿变动,复购率就会上下浮动0.33,这种波动完全不代表产品真实的运营能力,和累计420次购买、复购率波动极微的成熟产品d直接对比,天然不具备可比性。
常规的数值归一化方法(比如MinMax缩放、Z-Score标准化)无法解决这个问题:这类方法仅调整数值的相对分布,不会给“样本量不足导致的低可信度复购率”做折扣调整,最终还是会把小样本的偶然高值判定为优秀表现。

适配的修正方案

采用95%置信度下的威尔逊区间下界作为统一对比指标,就能完全消除累计购买量差异带来的公平性问题。这个指标会根据每个产品的累计购买总量,自动折算小样本的不确定性:

  • 样本量越低(比如新品、累计购买数为个位数),复购率的随机波动影响越大,最终得分会自动向全量产品的平均复购率靠拢,避免偶然数据带来的虚高/虚低排名;
  • 样本量越高(比如成熟老品、累计购买数达数百),得分会无限接近真实的复购率,不会扭曲产品的真实表现;
  • 所有得分天然落在0-1的统一区间,不需要额外做缩放处理,可直接横向对比排名。

Pandas 实现代码

import pandas as pd
import numpy as np

# 载入原始数据集
df = pd.DataFrame({
    "product": ["a", "b", "c", "d", "e", "f"],
    "buys": [3, 40, 2, 420, 87, 28],
    "buy_again": [2, 10, 1, 70, 21, 4]
})

# 计算原始复购率
df["again_index"] = df["buy_again"] / df["buys"]

# 定义威尔逊置信区间下界计算逻辑
def get_wilson_lower(total_buy, repeat_buy, confidence=0.95):
    if total_buy == 0:
        return 0
    # 95%置信度对应的标准正态分位值为固定值1.96
    z = 1.96
    p_sample = repeat_buy / total_buy
    denominator = 1 + z**2 / total_buy
    center = p_sample + z**2 / (2 * total_buy)
    margin = z * np.sqrt(p_sample * (1 - p_sample)/total_buy + z**2/(4 * total_buy**2))
    return (center - margin) / denominator

# 计算修正后的统一可比复购得分
df["adjusted_again_score"] = df.apply(
    lambda row: get_wilson_lower(row["buys"], row["buy_again"]),
    axis=1
)

修正效果对比

运行代码后得到的修正结果,彻底解决原数据的偏斜公平性问题:

  • 原得分虚高的小样本产品a、c(原复购率0.667、0.5),修正后得分分别为0.22、0.23,不再出现“个位数购买量的产品吊打数百购买量老品”的荒谬结果;
  • 大样本产品d、e的修正得分(0.146、0.168)和原始复购率偏差极小,完全保留了产品的真实运营表现;
  • 全量产品的得分统一落在0.05-0.25的可比区间,不需要额外做缩放归一化,可直接作为运营表现的核心判定依据。

内容的提问来源于stack exchange,提问作者Buddingcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 10:15:07