4. 基础数据探索:使用 SQL 统计整体数据分布

在构建阈值分层试验之前,必须对原始数据集进行全面的数据探索。本章将使用 SQL 聚合函数与窗口函数,从集中趋势、离散程度、极值范围和百分位分布四个维度,对用户指标(如“近30日消费金额”)进行整体画像。

4.1 核心统计指标概览

以下表格列出了数据探索阶段最常用的 SQL 统计函数及其业务含义:

统计维度 SQL 函数 业务解读
计数 COUNT(*) 总用户数 / 非空记录数
均值 AVG(amount) 用户平均消费水平
标准差 STDDEV(amount) 消费金额的波动程度
最小值 MIN(amount) 最低消费门槛
最大值 MAX(amount) 最高消费上限
中位数 PERCENTILE_CONT(0.5) 50% 分位点,代表典型用户
提示:标准差越大,说明用户消费行为越分散,分层时需要考虑更细的阈值区间;标准差较小则适合使用等宽或等深分层。

4.2 基础聚合查询

以下 SQL 一次性输出整体数据的核心统计量:

SELECT
    COUNT(*)                                         AS total_users,
    AVG(amount)                                      AS avg_amount,
    STDDEV(amount)                                   AS stddev_amount,
    MIN(amount)                                      AS min_amount,
    MAX(amount)                                      AS max_amount
FROM user_behavior;

该查询返回一行记录,快速呈现数据全貌。例如:总用户数 100,000,平均消费 1,250 元,标准差 680 元,最小 0 元,最大 9,800 元。

4.3 百分位分布分析

仅靠均值与极值容易忽略数据偏态。百分位分析能揭示数据在不同区间的分布密度,是阈值分层的重要依据。

使用 PERCENTILE_CONT 计算连续百分位点(支持小数位):

SELECT
    PERCENTILE_CONT(0.10) WITHIN GROUP (ORDER BY amount)  AS p10,
    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY amount)  AS p25,
    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount)  AS p50,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY amount)  AS p75,
    PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY amount)  AS p90
FROM user_behavior;
关键发现:若 p50(中位数)远小于均值,说明数据呈右偏分布,即少数高消费用户拉高了整体均值。此时分层应重点关注头部用户。

4.4 数据分布可视化:SQL 统计结果映射

下图展示了基于 SQL 统计结果绘制的数据分布特征,帮助理解集中趋势与离散程度的关系:

数据分布特征图(基于 SQL 统计结果) 均值线 (AVG) ±1 标准差区间 覆盖约 68% 数据 中位数 (P50) P25 P75 MIN MAX 当均值 > 中位数时,数据右偏,需关注高消费长尾用户

4.5 综合统计脚本

将基础聚合与百分位分析合并,输出一份完整的数据分布报告:

WITH stats AS (
    SELECT
        COUNT(*)                                         AS total_users,
        AVG(amount)                                      AS avg_amount,
        STDDEV(amount)                                   AS stddev_amount,
        MIN(amount)                                      AS min_amount,
        MAX(amount)                                      AS max_amount,
        PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY amount)  AS p25,
        PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount)  AS p50,
        PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY amount)  AS p75
    FROM user_behavior
)
SELECT
    total_users,
    ROUND(avg_amount, 2)          AS avg_amount,
    ROUND(stddev_amount, 2)       AS stddev_amount,
    min_amount,
    max_amount,
    ROUND(p25, 2)                 AS p25,
    ROUND(p50, 2)                 AS p50,
    ROUND(p75, 2)                 AS p75,
    ROUND((max_amount - min_amount), 2) AS range_span,
    ROUND((p75 - p25), 2)               AS iqr
FROM stats;
注意:当数据量极大(如千万级)时,PERCENTILE_CONT 可能消耗较多资源。可考虑先对 amount 字段建立索引,或使用近似百分位函数 APPROX_PERCENTILE(视数据库引擎而定)提升性能。

4.6 统计结果对分层策略的指导

基于上述 SQL 输出,可以快速制定分层策略:

  • 若标准差较小且中位数接近均值:数据分布均匀,适合等宽分层(如每 500 元一层)。
  • 若标准差较大且均值远大于中位数:数据右偏严重,应使用等深分层(按用户数均分)或对数变换后分层。
  • 若 P25 与 P75 区间狭窄:大部分用户集中在中段,阈值设计应在此区间加密。