数据质量、特征分析及⼀些MATLAB函数
MATLAB数据分析⼯具箱
  MATLAB⼯具箱主要含有的类别有:
  数学类、统计与优化类、信号处理与通信类、控制系统设计与分析类、图像处理类、测试与测量类、计算⾦融类、计算⽣物类、并⾏计算类、数据库访问与报告类、 MATLAB 代码⽣成类、 MATLAB 应⽤发布类。
  每个类别内含有⼀个或多个⼯具箱。
  ⽐如数学、统计与优化类别就包含有曲线拟合⼯具箱、优化⼯具箱、神经⽹络⼯具箱、统计⼯具箱等。
  MATLAB 应⽤发布类别主要包含MATLAB和其他语⾔的混合编译、编程,包括C、C#、Java等。
  MATLAB 中与数据分析及挖掘相关的⼯具箱,包含统计⼯具箱、优化⼯具箱、曲线拟合⼯具箱、神经⽹络⼯具箱。(这⾥先⼤致写⼀下,后⾯的⽂章会专门细写的)
  统计⼯具箱可以对数据进⾏组织、分析和建模,使⽤和统计分析、机器学习相关的算法及⼯具。⽤户可以使⽤回归以及分类分析来进⾏预测建模、⽣成随机序列(蒙特卡罗模拟),同时可以使⽤统计分析⼯具对数据进⾏前期的探索研究或者进⾏假设性检验。在分析多维数据时,统计⼯具箱提供连续特征选择、主成分分析、正规化和收缩、偏最⼩⼆乘回归分析法等⼯具帮助⽤户筛选出对模型有重要影响的变量。该⼯具箱同时还提供有监督、⽆监督的机器学习算法,包括⽀持向量机(SVMs)、决策树、K- Means、分层聚类、K近邻聚类搜索、⾼斯混合、隐马尔科夫模型等。
  优化⼯具箱主要提供⽤于在满⾜给定的束缚条件时寻最优解的相关函数,主要包含线性规划、混合整数线性规划、⼆次规划、⾮线性最优化、⾮线性最⼩平⽅问题的求解函数。在该⼯具箱中,⽤户可以针对连续型、离散型问题寻求最优的解决⽅法,使⽤权衡分析法进⾏分析,或者在算法和应⽤中融合多种优化⽅法,从⽽达到较好的效果。
  曲线拟合⼯具箱提供⼀个图形⽤户界⾯和各种函数调⽤接⼝供⽤户实现数据拟合。使⽤该⼯具箱可以进⾏数据探索性分析、数据预处理、数据过程处理、⽐较分析候选模型和异常值过滤。⽤户可以使⽤ MATLAB 库函数提供的线性与⾮线性模型或者⽤户⾃定义的⽅程式来进⾏回归分析。该⼯具箱也⽀持⽆参数模型,⽐如样条变换、插值以及平滑。
  神经⽹络⼯具箱提供的函数以及应⽤可以⽤于复杂的、⾮线性系统的建模。不仅⽀持前馈监督式学习、径向基和动态⽹络,同时还⽀持组织映射以及竞争层形式的⾮监督式学习。利⽤该⼯具箱,⽤户可以设计、训练、可视化以及仿真神经⽹络。神经⽹络⼯具箱的应⽤主要包括:回归、分类、聚类分析、时间序列预测和动⼒系统建模,对应于其所包含的四个⼦⼯具箱。在处理海量数据时,还可以考虑使⽤数据分布式以及分布式计算功能、GPU功能以及并⾏计算⼯具箱。
数据质量分析
  数据质量分析主要是检查原始数据中是否存在脏数据,脏数据⼀般是指不符合要求,以及不能直接进⾏相应分析的数据,常见的有缺失值、异常值、不⼀致的值、重复数据及含有特殊符号的数据。
缺失值与异常值分析
  这⾥,我们以餐饮销量数据为例,检测分析其缺失值及异常值。
Loading [MathJax]/jax/output/HTML-CSS/jax.js
  得到结果:
  与箱形图:
  箱形图补充:
%% 餐饮销量数据缺失值及异常值检测
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('餐饮销量数据缺失值及异常值检测完成!');
  对于箱形图,必须要提及四分位数的概念。
  ⼈们经常会将数据划分为4个部分,每⼀个部分⼤约包含有1/4即25%的数据项。这种划分的临界点即为四分位数。它们定义如下。
  Q1=第1四分位数,即第25百分位数;Q2=第2四分位数,即第50百分位数;Q3=第3四分位数,即第75
百分位数。这些可以通过箱形图直观的看出来。
  下限 < 下四分位数 < 中位数 < 上四分位数 < 上限
箱形图的意义:
①直观明了地识别数据批中的异常值。
②利⽤箱线图判断数据批的偏态和尾重。
对于标准正态分布的样本,只有极少值为异常值。异常值越多说明尾部越重,⾃由度越⼩。
③利⽤箱线图⽐较⼏批数据的形状
同⼀数轴上,⼏批数据的箱线图并⾏排列,⼏批数据的中位数、尾长、异常值、分布区间等形状信息便昭然若揭。
缺点:
不能精确地衡量数据分布的偏态和尾重程度;对于批量⽐较⼤的数据,反映的信息更加模糊以及⽤中位数代表总体评价⽔平有⼀定的局限性......
  从图中可以读出离点(异常值),即被圈住的那些:
  从箱形图我们可以看出,超过上下界存在7个数据可能为异常值,结合具体业务,可以把865、4060.3
、4065.2归为正常值,将60、22、6607.4、9106.44归为异常值。最后确定过滤规则为⽇销量在400以下或5000以上属于异常数据。
缺失值处理
  数据清洗主要包括缺失值处理、异常值处理。
  处理缺失值的⽅法可以分为三类:删除记录、数据插补和不处理。其中,插补最常⽤。
  插补⽅法有:均值/中位数/众数插补、使⽤固定值、最近临插补、回归⽅法、插值法。
  插值法请参考另⼀篇blog:
  下⾯⽤拉格朗⽇插值法与⽜顿插值法对缺失值进⾏插补:(当然有很多更好的⽅法)
%%拉格朗⽇插值和⽜顿插值对⽐
clear;
%参数初始化
inputfile = '../data/catering_sale.xls' ; %销量数据⽂件
index =1; %销量数据所在下标
outputfile ='../tmp/sales.xls';  %插值后数据存放
%%读⼊数据
[num,txt,raw] = xlsread(inputfile);
data = num(:,index);
%%去除异常值
data = de_abnormal(data);
%%调⽤拉格朗⽇进⾏插值
la_data = ployinterp_column(data,'lagrange');
%%调⽤⽜顿算进⾏插值
new_data = ployinterp_column(data,'newton');
%%结果写⼊⽂件
rows = size(data,1);
result = cell(rows+1,3);
result{1,1}='原始值';
result{1,2}='拉格朗⽇插值';
result{1,3}='⽜顿插值';
result(2:end,1)= num2cell(data);
result(2:end,2)= num2cell(la_data);
result(2:end,3)= num2cell(new_data);
xlswrite(outputfile,result);
disp('拉格朗⽇插值和⽜顿插值结果已写⼊数据⽂件!');
function outputdata= ployinterp_column(columndata,type)
%%针对每列进⾏插值
%输⼊参数说明:
% columndata: 输⼊的列数据,含有缺失值
% type: 'lagrange'或'newton'
%输出参数说明:
% output: 输出插值过的数据
%%把输⼊列数据分为⾮缺失值和缺失值数据
nans = isnan(columndata);  %区分columndata中为NaN的数据下标
notzeroIndexes = find(nans); %寻缺失值下标
%zeroIndexes = find(nans==0); %寻⾮缺失值下标
rows=size(columndata); %原始数据的⾏数
%currentValues=zeros(size(zeroIndexes));%初始化当前值矩阵
for i=1:size(notzeroIndexes)
pre5=findPre5(notzeroIndexes(i),columndata);
last5=findLast5(notzeroIndexes(i),rows(1),columndata);
[~,pre5cols]=size(pre5);
[~,last5cols]=size(last5);
if  strcmp(type,'lagrange')column函数的使用
missingValue=lagrange_interp([1:pre5cols,pre5cols+2:last5cols+pre5cols+1],...
[pre5,last5],pre5cols+1); %拉格朗⽇插值
else
missingValue=newton_interp([1:pre5cols,pre5cols+2:last5cols+pre5cols+1],...
[pre5,last5],pre5cols+1); %⽜顿插值
end
columndata(notzeroIndexes(i),1)=missingValue;
end
%返回插值后的数据
outputdata=columndata;
end
function pre5=findPre5(index,columndata)
%%在columndata中寻给定下标index前⾯5个数值(⾮NaN),不⾜5个的按实际情况返回if index<=0
disp('⾮法下标');
exit;
end
num=5;
pre5=nan(1,5);
for i=index-1:-1:1
if isnan(columndata(i))==0  %判断第i个值是否为NaN
pre5(num)=columndata(i);
num=num-1;
end
if num==0 %只取前5个
break;
end
end
pre5=pre5(~isnan(pre5)); %去除NaN的值
end
function last5=findLast5(index,rows,columndata)
%%在columndata中寻给定下标index后⾯5个数值(⾮NaN),不⾜5个的按实际情况返回
if index<=0 || index>rows
disp('⾮法下标');
exit;
end
num=0;
last5=nan(1,5); %初始化
for i=index+1:rows
if isnan(columndata(i))==0  %判断第i个值是否为NaN
num=num+1;
last5(num)=columndata(i);
end
if num==5 %只取后5个
break;
end
end
last5=last5(~isnan(last5)); %去除NaN的值
end
  从结果中,我们可以看出,在插值前会对数据进⾏异常值检测,发现的⼀些异常数据会定义为空缺值,也会进⾏补数。
异常值处理
在数据预处理时,异常值是否剔除,需要视具体情况⽽定,因为有些异常值可能蕴含着有⽤的信息。
异常值处理的常⽤⽅法有:
①删除含有异常值的记录
将含有异常值的记录直接删除这种⽅法简单易⾏,但缺点也很明显,在观测值很少的情况下,删除会导致样本量不⾜,可能会改变原有的分布,从⽽造成分析结果不准确。
②视为缺失值
视为缺失值可以利⽤现有变量的信息,对异常值进⾏填补。
③平均值修正
④不处理
⼀般先分析异常值出现的可能原因,再判断是否舍弃,如果是正确的数据,可以直接在具有异常值的数据集上进⾏挖掘建模。
数据特征分析
对⽐分析
  对⽐分析是指把两个相互联系的指标进⾏⽐较,从数量上展⽰和说明研究对象规模的⼤⼩、⽔平的⾼低、速度的快慢,以及各种关系是否协调。特别适⽤于指标间的横纵向⽐较、时间序列的⽐较分析。在对⽐分析中,选择合适的对⽐标准是⼗分关键的步骤,选择得合适,才能作出客观的评价,选择不合适,评价可能会得出错误的结论。
  对⽐分析主要有以下两种形式。
  1、绝对数⽐较
  它是利⽤绝对数进⾏对⽐,从⽽寻差异的⼀种⽅法。
  2、相对数⽐较
  它是⽤两个有联系的指标对⽐计算的,⽤以反映客观现象之间数量联系程度的综合指标,其数值表现为相对数。
  由于研究⽬的和对⽐基础不同,相对数可以分为以下⼏种:
    ①结构相对数:将同⼀总体内的部分数值与全部数值对⽐求得⽐重,⽤以说明事物的性质、结构或质量。如居民⾷品⽀出额占消费⽀出总额的⽐重、产品合格率等。
    ②⽐例相对数:将同⼀总体内不同部分的数值对⽐,表明总体内各部分的⽐例关系,如⼈⼝性别⽐例、投资与消费⽐例等。
    ③⽐较相对数:将同⼀时期两个性质相同的指标数值对⽐,说明同类现象在不同空间条件下的数量对⽐关系。如不同地区商

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。