1. 分析背景

这是一份某电商平台的销售数据,数据包含2010年4月22到2014年7月24的销售数据。分析该销售数据,可以发现客户价值。

现利用KMeans聚类实现LRFM模型来分析客户的价值,便于客户分群,针对性推广,提高销售额。

LRFM模型定义:

  • L:会员创建日期距离距离2014年7月25的时间间隔(单位:月 )

  • R:会员最近一次购买时间距离2014年7月25的时间间隔(单位:月 )

  • F:会员购买次数

  • M:会员的总购买金额

2. 分析流程

3. 数据探索

3.1 导入相关包和读取数据

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
from sklearn import preprocessing
from datetime import datetime
from sklearn.cluster import KMeans

plt.rcParams['font.sans-serif'] = 'SimHei'
%matplotlib inline

# 读取数据
df = pd.read_csv(r'C:/Users/Administrator/Desktop/RFM分析1.csv',
                engine='python')
# 查看行列                
df.shape

输出:

3.2 查看表结构

从图可以看出这里的数据只有class2有缺失值,这里暂时不用提取这个指标,暂不清洗。


3.3 描述性分析查看

这里销售金额为负数的情况,数据清洗的时候得把这些异常值过滤。


4. 数据清洗

4.1 将销售额<0的过滤掉

# 销售金额有小于等于0的,直接过滤掉
# 这里有22542条数据
data = df[df['销售金额'] >0]
data.shape

输出:

4.2 会员创建日期、销售日期转换成datetime格式

data['会员创建日期'] = pd.to_datetime(data['会员创建日期'])
data['销售日期'] = pd.to_datetime(data['销售日期'])

# 查看是否转换成功
data.info()

输出:

5. 构建L、R、F、M指标

5.1 提取有用指标

  • L = 相对日期(这里我指定:2014年7月25) - 会员创建日期

  • R = 相对日期(这里我指定:2014年7月25) - 最晚(大)的销售日期

  • F = 用户购买的次数(这里针对流水号进行计数不同)

  • M = 用户购买的汇总金额
    代买实现:

# 计算L,再转换成月,这里转换成月,直接除于30天,保留两位小数
# L是最早的购买日期距离会员创建日期
data1 = data.groupby('UseId').agg({'会员创建日期': ['min'],
                                    '销售日期': ['min''max'], 
                                   '销售金额':['sum'],
                                  '流水号':['nunique']})
data1

输出:


删除一层列名,并重新进行命名:

# 删除第一层的列名
data1.columns = [col[1] for col in data1.columns]
# 重新命名列名
data1.columns = ['会员创建日期''最早销售日期''最晚销售日期''M''F']
data1

输出:


M、F指标已经构建完成。

5.2 购买L、R指标

# 先计算L,R,再转化成单位月
data1['L'] = datetime.strptime('2014-7-25''%Y-%m-%d') - data1['会员创建日期']
data1['R'] = datetime.strptime('2014-7-25''%Y-%m-%d') - data1['最晚销售日期']

# 将L、R转换成月做为单位
data1['L'] = data1['L'].apply(lambda x: round(x.days/30,3))
data1['R'] = data1['R'].apply(lambda x: round(x.days/30,3))
data1

输出结果:


提取有用的指标:

LRFM_data = data1[['L''R''F''M']]

6. 进行L、R、F、M数据的Z-Score转换

ss = preprocessing.StandardScaler()
ss_LRFM_data = ss.fit_transform(LRFM_data)
ss_LRFM_data

输出:

7. 使用KMeans进行聚类分析

# n_clusters聚类的个数
kmodel = KMeans(n_clusters=5, n_jobs=4)
kmodel.fit(ss_LRFM_data)
#查看聚类中心
kmodel.cluster_centers_ 

输出:


将结果转成DataFrame

client_level = pd.DataFrame(kmodel.cluster_centers_, 
                            index=['客户群1''客户群2''客户群3''客户群4''客户群5'],
                           columns=['L''R''F''M'])
client_level

输出:

8. 针对结果进行客户群的分类

  • L越大,代表注册会员时间距离指定时间(2014年7月25)越长,代表老客户,该指标越大越好。

  • R越小,代表购买时间距离指定时间(2014年7月25)越短,R越小越好。

  • F越大,代表会员的购买次数越多。

  • M越大,代表会员购买的金额越多。

客户群1分析:
L大,R小,F大,M较大,这里判断是重要发展客户。

客户群2分析:
L大,R大,F小,M较小,这里判断是重要挽留客户。

客户群3分析:
L小,R小,F小,M小,这里判断是低价值客户。

客户群4分析:
L大,R大,F小,M小,这里判断是一般价值客户。

客户群5分析:
L大,R小,F大,M大,这里判断是重要保持客户。


©著作权归作者所有:来自51CTO博客作者mb5fe18f5282239的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 原理+代码|Python基于主成分分析的客户信贷评级实战
  2. 客户端用不着的数据结构之并查集
  3. 1.5 万 Star!界面酷炫、简单易用的数据库开源客户端
  4. 从Gartner 最新“客户之选”报告,看国内外RPA的差异化竞争
  5. 使用PHP来获取客户端和服务端IP
  6. php生成一个不重复的会员号
  7. php实时推送系统消息给客户端的原理及详解
  8. 干掉Navicat!MySQL官方客户端到底行不行?

随机推荐

  1. Android: Sensors on Android 2.3 - Ging
  2. Android: Android NDK Overview
  3. Android 内存泄漏场景分析
  4. Android android:persistentDrawingCache
  5. Android 短信发送器
  6. Android7.0中文文档(API)-- ShareActionPro
  7. AndroidStudio使用教程(第一弹)
  8. Cocos2d-x C++调用Android弹出提示框
  9. Android 麦克风录音动画
  10. json解析android客户端源码