keywords: 数据分析,可视化,MATLAB,描述性统计,回归分析,差异分析


数据分析与可视化是利用 MATLAB 进行科学研究和工程应用的重要内容。通过对数据的分析和图形化展示,我们可以更好地理解数据背后的规律和趋势,从而为决策提供有力支撑。本章将带领大家完成一个完整的数据分析与可视化项目,深入体验 MATLAB 在该领域的强大功能。

13.1 项目需求分析

在开始具体的编码工作之前,我们需要对项目的背景和目标进行充分的了解和分析。只有明确了项目的需求,才能更好地开展后续工作。

13.1.1 数据分析的背景

假设我们获得了某城市近十年的空气质量数据,包括 PM2.5、PM10、SO2、NO2、CO 和 O3 的日均浓度值。我们希望通过对这些数据的分析,了解该城市空气质量的变化趋势,以及各污染物之间的关系,为环保部门制定相应政策提供参考。

13.1.2 项目的目标

本项目的主要目标包括:

  1. 对数据进行预处理,剔除异常值,补全缺失值。
  2. 进行描述性统计分析,计算各污染物的均值、方差等统计量,了解其分布特征。
  3. 通过回归分析,研究各污染物之间的相关性。
  4. 利用方差分析等方法,考察不同季节、不同年份之间空气质量的差异。
  5. 运用多种可视化方法,直观展示数据分析的结果。

13.2 数据的获取和预处理

高质量的数据是开展分析工作的前提。我们需要获取所需数据,并对其进行必要的预处理,以提高数据的可用性。

13.2.1 数据的导入

假设我们已经获得了一个 Excel 文件 AirQuality.xlsx,其中包含了所需的空气质量数据。我们可以使用 MATLAB 的 readtable 函数将其读入:

  1. data = readtable('AirQuality.xlsx');

13.2.2 数据的清洗与转换

导入数据后,我们需要对其进行清洗和转换,常见的操作包括:

  1. 检查并剔除异常值:
  1. % 剔除 PM2.5 浓度大于 1000 的异常值
  2. data(data.PM25 > 1000, :) = [];
  1. 补全缺失值。可以用均值、中位数等填充,或者采用插值法:
  1. % 用列均值填充缺失值
  2. data = fillmissing(data, 'constant', 'mean');
  1. 将日期字符串转换为datetime类型,便于后续分析:
  1. data.Date = datetime(data.Date, 'InputFormat', 'yyyy-MM-dd');

经过上述处理后,我们得到了一个相对干净、可用的数据集。

13.3 数据的分析和统计

在完成数据预处理后,我们就可以开展进一步的分析和统计工作了。MATLAB 提供了丰富的统计函数,能够帮助我们快速实现常用的分析方法。

13.3.1 描述性统计分析

首先,让我们对主要污染物进行描述性统计,了解其集中趋势和离散程度:

  1. vars = {'PM25', 'PM10', 'SO2', 'NO2', 'CO', 'O3'};
  2. stats = table();
  3. for i = 1:length(vars)
  4. stats.(vars{i}) = [mean(data.(vars{i})); std(data.(vars{i}))];
  5. end
  6. rownames(stats) = {'Mean', 'Std'};
  7. disp(stats);

上面的代码循环计算各个污染物的均值和标准差,并将结果存入 stats 表格中显示出来,一目了然。

我们还可以绘制箱线图,直观比较不同污染物的分布情况:

  1. figure;
  2. boxplot(data{:, vars}, 'Labels', vars);
  3. ylabel('Concentration (ug/m^3)');
  4. title('Distribution of Air Pollutants');

第 13 章 项目一:数据分析与可视化 - 图1

从箱线图可以看出,PM10 和 O3 的浓度分布较为分散,而 SO2 和 CO 的浓度相对集中。

13.3.2 回归分析

接下来,让我们分析不同污染物之间的相关性。我们可以计算污染物两两之间的相关系数:

  1. R = corrcoef(data{:, vars});
  2. figure;
  3. h = heatmap(vars, vars, R);
  4. h.Title = 'Correlation between Air Pollutants';
  5. h.XLabel = 'Pollutant';
  6. h.YLabel = 'Pollutant';

第 13 章 项目一:数据分析与可视化 - 图2

从相关系数热力图中可以看出,PM2.5 和 PM10 之间的相关性最强,CO 和 SO2 次之。

如果我们想进一步探究 PM2.5 和 PM10 的关系,可以进行线性回归分析:

  1. mdl = fitlm(data, 'PM25 ~ PM10');
  2. mdl.plot();

第 13 章 项目一:数据分析与可视化 - 图3

从回归分析结果可以看出,PM2.5 和 PM10 之间存在显著的线性关系,决定系数 R^2 高达 0.8。

13.3.3 差异分析

最后,我们考察不同季节之间空气质量是否存在显著差异。首先根据日期提取季节信息:

  1. data.Season = month(data.Date);
  2. data.Season(data.Season >= 3 & data.Season <= 5) = "Spring";
  3. data.Season(data.Season >= 6 & data.Season <= 8) = "Summer";
  4. data.Season(data.Season >= 9 & data.Season <= 11) = "Autumn";
  5. data.Season(data.Season == 12 | data.Season <= 2) = "Winter";

然后利用单因素方差分析,检验不同季节 PM2.5 均值的差异:

  1. [p, anova_table, stats] = anova1(data.PM25, data.Season, 'off');

从方差分析的 p 值(假设 p<0.05)可以判断,不同季节的 PM2.5 浓度差异显著。我们还可以绘制不同季节 PM2.5 浓度的箱线图:

  1. figure;
  2. boxplot(data.PM25, data.Season);
  3. ylabel('PM2.5 Concentration (ug/m^3)');
  4. title('PM2.5 Concentrations in Different Seasons');

第 13 章 项目一:数据分析与可视化 - 图4

可以看出,冬季的 PM2.5 浓度显著高于其他季节,夏季浓度最低。

13.4 数据的可视化展示

前面我们已经运用了多个图形函数,如 boxplotheatmap 等,生动展示了分析结果。MATLAB 还支持很多其他类型的可视化方法。

13.4.1 绘制基本图形

例如,我们可以绘制各污染物逐年均值的变化趋势:

  1. data.Year = year(data.Date);
  2. yearly_mean = varfun(@mean, data, 'GroupingVariables', 'Year', 'InputVariables', vars);
  3. figure;
  4. plot(yearly_mean.Year, yearly_mean{:, 2:end});
  5. xlabel('Year');
  6. ylabel('Concentration (ug/m^3)');
  7. title('Yearly Average Concentrations of Air Pollutants');
  8. legend(vars);

第 13 章 项目一:数据分析与可视化 - 图5

13.4.2 多维数据的可视化

对于多维数据,我们可以采用平行坐标图、雷达图等方式展示:

  1. figure;
  2. parallelcoords(yearly_mean, 'Group', [], 'Quantile', 0.25, vars);
  3. xlabel('Air Pollutant');
  4. ylabel('Concentration (ug/m^3)');
  5. title('Yearly Average Concentrations');

第 13 章 项目一:数据分析与可视化 - 图6

  1. figure;
  2. spider_plot(table2array(yearly_mean(:, 2:end)), 'AxesLabels', vars);
  3. title('Radar Chart of Yearly Average Concentrations');

第 13 章 项目一:数据分析与可视化 - 图7

注:这里用到了一个自定义函数 spider_plot,其实现代码可以在 MATLAB 中心下载。

13.4.3 动态可视化展示

除了静态图形,我们还可以创建动态可视化,展示数据的时序变化。例如绘制 PM2.5 浓度的逐日变化动画:

  1. figure;
  2. for d = min(data.Date):max(data.Date)
  3. plot(data.Date(data.Date <= d), data.PM25(data.Date <= d), 'b-', 'LineWidth', 1.5);
  4. xlabel('Date');
  5. ylabel('PM2.5 Concentration (ug/m^3)');
  6. title('Daily PM2.5 Concentration');
  7. xlim([min(data.Date), max(data.Date)]);
  8. ylim([0, max(data.PM25)]);
  9. drawnow;
  10. pause(0.01);
  11. end

第 13 章 项目一:数据分析与可视化 - 图8

本章小结

本章以一个空气质量数据分析项目为例,全面演示了如何利用 MATLAB 开展数据分析与可视化工作。我们从数据的导入与预处理开始,运用多种统计方法分析数据,并借助丰富的可视化手段展示结果。

通过本章的学习,相信大家已经初步掌握了 MATLAB 数据分析的基本流程和常用方法。这只是一个起点,希望大家能在此基础上,结合自己的实际需求,去探索更多有趣、有价值的数据分析项目。让我们一起利用 MATLAB 这个强大的工具,去发现数据背后的奥秘,创造更多价值!

如果大家在学习过程中有任何疑问或想法,欢迎在评论区留言讨论。让我们共同成长,一起进步!