目錄
- 數據分析案例:環境數據分析
- 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. 業務應用與洞察
- 預警發布:根據模型預測結果,提前一小時向公眾和企業發布高污染預警;
- 交通與工業管控:在高污染預測期,臨時限制交通流量或工業排放;
- 空氣凈化調度:優化城市空氣凈化系統(如新增噴淋、增加綠化);
- 健康建議:為敏感人群(兒童、老人)推送室內活動建議。
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)優化預測效果。