2. 环境数据采集与预处理:数据来源、清洗与标准化

大家好,我是老张。今天咱们聊聊环境数据分析里最基础、也最磨人的一步——数据采集与预处理。

说实话,我见过太多人一上来就急着建模调参,结果模型跑出来一塌糊涂。为什么?因为数据源头就没整明白。你想想看,垃圾进垃圾出,再牛的算法也救不了你。

这一章,我就把自己这些年踩过的坑、总结的经验,掰开揉碎了讲给你听。

2.1 数据来源:传感器、遥感与气象站

环境数据从哪来?说白了就三大类:地面传感器、卫星遥感、气象站观测。我一个个说。

2.1.1 传感器数据

传感器是最直接的来源。比如空气质量监测站里的PM2.5传感器、温湿度传感器、CO₂传感器。这些设备每分钟都在往外吐数据。

特点:

  • 采样频率高(秒级到分钟级)
  • 数据量大,但容易受环境干扰
  • 单个传感器故障会导致数据缺失
我的经验: 我在某工业园区做项目时,发现一个PM2.5传感器连续三天数值异常偏低。排查后发现是进风口被蜘蛛网堵住了。所以啊,传感器数据一定要做交叉验证。

2.1.2 遥感数据

遥感数据来自卫星或无人机。比如Landsat、MODIS、Sentinel系列。它能覆盖大范围区域,但空间分辨率有限。

常见遥感产品:

数据源 空间分辨率 时间分辨率 主要用途
Landsat 8/9 30m 16天 地表温度、植被指数
MODIS 250m-1km 1天 气溶胶、海面温度
Sentinel-2 10m-60m 5天 土地覆盖、水质监测

2.1.3 气象站数据

气象站数据是环境分析的"老大哥"。温度、气压、风速、降水量,这些参数直接影响污染物扩散。

我记得有一次做雾霾预测,光看PM2.5数据怎么都拟合不好。后来把风速和边界层高度加进去,模型效果直接翻倍。嗯,这里要注意:气象数据往往是环境模型的"催化剂"。

2.2 数据清洗:缺失值与异常值处理

数据拿到手,第一件事不是分析,是清洗。我见过最夸张的数据集,缺失率高达40%。这种数据你敢直接用?

2.2.1 缺失值处理

缺失值分三种:完全随机缺失、随机缺失、非随机缺失。处理方法也不一样。

常用方法:

  • 删除法: 缺失率低于5%且随机分布时,直接删行
  • 均值/中位数填充: 简单粗暴,但会降低方差
  • 前向/后向填充: 适合时间序列数据
  • 插值法: 线性插值、样条插值,精度更高
  • 模型预测: 用KNN或随机森林预测缺失值
避坑指南: 我曾经用均值填充温度数据,结果模型预测偏差很大。后来发现是因为温度有昼夜周期,均值填充把周期特征抹掉了。时间序列数据,优先用插值或前向填充。
# 缺失值处理示例
import pandas as pd
import numpy as np

# 读取数据
df = pd.read_csv('air_quality.csv')

# 查看缺失情况
print(df.isnull().sum())

# 前向填充(时间序列推荐)
df['temperature'] = df['temperature'].ffill()

# 线性插值
df['pm25'] = df['pm25'].interpolate(method='linear')

# 中位数填充(非时间序列)
df['wind_speed'] = df['wind_speed'].fillna(df['wind_speed'].median())

2.2.2 异常值处理

异常值怎么找?我常用的方法就三种:

  1. 3σ原则: 超出均值±3倍标准差的值,视为异常
  2. 箱线图法: 超出1.5倍IQR的值,标记为异常
  3. 领域知识法: 比如PM2.5不可能超过1000 μg/m³
注意: 异常值不一定是错误。比如沙尘暴期间PM10突然飙升到2000,这是真实事件,不能删。一定要结合业务场景判断。
# 异常值检测示例
from scipy import stats

# 3σ法
z_scores = np.abs(stats.zscore(df['pm25']))
df_clean = df[(z_scores < 3)]

# 箱线图法
Q1 = df['pm25'].quantile(0.25)
Q3 = df['pm25'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[(df['pm25'] >= Q1 - 1.5*IQR) & 
              (df['pm25'] <= Q3 + 1.5*IQR)]

2.3 数据标准化与归一化

为什么要做标准化?你想想看,温度范围是-10到40℃,PM2.5范围是0到500。如果直接扔进模型,温度对结果的影响会被严重低估。

标准化和归一化,说白了就是把不同量纲的数据拉到同一个尺度上。

2.3.1 归一化(Min-Max Scaling)

把数据缩放到[0,1]区间。公式很简单:

X_norm = (X - X_min) / (X_max - X_min)

适用场景: 数据分布有明确边界,比如温度、湿度

2.3.2 标准化(Z-score Scaling)

把数据变成均值为0、标准差为1的分布。公式:

X_std = (X - μ) / σ

适用场景: 数据近似正态分布,或者算法假设数据服从正态分布(如线性回归、SVM)

我的建议: 如果你不确定用哪个,优先用标准化。因为归一化对异常值非常敏感,一个极端值就能把整个区间压扁。标准化相对鲁棒一些。
# 标准化与归一化示例
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 标准化
scaler_std = StandardScaler()
df_std = scaler_std.fit_transform(df[['temperature', 'pm25', 'wind_speed']])

# 归一化
scaler_mm = MinMaxScaler()
df_norm = scaler_mm.fit_transform(df[['temperature', 'pm25', 'wind_speed']])

2.4 本章知识体系总览

下面这张图,是我自己梳理的数据预处理流程。你照着这个走,基本不会出大问题。

环境数据预处理流程 数据来源 数据清洗 标准化/归一化 传感器 · 遥感 · 气象站 缺失值 · 异常值处理 Min-Max · Z-score 高质量环境数据集 特征工程 → 模型训练 核心原则:先清洗,后标准化,再建模 💡 标准化参数(均值、标准差)只从训练集计算,再应用到测试集,避免数据泄露

好了,这一章的内容就这些。数据预处理看着琐碎,但它是整个分析流程的基石。你花80%的时间把数据整干净了,后面建模就是水到渠成的事。

下一章,咱们聊聊特征选择。到时候我会分享一个我压箱底的方法,保证让你眼前一亮。


专注资料整理