先贴一下参考博文:https://www.cnblogs.com/fangxiaoqi/p/11440078.html
吹一下这位大佬,感觉这个大佬写的博客都十分认真,推测应该是同级的,哎,内心十分敬佩,若我有他十分之一功力就好了,而且文笔也很赞,经常会写一些带有思考性的文章,赞?。
进入主题:
这篇文章主要写一下数学建模中如何对数据进行预处理,主要包括缺失数据、异常数据的检查和数据特征的提取,希望今年参加数模的人都有个好成绩吧(感觉自己好啰嗦).......
缺失数据和异常数据的查找:
%% 餐饮销量数据缺失值及异常值检测
clear;
catering_sale = '../data/catering_sale.xls'; % 餐饮数据
index = 1; % 销量数据所在列
%% 读入数据
[num,txt] = xlsread(catering_sale);
sales =num(2:end,index);
rows = size(sales,1);
%% 缺失值检测 并打印结果
nanvalue = find(isnan( sales));
if isempty(nanvalue) % 没有缺失值
disp('没有缺失值!');
else
rows_ = size(nanvalue,1);
disp(['缺失值个数为:' num2str(rows_) ',缺失率为:' num2str(rows_/rows) ]);
end
%% 异常值检测
% 箱形图上下界
q_= prctile(sales,[25,75]);
p25=q_(1,1);
p75=q_(1,2);
upper = p75+ 1.5*(p75-p25);
lower = p25-1.5*(p75-p25);
upper_indexes = sales(sales>upper);
lower_indexes = sales(sales<lower);
indexes =[upper_indexes;lower_indexes];
indexes = sort(indexes);
% 箱形图
figure
hold on;
boxplot(sales,'whisker',1.5,'outliersize',6);
rows = size(indexes,1);
flag =0;
for i =1:rows
if flag ==0
text(1+0.01,indexes(i,1),num2str(indexes(i,1)));
flag=1;
else
text(1-0.017*length(num2str(indexes(i,1))),indexes(i,1),num2str(indexes(i,1)));
flag=0;
end
end
hold off;
disp('餐饮销量数据缺失值及异常值检测完成!');
使用箱型图判断异常值的优点:箱形图的绘制依靠实际数据,不需要事先假定数据服从特定的分布形式,没有对数据作任何限制性要求,它只是真实直观地表现数据形状的本来面貌;另一方面,箱形图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不能对这个标准施加影响,箱形图识别异常值的结果比较客观。
缺失值处理:
处理缺失值的方法可以分为三类:删除记录、数据插补和不处理。其中,插补最常用。
插补方法:均值/中位数/众数插补、使用固定值、最近临插补、回归方法、插值法。
推荐使用拉格朗日插值法和牛顿插值法对缺失值进行插补。
在插值前会对数据进行异常值检测,发现的一些异常数据会定义为空缺值,也会进行补数。
异常值处理:
异常值处理的常用方法有:
(1)删除含有异常值的记录
(2)视为缺失值
(3)平均值修正
(4)不处理
数据特征分析:
1.对比分析
2.统计量分析
3.贡献度分析:贡献度分析又称帕累托分析,原理使帕累托法则,它是指任何特性群体中,重要的因子通常只占少数,而不重要的因子则占多数,因此只要控制具有重要性的少数因子即能控制全局。
4.相关性分析:
(1)直接绘制散点图:最直观判断线性关系。
(2)绘制散点图矩阵
(3)计算相关系数
具体代码实现看本文最上面的参考博文