当前位置:   article > 正文

python聚类分析_python聚类分析商场顾客

['spending score(1-100)'] not in index

一、导入库

  1. import plotly as py
  2. from sklearn.cluster import KMeans
  3. import warnings
  4. import os
  5. warnings.filterwarnings("ignore")
  6. py.offline.init_notebook_mode(connected = True)
  7. # for basic mathematics operation
  8. import numpy as np
  9. import pandas as pd
  10. from pandas import plotting
  11. # for visualizations
  12. import matplotlib.pyplot as plt
  13. import seaborn as sns
  14. plt.style.use('fivethirtyeight')
  15. # for interactive visualizations
  16. #镜像安装pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
  17. import plotly.offline as py
  18. #upyter 中实时输出plotly.offline.iplot函数可在jupyter中内嵌显示plotly交互式图表,只需要在jupyter notebook开头写入plotly.offline.init_notebook_mode(connected=True)即可:
  19. from plotly.offline import init_notebook_mode, iplot
  20. import plotly.graph_objs as go
  21. from plotly import tools
  22. init_notebook_mode(connected = True)
  23. import plotly.figure_factory as ff

使用plotly显示数据详细信息

  1. #解决不显示问题
  2. #在cmd中输入:jupyter notebook --generate-config,可以看到生成一个路径
  3. # 找到对应路径下的文件,从中找到iopub_data_rate_limit,在去掉注释后多加好多0
  4. #jupyter notebook --NotebookApp.iopub_data_rate_limit=2147483647
  5. df=pd.read_excel(r'D:pythondatakmeans.xlsx')
  6. dat=ff.create_table(df.head())
  7. #py.plot会生成一个离线的html文件,里面放置图片。而py.iplot则直接在ipython notebook 里面生成图片。
  8. py.iplot(dat)

b1f52eaa68cd40e70ecbf5144186b4f9.png
  1. desc = ff.create_table(df.describe())
  2. py.iplot(desc)

f2caf7d9c358ee47ab03a6923c202db8.png
df.describe()

0c873eea6da3e951fb0997d299d0c743.png

查看是否存在空值

  1. df.isnull().any().any() --Flase
  2. df.isnull().sum()

095f03ef02fa2702bf7ba947d5a4dd27.png

f6d799896cc59b5a5bc8e3a73c5734a4.png

0e973c77047ed365522c33615b802a46.png

二、数据可视化

  1. #pylot使用rc配置文件来自定义图形的各种默认属性,称之为rc配置或rc参数。通过rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等
  2. plt.rcParams['figure.figsize'] = (15, 10)
  3. #第0轴沿着行的方向垂直向下,第1轴沿着列的方向水平延申。
  4. plotting.andrews_curves(df.drop('CustomerID',axis=1),'Genre')
  5. plt.title('Andrew Curves for Gender', fontsize = 20)
  6. plt.show()

fc7a6b8b00dd9a4c9793e9b8c2b8bed1.png

已经证明,安德鲁斯曲线能够保留均值,距离(最大为常数)和方差。 这意味着用函数表示的安德鲁斯曲线靠得很近,这表明相应的数据点也将靠得很近。

  1. import warnings
  2. warnings.filterwarnings('ignore')
  3. plt.rcParams['figure.figsize'] = (18, 8)
  4. plt.subplot(1, 2, 1)
  5. sns.set(style = 'whitegrid')
  6. sns.distplot(df['Annual Income (k$)'])
  7. plt.title('Distribution of Annual Income', fontsize = 20)
  8. plt.xlabel('Range of Annual Income')
  9. plt.ylabel('Count')
  10. plt.subplot(1, 2, 2)
  11. sns.set(style = 'whitegrid')
  12. sns.distplot(df['Age'], color = 'red')
  13. plt.title('Distribution of Age', fontsize = 20)
  14. plt.xlabel('Range of Age')
  15. plt.ylabel('Count')
  16. plt.show()

1ce82c894d08e3ff014413699ab6ecfa.png

在上面的图中,我们可以看到年收入和年龄的分布模式,通过查看这些图,
我们可以推断出一件事情,就是收入很少超过100美元的人很少。 大多数人的收入约为50-75美元。 另外,我们可以说收入最少的是20美元左右。
对客户进行推断。
购物中心的最常客年龄在30-35岁左右。 老年人年龄段是购物中心中访问频率最低的人群。 与中年人相比,青少年的人数较少。

  1. labels = ['Female', 'Male']
  2. size = df['Genre'].value_counts()
  3. colors = ['lightgreen', 'orange']
  4. #explode : 每一块饼图 离开中心距离,默认值为(0,0),就是不离开中心;
  5. explode = [0, 0.1]
  6. plt.rcParams['figure.figsize'] = (9, 9)
  7. #autopct = '%.2f%%':控制饼图内百分比设置,'%1.1f':指小数点后保留一位有效数值;
  8. plt.pie(size, colors = colors, explode = explode, labels = labels, shadow = True, autopct = '%.2f%%')
  9. plt.title('Gender', fontsize = 20)
  10. plt.axis('off')
  11. plt.legend()
  12. plt.show()

ca76bbe75d1862fc604f59cac5c42997.png

通过查看上面的饼图,该饼图说明了购物中心中性别的分布

有趣的是,女性以56%的份额居于领先地位,而男性则占44%的份额,尤其是当男性人口相对高于女性时,这是一个巨大的差距。

  1. plt.rcParams['figure.figsize'] = (15, 8)
  2. #调色板palette = 'hsv'
  3. #countplot对输入的数据分类,条形图显示各个分类的数量
  4. sns.countplot(df['Age'], palette = 'hsv')
  5. plt.title('Distribution of Age', fontsize = 20)
  6. plt.show()

4b97481a81f89bee1ae0c18fbf5fddd2.png

此图显示了有关购物中心中每个年龄段分布的更具交互性的图表,以更加了解购物中心中的访客年龄组。

通过查看上面的图表,可以看到27至39岁的年龄段非常频繁,但没有明确的模式,我们只能找到一些群体明智的模式,例如,相比之下,年龄较大的年龄段人群的频率较低 。 有趣的事实,没有相等。 年龄分别为18岁和67岁的购物中心中的访客数量。年龄在55、56、69、64岁的人们在购物中心中的访问频率非常低。 32岁的人们是购物广场中最常来的游客。

  1. plt.rcParams['figure.figsize'] = (20, 8)
  2. sns.countplot(df['Annual Income (k$)'], palette = 'rainbow')
  3. plt.title('Distribution of Annual Income', fontsize = 20)
  4. plt.show()

53e80b2a96ecc89161b3b95d0829104a.png

可以更好地解释每个收入水平的分布,有趣的是,购物中心的顾客的频率与他们的年收入从15美元到137K美元不等,非常相似。 购物中心中有更多的客户,他们的年收入分别为54k美元或78美元。

  1. plt.rcParams['figure.figsize'] = (20, 8)
  2. sns.countplot(df['Spending Score (1-100)'], palette = 'copper')
  3. plt.title('Distribution of Spending Score', fontsize = 20)
  4. plt.show()

51a9a52ba2c7a1c213d2e23687aff334.png

这是从购物中心的角度来看最重要的图表,因为对访问购物中心的顾客的消费分数有一些直觉和想法非常重要。

从总体上讲,我们可以得出结论,大多数客户的支出得分在35-60之间。 有趣的是,有些顾客的I消费得分也达到了99,这表明该购物中心可以满足各种顾客的需求,这些顾客在购物中心中的需求和要求各不相同。

  1. #pairplot多变量图
  2. sns.pairplot(df)
  3. plt.title('Pairplot for the Data', fontsize = 20)
  4. plt.show()

b59b30f4709d29e611d1e6df7bf5b30e.png
  1. plt.rcParams['figure.figsize'] = (15, 8)
  2. #cmap : matplotlib颜色表名称或对象,或颜色列表,可选从数据值到色彩空间的映射。
  3. #annot : 如果为True,则将数据值写入每个单元格中
  4. sns.heatmap(df.corr(), cmap = 'Wistia', annot = True)
  5. plt.title('Heatmap for the Data', fontsize = 20)
  6. plt.show()

76fac942c19ffbb36ccf0b1a045a544e.png

上面的图表显示了商城客户细分数据集的不同属性之间的相关性,该热图反映了橙色的关联性最高的颜色和黄色的关联性最低的特征。

我们可以清楚地看到这些属性之间没有很好的相关性,这就是为什么我们将继续使用所有功能。

  1. # Gender vs Spendscore性别vs支出得分
  2. #pip --default-timeout=100 install --upgrade seaborn==0.9.0 升级seaborn版本
  3. #pip install --upgrade seaborn==0.9.0 scipy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  4. #pip install --upgrade numpy==1.13.3 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  5. #pip install --upgrade scipy==0.19.1 scipy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  6. plt.rcParams['figure.figsize'] = (18, 7)
  7. sns.boxenplot(df['Genre'], df['Spending Score (1-100)'], palette = 'Blues')
  8. plt.title('Gender vs Spending Score', fontsize = 20)
  9. plt.show()

07e6c55d7484e45121136b2874cdbb7d.png

性别与支出得分之间的双变量分析,
显而易见,大多数男性的消费得分约为25,000美元至7万美元,而女性的消费得分约为35,000美元至75,000美元。 这再次表明女性是购物领袖。

  1. plt.rcParams['figure.figsize']=(18,7)
  2. sns.violinplot(df['Genre'],df['Annual Income (k$)'],palette='rainbow')
  3. plt.title('Gender vs Spending Score',fontsize=20)
  4. plt.show()

939c23e52195af226bd0f0180f2ebd1e.png

再次进行性别和年收入之间的双变量分析,以更好地可视化不同性别的收入。

报酬高于女性的男性人数更多。 但是,当年收入较低时,男性和女性人数相等。

  1. plt.rcParams['figure.figsize']=(18,7)
  2. #stripplot:分布散点图,按照x属性所对应的类别分别展示y属性的值,适用于分类数据。
  3. sns.stripplot(df['Genre'],df['Age'],palette='Purples',size=10)
  4. plt.title('Gender vs Spending Score',fontsize=20)
  5. plt.show()

208de8a5281034f931f4fa5082f7a9d1.png
  1. x = df['Annual Income (k$)']
  2. y = df['Age']
  3. z = df['Spending Score (1-100)']
  4. sns.lineplot(x,y,color='cyan')
  5. sns.lineplot(x,z,color='pink')
  6. plt.title('Annual Income vs Age and Spending Score',fontsize=20)
  7. plt.show()

691280e3809f6ae2565187be45415851.png

上面的年收入和年龄之间的图用蓝色线表示,年收入和支出得分之间的图用粉红色表示。 显示年龄和支出如何随年收入变化。

三、聚类分析

  1. x=df.iloc[:,[3,4]].values
  2. print(x.shape)

0008b9749a755ea2aae78bc42f2aac4e.png

K均值算法

肘部法寻找最佳聚类数

K_means参数的最优解是以成本函数最小化为目标

成本函数为各个类畸变程度之和

每个类的畸变程度等于该类重心与其内部成员位置距离的平方和

但是平均畸变程度会随着K的增大先减小后增大,所以可以求出最小的平均畸变程度

  1. from sklearn.cluster import KMeans
  2. wcss=[]
  3. for i in range(1,11):
  4. km=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)
  5. km.fit(x)
  6. wcss.append(km.inertia_)
  7. plt.plot(range(1,11),wcss)
  8. plt.title('The Elbow Method',fontsize=20)
  9. plt.xlabel('No.of Clusters')
  10. plt.ylabel('wcss')
  11. plt.show()

a5b712ad8a13a28d85dbc3fa7cc4e8bb.png

可视化集群

  1. km=KMeans(n_clusters=5,init='k-means++',max_iter=300,n_init=10,random_state=0)
  2. y_means=km.fit_predict(x)
  3. plt.scatter(x[y_means == 0, 0], x[y_means == 0, 1], s = 100, c = 'pink', label = 'miser')
  4. plt.scatter(x[y_means == 1, 0], x[y_means == 1, 1], s = 100, c = 'yellow', label = 'general')
  5. plt.scatter(x[y_means == 2, 0], x[y_means == 2, 1], s = 100, c = 'cyan', label = 'target')
  6. plt.scatter(x[y_means == 3, 0], x[y_means == 3, 1], s = 100, c = 'magenta', label = 'spendthrift')
  7. plt.scatter(x[y_means == 4, 0], x[y_means == 4, 1], s = 100, c = 'orange', label = 'careful')
  8. plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:, 1], s = 50, c = 'blue' , label = 'centeroid')
  9. plt.style.use('fivethirtyeight')
  10. plt.title('K Means Clustering', fontsize = 20)
  11. plt.xlabel('Annual Income')
  12. plt.ylabel('Spending Score')
  13. plt.legend()
  14. plt.grid()
  15. plt.show()

6a654e4ad834647165dd77064b4eaa93.png

该聚类分析使我们对购物中心中不同客户群有了非常清晰的了解。 根据他们的年收入和支出得分,显然有五个细分客户,即轻度客户,一般客户,目标客户,节俭客户,谨慎客户,据报这是确定购物中心客户群的最佳因素/属性。

层次聚类

层次聚类,也称为层次聚类分析,是一种将相似对象分组为聚类的算法。 端点是一组群集,其中每个群集彼此不同,并且每个群集中的对象彼此大致相似
使用树状图查找编号。 最佳集群
  1. import scipy.cluster.hierarchy as sch
  2. dendrogram = sch.dendrogram(sch.linkage(x, method = 'ward'))
  3. plt.title('Dendrogam', fontsize = 20)
  4. plt.xlabel('Customers')
  5. plt.ylabel('Ecuclidean Distance')
  6. plt.show()

c41a0ca8fc207691f8abd678d3205efa.png

可视化分层聚类的聚类

  1. from sklearn.cluster import AgglomerativeClustering
  2. #最初将每个对象看成一个簇,然后将这些簇根据某种规则被一步步合并,就这样不断合并直到达到预设的簇类个数。
  3. #n_clusters:一个整数,指定分类簇的数量
  4. #affinity:一个字符串或者可调用对象,用于计算距离。可以为:’euclidean’,’l1’,’l2’,’mantattan’,’cosine’,’precomputed’,如果linkage=’ward’,则affinity必须为’euclidean’
  5. #linkage:一个字符串,用于指定链接算法
  6. #ward:单链接single-linkage,采用dmin,两个簇的样本对之间距离的最小值。
  7. #‘complete’:全链接complete-linkage算法,采用dmax,两个簇的样本对之间距离的最大值。
  8. #‘average’:均连接average-linkage算法,采用davg,两个簇的样本对之间距离的平均值。
  9. hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward')
  10. #方法:
  11. #fit(X[,y]):训练样本
  12. #fit_predict(X[,y]):训练模型并预测每个样本的簇标记
  13. y_hc = hc.fit_predict(x)
  14. plt.scatter(x[y_hc == 0, 0], x[y_hc == 0, 1], s = 100, c = 'pink', label = 'miser')
  15. plt.scatter(x[y_hc == 1, 0], x[y_hc == 1, 1], s = 100, c = 'yellow', label = 'general')
  16. plt.scatter(x[y_hc == 2, 0], x[y_hc == 2, 1], s = 100, c = 'cyan', label = 'target')
  17. plt.scatter(x[y_hc == 3, 0], x[y_hc == 3, 1], s = 100, c = 'magenta', label = 'spendthrift')
  18. plt.scatter(x[y_hc == 4, 0], x[y_hc == 4, 1], s = 100, c = 'orange', label = 'careful')
  19. plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:, 1], s = 50, c = 'blue' , label = 'centeroid')
  20. plt.style.use('fivethirtyeight')
  21. plt.title('Hierarchial Clustering', fontsize = 20)
  22. plt.xlabel('Annual Income')
  23. plt.ylabel('Spending Score')
  24. plt.legend()
  25. plt.grid()
  26. plt.show()

830e6f5c3c4d32b2a74929991650773e.png

695a5c60d7f748cf0b7e055c8f442726.png

基于年龄的客户群

  1. x = df.iloc[:, [2, 4]].values
  2. x.shape

66d855dce2a0a87b0de78497e7322bb3.png
  1. from sklearn.cluster import KMeans
  2. wcss = []
  3. for i in range(1, 11):
  4. kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
  5. kmeans.fit(x)
  6. wcss.append(kmeans.inertia_)
  7. plt.rcParams['figure.figsize'] = (15, 5)
  8. plt.plot(range(1, 11), wcss)
  9. plt.title('K-Means Clustering(The Elbow Method)', fontsize = 20)
  10. plt.xlabel('Age')
  11. plt.ylabel('Count')
  12. plt.grid()
  13. plt.show()

5b9400b5edf48afb3baad010ed2de5bf.png
  1. kmeans = KMeans(n_clusters = 4, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
  2. ymeans = kmeans.fit_predict(x)
  3. plt.rcParams['figure.figsize'] = (10, 10)
  4. plt.title('Cluster of Ages', fontsize = 30)
  5. plt.scatter(x[ymeans == 0, 0], x[ymeans == 0, 1], s = 100, c = 'pink', label = 'Usual Customers' )
  6. plt.scatter(x[ymeans == 1, 0], x[ymeans == 1, 1], s = 100, c = 'orange', label = 'Priority Customers')
  7. plt.scatter(x[ymeans == 2, 0], x[ymeans == 2, 1], s = 100, c = 'lightgreen', label = 'Target Customers(Young)')
  8. plt.scatter(x[ymeans == 3, 0], x[ymeans == 3, 1], s = 100, c = 'red', label = 'Target Customers(Old)')
  9. plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 50, c = 'black')
  10. plt.style.use('fivethirtyeight')
  11. plt.xlabel('Age')
  12. plt.ylabel('Spending Score (1-100)')
  13. plt.legend()
  14. plt.grid()
  15. plt.show()

edf503b62b5f3708c3b0c4dad03ac6c5.png

根据我自己的直觉,通过查看客户年龄与他们相应的支出得分之间的上述聚类图,我将他们分为4个不同类别,即“常规客户”,“优先客户”,“老年人目标客户”,“年轻目标客户”。 然后,在获得结果之后,我们可以据此制定不同的营销策略和政策,以优化购物中心客户的消费得分

93b465f621b09d73b30d4c5381be9e09.png
  1. x = df[['Age', 'Spending Score (1-100)', 'Annual Income (k$)']].values
  2. km = KMeans(n_clusters = 5, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
  3. km.fit(x)
  4. labels = km.labels_
  5. centroids = km.cluster_centers_
  6. df['labels'] = labels
  7. trace1 = go.Scatter3d(
  8. x= df['Age'],
  9. y= df['Spending Score (1-100)'],
  10. z= df['Annual Income (k$)'],
  11. mode='markers',
  12. marker=dict(
  13. color = df['labels'],
  14. size= 10,
  15. line=dict(
  16. color= df['labels'],
  17. width= 12
  18. ),
  19. opacity=0.8
  20. )
  21. )
  22. df = [trace1]
  23. layout = go.Layout(
  24. title = 'Character vs Gender vs Alive or not',
  25. margin=dict(
  26. l=0,
  27. r=0,
  28. b=0,
  29. t=0
  30. ),
  31. scene = dict(
  32. xaxis = dict(title = 'Age'),
  33. yaxis = dict(title = 'Spending Score'),
  34. zaxis = dict(title = 'Annual Income')
  35. )
  36. )
  37. fig = go.Figure(data = df, layout = layout)
  38. py.iplot(fig)

14d3d687a2bf4c95368315257c0442a9.png

四、其他

  1. #样式美化
  2. #获取所有的自带样式
  3. print(plt.style.available)

370c6385f1f87d2d3ec689dad25014b7.png
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号