目次
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 レイヤーに構築され、ユーザーを維持します。これまでの履歴 最終ログイン期間のスナップショット テーブルは、指標の計算を簡素化し、パフォーマンスを向上させます。