目录
一、缺失值处理
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)的解析表达式,但由于结构相当复杂,使用起来也很不方便。面对这些情况,希望根据所得函数表(或结构复杂的解析表达式),构造某个形式上简单的函数
作为未知函数f(x)的近似。
插值法是解决此类问题的一种常用的经典方法,它是进一步学习数值计算的基础,也被广泛地应用于生产实际和科学研究中。
简单介绍在建模中常用的几个插值方法:
1. 拉格朗日插值法:
① 基本插值多项式:
拉格朗日插值法的核心思想是构建一个多项式函数,使其在已知数据点处的值与已知数据点的值相同。
先考虑简单的插值问题:对节点(i=0,1,……,n)中任意一点
作一个n次多项式,使得它在该点上取值为1,而在其余点取值为0,即满足插值条件(式1.2.1)
所以n个点都是n次多项式的零点,故可设:(式1.2.2)
=
…
…
为待定系数。
又因为,也就是说
=
…
…
得到:(式1.2.3)
对应于每一节点都能求出一个满足插值条件(式1.2.1)的n次插值多项式(式1.2.3),并由此求出n+1个n次插值多项式
,这组多项式仅与节点的取法有关,称它们为在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 去除重复数据:
-
选择包含重复数据的单元格范围。
-
在Excel的菜单栏中,点击“数据”选项卡。
-
在“数据”选项卡中,点击“删除重复项”按钮。在弹出的“删除重复项”对话框中,选择要检查重复项的列(可以选择所有列或特定列)。
-
点击“确定”按钮,Excel会自动删除重复的行。
以上只是一种可以参考的方法,还有很多其他的,在不同的题目背景下也有不同的方法与之对应。
3.2 去除噪声数据:
可以直接参考异常值处理的一些手段,两者是包含关系。
3.3 去除不相关数据:
去除与目标无关的不相关数据。
一般情况是少量数据不相关。举一个简单的例子,比如要求产量>3000的企业承担供货商角色,那么在做供货商决策时,可以先将不满足这一要求的企业全都去掉,再做分析。
这一步虽然简单,但也容易被忽略!
四、总结
数据预处理在数学建模中必不可少,尤其是在数据分析类题目中和数据量非常大的题目中,不可盲目应用题目所给的数据,建议通过简单的筛查办法(如excel查找零值、加和检查量级是否合理、排序查看同一变量的数据分布情况等等)和可视化手段,先进行数据的分析处理,再确定解题思路。
以上预处理办法都是理论,必须要进行实践才能真正理解每一个处理方法对应的应用场景,才能真正有效地得到数据预处理结果。从个人经验来说,均值填补、异常值手动修正、零值替换、重复数据清洗、去除不相关数据、邻近值填补等使用频率较高,可以重点进行学习。
需要注意的是,本文仅提供方法的基础介绍,在了解大概有哪些方法后,还需要借助教材或博客进行更为详细的学习实践。
希望大家数模之路一切顺利!
! ^-^ !