?? RFM用戶分析模型究竟是什么?在之前的博客已經(jīng)介紹了它的意義以及如何在現(xiàn)有的數(shù)據(jù)的情況下,利用Pandas創(chuàng)建分析模型,這里不再重復(fù),詳細(xì)可以參考我博客https://blog.csdn.net/weixin_48591974/article/details/116192534
?? 這一期將詳細(xì)介紹如何利用SQL直接獲取所需的數(shù)據(jù)去創(chuàng)建RFM用戶分析模型。SQL ---- Structured Query Language(結(jié)構(gòu)化查詢語言 ),它是一種專門用來與數(shù)據(jù)庫溝通的語言,提供了很多從數(shù)據(jù)庫中高效地讀寫數(shù)據(jù)、查詢數(shù)據(jù)的方法。常用的DBMS(數(shù)據(jù)庫管理軟件) 有 MySQL、Access、SQLite、SQL SERVER、Oracle 等等。
Recency:最近一次消費(fèi),即上一次交易距今多少天,反應(yīng)了客戶是否流失;
Frequency:消費(fèi)頻率,一段時(shí)間內(nèi)客戶的消費(fèi)頻率,反應(yīng)了客戶的消費(fèi)活躍度;
Monetary:消費(fèi)金額,一段時(shí)間內(nèi)客戶消費(fèi)總金額,反應(yīng)了客戶價(jià)值
根據(jù) RFM 這 3個(gè) Dimension,可以分為8種客戶類型,如下圖:
?? 以下將簡單介紹3個(gè)指標(biāo)值的計(jì)算方法:
?? F 值的計(jì)算:例如要計(jì)算 子表 orders 里 user_id 為 8002011的值。
?? 統(tǒng)計(jì)數(shù)據(jù)行數(shù),我們可以使用 count() 函數(shù)完成,最后得出 F值為 3
SELECT count(*) AS F
FROM orders
WHERE user_id = 8002011;
?? M 值的計(jì)算: 使用 sum() 函數(shù)將計(jì)算字段 price * amount 所有行加起來就得出 user_id 8002011 總消費(fèi)金額為 13000
SELECT sum(price * amount) AS M
FROM orders
WHERE user_id = 8002011;
?? R 值的計(jì)算:在orders表中,可見時(shí)間是以 Integer 類型存在,也就是以格蘭威治秒數(shù)(Unix時(shí)間戳)類型存在,指的是從1970年1月1日開始計(jì)算的秒數(shù)。關(guān)于時(shí)間戳和日期轉(zhuǎn)換方法,可以運(yùn)用 python的 datetime module 去實(shí)現(xiàn)轉(zhuǎn)換。例如今天(2024-01-12)所對應(yīng)的時(shí)間戳經(jīng)過轉(zhuǎn)換為 1704988800(秒),因此可以用這數(shù)值減去最近一次消費(fèi)的日期,最后轉(zhuǎn)換成天數(shù),就知道 user_id 8002011最近一次消費(fèi)距離今天為多少天。
SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
FROM orders
WHERE user_id = 8002011;
?? 有了以上對3個(gè)指標(biāo)的計(jì)算方法,以下就繼續(xù)介紹各種方法進(jìn)行分析。假設(shè)有如下總的數(shù)據(jù)表(更多數(shù)據(jù)行省略…)
?? 首先通過GROUP BY 子句,將原數(shù)據(jù)進(jìn)行 分組,再通過聚合函數(shù)把字段組合相同的行劃分為同一組。具體語法如下:
SELECT user_id AS 用戶ID,
user_name AS 用戶昵稱,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id;
?? 這樣就可以把每位用戶的 RFM 值都計(jì)算出來了。
?? 剛才根據(jù) R、F、M 維度表現(xiàn)的高與低,把用戶分劃分為 8 類,我們可以選擇中位數(shù)作為區(qū)分高、低的依據(jù)。
?? 數(shù)據(jù)表 orders 共包含 21名用戶數(shù)據(jù)。所以如果我們想獲取中位數(shù),查詢語句需要寫成 LIMIT 10, 1 由于21的中位數(shù)為 11, 因此 LIMIT 語句的第1個(gè)參數(shù)為 10,第2個(gè)參數(shù)為返回1行的結(jié)果,那就是中位數(shù)的值。
?? 獲取 R 的中位數(shù): 結(jié)果為32
SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R
FROM orders
GROUP BY user_id
ORDER BY R
LIMIT 10,1;
?? 獲取 F 的中位數(shù): 結(jié)果為3
SELECT count(user_id) AS F
FROM orders
GROUP BY user_id
ORDER BY F
LIMIT 10,1;
?? 獲取 M 的中位數(shù): 結(jié)果為 36500
SELECT sum(price * amount) AS M
FROM orders
GROUP BY user_id
ORDER BY M
LIMIT 10,1;
?? 接著,以如何獲得 “新用戶” 和 "流失用戶"為例去繼續(xù)編寫語句分析。以上已經(jīng)得出 R、F、M 的中位數(shù)。由于R(最近一次消費(fèi))的值越小,說明用戶越活躍,因此低于 32 的被劃分為 R 水平 高,反之為 R 水平 低。同理,我們可以得出 F 和 M 的劃分方法, F:低于 3 為水平 低,反之為 高;M:低于 36500 為水平 低,反之為 高。
?? HAVING 子句在用法上和 WHERE 子句非常相似,它們都能夠根據(jù)指定條件篩選數(shù)據(jù),也可以使用我們在 SELECT 子句中定義的字段別名。不同之處在于,WHERE 子句作用于原數(shù)據(jù)表,用來篩選 行;而 HAVING 子句作用于分組結(jié)果,用來篩選 分組。所以在編寫語句時(shí),必須區(qū)分好。
SELECT user_id AS 用戶ID,
user_name AS 用戶昵稱,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id
HAVING R <=32
AND F < 3
AND M < 36500;
?? 得出"新用戶" 數(shù)據(jù)表:
SELECT user_id AS 用戶ID,
user_name AS 用戶昵稱,
(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
count(user_id) AS F,
sum(price * amount) AS M
FROM orders
GROUP BY user_id
HAVING R > 32
AND F < 3
AND M < 36500;
?? 得出"流失用戶" 數(shù)據(jù)表:
文章來源:http://www.zghlxwxcb.cn/news/detail-790816.html
?? 同理,其它6個(gè)維度的客戶分析也是同樣編寫相對應(yīng)的條件語句進(jìn)行篩選。對于在眾多的用戶中如何可以快速、科學(xué)地分類,尤其前5個(gè)維度,對于每個(gè)商業(yè)行業(yè)有著重要的作用,也是掌握企業(yè)命運(yùn)的風(fēng)向標(biāo)。文章來源地址http://www.zghlxwxcb.cn/news/detail-790816.html
到了這里,關(guān)于如何利用SQL創(chuàng)建RFM用戶分析模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!