Trong quá trình phân tích dữ liệu thực tế, chúng ta sẽ thường phải phân tích mối quan hệ giữa các biến liên tục (biến numeric). Ở trong bài viết trước đây, mình đã chia sẻ với các bạn cách giải quyết vấn đề trên bằng việc sử dụng câu lệnh cor()ggcorrplot() trong package ggcorrplot.

Tuy nhiên, cách tính toán hệ số tương quan bằng việc sử dụng cor() sẽ có một số hạn chế sau:

  • Yêu cầu các biến đầu vào phải là biến liên tục

  • Ma trận hệ số tương quan sẽ khó đọc trong trường hợp dữ liệu lớn (nhiều biến đầu vào)

  • Không cung cấp giá trị khoảng tin cậy (confidence intervals)

Trong bài viết này, mình sẽ hướng dẫn các bạn cách tính toán và trực quan hóa hệ số tương quan với inspectdf.

Chúng ta sẽ sử dụng dữ liệu storms có sẵn trong R.

library(dplyr)
data("storms") # Dữ liệu có sẵn trong `R`

# Summary dữ liệu
storms <- storms %>% 
  mutate_if(is.character, as.factor)
storms %>% summary
##         name            year          month             day       
##  Emily    :  217   Min.   :1975   Min.   : 1.000   Min.   : 1.00  
##  Bonnie   :  209   1st Qu.:1992   1st Qu.: 8.000   1st Qu.: 8.00  
##  Alberto  :  184   Median :2002   Median : 9.000   Median :16.00  
##  Claudette:  180   Mean   :2001   Mean   : 8.785   Mean   :15.83  
##  Felix    :  178   3rd Qu.:2011   3rd Qu.: 9.000   3rd Qu.:24.00  
##  Danielle :  165   Max.   :2020   Max.   :12.000   Max.   :31.00  
##  (Other)  :10726                                                  
##       hour             lat             long                         status    
##  Min.   : 0.000   Min.   : 7.20   Min.   :-109.30   hurricane          :3613  
##  1st Qu.: 6.000   1st Qu.:17.50   1st Qu.: -80.70   tropical depression:2898  
##  Median :12.000   Median :24.60   Median : -64.40   tropical storm     :5348  
##  Mean   : 9.117   Mean   :24.76   Mean   : -64.09                             
##  3rd Qu.:18.000   3rd Qu.:31.30   3rd Qu.: -48.40                             
##  Max.   :23.000   Max.   :51.90   Max.   :  -6.00                             
##                                                                               
##  category       wind           pressure    tropicalstorm_force_diameter
##  -1:2898   Min.   : 10.00   Min.   : 882   Min.   :  0.0               
##  0 :5347   1st Qu.: 35.00   1st Qu.: 985   1st Qu.: 60.0               
##  1 :1934   Median : 45.00   Median : 999   Median :120.0               
##  2 : 749   Mean   : 53.64   Mean   : 992   Mean   :145.3               
##  3 : 434   3rd Qu.: 65.00   3rd Qu.:1006   3rd Qu.:210.0               
##  4 : 411   Max.   :160.00   Max.   :1022   Max.   :870.0               
##  5 :  86                                   NA's   :6509                
##  hurricane_force_diameter
##  Min.   :  0.00          
##  1st Qu.:  0.00          
##  Median :  0.00          
##  Mean   : 18.15          
##  3rd Qu.: 25.00          
##  Max.   :300.00          
##  NA's   :6509

1 Tính toán hệ số tương quan

Để tính toán hệ số tương quan, chúng ta sẽ sử dụng câu lệnh inspect_cor() trong package inspectdf.

library(inspectdf) 
storms %>% 
  inspect_cor()
## # A tibble: 45 x 7
##    col_1                        col_2       corr   p_value  lower  upper pcnt_~1
##    <chr>                        <chr>      <dbl>     <dbl>  <dbl>  <dbl>   <dbl>
##  1 pressure                     wind      -0.944 0         -0.946 -0.942   100  
##  2 hurricane_force_diameter     pressure  -0.821 0         -0.830 -0.812    45.1
##  3 hurricane_force_diameter     wind       0.754 0          0.742  0.765    45.1
##  4 hurricane_force_diameter     tropical~  0.681 0          0.666  0.695    45.1
##  5 tropicalstorm_force_diameter pressure  -0.678 0         -0.692 -0.663    45.1
##  6 tropicalstorm_force_diameter wind       0.625 0          0.608  0.641    45.1
##  7 tropicalstorm_force_diameter lat        0.318 1.66e-119  0.294  0.342    45.1
##  8 hurricane_force_diameter     lat        0.190 8.83e- 44  0.164  0.215    45.1
##  9 day                          month     -0.174 5.59e- 80 -0.191 -0.156   100  
## 10 tropicalstorm_force_diameter month      0.171 8.89e- 36  0.145  0.197    45.1
## # ... with 35 more rows, and abbreviated variable name 1: pcnt_nna
  • Kết quả cho ta thấy hệ số tương quan của từng cặp biến trong dữ liệu (cột col_1, col_2).

  • p_value: Nếu p_value < 0.05 thì có thể nói có mối tương quan tuyến tính giữa 2 biến col_1 & col_2.

    • H0: Hệ số tương quan bằng 0 (Không có mối tương quan giữa 2 biến)
    • H1: Hệ số tương quan khác 0 (Có mối tương quan giữa 2 biến)
  • lowerupper chính là khoảng tin cậy 95% của hệ số tương quan (corr).

Ngoài ra, nếu chúng ta chỉ muốn tính toán hệ số tương quan của 1 biến nhất định đối với các biến còn lại, chúng ta có thể thêm with_col = "variable_name" vào trong câu lệnh inspect_cor().

# Tính toán correlation của biến `wind` đối với các biến còn lại
storms %>% 
  inspect_cor(with_col = "wind") %>% 
  knitr::kable() # Hiển thị bảng
col_1 col_2 corr p_value lower upper pcnt_nna
wind pressure -0.9440526 0.0000000 -0.9459775 -0.9420612 100.00000
wind hurricane_force_diameter 0.7535340 0.0000000 0.7417140 0.7648862 45.11342
wind tropicalstorm_force_diameter 0.6245421 0.0000000 0.6079191 0.6406179 45.11342
wind month 0.1424370 0.0000000 0.1247585 0.1600251 100.00000
wind lat 0.0780760 0.0000000 0.0601623 0.0959395 100.00000
wind year 0.0388059 0.0000239 0.0208221 0.0567645 100.00000
wind long -0.0096130 0.2952314 -0.0276066 0.0083868 100.00000
wind day -0.0047970 0.6014420 -0.0227934 0.0132024 100.00000
wind hour -0.0006575 0.9429230 -0.0186556 0.0173410 100.00000

2 Trực quan hóa hệ số tương quan

Để trực quan hóa hệ số tương quan, chúng ta thêm câu lệnh show_plot().

# Trực quan hóa hệ số tương quan của tất cả các biến trong dữ liệu
storms %>% 
  inspect_cor() %>% 
  show_plot()

# Trực quan hóa hệ số tương quan chỉ của biến `wind` với các biến khác trong dữ liệu
storms %>% 
  inspect_cor(with_col = "wind") %>% 
  show_plot()

Như vậy, chúng ta đã vừa được học cách tính toán và trực quan hóa hệ số tương quan với inspectdf.

Chúc các bạn học tập và làm việc hiệu quả!