在RFM模型(Recency-Frequency-Monetary)中,R、F、M三个值分别代表:
-
R(Recency):最近一次购买(或访问)的时间距离现在有多久。R值越小,表示客户最近有交易,因此更有可能再次购买,评分越高。
-
F(Frequency):在特定时间段内购买(或访问)的频率。F值越大,表示客户购买频率高,因此更有可能再次购买,评分越高。
-
M(Monetary):在特定时间段内购买的总金额。M值越大,表示客户购买金额大,因此更有可能再次购买,评分越高。
一、思维导图(文字版)
1. 读数据
pd.read_csv('file.csv')
2. 看数据
df.head() df.info() df.describe()
3. 洗数据(通用套路)
缺失值 → dropna / fillna
异常值 → 布尔筛选 + mask
重复值 → drop_duplicates
类型转换 → astype / pd.to_datetime
4. 做分析
时间维度 → 抽年/月/季 → groupby
地区维度 → groupby
用户维度 → RFM → pivot_table
5. 出结果
.sum() .mean() .count()
.plot() → 折线/柱状
二、两段万能模板代码
① 电影数据:每年上映数量趋势
import pandas as pd
import matplotlib.pyplot as plt
# 1. 读取 & 清洗
df = pd.read_csv('movie_metadata.csv')
df = df.dropna(subset=['title_year'])
# 2. 做年字段
df['year'] = pd.to_datetime(df['title_year'], errors='coerce').dt.year
# 3. 统计
year_cnt = df.groupby('year')['movie_title'].count()
# 4. 画图
year_cnt.plot(figsize=(8,4), title='每年上映电影数量')
plt.xlabel('Year')
plt.ylabel('Count')
plt.show()
② 电商数据:RFM 用户分层
import pandas as pd
import datetime as dt
# 1. 读取 & 初步清洗
df = pd.read_csv('ecommerce.csv', parse_dates=['OrderDate'])
df = df.dropna(subset=['CustomerID', 'Sales'])
# 2. 计算 RFM 值
NOW = df['OrderDate'].max() + dt.timedelta(days=1)
rfm = df.groupby('CustomerID').agg({
'OrderDate': lambda x: (NOW - x.max()).days, # Recency
'OrderID': 'count', # Frequency
'Sales': 'sum' # Monetary
}).rename(columns={'OrderDate':'R', 'OrderID':'F', 'Sales':'M'})
# 3. 打分(五分制示例)
rfm['R_S'] = pd.qcut(rfm['R'], 5, labels=[5,4,3,2,1])
rfm['F_S'] = pd.qcut(rfm['F'].rank(method='first'), 5, labels=[1,2,3,4,5])
rfm['M_S'] = pd.qcut(rfm['M'], 5, labels=[1,2,3,4,5])
# 4. 组合用户层级
rfm['score'] = (rfm['R_S'].astype(str) +
rfm['F_S'].astype(str) +
rfm['M_S'].astype(str))
level_map = {
'555':'重要价值客户',
'455':'重要唤回客户',
'551':'重要深耕客户',
'154':'重要挽留客户',
'515':'潜力客户',
'115':'新客户',
'111':'流失客户'
}
rfm['level'] = rfm['score'].map(level_map)
# 5. 查看结果
print(rfm['level'].value_counts())