数据分析案例:环境数据分析

目录

  • 数据分析案例:环境数据分析
    • [1. 项目背景](#1. 项目背景)
    • [2. 数据加载与预处理](#2. 数据加载与预处理)
      • [2.1 数据说明](#2.1 数据说明)
      • [2.2 读取与清洗](#2.2 读取与清洗)
    • [3. 探索性数据分析(EDA)](#3. 探索性数据分析(EDA))
      • [3.1 时序趋势](#3.1 时序趋势)
      • [3.2 日内变化](#3.2 日内变化)
      • [3.3 气象与污染物相关性](#3.3 气象与污染物相关性)
    • [4. 特征工程](#4. 特征工程)
      • [4.1 时间特征](#4.1 时间特征)
      • [4.2 滞后与滚动统计](#4.2 滞后与滚动统计)
      • [4.3 目标变量](#4.3 目标变量)
    • [5. 模型构建与评估](#5. 模型构建与评估)
      • [5.1 数据划分](#5.1 数据划分)
      • [5.2 训练随机森林](#5.2 训练随机森林)
      • [5.3 评估](#5.3 评估)
    • [6. 业务应用与洞察](#6. 业务应用与洞察)
    • [7. 完整代码](#7. 完整代码)
    • [8. 总结](#8. 总结)

数据分析案例:环境数据分析

1. 项目背景

随着工业化和城市化进程加快,环境监测已成为衡量生态健康的重要手段。通过对空气质量、气象数据和污染物浓度的分析,可以及时发现污染源、预测污染趋势,为城市管理和公众健康提供决策支持。本案例以某城市空气质量监测站逐小时监测的 PM2.5、PM10、CO、NO₂、O₃ 等污染物浓度及气象数据为例,演示如何利用 Pandas、Matplotlib 和 Scikit-learn 对环境数据进行清洗、探索、建模和预警分析。


2. 数据加载与预处理

2.1 数据说明

假设已有文件 environment_data.csv,主要字段:

  • timestamp:监测时间(YYYY-MM-DD HH:MM:SS)
  • pm25:PM₂.₅ 浓度(µg/m³)
  • pm10:PM₁₀ 浓度(µg/m³)
  • no2:二氧化氮浓度(ppb)
  • o3:臭氧浓度(ppb)
  • co:一氧化碳浓度(ppm)
  • temperature:气温(℃)
  • humidity:相对湿度(%)
  • wind_speed:风速(m/s)

2.2 读取与清洗

python 复制代码
import pandas as pd

# 读取数据并解析时间
df = pd.read_csv('environment_data.csv', parse_dates=['timestamp'])
print("原始记录数:", len(df))

# 删除缺失或负值异常
df = df.dropna(subset=['pm25','pm10','no2','o3','co','temperature','humidity','wind_speed'])
for col in ['pm25','pm10','no2','o3','co','humidity','wind_speed']:
    df = df[df[col] >= 0]

# 排序并重设索引
df = df.sort_values('timestamp').reset_index(drop=True)
print(df.head())

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

3.1 时序趋势

python 复制代码
import matplotlib.pyplot as plt

plt.figure(figsize=(12,4))
plt.plot(df['timestamp'], df['pm25'], label='PM2.5')
plt.plot(df['timestamp'], df['pm10'], label='PM10', alpha=0.8)
plt.legend()
plt.title('PM₂.₅ & PM₁₀ 时序趋势')
plt.xlabel('时间')
plt.ylabel('浓度 (µg/m³)')
plt.tight_layout()
plt.show()

3.2 日内变化

python 复制代码
df['hour'] = df['timestamp'].dt.hour
hourly_mean = df.groupby('hour')['pm25','no2','o3'].mean()
hourly_mean.plot(figsize=(8,4))
plt.title('日内污染物平均浓度')
plt.xlabel('小时')
plt.ylabel('平均浓度')
plt.grid(True)
plt.tight_layout()
plt.show()

3.3 气象与污染物相关性

python 复制代码
plt.figure(figsize=(6,4))
plt.scatter(df['temperature'], df['pm25'], alpha=0.3)
plt.title('气温 vs PM₂.₅')
plt.xlabel('气温 (℃)')
plt.ylabel('PM₂.₅ (µg/m³)')
plt.tight_layout()
plt.show()

4. 特征工程

4.1 时间特征

python 复制代码
df['dayofweek'] = df['timestamp'].dt.dayofweek
df['month']     = df['timestamp'].dt.month

4.2 滞后与滚动统计

python 复制代码
# 前1小时 PM2.5
df['pm25_lag1'] = df['pm25'].shift(1).fillna(method='bfill')
# 过去24小时滚动平均
df['pm25_roll24'] = df['pm25'].rolling(window=24, min_periods=1).mean()

4.3 目标变量

定义次日高污染预警,当翌日小时平均 PM2.5 超过 75 µg/m³ 视为高污染时段。这里简化为下一个小时浓度超过阈值:

python 复制代码
df['pm25_next'] = df['pm25'].shift(-1)
df['high_pollution'] = (df['pm25_next'] > 75).astype(int)
df = df.dropna(subset=['high_pollution'])

5. 模型构建与评估

使用随机森林分类器预测下小时是否高污染。

5.1 数据划分

python 复制代码
from sklearn.model_selection import train_test_split

feature_cols = [
    'pm25','pm10','no2','o3','co',
    'temperature','humidity','wind_speed',
    'hour','dayofweek','month',
    'pm25_lag1','pm25_roll24'
]
X = df[feature_cols]
y = df['high_pollution']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, shuffle=False
)

5.2 训练随机森林

python 复制代码
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

5.3 评估

python 复制代码
from sklearn.metrics import roc_auc_score, classification_report, confusion_matrix

y_pred = rf.predict(X_test)
y_prob = rf.predict_proba(X_test)[:,1]

print("AUC:", roc_auc_score(y_test, y_prob))
print("\n分类报告:\n", classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

6. 业务应用与洞察

  1. 预警发布:根据模型预测结果,提前一小时向公众和企业发布高污染预警;
  2. 交通与工业管控:在高污染预测期,临时限制交通流量或工业排放;
  3. 空气净化调度:优化城市空气净化系统(如新增喷淋、增加绿化);
  4. 健康建议:为敏感人群(儿童、老人)推送室内活动建议。

7. 完整代码

python 复制代码
import pandas as pd, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score, classification_report, confusion_matrix

# 1. 读取与清洗
df = pd.read_csv('environment_data.csv', parse_dates=['timestamp'])
df = df.dropna(subset=['pm25','pm10','no2','o3','co','temperature','humidity','wind_speed'])
for col in ['pm25','pm10','no2','o3','co','humidity','wind_speed']:
    df = df[df[col]>=0]
df = df.sort_values('timestamp').reset_index(drop=True)

# 2. 特征工程
df['hour']       = df['timestamp'].dt.hour
df['dayofweek']  = df['timestamp'].dt.dayofweek
df['month']      = df['timestamp'].dt.month
df['pm25_lag1']  = df['pm25'].shift(1).fillna(method='bfill')
df['pm25_roll24']= df['pm25'].rolling(24, min_periods=1).mean()
df['pm25_next']  = df['pm25'].shift(-1)
df['high_pollution'] = (df['pm25_next'] > 75).astype(int)
df = df.dropna(subset=['high_pollution'])

# 3. 划分与训练
feature_cols = ['pm25','pm10','no2','o3','co','temperature',
                'humidity','wind_speed','hour','dayofweek',
                'month','pm25_lag1','pm25_roll24']
X = df[feature_cols]; y = df['high_pollution']
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, shuffle=False
)
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 4. 评估
y_pred = rf.predict(X_test)
y_prob = rf.predict_proba(X_test)[:,1]
print("AUC:", roc_auc_score(y_test, y_prob))
print("\n分类报告:\n", classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

8. 总结

本文展示了环境数据分析与高污染预警的完整流程:从数据读取、清洗,到特征工程(时间与滞后特征)、模型训练与评估,再到业务应用场景。通过随机森林分类模型,可提前预测高污染风险,为城市污染管控和公众健康保护提供数据支撑。后续可结合更多外部因子(交通流量、工业排放数据)及时序模型(LSTM)优化预测效果。

相关推荐
都叫我大帅哥34 分钟前
向量数据库Milvus:非结构化数据的救星,AI开发者的瑞士军刀
java·python
冰糖猕猴桃2 小时前
【Python】进阶 - 数据结构与算法
开发语言·数据结构·python·算法·时间复杂度、空间复杂度·树、二叉树·堆、图
天水幼麟2 小时前
python学习笔记(深度学习)
笔记·python·学习
巴里巴气2 小时前
安装GPU版本的Pytorch
人工智能·pytorch·python
wt_cs2 小时前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
_WndProc3 小时前
【Python】Flask网页
开发语言·python·flask
互联网搬砖老肖3 小时前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
测试者家园3 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
大模型真好玩3 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
前端付豪3 小时前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python