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

目录

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

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 时序趋势

import matplotlib.pyplot as pltplt.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 日内变化

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 气象与污染物相关性

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 时间特征

df['dayofweek'] = df['timestamp'].dt.dayofweek
df['month']     = df['timestamp'].dt.month

4.2 滞后与滚动统计

# 前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³ 视为高污染时段。这里简化为下一个小时浓度超过阈值:

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 数据划分

from sklearn.model_selection import train_test_splitfeature_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 训练随机森林

from sklearn.ensemble import RandomForestClassifierrf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

5.3 评估

from sklearn.metrics import roc_auc_score, classification_report, confusion_matrixy_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. 完整代码

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)优化预测效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理 - 8

目录 补充 网络层 IP 协议 基本概念: 协议头格式 地址管理 如何解决 IP 地址不够用呢??? 1. 动态分配 IP 地址: 2. NAT 机制(网络地址映射) 3. IPv6 网段划分 一些特殊的 IP 地址 …

向量检索新选择:FastGPT + OceanBase,快速构建RAG

随着人工智能的快速发展,RAG(Retrieval-Augmented Generation,检索增强生成)技术日益受到关注。向量数据库作为 RAG 系统的核心基础设施,堪称 RAG 的“记忆中枢”,其性能直接关系到大模型生成内容的精准度与…

dify对接飞书云文档,并且将图片传入飞书文档

前面讲了如何让dify展示图片,但是如果想让智能体回答的带图片的内容生成个文档该怎么弄呢?今天来实践一下。 dify工具带的有飞书云文档,正好,咱们就利用飞书云文档。 1、首先配置飞书云文档的key跟secret 注意要开头左侧的权限&a…

Linux系统之设置开机启动运行桌面环境

Linux 开机运行级别介绍与 Ubuntu 桌面环境配置指南 一、Linux 开机运行级别(Runlevel) 在传统的 Linux 系统(如 SysV init 初始化系统)中,运行级别定义了系统启动时加载的服务和资源。常见的运行级别如下: 运行级别模式用途0Halt(停机模式)关闭系统1Single User Mode…

Spring Cloud Gateway配置双向SSL认证(完整指南)

本文将详细介绍如何为Spring Cloud Gateway配置双向SSL认证,包括证书生成、配置和使用。 目录结构 /my-gateway-project ├── /certs │ ├── ca.crt # 根证书 │ ├── ca.key # 根私钥 │ ├── gateway.crt # 网关证书 │ ├── …

【虚幻5蓝图Editor Utility Widget:创建高效模型材质自动匹配和资产管理工具,从3DMax到Unreal和Unity引擎_系列第二篇】

虚幻5蓝图Editor Utility Widget 一、基础框架搭建背景:1. 创建Editor Utility Widget2.根控件选择窗口3.界面功能定位与阶段4.查看继承树5.目标效果 二、模块化设计流程1.材质替换核心流程:2.完整代码如下 三、可视化界面UI布局1. 添加标题栏2. 构建滚动…

LabVIEW实现DMM与开关模块扫描测量

该程序基于 LabVIEW,用于控制数字万用表(DMM)与开关模块进行测量扫描。通过合理配置触发源、测量参数等,实现对多路信号的自动化测量与数据获取,在电子测试、工业测量等领域有广泛应用。 ​ 各步骤功能详解 开关模块…

OpenAvatarChat要解决UnicodeDecodeError

错误信息如下 ailed to import handler module client/h5_rendering_client/client_handler_lam Traceback (most recent call last):File "E:\Codes\Python\aigc\OpenAvatarChat\src\demo.py", line 82, in <module>main()File "E:\Codes\Python\aigc\O…

数据库中的主键(Primary Key)

数据库中的主键&#xff08;Primary Key&#xff09; 主键是数据库表中用于唯一标识每一行记录的一个或多个列的组合&#xff0c;是关系型数据库中的重要概念。 主键的核心特性 唯一性&#xff1a;主键值必须唯一&#xff0c;不能重复非空性&#xff1a;主键列不能包含NULL值…

MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级

开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布&#xff01;作为企业级数据库的“扛把子”&#xff0c;此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域&#xff0c;同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…

Rmarkdown输出为pdf的方法与问题解决

R 是一种在数据分析与统计计算领域广泛使用的编程语言。其关键优势之一是能够生成高质量的报告和文档&#xff0c;这些报告和文档可以使用 RMarkdown 轻松定制和更新。在本文中&#xff0c;我们将探讨使用 R 从 RMarkdown 文件生成.pdf 文件 1.生成方法 新建Rmarkdown&#xf…

毕业设计-基于机器学习入侵检测系统

选题背景与意义 随着互联网技术的飞速发展&#xff0c;网络在人们的生活、工作各个领域都发挥着至关重要的作用。但与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;各类网络攻击事件频发&#xff0c;给个人、企业乃至国家都带来了巨大的经济损失和安全威胁。入侵检测…

React 实现爱心花园动画

主页&#xff1a; import React, { useEffect, useRef, useState } from react; import /assets/css/Love.less; import { Garden } from /utils/GardenClasses;// 组件属性接口 interface LoveAnimationProps {startDate?: Date; // 可选的开始日期messages?: { // 可…

从零开始了解数据采集(二十一)——电子制造行业趋势分析案例

这次分享一个偏行业性的趋势分析案例,在项目中为企业实实在在的提高了良品率。不懂什么是趋势分析的同学,可以翻看前面的文章。 在广东某电子制造厂中,管理层发现最近几个月生产良品率有所波动,但无法明确波动原因,也无法预测未来的趋势。为了优化生产过程并稳定良品率,…

在 Git 中,撤销(回退)merge 操作有多种方法

在 Git 中&#xff0c;撤销&#xff08;回退&#xff09;merge 操作有多种方法&#xff0c;具体取决于是否已提交、是否已推送&#xff0c;以及是否需要保留历史记录。以下是几种常见的撤销 merge 的方法&#xff1a; 1. 未提交 merge&#xff08;未 commit&#xff09; 如果 …

基于 Python 的实现:居民用电量数据分析与可视化

基于 Python 的实现:居民用电量数据分析与可视化 本文将介绍如何利用 Python 技术栈(包括 pymysql、pandas、matplotlib 等库)对居民用电量数据进行分析和可视化,以帮助我们更好地理解用电行为模式。 数据准备 在MySQL数据库中创建数据,,数据库表结构如下: date:记录…

Flow原理

fun main() {runBlocking {launch {flow4.collect{println("---collect-4")}println("---flow4")}}val flow4 flow<Boolean>{delay(5000)emit(false) } 我们分析下整个流程 1.flow为什么之后在collect之后才会发送数据 2.collect的调用流程 我…

设备接入与APP(应用程序)接入华为云iotDA平台的路径元素有哪些不同?

目录 壹、设备接入华为云iotDA &#x1f3e2; 形象比喻&#xff1a;设备 员工&#xff0c;IoTDA 平台 安保森严的总部大楼 一、&#x1f4cd; 平台接入地址 总部大楼地址 二、&#x1f9fe; 接入凭证 出入证 / 门禁卡 / 工牌 1. 设备密钥或证书 2. 预置接入凭证密钥&a…

JavaScript基础知识合集笔记2——数组排序、数组转换字符串、迭代方法

文章目录 排序方法reverse()sort() 转换方法join() 迭代方法some()every()forEach()filter()map() 排序方法 组有两个方法可以用来对元素重新排序&#xff1a; reverse()sort() reverse() 顾名思义&#xff0c;将数组元素方向反转。会直接改变原数组&#xff0c;请谨慎使用…

Redis 笔记(三)-Redis 基本知识及五大数据类型

一、redis 基本知识 redis 默认有 16个 数据库&#xff0c;config get databases 查看数据库数量 127.0.0.1:6379> config get databases # 查看数据库数量 1) "databases" 2) "16"默认使用的是第 0个 16 个数据库为&#xff1a;DB 0 ~ DB 15&am…