# REM-Data-Analysis **Repository Path**: hlh-java/rem-data-analysis ## Basic Information - **Project Name**: REM-Data-Analysis - **Description**: RFM 分析是一种常用的客户价值分析方法,通过三个核心指标来衡量客户价值和客户创利能力: - R (Recency):最近一次消费时间间隔 - F (Frequency):消费频率 - M (Monetary):消费金额 本系统旨在实现自动化的 RFM 分析流程,包括数据清洗、异常检测、可视化分析和数据挖掘,帮助企业更好地理解客户行为,优化营销策略(python数据可视化分析期末大作业) - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-29 - **Last Updated**: 2025-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python ## README # 数据分析 # 1.项目概述 ## 1.1项目背景 RFM 分析是一种常用的客户价值分析方法,通过三个核心指标来衡量客户价值和客户创利能力: - R (Recency):最近一次消费时间间隔 - F (Frequency):消费频率 - M (Monetary):消费金额 本系统旨在实现自动化的 RFM 分析流程,包括数据清洗、异常检测、可视化分析和数据挖掘,帮助企业更好地理解客户行为,优化营销策略 ## 1.2项目功能 - 订单数据的读取与清洗(处理缺失值、重复值、异常值) - RFM 指标计算与标准化 - 基于 KNN 算法的异常客户检测 - RFM 指标的描述性统计与可视化 - 相关性分析与回归分析 - PCA 因子分析 - 分析结果与清洗报告的生成与导出 # 2.技术架构 ## 2.1开发环境 准备python环境版本小于等于3.11.0 1. 核心数据处理库 | 包名 | 用途 | 国内镜像安装命令(清华源) | | :------: | :--------------------- | :----------------------------------------------------------: | | openpyxl | 读取Excel文件的依赖包 | pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl | | pandas | 数据清洗与分析 | pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple | | numpy | 数值计算(pandas依赖) | pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple | 2. 数据可视化库 | 包名 | 用途 | 国内镜像安装命令(清华源) | | :--------: | :------------------------ | :----------------------------------------------------------: | | matplotlib | 基础绘图(折线图/直方图) | pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple | | seaborn | 高级统计可视化 | pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple | 3. 异常检测与机器学习库 | 包名 | 用途 | 国内镜像安装命令(清华源) | | :------------: | --------------------- | :----------------------------------------------------------: | | pyod | 异常值检测(KNN算法) | pip install pyod -i https://pypi.tuna.tsinghua.edu.cn/simple | | `scikit-learn` | 回归分析/PCA降维 | pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple | 4. 统计分析库 | 包名 | 用途 | 国内镜像安装命令(清华源) | | ------------- | ------------------ | ------------------------------------------------------------ | | `statsmodels` | 回归分析(R²计算) | pip install statsmodels -i https://pypi.tuna.tsinghua.edu.cn/simple | 如果觉得麻烦可以一键安装所有数据源 ```js pip install pandas numpy matplotlib seaborn pyod scikit-learn statsmodels -i https://pypi.tuna.tsinghua.edu.cn/simple ``` ## 2.2系统架构 ```plalntext RFM分析系统 ├── 数据载入模块 ├── 数据清洗模块 ├── RFM计算模块 ├── 异常检测模块 ├── 数据分析模块 ├── 可视化模块 └── 结果导出模块 ``` # 2.3数据流图 ```plalntext 数据载入 → 数据清洗 → RFM计算 → 异常检测 → 数据分析 → 可视化 → 结果导出 ``` # 3.数据准备 [实训项目20:RFM分析.xlsx](实训项目20:RFM分析.xlsx) # 4.数据清洗及处理过程 ## 4.1数据载入模块 从 Excel 文件读取订单数据,支持指定工作表和路径 ```python print("1. 数据载入") df = pd.read_excel(r"D:\java_xh\GraduationProject\REM-Data-Analysis\实训项目20:RFM分析.xlsx", sheet_name="Sheet1") ``` ## 4.2数据清洗 处理数据中的缺失值、重复值和异常值,确保数据质量 1. **日期处理**:自动识别并处理不同格式的日期数据 2. **缺失值处理**:删除关键字段缺失的记录 3. **重复值处理**:去除完全重复的记录和无效订单 4. **异常值过滤**:过滤金额异常和时间逻辑错误的订单 ```python # 2. 数据清洗 print("\n2. 数据清洗(增强版)") # 2.1 日期处理 date_cols = ['Ordertime', 'Paymenttime', 'Deliverytime', 'EndTime'] for col in date_cols: # 增强:先转为字符串,处理异常格式后再转日期 df[col] = pd.to_datetime( df[col].astype(str).str.replace(r'\.0$', '', regex=True), errors='coerce' # 新增:自动处理无效日期 ) # 2.2 缺失值处理 print("\n2.2 缺失值检查") missing_report = df.isnull().sum() print("缺失值统计:\n", missing_report[missing_report > 0]) # 关键字段缺失处理 df = df.dropna(subset=['OrderNumber', 'BuyerName', 'OrderAmount']) # 2.3 重复值处理 print("\n2.3 重复值检查") # 保留原有的主订单筛选逻辑 df = df[~df['OrderNumber'].str.contains('-', na=False)] # 新增:精确重复记录检查 dup_rows = df.duplicated(subset=['OrderNumber', 'BuyerName', 'OrderAmount'], keep=False) print(f"发现完全重复记录: {dup_rows.sum()}条") df = df.drop_duplicates(subset=['OrderNumber', 'BuyerName', 'OrderAmount']) # 2.4 异常值过滤 print("\n2.4 异常值过滤") # 保留原有金额过滤 df = df[df['OrderAmount'] > 0.1] # 新增:支付时间不能早于下单时间 df = df[df['Paymenttime'] >= df['Ordertime']] ``` ## 4.3RFM 计算模块 根据清洗后的订单数据计算每个客户的 RFM 指标 - **Recency**:分析日期与客户最近一次购买日期的天数差 - **Frequency**:客户的购买次数 - **Monetary**:客户的总消费金额 ```python # 3. RFM分析 print("\n3. RFM分析与异常值检测") analysis_date = pd.to_datetime('2018-11-08') rfm = df.groupby('BuyerName').agg({ 'EndTime': lambda x: (analysis_date - x.max()).days, 'OrderNumber': 'count', 'OrderAmount': 'sum' }).reset_index() rfm.columns = ['Customer', 'Recency', 'Frequency', 'Monetary'] ``` ## 4.4异常检测模块 使用 KNN 算法识别 RFM 值中的异常客户,提高分析准确性 ```python # 标准化和KNN检测 scaler = StandardScaler() rfm_scaled = scaler.fit_transform(rfm[['Recency', 'Frequency', 'Monetary']]) clf = KNN() clf.fit(rfm_scaled) rfm['OutlierScore'] = clf.decision_scores_ threshold = np.percentile(rfm['OutlierScore'], 95) rfm['IsOutlier'] = rfm['OutlierScore'] > threshold print(f"检测到异常值数量: {rfm['IsOutlier'].sum()}") rfm_clean = rfm[~rfm['IsOutlier']].copy() ``` ## 4.5数据分析模块 提供多种数据分析功能,包括描述性统计、相关性分析、回归分析和 PCA 因子分析 1. **描述性统计**:计算 RFM 指标的基本统计量(均值、标准差等) 2. **相关性分析**:分析 RFM 指标间的相关性 3. **回归分析**:建立 Frequency 与 Monetary 之间的线性回归模型 4. **PCA 因子分析**:降维分析,提取主要特征 ```python # 4. 分析可视化 print("\n4. 描述性分析和图形展示") print(rfm_clean[['Recency', 'Frequency', 'Monetary']].describe()) # 分布图 plt.figure(figsize=(15, 5)) plt.subplot(1, 3, 1) sns.histplot(rfm_clean['Recency'], bins=30, kde=True) plt.title('Recency Distribution') plt.subplot(1, 3, 2) sns.histplot(rfm_clean['Frequency'], bins=30, kde=True) plt.title('Frequency Distribution') plt.subplot(1, 3, 3) sns.histplot(rfm_clean['Monetary'], bins=30, kde=True) plt.title('Monetary Distribution') plt.tight_layout() plt.savefig(r'D:\java_xh\GraduationProject\REM-Data-Analysis\RFM_distributions.png') plt.close() # 箱线图 plt.figure(figsize=(10, 6)) sns.boxplot(data=rfm_clean[['Recency', 'Frequency', 'Monetary']]) plt.title('RFM Boxplot') plt.savefig(r'D:\java_xh\GraduationProject\REM-Data-Analysis\RFM_boxplot.png') plt.close() # 5. 数据挖掘分析 print("\n5. 数据挖掘分析") corr_matrix = rfm_clean[['Recency', 'Frequency', 'Monetary']].corr() print("相关性矩阵:\n", corr_matrix) plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0) plt.title('RFM Correlation Matrix') plt.savefig(r'D:\java_xh\GraduationProject\REM-Data-Analysis\RFM_correlation.png') plt.close() # 回归分析 X = rfm_clean['Frequency'].values.reshape(-1, 1) y = rfm_clean['Monetary'] reg = LinearRegression().fit(X, y) print(f"\n回归分析(Monetary ~ Frequency): R² = {reg.score(X, y):.3f}") # PCA分析 pca = PCA(n_components=2) rfm_pca = pca.fit_transform(rfm_scaled) print("\n因子分析(PCA):") print(f"解释方差比例: {pca.explained_variance_ratio_}") ``` ## 4.6结果导出模块 将分析结果和清洗报告导出到 Excel 文件 ```python # 6. 保存结果 print("\n6. 保存结果") # 新增:清洗报告 clean_report = pd.DataFrame({ '处理步骤': ['原始数据', '去除缺失值', '去除重复订单', '过滤异常值'], '记录数': [len(df), len(df.dropna()), len(df[~df.duplicated()]), len(rfm_clean)] }) clean_report.to_excel(r'D:\java_xh\GraduationProject\REM-Data-Analysis\数据清洗报告.xlsx', index=False) # 保留原有的RFM数据保存 rfm_clean.to_excel(r'D:\java_xh\GraduationProject\REM-Data-Analysis\RFM_清洗后数据.xlsx', index=False) ``` # 5.结果分析 ## 5.1数据分布特征(直方图分析) ![image-20250629210354318](C:\Users\huang\AppData\Roaming\Typora\typora-user-images\image-20250629210354318.png) ### 1.近期消费间隔(Recency) - **分布形态**: 直方图呈现**单峰密集分布**,大部分客户的 Recency 集中在 0 附近(横轴左侧高柱),说明核心客群 “最近一次消费时间” 距离分析日期(2018-11-08)极近,反映出业务的**复购周期短、客户活跃度高**的基础特征。 - **业务启示**: 密集的低 Recency 客群是 “高价值活跃客户” 的基础盘,需通过会员体系、专属权益持续绑定;少量高 Recency(间隔大)客户,需通过定向唤醒活动(如老客回归券)激活。 ### 2. 消费频率(Frequency) - **分布形态**: 直方图呈现**左高右低的长尾分布**,频率集中在 1-1.2 区间(高柱),少量客户频率达 2 。说明**绝大多数客户为 “低频复购” 模式**,仅小部分形成稳定复购习惯。 - **业务启示**: 针对高频客户(Frequency≥2),可打造 “VIP 俱乐部” 深化忠诚度;对低频客群,需通过 “消费满赠”“周期购优惠” 等策略提升复购频次。 ### 3. 消费金额(Monetary) - **分布形态**: 直方图呈现**快速衰减的长尾分布**,金额集中在 0-25 区间(高柱),但尾部延伸至 175+ 。说明**客单价分层明显**,“小额高频” 是主流,但存在少量 “大额消费” 客户。 - **业务启示**: 对小额客群,主推 “组合优惠”“满减套餐” 提升客单价;对大额客群,定制 “专属服务”(如一对一客服、高端产品推荐)巩固高消费习惯。 # 5.2离散程度与异常识别(箱线图分析) ![image-20250629210422030](C:\Users\huang\AppData\Roaming\Typora\typora-user-images\image-20250629210422030.png) ### 1.数据离散特征 - **Recency**:箱线图 “箱体极窄、 whisker(须线)极短”,说明客户 “最近消费间隔” 高度集中,业务复购周期稳定。 - **Frequency**:箱体近乎压缩为 “线”,且无明显离群点,印证 “消费频率普遍低、差异小” 的特征。 - **Monetary**:箱体宽大且存在**大量离群点(上须线外的圆点)**,说明客单价差异极大,高消费客户对 “总金额” 影响显著。 ### 2. 异常值的业务含义 Monetary 的离群点对应 “高额消费客户”,需区分两类场景: - **真实高价值**:如企业采购、高净值个人,需重点维护; - **异常消费**:如刷单、误操作,需结合订单详情排查(本分析已通过 KNN+IQR 过滤异常,此处离群点为真实高价值)。 ## 5.3指标关联规律(相关性热图分析) ![RFM_correlation](D:\java_xh\GraduationProject\REM-Data-Analysis\RFM_correlation.png) ### 1. 核心关联结论 - **Frequency ↔ Monetary**:相关系数 0.22(弱正相关),说明 “消费频率高的客户,总金额通常更高”,但关联度有限(非强线性关系)。 - **Recency 与其他指标**:无显著关联(图中未体现强相关),说明 “最近消费间隔” 独立于频率、金额,需单独作为复购意愿的判断依据。 ### 2. 业务场景验证 - **正向关联(Frequency-Monetary)**:可设计 “频次奖励”(如消费满 5 次解锁大额优惠券),利用弱相关特性,引导客户 “通过提频间接提额”。 - **独立维度(Recency)**:对 Recency 大的客户,需单独推送 “限时召回福利”(如 “30 天未购,专享 8 折券” ),弥补其与其他指标的弱关联。 # 6.综合业务应用建议 ## 6.1客户分层策略 | 分层类型 | RFM 特征 | 运营动作 | | :------------: | :------------------------: | :-------------------------------------: | | 核心活跃客群 | Recency 低、Frequency 中高 | 专属权益(生日礼、优先客服)+ 新品试购 | | 潜力培育客群 | Recency 低、Frequency 低 | 阶梯满减(如 “消费 2 次享 9 折”) | | 高价值沉睡客群 | Recency 高、Monetary 高 | 定向大额券(如 “满 500 减 150 回归券”) | ## 6.2数据驱动的迭代方向 - **Frequency 提升**:针对 Frequency=1 的客户,推送 “第二件半价” 券,利用 “弱正相关” 撬动 Monetary 增长; - **Recency 监控**:建立 “Recency 预警阈值”(如>30 天标记为沉睡),自动化触发唤醒策略; - **异常价值挖掘**:对 Monetary 离群点客户,人工回访确认需求,定制 “专属产品包” 延长高消费周期。 # 7.分析价值总结 通过 RFM 可视化分析,清晰呈现: - **业务健康度**:核心客群活跃(Recency 低),但整体复购频次低(Frequency 集中),需重点突破 “提频” 环节; - **营销抓手**:利用 Frequency 与 Monetary 的弱关联设计阶梯激励,通过 Recency 分层精准唤醒; - **风险点**:高 Monetary 离群点需持续关注,避免因订单异常或客户流失影响营收结构。 本分析为 “客户精细化运营” 提供数据依据,后续可结合业务周期(如大促、淡季)动态调整策略,持续验证 RFM 指标与营收的关联效果。