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(淡然)得之坦然,失之淡然