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

目录

  • 数据分析案例:环境数据分析
    • [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)优化预测效果。

相关推荐
临沂GEO1 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白1 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
RE-19012 小时前
电商互联网指标 - 归纳笔记
数据分析·电商指标·互联网指标·业务指标·指标解释
荷蒲2 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
柳絮飞祭奠3 小时前
Dify Windows Docker Desktop 部署文档
人工智能·深度学习·语言模型·数据分析·transformer·边缘计算·集成学习
数据狐(Datafox)4 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机4 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor6925 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy5 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽6 小时前
真实即粗糙,光滑是伪造
人工智能·python