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()
# 通过对每个类质心点的图表分析得出: 第一类消费者。。。。特点,第二类。。。。。