数据分析-RFM模型示例

在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())
### RFM模型数据分析实现代码示例 以下是基于 PythonRFM 模型实现代码,该代码涵盖了数据准备、字段计算、评分以及分类的主要过程: #### 数据导入与预处理 首先加载必要的库并读取数据。 ```python import pandas as pd from sklearn.preprocessing import MinMaxScaler # 假设我们有一个交易记录表 data.csv,包含三列:CustomerID, OrderDate, Amount data = pd.read_csv('data.csv') # 转换日期格式 data['OrderDate'] = pd.to_datetime(data['OrderDate']) ``` #### 计算 R (Recency), F (Frequency), M (Monetary) 通过聚合函数来计算每位客户的最近一次购买时间差(R)、购买频率(F)和消费金额总和(M)。 ```python snapshot_date = max(data.OrderDate) + pd.Timedelta(days=1) rfm_table = data.groupby('CustomerID').agg({ 'OrderDate': lambda x: (snapshot_date - x.max()).days, 'CustomerID': 'count', 'Amount': 'sum' }).rename(columns={ 'OrderDate': 'Recency', 'CustomerID': 'Frequency', 'Amount': 'Monetary' }) ``` #### 归一化处理 为了使不同量纲的数据具有可比性,采用归一化方法对 R/F/M 进行标准化。 ```python scaler = MinMaxScaler() rfm_normalized = scaler.fit_transform(rfm_table[['Recency', 'Frequency', 'Monetary']]) rfm_df = pd.DataFrame(rfm_normalized, columns=['Norm_Recency', 'Norm_Frequency', 'Norm_Monetary'], index=rfm_table.index) ``` #### 打分机制 定义打分规则并将分数分配给每一位客户。 ```python quantiles = rfm_table.quantile(q=[0.25, 0.5, 0.75]) def r_score(x): if x <= quantiles.Recency[0.25]: return 4 elif x <= quantiles.Recency[0.5]: return 3 elif x <= quantiles.Recency[0.75]: return 2 else: return 1 def fm_score(x, c): if x <= quantiles[c][0.25]: return 1 elif x <= quantiles[c][0.5]: return 2 elif x <= quantiles[c][0.75]: return 3 else: return 4 rfm_table['R'] = rfm_table['Recency'].apply(lambda x: r_score(x)) rfm_table['F'] = rfm_table['Frequency'].apply(lambda x: fm_score(x, 'Frequency')) rfm_table['M'] = rfm_table['Monetary'].apply(lambda x: fm_score(x, 'Monetary')) rfm_table['RFM_Score'] = rfm_table.R.map(str) + rfm_table.F.map(str) + rfm_table.M.map(str) ``` #### 客户分类 根据最终得分将客户划分为不同的类别。 ```python seg_map = { r'[1-2][1-2]': 'Hibernating', r'[1-2][3-4]': 'At Risk', r'3[1-2]': 'Can\'t Lose Them', r'33': 'Need Attention', r'[3-4][3-4]': 'Loyal Customers', r'41': 'Promising', r'4[2-3]': 'Potential Loyalist', r'44': 'Champions' } rfm_table['Segment'] = rfm_table['R'].map(str) + rfm_table['F'].map(str) rfm_table['Segment'] = rfm_table['Segment'].replace(seg_map, regex=True) ``` 以上代码实现了完整的 RFM 分析流程,并提供了详细的客户分类依据[^1]。 --- ### 可视化展示 对于进一步的可视化需求,可以利用 FineBI 或其他工具创建仪表盘。例如,在 FineBI 中可以通过拖拽操作快速生成交互式的图表,直观展现各客户群体的行为特征及其价值分布[^2]。 如果需要针对特定场景调整分析逻辑,则可以根据实际案例灵活修改参数设置。比如某打车 APP 用户行为分析中提到的例子,可根据业务目标重新设计评分权重体系[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值