【记】数学建模中的数据处理方法

目录

一、缺失值处理

1.1 填补法

1.  平均值填补法: 

2.  中位数填补法:

3.  众数填补法:

4. 零值填补法:

5. 邻近值填补法:

1.2 插值法

1.  拉格朗日插值法:

①  基本插值多项式:

②  两点插值(线性插值):

③  三点插值(二次插值/抛物线插值):

④  插值余项:

二、异常值处理

2.1  删除异常值

2.2  替换异常值

2.3  标记异常值

2.4  使用鲁棒统计方法

2.5  使用异常值检测算法

2.6  使用机器学习模型

三、数据清洗

3.1  去除重复数据:

3.2  去除噪声数据:

3.3  去除不相关数据:

四、总结


一、缺失值处理

1.1 填补法

1.  平均值填补法: 

  • 少量缺失值:当数据集中缺失值较少时,平均值插值法可以快速且有效地填补缺失值,而不会显著影响数据的整体分布。
  • 均匀分布:当数据分布较为均匀时,平均值插值法可以较好地反映数据的整体特征。
  • 简单特征:对于特征较为简单、变化不大的数据集,平均值插值法可以提供合理的估计。
  • 无明显模式:当缺失数据没有明显的模式或规律时,平均值插值法可以作为一种简单且有效的方法。
  • 计算资源限制:在计算资源有限的情况下,平均值插值法由于其简单性和低计算复杂度,可以快速完成插值任务。
  • 初步处理:在数据预处理阶段,平均值插值法可以作为一种初步的处理方法,快速填补缺失值,以便进行后续的数据分析和建模。
  • 代码示例:
    import pandas as pd
    import numpy as np
    
    # 创建一个包含缺失值的数据集
    data = {
        'A': [1, 2, np.nan, 4, 5],
        'B': [5, np.nan, np.nan, 8, 10],
        'C': [np.nan, 2, 3, 4, 5]
    }
    df = pd.DataFrame(data)
    
    # 使用平均值插值法填补缺失值
    df_filled = df.fillna(df.mean())
    
    print("原始数据集:")
    print(df)
    print("\n填补缺失值后的数据集:")
    print(df_filled)

2.  中位数填补法:

  • 数据分布不均匀:当数据分布不均匀,特别是存在偏态(如右偏或左偏)时,中位数插值法可以更好地反映数据的中心趋势,而不会受到极值的影响。
  • 数据包含异常值:当数据集中存在异常值时,平均值插值法可能会受到异常值的影响,而中位数插值法则不会受到异常值的影响。
  • 大数据集:在大数据集中,中位数插值法可以提供一个较为稳定的估计值,因为中位数不会受到少量异常值的影响。
  • 数据特征复杂:对于具有复杂特征的数据集,中位数插值法可以提供一个较为稳定的估计值,而不会受到数据分布的影响。
  • 少量缺失值:当数据集中缺失值较少时,中位数插值法可以快速且有效地填补缺失值,而不会显著影响数据的整体分布。
  • 数据类型为数值型:中位数插值法主要适用于数值型数据,对于分类型数据,可能需要使用其他插值方法,如众数插值法。
  • 示例代码:
    import pandas as pd 
    import numpy as np 
    # 创建一个包含缺失值的数据集 
    data = { 
        'A': [1, 2, np.nan, 4, 5], 
        'B': [5, np.nan, np.nan, 8, 10], 
        'C': [np.nan, 2, 3, 4, 5] 
    } 
    df = pd.DataFrame(data) 
    # 使用中位数插值法填补缺失值 
    df_filled = df.fillna(df.median()) print("原始数据集:") 
    print(df) print("\n填补缺失值后的数据集:") 
    print(df_filled)
  • 注意事项:

      ①  中位数插值法可能会掩盖数据的真实分布

      ②  对于具有明显模式的数据集,中位数插值法可能不适用,需要考虑其他插值方法。

      ③  主要适用于数值型数据,对于分类型数据,需要使用其他方法,如众数插值法。

3.  众数填补法:

  • 分类型数据:众数插值法特别适用于分类型数据,因为分类数据通常具有有限的取值范围,众数可以很好地反映数据的主要趋势。
  • 数据集中分布:当数据集中某些值出现频率非常高时,众数插值法可以提供一个合理的估计值。
  • 少量缺失值:当数据集中缺失值较少时,众数插值法可以快速且有效地填补缺失值,而不会显著影响数据的整体分布。
  • 简单特征:对于特征较为简单、变化不大的数据集,众数插值法可以提供一个较为稳定的估计值。
  • 数据异常值:当数据集中存在异常值时,众数插值法不会受到异常值的影响,因为众数是基于频率最高的值。
  • 示例代码:
    import pandas as pd
    import numpy as np
    
    # 创建一个包含缺失值的数据集
    data = {
        'A': [1, 2, np.nan, 4, 5],
        'B': ['a', np.nan, np.nan, 'a', 'b'],
        'C': [np.nan, 2, 3, 4, 5]
    }
    df = pd.DataFrame(data)
    
    # 使用众数插值法填补缺失值
    df_filled = df.fillna(df.mode().iloc[0])
    
    print("原始数据集:")
    print(df)
    print("\n填补缺失值后的数据集:")
    print(df_filled)
    

4. 零值填补法:

根据题目的要求和实际情况,缺失值也可以直接用0值填补。同样道理,我们也可以用其他符合题目情景的某个数字去填补。

5. 邻近值填补法:

用缺失值附近的数据进行填补,比如2020年的C题C109,补全数据的方式是找到下一年(或上一年)完整的数据,进行等比例补全。

  • 均匀分布:当数据分布较为均匀时,邻近值填补法可以提供一个合理的估计值。
  • 特征简单:对于特征较为简单、变化不大甚至有明显规律的数据集,邻近值填补法可以提供一个较为稳定的估计值。
  • 缺失值较少:当数据集中缺失值较少时,邻近值填补法可以快速且有效地填补缺失值,而不会显著影响数据的整体分布。
  • 线性关系:当数据点之间的关系较为线性时,邻近值填补法可以提供一个较为准确的估计值。
  • 数值型数据:邻近值填补法主要适用于数值型数据,对于分类型数据,可能需要使用其他插值方法,如众数插值法。
  • 数据点之间距离小:当数据点之间的距离较小时,邻近值填补法可以提供一个较为准确的估计值。

1.2 插值法

数据插值通过已知数据点的值来估计未知数据点的值,填补缺失数据,使数据集更加完整和连续。

       一般地,如许多实际问题中,虽然根据实际情况可以断定所考虑的函数f(x)在我们考虑的区间上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到该函数在有限个点上的函数值(即一张函数表)。

      显然,要利用这张函数表来分析函数的性态,甚至直接求出在其他一些点上的函数值是非常困难的。在有些情况下,虽然可以给出函数f(x)的解析表达式,但由于结构相当复杂,使用起来也很不方便。面对这些情况,希望根据所得函数表(或结构复杂的解析表达式),构造某个形式上简单的函数\psi (x)作为未知函数f(x)的近似

       插值法是解决此类问题的一种常用的经典方法,它是进一步学习数值计算的基础,也被广泛地应用于生产实际和科学研究中。

简单介绍在建模中常用的几个插值方法:

1.  拉格朗日插值法:

①  基本插值多项式:

拉格朗日插值法的核心思想是构建一个多项式函数,使其在已知数据点处的值与已知数据点的值相同。

先考虑简单的插值问题:对节点x_{i}(i=0,1,……,n)中任意一点x_{k}作一个n次多项式,使得它在该点上取值为1,而在其余点取值为0,即满足插值条件(式1.2.1)

l_{k}(x_{i})=\left\{\begin{matrix} 1,i=k\\ 0,i\neq k \end{matrix}\right. 

所以n个点都是n次多项式的零点,故可设:(式1.2.2)

l_{k}(x)=A_{k}(x-x_{0})(x-x_{1})(x-x_{k-1})(x-x_{k+1})(x-x_{n})

A_{k}为待定系数。

又因为l_{k}(x_{i})=1,也就是说

l_{k}(x)=A_{k}(x-x_{0})(x-x_{1})(x-x_{k-1})(x-x_{k+1})(x-x_{n})=1

A_{k}=\frac{1}{(x_{k}-x_{0})(x_{k}-x_{1})...(x_{k}-x_{k-1})(x_{k}-x_{k+1})...(x_{k}-x_{n})}

得到:(式1.2.3)

l_{k}(x)=\frac{(x-x_{0})(x-x_{1})...(x-x_{k-1})(x-x_{k+1})...(x-x_{n})}{(x_{k}-x_{0})(x_{k}-x_{1})...(x_{k}-x_{k-1})(x_{k}-x_{k+1})...(x_{k}-x_{n})}

对应于每一节点x_{k}都能求出一个满足插值条件(式1.2.1)n次插值多项式(式1.2.3),并由此求出n+1个n次插值多项式l_{0}(x),l_{1}(x),...,l_{n}(x),这组多项式仅与节点的取法有关,称它们为在n+1个节点上的n次基本插值多项式(n次插值基函数),即拉格朗日插值基函数。

②  两点插值(线性插值):

通过曲线y=f(x)上两点(x0,y0),(x1,y1)做一直线L1(x)近似代替y=f(x)。

③  三点插值(二次插值/抛物线插值):

通过曲线y=f(x)上三点(x0,y0),(x1,y1),(x2,y2)做一抛物线L2(x)近似代替y=f(x)。

④  插值余项:

也就是插值误差。

二、异常值处理

2.1  删除异常值

  • 方法:直接从数据集中删除异常值。
  • 应用场景:当异常值占数据集的比例较小,且删除这些异常值不会显著影响数据的整体分布时,可以采用这种方法。
  • 示例:在金融数据分析中,如果某些交易数据显著偏离正常范围,可以将这些数据点删除,以避免对模型的扰动。

2.2  替换异常值

  • 方法:用某个统计量(如均值、中位数或众数)替换异常值。
  • 应用场景:当异常值占数据集的比例较小,且替换这些异常值不会显著影响数据的整体分布时,可以采用这种方法。
  • 示例:在气象数据分析中,如果某些温度数据显著偏离正常范围,可以用该数据列的中位数替换这些异常值。或者根据实际,对出现的异常值进行手动替换修正。

2.3  标记异常值

  • 方法:在数据集中标记异常值,但不删除或替换它们。
  • 应用场景:当需要保留异常值以便进一步分析或监控时,可以采用这种方法。
  • 示例:在医疗数据分析中,如果某些病人的生理指标显著偏离正常范围,可以标记这些数据点以便进一步研究。

2.4  使用鲁棒统计方法

  • 方法:使用不受异常值影响的统计方法,如中位数、四分位数、鲁棒回归等。
  • 应用场景:当数据集中存在异常值,且需要使用统计方法进行分析时,可以采用这种方法。
  • 示例:在社会科学研究中,如果某些调查数据显著偏离正常范围,可以使用中位数或四分位数进行统计分析。

这种方法往往配合箱线图较为直观。【matlab、excel、R语言、python都可以画箱线图哦】

2.5  使用异常值检测算法

  • 方法:使用异常值检测算法(如Z-score、IQR、DBSCAN等)来识别和处理异常值。
  • 应用场景:当数据集中存在异常值,且需要自动化识别和处理这些异常值时,可以采用这种方法。
  • 示例:在网络安全中,如果某些网络流量数据显著偏离正常范围,可以使用DBSCAN算法识别这些异常值。

2.6  使用机器学习模型

  • 方法:使用机器学习模型(如隔离森林、自编码器等)来识别和处理异常值。
  • 应用场景:当数据集中存在复杂的异常值模式,且需要高效识别和处理这些异常值时,可以采用这种方法。
  • 示例:在信用卡欺诈检测中,如果某些交易数据显著偏离正常范围,可以使用隔离森林模型识别这些异常值。
import pandas as pd
import numpy as np

# 创建一个包含异常值的数据集
data = {
    'A': [1, 2, 3, 4, 5, 100],
    'B': [5, 6, 7, 8, 9, 10],
    'C': [10, 11, 12, 13, 14, 15]
}
df = pd.DataFrame(data)

# 使用Z-score检测异常值
from scipy import stats
z_scores = np.abs(stats.zscore(df))
threshold = 3
outliers = (z_scores > threshold).any(axis=1)

# 删除异常值
df_cleaned = df[~outliers]

# 替换异常值(使用中位数替换)
df_replaced = df.copy()
df_replaced.loc[outliers, 'A'] = df['A'].median()

print("原始数据集:")
print(df)
print("\n删除异常值后的数据集:")
print(df_cleaned)
print("\n替换异常值后的数据集:")
print(df_replaced)

三、数据清洗

3.1  去除重复数据:

  1. 选择包含重复数据的单元格范围。

  2. 在Excel的菜单栏中,点击“数据”选项卡。

  3. 在“数据”选项卡中,点击“删除重复项”按钮。在弹出的“删除重复项”对话框中,选择要检查重复项的列(可以选择所有列或特定列)。

  4. 点击“确定”按钮,Excel会自动删除重复的行。

以上只是一种可以参考的方法,还有很多其他的,在不同的题目背景下也有不同的方法与之对应。

3.2  去除噪声数据:

可以直接参考异常值处理的一些手段,两者是包含关系。

3.3  去除不相关数据:

去除与目标无关的不相关数据。

一般情况是少量数据不相关。举一个简单的例子,比如要求产量>3000的企业承担供货商角色,那么在做供货商决策时,可以先将不满足这一要求的企业全都去掉,再做分析。

这一步虽然简单,但也容易被忽略!

四、总结

      数据预处理在数学建模中必不可少,尤其是在数据分析类题目中和数据量非常大的题目中,不可盲目应用题目所给的数据,建议通过简单的筛查办法(如excel查找零值、加和检查量级是否合理、排序查看同一变量的数据分布情况等等)和可视化手段,先进行数据的分析处理,再确定解题思路。

      以上预处理办法都是理论,必须要进行实践才能真正理解每一个处理方法对应的应用场景,才能真正有效地得到数据预处理结果。从个人经验来说,均值填补、异常值手动修正、零值替换、重复数据清洗、去除不相关数据、邻近值填补等使用频率较高,可以重点进行学习。

     需要注意的是,本文仅提供方法的基础介绍,在了解大概有哪些方法后,还需要借助教材或博客进行更为详细的学习实践。

希望大家数模之路一切顺利!

! ^-^ !

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值