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.pswp.cn/web/67644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67644.shtml
英文地址,請注明出處:http://en.pswp.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…

10.7 LangChain Models深度解析:解鎖大模型集成與調優的全景攻略

LangChain Models深度解析:解鎖大模型集成與調優的全景攻略 關鍵詞: LangChain Models模塊、大模型集成、LLM調用優化、多模型管理、本地模型部署 一、Models模塊的定位:大模型應用的“中央調度器” 傳統開發的痛點: 碎片化集成:每個模型需單獨編寫適配代碼性能黑洞:缺…

記一次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;可以作其他的事情…

OpenAI推出o3-mini推理模型,首次免費開放,性能超越o1,AIME測試準確率高達87.3%

OpenAI在2025年初推出了一款新的推理模型o3-mini&#xff0c;這款模型標志著公司在提升性能的同時也降低了成本&#xff0c;并且首次向免費用戶提供訪問權限。o3-mini是OpenAI推理系列中最新、最具成本效益的模型&#xff0c;在科學、數學、編程等領域的性能顯著超越了之前的o1…

人生不止于職業發展

0 你的問題&#xff0c;我知道&#xff01; 工作意義是啥&#xff1f;職業發展在人生啥角色&#xff1f; 1 工作意義 農村人努力學習考上大學&#xff0c;得好工作&#xff0c;為逃離同村同齡人十幾歲就工廠打工命運&#xff0c;過不凡人生&#xff0c;實現改命的唯一途徑。…

【算法設計與分析】實驗3:動態規劃—最長公共子序列

目錄 一、實驗目的 二、實驗環境 三、實驗內容 四、核心代碼 五、記錄與處理 六、思考與總結 七、完整報告和成果文件提取鏈接 一、實驗目的 掌握動態規劃求解問題的思想&#xff1b;針對不同的問題&#xff0c;會利用動態規劃進行設計求解以及時間復雜度分析&#xff0…

動手學圖神經網絡(3):利用圖神經網絡進行節點分類 從理論到實踐

利用圖神經網絡進行節點分類:從理論到實踐 前言 在之前的學習中,大家對圖神經網絡有了初步的了解。本次教程將深入探討如何運用圖神經網絡(GNNs)來解決節點分類問題。在節點分類任務里,大家往往僅掌握少量節點的真實標簽,卻要推斷出其余所有節點的標簽,這屬于歸納式學…

單片機串口打印printf函數顯示內容(固件庫開發)

1.hal_usart.c 文件 #include <stdio.h> #include "hal_usart.h" #include "stm32F10x.h"//**要根據 使用的是哪個串口 對應修改 串口號 eg&#xff1a;USART1** void USART_PUTC(char ch) {/* 等待數據寄存器為空 */while((USART1->SR & …

網關登錄校驗

網關登錄校驗 單體架構時我們只需要完成一次用戶登錄、身份校驗&#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…

我的創作紀念日——成為創作者的 第365天(1年)

機緣 考研的結果讓我感到一陣絕望&#xff0c;就像單片機突然死機一樣&#xff0c;所有的努力像是被一場意外的中斷指令打亂了邏輯流程。曾經本科時因為競賽拿了一堆獎&#xff0c;內心充滿虛榮心和成就感&#xff0c;總覺得自己是一個“天選之子”&#xff0c;但考研的失利卻像…

React 封裝高階組件 做路由權限控制

React 高階組件是什么 官方解釋∶ 高階組件&#xff08;HOC&#xff09;是 React 中用于復用組件邏輯的一種高級技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一種基于 React 的組合特性而形成的設計模式。 高階組件&#xff08;HOC&#xff09;就是一個函數&…

【玩轉全棧】--創建一個自己的vue項目

目錄 vue介紹 創建vue項目 vue頁面介紹 element-plus組件庫 啟動項目 vue介紹 Vue.js 是一款輕量級、易于上手的前端 JavaScript 框架&#xff0c;旨在簡化用戶界面的開發。它采用了響應式數據綁定和組件化的設計理念&#xff0c;使得開發者可以通過聲明式的方式輕松管理數據和…

DS并查集(17)

文章目錄 前言一、何為并查集&#xff1f;二、并查集的實現&#xff1f;并查集的初始化查找元素所在的集合判斷兩個元素是否在同一個集合合并兩個元素所在的集合獲取并查集中集合的個數并查集的路徑壓縮 三、來兩道題練練手&#xff1f;省份的數量等式方程的可滿足性 總結 前言…