首页 > 编程语言 >【Python数据分析课程设计】大数据分析—利用k-means 聚类分析对客户细分分析

【Python数据分析课程设计】大数据分析—利用k-means 聚类分析对客户细分分析

时间:2023-12-27 18:37:05浏览次数:35  
标签:数据分析 课程设计 plt means df 聚类 100 x1 聚类分析

一、选题的背景

在当今社会,大数据已经成为了企业决策的重要依据。通过对客户进行细分分析,企业可以更好地了解客户的需求和行为,从而制定更加精准的营销策略,提高市场竞争力。要达到的数据分析目标是通过对客户数据的分析,找出不同客户群体的特征和需求,为企业提供有针对性的营销建议。从社会、经济、技术、数据来源等方面来看,随着互联网和移动互联网的快速发展,企业和个人产生的数据量呈现爆炸式增长,这为大数据分析提供了丰富的数据来源;同时,大数据技术的发展也为数据分析提供了强大的技术支持。

二、大数据分析设计方案

1.本数据集的数据内容与数据特征分析   

本数据集的数据包括 客户ID,性别,客户年龄、客户年收入、客户的消费习惯。

  • 客户ID:唯一标识客户的整数;
  • 客户性别:区分男客户和女客户,使数据更加完整;
  • 客户年龄:客户的出生年份,表示客户的年龄;
  • 客户年收入:客户的年度收入,表示客户的消费能力;
  • 客户的消费习惯:客户的购买行为和偏好,包括购买的商品类别、购买次数、购买金额等。

数据特征分析主要包括以下几个方面:

  • 描述性统计分析:对客户年龄、客户年收入等数值型特征进行描述性统计分析,了解数据的基本情况;
  • 分类特征分析:对客户的消费习惯等分类特征进行分析,找出不同类别的特征分布情况;
  • 关联规则挖掘:分析不同特征之间的关联关系,如年龄与消费习惯的关系;
  • 聚类分析:通过聚类算法将客户划分为不同的群体,找出每个群体的特征和需求。

2.数据分析的课程设计方案概述(包括实现思路与技术难点)

  • 数据预处理:对原始数据进行清洗、缺失值处理、异常值处理等,为后续分析做好准备;
  • 描述性统计分析:使用Python的pandas库进行描述性统计分析,如计算平均值、中位数、众数等;
  • 聚类分析:使用K-means算法或层次聚类算法进行聚类分析,将客户划分为不同的群体;

三、数据分析步骤

1.数据源

数据来自kaggle:https://www.kaggle.com/datasets/govindkrishnadas/segment/data

2.数据清洗

导入库

#导入所需库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
plt.style.use('fivethirtyeight')
from sklearn.cluster import KMeans
import plotly as py
import plotly.graph_objects as go
import warnings
import os
warnings.filterwarnings('ignore')

读取数据集并显示数据集前5行

#读取数据集并显示前5行
df=pd.read_csv('C:/Users/Administrator/Desktop/客户细分 —— k-means 聚类分析/Segmentation_dataset.csv')
df.head()

 

显示数据集的行和列的数量

#显示行列数
df.shape

本数据及共有1599行和5列

查看数据集是否异常

df.info()

数据集由 1599 个观测值(行)和 5 个特征变量(列)组成,无缺失值,无异常值,无重复值。数据类型包括字符串和整数,明确区分了两者。这简化了我们的分析过程。

查看各列缺失值数量

#查看各列缺失值数量
df.isnull().sum()

 

各列的缺失值都为0,数据库中无缺失值

查看各列统计信息

#统计数据信息
df.describe()

 

由数据集生成的统计表,包括计数、平均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值等统计指标。

3.数据分析及可视化

查看数据分布

#查看数据分布
sns.pairplot(df)

对每一对列生成一个散点图和一个直方图,以展示它们之间的关系。

单独查看直方图

#单独查看直方图
plt.figure(1,figsize=(12,6))
n=0
for x in ['Age','Annual Income (k$)','Spending Score (1-100)']:
    n+=1
    plt.subplot(1,3,n)
    plt.subplots_adjust(hspace=0.5,wspace=0.5)
    sns.distplot(df[x],bins=20)
plt.show()

第一个柱状图显示了不同年龄段的人口密度,第二个柱状图显示了不同年龄段的支出得分(1-100),第三个柱状图显示了不同年龄段的平均年收入。从图中可以看出,随着年龄的增长,人口密度逐渐减少,而支出得分和平均年收入则呈现出不同的趋势。

样本数据中的性别比

#样本数据中的性别比
#计算每个性别的数量
df_gender_c = df['Gender'].value_counts()
#定义了标签、颜色等
p_lables = ['Female', 'Male']
p_color = ['lightcoral', 'lightskyblue']
p_explode = [0, 0.03]
# 绘图
#创建一个10x10的图形窗口
plt.figure(1,figsize=(10,10))
plt.pie(df_gender_c, labels=p_lables, colors=p_color, explode=p_explode, shadow=True, autopct='%.2f%%')
plt.title('Sex Ratio',fontsize=20)
plt.axis('off')
plt.legend(fontsize=14)
plt.legend()
plt.show()

从图中可以看出,女性占总人口的比例为71.17%,而男性则占28.83%。这个图形的意义是直观地展示出不同性别在总体中所占的比例,有助于了解人口结构中的性别差异。

年龄与年收入之间的关系

# 导入matplotlib.pyplot库,用于绘制图形
import matplotlib.pyplot as plt  
# 设置字体为SimHei,支持中文显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
# 设置负号正常显示
plt.rcParams['axes.unicode_minus'] = False
# 创建一个12x6英寸的图形窗口
plt.figure(1,figsize=(12,6))
# 遍历性别列表,分别绘制男性和女性的散点图
for gender in ['Male','Female']:  
    # 使用scatter函数绘制散点图,x轴为年龄,y轴为年收入,数据来源为df中性别为当前性别的数据
    plt.scatter(x='Age',y='Annual Income (k$)',data=df[df['Gender']==gender],
               s=100,alpha=0.5,label=gender)
# 设置x轴标签为“Age”,y轴标签为“Annual Income (k$)”
plt.xlabel('Age'),plt.ylabel('Annual Income (k$)') 
# 设置图形标题为“不同性别在年龄与年收入之间的关系”
plt.title('不同性别在年龄与年收入之间的关系')
# 显示图例
plt.legend() 
# 显示图形
plt.show()

从图像中可以看出,不同性别在年龄与年收入之间存在差异。这意味着不同性别在相同年龄段的年收入水平可能存在差异,或者不同性别在不同年龄段的年收入水平也存在差异。

年龄与消费得分之间的关系

#不同性别在年龄与年收入之间的关系
import matplotlib.pyplot as plt  
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.figure(1,figsize=(12,6))
for gender in ['Male','Female']:  
    plt.scatter(x='Age',y='Spending Score (1-100)',data=df[df['Gender']==gender],
               s=100,alpha=0.5,label=gender)
plt.xlabel('Age'),plt.ylabel('Spending Score (1-100)') 
plt.title('不同性别在年龄与消费得分之间的关系')
plt.legend() 
plt.show()

从图中可以看出,男性的消费得分普遍较高,而女性的消费得分则相对较低。随着年龄的增长,消费得分呈现出一定的波动性,但整体趋势是男性在年轻时消费得分较高,而女性在年长时消费得分较低。

年收入与消费得分之间的关系

#不同性别在年收入与消费得分之间的关系
plt.figure(1,figsize=(12,6))
for gender in ['Male','Female']:  
    plt.scatter(x='Annual Income (k$)',y='Spending Score (1-100)',data=df[df['Gender']==gender],
               s=100,alpha=0.5,label=gender)
plt.xlabel('Annual Income (k$)'),plt.ylabel('Spending Score (1-100)') 
plt.title('不同性别在年收入与消费得分之间的关系')
plt.legend() 
plt.show()

从图中可以看出,男性的消费得分普遍较高,而女性的消费得分相对较低。这可能反映了社会对男女角色和责任的不同期望和分配。

年龄与消费得分与年收入之间的分布

# 创建一个1行3列的图形,大小为12x6英寸
plt.figure(1,figsize=(12,6))
# 初始化计数器n
n=0
# 遍历三个类别(年龄、年收入和消费得分)
for cloname in ['Age','Annual Income (k$)','Spending Score (1-100)']:
    # 增加计数器n的值
    n+=1
    # 创建第n个子图
    plt.subplot(1,3,n)
    # 调整子图之间的水平间距和垂直间距
    plt.subplots_adjust(hspace=0.5,wspace=0.5)
    # 使用箱线图展示不同性别在当前类别的数据分布情况
    sns.boxenplot(x=cloname,y='Gender',data=df,palette='vlag')
    # 使用散点图展示不同性别在当前类别的数据分布情况
    sns.swarmplot(x=cloname,y='Gender',data=df,alpha=0.5)
    # 如果当前子图是第一个子图,则不显示y轴标签
    plt.ylabel('' if n==1 else '')
    # 如果当前子图是第三个子图,则不显示标题
    plt.title('不同性别的数据分布情况' if n==2 else '')
# 显示图形
plt.show()

这张图展示了不同性别在年龄、年度收入和支出得分方面的变化情况。从图中可以看出,男性在这些指标上的分布较为集中,而女性则呈现出一定的分散趋势。这可能意味着男性在这些方面的表现相对稳定,而女性则存在一定的波动性。

4.使用k- means聚类进行分析

根据年龄和消费得分进行细分

# 从数据框df中提取'Age'和'Spending Score (1-100)'两列的数据,并将其转换为numpy数组x1
x1 = df[['Age', 'Spending Score (1-100)']].iloc[:, :].values
# 导入KMeans类
from sklearn.cluster import KMeans
# 初始化一个空列表inertia,用于存储每次迭代的inertia值
inertia = []
# 循环尝试不同的聚类数量(从1到10)
for i in range(1, 11):
    # 创建KMeans对象,设置聚类数量、初始化方法、最大迭代次数、初始运行次数和随机种子
    km = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    # 使用KMeans对象对数据进行拟合
    km.fit(x1)
    # 将当前迭代的inertia值添加到inertia列表中
    inertia.append(km.inertia_)
# 创建一个大小为12x6的图形窗口
plt.figure(1, figsize=(12, 6))
# 绘制inertia值随聚类数量变化的曲线图
plt.plot(range(1, 11), inertia)
# 设置图形标题和坐标轴标签
plt.title('The Ebow Method', fontsize=20)
plt.xlabel('Number of Clusters')
plt.ylabel('inertia')
# 显示图形
plt.show()

利用The Elbow Method手肘法则由图可知最佳聚类个数是1.0

# 创建KMeans对象,设置聚类数量为4,初始化方法为'k-means++',最大迭代次数为500,初始运行次数为10,随机种子为0
km = KMeans(n_clusters=4, init='k-means++', max_iter=500, n_init=10, random_state=0)
# 使用KMeans模型对数据x1进行拟合,并预测每个样本所属的簇
y_means = km.fit_predict(x1)
# 创建一个大小为16x8的图形窗口
plt.figure(1, figsize=(16, 8))
# 绘制属于簇0的样本点,颜色为蓝色,标签为'1',透明度为0.6
plt.scatter(x1[y_means == 0, 0], x1[y_means == 0, 1], s=200, c='blue', label='1', alpha=0.6)
# 绘制属于簇1的样本点,颜色为橙色,标签为'2',透明度为0.6
plt.scatter(x1[y_means == 1, 0], x1[y_means == 1, 1], s=200, c='orange', label='2', alpha=0.6)
# 绘制属于簇2的样本点,颜色为粉色,标签为'3',透明度为0.6
plt.scatter(x1[y_means == 2, 0], x1[y_means == 2, 1], s=200, c='pink', label='3', alpha=0.6)
# 绘制属于簇3的样本点,颜色为紫色,标签为'4',透明度为0.6
plt.scatter(x1[y_means == 3, 0], x1[y_means == 3, 1], s=200, c='purple', label='4', alpha=0.6)
# 绘制聚类中心点,颜色为红色,标签为'5',透明度为0.6
plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=200, c='red', label='5', alpha=0.6)
# 设置y轴标签为'Spending Score (1-100)',x轴标签为'Age'
plt.ylabel('Spending Score (1-100)'), plt.xlabel('Age')
# 显示图例
plt.legend()
# 显示图形
plt.show()

由图可知蓝色代表第一个簇,橙色代表第二个簇,粉红色代表第三个簇,紫色代表第四个簇。红色还用于表示聚类中心。可以了解不同颜色点在年龄和消费得分上的分布情况,以及它们所属的簇和聚类中心。

另两个的细分如上

使用KMeans算法对数据进行聚类,并绘制3D散点图展示聚类结果

#使用KMeans算法对数据进行聚类,并绘制3D散点图展示聚类结果
# 创建KMeans算法实例,设置聚类数量为6,初始化方法为'k-means++',运行次数为10,最大迭代次数为300,容差为0.0001,随机种子为100,使用'elkan'算法
algorithm = (KMeans(n_clusters=6, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=100, algorithm='elkan'))
# 使用算法对数据x3进行拟合
algorithm.fit(x3)
# 获取聚类标签
labels = algorithm.labels_
# 获取聚类中心
centroids = algorithm.cluster_centers_
# 将聚类标签添加到原始数据框df中
df['label'] = labels
# 创建3D散点图,x轴为年龄,y轴为消费得分(1-100),z轴为年收入(k$),根据聚类标签设置颜色和大小,同时设置线条颜色和宽度,透明度为0.8
trace1 = go.Scatter3d(
    x=df['Age'],
    y=df['Spending Score (1-100)'],
    z=df['Annual Income (k$)'],
    mode='markers',
    marker=dict(
        color=df['label'],
        size=5,
        line=dict(
            color=df['label'],
            width=5
        ),
        opacity=0.8
    )
)
# 定义绘图布局,设置高度、宽度、标题和坐标轴标题
data = [trace1]
layout = go.Layout(
    height=1000,
    width=1000,
    title='Clusters!',
    scene=dict(
        xaxis=dict(title='Age'),
        yaxis=dict(title='Spending Score (1-100)'),
        zaxis=dict(title='Annual Income (k$)')
    )
)
# 创建绘图对象,传入数据和布局
fig = go.Figure(data=data, layout=layout)
# 离线显示绘图结果
py.offline.iplot(fig)

图中的每个彩色小点代表一个观察值,它们在X轴和Y轴上的位置分别表示"年龄"和"年度收入(千美元)"在Z轴的位置上表示消费得分。通过观察这些小点的密度和大小,我们可以了解到数据在这三个维度上的分布情况。

轮廓系数

# 导入轮廓系数计算函数
from sklearn.metrics import silhouette_score
# 初始化一个空列表,用于存储每个聚类数量对应的轮廓系数
score = []
# 遍历聚类数量从2到9
for i in range(2, 10):
    # 使用KMeans算法对数据x1进行聚类,聚类数量为当前循环的变量i
    model = KMeans(n_clusters=i).fit(x1)
    # 计算聚类结果的轮廓系数,并将结果添加到score列表中
    score.append(silhouette_score(x1, model.labels_, metric='euclidean'))
# 绘制轮廓系数与聚类数量的关系图
plt.plot(range(2, 10), score)
plt.xlabel('Age')
plt.ylabel('Spending Score (1-100)')
plt.show()
# 创建KMeans聚类模型,设置聚类数量为6,初始化方法为'k-means++'
kmeans = KMeans(n_clusters=6, init='k-means++')
# 使用x1数据进行聚类
kmeans.fit(x1)
# 计算x1数据的轮廓系数,使用欧氏距离作为度量标准
print(silhouette_score(x1, kmeans.labels_, metric='euclidean'))

由图可知:年龄与消费得分之间的轮廓系数为0.37,接近于0,表示簇内外样本的距离相差不大,聚类效果一般。

5.完整程序源代码

  1 #导入库
  2 import numpy as np
  3 import pandas as pd
  4 import matplotlib.pyplot as plt
  5 %matplotlib inline
  6 import seaborn as sns
  7 plt.style.use('fivethirtyeight')
  8 from sklearn.cluster import KMeans
  9 import plotly as py
 10 import plotly.graph_objects as go
 11 import warnings
 12 import os
 13 warnings.filterwarnings('ignore')
 14 
 15 #读取数据集并显示前5行
 16 df=pd.read_csv('C:/Users/Administrator/Desktop/客户细分 —— k-means 聚类分析/Segmentation_dataset.csv')
 17 df.head()
 18 
 19 df.shape
 20 
 21 df.info()
 22 
 23 df.dtypes
 24 
 25 #查看各列缺失值数量
 26 df.isnull().sum()
 27 
 28 df.describe()
 29 
 30 #查看数据分布
 31 sns.pairplot(df)
 32 
 33 #单独查看直方图
 34 plt.figure(1,figsize=(12,6))
 35 n=0
 36 for x in ['Age','Annual Income (k$)','Spending Score (1-100)']:
 37     n+=1
 38     plt.subplot(1,3,n)
 39     plt.subplots_adjust(hspace=0.5,wspace=0.5)
 40     sns.distplot(df[x],bins=20)
 41 plt.show()
 42 
 43 #样本数据中的性别比
 44 #计算每个性别的数量
 45 df_gender_c = df['Gender'].value_counts()
 46 #定义了标签、颜色等
 47 p_lables = ['Female', 'Male']
 48 p_color = ['lightcoral', 'lightskyblue']
 49 p_explode = [0, 0.03]
 50 # 绘图
 51 #创建一个10x10的图形窗口
 52 plt.figure(1,figsize=(10,10))
 53 plt.pie(df_gender_c, labels=p_lables, colors=p_color, explode=p_explode, shadow=True, autopct='%.2f%%')
 54 plt.title('Sex Ratio',fontsize=20)
 55 plt.axis('off')
 56 plt.legend(fontsize=14)
 57 plt.legend()
 58 plt.show()
 59 
 60 # 导入matplotlib.pyplot库,用于绘制图形
 61 import matplotlib.pyplot as plt  
 62 # 设置字体为SimHei,支持中文显示
 63 plt.rcParams['font.sans-serif'] = [u'SimHei']
 64 # 设置负号正常显示
 65 plt.rcParams['axes.unicode_minus'] = False
 66 # 创建一个12x6英寸的图形窗口
 67 plt.figure(1,figsize=(12,6))
 68 # 遍历性别列表,分别绘制男性和女性的散点图
 69 for gender in ['Male','Female']:  
 70     # 使用scatter函数绘制散点图,x轴为年龄,y轴为年收入,数据来源为df中性别为当前性别的数据
 71     plt.scatter(x='Age',y='Annual Income (k$)',data=df[df['Gender']==gender],
 72                s=100,alpha=0.5,label=gender)
 73 # 设置x轴标签为“Age”,y轴标签为“Annual Income (k$)”
 74 plt.xlabel('Age'),plt.ylabel('Annual Income (k$)') 
 75 # 设置图形标题为“不同性别在年龄与年收入之间的关系”
 76 plt.title('不同性别在年龄与年收入之间的关系')
 77 # 显示图例
 78 plt.legend() 
 79 # 显示图形
 80 plt.show()
 81 
 82 #不同性别在年龄与年收入之间的关系
 83 import matplotlib.pyplot as plt  
 84 plt.rcParams['font.sans-serif'] = [u'SimHei']
 85 plt.rcParams['axes.unicode_minus'] = False
 86 
 87 plt.figure(1,figsize=(12,6))
 88 for gender in ['Male','Female']:  
 89     plt.scatter(x='Age',y='Spending Score (1-100)',data=df[df['Gender']==gender],
 90                s=100,alpha=0.5,label=gender)
 91 plt.xlabel('Age'),plt.ylabel('Spending Score (1-100)') 
 92 plt.title('不同性别在年龄与消费得分之间的关系')
 93 plt.legend() 
 94 plt.show()
 95 
 96 #不同性别在年收入与消费得分之间的关系
 97 plt.figure(1,figsize=(12,6))
 98 for gender in ['Male','Female']:  
 99     plt.scatter(x='Annual Income (k$)',y='Spending Score (1-100)',data=df[df['Gender']==gender],
100                s=100,alpha=0.5,label=gender)
101 plt.xlabel('Annual Income (k$)'),plt.ylabel('Spending Score (1-100)') 
102 plt.title('不同性别在年收入与消费得分之间的关系')
103 plt.legend() 
104 plt.show()
105 
106 # 创建一个1行3列的图形,大小为12x6英寸
107 plt.figure(1,figsize=(12,6))
108 # 初始化计数器n
109 n=0
110 # 遍历三个类别(年龄、年收入和消费得分)
111 for cloname in ['Age','Annual Income (k$)','Spending Score (1-100)']:
112     # 增加计数器n的值
113     n+=1
114     # 创建第n个子图
115     plt.subplot(1,3,n)
116     # 调整子图之间的水平间距和垂直间距
117     plt.subplots_adjust(hspace=0.5,wspace=0.5)
118     # 使用箱线图展示不同性别在当前类别的数据分布情况
119     sns.boxenplot(x=cloname,y='Gender',data=df,palette='vlag')
120     # 使用散点图展示不同性别在当前类别的数据分布情况
121     sns.swarmplot(x=cloname,y='Gender',data=df,alpha=0.5)
122     # 如果当前子图是第一个子图,则不显示y轴标签
123     plt.ylabel('' if n==1 else '')
124     # 如果当前子图是第三个子图,则不显示标题
125     plt.title('不同性别的数据分布情况' if n==2 else '')
126 # 显示图形
127 plt.show()
128 
129 # 从数据框df中提取'Age'和'Spending Score (1-100)'两列的数据,并将其转换为numpy数组x1
130 x1 = df[['Age', 'Spending Score (1-100)']].iloc[:, :].values
131 # 导入KMeans类
132 from sklearn.cluster import KMeans
133 # 初始化一个空列表inertia,用于存储每次迭代的inertia值
134 inertia = []
135 # 循环尝试不同的聚类数量(从1到10)
136 for i in range(1, 11):
137     # 创建KMeans对象,设置聚类数量、初始化方法、最大迭代次数、初始运行次数和随机种子
138     km = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
139     # 使用KMeans对象对数据进行拟合
140     km.fit(x1)
141     # 将当前迭代的inertia值添加到inertia列表中
142     inertia.append(km.inertia_)
143 
144 # 创建一个大小为12x6的图形窗口
145 plt.figure(1, figsize=(12, 6))
146 # 绘制inertia值随聚类数量变化的曲线图
147 plt.plot(range(1, 11), inertia)
148 # 设置图形标题和坐标轴标签
149 plt.title('The Ebow Method', fontsize=20)
150 plt.xlabel('Number of Clusters')
151 plt.ylabel('inertia')
152 # 显示图形
153 plt.show()
154 
155 # 创建KMeans对象,设置聚类数量为4,初始化方法为'k-means++',最大迭代次数为500,初始运行次数为10,随机种子为0
156 km = KMeans(n_clusters=4, init='k-means++', max_iter=500, n_init=10, random_state=0)
157 # 使用KMeans模型对数据x1进行拟合,并预测每个样本所属的簇
158 y_means = km.fit_predict(x1)
159 # 创建一个大小为16x8的图形窗口
160 plt.figure(1, figsize=(16, 8))
161 # 绘制属于簇0的样本点,颜色为蓝色,标签为'1',透明度为0.6
162 plt.scatter(x1[y_means == 0, 0], x1[y_means == 0, 1], s=200, c='blue', label='1', alpha=0.6)
163 # 绘制属于簇1的样本点,颜色为橙色,标签为'2',透明度为0.6
164 plt.scatter(x1[y_means == 1, 0], x1[y_means == 1, 1], s=200, c='orange', label='2', alpha=0.6)
165 # 绘制属于簇2的样本点,颜色为粉色,标签为'3',透明度为0.6
166 plt.scatter(x1[y_means == 2, 0], x1[y_means == 2, 1], s=200, c='pink', label='3', alpha=0.6)
167 # 绘制属于簇3的样本点,颜色为紫色,标签为'4',透明度为0.6
168 plt.scatter(x1[y_means == 3, 0], x1[y_means == 3, 1], s=200, c='purple', label='4', alpha=0.6)
169 # 绘制聚类中心点,颜色为红色,标签为'5',透明度为0.6
170 plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=200, c='red', label='5', alpha=0.6)
171 # 设置y轴标签为'Spending Score (1-100)',x轴标签为'Age'
172 plt.ylabel('Spending Score (1-100)'), plt.xlabel('Age')
173 # 显示图例
174 plt.legend()
175 # 显示图形
176 plt.show()
177 
178 x2=df[['Annual Income (k$)','Spending Score (1-100)']].iloc[:,:].values
179 from sklearn.cluster import KMeans
180 inertia=[]
181 for i in range(1,11):
182     km=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)
183     km.fit(x2)
184     inertia.append(km.inertia_)
185 plt.figure(1,figsize=(12,6))
186 plt.plot(range(1,11),inertia)
187 plt.title('The Ebow Method',fontsize=20)
188 plt.xlabel('Number of Clusters')
189 plt.ylabel('inertia')
190 plt.show()
191 
192 km = KMeans(n_clusters = 5, init = 'k-means++', max_iter = 500,n_init = 10,random_state=0)
193 y_means = km.fit_predict(x2)
194 plt.figure(1,figsize = (16,8))
195 plt.scatter(x2[y_means == 0,0],x2[y_means==0,1],s=200,c='blue', label='1', alpha=0.6)
196 plt.scatter(x2[y_means == 1,0],x2[y_means==1,1],s = 200,c='orange', label='2', alpha=0.6)
197 plt.scatter(x2[y_means == 2,0],x2[y_means==2,1],s = 200,c='pink', label='3', alpha=0.6)
198 plt.scatter(x2[y_means == 3,0],x2[y_means==3,1],s = 200,c='purple', label='4', alpha=0.6)
199 plt.scatter(x2[y_means == 5,0],x2[y_means==5,1],s = 200,c='green', label='5', alpha=0.6)
200 plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:, 1], s = 200,c='red', label='6', alpha=0.6)
201 plt.ylabel('Spending Score (1-100)'), plt.xlabel('Annual Income (k$)')
202 plt.legend()
203 plt.show()
204 
205 x3=df[['Age','Annual Income (k$)','Spending Score (1-100)']].iloc[:,:].values
206 from sklearn.cluster import KMeans
207 inertia=[]
208 for i in range(1,11):
209     km=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)
210     km.fit(x3)
211     inertia.append(km.inertia_)
212 plt.figure(1,figsize=(12,6))
213 plt.plot(range(1,11),inertia)
214 plt.title('The Elbow Method',fontsize=20)
215 plt.xlabel('Number of Clusters')
216 plt.ylabel('inertia')
217 plt.show()
218 
219 #使用KMeans算法对数据进行聚类,并绘制3D散点图展示聚类结果
220 # 创建KMeans算法实例,设置聚类数量为6,初始化方法为'k-means++',运行次数为10,最大迭代次数为300,容差为0.0001,随机种子为100,使用'elkan'算法
221 algorithm = (KMeans(n_clusters=6, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=100, algorithm='elkan'))
222 # 使用算法对数据x3进行拟合
223 algorithm.fit(x3)
224 # 获取聚类标签
225 labels = algorithm.labels_
226 # 获取聚类中心
227 centroids = algorithm.cluster_centers_
228 
229 # 将聚类标签添加到原始数据框df中
230 df['label'] = labels
231 # 创建3D散点图,x轴为年龄,y轴为消费得分(1-100),z轴为年收入(k$),根据聚类标签设置颜色和大小,同时设置线条颜色和宽度,透明度为0.8
232 trace1 = go.Scatter3d(
233     x=df['Age'],
234     y=df['Spending Score (1-100)'],
235     z=df['Annual Income (k$)'],
236     mode='markers',
237     marker=dict(
238         color=df['label'],
239         size=5,
240         line=dict(
241             color=df['label'],
242             width=5
243         ),
244         opacity=0.8
245     )
246 )
247 # 定义绘图布局,设置高度、宽度、标题和坐标轴标题
248 data = [trace1]
249 layout = go.Layout(
250     height=1000,
251     width=1000,
252     title='Clusters!',
253     scene=dict(
254         xaxis=dict(title='Age'),
255         yaxis=dict(title='Spending Score (1-100)'),
256         zaxis=dict(title='Annual Income (k$)')
257     )
258 )
259 # 创建绘图对象,传入数据和布局
260 fig = go.Figure(data=data, layout=layout)
261 # 离线显示绘图结果
262 py.offline.iplot(fig)
263 
264 # 导入轮廓系数计算函数
265 from sklearn.metrics import silhouette_score
266 # 初始化一个空列表,用于存储每个聚类数量对应的轮廓系数
267 score = []
268 # 遍历聚类数量从2到9
269 for i in range(2, 10):
270     # 使用KMeans算法对数据x1进行聚类,聚类数量为当前循环的变量i
271     model = KMeans(n_clusters=i).fit(x1)
272     # 计算聚类结果的轮廓系数,并将结果添加到score列表中
273     score.append(silhouette_score(x1, model.labels_, metric='euclidean'))
274 # 绘制轮廓系数与聚类数量的关系图
275 plt.plot(range(2, 10), score)
276 plt.xlabel('Age')
277 plt.ylabel('Spending Score (1-100)')
278 plt.show()
279 # 创建KMeans聚类模型,设置聚类数量为6,初始化方法为'k-means++'
280 kmeans = KMeans(n_clusters=6, init='k-means++')
281 # 使用x1数据进行聚类
282 kmeans.fit(x1)
283 # 计算x1数据的轮廓系数,使用欧氏距离作为度量标准
284 print(silhouette_score(x1, kmeans.labels_, metric='euclidean'))
285 
286 # 轮廓系数
287 from sklearn.metrics import silhouette_score
288 score = []
289 for i in range(2,10):
290     model = KMeans(n_clusters=i).fit(x2)
291     score.append(silhouette_score(x2, model.labels_, metric='euclidean'))  
292 plt.plot(range(2,10),score)
293 plt.xlabel('Annual Income (k$)')
294 plt.ylabel('Spending Score (1-100)')
295 plt.show()
296 kmeans = KMeans( n_clusters = 6, init='k-means++')
297 kmeans.fit(x1)
298 print(silhouette_score(x2, kmeans.labels_, metric='euclidean'))
299 
300 # 轮廓系数
301 from sklearn.metrics import silhouette_score
302 score = []
303 for i in range(2,10):
304     model = KMeans(n_clusters=i).fit(x3)
305     score.append(silhouette_score(x3, model.labels_, metric='euclidean'))
306 plt.plot(range(2,10),score)
307 plt.xlabel('Age')
308 plt.ylabel('Annual Income (k$)')
309 plt.show()
310 kmeans = KMeans( n_clusters = 6, init='k-means++')
311 kmeans.fit(x1)
312 print(silhouette_score(x3, kmeans.labels_, metric='euclidean'))

四、总结

在Python数据分析课程设计中,我们进行了大数据分析—客户细分分析。通过这个设计,我们学习了如何使用Python进行数据分析和挖掘,掌握了常用的数据分析和挖掘算法,提高了对大数据分析的理解和应用能力。我们对客户数据进行了清洗和预处理,包括处理缺失值、异常值等,确保数据的质量和准确性。我们使用聚类分析将客户划分为不同的群体,每个群体具有相似的购买行为和偏好。

1.通过对数据分析和挖掘,我们可以得到以下有益的结论:

客户细分分析可以帮助企业更好地了解客户需求,从而提供更加精准的产品和服务。

通过聚类分析,我们可以将客户划分为不同的群体,每个群体具有相似的购买行为和偏好。

2.在完成此设计过程中,我得到了以下收获:

学会了使用Python进行数据分析和挖掘,包括数据清洗、数据转换、数据可视化等技术。

掌握了常用的数据分析和挖掘算法,如聚类分析、关联规则分析、分类预测等。

学会了使用常用的数据分析工具和库,如Pandas、NumPy、Matplotlib、Scikit-learn等。

提高了对大数据分析的理解和应用能力,能够将理论知识应用到实际问题中。

标签:数据分析,课程设计,plt,means,df,聚类,100,x1,聚类分析
From: https://www.cnblogs.com/zhangwentao1234/p/17931174.html

相关文章

  • 大数据分析——学生成绩分析
    一、选题背景介绍本课题是对学生成绩的分析,本课题用到的数据是从美国的三所高中收集的,用来分析学生成绩和各个方面的关系和影响。二、数据分析的设计方案1.导入一些必要的包,为接下来的项目做准备2.对数据进行预处理,处理一些空数据和没必要的数据3.把数据分析后的结果用可视化......
  • 制造业数据分析的未来:如何应对未来挑战
    1.背景介绍制造业数据分析的未来是一个充满挑战和机遇的领域。随着数据的产生和收集量不断增加,制造业需要更加高效、智能化和可持续的数据分析方法来应对这些挑战。在这篇文章中,我们将探讨制造业数据分析的未来,以及如何应对未来的挑战。1.1制造业数据分析背景制造业数据分析的背景......
  • 【python爬虫课程设计】大数据分析———不同车辆类型不同零件的城市道路油耗、高速公
    一、选题背景随着社会经济的发展和人们生活水平的提高,汽车已经成为现代化生活中不可或缺的交通工具之一。同时,环保意识的提高也给汽车产业带来了新的挑战,例如减少汽车的油耗和减少尾气排放。在这样的背景下,通过分析不同车辆类型的城市道路油耗、高速公路油耗和二氧化碳排放量数......
  • 人工智能和云计算带来的技术变革:大数据分析的变革
    1.背景介绍大数据分析是指利用大规模数据集进行分析、处理和挖掘的过程。随着互联网、社交媒体、移动互联网等产业的快速发展,数据的产生和增长速度得到了显著提高。这些数据包括结构化数据(如数据库、表格等)和非结构化数据(如文本、图像、音频、视频等)。大数据分析可以帮助企业和组织......
  • 哪些数据分析工具很受欢迎?
    ......
  • 【Python爬虫课程设计】--二手房数据爬取+数据分析
    一、选题课程背景在当前的房地产市场中,二手房交易一直是一个备受关注的话题。通过对二手房市场的数据进行分析可以帮助我们了解房地产市场的发展趋势、价格变动、供需关系等重要信息。这种数据分析能够为政府制定相关政策、投资者做出决策、购房者选择合适房产等提供有价值的参考......
  • Python网络爬虫课程设计------亚马逊产品数据分析
    一、选题背景    随着电子商务在全球范围内的普及和扩展,亚马逊作为全球最大的电商平台之一,吸引了数百万的卖家和消费者。这使得对亚马逊平台上的产品进行数据分析变得至关重要。在亚马逊上,产品种类繁多,竞争激烈。为了在众多竞争对手中脱颖而出,需要对市场趋势、消费者需求......
  • 【python爬虫课程设计】大数据分析——共享单车使用量可视化分析
    一、选题的背景共享单车在当今社会中扮演着重要角色,对城市交通、环境、个人出行习惯等方面产生了显著影响。通过分析这些数据,可以了解共享单车对城市生活的影响,对交通拥堵、空气质量改善、促进健康出行提供便利。通过分析共享单车数据,可以了解技术创新在这一领域的应用情况,探索改......
  • 【Python数据分析课程设计】——员工离职原因大数据分析
    一、选题的背景    随着社会经济的发展和科学技术的进步,员工离职现象越来越普遍。员工离职不仅会影响企业的运营和发展,也会对员工的职业生涯产生影响。因此,探究员工离职的原因是十分必要的。本选题旨在通过数据分析,深入挖掘员工离职的原因,为企业管理者提供决策支持,同时帮......
  • 【python爬虫课程设计】掌上高考——高校数据爬取+数据可视化
    一、选题的背景选择此选题是因为掌上高考是一个提供本科院校信息的网站,通过爬取该网站的数据,可以获取到各个本科院校的相关信息,如学校名称、所在地、专业设置等。通过对这些数据进行分析和可视化,可以帮助学生更好地了解各个本科院校的情况,为他们的升学选择提供参考。预期目标是通......