欢迎来到CloudService的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

客户价值分析

(1)导入所需要使用的包

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

(2)读取文件

datafile="/data/bigfiles/data2.csv"
data = pd.read_csv(datafile)

(3)查看数据的基本统计信息

data.info()
len(data)
data.describe()

(4)提取属性列

data.columns
data.订单状态.unique()
data = data[data.订单状态 == '交易成功']
data
#提取需要的列
# 这里需要买家id,支付金额,支付时间,最后付款时间
data=data.filter(items=['买家会员名','打款商家金额','订单付款时间'])

(5)处理异常数据

# 统计数据缺失的值
datas=data.isnull().sum()
datas
# 查看完全重复行
result=data.duplicated()
df=data[result]
df
# 删除完全重复的行
data=data.drop_duplicates()
# 删除未付款的行
data.drop(data.loc[data['打款商家金额']=='0.00元'].index, inplace=True)
data['订单付款时间'] = data.订单付款时间.map(lambda x: datetime.strptime(x, '%Y/%m/%d'))
data.打款商家金额 = data.打款商家金额.map(lambda x: re.sub('元','',x))
data.打款商家金额 = data.打款商家金额.map(lambda x: float(x))
# print(data)
data =data.groupby("买家会员名").agg({"打款商家金额":"sum","订单付款时间":"max","买家会员名":"count"})
data = data.rename(columns = {'打款商家金额':'总金额','买家会员名':'付款次数'})

(6)计算R并进行标准化,更改列名

# 计算R
# 数据采集时间减去订单付款时间
exdata_date=datetime(2018,12,31)
start_date=datetime(2017,1,2)
data['R(最后一次消费时间)']=exdata_date-data['订单付款时间']
data

(7)计算F并进行标准化,更改列名

from math import ceil
# 计算最后一次消费事件和起始时间
period_day=data['订单付款时间']-start_date
#创建空列表统计月数
period_month=[]
for i in period_day:
    period_month.append(ceil(i.days/30))
# 第一次输出月数统计
print(period_month)
# 遍历清除0值
for i in range(0,len(period_month)):
    if period_month[i]==0:
        period_month[i]=1
# 第二次统计月数
print(period_month)
# 计算f
data['F(月平消费次数)']=data['付款次数']/period_month
data

(8)更改M为列名,对数据进行标准化

data['m(月平均消费金额)']=data['总金额']/period_month
data
# 标准化
cdata=data[['R(最后一次消费时间)','F(月平消费次数)','m(月平均消费金额)']]
# 修改索引
cdata.index = data.index
cdata
z_cdata=(cdata-cdata.mean())/cdata.std()
#重命名列名
z_cdata.columns=['R(标准化)','F(标准化)','m(标准化)']
z_cdata

(9)存储预处理后的文件(不运行)

data.to_csv('/data/bigfiles/client.csv')

(1)读取预处理后的文件(不运行)

data=pd.read('/data/bigfiles/client.csv')

(2)利用肘部法确定k的值(图像展示)

# 用SSE来记录每次聚集类后样本到中心的欧式距离
SSE=[]
# 分别聚类为1~9个类别
for k in range(1,9):
    estimator =KMeans(n_clusters=k)
    estimator.fit(z_cdata)
# 样本到最近聚类中心的距离平方之和
    SSE.append(estimator.inertia_)
#设置x轴数据
X=range(1,9)
#设置字体
plt.rcParams['font.sans-serif']=['SimHei']
#开始绘图
plt.plot(X,SSE,'o-')
plt.xlabel('k')
plt.ylabel('SSE')
plt.title("肘部图")
plt.show()

(3)建立KMeans模型

# 聚类分析
kmodel=KMeans(n_clusters=4,n_init=4,max_iter=100,random_state = 0)
kmodel.fit(z_cdata)

(4)输出各个簇的质心

#查看每条数据所属的聚类类别 
kmodel.labels_
#查看聚类中心坐标
kmodel.cluster_centers_

(5)存储客户类型文件

# 统计所属各个类别的数据个数
r1=pd.Series(kmodel.labels_).value_counts()
r2=pd.DataFrame(kmodel.cluster_centers_)
# 连接labels_与z_cdata
result=pd.concat([r2,r1],axis=1)
#重命名列名
result.columns=['R','F','M']+['类别']
result
# 连接labels_与z_cdata
KM_data=pd.concat([z_cdata,pd.Series(kmodel.labels_,index=z_cdata.index)],axis=1)
data1=pd.concat([data,pd.Series(kmodel.labels_,index=data.index)],axis=1)
#重命名列名
data1.columns=list(data.columns)+['类别']
KM_data.columns=['R','F','M']+['类别']
KM_data.head()
#买家会员名列与类名标签对应
KM_data['买家会员名']=KM_data.index

3、数据可视化(对每个类型客户标准化后的R、F、M数据分别进行图像展示)

# 分组统计求均值
kmeans_analysis =KM_data.groupby(KM_data['类别']).mean()
#重命名列名
kmeans_analysis.columns=['R','F','M']
kmeans_analysis
#绘制柱状图
kmeans_analysis.plot(kind ='bar',rot=0,yticks=range(-1,9))
#完善图表
plt.title("聚类结果统计柱状图")
plt.xticks(range(0,4),['第0类','第1类','第2类','第3类'])
plt.grid(axis='y',color='grey',linestyle='--',alpha=0.5)
plt.ylabel("R,F,M 3个指标均值")
plt.savefig("聚类结果统计柱状图",dpi=128)
posted on 2024-05-10 20:04  Cloudservice  阅读(306)  评论(0编辑  收藏  举报