Độ đầy đủ

Làm sạch dữ liệu trong R

Maggie Matsui

Content Developer @ DataCamp

Dữ liệu khuyết là gì?

Một bức ghép hình đã hoàn thành còn thiếu một mảnh. Mô tả: Xảy ra khi không có giá trị được lưu cho một biến trong một quan sát.

Có thể biểu diễn là NA, nan, 0, 99, . ...

Làm sạch dữ liệu trong R

Dữ liệu khuyết là gì?

missing.png

Có thể biểu diễn là NA, nan, 0, 99, . ...

Một robot đại diện cho lỗi kỹ thuật.

Làm sạch dữ liệu trong R

Dữ liệu khuyết là gì?

missing.png

Có thể biểu diễn là NA, nan, 0, 99, . ...

Hình người đại diện cho lỗi con người.

Làm sạch dữ liệu trong R

Chất lượng không khí

head(airquality)
   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
Làm sạch dữ liệu trong R

Chất lượng không khí

head(airquality)
   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
Làm sạch dữ liệu trong R

Tìm giá trị khuyết

is.na(airquality)
     Ozone Solar.R  Wind  Temp Month   Day
[1,] FALSE   FALSE FALSE FALSE FALSE FALSE
[2,] FALSE   FALSE FALSE FALSE FALSE FALSE
[3,] FALSE   FALSE FALSE FALSE FALSE FALSE
[4,] FALSE   FALSE FALSE FALSE FALSE FALSE
[5,]  TRUE    TRUE FALSE FALSE FALSE FALSE
[6,] FALSE    TRUE FALSE FALSE FALSE FALSE
Làm sạch dữ liệu trong R

Đếm giá trị khuyết

# Count missing vals in entire dataset
sum(is.na(airquality))
44
Làm sạch dữ liệu trong R

Trực quan hóa giá trị khuyết

library(visdat)
vis_miss(airquality)

Trực quan tạo từ mã. Cột ngoài cùng trái có nhiều vạch đen nhất, cột thứ hai nhiều thứ nhì. Các cột khác không có vạch đen.

Làm sạch dữ liệu trong R

Khảo sát tính khuyết

airquality %>%
  mutate(miss_ozone = is.na(Ozone)) %>%

group_by(miss_ozone) %>% summarize(across(everything(), median, na.rm = TRUE))
  miss_ozone Ozone Solar.R  Wind  Temp Month   Day
  <lgl>      <dbl>   <int> <dbl> <dbl> <dbl> <dbl>
1 FALSE       31.5     207   9.7    65     7    16
2 TRUE        NA       194   9.7    99     6    15
Làm sạch dữ liệu trong R

Khảo sát tính khuyết

airquality %>%
  arrange(Temp) %>%
  vis_miss()

Trực quan như trước, nhưng ở cột Ozone bên trái, mọi giá trị khuyết nằm phía dưới.

Làm sạch dữ liệu trong R

Các kiểu dữ liệu khuyết

Trái: Xúc xắc sáu mặt biểu thị Thiếu hoàn toàn ngẫu nhiên. Giữa: Xúc xắc sáu mặt chỉ có một chấm trên mỗi mặt biểu thị Thiếu ngẫu nhiên. Phải: Bốn hình vuông chỉ vào nhau theo vòng biểu thị Thiếu không ngẫu nhiên.

Làm sạch dữ liệu trong R

Các kiểu dữ liệu khuyết

Thiếu hoàn toàn ngẫu nhiên: không có quan hệ hệ thống giữa dữ liệu khuyết và các giá trị khác. Ví dụ: lỗi nhập liệu khi nhập dữ liệu.

Làm sạch dữ liệu trong R

Các kiểu dữ liệu khuyết

Thiếu ngẫu nhiên: Có quan hệ hệ thống giữa dữ liệu khuyết và các giá trị đã quan sát. Ví dụ: Thiếu dữ liệu ozone khi nhiệt độ cao.

Làm sạch dữ liệu trong R

Các kiểu tính khuyết

Thiếu không ngẫu nhiên: Có quan hệ hệ thống giữa dữ liệu khuyết và các giá trị không quan sát được. Ví dụ: thiếu nhiệt độ khi nhiệt độ cao.

Làm sạch dữ liệu trong R

Xử lý dữ liệu khuyết

Cách đơn giản:

  1. Loại bỏ dữ liệu khuyết
  2. Điền (impute) bằng thống kê (mean, median, mode..) hoặc kiến thức miền

Cách nâng cao:

  1. Điền bằng phương pháp thuật toán
  2. Điền bằng mô hình học máy

 

Tìm hiểu thêm trong Dealing with Missing Data in R

Làm sạch dữ liệu trong R

Loại bỏ giá trị khuyết

airquality %>%
  filter(!is.na(Ozone), !is.na(Solar.R))
   Ozone Solar.R  Wind  Temp Month   Day
   <int>   <int> <dbl> <int> <int> <int>
 1    41     190   7.4    67     5     1
 2    36     118     8    72     5     2
 3    12     149  12.6    74     5     3
 4    18     313  11.5    62     5     4
 5    23     299   8.6    65     5     7
 6    19      99  13.8    59     5     8
Làm sạch dữ liệu trong R

Thay thế giá trị khuyết

airquality %>%
  mutate(ozone_filled = ifelse(is.na(Ozone), mean(Ozone, na.rm = TRUE), Ozone))
   Ozone Solar.R  Wind  Temp Month   Day ozone_filled
   <int>   <int> <dbl> <int> <int> <int>        <dbl>
 1    41     190   7.4    67     5     1         41  
 2    36     118   8      72     5     2         36  
 3    12     149  12.6    74     5     3         12  
 4    18     313  11.5    62     5     4         18  
 5    NA      NA  14.3    56     5     5         42.1
Làm sạch dữ liệu trong R

Ayo berlatih!

Làm sạch dữ liệu trong R

Preparing Video For Download...