4. 海洋环境数据探索性分析与可视化
海洋环境数据在进入建模之前,必须先回答三个问题:单个变量长什么样、变量之间如何联动、异常值出现在哪里。探索性分析(EDA)正是围绕这三问展开的。本节以一套假设的渤海某观测区数据为例,说明如何用统计图表与地理空间可视化工具,把分布特征、时空相关性和极端事件识别落到可判读的图上。
一、先明确数据对象与坐标约定
假设我们拿到一份2019—2023年的逐日海洋环境数据集,包含:海表温度(SST,℃)、盐度(SSS,PSU)、有效波高(Hs,m)、风速(WS,m/s)、叶绿素a浓度(Chl-a,mg/m³),以及经度、纬度、水深和观测时间。空间范围为118°E—122°E、37°N—41°N,共约200个格点。约定如下:经度向东为正,纬度向北为正;时间统一为UTC+8;异常判定以“相对同一格点同一季节的多年统计”为参照,而非全海域统一阈值——这一点在后续极端事件识别中非常关键。
二、分布特征:从直方图到分位数
分布分析的第一步是看形态。对SST绘制直方图并叠加核密度曲线,可以快速判断是否双峰。若数据在夏季出现明显右偏,往往意味着近岸浅水区高温格点被混入,需要按水深分层再看。对Hs这类正偏变量,直接看均值会失真,应同时给出中位数、四分位数和95%分位数。示例中Hs的中位数约0.8 m,95%分位约2.1 m,说明“平均海况”与“可作业海况”差距很大,工程评估应以高分位为准。
分布分析还应包含缺失与异常筛查。用箱线图按月份分组,可以直观看到某月是否存在大量离群点;若某格点连续多日SST恒定不变,通常是传感器卡值而非真实海况,应标记为可疑并回溯原始记录。下图展示了本节的分析主线:从原始格点数据出发,经分布、相关、极端三条支路,最终汇入地理空间图层与结论。
三、时空相关性:相关矩阵与滞后分析
变量间关系先用皮尔逊相关矩阵粗看。示例数据中,WS与Hs的相关系数约0.78,符合风浪主导的物理直觉;SST与Chl-a呈弱负相关(约−0.35),提示升温可能抑制营养盐上涌。但相关矩阵只反映同期线性关系,海洋过程常有滞后:冬季强风过后,混合层加深,SST下降往往滞后1—3天。因此应对WS与SST做滞后相关分析,逐日平移计算相关系数,找出峰值所在的滞后天数。
空间相关则借助经验正交函数(EOF)分解或空间滞后图。对SST距平场做EOF,第一模态若呈全海域同号分布,说明受大尺度强迫主导;第二模态若呈南北反号,则可能对应沿岸流与外侧水体的交换。把第一模态的时间系数与季风指数做相关,就能把“空间型”和“外部驱动”联系起来。实际操作中,用xarray读取NetCDF后先做纬度余弦加权,再调用eofs库分解,避免高纬格点被过度加权。
四、极端事件识别:阈值要分季节、分格点
极端事件识别最忌“一刀切”。同样是28℃的SST,在夏季是常态,在冬季则是海洋热浪信号。合理做法是:对每个格点、每个季节,用多年同日窗口(如±15天)计算90%或95%分位作为阈值,超过阈值且持续5天以上记为一次海洋热浪事件。对Hs则关注超阈值序列的持续时长与重现期,可用超阈值(POT)方法拟合广义帕累托分布,估算50年一遇波高。
识别之后必须回到地图上验证。把事件发生频次按格点统计并填色,若高频区集中在近岸浅水或特定海峡口,说明地形与局地动力是主因;若呈大片均匀分布,则更可能是大尺度气候模态驱动。下图给出一个可复用的判读流程,帮助把“统计异常”转化为“可解释的海洋现象”。
# 示例:按格点-季节计算SST 95%分位阈值(xarray思路)
import xarray as xr
ds = xr.open_dataset("bohai_sst_2019_2023.nc")
sst = ds["sst"] # 维度: time, lat, lon
clim = sst.groupby("time.season").quantile(0.95, dim="time")
anom = sst.groupby("time.season") - clim
mask = anom > 0 # 超阈值掩膜
# 连续5天以上判定为事件,可用 rolling 统计持续天数
run = mask.rolling(time=5).sum() == 5
event_days = run.groupby("time.season").sum(dim="time")
event_days.plot() # 输出格点事件频次图
五、工具选择与呈现要点
统计图表用Matplotlib/Seaborn完成分布与相关分析,地理空间可视化用Cartopy叠加海岸线,交互探索可用Plotly或HoloViews实现时间滑块。呈现时有几条经验:填色图务必标注色标单位与方向;相关矩阵只显示下三角并标注显著性格点;极端事件图应同时给出阈值线和事件区间阴影,让读者一眼看出“哪段超了、超了多久”。所有示例数值均为教学假设,实际分析须以真实质控数据重新计算。