Phát hiện giá trị thiếu trong dữ liệu với R với gói naniar

Packages

Thực hành

Ta có thể kiểm tra nhanh dữ liệu của mình có thiếu hay không với hàm any

## [1] TRUE
## [1] TRUE
## [1] TRUE

Và để xem vị trí nào bị thiếu trên vector

##  [1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
##  [1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE

Có thể áp dụng hàm ‘any’ cho cả dataframe

##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
## [1] TRUE
## [1] TRUE
## [1] TRUE

Đếm số lượng giá trị thiếu trên vector và data.frame

## [1] 2
## [1] 8
## [1] 44
## [1] 874
## [1] 37

Tính nhanh phần trăm dữ liệu thiếu

## [1] 20
## [1] 4.793028

Đếm số giá trị thiếu theo từng dòng trong data.frame

##   [1] 0 0 0 0 2 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 0 0 0 0 1 1 1 1
##  [36] 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0
##  [71] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0
## [106] 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [141] 0 0 0 0 0 0 0 0 0 1 0 0 0

Đếm số lượng biến đang thiếu dữ liệu

## [1] 2

Xem tổng thể cho toàn data.frame theo biến với miss_var_table()

## # A tibble: 3 x 3
##   n_miss_in_var n_vars pct_vars
##           <int>  <int>    <dbl>
## 1             0      4     66.7
## 2             7      1     16.7
## 3            37      1     16.7

Kết quả: có tổng cộng 6 biến trong dữ liệu. Trong đó 4 biến có đầy đủ giá trị. Có 1 biến đang bị thiếu 7 giá trị. Và 1 biến bị thiếu đến 3 giá trị.

Tính nhanh phần trăm của số biến chứa missing value

## [1] 33.33333

Ngoài ra có thể dùng miss_var_summary() để xem chi tiết cho từng biến

## # A tibble: 6 x 3
##   variable n_miss pct_miss
##   <chr>     <int>    <dbl>
## 1 Ozone        37    24.2 
## 2 Solar.R       7     4.58
## 3 Wind          0     0   
## 4 Temp          0     0   
## 5 Month         0     0   
## 6 Day           0     0

Biến Ozone thiếu 37 giá trị, biến Solar.R thiếu 7.

Có thể xem trực quan hơn qua biểu đồ một cách nhanh chóng.

Tổng cộng 42 dòng đang thiếu dữ liệu. Tổng số dữ liệu thiếu là 44. Trong đó có 2 dòng vừa thiếu dữ liệu ở cả 2 biến ‘Ozone’ và ‘Solar.R’. 35 dòng khác chỉ bị thiếu dữ liệu ở biến ‘Ozone’ và 5 dòng khác chỉ bị thiếu dữ liệu ở biến ‘Solar.R’.

Biểu diễn tổng số giá trị bị thiếu theo từng biến.

Một cách biễu diễn khác, các vị trí bị thiếu dữ liệu được tô màu đen. Hàm này được gọi từ gói visdat. Gói này đã được tự động cài và load khi ta cài và sử dụng naniar.

Chọn tham số ‘cluster = TRUE’ để gộp các dòng bị thiếu dữ liệu

Chọn tham số ‘sort_miss = TRUE’ để biểu diễn trật tự cột theo phần trăm thiếu dữ liệu. Ví dụ trên data ‘riskfactors’.

Không sắp xếp

Sắp xếp cả dòng và cột

Quay lại với data ‘airquality’ Xem tổng thể cho toàn data.frame theo dòng với miss_case_table()

## # A tibble: 3 x 3
##   n_miss_in_case n_cases pct_cases
##            <int>   <int>     <dbl>
## 1              0     111     72.5 
## 2              1      40     26.1 
## 3              2       2      1.31

Kết quả: có tổng cộng 153 dòng. Trong đó 111 dòng đầy đủ dữ liệu. Có 40 dòng đang thiếu 1 giá trị. Và 2 dòng đang thiếu 2 giá trị.

Tính nhanh phần trăm của số dòng chứa missing value

## [1] 27.45098

Tương tự ta có thể xem chi tiết theo dòng

## # A tibble: 153 x 3
##     case n_miss pct_miss
##    <int>  <int>    <dbl>
##  1     5      2     33.3
##  2    27      2     33.3
##  3     6      1     16.7
##  4    10      1     16.7
##  5    11      1     16.7
##  6    25      1     16.7
##  7    26      1     16.7
##  8    32      1     16.7
##  9    33      1     16.7
## 10    34      1     16.7
## # ... with 143 more rows

Xem nhanh với biểu đồ

Scatterplot

Các dòng bị thiếu giá trị sẽ bị xóa tự động trước khi vẽ đồ thị. Ví dụ với geom_point và ggplot.

## Warning: Removed 42 rows containing missing values (geom_point).

Tuy nhiên như đã biết ở trên chỉ có 2 dòng là thiếu dữ liệu ở cả 2 biến, các dòng còn lại vẫn chứa thông tin của 1 trong 2 biến. Do đó để thể hiện các dòng này ta có thể dùng hàm geom_miss_point()

Các vị trí bị thiếu sẽ được thay thế bằng 1 giá trị nằm bên dưới giá trị nhỏ nhất trong biến đó. Như vậy ta vẫn khai thác được thông tin đối với các dòng bị thiếu dữ liệu.

Lời kết

Chỉ với vài dòng lệnh ngắn trong gói naniar ta đã có thể nắm được thông tin liên quan đến dòng hay cột bị thiếu giá trị trong dữ liệu của mình.

Bên cạnh việc phát hiện, tổng hợp các trường hợp thiếu dữ liệu. Gói này còn có công cụ để thay thế các giá trị đang thiếu bằng nhiều phương pháp khác nhau. Lần tới mình sẽ thực hành công cụ này sau.