练习1 地区收入的PCA主成分分析
0.变量说明
1.导包操作
核心思路:导入基础数据操作库包,PCA、k-means 库包,数据可视化库包
import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt import seaborn as sns
%matplotlib inline #如遇中文显示问题可加入以下代码 from pylab import mpl plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import warnings warnings.filterwarnings('ignore') |
2.读取数据
核心代码:pd.read_csv(path,encoding=编码格式),注意这里的编码是gb2312
# 读取数据 df = pd.read_csv(fr"./各地区年平均收入.csv",encoding="gb2312") df |
3.数据预处理
3.1.查看数据类型
核心代码:df.dtypes
核心思路:sum_col / count (列和 / 非空个数)
import pandas as pd import numpy as np def calculate_and_replace_mean(df, column): # 计算列的平均值,仅包括可以转换为整数的值 count = 0 sum_col = 0 for value in df[column]: if value != " " and pd.notnull(value): try: count += 1 sum_col += int(value) except ValueError: continue # 计算平均值,如果无法计算则返回NaN column_mean = sum_col / count if count > 0 else np.nan
# 取整数 column_mean = int(column_mean)
# 将列中的空格替换为平均值 df[column] = df[column].replace(" ", column_mean) return df |
# 对x1到x7列计算并替换平均值 for col in ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']: df = calculate_and_replace_mean(df, col) # 替换dq列中的空格为"MIssing" df['dq'] = df['dq'].replace(" ", "MIssing") # 显示更新后的DataFrame df |
3.3.转换数据类型
核心代码:df[字段名].astype(新类型)
# 装换字段类型 df['x6'] = df['x6'].astype(int) df['x7'] = df['x7'].astype(int) df.dtypes |
4.抽取数据
核心思路:df[字段列表],提取数值型的数据
# 数据截取 df_train = df[["x1","x2","x3","x4","x5","x6","x7"]] df_train |
5.特征工程
核心思路:特征工程标转化,高维数据转化为低维数据
# 特征工程:标准化 # 实例化PCA, 小数——保留多少信息 transfer = PCA(n_components=0.9) data = transfer.fit_transform(df_train) data |
6.机器学习
6.1.肘部法确定k值
核心思路:选择曲线开始变得平坦的点作为K值。
# 确定k值 # 肘部法则(Elbow Method): # 通过计算不同K值下的簇内误差平方和(Inertia或称为Distortion),并绘制它们随K值变化的曲线。 # 注意:选择曲线开始变得平坦的点作为K值,这个点通常被认为是“肘部”。
distortions = [] K = range(1, 10) for k in K: kmeanModel = KMeans(n_clusters=k).fit(data) distortions.append(kmeanModel.inertia_)
plt.plot(K, distortions, 'bx-') plt.xlabel('k') plt.ylabel('Distortion') plt.title('The Elbow Method showing the optimal k') plt.show() |
6.2.K-Means聚类
核心思路:将k值确定为肘部“4”
#机器学习(k-means)
estimator = KMeans(n_clusters=4, random_state=22) y_predict = estimator.fit_predict(data) y_predict |
7.模型评估
核心代码:silhouette_score()
# 模型评估 silhouette_score(data, y_predict) # 添加聚类结果列 df_train['result'] = y_predict df_train |
8.数据可视化
核心思路:散点图显示聚类簇和特征变量关系
import matplotlib.pyplot as plt import seaborn as sns
# x1 国有经济单位 # x2 集体经济单位 # x3 联营经济单位 # x4 股份制经济单位 # x5 外商投资经济单 # x6 港澳台经济单位 # x7 其他经济单位 feature1 = 'x1' # 请替换为实际的特征列名 feature2 = 'x2' # 请替换为实际的特征列名 # 绘制散点图 plt.figure(figsize=(10, 6)) # 设置画布大小 sns.scatterplot(x=df_train[feature1], y=df_train[feature2], hue=df_train['result'], palette='viridis') # 设置标题和坐标轴标签 plt.title('聚类结果散点图') plt.xlabel(feature1) plt.ylabel(feature2) # 显示图例 plt.legend(title='簇标签') # 显示图形 plt.show() |
“若有理解思路疏漏,感谢各位大佬批评指正!”