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.
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 bị thiếu, R có hai lệnh thường dùng là is.na và complete.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.
| b1 | b2 | b3 |
|---|---|---|
| 2 | 15 | c |
| 5 | 18 | a |
| NA | 22 | NA |
| 4 | 14 | NA |
| 6 | 11 | e |
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 sum và mean để 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ị.
Để 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:
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.
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à:
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à melt và cast.
melt và bảng dữ liệu dạng dàiXé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)
| 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 :
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
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 đó :
melt,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 web này được cập nhật lần cuối ngày 25/11/2018
Xử lý dữ liệu
Các chuyên đề
Xử lý dữ liệu
Ma trận
R