数学建模:数据预处理——数据清洗、数据变换

数据预处理专题

数据预处理是什么?

在数学建模赛题中,官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题,如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响,因此为了保证数据的真实性和建模结果的可靠性,需要在建模之前对数据进行相关的预处理工作!

数据预处理一般包括:数据清洗数据集成数据变换数据规约
在这里插入图片描述

数据预处理——数据清洗

当我们得到一组数据时,这组数据可能会存在一些缺失值和异常值(噪声数据)。此时我们进行数据清洗,

主要包括两个部分:缺失值处理异常值处理
在这里插入图片描述

1、缺失值处理

定义:(字面意思)。

方法删除记录数据插补不处理

(1)删除记录

定义:指当该组数据某一个案的数据缺省时,删除这组个案的数据。

这种方法的优点是处理方便,但在数据较少时要慎重使用。

(2)数据插补

定义:使用不同的插补方法将缺省的数据补齐。

主要插补方法有:均值/中位数/众数插补使用固定值插补最近邻插补回归方法插补插值法插补

在这里插入图片描述

  • 最近邻插补:即在记录中找到与缺失样本最接近的样本的该属性插补,可以通过计算对象间的欧式距离衡量。

  • 回归方法插补:根据已有数据和与其有关的其他变量的数据建立拟合模型来预测缺失值。

  • 插值法:常用的插值法有很多,主要有拉格朗日插值法、牛顿插值法
    在这里插入图片描述

言归正传,真的遇到了,我们还是要用Matlab插值:

一维插值

yi=interp1(x,y,xi,'method')
% x,y为插值点,xi,yi为被插值点和结果,x,y和xi,yi通常为向量
% 'method'表示插值方法:常用方法有'nearest''linear''spline''cubic'

nearest——最邻近插值:插入与其距离最近的值

linear——线性插值:构造线性函数进行插值

spline——三次样条插值:构造三次多项式进行插值

cubic——立方插值:构造立方函数进行插值

‘ method’缺省时默认为线性插值。

举例

% 一维插值
clc;clear all;
y=[0.31472 0.84549 0.98429 0.81619 0.51237]; % 原因变量
x=[1 2 3 4 5]; % 原因变量
x1=0:0.1:5; % 新自变量,从1插到5,梯度为0.1,共插51个值
y1=interp1(x,y,x1,'spline'); % 按 三次样条插值 的方法插值
plot(x1,y1); % 绘制二维曲线图(插了51个值,故为平滑的曲线)


在这里插入图片描述

上图对应的是第11个值,即0.3147,在此之前之所以y1有小于0的部分是因为绘图过程中连点成线后造成的,在直线y=0下侧的点并无实际意义。

二维插值

yi=interp2(x,y,z,xi,yi,'method')
% x,y,z为插值点,xi,yi为被插值点,zi为输出的插值结果,即插值函数在(xi,yi)处的值
% x,y为向量,xi,yi为向量或矩阵,而z和zi则为矩阵
%'method'表示插值方法:常用方法有'nearest''linear''spline''cubic'

nearest——最邻近插值:插入与其距离最近的值

linear——双线性插值:构造两组线性函数进行插值

spline——双三次样条插值:在每个区间内构造三次多项式进行插值

cubic——双立方插值:构造立方函数进行插值

‘ method’缺省时默认为双线性插值。

举例

% 二维插值
clc;clear all;
x=[123 55 89 84 56 54 100]; % 原x
y=[2 5 8 9 10 16 15]; % 原y
z=[165 654 852 254 0 456 251]; % 原z
x1=50:0.1:150; % 新x
y1=0:0.1:20; % 新y
[x1,y1]=meshgrid(x1,y1);
z1=griddata(x,y,z,x1,y1,'linear'); % 新z(计算结果)
meshc(x1,y1,z1); % 绘制三维曲面图

在这里插入图片描述

(3)不处理

定义:有时我们可以将所有缺省数据的样本划分为另一组,进行特殊处理。

2、异常值处理

定义:一组身高的数据,大部分数据都是一点几米,突然蹦出个5米,显然和其他数据差异过大,则判断该数据属于异常值。

方法正态分布3σ原则画箱型图

(1)正态分布3σ原则

定义:数值分布在(μ-3σ,μ+3σ)中的概率为99.73%,其中μ为平均值,σ为标准差。在这里插入图片描述
求解步骤

  • 计算均值μ和标准差σ
  • 判断每个数据值是否在(μ-3σ,μ+3σ)内,不在则为异常值。

适用题目:总体符合正态分布,例如人口数据、测量误差、生产加工质量、考试成绩等。

不适用题目:总体符合其他分布,例如公交站人数排队论符合泊松分布。

cleaned_data = data1;  % 创建一个副本来存储处理后的数据,另:data1为矩阵

for i = 1:size(data1, 1)
    data_te = data1(i, :);
    data_mean = mean(data_te); % 算平均数μ
    data_std = std(data_te); % 算标准差σ
    index = data_te < (data_mean - 3 * data_std) | data_te > (data_mean + 3 * data_std); % 3σ原则
    cleaned_data(i, index) = NaN; % 使用逻辑索引保留非异常值
end

% 删除包含 NaN 的行
cleaned_data(any(isnan(cleaned_data), 2), :) = [];

在这里插入图片描述

(2)画箱型图

定义:箱型图中,把数据从小到大排序。下四分位数Q1是排第25%的数值,上四分位数Q3是排第75%的数值。四分位距IQR = Q3-Q1,也就是排名第75%的减去第25%的数值正态分布类似,设置个合理区间,在区间外的就是异常值。一般设[Q1 − 1.5 * IQR,Q3 + 1.5 * IQR]内为正常值。
在这里插入图片描述

数据预处理——数据变换

1、数据类型的一致化处理方法

定义:一般问题的数据指标 x1,x2,…,xm(m>1) 可能有极大型极小型中间型区间型指标。

极大型:期望取值越大越好;比如成绩,肺活量等。

极小型:期望取值越小越好;比如挂科率,失误率等。

中间型:期望取值既不要太大,也不要太小为好,取适当的区间为最好;比如体重,头发长度等。

区间型:期望取值最好是落在某一个确定的区间内为最好。比如学校的生师比,自然中互为捕食关系的物种数量比。


其中M是极小型数据的右区间(最大值)。
在这里插入图片描述

其中m是极小型数据的左区间(最小值),M是极小型数据的右区间(最大值)。

在这里插入图片描述
在这里插入图片描述

2、数据指标的无量纲化处理

在实际数据指标x1,x2,···,xm(m>1)之间,往往存在着不可公度性,直接应用是困难的,会出现“大数吃小数”的错误、从而导致结果的不合理。

常用方法标准差法极值差法功效系数法等。
在这里插入图片描述

(1)标准差方法

在这里插入图片描述

(2)极值差方法(最常用)


在这里插入图片描述
##### (3)功效系数方法

无量纲化处理Matlab代码

以处理区间型指标为例,由:
在这里插入图片描述
给出无量纲化处理的Matlab代码:

% 数据预处理方法:线性归一化
% a为处理数据矩阵u为选择处理方法1为效益型2 为成本型3为区间型qujian为效益形中的最优属性区间rennai为忍耐上下限区间
function b=topsis(a,u,qujian,rennai)
    am1=min(a);am2=max(a);
    % 效益型数据处理(即数据越大越好)
    if u==1
        b=(a-am1)./(am2-am1);
    % 成本型数据处理(即数据越小越好)
    elseif u==2
        b=(am2-a)./(am2-am1);%区间型数据处理
    elseif u==3
        n=length(a);
        for k=1:n
            if a(k)>=rennai(1)&a(k)<qujian(1)
                b(k)=1-(qujian(1)-a(k))/(qujian(1)-rennai(1));
            elseif a(k)>=qujian(1)&a(k)<=qujian(2)
                b(k)=1;
            elseif a(k)>qujian(2)&a(k)<=rennai(2)
                b(k)=1-(a(k)-qujian(2))/(rennai(2)-qujian(2));
            else
                b(k)=0;
            end
        end
    end
end

先将这段代码写入新建脚本topsis.m保存,然后打开另一个空白脚本输入数据。

原数据:
在这里插入图片描述
输入:

A=[0.1 0.2 0.4 0.9 1.2;
5 6 7 10 2;
5000 6000 7000 10000 400;
4.7 5.6 6.7 2.3 1.8];
A=A';
a1=A(:,1);a2=A(:,2);a3=A(:,3);a4=A(:,4);
b1=topsis(a1,1);
b2=topsis(a2,3,[5,6],[2,12]);
b3=topsis(a3,2);
b4=topsis(a4,2);
[b1,b2',b3,b4]

无量纲化处理后:
在这里插入图片描述

然后将以上数据填入表内:

由此可见以逾期毕业率为标准进行评价,第三所院校是比较好的。

3、定性指标的量化处理方法

在社会实践中,很多问题都涉及到定性因素(指标)的定量处理问题。诸如:教学质量、科研水平、工作政绩、人员素质、各种满意度、信誉、态度、意识、观念、能力等因素有关的政治、社会、人文等领域的问题。如何对有关问题给出定量分析呢?

方法:按国家的评价标准,评价因素一般分为五个等级,如A,B,C,D,E。如何将其量化?若A-,B+,C-,D+等又如何合理量化?简单地对应数字分量化方法是不科学的!根据实际问题,构造模糊隶属函数的量化方法是一种可行有效的方法。

假设有多个评价人对某项因素评价为A,B,C,D,E共5个等级:{v1,v2,v3,v4,v5}。譬如:评价人对某事件“满意度”的评价可分为

{很满意,满意,较满意,不太满意,很不满意}将其5个等级依次对应为5,4,3,2,1。为取连续量化,偏大型柯西分布对数函数作为隶属函数
在这里插入图片描述

当**1 ≤ x ≤ 3时,为偏大型柯西分布函数**;当**3 ≤ x ≤ 5时,为对数函数**。
在这里插入图片描述

注意:这里隶属度的取值是自定义的,合理即可!)

除了上述的隶属度以外,还可以加一个”很不满意“,然后自定义一个隶属度的值,求出在此情况下的 f ( x ) f(x) f(x)大小。

然后连立上述四种情况的隶属度下的 f ( x ) f(x) f(x)值,代入 f ( x ) f(x) f(x)公式中可求得 α α α β β β a a a b b b的值,如下:
在这里插入图片描述

  • 30
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于Python中的数据清洗和预处理,有许多常用的库和技术可以使用。以下是一些常见的方法和库: 1. Pandas库:Pandas是一个功能强大的数据分析库,提供了各种数据清洗和预处理的功能。它可以用于数据清洗、缺失值处理、重复值处理、数据转换等。 2. NumPy库:NumPy是一个用于科学计算的库,提供了对多维数组的支持。它可以用于数据过滤、条件选择、数据排序等。 3. 正则表达式:正则表达式是一种强大的文本匹配和处理工具,可以用于数据清洗、提取特定模式的数据等。 4. 数据类型转换:Python中提供了许多内置函数用于数据类型转换,如int()、float()等。可以使用这些函数将数据转换为所需的类型。 5. 缺失值处理:对于存在缺失值的数据,可以使用Pandas库中的dropna()函数删除缺失值,或使用fillna()函数填充缺失值。 6. 重复值处理:对于存在重复值的数据,可以使用Pandas库中的duplicated()函数查找重复值,并使用drop_duplicates()函数删除重复值。 7. 数据标准化:对于存在不同量级或不同分布的数据,可以使用Pandas库或Scikit-learn库中的标准化方法对数据进行标准化,如Z-score标准化、min-max标准化等。 8. 异常值处理:对于存在异常值的数据,可以使用统计学方法或可视化方法进行异常值检测,并根据具体情况进行处理,如删除异常值、替换异常值等。 以上是一些常见的Python数据清洗和预处理方法和库,根据具体需求和数据特点,可以选择合适的方法进行数据清洗和预处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值