python大数据作业-客户价值分析-实训头歌

一、实验目的与要求

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、分析评价

下面自己写咯!!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年4月23日
下一篇 2023年4月23日

相关推荐