2. 环境数据采集与预处理:数据来源、清洗与标准化
大家好,我是老张。今天咱们聊聊环境数据分析里最基础、也最磨人的一步——数据采集与预处理。
说实话,我见过太多人一上来就急着建模调参,结果模型跑出来一塌糊涂。为什么?因为数据源头就没整明白。你想想看,垃圾进垃圾出,再牛的算法也救不了你。
这一章,我就把自己这些年踩过的坑、总结的经验,掰开揉碎了讲给你听。
2.1 数据来源:传感器、遥感与气象站
环境数据从哪来?说白了就三大类:地面传感器、卫星遥感、气象站观测。我一个个说。
2.1.1 传感器数据
传感器是最直接的来源。比如空气质量监测站里的PM2.5传感器、温湿度传感器、CO₂传感器。这些设备每分钟都在往外吐数据。
特点:
- 采样频率高(秒级到分钟级)
- 数据量大,但容易受环境干扰
- 单个传感器故障会导致数据缺失
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 异常值处理
异常值怎么找?我常用的方法就三种:
- 3σ原则: 超出均值±3倍标准差的值,视为异常
- 箱线图法: 超出1.5倍IQR的值,标记为异常
- 领域知识法: 比如PM2.5不可能超过1000 μg/m³
# 异常值检测示例
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 本章知识体系总览
下面这张图,是我自己梳理的数据预处理流程。你照着这个走,基本不会出大问题。
好了,这一章的内容就这些。数据预处理看着琐碎,但它是整个分析流程的基石。你花80%的时间把数据整干净了,后面建模就是水到渠成的事。
下一章,咱们聊聊特征选择。到时候我会分享一个我压箱底的方法,保证让你眼前一亮。