一、实验目的与要求
1、掌握使用numpy和pandas库处理数据的基本方法。
2、掌握使用RFM分析模型对客户信息进行特征提取的基本方法。
3、掌握对特征数据进行标准化处理的基本方法。
4、掌握使用Sklearn库对K-Means聚类算法的实现及其评价方法。
5、掌握使用matplotlib结合pandas库对数据分析可视化处理的基本方法。
二、实验内容
1、利用python中pandas等库完成对数据的预处理,并计算R、F、M等3个特征指标,最后将处理好的文件进行保存。
2、利用python中pandas等库完成对数据的标准化处理。
3、利用Sklearn库和RFM分析方法建立聚类模型,完成对客户价值的聚类分析,并对巨累结果进行评价。
4、结合pandas、matplotlib库对聚类完成的结果进行可视化处理。
三、实验步骤
1、数据预处理。
(1)导入所需要使用的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from datetime import datetime
(2)读取文件
datafile="/data/bigfiles/data2.csv"
data = pd.read_csv(datafile)
(3)查看数据的基本统计信息
# 整体信息
print(data.info())
(4)提取属性列
data.describe()
(5)处理异常数据
#提取需要的列
# 这里需要买家id,支付金额,支付时间,最后付款时间
data=data.filter(items=['买家会员名','打款商家金额','订单付款时间','数据采集时间'])
# 统计数据缺失的值
datas=data.isnull().sum()
data=data.dropna(axis=0,how='all')
print(datas)
# 查看完全重复行
result=data.duplicated()
df=data[result]
df
# 删除完全重复的行
data=data.drop_duplicates()
result=data.duplicated()
df=data[result]
df
#删除未付款的行
data.drop(data.loc[data['打款商家金额']=='0.00元'].index, inplace=True)
#统计付款次数
counts=data['买家会员名'].value_counts()
data['付款次数']=data['买家会员名'].map(counts)
data['打款商家金额']=data.打款商家金额.map(lambda x: round(float(x.replace('元','')),2))
#删除为nan的行
data=data.dropna(axis=0,how='any')
data['订单付款时间']=data.订单付款时间.map(lambda x: datetime.strptime( x,'%Y/%M/%d'))
# print(data)
data =data.groupby("买家会员名").agg({"打款商家金额":"sum","订单付款时间":"max","付款次数":"max"})
data
(6)计算R并进行标准化,更改列名
# 计算R
# 数据采集时间减去订单付款时间
exdata_date=datetime(2018,12,31)
start_date=datetime(2017,1,1)
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
(9)存储预处理后的文件
#跳过不用运行
# 去掉空格
data=data.rename(columns=lambda x:x.strip())
out_file_path='客户信息预处理.xlsx'
data.to_excel(out_file_path,index=False)
2、数据分析
(1)读取预处理后的文件
# 此处读取任然是跳过
datafile='客户信息预处理.xlsx'
data=pd.read_excel(datafile,encoding="utf-8")
data.head()
(2)利用肘部法确定k的值(图像展示)
# 标准化
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
# 用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_jobs=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
下面这段可以跳过
#跳过如果服务器挂掉
#out_file_path='客户类型文件.xlsx'
#KM_data.to_excel(out_file_path,index=False)
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)
4、分析评价
下面自己写咯!!