数据探索与预处理
一、实验目的
- 掌握数据预处理的基本流程与方法;
- 熟悉数据清洗、集成、变换与归约的常用策略与工具;
- 使用Python及相关库对电厂数据集进行探索性分析与预处理;
- 为后续建模任务准备高质量的数据集。
二、数据集概述
2.1 数据来源与结构
- 数据集名称:Combined Cycle Power Plant Data Set
- 数据量:9568条记录
- 属性数量:5个(4个输入特征,1个输出变量)
2.2 属性说明
|
变量名 |
含义 |
类型 |
|
AT |
环境温度(Ambient Temperature) |
数值型 |
|
V |
排气真空(Exhaust Vacuum) |
数值型 |
|
AP |
环境压强(Ambient Pressure) |
数值型 |
|
RH |
相对湿度(Relative Humidity) |
数值型 |
|
PE |
发电量(Electrical Energy Output) |
数值型(目标变量) |
三、数据类型与统计描述
3.1 数据类型识别
所有变量均为连续型数值变量。
3.2 统计描述
使用Python的pandas库进行基本统计:
python
import pandas as pd
df = pd.read_excel("Combined_Cycle_Power_Plant_Data_Set.xlsx")
print(df.describe())

输出结果摘要:
|
AT |
V |
AP |
RH |
PE | |
|
count |
9568.000 |
9568.000 |
9568.000 |
9568.000 |
9568.000 |
|
mean |
19.65 |
54.31 |
1013.26 |
73.31 |
454.37 |
|
std |
7.45 |
12.71 |
5.94 |
14.60 |
17.07 |
|
min |
1.81 |
25.36 |
992.89 |
25.56 |
420.26 |
|
max |
37.11 |
81.56 |
1033.87 |
100.16 |
495.76 |
3.3 常见图形工具
使用matplotlib与seaborn绘制以下图形:
- 箱线图:检测异常值
- 直方图:查看分布
- 散点图矩阵:观察变量间关系
- 热力图:显示相关性
import seaborn as sns
import matplotlib.pyplot as plt
# 箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=df)
plt.xticks(rotation=45)
plt.title("Boxplot of All Variables")
plt.show()

四、数据清洗
4.1 缺失值处理
经检查,数据集中无缺失值:
print(df.isnull().sum())

4.2 噪声数据处理
使用滑动平均滤波或分箱平滑方法对噪声数据进行平滑处理(本实验中未执行,因数据质量较高)。
4.3 异常值处理
使用IQR方法检测异常值:
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
outliers = ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
print("异常值数量:\n", outliers)
处理方式:保留异常值(因可能是真实工况)。

五、数据集成
5.1 实体识别
本数据集为单表,无需实体识别。
5.2 冗余与相关性分析
计算Pearson相关系数:
corr = df.corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("Correlation Heatmap")
plt.show()

结果:
- AT与PE呈强负相关(-0.95)
- V与PE呈负相关(-0.87)
- AP与PE呈弱正相关(0.52)
5.3 数据值冲突检测
未发现明显冲突(所有数据在同一量纲和单位下)。
六、数据变换与数据归约
6.1 数据规范化
使用最小-最大规范化或Z-score标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
6.2 数据离散化
对连续变量如RH进行等宽或等频分箱:
python
df['RH_bin'] = pd.cut(df['RH'], bins=5, labels=['很低', '低', '中', '高', '很高'])
6.3 数据归约
6.3.1 属性归约
使用主成分分析(PCA)降低维度:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
df_pca = pca.fit_transform(df_scaled)
print("解释方差比:", pca.explained_variance_ratio_)
![]()
6.3.2 数值归约
使用聚类(如K-Means)对数据进行聚类归约:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
df['cluster'] = kmeans.fit_predict(df_scaled)
可以做一个聚类分析可视化




七、实验总结
- 本数据集质量较高,无缺失值,异常值较少;
- 变量间存在强相关性,尤其是AT和V与PE;
- 通过标准化、PCA、聚类等方法实现了数据变换与归约;
- 数据预处理为后续的回归或预测建模奠定了基础。
八、附录:使用工具与库
- Python 3.x
- pandas, numpy
- matplotlib, seaborn
- scikit-learn
附录(源码)
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
print("=== 重新开始:完整的数据预处理流程 ===")
# 1. 重新加载或使用原始数据
print("1. 检查原始数据")
print("原始数据形状:", df.shape)
print("原始数据列名:", df.columns.tolist())
print("原始数据类型:")
print(df.dtypes)
# 2. 提取纯数值列(确保没有分类变量)
print("\n2. 提取纯数值数据")
# 方法1:直接指定原始数值列
original_numeric_cols = ['AT', 'V', 'AP', 'RH', 'PE']
df_numeric = df[original_numeric_cols].copy()
# 方法2:自动选择数值列
# df_numeric = df.select_dtypes(include=[np.number]).copy()
print("纯数值数据形状:", df_numeric.shape)
print("纯数值数据列名:", df_numeric.columns.tolist())
# 3. 数据标准化
print("\n3. 数据标准化")
scaler = StandardScaler()
df_scaled_values = scaler.fit_transform(df_numeric)
df_scaled = pd.DataFrame(df_scaled_values, columns=df_numeric.columns)
print("标准化完成!")
print("标准化后的数据统计:")
print(df_scaled.describe())
# 4. 主成分分析(PCA)- 只使用数值数据
print("\n4. 主成分分析")
pca = PCA(n_components=2)
pca_components = pca.fit_transform(df_scaled) # 这里使用纯数值的df_scaled
df_pca = pd.DataFrame(pca_components, columns=['PC1', 'PC2'])
print(f"PCA解释方差比例: {pca.explained_variance_ratio_}")
print(f"累计解释方差: {np.sum(pca.explained_variance_ratio_):.3f}")
# 5. 数据离散化(在原始数据上进行,不是标准化后的数据)
print("\n5. 数据离散化")
df_processed = df_scaled.copy() # 从标准化数据开始
df_processed['RH_bin'] = pd.cut(df_numeric['RH'], bins=5,
labels=['很低', '低', '中', '高', '很高'])
# 将离散化结果也添加到PCA结果中用于可视化
df_pca['RH_bin'] = df_processed['RH_bin']
df_pca['PE_original'] = df_numeric['PE'] # 添加原始发电量用于着色
print("离散化完成!")
print("湿度分级分布:")
print(df_pca['RH_bin'].value_counts().sort_index())
# 6. 可视化PCA结果
print("\n6. 可视化结果")
plt.figure(figsize=(15, 5))
# 子图1:按发电量着色
plt.subplot(1, 3, 1)
scatter1 = plt.scatter(df_pca['PC1'], df_pca['PC2'], c=df_pca['PE_original'],
cmap='viridis', alpha=0.6)
plt.colorbar(scatter1, label='发电量 (PE)')
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} 方差)')
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} 方差)')
plt.title('PCA - 按发电量着色')
# 子图2:按湿度分级着色
plt.subplot(1, 3, 2)
categories = df_pca['RH_bin'].unique()
colors = ['red', 'orange', 'green', 'blue', 'purple']
for i, category in enumerate(categories):
mask = df_pca['RH_bin'] == category
plt.scatter(df_pca.loc[mask, 'PC1'], df_pca.loc[mask, 'PC2'],
c=colors[i], label=category, alpha=0.6)
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} 方差)')
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} 方差)')
plt.title('PCA - 按湿度分级着色')
plt.legend()
# 子图3:PCA特征权重
plt.subplot(1, 3, 3)
feature_weights = pd.DataFrame({
'Feature': df_numeric.columns,
'PC1': pca.components_[0],
'PC2': pca.components_[1]
})
x = np.arange(len(feature_weights))
width = 0.35
plt.bar(x - width/2, feature_weights['PC1'], width, label='PC1', alpha=0.7)
plt.bar(x + width/2, feature_weights['PC2'], width, label='PC2', alpha=0.7)
plt.xlabel('特征')
plt.ylabel('权重')
plt.title('PCA特征权重')
plt.xticks(x, feature_weights['Feature'], rotation=45)
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 7. 聚类分析
print("\n7. 聚类分析")
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
clusters = kmeans.fit_predict(df_scaled) # 使用纯数值数据
df_processed['cluster'] = clusters
df_pca['cluster'] = clusters
print("聚类完成!")
print("各聚类样本数量:")
cluster_counts = pd.Series(clusters).value_counts().sort_index()
print(cluster_counts)
# 8. 聚类结果可视化
print("\n8. 聚类结果可视化")
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
scatter2 = plt.scatter(df_pca['PC1'], df_pca['PC2'], c=df_pca['cluster'],
cmap='Set1', alpha=0.6)
plt.colorbar(scatter2, label='聚类')
plt.xlabel(f'PC1 ({pca.explained_variance_ratio_[0]:.2%} 方差)')
plt.ylabel(f'PC2 ({pca.explained_variance_ratio_[1]:.2%} 方差)')
plt.title('PCA - 聚类结果')
plt.subplot(1, 2, 2)
# 聚类中心在原始特征空间中的位置
cluster_centers_original = scaler.inverse_transform(kmeans.cluster_centers_)
cluster_center_df = pd.DataFrame(cluster_centers_original, columns=df_numeric.columns)
# 绘制聚类中心的特征对比
x_pos = np.arange(len(df_numeric.columns))
width = 0.25
for i in range(3):
plt.bar(x_pos + i*width, cluster_center_df.iloc[i], width, label=f'聚类{i}')
plt.xlabel('特征')
plt.ylabel('特征值')
plt.title('各聚类中心特征对比')
plt.xticks(x_pos + width, df_numeric.columns, rotation=45)
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 9. 最终数据汇总
print("\n9. 最终数据汇总")
print("处理后的数据形状:", df_processed.shape)
print("处理后的数据列名:", df_processed.columns.tolist())
print("\n各聚类统计信息:")
cluster_stats = df_processed.groupby('cluster').agg({
'AT': ['mean', 'std'],
'V': ['mean', 'std'],
'AP': ['mean', 'std'],
'RH': ['mean', 'std'],
'PE': ['mean', 'std']
}).round(3)
print(cluster_stats)
print("\n=== 数据预处理完成 ===")
# 保存关键结果
results = {
'df_processed': df_processed, # 包含标准化数值和分类列
'df_pca': df_pca, # PCA结果和分类信息
'scaler': scaler, # 标准化器
'pca': pca, # PCA模型
'kmeans': kmeans # 聚类模型
}
print("所有模型和结果已保存!")
更多推荐



所有评论(0)