matlab快速入门(2)-- 数据处理与可视化

MATLAB的数据处理


1. 数据导入与导出

(1) 从文件读取数据
  • Excel 文件
    data = readtable('data.xlsx');  % 读取为表格(Table)
    
  • CSV 文件
    data = readtable('data.csv');   % 自动处理表头和分隔符
    
  • 文本文件
    data = load('data.txt');        % 数值数据直接加载为矩阵
    
(2) 导出数据到文件
  • 保存为 Excel
    writetable(data, 'output.xlsx'); 
    
  • 保存为 CSV
    writetable(data, 'output.csv');
    

2. 数据清洗与预处理

(1) 处理缺失值

1>查找缺失值:ismissing(data)

missingValues = ismissing(data);  % 返回逻辑矩阵标记缺失值(NaN 或空字符)
  • 功能:检测 data(可以是数组、表格、时间表等)中的缺失值,生成一个与 data 维度相同的 逻辑矩阵logical matrix)。
  • 输出规则
    • missingValuestrue(1)表示对应位置是缺失值。
    • false(0)表示该位置数据正常。

支持的缺失值类型

  • 数值型数据NaN(Not a Number)。
  • 时间型数据NaT(Not a Time)。
  • 字符串/字符数据:空字符串 ""(字符串数组)或 <missing>
  • 分类数据<undefined>
  • 表格/时间表:自动识别各列的缺失值类型。

示例
假设 data 是一个表格:

IDAgeStatus
125“Complete”
2NaN“”
330“”

执行 missingValues = ismissing(data) 后,结果如下:

IDAgeStatus
000
011
001

2> 填充缺失值:fillmissing
代码作用

data.Age = fillmissing(data.Age, 'constant', mean(data.Age, 'omitnan'));  % 用均值填充
  • 功能:将 data.Age 列中的缺失值(NaN)填充为该列的均值(忽略缺失值计算)。
  • 参数解析
    1. data.Age:待填充的列(数值型向量)。
    2. 'constant':填充方式为“常量填充”,即用固定值替换缺失值。
    3. mean(data.Age, 'omitnan'):计算 data.Age 列的均值时忽略 NaN 值。

关键步骤

  1. 计算均值

    avg = mean(data.Age, 'omitnan');  % 忽略 NaN 计算均值
    
    • 假设 data.Age = [25, NaN, 30],则 avg = (25 + 30)/2 = 27.5
  2. 填充缺失值

    data.Age = fillmissing(data.Age, 'constant', avg);
    
    • 原始数据:[25, NaN, 30] → 填充后:[25, 27.5, 30]

其他填充方法

  • 插值填充fillmissing(data.Age, 'linear')(线性插值)。
  • 邻近值填充fillmissing(data.Age, 'previous')(用前一个有效值填充)。

注意事项

  1. 确保数据类型一致

    • fillmissing 的填充值必须与列的数据类型兼容(例如,数值列用数值填充,字符串列用字符串填充)。
  2. 处理全缺失列

    • 若某列全部为 NaNmean(..., 'omitnan') 会返回 NaN,导致填充无效。需额外处理:
      if all(isnan(data.Age))data.Age = zeros(size(data.Age));  % 用0填充全缺失列
      end
      
  3. 分类变量处理

    • 分类数据(如 'Male', 'Female')需用众数填充:
      modeGender = mode(data.Gender, 'omitnan');
      data.Gender = fillmissing(data.Gender, 'constant', modeGender);
      

完整示例
原始数据

Age
25
NaN
30

执行代码后

Age
25
27.5
30

总结

  • ismissing:精准定位数据中的缺失值,生成逻辑掩码。
  • fillmissing:灵活填充缺失值,支持均值、插值、邻近值等方法。
  • 核心技巧:结合 ismissing 的检测结果,选择合适策略清洗数据,确保后续分析可靠性。

(2) 数据筛选

  • 按条件筛选行
    highScores = data(data.Score > 90, :);  % 筛选 Score 列大于90的行
    
  • 选择特定列
    selectedData = data(:, {'Name', 'Age'});  % 选择 Name 和 Age 列
    

(3) 数据转换

涵盖 类型转换分类数据编码 的核心操作。

一、类型转换:data.Age = double(data.Age);
1. 作用与原理
  • 目标:将 data.Age 列的数据类型转换为 双精度浮点数double)。
  • 适用场景
    • 原始数据可能是整数(int)、字符(char)或其他类型。
    • 需要统一数值类型以确保计算精度(例如参与科学计算或统计分析)。
2. 示例说明
原始数据

假设 data.Age 原本是整数类型(int32):

data = table([25; 30; 28], {'Male'; 'Female'; 'Male'}, 'VariableNames', {'Age', 'Gender'});
disp(class(data.Age));  % 输出 'int32'

原始数据

Age (double)Gender
25Male
30Female
28Male
转换代码
data.Age = double(data.Age);  % 转换为双精度浮点数
disp(class(data.Age));         % 输出 'double'

转换后数据

Age (double)Gender
25.0Male
30.0Female
28.0Male
3. 常见类型转换函数
函数作用示例
double()转为双精度浮点数x = double(int32(5))5.0
single()转为单精度浮点数x = single(3.14)
int32()转为32位整数x = int32(10.7)10
string()转为字符串数组x = string(123)"123"
cellstr()转为字符向量元胞数组x = cellstr("Text"){'Text'}
4. 注意事项
  • 精度丢失:将浮点数转换为整数时,小数部分会被截断(非四舍五入)。
    x = 3.9;
    y = int32(x);  % y = 3
    
  • 数据溢出:超出目标类型范围的转换会引发错误或产生意外值。
    x = 500;
    y = int8(x);   % int8 范围是 [-128, 127],y = 127(溢出)
    

分类数据编码:data.Gender = categorical(data.Gender);

1. 作用与原理
  • 目标:将字符或字符串数据转换为 分类变量categorical)。
  • 优势
    • 节省内存:分类变量内部存储为整数索引,而非重复的字符串。
    • 高效操作:支持快速分组统计、排序、筛选。
    • 语义清晰:保留原始标签,方便可视化与分析。
2. 示例说明
原始数据

假设 data.Gender 是字符串数组:

data.Gender = ["Male"; "Female"; "Male"; "Female"];
disp(class(data.Gender));  % 输出 'string'

注意:一定要转换为categorical类型的数据

转换代码
data.Gender = categorical(data.Gender);  % 转换为分类变量
disp(class(data.Gender));                % 输出 'categorical'
disp(categories(data.Gender));           % 输出 {'Female', 'Male'}
转换后数据
Gender (categorical)
Male
Female
Male
Female
3. 分类变量的核心操作

(1) 统计频数

counts = countcats(data.Gender);  % 输出 [2; 2](Female:2, Male:2)

(2) 排序数据

sortedData = sortrows(data, 'Gender');  % 按分类顺序排序(默认字母顺序)

(3) 合并类别

% 将 'Male' 和 'Female' 合并为 'Other'
data.Gender = mergecats(data.Gender, {'Male', 'Female'}, 'Other');
disp(categories(data.Gender));  % 输出 {'Other'}

(4) 处理缺失值

% 添加缺失值并填充
data.Gender(2) = missing;        % 设置为 <undefined>
data.Gender = addcats(data.Gender, 'Unknown');  % 添加新类别
data.Gender(isundefined(data.Gender)) = 'Unknown';  % 填充缺失
4. 分类变量的优势对比
操作字符串数组分类变量
内存占用高(存储所有字符)低(存储整数索引)
分组统计速度
支持自定义类别顺序不支持支持(有序分类)

三、综合应用场景

场景:数据预处理流程
% 步骤1:读取数据
data = readtable('survey_data.csv');% 步骤2:类型转换(Age列转为double)
data.Age = double(data.Age);% 步骤3:分类编码(Gender列转为分类变量)
data.Gender = categorical(data.Gender);% 步骤4:处理缺失值(用众数填充Gender)
modeGender = mode(data.Gender, 'omitnan');
data.Gender = fillmissing(data.Gender, 'constant', modeGender);% 步骤5:保存处理后的数据
writetable(data, 'cleaned_survey_data.csv');

四、注意事项

  1. 类型转换前检查数据
    • 确保转换后的类型适合后续分析(例如日期数据应转为 datetime)。
  2. 分类变量的顺序
    • 默认按字母顺序排列,可通过 'Ordinal', true 指定逻辑顺序。
  3. 缺失值处理
    • 分类变量中的缺失值显示为 <undefined>,需用 addcatsfillmissing 处理。

总结

  • 类型转换:确保数据格式统一,满足计算需求。
  • 分类编码:提升处理离散标签数据的效率和可读性。
  • 核心函数double(), categorical(), countcats(), mergecats()

3. 数据分析与统计

一、聚合统计

1. 分组统计:groupsummary

功能:按指定分组变量对数据进行分组,并计算统计量(如均值、总和、标准差等)。

语法
groupStats = groupsummary(data, groupVars, method, dataVars)
  • data:输入表格(table)。
  • groupVars:分组变量(列名或列索引),支持单列或多列。
  • method:统计方法(如 'mean', 'sum', 'std')。
  • dataVars:需要统计的数据列(列名或列索引)。
示例 1:按性别计算平均分
% 创建示例数据
data = table({'Male'; 'Female'; 'Male'; 'Female'}, [85; 92; 78; 88], 'VariableNames', {'Gender', 'Score'});% 按性别分组计算平均分
groupStats = groupsummary(data, 'Gender', 'mean', 'Score');

输出结果

GenderGroupCountmean_Score
Female290
Male281.5
示例 2:多分组变量与多统计方法
% 按性别和部门分组,计算销售额的总和和均值
groupStats = groupsummary(data, {'Gender', 'Dept'}, {'sum', 'mean'}, 'Sales');

2. 交叉分析:crosstab

功能:生成交叉频数表,统计两个或多个分类变量的组合频数。

语法
[table, chi2, p] = crosstab(var1, var2, ...)
  • var1, var2:分类变量(向量或分类数组)。
  • table:交叉频数表。
  • chi2:卡方检验统计量。
  • p:p 值(检验变量独立性的显著性)。
示例:性别与部门的交叉分析
% 创建示例数据
gender = categorical({'Male'; 'Female'; 'Male'; 'Female'});
dept = categorical({'IT'; 'HR'; 'IT'; 'HR'});% 生成交叉表
[counts, ~, ~] = crosstab(gender, dept);
disp(counts);

输出

HRIT
Female20
Male02

二、数值计算

1. 矩阵运算:cov(协方差矩阵)

功能:计算数据列之间的协方差矩阵,反映变量间的线性相关性。

语法
covMatrix = cov(data)
  • data:数值矩阵或表格中的数值列。
  • covMatrix:对称矩阵,对角线为方差,非对角线为协方差。
示例:计算协方差矩阵
% 提取表格中的数值列(第2到5列)
numericData = data{:, 2:5};% 计算协方差矩阵
covariance = cov(numericData);
disp(covariance);
协方差解读
  • 正值:变量同向变化。
  • 负值:变量反向变化。
  • 绝对值大小:表示相关性强度。

2. 自定义函数应用:arrayfun

功能:对数组的每个元素应用自定义函数,避免显式循环。

语法
output = arrayfun(func, array)
  • func:函数句柄(如 @(x) x + 5)。
  • array:输入数组。
  • output:与输入数组同维度的结果。
示例:所有分数加5
% 定义分数列
data.Score = [85; 92; 78; 88];% 对每个分数加5
data.AdjustedScore = arrayfun(@(x) x + 5, data.Score);

输出

ScoreAdjustedScore
8590
9297
7883
8893
对比向量化操作
% 更高效的向量化写法
data.AdjustedScore = data.Score + 5;

三、综合应用场景

场景:销售数据分析
% 步骤1:读取数据
data = readtable('sales_data.csv');% 步骤2:按地区和产品类别分组,计算总销售额和平均利润
groupStats = groupsummary(data, {'Region', 'Product'}, {'sum', 'mean'}, {'Sales', 'Profit'});% 步骤3:生成地区和销售员的交叉表
[counts, ~, ~] = crosstab(data.Region, data.Salesperson);% 步骤4:计算销售额与利润的协方差
covMatrix = cov(data{:, {'Sales', 'Profit'}});% 步骤5:调整销售额(所有值乘以1.1)
data.AdjustedSales = arrayfun(@(x) x * 1.1, data.Sales);

四、注意事项

  1. 数据类型一致性

    • 聚合统计和交叉分析要求分组变量为分类变量或可离散化的数值。
    • 协方差计算需确保输入为数值矩阵。
  2. 缺失值处理

    • groupsummary 默认忽略缺失值,但需提前确认数据完整性。
    • crosstab 会将缺失值单独列为一类(<undefined>)。
  3. 性能优化

    • 优先使用向量化操作(如 data.Score + 5)替代 arrayfun,提升效率。
    • 对大型数据,避免在循环中频繁操作表格,可转换为矩阵处理。

五、扩展函数推荐

函数作用示例
grpstats分组统计(类似 groupsummarygrpstats(data, group, 'mean')
varfun对表格列应用函数varfun(@mean, data)
corrcoef计算相关系数矩阵corrcoef(data{:, 2:5})
pivot生成透视表pivot(data, Rows='Gender')

生命如同寓言,其价值不在于长短,而在于内容。 —塞涅卡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷题目 P5994 [PA 2014] Kuglarz 题解 (本题较难)

题目传送门&#xff1a; P5994 [PA 2014] Kuglarz - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 本题涉及到最小生成树中的 kruskal 算法和并查集算法&#xff0c;图论基础概念两大知识点&#xff0c;瞎按对莱索没有学过图论的或最小生成树的可能会对这道…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型&#xff08;Open Systems Interconnection Model&#xff09; OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;旨在为不同的网络设备和协议提供一个通用的语言和结构&#xff0c;以…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机&#xff08;基于 STM32CubeIDE GCC 开发&#xff09;&#xff0c;它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的&#xff0c;缺点是不支持…

996引擎 -地图-添加安全区

996引擎 -地图-添加安全区 文件位置配置 cfg_startpoint.xls特效效果1345参考资料文件位置 文件位置服务端D:\996M2-lua\MirServer-lua\Mir200客户端D:\996M2-lua\996M2_debug\dev配置 cfg_startpoint.xls 服务端\Mir200\Envir\DATA\cfg_startpoint.xls 填歪了也有可能只画一…

【leetcode强化练习·二叉树】同时运用两种思维解题

本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解&#xff0c;你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树&#xff0c;…

栈和队列特别篇:栈和队列的经典算法问题

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…

ios swift画中画技术尝试

继上篇&#xff1a;iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画&#xff0c;起初是看到后台模式里有一个picture in picture&#xff0c;去了解了后发现这个就是小窗口视频播放&#xff0c;方便用户执行多任务。看小窗口视频的同时&#xff0c;可以作其他的事情…

人生不止于职业发展

0 你的问题&#xff0c;我知道&#xff01; 工作意义是啥&#xff1f;职业发展在人生啥角色&#xff1f; 1 工作意义 农村人努力学习考上大学&#xff0c;得好工作&#xff0c;为逃离同村同龄人十几岁就工厂打工命运&#xff0c;过不凡人生&#xff0c;实现改命的唯一途径。…

【算法设计与分析】实验3:动态规划—最长公共子序列

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握动态规划求解问题的思想&#xff1b;针对不同的问题&#xff0c;会利用动态规划进行设计求解以及时间复杂度分析&#xff0…

网关登录校验

网关登录校验 单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;不再共享数据。也就意味着每个微服务都需要做登录校验&#xff0c;这显然不可取。 鉴权思路分析 …

wxwidgets直接获取系统图标,效果类似QFileIconProvider

目前只做了windows版本&#xff0c;用法类似QFileIconProvider // 头文件 #ifndef WXFILEICONPROVIDER_H #define WXFILEICONPROVIDER_H#include <wx/wx.h> #include <wx/icon.h> #include <wx/image.h> #include <wx/bmpcbox.h> // Include for wxB…

【玩转全栈】--创建一个自己的vue项目

目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架&#xff0c;旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念&#xff0c;使得开发者可以通过声明式的方式轻松管理数据和…

DS并查集(17)

文章目录 前言一、何为并查集&#xff1f;二、并查集的实现&#xff1f;并查集的初始化查找元素所在的集合判断两个元素是否在同一个集合合并两个元素所在的集合获取并查集中集合的个数并查集的路径压缩 三、来两道题练练手&#xff1f;省份的数量等式方程的可满足性 总结 前言…

minimind - 从零开始训练小型语言模型

大语言模型&#xff08;LLM&#xff09;领域&#xff0c;如 GPT、LLaMA、GLM 等&#xff0c;虽然它们效果惊艳&#xff0c; 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练&#xff0c;甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的…

【C++动态规划 离散化】1626. 无矛盾的最佳球队|2027

本文涉及知识点 C动态规划 离散化 LeetCode1626. 无矛盾的最佳球队 假设你是球队的经理。对于即将到来的锦标赛&#xff0c;你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而&#xff0c;球队中的矛盾会限制球员的发挥&#xff0c;所以必须选…

Privacy Eraser,电脑隐私的终极清除者

Privacy Eraser 是一款专为保护用户隐私而设计的全能型软件&#xff0c;它不仅能够深度清理计算机中的各类隐私数据&#xff0c;还提供了多种系统优化工具&#xff0c;帮助用户提升设备的整体性能。通过这款软件&#xff0c;用户可以轻松清除浏览器历史记录、缓存文件、Cookie、…

【数据结构与算法】AVL树的插入与删除实现详解

文章目录 前言Ⅰ. AVL树的定义Ⅱ. AVL树节点的定义Ⅲ. AVL树的插入Insert一、节点的插入二、插入的旋转① 新节点插入较高左子树的左侧&#xff08;左左&#xff09;&#xff1a;右单旋② 新节点插入较高右子树的右侧&#xff08;右右&#xff09;&#xff1a;左单旋③ 新节点插…

SCRM开发为企业提供全面客户管理解决方案与创新实践分享

内容概要 在当今的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;变得越来越重要。而SCRM&#xff08;社交客户关系管理&#xff09;作为一种新兴的解决方案&#xff0c;正在帮助企业彻底改变与客户的互动方式。快鲸SCRM是一个引人注目的工具&#xff0c;它通…

【C/C++】区分0、NULL和nullptr

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 1. 0 和空指针 2. NULL 3. nullptr 总结 …