(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)
标签:分析,plt,pd,period,month,客户,cdata,价值,data
From: https://www.cnblogs.com/Xqiao/p/18185925