logo xDuLieu.com

Trang trướcChuẩn bị & Biên tập dữ liệuTrang sau

Khái quát

 

Trong nhiều trường hợp thực tế, dữ liệu thu được từ nhiều nguồn khác nhau, được tạo ra vì các mục đích khác nhau, có cách sắp xếp khác nhau. Ta có thể có một bản tổng hợp tình hình bán hàng trong một quý, nhưng cũng có thể là một trăm bản ghi nhận hàng xuất kho trong một trăm ngày. Đơn vị trọng lượng của bảng này là kg nhưng của bảng kia là tấn. Ta cần phải tổng hợp các dữ liệu này thành một hay một số bảng dữ liệu đáp ứng được các yếu cầu của xử lý dữ liệu.

Thông thường, công việc chuẩn bị dữ liệu này tương đối phức tạp, rối rắm, đòi hỏi nhiều thời gian, công sức. Các khảo sát cho biết thời gian chuẩn bị dữ liệu thường chiếm trên 50% tổng thời gian của quá trình xử lý dữ liệu, trong một số trường hợp, con số này có thể đến 80%. Làm tốt công việc chuẩn bị này có thể giảm bớt đáng kể chi phí về nguồn lực và thời gian.

Do tầm quan trọng của giai đoạn này, người ta đã có nhiều công trình để bàn luận về nó. Thậm chí chỉ một vấn đề "xử lý dữ liệu bị thiếu" đã là nội dung của một số tập sách chuyên khảo. Do đó, trong phần này, chúng ta chỉ có thể xem xét một số vấn đề cơ bản, thường gặp.


Thiếu dữ liệu

 

Dữ liệu bị thiếu là một hiện tượng khá phổ biến. Sự thiếu sót này có thể có nhiều nguyên nhân như do thất lạc, do thiết bị đo lường hay theo dõi bị hỏng hóc, do câu hỏi trong bản thăm dò đụng chạm đến vấn đề nhạy cảm nên không có câu trả lời, hay do lỗi khi tính toán (chia cho 0 chẳng hạn).

Do việc thiếu dữ liệu khá thường gặp nên phần lớn các phần mềm đều cung cấp cho ta các phương tiện để phát hiện và xử lý.

Phát hiện dữ liệu thiếu

Để phát hiện dữ liệu bị thiếu, R có hai lệnh thường dùng là is.nacomplete.cases. Xét một bảng dữ liệu bdl có 3 biến b1, b2, b3 và 5 phần tử như trên Bảng 1.

Bảng 1 Bảng dữ liệu
b1 b2 b3
2 15 c
5 18 a
NA 22 NA
4 14 NA
6 11 e
  • Kết quả của lệnh is.na(x) là một vectơ kích cỡ giống như x, các phần tử có giá trị TRUE nếu giá trị tương ứng bị thiếu và FALSE nếu dữ liệu không bị thiếu. Thí dụ:

    > is.na(bdl$b3)
    [1] FALSE FALSE TRUE TRUE FALSE

  • complete.cases dùng để kiểm tra các phần tử của bảng dữ liệu có bị thiếu giá trị hay không. Nếu bị thiếu kết quả là FALSE, nếu đầy đủ, kết quả là TRUE. Thí dụ:

    > complete.cases(bdl)
    [1] TRUE TRUE FALSE FALSE TRUE

Ngoài ra, vì R xem TRUE có giá trị 1 và FALSE có giá trị 0, nên ta có thể phối hợp với các lệnh summean để tìm hiểu chi tiết hơn về số lượng hay tỷ lệ dữ liệu bị thiếu. Thí dụ:

> sum(is.na(bdl$b1))
[1] 1
> mean(complete.cases(bdl))
[1] 0.6

Kết quả của lệnh thứ hai cho ta biết có 60% số phần tử của bdl có đầy đủ giá trị.


Xử lý dữ liệu thiếu

Để có thể xử lý dữ liệu thiếu một cách hiệu quả, ta cần khảo sát dữ liệu thiếu, tìm hiểu tính quy luật của các dữ liệu thiếu, đánh giá tác động của chúng đến dữ liệu. Nhìn chung, có các hướng giải quyết chính sau:

  • Loại bỏ : tùy tình hình cụ thể, ta có thể loại bỏ phần tử thiếu khỏi bảng dữ liệu (chế độ mặc định của nhiều phần mềm), hay chỉ bỏ qua không xử lý số liệu thiếu trong một số phép phân tích. Trong R, cách thứ hai có thể được thực hiện một cách dễ dàng bằng dùng lệnh na.omit trước khi phân tích, hoặc đơn giản hơn nữa đặt đối số na.rm = TRUE vào trong lệnh phân tích.
  • Thay thế (imputation) : thay thế giá trị thiếu bằng một giá trị phù hợp. Nếu biến có kiểu định danh, ta có thể thay bằng một giá trị khác như "thieu" hay "missing". Nếu biến có kiểu số, ta có thể thay bằng trị trung bình, trung vị hay giá trị tính từ phương trình hồi quy. Trong R có một số phụ kiện như mi (multiple imputation), mice (multivariat imputation by chained equations), VIM (visualization and imputation of missing values) sử dụng các thuật toán chuyên biệt để thay thế giá trị thiếu bằng giá trị phù hợp.
  • Khi một biến có tương đối nhiều dữ liệu thiếu mà ta không muốn loại bỏ biến ấy, ta có thể chuyển đối loại biến rồi sau đó thay thế dữ liệu thiếu bằng giá trị phù hợp.

Giá trị ngoại lệch

 

Giá trị ngoại lệch (outlier) là các giá trị có sự khác biệt đáng kể với các giá trị còn lại. Đó có thể do sai sót trong quá trình thu thập số liệu, nhưng đó cũng là giá trị (đúng) của một vài phần tử cá biệt trong tổng thể hay mẫu. Nếu không được xử lý thích hợp, giá trị ngoại lệch có thể ảnh hưởng đáng kể đến kết quả.

Để phát hiện giá trị ngoại lệch, ta có thể sử dụng phụ kiện mvoutlier của R. Phụ kiện này có một số lệnh có thể sử dụng để xử lý trường hợp này. Trong thí dụ dưới đây, ta sử dụng lệnh uni.plot để xem xét dữ liệu USCereal trong phụ kiện MASS. Với mục đích minh họa, ta chỉ phân tích một phần dữ liệu nói trên để kết quả xuất ra dễ quan sát hơn. Các lệnh sử dụng là:

library(mvoutlier)
library(MASS)
data("USCereal")
uc <- USCereal[1:15, 2:5]
uni.plot(uc)

Với đoạn lệnh trên, ta chỉ xem xét 15 sản phẩm ngũ cốc đầu tiên với 4 biến trong dữ liệu USCereal. Kết quả thu được gồm bảng kết quả dưới đây và biểu đồ ở Hình 1.

> uni.plot(uc)
$outliers
                100% Bran                  All-Bran All-Bran with Extra Fiber 
                     TRUE                      TRUE                      TRUE 
  Apple Cinnamon Cheerios               Apple Jacks                   Basic 4 
                    FALSE                     FALSE                     FALSE 
                Bran Chex               Bran Flakes              Cap'n'Crunch 
                    FALSE                     FALSE                     FALSE 
                 Cheerios     Cinnamon Toast Crunch                  Clusters 
                     TRUE                     FALSE                     FALSE 
              Cocoa Puffs                 Corn Chex               Corn Flakes 
                    FALSE                     FALSE                     FALSE 

$md
                100% Bran                  All-Bran All-Bran with Extra Fiber 
                8.7668936                 8.0685376                10.2666362 
  Apple Cinnamon Cheerios               Apple Jacks                   Basic 4 
                1.0986514                 1.2403105                 0.5366104 
                Bran Chex               Bran Flakes              Cap'n'Crunch 
                0.6736949                 0.9683708                 3.1396236 
                 Cheerios     Cinnamon Toast Crunch                  Clusters 
                9.6729360                 1.2464584                 1.2250663 
              Cocoa Puffs                 Corn Chex               Corn Flakes 
                0.7675918                 1.0459377                 0.8126683 

Trong phần "$outliers" của bảng kết quả trên, ta thấy có 4 sản phẩm được cho là có giá trị ngoại lệch. Kết luận này dựa trên khoảng cách Mahalannobis (Mahalanobis distance) của các sản phẩm ấy được trình bày trong phần "$md".

Hình 1 Kết quả phân tích giá trị ngoại lệch

Xử lý giá trị ngoại lệch cũng gần tương tự như xử lý các dữ liệu thiếu, nghĩa là:

  • nếu do sai sót khi thu thập thì ta có thể loại bỏ hay thay bằng dữ liệu phù hợp,
  • nếu do phần tử cá biệt thì tùy trường hợp, ta có thể loại bỏ hay tách ra rồi xử lý riêng,

Sắp xếp lại dữ liệu

 

Trong phần này, chúng ta khảo sát việc sắp xếp lại dữ liệu bằng phụ kiện reshape2, một công cụ rất mạnh để thực hiện công việc này. Hai lệnh chính của reshape2 là meltcast.

melt và bảng dữ liệu dạng dài

Xét một bảng ghi nhận hàng bán ra trong hai ngày 1 và 2, cho hai khách hàng A và B, với 2 sản phẩm SP1 và SP2 như ở Bảng 2 (bảng dữ liệu dlhb)

Bảng 2 Bảng ghi nhận hàng bán
KH Ngay SP1 SP2
A 1 14 5
A 2 16 4
B 1 11 3
B 2 12 6

Nếu ta sử dụng lệnh melt cho bảng dữ liệu trên thì thu được kết quả như sau:

> library(reshape2)
> melt(dlbh) Using KH as id variables KH variable value 1 A Ngay 1 2 A Ngay 2 3 B Ngay 1 4 B Ngay 2 5 A SP1 14 6 A SP1 16 7 B SP1 11 8 B SP1 12 9 A SP2 5 10 A SP2 4 11 B SP2 3 12 B SP2 6

Ta có một số nhận xét sau :

  • Cột đầu tiên chứa biến KH, cũng được gọi là biến id,
  • Cột thứ hai chứa tên biến của 3 biến còn lại,
  • Cột thứ ba chứa giá trị của biến tương ứng với tên biến ở cột 2 và biến id ở cột đầu tiên.
  • Bảng có cấu trúc "id - biến - giá trị" và được gọi là bảng dạng dài.

Trong bảng dạng dài trên, sở dĩ biến KH là biến id vì ta không khai báo gì trong lệnh melt, nên theo mặc định, cột đầu tiên được chọn là biến id. Nếu ta chọn hai biến KH và Ngay làm biến id thì kết quả như sau:

> bhm <- melt(dlbh, id = c("KH", "Ngay"))
> bhm KH Ngay variable value 1 A 1 SP1 14 2 A 2 SP1 16 3 B 1 SP1 11 4 B 2 SP1 12 5 A 1 SP2 5 6 A 2 SP2 4 7 B 1 SP2 3 8 B 2 SP2 6

Sắp xếp lại bằng cast

Để tạo bảng dữ liệu mới, ta sử dụng lệnh dcast với cú pháp sau:

du_lieu_moi <- dcast(du_lieu_melt, formula, fun.aggregate)

trong đó :

  • du_lieu_melt : dữ liệu ở dạng dài, thu được từ lệnh melt,
  • formula : có dạng :
      bien_dong_1 + bien_dong_2 + . . . ~ bien_cot_1 + bien_cot_2 + . . .
    trong đó các bien_dong dùng để xác định các dòng và bien_cot dùng để xác định các cột.
  • fun.aggregate là một đối số tùy chọn dùng để tạo bảng tổng hợp theo lệnh fun.aggregate như sum hay mean.

Thí dụ :

> dcast(bhm, KH+variable ~ Ngay)
  KH variable  1  2
1  A      SP1 14 16
2  A      SP2  5  4
3  B      SP1 11 12
4  B      SP2  3  6

Nhưng :

> dcast(bhm, KH ~ Ngay+variable)
  KH 1_SP1 1_SP2 2_SP1 2_SP2
1  A    14     5    16     4
2  B    11     3    12     6

Bảng tổng hợp dữ liệu với fun.aggregate là sum:

> dcast(bhm, KH ~ variable, sum)
  KH SP1 SP2
1  A  30   9
2  B  23   9

Bảng tổng hợp dữ liệu với fun.aggregate là mean :

> dcast(bhm, Ngay ~ variable, mean)
  Ngay  SP1 SP2
1    1 12.5   4
2    2 14.0   5


Trang trướcVề đầu chươngTrang sau


Trang web này được cập nhật lần cuối ngày 25/11/2018