k-means实战-RFM客户价值分群

不问归期 提交于 2019-12-05 12:03:49

数据挖掘的十大算法

基本概念

 

 

 

 

 

 

 

 

 导入数据集到mysql数据库中

总共有940个独立消费数据

 

 

 

K-Means 算法

K-Means 算法是一个聚类算法。你可以这么理解,最终我想把物体划分成 K 类。假设每
个类别里面,都有个“中心点”,即意见领袖,它是这个类别的核心。现在我有一个新点
要归类,这时候就只要计算这个新点与 K 个中心点的距离,距离哪个中心点近,就变成了
哪个类别。

引入模块

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import pymysql

连接数据库:

conn = pymysql.connect(host='localhost',user='root',password='123',db='db2',port=3306)
rfm = pd.read_sql('select * from consumption_data',con=conn)
conn.close()

查看详情:

rfm.info()
rfm.head()

 

"""选取RFM 三列"""
new_rfm = rfm.loc[:,['R','F','M']]
"""调用KMeans算法 进行聚类 ,设定为8类"""
clf = KMeans(n_clusters=8,random_state=0)
"""对数据进行拟合,训练模型"""
clf.fit(new_rfm)

 

"""查看一下分类的结果,返回的数组中每个数字对应了rfm中每一行"""
print(len(clf.labels_))
se = pd.Series(clf.labels_)
se.value_counts()

 

new_rfm['label']=clf.labels_
new_rfm.head()

 

"""如何将分类好的数字标签,和RFM 模型中的客户类别匹配起来?"""
"""查看每个类别的中心点,用其构造Dataframe来代表整个数据集"""
clf.cluster_centers_
r = pd.DataFrame(clf.cluster_centers_,columns=['R','F','M'])print(r)

 

"""分别计算每个属性值的中位数,代表整个属性的中位水平"""
rmd = r['R'].median()
fmd = r['F'].median()
mmd = r['M'].median()
cluster=[]
for i in range(len(r)):
    if r.iloc[i,0] > rmd and r.iloc[i,1] >fmd and r.iloc[i,2] >mmd:
        cluster.append('高价值客户')
    elif r.iloc[i,0] < rmd and r.iloc[i,1] > fmd and r.iloc[i,2] >mmd:
        cluster.append('重点保持客户')
    elif r.iloc[i,0] > rmd and r.iloc[i,1] < fmd and r.iloc[i,2] >mmd:
        cluster.append('重点发展客户')
    elif r.iloc[i,0] < rmd and r.iloc[i,1] < fmd and r.iloc[i,2] > mmd:
        cluster.append('重点挽留客户')
    elif r.iloc[i,0] > rmd and r.iloc[i,1] > fmd and r.iloc[i,2] < mmd:
        cluster.append('一般价值客户')
    elif r.iloc[i,0] < rmd and r.iloc[i,1] > fmd and r.iloc[i,2] < mmd:
        cluster.append('一般保持客户')
    elif r.iloc[i,0] > rmd and r.iloc[i,1] < fmd and r.iloc[i,2] < mmd:
        cluster.append('一般发展客户')
    else:
        cluster.append('潜在客户')

cluster

 

 

"""将贴好的标签,匹配到每一行数据"""
r['客户分类']=cluster

 

s = r.reset_index()
print(s)

 

new_rfm.head()

 

# result = pd.merge(new_rfm,r['客户分类'],how='inner',left_on='label',right_index=True)# 用右表的索引做连接键
result = pd.merge(new_rfm,s[['index','客户分类']],how='inner',left_on='label',right_on='index')

result.sort_index()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!