定期的なスナップショット ファクト テーブルを構築することにより、ユーザーのリターンとチャーンの統計指標を最適化する方法

目次

1 要件の説明

2 データ探索

3 モデルの最適化

3.1 7 日以内にユーザーを失った場合

3.2 7 日以内のユーザーの返品

4 ADS 層モデルの設計

5 まとめ


1 要件の説明

この要件には、離職者数と再利用者数の 2 つの指標が含まれますが、以下に 2 つの指標について説明します。

統計期間

索引

例証する

過去 1 日間 (1 日あたりの新しい失われたユーザーの数)

失われたユーザー

以前はアクティブで、最近はアクティブではないユーザーは、失われたユーザーと呼ばれます。ここでは、7 日前 (7 日前のみを含む) にアクティブであったが、過去 7 日間アクティブでなかったユーザーの総数をカウントする必要があります。

過去 1 日間(1 日あたりの新規リピーター数)

リピーター

以前にアクティブだったユーザーが、一定期間アクティブになっておらず (失われ)、今日再びアクティブになったユーザーをリピーターと呼びます。ここでは、リピーターの総数をカウントする必要があります。

2 データ探索

      (1) データ調査、この指標はユーザーのログインフォームから計算できます

       (2) 直接計算

ステップ 1 の計算: 7 日前にログインしたユーザー
ステップ 2 の計算: 過去 7 日間にログインしたユーザーが
過去
7 日間にログインしたユーザーに参加

ユーザー ログイン テーブルのデータ量が非常に大きい. この直接関連付けが大きなテーブル関連付けと同等である場合、パフォーマンスはかなり低下します

3 モデルの最適化

3.1 7 日以内にユーザーを失った場合

定義: ユーザーは 7 日前はアクティブでしたが、過去 7 日間はアクティブではありませんでした。つまり、ユーザーはアプリに 7 日以上ログインしていません. ユーザーの最新のログイン時刻が 7 日前である場合、つまり、ユーザーは 7 日以上ログインしていません. そこで、ユーザー ログイン収束テーブルを作成します。構造は次のとおりです。

ユーザーID

ユーザーID

login_date_last

ユーザーの最終ログイン日

現時点では、ユーザー履歴から現在までの最終ログイン期間のスナップショット テーブルを DWS レイヤーで維持および構築するだけで済みます。

テーブルデザイン

命名:dws_user_user_login_td

td: 今のところ

ユーザー: データ フィールド

user_login: ユーザーのログイン事実を示します。

具体的な表は次のとおりです。

DROP TABLE IF EXISTS dws_user_user_login_td;
CREATE EXTERNAL TABLE dws_user_user_login_td
(
    `user_id`         STRING COMMENT '用户id',
    `login_date_last` STRING COMMENT '末次登录日期',
    `login_count_td`  BIGINT COMMENT '累计登录次数'
) COMMENT '用户域用户粒度登录历史至今汇总事实表'
    PARTITIONED BY (`dt` STRING)
    STORED AS ORC
    TBLPROPERTIES ('orc.compress' = 'snappy');

次に、失われたユーザーは、上記の分析に従って次のように計算できます。

select
    count(*)
from dws_user_user_login_td
where dt =current_date
and login_date_last=date_add(current_date,-7);

概要: ユーザーの特性が失われ、ユーザーの最終ログイン時刻が当日から7 日を経過しました

したがって、同じ方法で、7 日間のチャーン、14 日間のチャーン、30 日間のチャーン、90 日間のチャーンを定義できます。

3.2 7 日以内のユーザーの返品

定義: 7 日前は非アクティブ、今日はアクティブ

特徴: (1) 2 回のユーザー ログイン間の時間間隔が7 日以上

           (2) 最終ログイン日 (今日) から最終ログイン日が8 日以降のユーザーを差し引いた値

したがって、問題の難点は、ユーザーが最後にログインした日付を見つける方法です.上記の分析を通じて、復帰ユーザーはその日のアクティブユーザーであるに違いないことに気付きましたが、昨日のユーザーはまだ失われたユーザーです. 、つまり、昨日の最終ログイン日は 7 日前でした

(1) その日のアクティブユーザーを獲得する

現在までのユーザー履歴を使用した最終ログインのタイムライン

select user_id,
       login_date_last
from dws_user_user_login_td
where dt = current_date
  and login_date_last = current_date;
(2)昨日のパーティションのデータを取得する
select user_id,
       login_date_last
from dws_user_user_login_td
where dt = date_add(current_date,-1)

(3) 2 つのテーブルを結合し、ログイン間隔が 8 日以上のユーザーを取る

select count(*)
from (select user_id,
             login_date_last
      from dws_user_user_login_td
      where dt = current_date
        and login_date_last = current_date) t1
join
     (select user_id,
             login_date_last
      from dws_user_user_login_td
      where dt = date_add(current_date, -1)
) t2
     on t1.user_id = t2.user_id
where datediff(t1.login_date_last,t2.login_date_last)>=8

4 ADS 層モデルの設計

次のようにテーブルを作成します。

DROP TABLE IF EXISTS ads_user_change;
CREATE EXTERNAL TABLE ads_user_change
(
    `dt`               STRING COMMENT '统计日期',
    `user_churn_count` BIGINT COMMENT '流失用户数',
    `user_back_count`  BIGINT COMMENT '回流用户数'
) COMMENT '用户变动统计'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'


2 つのインジケーターの組み合わせ: UNION ALL の使用

select 
       dt,
       sum(user_churn_count) user_churn_count,
       sum(user_back_count) user_back_count
from (
    select
           current_date dt,
           count(*) user_churn_count,
		   null user_back_count
      from
           dws_user_user_login_td
      where dt = current_date
        and login_date_last = date_add(current_date, -7)
union all
    select
           current_date dt,
		   null user_churn_count,
           count(*) user_back_count
from (
    select
             user_id,
             login_date_last
      from
           dws_user_user_login_td
      where dt = current_date
        and login_date_last = current_date) t1
         inner join
     (
         select
             user_id,
             login_date_last
      from
           dws_user_user_login_td
      where dt = date_add(current_date, -1)
         ) t2
     on t1.user_id = t2.user_id
where datediff(t1.login_date_last,t2.login_date_last)>=8
)
group by dt

5 まとめ

 この記事では、データ ウェアハウス モデリングの形式でインジケーターの計算を最適化する方法を分析し、ユーザーの利益と損失の 2 つのインジケーターを最適化します. インジケーターの分析を通じて、定期的なスナップショット ファクト テーブルが DWS レイヤーに構築され、ユーザーを維持します。これまでの履歴 最終ログイン期間のスナップショット テーブルは、指標の計算を簡素化し、パフォーマンスを向上させます。

おすすめ

転載: blog.csdn.net/godlovedaniel/article/details/126556641