[R]使用ggplot2套件進行資料的簡單相關分析

於專案中使用install.package來安裝ggplot2,並將套件載入,使用R語言內建的iris(鳶尾花資料集)進行皮爾森積差相關分析並產生散佈圖。

相關分析解讀要點:

  • 相關係數介於-1(負相關)至1(正相關)之間
  • 相關係數沒有單位
  • 兩數列有相關,並不表示有因果關係
  • 從ggplot2產生的散佈圖中,兩數列若呈現線性關係,則表示有相關聯性

cor方法其他參數可參考:https://www.rdocumentation.org/packages/stats/versions/3.5.1/topics/cor

# 參考來源:https://rpubs.com/skydome20/R-Note5-First_Practice
# install.packages(
#    "ggplot2",
#    repos = c("http://rstudio.org/_packages",
#    "http://cran.rstudio.com")
# )

#install.packages("Rtools",repos = "https://cran.r-project.org/bin/windows/Rtools/")
library("ggplot2")

#iris資料集說明:R語言內建的鳶尾花資料(from datasets)
#Sepal.Length:花萼長度(cm)
#Sepal.Width:花萼寬度(cm)
#Petal.Length:花瓣長度(cm)
#Petal.Width:花瓣寬度(cm)
#Species:Setosa,Versicolor,Virginica(3種)

typeof(iris)
names(iris)   #列出所有資料欄位
cor1 <- cor(iris$Sepal.Length,iris$Sepal.Width)   #兩數列求相關係數
finalRow <- lapply(iris, "[[", length(iris)) #篩選iris列表中索引值最高的資料
head(iris , n=10)  #列出整個list太多,所以只列出iris列表中的前10筆
summary(iris) #基本統計分析
iris[0] #顯示資訊
iris[-5] #去掉第5行(直)
cor(iris[-5])  #去掉第5行,將剩餘的數列做相關分析,求相關係數
irisfilter <- iris[-3][-3][-3]  #去掉第3 4 5行 ,使用List型態,則內容為動態,第3行 刪掉, 第4行、第5行會往前遞補
head(irisfilter , n=10)  #列出整個list太多,所以只列出iris列表中的前10筆
irisfilter$Sepal.Length #欄位內容顯示(以陣列方式讀出)
irisfilter$Sepal.Width #欄位內容顯示(以陣列方式讀出)
cor2 <- cor(irisfilter$Sepal.Length , irisfilter$Sepal.Width)  #兩數列求相關係數
cor2
all.equal(cor1 , cor2) #比較兩個相關係數是否相等
pairs(irisfilter)  # 相關分析繪圖
pairs(iris[-5])   # 相關分析繪圖

執行結果如下:

> typeof(iris)
[1] "list"
> names(iris)   #列出所有資料欄位
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
> cor1 <- cor(iris$Sepal.Length,iris$Sepal.Width)   #兩數列求相關係數
> finalRow <- lapply(iris, "[[", length(iris)) #篩選iris列表中索引值最高的資料
> head(iris , n=10)  #列出整個list太多,所以只列出iris列表中的前10筆
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
> summary(iris) #基本統計分析
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300
 Median :5.800   Median :3.000   Median :4.350   Median :1.300
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500
       Species
 setosa    :50
 versicolor:50
 virginica :50



> iris[0] #顯示資訊
data frame with 0 columns and 150 rows
> head(iris[-5], n=10) #去掉第5行(直)
   Sepal.Length Sepal.Width Petal.Length Petal.Width
1           5.1         3.5          1.4         0.2
2           4.9         3.0          1.4         0.2
3           4.7         3.2          1.3         0.2
4           4.6         3.1          1.5         0.2
5           5.0         3.6          1.4         0.2
6           5.4         3.9          1.7         0.4
7           4.6         3.4          1.4         0.3
8           5.0         3.4          1.5         0.2
9           4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
> cor(iris[-5])  #去掉第5行,將剩餘的數列做相關分析,求相關係數
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000
> irisfilter <- iris[-3][-3][-3]  #去掉第3 4 5行 ,使用List型態,則內容為動態,第3行 刪掉, 第4行、第5行會往前遞補
> head(irisfilter , n=10)  #列出整個list太多,所以只列出iris列表中的前10筆
   Sepal.Length Sepal.Width
1           5.1         3.5
2           4.9         3.0
3           4.7         3.2
4           4.6         3.1
5           5.0         3.6
6           5.4         3.9
7           4.6         3.4
8           5.0         3.4
9           4.4         2.9
10          4.9         3.1
> irisfilter$Sepal.Length #欄位內容顯示(以陣列方式讀出)
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
 [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
 [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
 [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
 [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
 [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
[109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
[145] 6.7 6.7 6.3 6.5 6.2 5.9
> irisfilter$Sepal.Width #欄位內容顯示(以陣列方式讀出)
  [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 3.5
 [19] 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2
 [37] 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3
 [55] 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7 2.2 2.5 3.2 2.8
 [73] 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0 3.4 3.1 2.3 3.0 2.5
 [91] 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9
[109] 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2
[127] 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2
[145] 3.3 3.0 2.5 3.0 3.4 3.0
> cor2 <- cor(irisfilter$Sepal.Length , irisfilter$Sepal.Width)  #兩數列求相關係數
> cor2
[1] -0.1175698
> all.equal(cor1 , cor2) #比較兩個相關係數是否相等
[1] TRUE

pairs(irisfilter)產生的散佈圖如下,散佈圖的解釋可對照cor(iris[-3][-3][-3])的執行結果

pairs(iris[-5])產生的散佈圖如下,散佈圖的解釋可對照cor(iris[-5])的執行結果