聚类 python_利用python进行聚类分析

XX平台搭建了线下门店和用户的桥梁。用户在平台上搜索满意的门店,然后到店消费。门店通过平台引流获取用户。平台通过团购的提点(类似于CPS)获得收入。三方均各取所需。

商户是平台的收入来源方,为了健康地提升平台的收入。需要建立商户的价值评估模型,对商户进行分类,比较不同类别的商户价值,并制定相对应的策略。

商户的价值模型分为两部分:商户本身的价值和商户给平台带来的价值。

商户本身的价值用两个指标衡量:1)商户的“星级”;2)商户获取的“DAU”数。星级高或者DAU高对应的商户价值便高。

商户给平台带来的价值用一个指标衡量:通过交易提点给平台带来的收入。将这个指标进行处理后,得到“单DAU价值”这个指标(公式:收入/DAU)。

下面选取XX城市的某一特定类目数据,开始具体的代码处理流程解释:

代码涉及的所有模块引入

import pandas as pd

import numpy as np

from sklearn.cluster import KMeans

import matplotlib.pyplot as plt

导入数据

predata = pd.read_excel('shop_data.xlsx', sheet_name='工作表1') #读取原始文件

简单的数据查看

print(type(predata)) #

# 'score'对应星级 'DAU'对应DAU 'tg_income'对应团购收入

print(predata.columns) #(['shopid', 'shopname', 'score', 'DAU', 'tg_income'], dtype='object')

print(predata.head()) #查看前5行数据

print(predata.isna().sum()) #统计所有空值(NA)

explore = predata.describe(percentiles = [], include = 'all').T #基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等);T是转置,转置后更方便查阅

print(explore)

数据清洗

data = predata.dropna() #去除含有空值的行

data = data[['score', 'DAU', 'tg_income']] #只包含数字信息

数据标准化处理

data['DAU_values'] =0 #引入“单DAU价值”一列

data['DAU_values'] = data['tg_income'] / data['DAU']

data['DAU_values'] = data['DAU_values'].fillna(0) #DAU包含0值,除完后为NA

data = data[['score','DAU','DAU_values']]

data = (data - data.mean(axis=0))/(data.std(axis=0)) #z-score标准

调用k-means算法,进行聚类分析

kmodel = KMeans(n_clusters=5, n_jobs=4) #n_jobs是并行数,一般等于CPU数较好

kmodel.fit(data) #训练模型

#注意:n_clusters=5,“5”需要人为提前输入。具体输入值需要不断测试观察进行判断

结果输出

label = pd.Series(kmodel.labels_) # 各样本的类别

num = pd.Series(kmodel.labels_).value_counts() # 统计各样本对应的类别的数目

center = pd.DataFrame(kmodel.cluster_centers_) # 找出聚类中心

max = center.values.max()

min = center.values.min()

X = pd.concat([center, num], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别数目

X.columns = list(data.columns) + ['NUM'] # 表头加上一列

绘图(雷达图)

fig = plt.figure(figsize=(8,6))

ax = fig.add_subplot(111, polar=True) #polar=True 画圆形

feature = ['score','DAU','DAU_values']

center_num = X.values #

N = len(feature)

for i, v in enumerate(center_num):

# 设置雷达图的角度,用于平分切开一个圆面

angles = np.linspace(0, 2 * np.pi, N, endpoint=False)

# 为了使雷达图一圈封闭起来,需要下面的步骤

center = np.concatenate((v[:-1], [v[0]]))

angles = np.concatenate((angles, [angles[0]]))

# 绘制折线图

ax.plot(angles, center, 'o-', linewidth=2, label="NO.%d=%d(%d%%)" % (i + 1, v[-1],v[-1]*100/total))

# 填充颜色

ax.fill(angles, center, alpha=0.25)

# 添加每个特征的标签

ax.set_thetagrids(angles * 180 / np.pi, feature, fontsize=12)

# 设置雷达图的范围

ax.set_ylim(min - 0.1, max + 0.1)

# 添加标题

plt.title('SHOP_CLUSTERING', fontsize=20)

# 添加网格线

ax.grid(True)

# 设置图例

plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0), ncol=1, fancybox=True, shadow=True)

# 显示图形

plt.show()

数据输出

shop_data_output = 'shop_data_output.xls'

out = pd.concat([predata, label], axis=1)

out.to_excel(shop_data_output, index = False)

得到如下图(雷达图指标基于聚类的质心绘制):商户价值模型

将商户分为5类:DAU和DAU价值表现差,星级表现不错

DAU、DAU价值和星级表现均差

DAU和星级表现不错,DAU价值表现佳

DAU、星级和DAU价值表现均不错

DAU、星级表现不错,DAU价值表现佳

将上述5类商户进行业务描述:第一类商户定义为:发展类商户商户体量大(占比55%),具备较大的发展潜力空间,未来可以往“分类4”商户发展

可以通过“霸王餐”等用户体验活动,积累好评,提升星级,进而提升门店竞争力

不适合采购额外的线上流量第二类商户定义为:低价值商户不应投入过多的精力第三类商户定义为:超优质商户重点服务对象

具备“高客单价”或者“高访购率”特性

如果线下承载能力存在空余(或特殊时段空余),可以进行固定时间段线上营销活动,提升线上流量第四类商户定义为:优质商户提升服务质量,适当提升平均客单价,往高客单价发展

适度进行线上营销活动,提升线上流量第五类商户定义为:特殊商户这部分商户比较特殊,可能是大型连锁店或者网红店为主,需要特殊对待

另外,可以通过散点图查看数据分布情况(仅限于2、3维),代码为:

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

colors = ['#FF0000', '#FFFF00', '#0000FF','#FFA500','#32CD32']

c_list = [colors[label[i]] for i in range(total)]

plt.figure(figsize=(12, 7))

ax1 = plt.subplot(111,projection='3d')

x,y,z = data_num[:,0],data_num[:,1],data_num[:,2]

ax1.scatter(x, y, z, s=10, color=c_list)

ax1.set_title('Data of SHOP')

ax1.set_xlabel('score')

ax1.set_ylabel('DAU')

ax1.set_zlabel('DAU_values')

plt.show()

来自:WALT(淡然)得之坦然,失之淡然

你可能感兴趣的:(聚类,python)