數據分析案例:環境數據分析

目錄

  • 數據分析案例:環境數據分析
    • 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/m3)
  • pm10:PM?? 濃度(μg/m3)
  • 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/m3)')
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/m3)')
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/m3 視為高污染時段。這里簡化為下一個小時濃度超過閾值:

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.pswp.cn/web/77641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77641.shtml
英文地址,請注明出處:http://en.pswp.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…