通过Kmeans聚类算法分析行业价格给商品定价
作者:互联网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
电商中的数据维度有很多,各方各面都会有数据存在,通过对这些数据进行分析,我们就可以知道一些我们需要的信息。商品的定价对于电商销售来说有着关键的影响。比如定价多少会直接影响所获得的利益。定价太低也许销量有了却没有利润,定价太高有利润可惜卖不出去。只有合适的价格 ,才能获得市场中的一席之地。
本篇以彩妆行业下三级类目“粉饼”类目为例,数据来源是淘宝搜索“粉饼”关键词下,60%价格段销量排序的TOP400个商品。
一、聚类算法——Kmeans
Kmeans聚类算法,又叫K均值聚类算法。是一种迭代求解的聚类分析算法。预先将数据分成K组,随机选定K各对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离。把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
Kmeans算法是数据分析中常用或者说常见的算法,属于聚类算法之一,用于对不知道明确划分界限的数据分类。电商中通常用在客户分析,构建RFM模型。
二、使用步骤
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.externals import joblib
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
2.读入数据
代码如下:
data1= pd.read_csv(r'F:\灯具彩妆执行\彩妆\行业分析报告\数据\价格\粉饼.csv',encoding='utf-8')
3.数据检查及处理
data1.dtypes
data1["销售价最低"]=data1["销售价最低"].astype(np.int64)
data1["30天销售额"]=data1["30天销售额"].astype(np.int64)
查看数据类型,可得知我们的数据源中各个字段的数据类型,和共有多少个字段。将之后会用到的字段修改成方便数据处理的类型。
data1.info()
info函数同样可以做到这一点,不仅如此,info()还可以让我们知道这些字段中,哪些字段数据有缺失,从而让我们可以将这些数据进行处理(删减/填充)。
dt2 = data1[["宝贝id","销售价最低","30天销量"]]
dt2.describe()
describe()函数可以为我们计算出数据的数量、标准层、均值、四分位数以及最大最小值。可以更直观看出我们的数据是否有异常。这里我们看到30天销量为-1,显然是不正确的。
dt2 =dt2[(dt2['销售价最低']>0) & (dt2['30天销量']>0) ]
dt2.describe()
提取出所有销量>0的数据然后查看。
4.聚类分析
在确认数据没有问题后便可以开始着手进行聚类分析了。
sns.distplot(dt2["销售价最低"])
通过画核密度图我们可以大致看出市场价格情况:“粉饼”这一关键词下,销量前400的商品中大部分商品价格在50元左右,高价格段商品集中在150元左右。(这里y轴代表数据密度,是在原数据基础上数据归一化的结果)
x=dt2.iloc[:,1:3]
x.head()
s=StandardScaler()
x_scale = s.fit_transform(x)
x_scale = pd.DataFrame(x_scale,columns=x.columns,index=x.index)
x_scale.head()
一般情况下“数据标准化”是数据分析前数据处理的重要一部分,其作用是使数据处于同一数量级,免受量纲影响。未做数据标准化的数据会明显突出数值过大的指标,削弱数值小指标的影响。
scope = range(1,10)
sse = []
for k in scope:
kmeans = KMeans(n_clusters=k)
kmeans.fit(x_scale)
sse.append(kmeans.inertia_)
plt.xticks(scope)
sns.lineplot(scope,sse,marker='o')
Kmeans算法中,需要知道的一点是,Kmeans并不能自动的为我们决定将数据划分为几类,而是需要我们先决定将数据划分为几类,然后再去由Kmeans进行划分。但到底划分为几类虽然是由我们决定,却也不能随意决定。常用的方法是根据最小的SEE原则来决定最佳K值。
根据图像我们可以知道最合适的K值为3,即将我们的商品数据按价格分为三类。
在确定了这个K=3后,我们就可以正式对数据进行聚类。
# 正式定义模型
model1 = KMeans(n_clusters=3)
# 跑模型
model1.fit(x_scale)
# 需要知道每个类别有哪些参数
C_i = model1.predict(x_scale)
# 还需要知道聚类中心的坐标
Muk = model1.cluster_centers_
X = x_scale.values
print('质心:',model1.cluster_centers_)
print('标签:',model1.labels_)
print('SSE:',model1.inertia_)
print('迭代次数:',model1.n_iter_)
print('分值:',model1.score(x_scale))
# 画图
plt.scatter(X[:,0],X[:,1],c=C_i,cmap=plt.cm.Paired)
# 画聚类中心
plt.scatter(Muk[:,0],Muk[:,1],marker='*',s=60)
for i in range(3):
plt.annotate('中心'+str(i + 1),(Muk[i,0],Muk[i,1]))
plt.show()
很明显可以看出我们已经成功将商品数据根据价格划分为了三类。一般的通过聚类做人群划分时,我们可以在聚类后给原数据打标,将各数据处于哪一个分类中标记出来。但我们这里的最终目的是给商品定价,也就是说我们需要知道,市场的价格行情。因此还是用标准化前的数据更为直观。
# 正式定义模型
model1 = KMeans(n_clusters=3)
# 跑模型
model1.fit(x)
# 需要知道每个类别有哪些参数
C_i = model1.predict(x)
# 还需要知道聚类中心的坐标
Muk = model1.cluster_centers_
X = x.values
# 画图
plt.scatter(X[:,0],X[:,1],c=C_i,cmap=plt.cm.Paired)
# 画聚类中心
plt.scatter(Muk[:,0],Muk[:,1],marker='*',s=60)
for i in range(3):
plt.annotate('中心'+str(i + 1),(Muk[i,0],Muk[i,1]))
plt.show()
Muk
这样我们就可以直观的得到我们的结果。从图上可以清楚的看到结果将商品按价格和销量分了3类。我们可以看出“粉饼”关键词下,前400的商品绝大部,30天销量低于50000,从聚类中心得知这部分商品的价格中心约为78元,销量中心在1929左右。在商品销量大于50000的第二类商品中,其价格中心为约54元,销量中心约在86593。最后一类商品销量超过350000极为稀少不做参考。在得到这些结果后,再根据我们自己产品的成本、特点、利润,定一个合适的价格就容易很多了。
总结
提示:
以上就是今天要讲的内容,本文以给产品定价为实例,通过对市场上“粉饼”关键词下60%价格段销量前400商品的价格、销量数据进聚类分析,该段商品又细分3类,并找出其聚类中心,得到符合市场情况的商品价位。方便对自己产品定价提供较高参考价值。
标签:plt,model1,Kmeans,算法,聚类,dt2,数据,Muk 来源: https://blog.csdn.net/qq_40195798/article/details/112625052