資料視覺化是我們了解資料的第一步,透過圖形的呈現,使我們對於資料有更近一步的了解。
常見的資料描述圖為直方圖(histogram)、盒鬚圖(boxplot)、折線圖(Line chart)等,透過這些圖表,使我們能夠得知變數的分佈與分配。
在R軟體中除了內建的繪圖程式外,較常使用的套件為ggplot2,此套件可以繪製較為精美的圖表,透過不同的參數設定,調整成使用者理想中的視覺化呈現方式,因此以下皆會透過ggplot2來繪圖。而Python的繪圖套件有非常多個,較常被使用的套件為Matplotlib及Seaborn,以下則會使用Matplotlib及Seaborn作為示範。
穿戴式裝置主要紀錄的資料為時序資料,若以Mobile Health Human Behavior Analysis資料集作為舉例,資料集中紀錄兩顆加速度計(六軸)和兩顆陀螺儀(六軸),總共包含12軸的數值。以下將會舉例幾個圖形作為範例。
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")
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()
R: 使用ggplot2
套件的 geom_line()
函數;使用dygraph
的dygraph()
函數 (動態時序資料)
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放在一起
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) ###互動式圖表,圖形右上角可顯示游標上的對應數值
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()
R: ggplot2套件中仍有相關圖的語法,但使用corrplot
套件的 corrplot
函數等其他套件可以較容易完成
corrplot(cor(dataset2[,1:12]), diag = FALSE, tl.pos = "td", tl.cex = 1,
method = "color", type = "upper")
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()