样本数据选取的是消费行为数据,包括4列:主键,最近一次消费间隔,消费频率,消费总金额。k-means算法在收敛时采用的是欧式距离算法。

代码如下:

import pandas as pd

In [2]:

inputfile = '/Users/frontc/book/ppdam/consumption_data.xls'

In [3]:

outputfile = '/Users/frontc/book/ppdam/data_type.xls'

In [4]:

k = 3  # 分成3类

In [5]:

iteration = 500  # 聚类最大循环次数

In [6]:

data = pd.read_excel(inputfile,index_col='Id')  # 读取样本数据

In [8]:

data[:3]  # 样本示例,r为最近一次消费时间间隔,f为消费频率,m为消费的总金额

Out[8]:

R F M
Id
1 27 6 232.61
2 3 5 1507.11
3 4 16 817.62

In [9]:

data_zs = 1.0 * (data - data.mean())/data.std()  #采用零均值法对数据进行标准化,标准化后的数据均值为0,标准差为1

In [10]:

from sklearn.cluster import KMeans  # 导入kmeans算法包

In [11]:

model = KMeans(n_clusters=k,n_jobs=4,max_iter=iteration)  #初始化模型.分成3类,并发4,最大迭代500次

In [12]:

model.fit(data_zs)  # 开始聚类

Out[12]:

KMeans(copy_x=True, init='k-means++', max_iter=500, n_clusters=3, n_init=10,
n_jobs=4, precompute_distances='auto', random_state=None, tol=0.0001,
verbose=0)

In [19]:

r = pd.concat([data,pd.Series(model.labels_,index=data.index)],axis=1)  # 将分类结果model.labels_打到数据data上去,axis=1代表横向连接
r.columns=list(data.columns)+[u'聚类类别'] # 给新加的列赋一个列名

In [23]:

r[:3]  # 查看一下

Out[23]:

R F M 聚类类别
Id
1 27 6 232.61 2
2 3 5 1507.11 2
3 4 16 817.62 1

In [20]:

r.to_excel(outputfile)  # 输出到excel中