Spark SQL练习2-电商用户行为分析

0 阅读30分钟

背景

随着**商城电商平台业务的持续扩张,用户行为数据呈现出更加复杂和多样化的特征。在已完成基础购买行为分析的基础上,平台需要进一步挖掘用户行为背后的深层规律,包括用户活跃度变化趋势、商品关联购买模式、高价值用户识别以及流失风险预警等。这些深度分析将为精细化运营、个性化推荐和风险管控提供强有力的数据支撑。

题目

**商城电商平台需要基于历史用户行为数据,进行更深层次的用户行为洞察:

  1. 计算用户活跃度趋势指标
  2. 构建用户价值分层模型
  3. 分析用户流失风险特征

数据模型设计

用户信息表 (dim_users)

字段名类型说明
user_idBIGINT用户唯一标识ID
user_nameSTRING用户昵称
register_dateDATE用户注册日期
citySTRING用户常驻城市
membership_levelSTRING会员等级:普通/白银/黄金/钻石
is_vipBOOLEAN是否VIP用户

订单事实表 (fact_orders)

字段名类型说明
order_idBIGINT订单唯一标识ID
user_idBIGINT用户ID,关联dim_users表
order_dateDATE订单创建日期
order_timeTIMESTAMP订单创建时间戳
total_amountDOUBLE订单实付金额
discount_amountDOUBLE优惠折扣金额
statusSTRING订单状态:paid/refunded/cancelled
payment_methodSTRING支付方式:alipay/wechat/credit/card
channelSTRING下单渠道:app/web/miniprogram

订单明细表 (fact_order_items)

字段名类型说明
order_idBIGINT订单ID,关联fact_orders表
product_idBIGINT商品唯一标识ID
product_nameSTRING商品名称
categorySTRING商品一级类目
sub_categorySTRING商品二级类目
quantityINT购买数量
unit_priceDOUBLE商品单价
item_amountDOUBLE商品小计金额

用户行为日志表 (fact_user_behavior)

字段名类型说明
user_idBIGINT用户ID
behavior_dateDATE行为发生日期
behavior_timeTIMESTAMP行为发生时间戳
behavior_typeSTRING行为类型:view/cart/favorite/buy
product_idBIGINT商品ID
categorySTRING商品一级类目
duration_secondsINT停留时长(秒),仅view行为有值
device_typeSTRING设备类型:mobile/pc/tablet
page_sourceSTRING来源页面:home/search/recommend/detail

统计需求

  1. 计算用户活跃度趋势指标(以2026-02-19为基准)
  • 统计最近30天内每个用户的活跃天数
  • 计算用户最近7天与之前23天的活跃天数比值(活跃度变化率)
  • 别活跃用户(最近7天活跃天数≥4天)、普通用户(最近7天活跃天数>=0 AND < 4)、沉默用户(最近7天无活跃但之前23天有活跃)、流失用户(最近30天无活跃)

查询结果按活跃天数降序排序,相等则按用户id升序

SELECT
    t.user_id                       AS user_id
  , u.user_name                     AS user_name
  , COUNT(DISTINCT t.behavior_date) AS active_days
  , ROUND(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                            t.behavior_date, NULL)) / COUNT(DISTINCT IF(
        t.behavior_date < DATE_SUB('2026-02-19', 7), t.behavior_date, NULL)) *
          100, 2)                   AS active_days_change_rate
  , CASE
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) >= 4 THEN '活跃用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) BETWEEN 0 AND 3
            THEN '普通用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) = 0 AND
             COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) > 0 THEN '沉默用户'
        WHEN COUNT(DISTINCT t.behavior_date) = 0 THEN '流失用户'
        END                         AS user_type
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 30)
GROUP BY
    t.user_id, u.user_name
ORDER BY
    active_days DESC, user_id
LIMIT 10
;

预期输出:


  1. 构建用户价值分层模型(以2026-02-19为基准)
  • 基于RFM模型计算每个用户的价值得分:
    • R(Recency):最近一次购买距离当前的天数,分值1-5分(越近分数越高)
      • 5分:天数最小的前 20% 用户(最近刚买过)
      • 4分:天数在 20%-40% 之间的用户
      • 3分:天数在 40%-60% 之间的用户
      • 2分:天数在 60%-80% 之间的用户
      • 1分:天数最大的后 20% 用户(很久没买了)
    • F(Frequency):购买频次,分值1-5分(越高分数越高)
      • 5分:频次最高的前 20% 用户
      • 4分:频次在 20%-40% 之间的用户
      • 3分:频次在 40%-60% 之间的用户
      • 2分:频次在 60%-80% 之间的用户
      • 1分:频次最低的后 20% 用户
    • M(Monetary):消费总金额,分值1-5分(越高分数越高)
      • 5分:金额最高的前 20% 用户
      • 4分:金额在 20%-40% 之间的用户
      • 3分:金额在 40%-60% 之间的用户
      • 2分:金额在 60%-80% 之间的用户
      • 1分:金额最低的后 20% 用户
    • 综合得分 = R * 0.3 + F * 0.3 + M * 0.4
    • 根据综合得分将用户分为:高价值用户(前20%)、潜力用户(20%-50%)、一般用户(50%-80%)、低价值用户(后20%)

查询结果按综合得分降序排序,相等则按用户id升序,分值保留两位小数

WITH tab AS
(
SELECT
    t.user_id                                 AS user_id
  , u.user_name                               AS user_name
  , DATEDIFF('2025-02-19', MAX(t.order_date)) AS date_diff
  , COUNT(DISTINCT t.order_id)                AS order_cnt
  , SUM(i.item_amount)                        AS item_amt
FROM
    dataspire_catalog.db_dev.fact_orders t
    LEFT JOIN dataspire_catalog.db_dev.fact_order_items i
              ON t.order_id = i.order_id
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.status = 'paid'
GROUP BY
    t.user_id, u.user_name
),
tab1 AS
(
SELECT
    tab.user_id   AS user_id
  , tab.user_name AS user_name
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.2 AND 0.4 THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.4 AND 0.6 THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.6 AND 0.8 THEN 2
        ELSE 1
        END       AS date_diff_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS order_cnt_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS item_amt_rank
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                       AS user_id
  , tab1.user_name                     AS user_name
  , ROUND(tab1.date_diff_rank * 0.3 + tab1.order_cnt_rank * 0.3 +
          tab1.item_amt_rank * 0.4, 2) AS final_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank * 0.4 DESC) <= 0.2
            THEN '高价值用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.2 AND 0.5
            THEN '潜力用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.5 AND 0.8
            THEN '一般用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.8 AND 1
            THEN '低价值用户'
        ELSE '低价值用户'
        END
FROM
    tab1
WHERE
    1 = 1
ORDER BY
    final_rank DESC, tab1.user_id
;

预期输出:


  1. 分析用户流失风险特征
  • 识别有流失风险的用户
    • 我们需要对比两个时间段:
      • 基准期:例如 31-60 天前(用来定义用户的“正常活跃度”)。
      • 观察期:最近 30 天(用来定义用户的“当前活跃度”)。
      • 筛选条件:
        • 在 fact_user_behavior 表中发生任意行为(behavior_type IN ('view', 'cart', 'favorite', 'buy'))的天数。
        • 条件:观察期活跃天数 < 基准期活跃天数 * 0.5且最近30天无购买行为
  • 分析流失风险用户的行为特征:
    • 平均浏览时长变化率: (基准期平均每日浏览时长 - 观察期平均每日浏览时长) / 基准期平均每日浏览时长。
    • 主要浏览品类:统计观察期内用户浏览次数最多的 category(一级类目)。

查询结果平均浏览时长变化率降序排序

WITH tab AS
(
SELECT
    t.user_id                        AS user_id -- 用户id
  , u.user_name                      AS user_name -- 用户名
  , t.category                       AS category -- 商品一级类目
  , IF(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date >= DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
  , IF(COUNT(DISTINCT IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date < DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
  , COUNT(1)                         AS view_cnt -- 浏览次数
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 60)
GROUP BY
    t.user_id, u.user_name, t.category
HAVING
    -- 观察期活跃天数 < 基准期活跃天数 * 0.5
    IF(COUNT(DISTINCT IF(
            t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
            t.behavior_date >= DATE_SUB('2026-02-19', 30), t.behavior_date,
            NULL))
           < COUNT(DISTINCT IF(
                t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
                t.behavior_date < DATE_SUB('2026-02-19', 30), t.behavior_date,
                NULL)) * 0.5, 1, 0) = 1
),
tab1 AS
(
SELECT
     tab.user_id                AS user_id -- 用户id
   , tab.user_name              AS user_name -- 用户名
   , tab.category               AS category -- 商品一级类目
   , ROW_NUMBER() OVER (PARTITION BY tab.user_id
        ORDER BY view_cnt DESC) AS order_rank -- 排序
   , tab.avg_dur_seconds_obs    AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
   , tab.avg_dur_seconds_bench  AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                               AS user_id -- 用户id
  , tab1.user_name                             AS user_name -- 用户名
  , tab1.category                              AS category -- 用户浏览次数最多的 category
  , ROUND((tab1.avg_dur_seconds_bench - tab1.avg_dur_seconds_obs) /
          tab1.avg_dur_seconds_bench * 100,
          2)                                   AS avg_dur_seconds_diff -- 平均浏览时长变化率
FROM
    tab1
        -- 过滤掉最近30天内有消费的用户
    INNER JOIN (SELECT DISTINCT
                    t.user_id AS user_id
                FROM
                    dataspire_catalog.db_dev.fact_orders t
                WHERE
                    1 = 1 AND t.order_date < DATE_SUB('2026-02-19', 30)) o
               ON tab1.user_id = o.user_id
WHERE
    -- 取浏览次数最多的一级类目
    1 = 1 AND tab1.order_rank = 1
ORDER BY
    avg_dur_seconds_diff DESC, user_id
LIMIT 10
;

预期输出:


DDL

DROP TABLE IF EXISTS dataspire_catalog.db_dev.fact_user_behavior PURGE;
CREATE TABLE IF NOT EXISTS dataspire_catalog.db_dev.fact_user_behavior
(
    user_id          STRING COMMENT '用户ID',
    behavior_date    STRING COMMENT '行为发生日期',
    behavior_time    STRING COMMENT '行为发生时间戳',
    behavior_type    STRING COMMENT '行为类型:view/cart/favorite/buy',
    product_id       STRING COMMENT '商品ID',
    category         STRING COMMENT '商品一级类目',
    duration_seconds STRING COMMENT '停留时长(秒),仅view行为有值',
    device_type      STRING COMMENT '设备类型:mobile/pc/tablet',
    page_source      STRING COMMENT '来源页面:home/search/recommend/detail'
)
USING iceberg
TBLPROPERTIES (
    'comment' = '用户行为日志表'
)
;

-- ==================== 插入用户行为数据 ====================
INSERT INTO dataspire_catalog.db_dev.fact_user_behavior VALUES
-- ========== 用户10001(活跃用户 - 最近30天有多次活跃)==========
(10001, '2026-02-18', '2026-02-18 10:30:00', 'view', 5001, '手机数码', 120, 'mobile', 'home'),
(10001, '2026-02-18', '2026-02-18 10:35:00', 'view', 5002, '手机数码', 85, 'mobile', 'search'),
(10001, '2026-02-18', '2026-02-18 10:40:00', 'cart', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-17', '2026-02-17 14:20:00', 'view', 5004, '电脑办公', 200, 'mobile', 'recommend'),
(10001, '2026-02-17', '2026-02-17 14:25:00', 'favorite', 5004, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-16', '2026-02-16 09:15:00', 'view', 5005, '电脑办公', 150, 'web', 'home'),
(10001, '2026-02-16', '2026-02-16 09:20:00', 'cart', 5005, '电脑办公', 0, 'web', 'detail'),
(10001, '2026-02-15', '2026-02-15 16:00:00', 'view', 5006, '电脑办公', 180, 'mobile', 'search'),
(10001, '2026-02-15', '2026-02-15 16:10:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-14', '2026-02-14 11:30:00', 'view', 5016, '家用电器', 90, 'mobile', 'recommend'),
(10001, '2026-02-13', '2026-02-13 10:00:00', 'view', 5017, '家用电器', 110, 'mobile', 'home'),
(10001, '2026-02-13', '2026-02-13 10:05:00', 'cart', 5017, '家用电器', 0, 'mobile', 'detail'),
(10001, '2026-02-12', '2026-02-12 15:30:00', 'view', 5025, '美妆个护', 75, 'mobile', 'search'),
(10001, '2026-02-10', '2026-02-10 09:00:00', 'view', 5010, '服饰鞋包', 95, 'web', 'home'),
(10001, '2026-02-08', '2026-02-08 14:00:00', 'view', 5012, '智能穿戴', 130, 'mobile', 'recommend'),
(10001, '2026-02-08', '2026-02-08 14:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10001, '2026-02-05', '2026-02-05 11:00:00', 'view', 5020, '手机数码', 160, 'mobile', 'search'),
(10001, '2026-02-01', '2026-02-01 10:30:00', 'view', 5001, '手机数码', 100, 'mobile', 'home'),
(10001, '2026-02-01', '2026-02-01 10:35:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-01-28', '2026-01-28 16:00:00', 'view', 5018, '家用电器', 140, 'mobile', 'recommend'),
(10001, '2026-01-25', '2026-01-25 09:30:00', 'view', 5003, '手机数码', 80, 'web', 'search'),
(10001, '2026-01-25', '2026-01-25 09:35:00', 'buy', 5003, '手机数码', 0, 'web', 'detail'),
(10001, '2026-01-20', '2026-01-20 14:00:00', 'view', 5019, '服饰鞋包', 105, 'mobile', 'home'),
(10001, '2026-01-15', '2026-01-15 11:00:00', 'view', 5007, '电脑办公', 175, 'mobile', 'recommend'),
(10001, '2026-01-15', '2026-01-15 11:10:00', 'cart', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-01-15', '2026-01-15 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
-- ========== 用户10002(高价值用户 - 购买金额高)==========
(10002, '2026-02-19', '2026-02-19 10:00:00', 'view', 5009, '家用电器', 250, 'mobile', 'home'),
(10002, '2026-02-19', '2026-02-19 10:10:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-19', '2026-02-19 10:15:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-17', '2026-02-17 11:00:00', 'view', 5022, '电脑办公', 300, 'web', 'search'),
(10002, '2026-02-17', '2026-02-17 11:15:00', 'favorite', 5022, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-16', '2026-02-16 14:30:00', 'view', 5020, '手机数码', 220, 'mobile', 'recommend'),
(10002, '2026-02-16', '2026-02-16 14:40:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:00:00', 'view', 5024, '家用电器', 280, 'mobile', 'home'),
(10002, '2026-02-14', '2026-02-14 09:20:00', 'cart', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:30:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-10', '2026-02-10 15:00:00', 'view', 5021, '手机数码', 190, 'mobile', 'search'),
(10002, '2026-02-10', '2026-02-10 15:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-05', '2026-02-05 10:30:00', 'view', 5006, '电脑办公', 260, 'web', 'recommend'),
(10002, '2026-02-05', '2026-02-05 10:45:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:00:00', 'view', 5008, '家居生活', 240, 'mobile', 'home'),
(10002, '2026-02-01', '2026-02-01 11:15:00', 'cart', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:20:00', 'buy', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-01-28', '2026-01-28 14:00:00', 'view', 5023, '手机数码', 210, 'mobile', 'search'),
(10002, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-01-20', '2026-01-20 09:30:00', 'view', 5017, '家用电器', 185, 'mobile', 'recommend'),
(10002, '2026-01-20', '2026-01-20 09:40:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
-- ========== 用户10003(流失风险用户 - 最近30天活跃度下降)==========
(10003, '2026-01-15', '2026-01-15 08:00:00', 'view', 5010, '服饰鞋包', 90, 'web', 'home'),
(10003, '2026-01-15', '2026-01-15 08:10:00', 'cart', 5010, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2026-01-10', '2026-01-10 19:30:00', 'view', 5011, '服饰鞋包', 75, 'mobile', 'search'),
(10003, '2026-01-10', '2026-01-10 19:35:00', 'favorite', 5011, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2026-01-05', '2026-01-05 10:00:00', 'view', 5014, '手机数码', 100, 'web', 'recommend'),
(10003, '2026-01-05', '2026-01-05 10:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10003, '2025-12-28', '2025-12-28 14:00:00', 'view', 5015, '手机数码', 85, 'mobile', 'home'),
(10003, '2025-12-28', '2025-12-28 14:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10003, '2025-12-20', '2025-12-20 11:30:00', 'view', 5019, '服饰鞋包', 110, 'web', 'search'),
(10003, '2025-12-20', '2025-12-20 11:40:00', 'buy', 5019, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:00:00', 'view', 5010, '服饰鞋包', 95, 'mobile', 'home'),
(10003, '2025-12-15', '2025-12-15 09:10:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:15:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-10', '2025-12-10 16:00:00', 'view', 5025, '美妆个护', 70, 'mobile', 'recommend'),
(10003, '2025-12-10', '2025-12-10 16:05:00', 'favorite', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10003, '2025-12-05', '2025-12-05 10:30:00', 'view', 5012, '智能穿戴', 120, 'web', 'search'),
(10003, '2025-12-05', '2025-12-05 10:40:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
-- ========== 用户10004(新活跃用户 - 最近刚注册活跃)==========
(10004, '2026-02-19', '2026-02-19 10:00:00', 'view', 5012, '智能穿戴', 150, 'mobile', 'home'),
(10004, '2026-02-19', '2026-02-19 10:05:00', 'cart', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-19', '2026-02-19 10:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-18', '2026-02-18 15:00:00', 'view', 5013, '智能穿戴', 130, 'mobile', 'search'),
(10004, '2026-02-18', '2026-02-18 15:05:00', 'buy', 5013, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:00:00', 'view', 5014, '手机数码', 110, 'web', 'recommend'),
(10004, '2026-02-17', '2026-02-17 12:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:10:00', 'buy', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-16', '2026-02-16 18:00:00', 'view', 5015, '手机数码', 95, 'mobile', 'home'),
(10004, '2026-02-16', '2026-02-16 18:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-15', '2026-02-15 09:00:00', 'view', 5001, '手机数码', 140, 'mobile', 'search'),
(10004, '2026-02-15', '2026-02-15 09:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:00:00', 'view', 5002, '手机数码', 100, 'mobile', 'recommend'),
(10004, '2026-02-14', '2026-02-14 14:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-10', '2026-02-10 11:00:00', 'view', 5025, '美妆个护', 80, 'mobile', 'home'),
(10004, '2026-02-10', '2026-02-10 11:05:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10004, '2026-02-05', '2026-02-05 16:00:00', 'view', 5010, '服饰鞋包', 115, 'web', 'search'),
(10004, '2026-02-05', '2026-02-05 16:10:00', 'buy', 5010, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10005(稳定复购用户)==========
(10005, '2026-02-18', '2026-02-18 10:00:00', 'view', 5016, '家用电器', 180, 'mobile', 'home'),
(10005, '2026-02-18', '2026-02-18 10:10:00', 'cart', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-18', '2026-02-18 10:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-15', '2026-02-15 14:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10005, '2026-02-15', '2026-02-15 14:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:00:00', 'view', 5018, '家用电器', 170, 'web', 'recommend'),
(10005, '2026-02-10', '2026-02-10 16:10:00', 'favorite', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:15:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-05', '2026-02-05 11:00:00', 'view', 5009, '家用电器', 220, 'mobile', 'home'),
(10005, '2026-02-05', '2026-02-05 11:20:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-28', '2026-01-28 10:00:00', 'view', 5024, '家用电器', 250, 'mobile', 'search'),
(10005, '2026-01-28', '2026-01-28 10:20:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:00:00', 'view', 5006, '电脑办公', 190, 'mobile', 'recommend'),
(10005, '2026-01-20', '2026-01-20 14:15:00', 'cart', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:20:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-15', '2026-01-15 09:00:00', 'view', 5020, '手机数码', 160, 'web', 'home'),
(10005, '2026-01-15', '2026-01-15 09:10:00', 'buy', 5020, '手机数码', 0, 'web', 'detail'),
(10005, '2026-01-08', '2026-01-08 10:00:00', 'view', 5021, '手机数码', 175, 'mobile', 'search'),
(10005, '2026-01-08', '2026-01-08 10:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10006(单次购买用户 - 低活跃)==========
(10006, '2026-01-10', '2026-01-10 11:00:00', 'view', 5019, '服饰鞋包', 120, 'mobile', 'home'),
(10006, '2026-01-10', '2026-01-10 11:05:00', 'cart', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-10', '2026-01-10 11:10:00', 'buy', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-05', '2026-01-05 14:00:00', 'view', 5010, '服饰鞋包', 90, 'mobile', 'search'),
(10006, '2026-01-05', '2026-01-05 14:05:00', 'favorite', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2025-12-28', '2025-12-28 10:00:00', 'view', 5011, '服饰鞋包', 85, 'web', 'recommend'),
(10006, '2025-12-28', '2025-12-28 10:05:00', 'cart', 5011, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10007(VIP高价值用户 - 高频高消费)==========
(10007, '2026-02-19', '2026-02-19 09:00:00', 'view', 5020, '手机数码', 280, 'mobile', 'home'),
(10007, '2026-02-19', '2026-02-19 09:15:00', 'cart', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-19', '2026-02-19 09:20:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-18', '2026-02-18 10:30:00', 'view', 5021, '手机数码', 260, 'mobile', 'search'),
(10007, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-17', '2026-02-17 11:30:00', 'view', 5022, '电脑办公', 300, 'web', 'recommend'),
(10007, '2026-02-17', '2026-02-17 11:50:00', 'buy', 5022, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:00:00', 'view', 5023, '手机数码', 240, 'mobile', 'home'),
(10007, '2026-02-16', '2026-02-16 15:15:00', 'favorite', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:20:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-15', '2026-02-15 10:00:00', 'view', 5024, '家用电器', 320, 'mobile', 'search'),
(10007, '2026-02-15', '2026-02-15 10:25:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-12', '2026-02-12 14:00:00', 'view', 5006, '电脑办公', 270, 'web', 'recommend'),
(10007, '2026-02-12', '2026-02-12 14:20:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:00:00', 'view', 5009, '家用电器', 290, 'mobile', 'home'),
(10007, '2026-02-08', '2026-02-08 09:20:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:25:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-05', '2026-02-05 11:00:00', 'view', 5007, '电脑办公', 250, 'mobile', 'search'),
(10007, '2026-02-05', '2026-02-05 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10007, '2026-02-01', '2026-02-01 10:00:00', 'view', 5008, '家居生活', 230, 'web', 'recommend'),
(10007, '2026-02-01', '2026-02-01 10:15:00', 'buy', 5008, '家居生活', 0, 'web', 'detail'),
(10007, '2026-01-28', '2026-01-28 14:00:00', 'view', 5016, '家用电器', 210, 'mobile', 'home'),
(10007, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-25', '2026-01-25 09:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10007, '2026-01-25', '2026-01-25 09:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-20', '2026-01-20 10:00:00', 'view', 5018, '家用电器', 220, 'web', 'recommend'),
(10007, '2026-01-20', '2026-01-20 10:20:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10007, '2026-01-15', '2026-01-15 15:00:00', 'view', 5001, '手机数码', 190, 'mobile', 'home'),
(10007, '2026-01-15', '2026-01-15 15:10:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10008(新用户 - 数据最新)==========
(10008, '2026-02-19', '2026-02-19 14:00:00', 'view', 5025, '美妆个护', 140, 'mobile', 'home'),
(10008, '2026-02-19', '2026-02-19 14:05:00', 'cart', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-19', '2026-02-19 14:10:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-18', '2026-02-18 16:00:00', 'view', 5026, '美妆个护', 125, 'mobile', 'search'),
(10008, '2026-02-18', '2026-02-18 16:05:00', 'buy', 5026, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-17', '2026-02-17 10:00:00', 'view', 5001, '手机数码', 160, 'mobile', 'recommend'),
(10008, '2026-02-17', '2026-02-17 10:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:00:00', 'view', 5002, '手机数码', 135, 'mobile', 'home'),
(10008, '2026-02-16', '2026-02-16 11:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-15', '2026-02-15 14:00:00', 'view', 5012, '智能穿戴', 150, 'web', 'search'),
(10008, '2026-02-15', '2026-02-15 14:10:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:00:00', 'view', 5010, '服饰鞋包', 110, 'mobile', 'recommend'),
(10008, '2026-02-12', '2026-02-12 09:05:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:10:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-08', '2026-02-08 15:00:00', 'view', 5014, '手机数码', 130, 'mobile', 'home'),
(10008, '2026-02-08', '2026-02-08 15:05:00', 'buy', 5014, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:00:00', 'view', 5015, '手机数码', 105, 'web', 'search'),
(10008, '2026-02-05', '2026-02-05 10:05:00', 'favorite', 5015, '手机数码', 0, 'web', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:10:00', 'buy', 5015, '手机数码', 0, 'web', 'detail');