0
点赞
收藏
分享

微信扫一扫

电商经销商年度消费业务分析实验报告

南陵王梁枫 2022-04-21 阅读 95
  1. 实验概述
    1. 实验目标和主要内容

实验目标:练习掌握数据预处理;

练习掌握模型训练;

练习掌握聚类分析。

开发平台:PyCharm Community Edition 2021.3.2 x64

语言:Python

主要内容:

  1. 根据电商经销商年度消费业务的数据,通过K-means聚类算法,对数据集进行训练,进行无监督学习,将消费者进行分类。
  2. 实验设计
    1. 关键算法分析

算法1:加载数据

主要代码:

算法2:数据探索

   根据数据分布,对新鲜产品的年度支出、奶制品上的消费、零食上的消费、冷冻食品消费、洗涤和纸的消费、熟食消费画出直方图,对顾客购买渠道、顾客所属地区画出饼状图

主要代码:

  • 直方图

 

(另外8个直方图类似)

  • 饼状图

(顾客所属地类似)

算法3:画出相关关系热力图

主要代码:

算法4:画图观察购买渠道和除所属地区外其他特征的关联性,再画图观察所属地区和除购买渠道外其他特征的关联性

主要代码:

  • 六种购买渠道和其他特征的关联性分析

(其余5个类似)

  • 所属地区和其他六种特征的关联性分析

(其余5个类似)

算法5:根据相关关系热力图,画出相关关系>0.5的特征之间的关系

主要代码:

算法6:特征工程,构造数据集

主要代码:

算法7:数据预处理:标准化。(Fresh列到Delicassen列的数据数量级大小差别很大,在聚类前需要进行标准化。)

主要代码:

算法8:模型训练和模型确定,根据轮廓系数求解最佳初始聚类个数,综合轮廓系数法可以选取k=2

主要代码:

算法9:利用K-means算法对数据进行分类,并画出各类别占比饼状图

主要代码:

算法10:画出各类别消费情况柱状图

主要代码:

  1. 程序运行结果分析

1.对新鲜产品的年度支出、奶制品上的消费、零食上的消费、冷冻食品消费、洗涤和纸的消费、熟食消费画出直方图,对顾客购买渠道、顾客所属地区画出饼状图(展示部分图形如下):

   图表1新鲜产品的年度支出分布直方图

(分析上图得出新鲜产品的年度支出基本分布在20000以下。)

图表2奶制品上的消费分布直方图

(分析上图得出奶制品上的消费基本分布在10000以下。)

图表3顾客购买渠道分布饼状图

(分析上图得出顾客主要通在渠道1购买商品,渠道2购买商品的顾客只有渠道1的一半。)

图表4顾客所属地区分布饼状图

(分析上图得出顾客主要分布在地区3,少部分顾客分布在地区1,地区2则最少。)

2. 画出相关系数热力图:

图5 各个特征之间相关关系热力图

    (上图表明,相关关系R>0.5的特征有:“购买渠道和零食上的消费”,“购买渠道和洗涤和纸的消费”,“奶制品上的消费和零食上的消费”,“奶制品上的消费和洗涤和纸的消费”,“零食上的消费和洗涤和纸的消费”。)

3. 画图观察购买渠道和除所属地区外其他特征的关联性,再画图观察所属地区和除购买渠道外其他特征的关联性。图6-图7为购买渠道和除所属地区外其他特征的关联性,图8-图9为所属地区和除购买渠道外其他特征的关联性。):

图表6购买渠道和新鲜产品的年度支出数据的关联性

(分析上图可知,渠道1新鲜产品的年度支出主要分布在0-20000,渠道2新鲜产品的年度支出主要分布在0-15000。)

图表7购买渠道和奶制品上的消费数据的关联性

(分析上图可知,渠道1奶制品上的消费主要分布在0-5000,渠道2奶制品上的消费主要分布在5000-15000。)

图表8所属地区和新鲜产品的年度支出数据的关联性

(分析上图得知,地区1、2、3新鲜产品的年度支出均主要分布在0-20000。)

图表9所属地区和奶制品上的消费数据的关联性

(分析上图得知地区1、2、3奶制品上的消费均主要分布在0-10000,但地区3奶制品上的消费超过20000的也占有一定比例。)

通过分析图6-图9,不难发现,不同购买渠道和所属地区同一食品的消费金额差别并不大。

4.根据相关关系热力图,画出除购买渠道和所属地区以外其他的相关关系>0.5的特征之间的关系(图10-图11):

图表10“奶制品上的消费和零食上的消费”与“洗涤和纸的消费”之间的联系

(图10中,横轴为奶制品上的消费,蓝色线为奶制品上的消费和零食上的消费之间的联系,红色线为奶制品上的消费和洗涤和纸的消费之间的联系,从图中可以看出,奶制品上的消费为50000左右的人在零食上的消费和洗涤和纸的消费均最高。)

图表11零食上的消费与“洗涤和纸的消费”之间的联系

(图11中,横轴为零食上的消费,蓝色线为洗涤和纸的消费和零食上的消费之间的联系,图中可以看出,零食上的消费越高,洗涤和纸的消费越高。)

5. 模型训练和模型确定,根据轮廓系数求解最佳初始聚类个数,画出所有得分的柱状图(图12):

图表12所有聚类个数轮廓系数得分的柱状图

(上图当k=2时得分最高,所以综合轮廓系数法可以选取k=2。)

6. 利用K-means算法对数据进行分类,并画出各类别占比饼状图(图13):

图表13各类别占比饼状图

图13中,两种类别占比相差不大。

7. 画出各类别消费情况柱状图(图14):

图表14各类别消费情况柱状图

(对图14分析:第一类消费者新鲜产品的消费很高,奶制品、零食和冷冻产品消费一般,洗涤和纸和熟食消费很低;第二类消费者奶制品和零食的消费很高,新鲜产品、冷冻产品和洗涤和纸消费一般,熟食消费很低。所以,应该增加对第一类消费者新鲜产品的推送,减少对第一类消费者洗涤和纸和熟食的推送;应该增加对第二类消费者奶制品和零食的推送,减少对第二类消费者熟食的推送。)

  1. 总结

4.1  实验的难点和关键点

  1. 该实验要求对数据的绘图分析,例如对各种数据的直方图、饼状图、热力图、相关关系图和柱状图等进行分析而得出结论。
  2. 由于Fresh列到Delicassen列的数据的数量级大小差别很大,在聚类前如果不进行数据的标准化,结果将会有很大的偏差。
  3. 对于最佳聚类数量的选取需要簇从2-9分别训练模型,计算轮廓系数,得出最佳聚类数量。
  4. 对庞大繁杂的数据通过python各种数据分析工具进行分析处理而得出需要的结论。
    1.  心得体会
  1. 掌握了对多种图像如直方图、饼状图、相关系数图等的绘制和分析。
  2. 学习并理解领会到了K均值聚类分析的优缺点和适用领域及范围。
  3. 学会了如果数据的数量级差别很大,则需要在聚类分析之前对数据进行预处理(标准化,归一化)。

附录(完整代码)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import Normalizer
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 解决负号无法显示问题
plt.rcParams['axes.unicode_minus'] = False

# 第一步: 加载数据
data = pd.read_csv('Wholesale customers data.csv')
print(data.head())
print(data.describe())
print(data.info())
# 第二步: 数据探索
# 新鲜产品的年度支出分布,直方图
plt.hist(data['Fresh'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 奶制品上的消费分布直方图
plt.hist(data['Milk'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 零食上的消费直分布方图
plt.hist(data['Grocery'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 冷冻食品消费直分布方图
plt.hist(data['Frozen'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 洗涤和纸的消费分布直方图
plt.hist(data['Detergents_Paper'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 熟食消费分布直方图
plt.hist(data['Delicassen'], bins=20, edgecolor='k', alpha=0.5)
plt.show()
# 顾客购买渠道饼状图
channel = data['Channel'].value_counts()
print(channel)
x = channel.index
y = channel.values
print(x, y)
plt.figure(figsize=(10, 7))
plt.pie(y, labels=x, autopct='%.1f %%', startangle=90)
plt.xlabel('顾客购买渠道占比')
plt.show()
# 顾客所属地区饼状图
region = data['Region'].value_counts()
print(region)
x = region.index
y = region.values
print(x, y)
plt.figure(figsize=(10, 7))
plt.pie(y, labels=x, autopct='%.1f %%', startangle=90)
plt.xlabel('顾客所属地区占比')
plt.show()
# 相关关系,热力图 annot:True 热力图中每个格子写入数据
sns.heatmap(data.corr(), cmap='Wistia', annot=True)
plt.show()
# 购买渠道和新鲜产品的年度支出数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Fresh'], palette='hsv')
plt.show()
# 购买渠道和奶制品上的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Milk'], palette='hsv')
plt.show()
# 购买渠道和零食上的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Grocery'], palette='hsv')
plt.show()
# 购买渠道和冷冻食品消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Frozen'], palette='hsv')
plt.show()
# 购买渠道和洗涤和纸的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Detergents_Paper'], palette='hsv')
plt.show()
# 购买渠道和熟食消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Channel'], data['Delicassen'], palette='hsv')
plt.show()

# 所属地区和新鲜产品的年度支出数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Fresh'], palette='hsv')
plt.show()
# 所属地区和奶制品上的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Milk'], palette='hsv')
plt.show()
# 所属地区和零食上的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Grocery'], palette='hsv')
plt.show()
# 所属地区和冷冻食品消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Frozen'], palette='hsv')
plt.show()
# 所属地区和洗涤和纸的消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Detergents_Paper'], palette='hsv')
plt.show()
# 所属地区和熟食消费数据的关联性 palette:使用调色板
sns.boxenplot(data['Region'], data['Delicassen'], palette='hsv')
plt.show()

# 根据相关关系热力图,画出相关关系>0.5的特征之间的关系
x = data['Fresh']
y = data['Milk']
z = data['Grocery']
a = data['Frozen']
b = data['Detergents_Paper']
c = data['Delicassen']
# 奶制品上的消费和零食上的消费、洗涤和纸的消费之间的联系
sns.lineplot(y, z, color='blue')  # 奶制品上的消费vs零食上的消费
sns.lineplot(y, b, color='red')  # 奶制品上的消费vs洗涤和纸的消费
plt.show()
# 零食上的消费和洗涤和纸的消费之间的联系
sns.lineplot(z, b, color='blue')  # 零食上的消费vs洗涤和纸的消费
plt.show()
# 第三步: 特征工程
# 构造数据集
X = data.iloc[:, 2:8]
print(X.head())
columns = X.columns
# 数据预处理:标准化
nl = Normalizer()
X = nl.fit_transform(X)
score = []  # 模型评分
range_values = np.arange(2, 10)  # 初始聚类个数
print(range_values)
# 簇从2-9分别训练模型,计算轮廓系数
for i in range_values:
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(X)
    s = silhouette_score(X, kmeans.labels_)
    score.append(s)
# 取出最高得分
print(np.max(score))
# 画出所有得分的柱状图
plt.bar(range_values, score, width=0.7, color='b', align='center')
plt.show()
# 根据得分情况的分析簇选2最优的
n_clusters = 2
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(X)
# 取分类的结果
y_pred = kmeans.labels_
print(y_pred)

# 把预测结果(一维数组),构造成Series
km_labels = pd.Series(y_pred)
# 统计各类别的数量
size = km_labels.value_counts()
print(size)
x = size.index
y = size.values
plt.figure(figsize=(10, 7))
plt.pie(y, labels=x, autopct='%.1f %%', startangle=90)
plt.xlabel('类别占比')
plt.show()
# 增加一列,分类结果
data['labels'] = y_pred
data.to_csv('Wholesale customers data1.csv')


# 取出每个类的质心
center = kmeans.cluster_centers_
print(center)
df = pd.DataFrame(center[:, 0:6], columns=['新鲜产品', '奶制品', '零食',
                                           '冷冻食品', '洗涤和纸', '熟食'])
print(df)
# 画出dataframe的柱状图
df.plot(kind='bar')
plt.xticks(rotation=360)
plt.show()
# 通过对每个类质心点的图表分析得出: 第一类消费者。。。。特点,第二类。。。。。
举报

相关推荐

0 条评论