数据圈里聊“大数据杀熟”,十个有九个先想到的是自己下单时那个诡异的价格。做数据治理和合规审计这几年,我接过不止一次这种项目:企业被用户投诉“老用户价格反而更高”,公关说要平息舆情,法务说要准备材料,最后问题都堆到数据团队这边——能不能从数据里把这个事情查清楚、说清楚、修干净。这篇是“大数据杀熟”系列的第三篇,前两篇聊过现象和算法原理,这篇专门讲违法违规的边界,以及审计专用视角下怎么查、怎么补。
这篇文章适合三类人:一是被安排做合规自检的数据负责人,二是做财务审计但需要理解算法审计逻辑的审计师,三是准备数据科学、大数据方向面试时想把真实业务场景讲明白的候选人。内容不会太学术,但会把审计流、数据流和风险流串起来,尽量给可直接落地的思路和工具。
1. 先看清杀熟到底是怎么“算”出来的
审计永远先于结论。很多人一听到“大数据杀熟”,第一反应是找几条价格对比截图,然后去骂算法。但真正要定位问题,得先把“价格是怎么被算出来”的链路还原清楚。不还原链路,后面所有审计动作都是抓瞎。
1.1 杀熟不是新业务,而是精准运营的副产物
杀熟这个概念本身不新。过去线下零售里就有价格歧视:学生票是半价,早鸟票是折扣价,老客户办会员卡享受专属价。这些都是典型的差异化定价,大家习以为常,因为规则透明,而且对象的划分标准是公开的。
大数据杀熟和老式价格歧视的区别,不在于“不公平”的程度,而在于三个技术特征:
- 定价粒度精细到个人,不再按群体统一打折。
- 定价策略实时变化,同一商品半小时前和半小时后价格可能不同。
- 定价逻辑完全黑箱,用户在页面上看不到规则,甚至无从举证。
从业务角度讲,平台并不是每条业务线都主动想“杀熟”。很多价格异常是精准运营的副产物:为了做用户增长,给新客发大额券;为了清库存,老用户看到的价格反而高了;为了测试价格弹性,用AB实验把同一商品分成多组出价。问题在于,这些动作一旦基于用户身份、消费历史、设备型号等个人特征做差异定价,又没有合理理由时,就从“精细化运营”滑向了“杀熟”争议。
1.2 从埋点到动态定价的完整链路
要审计价格系统,至少得先画出一张完整的数据链路图。我一般把定价链路分成六层:
- 数据采集层:前端埋点、服务端日志、订单系统记录。埋点字段包括浏览、点击、加入购物车、支付成功、退款等行为。
- 用户画像层:基于行为数据和第三方数据给用户打标签,常见标签有消费能力、价格敏感度、忠诚度、流失风险。
- 特征计算层:把原始标签加工成可直接用于模型的特征,比如近30天平均客单价、优惠券使用率、竞品打开频率等。
- 定价策略层:规则引擎里配置各种折扣、满减、会员价、新客券、阶梯定价。
- 模型决策层:如果接入了动态定价模型,会结合库存、流量、供需、用户特征算出最终展示价。
- 结果输出层:APP、H5、小程序展示价格,记录页面曝光和成交。
审计时每一层都要看。只看订单表,只能知道“价格不一样”,但无法判断差异来自画像、规则还是模型。真正要查清楚,需要把每一层的输入输出对齐。
这里有一个关键点:动态定价本身不等于杀熟。机票、酒店、网约车都会基于供需动态调价,这种差异有合理性。但动态定价如果基于“你是谁”,而不是“当下交易条件有什么不同”,性质就变了。审计人员要抓的核心,是定价特征里是否混入了用户专属标签。
2. 为什么它必然踩红线:违法违规的逻辑
谈违法违规,不是要去背法条,而是要理解监管和消费者保护逻辑里面的“底线”。审计人员最需要判断的问题是:一个价格差异行为,到底有没有合理商业解释。没有合理解释,哪怕技术上再精巧,合规风险也是实实在在的。
2.1 同等交易条件下的差别待遇
几乎所有杀熟争议,最后都会落回一个词:同等交易条件。
什么叫同等交易条件?商品一样、库存一样、支付方式一样、售后服务一样、发货时段一样,用户和平台之间唯一的差异只是账号身份或历史行为。在这种情况下,老用户看到一个更高的价格,就是典型的差别待遇。
举一个审计中常见的例子:
- 用户A是注册3年的老用户,会员等级Lv5,近半年客单价600元。
- 用户B是新注册用户,首次下单。
- 两人同时进入同一个商品详情页,购买同一SKU。
- A看到的实付价为129元,B看到的实付价为99元。
表面上看,B便宜是因为平台发放了新客立减券,属于合法的拉新促销。但如果这张券只有新用户能领,而且新用户和老用户购买的是完全相同的商品组合,那价格差异就建立在“用户身份”上。从公平交易权的角度看,老用户受到了不合理区别对待。
审计时要把握一个判断顺序:
- 先问价格差异的直接原因是什么:优惠券?折扣?动态模型?
- 再问这个原因是否对所有用户一视同仁:同一条件下是否都能触发?
- 最后问这个差异是否有商业合理性:是为了拉新、清库存,还是纯粹为了在老用户身上多赚差价?
审计报告里不需要直接给法律定性,但需要把这些事实摆出来,让法务和决策层自己判断风险。
2.2 算法黑箱与数据合规风险
算法黑箱本身不是问题,但算法介入交易定价后,就涉及用户权益。过度依赖黑箱模型,不给用户提供解释渠道,会成为合规审计里很难交代的事情。
这里要特别提一下个人信息与画像数据的使用。价格敏感度、消费能力这类标签,属于用户画像里的敏感推断信息。如果平台拿这些标签去做交易定价,必须回答三个问题:
- 是否有明确合法的业务目的?
- 是否向用户履行了充分告知义务?
- 是否有合理的退出或申诉机制?
很多企业在这三个问题上都是缺失的。我见过一些系统,埋点时会采集用户手机品牌、机型、操作系统版本,然后把这些设备和价格数据一起丢进定价模型。如果用iPhone的用户和用Android的用户在同一商品上看到的价格有系统性差异,那这案子就不是简单的“运营设置失误”能解释的了。
2.3 一旦被坐实,影响范围远不止一笔退款
很多人以为杀熟被曝光后,补个差价、道个歉就完了。真实影响要大得多。
- 行政监管层面:可能被认定为不公平价格行为,要求整改并接受罚款。
- 用户信任层面:一次杀熟的热搜,足以让多年积累的品牌信任受损,复购率断崖式下跌。
- 行业层面:同一赛道其他平台也会被连带审视,监管会要求平台提交算法备案和定价说明。
- 数据体系层面:一旦进入正式审计流程,所有数据系统都要接受穿透式检查,包括埋点日志、画像标签、模型版本、规则配置,历史系统里的脏数据都会被翻出来。
所以审计人员做这类项目时,一定要带着“系统体检”的心态,而不是只对付眼前一个投诉。查杀熟,本质上是在查整个定价决策体系的健康度。
3. 审计专用:怎么查一套定价系统有没有“杀熟”
前面聊了原理和风险,这一节上干货。先说清楚,这里的方法主要用于内部审计、合规自检和用户投诉溯源,不适合用来直接判断单个用户个案是否遭遇杀熟,因为个人感受和统计规律之间存在差距。
3.1 审计准备:先拿到这六类数据
开工前,我会先列出数据清单。缺了哪一类,后面分析都会卡壳。
| 序号 | 数据表 | 关键字段 | 审计用途 |
|---|---|---|---|
| 1 | 订单明细表 | order_id, user_id, sku_id, pay_price, payment_time, coupon_id | 还原最终成交价和实付价 |
| 2 | 商品信息表 | sku_id, cost, category, listing_time, status | 判断成本变化与价格变化是否匹配 |
| 3 | 用户信息表 | user_id, register_time, member_level, device_id, region | 区分新老用户、会员等级、渠道来源 |
| 4 | 营销规则表 | rule_id, rule_type, user_group, discount, start_time, end_time | 找到价格差异的直接原因 |
| 5 | 流量行为日志 | user_id, sku_id, view_time, price_showed, action | 还原用户看到的价格,而不是实付价 |
| 6 | 模型版本表 | model_id, feature_list, version, deploy_time | 复现模型上线时点的定价逻辑 |
这里有个常见误区:只看订单实付价,不看用户页面看到的展示价。杀熟争议里用户感知到的价格,往往是详情页展示价,这个价格和最终实付价可能差着一张优惠券。所以行为日志里的price_showed字段非常关键,一定要保证它的完整性和准确性。
拿到数据后,按以下步骤做清洗:
- 统一时间格式,建议全部转为UTC或东八区标准时间,避免时区错位。
- 去重,同一个order_id只保留最新状态,退款订单单独标记。
- 把user_id和device_id做关联,注意一个人可能有多台设备、多个账号。
- 剔除内部测试账号,这类账号会严重干扰统计。
3.2 特征识别:四张图看清价格歧视
清洗完数据,我会快速构造四组分析,每一组都对应一种识别思路。
第一组:同品同时段的新老用户价格对比。
select sku_id, user_group, date_trunc('hour', payment_time) as pay_hour, avg(pay_price) as avg_price, count(1) as order_cnt from order_detail where sku_id = '实际商品ID' group by sku_id, user_group, date_trunc('hour', payment_time) having count(1) >= 10 order by pay_hour, user_group;如果new_user组购价稳定低于old_user组,且价格差超过正常优惠券面额,就需要进一步核查。
第二组:同一用户在同一商品上的历史价格波动。
把用户的每一笔成交价和商品的基准价做差,看价差是否随着用户复购次数增加而逐步走高。老用户复购越多,看到的“优惠”越少,这是典型的杀熟信号。
第三组:成本价与成交价的关系。
商品成本没有变化,但老用户成交价持续高于新用户,说明价格差异不是由成本驱动的,而是由用户特征驱动的。这时候基本可以锁定定价模型里存在用户标签参与决策。
第四组:同一用户在不同设备或账号上的比价。
用一个老账号和一个小号,同时查看同一个低价商品,如果老账号价格更高,优先检查设备指纹和账号等级变量是否进入了定价引擎。这个测试在APP端最能说明问题,因为页面代码完全相同,差异只能来自后端服务。
3.3 模型验证:反推定价黑盒
规则引擎导致的杀熟相对好查,查配置表就能看到。但如果是模型导致的杀熟,就不是看几个SQL能解决的了,得做“黑盒反推”。
思路是把价格当成因变量,把会用到的特征当成自变量,构建一个解释模型,比如逻辑回归或梯度提升树。重点不是追求预测精度,而是看哪些特征的贡献度最大。
实际操作时,我用过一套简化流程:
- 从订单表里取样本,每个用户保留最近一笔订单。
- 构造特征:用户注册时长、会员等级、近30天成交金额、优惠券使用率、设备价格指数、所在城市等级。
- 目标变量:成交价与商品成本价的比值。
- 训练模型后,查看特征重要性排序。
如果“会员等级”和“用户注册时长”的重要性显著高于“城市等级”和“库存状况”,那模型行为就和差异化定价高度相关。这时候不能直接下结论说违法,但要立刻做成专项问题,让算法团队提供模型设计文档和特征审批流程。
这里有个很重要的审计原则:统计关联不等于业务意图。模型里出现用户特征,不一定代表产品经理想杀熟,有时是特征工程没做干净,把用户ID泄漏到模型里了。但只要出了结果,责任就先在系统侧,不在解释侧。
4. 从数据治理层面把“杀熟”的口子堵上
查出来问题只是起点,真正有价值的是把问题修掉,并且让同类问题不再复发。这部分做的事情,就是数据治理。
4.1 数据治理战略的交付成果不是一堆PPT
一说数据治理,很多企业想到的是建元数据中心、做数据标准、画血缘图。这些都没错,但审计场景里的治理交付物,应该更实在。
我在做这类合规审计项目时,会要求交付以下成果:
| 交付物 | 说明 | 审计价值 |
|---|---|---|
| 定价数据字典 | 所有价格相关字段的定义、来源、口径、负责人 | 让价格数据可追溯 |
| 数据血缘图谱 | 从埋点到画像到定价引擎的字段流向 | 快速定位自定义变量来源 |
| 规则配置版本记录 | 每条营销规则的上线时间、生效范围、发券人群 | 复现历史价格差异原因 |
| 模型特征白名单 | 允许进入定价模型的特征清单 | 防止敏感标签混入 |
| 审计日志 | 用户ID、SKU、展示价、实付价、规则版本、模型版本、时间戳 | 事后完整还原定价结果 |
这些交付物说起来不算复杂,但在很多企业里根本拿不出来。原因不是技术做不到,而是业务和数据团队之间没有建立“价格决策留痕”的意识。
产品经理改了个优惠行为,数据团队不知道;算法工程师更新了特征列表,运营文档没同步。等审计要数据的时候,只能去翻历史快照,运气好能拼出个七八成。数据治理做得好,能让这种“事后拼图”变成“事发留痕”。
4.2 落地动作:给数据处理团队的六条整改建议
查完杀熟问题后,我会给技术团队写一份整改清单,内容基本稳定,可以抄作业:
- 所有定价规则统一收敛到配置中心,禁止在业务代码里硬编码价格。
- 用户画像标签分级,价格敏感度、消费能力、流失概率等标签不允许直接流入交易定价引擎。如果业务确实需要,必须经过合规评审。
- 每次展示价格都写一条价格快照,至少包含user_id、sku_id、请求时间、展示价、使用规则ID、模型版本号。
- 建立模型上线审批流程,特征列表变更必须经过审计侧备案。
- 新用户优惠和老用户优惠拆分成独立规则,避免因为渠道标识混乱导致老用户被误伤。
- 设置价格异常监控,比如同SKU在同一天的价格方差超过某个阈值就报警。
第6条特别值得展开。价格方差报警不是新鲜事,但大多数企业设的是“成本毛利”监控,或者“竞品价格”监控,很少有企业去监控“同SKU对不同用户展示价之间的差异”。真正的价格公平性监控,应该以“区间差异倍数”为指标。
比如设定规则:同一时间窗口内,同一SKU对不同用户的展示价差异超过30%即触发告警。30%是一个经验值,具体阈值可以根据业务毛利情况调整。监控看板上除了差异倍数,还要定位这个差异来自哪个用户分组,是会员折扣、新客券,还是模型输出。
4.3 数据治理项目或系统该有的功能
最近很多人问“以Excel模板导入的数据治理项目或系统应该拥有哪些功能”,这个和审计场景很贴近。如果一个数据治理系统要服务于价格合规审计,它至少要包含六个模块:
| 模块 | 功能 | 审计场景价值 |
|---|---|---|
| 数据接入 | 支持Excel、CSV、API方式导入订单、规则、日志数据 | 快速接收业务方导出的审计数据 |
| 数据质检 | 必填校验、格式校验、范围校验、重复值检查 | 防止脏数据干扰审计结果 |
| 数据标准化 | 统一用户ID、时间格式、商品编码 | 跨系统关联不同数据表 |
| 标签管理 | 记录用户分层规则和标签来源 | 追踪画像标签的使用范围 |
| 规则配置 | 维护优惠券、满减、折扣等规则 | 复现某次交易的价格计算过程 |
| 审计追溯 | 记录每次数据修改和查询动作 | 确保审计数据本身不被篡改 |
Excel模板导入这个功能听着普通,实际非常关键。企业内部业务团队很多人不会写SQL,给一个标准Excel模板,让他们按照模板填写订单数据、规则数据,再由系统自动完成导入、校验、落库,能省掉大量人工沟通时间。审计场景下,数据越早进入系统,越能减少后续扯皮。
5. 常见问题和排查技巧实录
做这类项目,踩坑几乎是必然的。我把这几年遇到的高频问题和排查经验整理一下,给同行做个参考。
5.1 审计时容易踩的坑
第一个坑:把正常促销误判成杀熟。新用户立减券、会员折扣、城市专属活动,都会导致价格差异。这类差异有明确业务理由,不能直接定性为违法违规。审计时要把这些因素先排除,再缩小范围。
第二个坑:只看实付价,忽略展示价。有些平台在详情页显示一个高价,结账时通过优惠券把价格降下来,用户感知上的“被杀熟”其实来自展示价。审计如果把实付价当成唯一依据,会漏掉大部分投诉场景。
第三个坑:用户ID口径不一致。同一个用户在小程序里有一个ID,在APP里又有一个ID,后台还有业务系统ID。不打通这些ID,新老用户对比就是错的。实务中我一般用手机号脱敏后的MD5值作为统一用户标识,尽量保证多端关联。
第四个坑:模型版本无法复现。定价模型迭代很快,审计时拿到的数据是当期数据,但审计人员手里的模型版本可能已经过期。没有模型版本记录,所有反推都失去锚点。所以每次模型上线都要登记版本号,而且要把特征快照存下来。
第五个坑:时间粒度不对。价格差异在小时级别可能波动很大,在日期级别就可能被均摊掉。建议按小时甚至分钟做聚合,不要只按天分析。
5.2 实战排查技巧
技巧一:用投诉文本做“大数据侦察”。用户投诉信息是最好的线索源。把过去三个月的投诉文本做关键词抽取,重点搜索“同商品价比别人贵”“价格变了”“会员价反而高”等表述,可以快速定位出嫌疑SKU,再顺着SKU去查价格链路,比漫无目的地全量分析高效得多。
技巧二:新增一个“展示价差异大屏”。数据大屏不要只展示销售额指标,建议单独建一块“定价合规监控大屏”,把同日同时段同SKU的用户间价差、新老用户价差均值、规则命中比例放到一块,数字异常一眼能看出来。大屏的受众是业务和管理层,不需要放太多技术参数,放毛利率偏差、价差倍数、异常SKU数量就够。
技巧三:双账号对照测试要固定变量。用两个手机、两个账号做对照测试时,时间、网络、商品、页面入口必须一致。最好的办法是两台手机并排操作,同一时间点进页面,截图留证。注意先清理缓存,避免历史行为影响测试结果。
技巧四:优先查退款率和价格投诉关联度高的SKU。价格问题通常集中在一小批高毛利商品上,这些商品价格动因复杂,容易出纠纷。把退款率TOP20的商品拉出来,再和价格方差做交叉分析,能快速缩小审计范围。
技巧五:审计结论要写“证据充分性”而不是“绝对定性”。数据分析只能说明“存在价格差异,且差异与用户特征相关”,不能直接说“平台杀熟”。报告中要把证据链列清楚:数据来源、规则版本、样本量、排除项、统计方法、置信度、模型输出。这种表述在内部推动整改时更有说服力。
最后再分享一个我个人的习惯:做价格合规审计之前,一定先手绘一张业务流程图,把用户从进入页面到支付完成每一步涉及的系统、规则、团队全部标出来。这张图可能歪歪扭扭,但比任何抽象的数据血缘工具都直观。现实里我遇到的大部分杀熟争议,最终都能在对流程图的追问中找到入口:这个环节为什么需要读取用户的消费能力标签?这个规则为什么没有配置结束时间?这个模型为什么用设备价格指数当特征?
只要每一个数据使用动作都能对着流程图回答出“为什么”,大数据杀熟这类风险就会从源头大幅收敛。技术手段只是辅助,真正的防线,是让数据从采集到决策的每一站都经得起审计。