Python 数据分析实战:基于 2019 国赛 D 题数据,5 步完成空气质量传感器校准
2026/7/8 22:54:03 网站建设 项目流程

Python 数据分析实战:基于 2019 国赛 D 题数据,5 步完成空气质量传感器校准

空气质量监测数据的准确性直接影响环境治理决策的科学性。当我们在实际项目中遇到微型传感器数据漂移问题时,传统 MATLAB 数学建模方案往往难以快速落地。本文将用 Python 生态工具链,带您完整复现国赛 D 题的传感器校准方案,从原始数据到可部署的校准模型,全程只需 5 个关键步骤。

1. 环境准备与数据加载

工欲善其事,必先利其器。建议使用 Conda 创建专属环境:

conda create -n air_quality python=3.8 conda activate air_quality pip install pandas scikit-learn matplotlib seaborn jupyter

数据集预处理时需特别注意时间对齐问题。原始数据中的时间戳格式不统一,这是实际项目中常见的坑:

import pandas as pd # 加载国控点数据(标准参考数据) national_data = pd.read_csv('attachment1.csv', parse_dates=['time'], date_parser=lambda x: pd.to_datetime(x, format='%Y-%m-%d %H:%M:%S')) # 加载自建点数据(待校准数据) local_data = pd.read_csv('attachment2.csv', parse_dates=['time'], date_parser=lambda x: pd.to_datetime(x, format='%Y/%m/%d %H:%M'))

注意:原始数据中常见的时间格式问题包括 12/24 小时制混用、时区缺失、字符串格式不一致等,建议先用pd.to_datetime()配合正则表达式统一处理。

2. 探索性数据分析(EDA)

EDA 阶段需要重点关注三类问题:

  1. 传感器漂移现象
  2. 气象参数与污染物浓度的关联性
  3. 数据分布差异

使用 Seaborn 快速生成污染物浓度分布对比图:

import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(12,8)) for i, col in enumerate(['PM2.5', 'PM10', 'CO']): plt.subplot(2,3,i+1) sns.kdeplot(national_data[col], label='国控点') sns.kdeplot(local_data[col], label='自建点') plt.title(f'{col}浓度分布对比') plt.tight_layout()

关键统计量对比建议用表格呈现:

指标国控点PM2.5均值自建点PM2.5均值相对偏差
24小时均值42.3 μg/m³47.8 μg/m³+13%
日间峰值58.1 μg/m³64.7 μg/m³+11%
夜间谷值31.2 μg/m³36.5 μg/m³+17%

3. 差异因素建模分析

传感器数据差异主要来自三方面因素:

  • 传感器漂移:零点漂移和量程漂移
  • 交叉干扰:不同气体之间的测量干扰
  • 气象影响:温湿度对传感器灵敏度的影响

使用 Scikit-learn 构建多元线性回归模型:

from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler # 准备特征矩阵(加入气象参数交互项) features = ['PM2.5', 'PM10', 'CO', 'NO2', 'temp', 'humidity'] X = local_data[features] X['temp_humidity'] = X['temp'] * X['humidity'] # 添加交互项 # 目标变量为国控点与自建点的PM2.5差值 y = national_data['PM2.5'] - local_data['PM2.5'] # 标准化后建模 scaler = StandardScaler() model = LinearRegression() model.fit(scaler.fit_transform(X), y) # 输出特征重要性 pd.DataFrame({ 'feature': features + ['temp_humidity'], 'coef': model.coef_ }).sort_values('coef', ascending=False)

4. 分段线性插值校准

针对不同浓度区间建立分段校准模型,这是提升精度的关键步骤:

from sklearn.preprocessing import KBinsDiscretizer # 将PM2.5浓度分为5个区间 binner = KBinsDiscretizer(n_bins=5, encode='ordinal') bins = binner.fit_transform(national_data[['PM2.5']]) calibrated_values = [] for bin_num in range(5): mask = bins.flatten() == bin_num X_bin = X[mask] y_bin = y[mask] bin_model = LinearRegression() bin_model.fit(scaler.transform(X_bin), y_bin) # 应用分段校准 calibrated = local_data.loc[mask, 'PM2.5'] + bin_model.predict(scaler.transform(X_bin)) calibrated_values.append(calibrated) calibrated_pm25 = pd.concat(calibrated_values).sort_index()

5. 残差评估与模型优化

校准效果的量化评估需要多维度指标:

def evaluate(y_true, y_pred): metrics = { 'MAE': abs(y_true - y_pred).mean(), 'RMSE': ((y_true - y_pred)**2).mean()**0.5, 'R2': 1 - ((y_true - y_pred)**2).sum() / ((y_true - y_true.mean())**2).sum() } return pd.DataFrame(metrics, index=['Value']) original_error = evaluate(national_data['PM2.5'], local_data['PM2.5']) calibrated_error = evaluate(national_data['PM2.5'], calibrated_pm25) pd.concat({'原始数据': original_error, '校准后': calibrated_error}, axis=1)

可视化残差分布能直观发现系统偏差:

plt.figure(figsize=(10,4)) residuals = national_data['PM2.5'] - calibrated_pm25 sns.histplot(residuals, kde=True, bins=30) plt.axvline(x=0, color='r', linestyle='--') plt.title('校准后残差分布')

在实际部署时,建议将训练好的校准模型封装为 Python 类,实现端到端的校准流水线。完整的 Jupyter Notebook 应包含:

  1. 模块化的数据处理函数
  2. 可配置的模型参数
  3. 自动化评估报告生成
  4. 可视化结果导出功能

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询