首先呢我们先了解一下聚类分析是什么
聚类分析(Cluster Analysis)是一种无监督学习技术,主要用于将数据样本划分成多个类别或簇(Cluster),使得在同一簇内的数据相似性较高,不同簇之间的数据相似性较低。聚类分析的目标是在不需要预先定义类别的情况下,发现数据中的内在结构和模式。
那么我们为什么要用聚类分析呢,聚类分析主要处理什么问题的呢?
首先我们可以通过字面意思理解到聚类分析就是把数据集合在一块,去做一个集体分析,类似“物以类聚”的意思,去分析这类群体的特征,那么我们去使用聚类分析来分析建安成本与人口GDP的城市,其实目的就是为了获得更全面的城市经济特征。
先给看一下简单的数据集
接着我们就开始数据分析吧
首先我们肯定需要导入要用到的工具
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from pandas.plotting import parallel_coordinates
import matplotlib.font_manager as fm
导入数据
import pandas as pd
import seaborn as sns
# 从 CSV 文件中读取数据
df = pd.read_csv('123.csv')
# 查看数据框的头部和列名
print(df.head())
print(df.columns)
city AverageGDP yearaverage
0 北京 20.03 2274.0
1 天津 12.28 3150.0
2 上海 19.03 4081.5
3 南京 18.30 2085.0
4 杭州 16.11 1454.0
Index(['city', 'AverageGDP', 'yearaverage'], dtype='object')
清洗数据
from sklearn.preprocessing import StandardScaler
# 选择数值列
numerical_features = df.select_dtypes(include=[np.number])
# 标准化数据
scaler = StandardScaler()
scaled_features = scaler.fit_transform(numerical_features)
# 转换为 DataFrame 以便查看
scaled_features_df = pd.DataFrame(scaled_features, columns=numerical_features.columns)
print(scaled_features_df.head())
AverageGDP yearaverage
0 1.940576 -0.756218
1 0.050537 -0.042289
2 1.696700 0.716873
3 1.518670 -0.910251
4 0.984582 -1.424509
# 处理 NaN 值:用列的均值填充 NaN
numerical_features = numerical_features.fillna(numerical_features.mean())
# 使用肘部法则确定最佳聚类数
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(scaled_features)
sse.append(kmeans.inertia_)
# 绘制肘部法则图
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), sse, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.title('Elbow Method for Optimal k')
plt.show()
# 设定最佳聚类数(例如 k=3)
optimal_k = 3
# 应用 K-means 聚类
kmeans = KMeans(n_clusters=optimal_k, random_state=42)
clusters = kmeans.fit_predict(scaled_features)
# 将聚类结果添加到原始数据中
df['Cluster'] = clusters
print(df)
city AverageGDP yearaverage Cluster
0 北京 20.03 2274.0 2
1 天津 12.28 3150.0 0
2 上海 19.03 4081.5 2
3 南京 18.30 2085.0 2
4 杭州 16.11 1454.0 0
5 郑州 10.62 1754.5 0
6 长沙 13.75 2189.5 0
7 武汉 14.55 1374.0 0
8 济南 13.55 4260.0 1
9 成都 10.35 1753.5 0
10 重庆 9.41 3080.0 1
11 石家庄 6.71 3595.0 1
12 哈尔滨 5.68 3733.0 1
13 呼和浩特 10.63 5300.0 1
14 西安 9.21 5249.0 1
15 乌鲁木齐 10.21 4203.0 1
16 西宁 7.26 4049.0 1
17 拉萨 9.63 4049.0 1
# 可视化聚类结果
plt.figure(figsize=(10, 6))
sns.scatterplot(x='AverageGDP', y='yearaverage', hue='Cluster', data=df, palette='viridis', s=100)
plt.title('城市聚类分析')
plt.xlabel('人均GDP(万元)')
plt.ylabel('建安成本(元/平方米)')
plt.legend(title='Cluster')
plt.show()
# 热力图:显示特征之间的相关性
plt.figure(figsize=(10, 6))
sns.heatmap(numerical_features.corr(), annot=True, cmap='coolwarm')
plt.title('Feature Correlation Heatmap')
plt.show()
# 簇内特征分布图(箱线图)
plt.figure(figsize=(10, 6))
sns.boxplot(x='Cluster', y='AverageGDP', data=df)
plt.title('Distribution of GDP per Capita by Cluster')
plt.show()
plt.figure(figsize=(10, 6))
sns.boxplot(x='Cluster', y='yearaverage', data=df)
plt.title('Distribution of Construction Cost by Cluster')
plt.show()
from pandas.plotting import parallel_coordinates
# 平行坐标图
plt.figure(figsize=(10, 6))
parallel_coordinates(df[['AverageGDP', 'yearaverage', 'Cluster']], 'Cluster', color=sns.color_palette('Set2', optimal_k))
plt.title('Parallel Coordinates Plot')
plt.xlabel('Features')
plt.ylabel('Scaled Values')
plt.show()
1. 聚类结果可视化
散点图展示了城市在 AverageGDP 和 yearaverage 两个指标上的分布情况,并用不同颜色标识出不同的聚类。
Cluster 0(例如,天津、郑州、长沙、武汉、杭州等城市):这些城市的 AverageGDP 和 yearaverage 较为接近,说明它们在这两个经济指标上具有相似性。
可能代表经济较为均衡但不突出的一组城市。
Cluster 1(例如,济南):该城市在 yearaverage 上的值较高,但 AverageGDP 相对中等。可能代表一些经济发展较为均衡且在某些年份表现突出的城市。
Cluster 2(例如,北京、上海、南京):这些城市的 AverageGDP 较高,说明它们在经济总量上处于领先地位。可能代表经济发展非常突出的城市,通常是大都市或经济中心。
2. 肘部法则图
图上的 SSE(Sum of Squared Errors)随聚类数增加而递减,但下降趋势在某个点之后变得平缓,这个点被称为“肘部”。在我们的示例中,假设肘部出现在聚类数为 3 的位置,因此我们选择 3 作为最佳聚类数。
3.并行坐标图
并行坐标图展示了每个聚类在不同特征上的分布情况。
Cluster 0:在两个特征上表现中等,不特别突出。这些城市可能具有较为均衡的经济发展。
Cluster 1:在 yearaverage 上表现较高,但 AverageGDP 相对较低。这些城市可能在某些年份有突出的经济表现,但总体经济水平中等。
Cluster 2:在两个特征上都表现较高。这些城市是经济发展非常突出的城市,通常是大都市或经济中心。
总结
通过这种聚类分析和可视化,我们得出以下结论:
1. 城市分组:不同的城市在 AverageGDP 和 yearaverage 上具有不同的特征,可以分为几个不同的组,每组内的城市在这两个指标上较为相似。
2. 经济特征:高 AverageGDP 的城市(如北京、上海)在一个聚类内,而 yearaverage 较高的城市(如济南)在另一个聚类内,这有助于识别出城市的不同经济特征。
3. 政策制定:根据聚类结果,政策制定者可以针对不同组别的城市,制定更有针对性的经济政策,以促进均衡发展。
这种分析方法可以应用于更广泛的数据集和更多的指标,以挖掘出更有价值的经济特征和发展趋势。例如,可以进一步分析各个聚类的其他经济指标,如收入水平、就业率等,以获得更全面的城市经济特征。