keywords: 数据分析,可视化,MATLAB,描述性统计,回归分析,差异分析
数据分析与可视化是利用 MATLAB 进行科学研究和工程应用的重要内容。通过对数据的分析和图形化展示,我们可以更好地理解数据背后的规律和趋势,从而为决策提供有力支撑。本章将带领大家完成一个完整的数据分析与可视化项目,深入体验 MATLAB 在该领域的强大功能。
13.1 项目需求分析
在开始具体的编码工作之前,我们需要对项目的背景和目标进行充分的了解和分析。只有明确了项目的需求,才能更好地开展后续工作。
13.1.1 数据分析的背景
假设我们获得了某城市近十年的空气质量数据,包括 PM2.5、PM10、SO2、NO2、CO 和 O3 的日均浓度值。我们希望通过对这些数据的分析,了解该城市空气质量的变化趋势,以及各污染物之间的关系,为环保部门制定相应政策提供参考。
13.1.2 项目的目标
本项目的主要目标包括:
- 对数据进行预处理,剔除异常值,补全缺失值。
- 进行描述性统计分析,计算各污染物的均值、方差等统计量,了解其分布特征。
- 通过回归分析,研究各污染物之间的相关性。
- 利用方差分析等方法,考察不同季节、不同年份之间空气质量的差异。
- 运用多种可视化方法,直观展示数据分析的结果。
13.2 数据的获取和预处理
高质量的数据是开展分析工作的前提。我们需要获取所需数据,并对其进行必要的预处理,以提高数据的可用性。
13.2.1 数据的导入
假设我们已经获得了一个 Excel 文件 AirQuality.xlsx
,其中包含了所需的空气质量数据。我们可以使用 MATLAB 的 readtable
函数将其读入:
data = readtable('AirQuality.xlsx');
13.2.2 数据的清洗与转换
导入数据后,我们需要对其进行清洗和转换,常见的操作包括:
- 检查并剔除异常值:
% 剔除 PM2.5 浓度大于 1000 的异常值
data(data.PM25 > 1000, :) = [];
- 补全缺失值。可以用均值、中位数等填充,或者采用插值法:
% 用列均值填充缺失值
data = fillmissing(data, 'constant', 'mean');
- 将日期字符串转换为
datetime
类型,便于后续分析:
data.Date = datetime(data.Date, 'InputFormat', 'yyyy-MM-dd');
经过上述处理后,我们得到了一个相对干净、可用的数据集。
13.3 数据的分析和统计
在完成数据预处理后,我们就可以开展进一步的分析和统计工作了。MATLAB 提供了丰富的统计函数,能够帮助我们快速实现常用的分析方法。
13.3.1 描述性统计分析
首先,让我们对主要污染物进行描述性统计,了解其集中趋势和离散程度:
vars = {'PM25', 'PM10', 'SO2', 'NO2', 'CO', 'O3'};
stats = table();
for i = 1:length(vars)
stats.(vars{i}) = [mean(data.(vars{i})); std(data.(vars{i}))];
end
rownames(stats) = {'Mean', 'Std'};
disp(stats);
上面的代码循环计算各个污染物的均值和标准差,并将结果存入 stats
表格中显示出来,一目了然。
我们还可以绘制箱线图,直观比较不同污染物的分布情况:
figure;
boxplot(data{:, vars}, 'Labels', vars);
ylabel('Concentration (ug/m^3)');
title('Distribution of Air Pollutants');
从箱线图可以看出,PM10 和 O3 的浓度分布较为分散,而 SO2 和 CO 的浓度相对集中。
13.3.2 回归分析
接下来,让我们分析不同污染物之间的相关性。我们可以计算污染物两两之间的相关系数:
R = corrcoef(data{:, vars});
figure;
h = heatmap(vars, vars, R);
h.Title = 'Correlation between Air Pollutants';
h.XLabel = 'Pollutant';
h.YLabel = 'Pollutant';
从相关系数热力图中可以看出,PM2.5 和 PM10 之间的相关性最强,CO 和 SO2 次之。
如果我们想进一步探究 PM2.5 和 PM10 的关系,可以进行线性回归分析:
mdl = fitlm(data, 'PM25 ~ PM10');
mdl.plot();
从回归分析结果可以看出,PM2.5 和 PM10 之间存在显著的线性关系,决定系数 R^2 高达 0.8。
13.3.3 差异分析
最后,我们考察不同季节之间空气质量是否存在显著差异。首先根据日期提取季节信息:
data.Season = month(data.Date);
data.Season(data.Season >= 3 & data.Season <= 5) = "Spring";
data.Season(data.Season >= 6 & data.Season <= 8) = "Summer";
data.Season(data.Season >= 9 & data.Season <= 11) = "Autumn";
data.Season(data.Season == 12 | data.Season <= 2) = "Winter";
然后利用单因素方差分析,检验不同季节 PM2.5 均值的差异:
[p, anova_table, stats] = anova1(data.PM25, data.Season, 'off');
从方差分析的 p 值(假设 p<0.05)可以判断,不同季节的 PM2.5 浓度差异显著。我们还可以绘制不同季节 PM2.5 浓度的箱线图:
figure;
boxplot(data.PM25, data.Season);
ylabel('PM2.5 Concentration (ug/m^3)');
title('PM2.5 Concentrations in Different Seasons');
可以看出,冬季的 PM2.5 浓度显著高于其他季节,夏季浓度最低。
13.4 数据的可视化展示
前面我们已经运用了多个图形函数,如 boxplot
、heatmap
等,生动展示了分析结果。MATLAB 还支持很多其他类型的可视化方法。
13.4.1 绘制基本图形
例如,我们可以绘制各污染物逐年均值的变化趋势:
data.Year = year(data.Date);
yearly_mean = varfun(@mean, data, 'GroupingVariables', 'Year', 'InputVariables', vars);
figure;
plot(yearly_mean.Year, yearly_mean{:, 2:end});
xlabel('Year');
ylabel('Concentration (ug/m^3)');
title('Yearly Average Concentrations of Air Pollutants');
legend(vars);
13.4.2 多维数据的可视化
对于多维数据,我们可以采用平行坐标图、雷达图等方式展示:
figure;
parallelcoords(yearly_mean, 'Group', [], 'Quantile', 0.25, vars);
xlabel('Air Pollutant');
ylabel('Concentration (ug/m^3)');
title('Yearly Average Concentrations');
figure;
spider_plot(table2array(yearly_mean(:, 2:end)), 'AxesLabels', vars);
title('Radar Chart of Yearly Average Concentrations');
注:这里用到了一个自定义函数
spider_plot
,其实现代码可以在 MATLAB 中心下载。
13.4.3 动态可视化展示
除了静态图形,我们还可以创建动态可视化,展示数据的时序变化。例如绘制 PM2.5 浓度的逐日变化动画:
figure;
for d = min(data.Date):max(data.Date)
plot(data.Date(data.Date <= d), data.PM25(data.Date <= d), 'b-', 'LineWidth', 1.5);
xlabel('Date');
ylabel('PM2.5 Concentration (ug/m^3)');
title('Daily PM2.5 Concentration');
xlim([min(data.Date), max(data.Date)]);
ylim([0, max(data.PM25)]);
drawnow;
pause(0.01);
end
本章小结
本章以一个空气质量数据分析项目为例,全面演示了如何利用 MATLAB 开展数据分析与可视化工作。我们从数据的导入与预处理开始,运用多种统计方法分析数据,并借助丰富的可视化手段展示结果。
通过本章的学习,相信大家已经初步掌握了 MATLAB 数据分析的基本流程和常用方法。这只是一个起点,希望大家能在此基础上,结合自己的实际需求,去探索更多有趣、有价值的数据分析项目。让我们一起利用 MATLAB 这个强大的工具,去发现数据背后的奥秘,创造更多价值!
如果大家在学习过程中有任何疑问或想法,欢迎在评论区留言讨论。让我们共同成长,一起进步!