iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0

資料視覺化是我們了解資料的第一步,透過圖形的呈現,使我們對於資料有更近一步的了解。
常見的資料描述圖為直方圖(histogram)、盒鬚圖(boxplot)、折線圖(Line chart)等,透過這些圖表,使我們能夠得知變數的分佈與分配。

在R軟體中除了內建的繪圖程式外,較常使用的套件為ggplot2,此套件可以繪製較為精美的圖表,透過不同的參數設定,調整成使用者理想中的視覺化呈現方式,因此以下皆會透過ggplot2來繪圖。而Python的繪圖套件有非常多個,較常被使用的套件為Matplotlib及Seaborn,以下則會使用Matplotlib及Seaborn作為示範。

穿戴式裝置主要紀錄的資料為時序資料,若以Mobile Health Human Behavior Analysis資料集作為舉例,資料集中紀錄兩顆加速度計(六軸)和兩顆陀螺儀(六軸),總共包含12軸的數值。以下將會舉例幾個圖形作為範例。

資料型態

以R的資料前處理作為示範,python的處理方式及命名將相同
dataset2 <- read.csv('mhealth_raw_data.csv')
head(dataset2)   ### 只顯示資料中的前幾列
### 由於資料中並未標示每個動作的起始點,因此利用activity_detail這個dataframe來進行整理
activity_detail <- data.frame(matrix(ncol = 4, nrow = 0))
start <- 1
end <- 1
for(i in 2:length(dataset2$Activity)){
  if (dataset2$Activity[i] != dataset2$Activity[i-1]){
    end <- i-1
    activity_detail <- rbind(activity_detail,data.frame(start, end, end-start+1 , dataset2$Activity[start]))
    start <- i
  }
}
colnames(activity_detail) <- c('Start', 'End','Duration','Activity')
head(activity_detail)

#  Start   End Duration Activity
#1     1  6656     6656        0
#2  6657  9728     3072        1
#3  9729 12800     3072        0
#4 12801 15872     3072        2
#5 15873 18944     3072        0
#6 18945 22016     3072        3
### 透過activity_detail得知動作起始點後,隨機挑選一個動作作為範例
### 加速度計以及陀螺儀所記錄的數值單位不同,因此分開畫圖較恰當
plt_activity1_acc <- dataset2[6657:9728,c(1:3,7:9)]
plt_activity1_gyro <- dataset2[6657:9728,c(4:6,10:12)]
plt_activity1_acc$t <- seq(1,length(plt_activity1_acc$alx),1)
plt_activity1_gyro$t <- seq(1,length(plt_activity1_gyro$glx),1)

使用套件

R

library(tidyr)
library(ggplot2)
library(ggpubr) 
library(dygraphs)   ###互動時間序列圖
library(corrplot)

Python

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

直方圖 (不同動作重複的次數)

R: 使用ggplot2 套件的 geom_bar() 函數

activity_detail$Activity <- as.factor(activity_detail$Activity)
ggplot(activity_detail, aes(x=Activity, fill=Activity)) +
  geom_bar(position="dodge")

https://ithelp.ithome.com.tw/upload/images/20220910/20151279Z1oaQ0A2VW.png
Python: 使用matplotlib.pyplot 套件的 plt.bar 函數

plt_data = activity_detail['Activity'].value_counts()
plt.bar(plt_data.index, plt_data, width=0.8, color=plt.cm.Paired(np.arange(len(plt_data))))
plt.show()

https://ithelp.ithome.com.tw/upload/images/20220910/20151279aZcdojMIAq.png

折線圖 (執行動作的三軸加速度/三軸角度變化)

R: 使用ggplot2 套件的 geom_line() 函數;使用dygraphdygraph()函數 (動態時序資料)

acc <- plt_activity1_acc %>% 
  pivot_longer(-t,names_to = 'sensor',values_to = 'acc') %>% 
  ggplot(aes(t, acc)) +
  geom_line(aes(color = sensor)) 
gyro <- plt_activity1_gyro%>% 
  pivot_longer(-t,names_to = 'sensor',values_to = 'gyro') %>% 
  ggplot(aes(t, gyro)) +
  geom_line(aes(color = sensor)) 
ggarrange(acc, gyro, ncol = 1,nrow = 2)    ### 將兩張plot放在一起

https://ithelp.ithome.com.tw/upload/images/20220910/201512790LYrqpervf.png

plt_dataset <- cbind(timestep = 1:nrow(dataset2[6657:9728,c(1:3,7:9)]), dataset2[6657:9728,c(1:3,7:9)])
dygraph(plt_dataset)  ###互動式圖表,圖形右上角可顯示游標上的對應數值

https://ithelp.ithome.com.tw/upload/images/20220910/20151279Z6jyJO01fq.png

Python: 使用matplotlib.pyplot 套件的 df.plot(kind = 'line') 函數

fig, axes = plt.subplots(nrows=2, ncols=1,figsize=(7,10))
figure1 = plt_activity1_acc.plot(x="t", y=["alx", "aly",'alz','arx','ary','arz'],kind = 'line',ax=axes[0])
figure1.legend(bbox_to_anchor=(1.0, 1.0))

figure2 = plt_activity1_gyro.plot(x="t", y=["glx", "gly",'glz','grx','gry','grz'],kind = 'line',ax=axes[1])
figure2.legend(bbox_to_anchor=(1.0, 1.0))
plt.show()

https://ithelp.ithome.com.tw/upload/images/20220910/20151279G8E27KDxMq.png

相關圖 (各軸之間的相關性)

R: ggplot2套件中仍有相關圖的語法,但使用corrplot 套件的 corrplot 函數等其他套件可以較容易完成

corrplot(cor(dataset2[,1:12]), diag = FALSE, tl.pos = "td", tl.cex = 1,
method = "color", type = "upper")

https://ithelp.ithome.com.tw/upload/images/20220910/20151279FmCC4hJsjS.png

Python:使用seaborn.heatmap 套件的 sns.heatmap 函數

corr = dataset2.iloc[:,1:12].corr()
sns.heatmap(
    corr, 
    vmin=-1, vmax=1, center=0,
    cmap=sns.diverging_palette(20, 220, n=200),
    square=True, mask = np.triu(corr))
plt.yticks(rotation = 0)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20220910/201512794QCcgWiB6l.png


上一篇
[Day3] 資料分析流程概述
下一篇
[Day5] 敘述性統計(Descriptive statistics)
系列文
人類行為數據分析- 以R和Python進行實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言