跳转到内容
标准解读已发布

监测数据异常识别与处理规范 AI深度解读

对监测数据异常的识别方法、处理流程、报告要求进行工程化解读,提供可直接执行的数据质量管控方案

复核 2026-07-09入门公开可引用RailWise 技术团队
标准解读

监测数据异常识别与处理规范 AI深度解读

Section titled “监测数据异常识别与处理规范 AI深度解读”

AI语义标签: #数据异常 #异常识别 #粗差剔除 #数据质量 #监测报告 #预警判断 #统计分析 #质量控制


项目 内容
技术领域 监测数据质量控制
适用范围 工程监测数据的异常识别、处理和质量控制
核心标准 GB 50497-2019、GB 50911-2013、JGJ 8-2016
技术特点 统计方法、工程经验、系统流程相结合

主要技术内容

  • 数据异常类型识别
  • 异常识别方法
  • 异常数据处理流程
  • 数据质量评估
  • 报告要求

规范要求(GB 50497-2019 第7.0.4条):

“监测数据出现异常时,应分析原因,判断是否为真实变形或测量误差,并应及时处理。”

AI解读

这条条文在实际中意味着数据异常首先要分类,不同类型有不同的处理方法

数据异常分类体系

数据异常
├─ 测量误差(非真实变形)
│ ├─ 粗差(操作错误、仪器故障)
│ │ ├─ 读数错误
│ │ ├─ 记录错误
│ │ ├─ 仪器未整平
│ │ ├─ 棱镜未对中
│ │ └─ 通信错误
│ ├─ 系统误差(仪器偏差、方法偏差)
│ │ ├─ i角误差
│ │ ├─ 尺长误差
│ │ ├─ 温度影响
│ │ └─ 大气折光
│ └─ 随机误差(观测条件波动)
│ ├─ 风力影响
│ ├─ 光照变化
│ └─ 地面振动
└─ 真实变形(工程实际变化)
├─ 正常变形(可预期)
│ ├─ 施工荷载引起的变形
│ ├─ 温度引起的变形
│ └─ 时间效应(蠕变、固结)
└─ 异常变形(需关注)
├─ 突变(单日变化异常大)
├─ 加速(变化速率持续增加)
├─ 超限(累计值超过预警值)
└─ 异常分布(局部异常,其他点正常)

统计方法

# 监测数据异常识别方法库
import numpy as np
from scipy import stats
class AnomalyDetection:
"""监测数据异常识别类"""
def __init__(self, data):
"""
初始化
参数:
data: 时间序列数据 [(timestamp, value), ...]
"""
self.data = sorted(data, key=lambda x: x[0])
self.values = np.array([d[1] for d in self.data])
# 方法1:3σ准则(拉依达准则)
def detect_3sigma(self, threshold=3):
"""
3σ准则检测异常值
原理:数据应服从正态分布,偏离均值超过3倍标准差的为异常值
参数:
threshold: 倍数(通常取3)
返回:
异常点索引列表
"""
mean = np.mean(self.values)
std = np.std(self.values, ddof=1)
anomalies = []
for i, value in enumerate(self.values):
if abs(value - mean) > threshold * std:
anomalies.append({
'index': i,
'timestamp': self.data[i][0],
'value': value,
'deviation': round(abs(value - mean) / std, 2),
'method': '3σ准则'
})
return anomalies
# 方法2:格拉布斯准则(Grubbs' Test)
def detect_grubbs(self, alpha=0.05):
"""
格拉布斯准则检测异常值
原理:假设数据服从正态分布,检验最大/最小值是否为异常值
参数:
alpha: 显著性水平(通常取0.05)
返回:
异常点列表
"""
n = len(self.values)
anomalies = []
# 计算格拉布斯统计量
mean = np.mean(self.values)
std = np.std(self.values, ddof=1)
# 查找最大偏差
max_idx = np.argmax(np.abs(self.values - mean))
max_deviation = abs(self.values[max_idx] - mean) / std
# 查表或计算临界值(简化计算)
# G临界值 ≈ (n-1)/√n * sqrt(t²/(n-2+t²)),t为t分布临界值
from scipy.stats import t
t_critical = t.ppf(1 - alpha / (2 * n), n - 2)
g_critical = (n - 1) / np.sqrt(n) * np.sqrt(t_critical**2 / (n - 2 + t_critical**2))
if max_deviation > g_critical:
anomalies.append({
'index': max_idx,
'timestamp': self.data[max_idx][0],
'value': self.values[max_idx],
'deviation': round(max_deviation, 2),
'critical': round(g_critical, 2),
'method': '格拉布斯准则'
})
return anomalies
# 方法3:变化速率异常检测
def detect_rate_anomaly(self, max_rate):
"""
检测变化速率异常
参数:
max_rate: 最大允许变化速率(单位/天)
返回:
速率异常点列表
"""
from datetime import datetime
anomalies = []
for i in range(1, len(self.data)):
time_diff = (self.data[i][0] - self.data[i-1][0]).total_seconds() / 86400 # 天
if time_diff > 0:
rate = (self.values[i] - self.values[i-1]) / time_diff
if abs(rate) > max_rate:
anomalies.append({
'index': i,
'timestamp': self.data[i][0],
'value': self.values[i],
'rate': round(rate, 2),
'max_rate': max_rate,
'method': '速率异常检测'
})
return anomalies
# 方法4:趋势突变检测(CUSUM算法)
def detect_cusum(self, threshold=5):
"""
CUSUM(累积和)算法检测趋势突变
原理:累积计算偏离参考值的程度,超过阈值则判定为突变
参数:
threshold: CUSUM阈值
返回:
突变点列表
"""
mean = np.mean(self.values)
std = np.std(self.values, ddof=1)
cusum_pos = np.zeros(len(self.values))
cusum_neg = np.zeros(len(self.values))
anomalies = []
for i in range(1, len(self.values)):
# 标准化
z = (self.values[i] - mean) / std
# 正向累积和
cusum_pos[i] = max(0, cusum_pos[i-1] + z - 0.5)
# 负向累积和
cusum_neg[i] = max(0, cusum_neg[i-1] - z - 0.5)
# 检测超限
if cusum_pos[i] > threshold or cusum_neg[i] > threshold:
anomalies.append({
'index': i,
'timestamp': self.data[i][0],
'value': self.values[i],
'cusum_pos': round(cusum_pos[i], 2),
'cusum_neg': round(cusum_neg[i], 2),
'method': 'CUSUM算法'
})
return anomalies
# 综合检测
def detect_all(self, config):
"""
综合异常检测
参数:
config: 检测配置
{
'3sigma': {'enabled': True, 'threshold': 3},
'grubbs': {'enabled': True, 'alpha': 0.05},
'rate': {'enabled': True, 'max_rate': 5},
'cusum': {'enabled': True, 'threshold': 5}
}
返回:
综合异常报告
"""
all_anomalies = []
if config.get('3sigma', {}).get('enabled', False):
all_anomalies.extend(self.detect_3sigma(
config['3sigma'].get('threshold', 3)
))
if config.get('grubbs', {}).get('enabled', False):
all_anomalies.extend(self.detect_grubbs(
config['grubbs'].get('alpha', 0.05)
))
if config.get('rate', {}).get('enabled', False):
all_anomalies.extend(self.detect_rate_anomaly(
config['rate'].get('max_rate', 5)
))
if config.get('cusum', {}).get('enabled', False):
all_anomalies.extend(self.detect_cusum(
config['cusum'].get('threshold', 5)
))
# 去重(同一时间点多个方法检测到)
seen = set()
unique_anomalies = []
for a in all_anomalies:
key = (a['timestamp'], a['value'])
if key not in seen:
seen.add(key)
unique_anomalies.append(a)
return unique_anomalies
# 使用示例
from datetime import datetime, timedelta
# 模拟监测数据(含异常值)
base_date = datetime(2025, 1, 1)
data = []
for i in range(30):
date = base_date + timedelta(days=i)
# 正常变化:每天约0.5mm
value = i * 0.5 + np.random.normal(0, 0.2)
# 第10天插入粗差
if i == 10:
value += 15 # 异常偏大
# 第20天插入速率异常
if i == 20:
value += 8
data.append((date, value))
detector = AnomalyDetection(data)
config = {
'3sigma': {'enabled': True, 'threshold': 3},
'grubbs': {'enabled': True, 'alpha': 0.05},
'rate': {'enabled': True, 'max_rate': 3},
'cusum': {'enabled': True, 'threshold': 5}
}
anomalies = detector.detect_all(config)
print(f"检测到 {len(anomalies)} 个异常点:")
for a in anomalies:
print(f" {a['timestamp'].strftime('%Y-%m-%d')}: 值={a['value']:.2f}, 方法={a['method']}")

处理流程

发现异常
└─ 自动化系统报警或人工审核发现
初步判断
├─ 检查仪器状态(是否故障、被遮挡、断电)
├─ 检查观测条件(天气、温度、施工干扰)
├─ 检查数据记录(是否读错、记错、传错)
└─ 判断:仪器问题 / 观测问题 / 真实变形
分类处理
├─ 仪器问题
│ ├─ 修复或更换仪器
│ ├─ 标记该时段数据为"异常"
│ └─ 恢复后重新观测
├─ 观测问题
│ ├─ 重新观测(人工复核)
│ ├─ 以复核数据为准
│ └─ 记录问题原因
└─ 真实变形
├─ 确认变形性质(正常/异常)
├─ 分析变形原因
├─ 判断发展趋势
├─ 启动预警流程(如异常)
└─ 提出处置建议
记录归档
├─ 异常记录(时间、测点、数值、原因、处理)
├─ 处理记录(方法、结果、责任人)
└─ 报告更新(如影响已发布数据)

质量评估指标体系

# 数据质量评估
def assess_data_quality(data, config):
"""
评估监测数据质量
参数:
data: 监测数据 [(timestamp, value), ...]
config: 质量评估配置
{
'completeness_threshold': 0.95, # 完整性阈值
'consistency_threshold': 0.90, # 一致性阈值
'timeliness_threshold': 24 # 及时性阈值(小时)
}
返回:
质量评估报告
"""
from datetime import datetime
report = {
'completeness': {},
'consistency': {},
'timeliness': {},
'overall_score': 0
}
# 1. 完整性评估
expected_count = config.get('expected_count', len(data))
actual_count = len([d for d in data if d[1] is not None])
completeness_rate = actual_count / expected_count if expected_count > 0 else 0
report['completeness'] = {
'rate': round(completeness_rate, 3),
'expected': expected_count,
'actual': actual_count,
'status': '合格' if completeness_rate >= config.get('completeness_threshold', 0.95) else '不合格'
}
# 2. 一致性评估(相邻数据变化合理性)
values = [d[1] for d in data if d[1] is not None]
consistent_count = 0
for i in range(1, len(values)):
change = abs(values[i] - values[i-1])
if change <= config.get('max_reasonable_change', 10): # 最大合理变化量
consistent_count += 1
consistency_rate = consistent_count / (len(values) - 1) if len(values) > 1 else 1
report['consistency'] = {
'rate': round(consistency_rate, 3),
'status': '合格' if consistency_rate >= config.get('consistency_threshold', 0.90) else '不合格'
}
# 3. 及时性评估
if len(data) > 0:
last_time = max([d[0] for d in data])
hours_since_last = (datetime.now() - last_time).total_seconds() / 3600
report['timeliness'] = {
'hours_since_last': round(hours_since_last, 1),
'status': '合格' if hours_since_last <= config.get('timeliness_threshold', 24) else '不合格'
}
# 4. 综合评分
scores = []
if report['completeness']['status'] == '合格':
scores.append(report['completeness']['rate'])
if report['consistency']['status'] == '合格':
scores.append(report['consistency']['rate'])
if report['timeliness']['status'] == '合格':
scores.append(1.0)
report['overall_score'] = round(np.mean(scores), 3) if scores else 0
report['overall_status'] = '合格' if report['overall_score'] >= 0.85 else '不合格'
return report

误区1:“数据异常就是测量错误”

Section titled “误区1:“数据异常就是测量错误””

错误认知:所有异常数据都是测量问题,应该删除 ✅ 正确理解:数据异常可能是真实变形的反映。应先分析原因,确认是测量问题后再处理,不能盲目删除

错误认知:发现异常就删掉,不影响整体 ✅ 正确理解:删除数据需要记录原因,且可能影响统计结果。应保留原始数据,标记异常,使用修正值或重新观测

错误认知:只有突然变化大的数据才是异常 ✅ 正确理解:异常包括:突变、加速、波动异常、分布异常、缺失等。持续缓慢但超出预期的变化同样是异常

误区4:“自动化系统不会出错”

Section titled “误区4:“自动化系统不会出错””

错误认知:自动化监测数据不需要人工审核 ✅ 正确理解:自动化系统也可能出错:通信错误、传感器故障、软件bug。必须建立人工复核机制


标准编号 标准名称 关联内容
GB 50497-2019 建筑基坑工程监测技术规范 监测数据处理要求
GB 50911-2013 城市轨道交通工程监测技术规范 监测数据质量要求
JGJ 8-2016 建筑变形测量规范 测量数据处理方法
GB 50026-2020 工程测量标准 测量精度评定

检测方法 阈值 适用场景 备注
3σ准则 3倍标准差 一般数据筛选 假设正态分布
格拉布斯准则 查表值 小样本数据 更严格
速率检测 3-5mm/d 沉降/位移数据 根据工程调整
CUSUM 5-10 趋势突变检测 需标定
箱线图 1.5IQR 批量数据筛选 非参数方法
指标 优秀 合格 不合格
完整性 ≥98% ≥95% <95%
一致性 ≥95% ≥90% <90%
及时性 ≤12h ≤24h >24h
综合评分 ≥95 ≥85 <85

| 序号 | 日期 | 测点编号 | 异常值 | 正常范围 | 异常类型 | 原因分析 | 处理方法 | 处理结果 | 责任人 |
|------|------|---------|--------|---------|---------|---------|---------|---------|-------|
| 1 | | | | | | | | | |
| 2 | | | | | | | | | |

Q1:如何判断数据异常是测量问题还是真实变形? A:检查:1)同期其他测点是否也异常(仪器问题通常影响多个点);2)施工工况是否有变化(真实变形通常与施工相关);3)气象条件是否异常(温度、降雨);4)重新观测验证。

Q2:异常数据删除后,累计值怎么计算? A:有两种方法:1)用前后正常数据的插值代替;2)从异常点重新累计。应在报告中说明处理方法。

Q3:数据缺失怎么处理? A:短期缺失(1-2次)可插值;长期缺失应标记并在报告中说明。不能随意编造数据。

Q4:不同观测员的数据差异大怎么办? A:分析差异原因(仪器、方法、时间),以精度更高的为准。如差异系统存在,应统一观测员或加强培训。



文档版本:v1.0.0
最后更新:2025-01-15
审核状态:已通过技术审核
适用范围:RailWise知识库内部使用及客户参考

引用与复核把知识带回真实工程判断

引用时保留页面与来源线索;涉及标准条文、阈值、频率和项目结论,请回到现行依据与责任人复核。

查看 Agent 使用规则