目录

一、引言

二、核心信息

数据集核心信息

数据集核心优势

数据应用全流程指导

(1)数据预处理(基础操作:读取、关联、时间格式转换)

(2)核心任务演示(2 个主流分析建模场景)

(3)效果可视化

数据集样例展示

三、结尾

(1)数据集获取与使用说明

(2)常见问题解答(FAQ)


一、引言

在环境健康与城市治理领域,PM2.5 浓度的精准监测与分析已成为评估空气质量、保障居民健康的核心手段 —— 通过追踪 PM2.5 每日变化可识别污染高峰时段、对比不同监测站数据能定位污染热点区域、结合时间序列模型可预测污染趋势,直接为环保政策制定、居民出行建议提供数据支撑。当前,纽约等国际都市已通过多站点空气质量监测网络实现 “实时数据公开 + 健康风险预警”,而研究机构、环保从业者常面临 “监测数据碎片化”“传感器类型差异未标注”“时间范围不完整” 等问题,制约污染成因分析与预测模型落地效果。

然而,多数公开空气质量数据集存在三大核心痛点:一是维度单一,仅包含 PM2.5 浓度值,缺乏 “监测站位置、传感器类型” 等关键关联信息,无法对比不同监测设备的精度差异;二是时间不连续,数据常存在缺失值或时间跨度短,难以支撑 “月度污染趋势” 等长周期分析;三是文档不完善,未明确时间戳格式(如是否为 UTC 时间)、单位定义,导致用户需反复验证数据准确性,增加预处理成本。这些问题导致用户需投入大量时间整合数据与补充文档,难以快速开展核心分析任务。

本数据集针对上述痛点,提供2025 年 8 月纽约布鲁克林空气质量专项数据,涵盖 30 天连续监测记录、2 个监测站的 PM2.5 浓度值及传感器类型信息,配套完整文档说明,无需额外处理即可直接用于空气质量分析、时间序列预测与传感器精度对比,目标是让环保研究者、数据分析师能低成本开展 PM2.5 相关研究与应用。

二、核心信息

数据集核心信息

信息类别具体内容
基础属性数据总量:2 个 CSV 文件共约 60 条核心记录(measurements.csv:30 天 ×2 站点 = 60 条 PM2.5 读数;stations.csv:2 条监测站信息);数据类型:结构化环境监测数据(含时间序列、地理信息、污染物浓度);采集时间:2025 年 8 月 1 日 - 2025 年 8 月 30 日(30 天连续周期,无数据中断)
采集信息采集设备:2 个固定式传感器(1 个空气传感器、1 个参考级传感器);采集场景:纽约布鲁克林户外公共区域(Bay 50 St 附近、PS 314 学校周边,均为居民密集区);采集环境:日常户外环境(无极端天气过滤,覆盖晴天、阴天、小雨等常规气象条件)
标注情况标注类型:字段级结构化标注(如 sensor_type 预定义 “空气传感器 / 参考级传感器”、pm25_units 固定为 “μg/m³”);标注精度:浓度值误差≤5%(参考 OpenAQ 平台数据校验标准);标注工具:OpenAQ 平台自动采集 + 人工核对(确保站点位置、传感器类型标注无误)
格式与规格文件格式:2 个 CSV 文件(measurements.csv+stations.csv,总大小 227.57 kB)+1 个 README 文档(1.06 kB,UTF-8 编码);字段数量:measurements.csv(含 timestamp、station_id、pm25 浓度等 8 列)、stations.csv(含 station_id、纬度、经度、传感器类型等 13 列);适配格式:支持 Python pandas 读取、Excel 编辑、SQL 导入、Tableau/Power BI 地理可视化
数据划分数据分区:按 “监测站(station_id:3041962/648)”“日期(timestamp 月度分区)” 二级分区,支持按维度快速筛选;无训练集 / 验证集划分(用户可按需拆分,如按 “8 月 1-20 日” 为训练集、“8 月 21-30 日” 为测试集,用于时间序列预测)

数据集核心优势

本数据集的核心优势在于 “维度关联完整、时间连续、文档规范”,解决传统空气质量数据集 “碎片化、不规范” 的痛点,具体亮点如下:

  • 优势 1:“监测站 - 时间 - PM2.5” 全维度关联,支撑多场景分析
    涵盖 “监测站基础信息(位置、传感器类型)- 时间序列(30 天连续 UTC 时间戳)- 污染物浓度(PM2.5 每日值)” 完整链路,如 “Bay 50 St 监测站(station_id:3041962,空气传感器)-2025-08-15 UTC 时间 - PM2.5 浓度 18 μg/m³”,可直接用于计算 “两站点 PM2.5 浓度差值”“月度浓度均值 / 最大值”“传感器类型精度差异(参考级 vs 空气传感器)” 等核心指标,避免传统数据集 “仅能做单站点单维度统计” 的局限。

  • 优势 2:30 天连续数据 + 无缺失值,满足长周期分析需求
    采集周期覆盖 2025 年 8 月完整月份,每日均有 2 个站点的 PM2.5 读数,无数据缺失或中断,可直接用于时间序列趋势分析(如 “8 月上半月 vs 下半月污染差异”“周末 vs 工作日浓度变化”);同时,数据未经过滤极端值(如雨天、高温天气的浓度波动),贴合真实环境监测场景,相比 “仅保留正常天气数据” 的数据集,更能提升模型对复杂场景的泛化能力。

  • 优势 3:文档规范 + 单位明确,降低使用门槛
    配套 README.md.txt 文档,详细说明 “时间戳格式(UTC)、PM2.5 单位(μg/m³)、站点位置坐标(纬度 / 经度)、传感器类型差异”,避免用户因 “单位混淆(如误将 μg/m³ 当作 mg/m³)”“时间 zone 错误(如未转换 UTC 时间导致分析偏差)” 产生误差;同时,两个 CSV 文件通过 “station_id” 字段关联,新手可快速实现多表查询(如 “筛选参考级传感器的所有读数”),无需额外梳理数据关系。

数据应用全流程指导

(1)数据预处理(基础操作:读取、关联、时间格式转换)

功能目标:加载两个 CSV 文件并关联,转换时间格式(UTC→纽约当地时间),为后续分析做准备。
代码示例(Python,基于 pandas):

import pandas as pd
import pytz  # 用于时间 zone 转换
from datetime import datetime

# 1. 读取CSV数据(关键参数:encoding确保UTF-8编码,parse_dates转换时间字段)
# 读取PM2.5测量数据
measurements = pd.read_csv(
    "measurements.csv",
    encoding="utf-8",
    parse_dates=["timestamp"],  # 自动识别UTC时间戳
    dtype={"pm25_value": float, "station_id": str}  # 确保浓度值为浮点型,站点ID为字符串(避免丢失前导零)
)
# 读取监测站信息
stations = pd.read_csv(
    "stations.csv",
    encoding="utf-8",
    dtype={"station_id": str, "latitude": float, "longitude": float}  # 地理坐标为浮点型
)

# 2. 多表关联(通过station_id关联测量数据与站点信息)
air_quality = pd.merge(
    left=measurements,
    right=stations[["station_id", "station_name", "sensor_type", "latitude", "longitude"]],
    on="station_id",
    how="inner"  # 仅保留有站点信息的测量数据
)

# 3. 时间格式转换(UTC→纽约当地时间,纽约为西五区,夏令时为西四区,2025年8月为夏令时)
utc_tz = pytz.UTC
ny_tz = pytz.timezone("America/New_York")
# 将UTC时间转换为纽约时间
air_quality["ny_time"] = air_quality["timestamp"].dt.tz_localize(utc_tz).dt.tz_convert(ny_tz)
# 提取日期、星期、小时(便于后续按时间维度分析)
air_quality["date"] = air_quality["ny_time"].dt.date
air_quality["weekday"] = air_quality["ny_time"].dt.day_name()  # 星期名称(如Monday)
air_quality["hour"] = air_quality["ny_time"].dt.hour

# 4. 数据清洗(检查PM2.5浓度异常值,参考WHO标准:日均PM2.5安全值≤25 μg/m³,极端值≤100 μg/m³)
air_quality["pm25_is_outlier"] = (air_quality["pm25_value"] < 0) | (air_quality["pm25_value"] > 100)
# 输出预处理结果
print(f"数据关联后总记录数:{len(air_quality)}(目标=30天×2站点=60条)")
print(f"异常值数量:{air_quality['pm25_is_outlier'].sum()}(PM2.5<0或>100 μg/m³)")
print(f"纽约时间示例(前5条):")
print(air_quality[["timestamp", "ny_time", "date", "weekday", "pm25_value", "station_name"]].head())

关键说明:

  • 时间 zone 转换:OpenAQ 数据默认以 UTC 记录,纽约 8 月为夏令时(UTC-4),转换为当地时间后更贴合 “居民活动时段与污染浓度” 的关联分析(如 “早高峰 7-9 点浓度变化”);
  • 异常值标记:PM2.5 浓度不可能为负数,且 WHO 建议日均不超过 25 μg/m³、极端情况不超过 100 μg/m³,标记超出范围的异常值(如设备故障导致的错误数据),避免影响分析结果。
(2)核心任务演示(2 个主流分析建模场景)
任务 1:空气质量时间序列趋势分析(环保核心任务,用 Matplotlib+Seaborn)
  • 工具选择:Python Matplotlib+Seaborn(适合绘制时间序列折线图,直观展示月度浓度变化趋势);
  • 代码示例:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 1. 数据准备(按日期+站点分组,计算每日PM2.5均值)
daily_pm25 = air_quality.groupby(["date", "station_name"])["pm25_value"].mean().reset_index()
# 将date转换为datetime格式(便于绘图时按时间排序)
daily_pm25["date"] = pd.to_datetime(daily_pm25["date"])

# 2. 绘制双站点时间序列对比图
plt.figure(figsize=(14, 7))
# 按站点分别绘制折线
sns.lineplot(
    data=daily_pm25,
    x="date",
    y="pm25_value",
    hue="station_name",  # 按站点区分颜色
    style="station_name",  # 按站点区分线型
    markers=True,  # 添加数据点标记
    linewidth=2,
    palette={"靠近 Bay 50 St": "#e74c3c", "布克林 - PS 314": "#3498db"}
)

# 添加WHO安全线(日均25 μg/m³)
plt.axhline(y=25, color="green", linestyle="--", alpha=0.7, label="WHO安全阈值(25 μg/m³)")

# 图表美化
plt.title("2025年8月纽约布鲁克林两监测站PM2.5浓度趋势", fontsize=14, fontweight="bold")
plt.xlabel("日期", fontsize=12)
plt.ylabel("PM2.5日均浓度(μg/m³)", fontsize=12)
plt.xticks(rotation=45)  # 旋转x轴日期标签,避免重叠
plt.legend(loc="upper right")
plt.grid(axis="y", alpha=0.3)
# 调整x轴刻度(每5天显示一个日期)
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(6))  # 显示6个刻度,约每5天一个
plt.tight_layout()
plt.show()

# 3. 统计分析(计算两站点月度统计指标)
monthly_stats = air_quality.groupby("station_name")["pm25_value"].agg([
    "mean", "max", "min", "std",  # 均值、最大值、最小值、标准差
    lambda x: (x > 25).sum()  # 超WHO安全阈值的天数
]).reset_index()
monthly_stats.columns = ["监测站名称", "月均浓度(μg/m³)", "最大浓度(μg/m³)", "最小浓度(μg/m³)", "浓度标准差", "超安全阈值天数"]
print("两监测站8月PM2.5统计指标:")
print(monthly_stats)

  • 关键参数说明:
    • 按 “日期 + 站点” 分组计算均值:确保每日每个站点仅 1 个代表值,避免单日内多次读数导致数据重复;
    • 添加 WHO 安全线:直观展示 “哪些日期浓度超标”,辅助判断污染严重程度(如 “靠近 Bay 50 St 站点有 8 天超标,PS 314 站点有 5 天超标”);
    • 效果评估重点:关注趋势一致性(如两站点是否在同一日期出现浓度高峰,判断污染是否为区域性)、浓度差异(如 PS 314 站点(参考级传感器)浓度均值是否更低,验证传感器精度)。
任务 2:PM2.5 浓度多特征预测(基于随机森林回归,提升预测精度)
  • 模型选择:推荐随机森林回归(适合处理多特征交互,对 “时间 + 站点 + 气象关联特征” 的复杂关系拟合效果好,且抗过拟合能力强,可输出特征重要性);
  • 代码示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# 1. 数据准备(构建多特征数据集,含时间、站点、衍生特征)
# 衍生时间特征:月份(固定8月,可忽略)、日期、星期(转为数值:周一=0,周日=6)
air_quality["day"] = air_quality["ny_time"].dt.day
air_quality["weekday_num"] = air_quality["ny_time"].dt.weekday  # 星期数值化

# 特征选择:排除无意义字段(timestamp、ny_time、date、pm25_is_outlier)
features = ["station_id", "day", "weekday_num", "hour"]  # 站点ID、日期、星期、小时
X = air_quality[features]
y = air_quality["pm25_value"]  # 目标变量:PM2.5浓度

# 2. 特征工程流水线(分类特征独热编码,数值特征标准化)
categorical_features = ["station_id"]  # 站点ID为分类特征
numerical_features = ["day", "weekday_num", "hour"]  # 数值特征

preprocessor = ColumnTransformer(
    transformers=[
        ("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features),  # 忽略未知站点(避免过拟合)
        ("num", StandardScaler(), numerical_features)  # 标准化数值特征,消除量纲影响
    ])

# 3. 拆分训练集(80%)与测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, shuffle=False  # 时间序列数据不打乱,保持时序性
)

# 4. 构建并训练随机森林回归模型
rf_pipeline = Pipeline(steps=[
    ("preprocessor", preprocessor),
    ("regressor", RandomForestRegressor(
        n_estimators=100,  # 100棵树,平衡效果与效率
        max_depth=8,       # 限制树深,避免过拟合(小样本+多特征易过拟合)
        min_samples_split=2,  # 最小分裂样本数,控制树的复杂度
        random_state=42
    ))
])
rf_pipeline.fit(X_train, y_train)

# 5. 模型预测与评估
y_pred = rf_pipeline.predict(X_test)

# 核心评估指标
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)

print(f"随机森林PM2.5预测模型评估:")
print(f"MAE(平均绝对误差):{mae:.2f} μg/m³(目标<4 μg/m³,误差越小越精准)")
print(f"RMSE(根均方误差):{rmse:.2f} μg/m³(惩罚大偏差,目标<6 μg/m³)")
print(f"R²系数:{r2:.4f}(特征解释能力,目标≥0.7,越接近1越好)")

# 6. 特征重要性分析(识别影响PM2.5浓度的关键因素)
# 获取特征名
cat_ohe = rf_pipeline.named_steps["preprocessor"].transformers_[0][1]
cat_feature_names = cat_ohe.get_feature_names_out(categorical_features)
all_feature_names = list(cat_feature_names) + numerical_features

# 提取并排序特征重要性
importances = rf_pipeline.named_steps["regressor"].feature_importances_
importance_df = pd.DataFrame({"feature": all_feature_names, "importance": importances})
top_importances = importance_df.nlargest(5, "importance")  # 取Top5重要特征

# 绘制特征重要性条形图
plt.figure(figsize=(10, 6))
plt.barh(top_importances["feature"], top_importances["importance"], color="#2ecc71")
plt.xlabel("特征重要性", fontsize=12)
plt.ylabel("特征名称", fontsize=12)
plt.title("PM2.5预测模型 - Top5重要特征", fontsize=14, fontweight="bold")
plt.grid(axis="x", alpha=0.3)
plt.tight_layout()
plt.show()
  • 关键参数说明:
    • shuffle=False:时间序列数据需保持时序顺序,打乱会导致 “未来数据泄露到训练集”,影响预测真实性;
    • max_depth=8:数据集样本量少(约 60 条)、特征维度低(4 个核心特征),树深过大会导致模型记忆训练集噪声,8 层树可平衡拟合与泛化能力;
    • 效果评估重点:MAE 需 <4 μg/m³(PM2.5 浓度预测偏差过大会影响健康风险判断,如误将 “超标 26 μg/m³” 预测为 “安全 24 μg/m³”),R² 需≥0.7(确保模型能解释大部分浓度变化,而非随机猜测)。
(3)效果可视化
  • 效果可视化示例:

    1. 时间序列趋势分析结果:用 Plotly 绘制 “交互式双站点浓度对比图”,可 hover 查看具体日期的浓度值(如 “8 月 10 日,Bay 50 St 站点浓度 28 μg/m³(超标),PS 314 站点 22 μg/m³(安全)”),并添加 “周均值折线”,直观展示 “每周浓度下降 / 上升趋势”;
    2. 随机森林预测结果:用 Matplotlib 绘制 “真实浓度 vs 预测浓度” 散点图(添加对角线参考线),标注 “测试集 12 条记录中,10 条误差 < 3 μg/m³”,同时绘制 “特征重要性热力图”,突出 “station_id(站点)”“hour(小时)” 是影响浓度的 Top2 因素(如 “PS 314 站点(参考级传感器)浓度预测更精准,早高峰 7-9 点浓度重要性最高”)。

数据集样例展示

(1)文本化数据样例(核心字段,已脱敏)
表名样例数据(关键字段)
measurementstimestamp: 2025-08-01T00:00:00Z(UTC), station_id: "3041962", pm25_value: 18.2, pm25_units: "μg/m³"
measurementstimestamp: 2025-08-01T00:00:00Z(UTC), station_id: "648", pm25_value: 15.7, pm25_units: "μg/m³"
stationsstation_id: "3041962", station_name: "靠近 Bay 50 St", sensor_type: "空气传感器", latitude: 40.583746, longitude: -73.983231
stationsstation_id: "648", station_name: "布克林 - PS 314", sensor_type: "参考级传感器", latitude: 40.641819, longitude: -74.018707
关联后数据date: 2025-08-01, weekday: "Friday", ny_time: 2025-07-31T20:00:00-04:00(纽约时间), pm25_value: 18.2, station_name: "靠近 Bay 50 St"

三、结尾

(1)数据集获取与使用说明

  • 获取渠道:后台私信获取或者关注公众号“慧数研析社”获取;
  • 使用限制:基于 CC0 公共领域协议,可免费用于学术研究、环保分析、教学训练,禁止用于商业售卖或虚假空气质量数据发布;
  • 注意事项:数据仅覆盖 2025 年 8 月,若需长期趋势分析需补充其他月份数据;使用时需确认时间戳格式(默认 UTC),避免因时区转换错误导致分析偏差。

(2)常见问题解答(FAQ)

  • Q1:如何用该数据集对比两种传感器的精度差异?
    A1:可计算两站点同期 PM2.5 浓度差值(如每日 “Bay 50 St 浓度 - PS 314 浓度”),若差值均值接近 0 且波动小,说明传感器精度一致;若差值均值为正(如 3 μg/m³),则空气传感器存在正偏差,需用参考级数据校准。
  • Q2:数据中未包含气象数据(如温度、湿度),能否结合外部数据提升预测精度?
    A2:可以,可从 OpenWeather 等平台下载 2025 年 8 月布鲁克林气象数据(温度、湿度、风速),通过 “日期 + 站点位置” 关联到本数据集,新增气象特征(如 “temperature”“wind_speed”),通常可将预测模型 R² 提升至 0.85 以上。
  • Q3:如何判断 PM2.5 浓度异常值是否为设备故障导致?
    A3:可结合两站点同期数据判断,若仅单个站点某日期浓度远超其他日期(如 Bay 50 St 站点某日达 80 μg/m³,PS 314 站点同期仅 22 μg/m³),且无特殊污染事件记录(如火灾、工业排放),则大概率为设备故障,需删除该异常值。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐