在开始用户分层之前,我们需要配置一个基础的Python数据处理环境。本文将使用Python中最轻量级且功能强大的Pandas库进行数据清洗与计算,无需配置复杂的大数据组件。
确保你的电脑上安装了Python(建议版本3.8及以上)。打开终端或命令行工具,执行以下命令安装必要的依赖库:
pip install pandas numpy
安装完成后,新建一个名为user_segmentation.py的文件,我们将在这个文件中编写所有逻辑。
为了让你能直接运行代码,我们首先构建一份模拟的电商用户行为数据。在实际业务中,你可以直接替换为从MySQL或CSV读取的真实数据。数据必须包含三个核心字段:用户ID、订单时间、订单金额。
请在代码文件中输入以下代码生成模拟数据user_data.csv:
运行上述代码后,当前目录下会生成一个user_data.csv文件。这是后续分层操作的基础数据源。

用户分层最经典的模型是RFM模型。我们将通过计算每个用户的三个指标来进行分层:
接下来,我们编写代码读取CSV并计算这三个指标。请注意,这里的“今天”设定为数据中最大日期的后一天,以模拟实时分析场景。
```python 读取数据 df = pd.read_csv('user_data.csv') df['order_date'] = pd.to_datetime(df['order_date']) 设定分析基准日期(数据中最新日期的第二天) snapshot_date = df['order_date'].max() + timedelta(days=1) 计算RFM指标 rfm = df.groupby('user_id').agg({ 'order_date': lambda x: (snapshot_date - x.max()).days, R 'user_id': 'count', F 'amount': 'sum' M }) 重命名列 rfm.columns = ['recency', 'frequency', 'monetary'] rfm.reset_index(inplace=True) print("RFM指标计算完成,前5行数据预览:") print(rfm.head()) ```计算完RFM数值后,我们需要将数值转化为标签。为了实现自动化分层,我们将使用均值作为评分阈值:高于平均值记为1(高),低于平均值记为0(低)。通过R、F、M三个维度的0/1组合,我们将用户分为8类。
以下是具体的打标逻辑与实现代码:
```python 计算R、F、M的均值,作为评分阈值 r_avg = rfm['recency'].mean() f_avg = rfm['frequency'].mean() m_avg = rfm['monetary'].mean() 定义打标函数 def label_user(row): r_score = 1 if row['recency'] < r_avg else 0 R越小越好,所以小于均值是高分 f_score = 1 if row['frequency'] > f_avg else 0 m_score = 1 if row['monetary'] > m_avg else 0 根据组合定义用户层级 if r_score == 1 and f_score == 1 and m_score == 1: return '重要价值客户' elif r_score == 1 and f_score == 1 and m_score == 0: return '重要发展客户' elif r_score == 1 and f_score == 0 and m_score == 1: return '重要保持客户' elif r_score == 1 and f_score == 0 and m_score == 0: return '一般挽留客户' elif r_score == 0 and f_score == 1 and m_score == 1: return '重要唤醒客户' elif r_score == 0 and f_score == 1 and m_score == 0: return '一般发展客户' elif r_score == 0 and f_score == 0 and m_score == 1: return '一般保持客户' else: return '流失客户' 应用打标函数 rfm['user_segment'] = rfm.apply(label_user, axis=1) 统计各层级人数 segment_counts = rfm['user_segment'].value_counts().reset_index() segment_counts.columns = ['用户类型', '人数'] print("\n用户分层结果统计:") print(segment_counts) ```为了方便你直接复制使用,下面是整合了数据生成、RFM计算、分层打标及结果导出的完整脚本。你可以直接覆盖之前的文件内容并运行。
```python import pandas as pd import numpy as np from datetime import datetime, timedelta ================= 1. 数据准备 ================= def generate_data(): np.random.seed(42) user_ids = np.random.randint(1000, 2000, size=5000) base_date = datetime.now() dates = [base_date - timedelta(days=np.random.randint(0, 90)) for _ in range(5000)] amounts = np.random.uniform(10, 500, size=5000).round(2) df = pd.DataFrame({ 'user_id': user_ids, 'order_date': dates, 'amount': amounts }) df.to_csv('user_data.csv', index=False) return df ================= 2. 核心逻辑 ================= def main(): 如果没有数据,先生成 try: df = pd.read_csv('user_data.csv') except FileNotFoundError: print("未找到数据文件,正在生成模拟数据...") df = generate_data() df['order_date'] = pd.to_datetime(df['order_date']) snapshot_date = df['order_date'].max() + timedelta(days=1) 计算RFM rfm = df.groupby('user_id').agg({ 'order_date': lambda x: (snapshot_date - x.max()).days, 'user_id': 'count', 'amount': 'sum' }) rfm.columns = ['recency', 'frequency', 'monetary'] rfm.reset_index(inplace=True) 计算阈值 r_avg = rfm['recency'].mean() f_avg = rfm['frequency'].mean() m_avg = rfm['monetary'].mean() 打标 def label_user(row): r_score = 1 if row['recency'] < r_avg else 0 f_score = 1 if row['frequency'] > f_avg else 0 m_score = 1 if row['monetary'] > m_avg else 0 if r_score == 1 and f_score == 1 and m_score == 1: return '重要价值客户' elif r_score == 1 and f_score == 1 and m_score == 0: return '重要发展客户' elif r_score == 1 and f_score == 0 and m_score == 1: return '重要保持客户' elif r_score == 1 and f_score == 0 and m_score == 0: return '一般挽留客户' elif r_score == 0 and f_score == 1 and m_score == 1: return '重要唤醒客户' elif r_score == 0 and f_score == 1 and m_score == 0: return '一般发展客户' elif r_score == 0 and f_score == 0 and m_score == 1: return '一般保持客户' else: return '流失客户' rfm['user_segment'] = rfm.apply(label_user, axis=1) ================= 3. 结果导出 ================= rfm.to_csv('user_segments_result.csv', index=False) print("处理完成!结果已保存至 user_segments_result.csv") print(rfm['user_segment'].value_counts()) if __name__ == '__main__': main() ```运行上述代码后,你将得到一个名为user_segments_result.csv的文件。该文件包含了每个用户的RFM数值以及具体的分层标签。以下是针对不同分层标签的实操运营建议:
通过这套流程,你不仅完成了技术层面的分层,更拿到了可直接指导业务决策的数据报表。你可以将user_segments_result.csv导入BI工具或直接导入CRM系统进行自动化营销推送。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图