胎儿健康数据分析实战:基于fetal-health.csv的缺失值与异常值处理方案

1次阅读
没有评论

共计 2283 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

在医疗数据分析领域,数据质量直接影响模型的预测效果。胎儿健康数据(如 fetal-health.csv)常因设备误差、人为录入等原因存在缺失值和异常值。本文将系统介绍如何处理这些问题,并附上完整的 Python 代码示例。

胎儿健康数据分析实战:基于 fetal-health.csv 的缺失值与异常值处理方案

背景与痛点

医疗数据中的缺失值和异常值是常见问题,尤其在胎儿健康数据中:

  • 缺失值 :部分检测指标可能因设备故障或未记录而缺失,导致数据不完整
  • 异常值 :设备误差或录入错误可能产生极端值,扭曲统计结果

直接使用原始数据进行建模会导致:

  1. 模型预测偏差增大
  2. 分类准确率下降
  3. 过拟合风险提高

技术方案

缺失值处理

处理缺失值前,需先分析缺失比例和模式:

import pandas as pd

# 加载数据
data = pd.read_csv('fetal-health.csv')

# 计算缺失比例
missing_ratio = data.isnull().mean() * 100
print(missing_ratio.sort_values(ascending=False))

根据缺失情况选择适当方法:

  1. 删除法 :当缺失比例 <5% 且随机缺失时适用
  2. 均值 / 中位数填充 :适用于连续特征
    from sklearn.impute import SimpleImputer
    
    # 中位数填充
    imputer = SimpleImputer(strategy='median')
    data_filled = imputer.fit_transform(data)
  3. KNN 填充 :考虑特征相关性
    from sklearn.impute import KNNImputer
    
    imputer = KNNImputer(n_neighbors=5)
    data_knn = imputer.fit_transform(data)

异常值检测

IQR 箱线图法

import matplotlib.pyplot as plt
import seaborn as sns

# 绘制箱线图
plt.figure(figsize=(12,6))
sns.boxplot(data=data)
plt.xticks(rotation=45)
plt.show()

# IQR 计算
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1

# 定义异常值边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

Z-score 法

from scipy import stats

# 计算 Z -score
z_scores = stats.zscore(data.select_dtypes(include='number'))

# 定义阈值(通常±3)threshold = 3
outliers = (abs(z_scores) > threshold).any(axis=1)

非正态分布特征处理

对于明显偏态的特征:

  1. 考虑使用对数变换
  2. 采用中位数而非均值填充
  3. 使用更稳健的异常值检测方法

代码实现完整流程

# 完整数据清洗流程
import pandas as pd
from sklearn.impute import KNNImputer
from scipy import stats

# 1. 加载数据
data = pd.read_csv('fetal-health.csv')

# 2. 缺失值处理
# 2.1 分析缺失比例
missing_ratio = data.isnull().mean() * 100

# 2.2 对高缺失特征考虑删除
cols_to_drop = missing_ratio[missing_ratio > 30].index
data = data.drop(columns=cols_to_drop)

# 2.3 KNN 填充
imputer = KNNImputer(n_neighbors=5)
data_imputed = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)

# 3. 异常值处理
# 3.1 Z-score 检测
z_scores = stats.zscore(data_imputed.select_dtypes(include='number'))
outliers = (abs(z_scores) > 3).any(axis=1)

# 3.2 替换为分位数边界
for col in data_imputed.select_dtypes(include='number'):
    q1 = data_imputed[col].quantile(0.25)
    q3 = data_imputed[col].quantile(0.75)
    iqr = q3 - q1

    lower = q1 - 1.5 * iqr
    upper = q3 + 1.5 * iqr

    data_imputed[col] = data_imputed[col].clip(lower, upper)

避坑指南

  1. 不要过度删除 :当缺失值比例 <30% 时,优先考虑填充而非删除
  2. 区分特征类型 :分类特征使用众数填充,连续特征使用中位数 /KNN
  3. 检查分布一致性 :处理前后对比特征分布,避免引入偏差

延伸思考

  1. 当某个特征的缺失值超过 30% 时,是否应该直接删除?
  2. 需考虑该特征的重要性,可通过相关性分析决定
  3. 如何处理类别不平衡问题?
  4. 可尝试 SMOTE 过采样方法
    from imblearn.over_sampling import SMOTE
    
    smote = SMOTE()
    X_res, y_res = smote.fit_resample(X, y)

总结

通过系统的缺失值和异常值处理,能显著提升胎儿健康数据的质量。本文介绍的方法不仅适用于医疗数据,也可迁移到其他领域的数据预处理工作中。关键是根据数据特点选择合适的方法,并在处理前后进行充分验证。

正文完
 0
评论(没有评论)