Xử lý giá trị trống trong SPSS
Xử lý giá trị trống (missing values) trong SPSS

Tóm tắt: Bài viết hướng dẫn chi tiết cách xử lý giá trị trống (missing values) trong SPSS – một vấn đề quan trọng trong thực hành kinh tế lượng. Nội dung bao gồm nguyên nhân xuất hiện giá trị trống, phương pháp xác định và phân biệt giá trị trống ngẫu nhiên với không ngẫu nhiên, ba chiến lược xử lý chính (giữ nguyên, xóa bỏ, thay thế), so sánh Listwise deletion và Pairwise deletion, cùng với code tương đương trong Stata, R, Python.
Giới thiệu
Nội dung chính
- Giới thiệu
- Nguyên nhân xuất hiện giá trị trống
- Tại sao cần quan tâm đến giá trị trống?
- Ví dụ thực tế từ kinh tế Việt Nam
- Dữ liệu mẫu và xác định giá trị trống
- Hướng dẫn thực hành xác định giá trị trống
- Phân biệt giá trị trống ngẫu nhiên và không ngẫu nhiên
- Ba chiến lược xử lý giá trị trống
- So sánh các phương pháp xử lý
- Lưu ý quan trọng trong thực hành
- Ứng dụng trong nghiên cứu kinh tế Việt Nam
- Tổng kết
- Phụ lục: Code trên các phần mềm khác
- Tài liệu tham khảo
Trong thực hành kinh tế lượng, chất lượng dữ liệu đóng vai trò then chốt quyết định tính tin cậy của kết quả nghiên cứu. Một trong những thách thức phổ biến nhất mà các nhà nghiên cứu kinh tế phải đối mặt là vấn đề giá trị trống (missing values) trong dữ liệu.
Ví dụ trong nghiên cứu kinh tế Việt Nam, khi khảo sát thu nhập hộ gia đình, một số người có thể từ chối trả lời về mức lương do tính nhạy cảm của thông tin. Khi nghiên cứu hiệu quả giáo dục, một số học sinh có thể bỏ sót không điền thông tin về điểm số các môn học. Những tình huống này tạo ra giá trị trống và có thể ảnh hưởng nghiêm trọng đến kết quả phân tích nếu không được xử lý đúng cách.
Việc hiểu rõ bản chất của giá trị trống và áp dụng chiến lược xử lý phù hợp là kỹ năng cần thiết cho mọi nhà nghiên cứu trong lĩnh vực kinh tế lượng. SPSS cung cấp nhiều công cụ hỗ trợ xử lý vấn đề này một cách hiệu quả.
Nguyên nhân xuất hiện giá trị trống
Để xử lý giá trị trống hiệu quả, chúng ta cần hiểu rõ nguyên nhân tạo ra chúng. Giá trị trống có thể được phân loại thành hai loại chính:
Giá trị trống ngẫu nhiên
Giá trị trống ngẫu nhiên MAR (Missing at Random) xảy ra khi việc thiếu dữ liệu không có mối liên hệ có hệ thống với nội dung của câu hỏi hoặc đặc điểm của đối tượng nghiên cứu:
- Sự chú ý không đều: Người được phỏng vấn có thể không chú ý trả lời một số câu hỏi do mệt mỏi hoặc thiếu tập trung
- Thiết kế câu hỏi phức tạp: Câu hỏi quá dài, phức tạp hoặc khó hiểu khiến người trả lời bỏ qua
- Lỗi trong quá trình thu thập: Sai sót trong quá trình nhập liệu, ghi chép hoặc mã hóa dữ liệu
- Sự cố kỹ thuật: Lỗi hệ thống máy tính, mất kết nối internet trong khảo sát trực tuyến
Giá trị trống không ngẫu nhiên
Giá trị trống không ngẫu nhiên MNAR (Missing Not at Random) xảy ra khi việc thiếu dữ liệu có mối liên hệ trực tiếp với nội dung của câu hỏi hoặc đặc điểm cá nhân:
- Tính nhạy cảm của thông tin: Người được phỏng vấn từ chối trả lời các câu hỏi về thu nhập, tiền sử phạm tội, tình dục, chính trị
- Thiết kế khảo sát không hoàn chỉnh: Thiếu lựa chọn “không ý kiến”, “không biết”, “không áp dụng”
- Câu hỏi gây nhầm lẫn: Câu hỏi mơ hồ, có thể hiểu theo nhiều cách khác nhau
- Thiên kiến của đối tượng: Một nhóm cụ thể có xu hướng không trả lời một loại câu hỏi nhất định
Tại sao cần quan tâm đến giá trị trống?
Giá trị trống không chỉ đơn thuần là “dữ liệu thiếu” mà có thể gây ra những hậu quả nghiêm trọng cho chất lượng nghiên cứu:
Tác động đến kích thước mẫu
Giá trị trống làm giảm trực tiếp kích thước mẫu hiệu dụng (effective sample size), dẫn đến:
- Giảm statistical power: Khả năng phát hiện tác động thực sự bị suy giảm
- Tăng margin of error: Khoảng tin cậy rộng hơn, ước lượng kém chính xác
- Khó khái quát hóa: Mẫu nhỏ có thể không đại diện cho tổng thể
Tạo ra sai lệch trong kết quả
Đặc biệt với giá trị trống không ngẫu nhiên, kết quả có thể bị lệch (bias) một cách có hệ thống:
- Selection bias: Mẫu phân tích không còn đại diện cho tổng thể nghiên cứu
- Underestimation/Overestimation: Các thông số thống kê có thể bị ước lượng sai
- Spurious relationships: Phát hiện mối quan hệ giả tạo hoặc bỏ lỡ mối quan hệ thực sự
Ảnh hưởng đến tính chính xác của nghiên cứu
Ví dụ thực tế từ kinh tế Việt Nam
Để minh họa vấn đề giá trị trống, chúng ta sẽ sử dụng một ví dụ từ nghiên cứu hành vi tiêu dùng của người dân Việt Nam. Dữ liệu khảo sát bao gồm thông tin về thiết bị công nghệ mà người dân sở hữu và màu sắc yêu thích – những yếu tố quan trọng trong nghiên cứu thị trường và hành vi tiêu dùng.
Trong bối cảnh kinh tế số ngày càng phát triển tại Việt Nam, việc hiểu rõ về sở hữu thiết bị công nghệ và sở thích màu sắc giúp các doanh nghiệp đưa ra chiến lược marketing phù hợp và các nhà hoạch định chính sách hiểu rõ hơn về mức độ tiếp cận công nghệ của người dân.
Dữ liệu mẫu và xác định giá trị trống
Chúng ta sử dụng file dữ liệu lọc quan sát để thực hành xác định và xử lý giá trị trống.
Tải về dữ liệu mẫuBước 1: Khám phá dữ liệu ban đầu
Trước khi xử lý giá trị trống, cần xem xét tổng quan về dữ liệu và đánh giá mức độ thiếu hụt thông tin.
Hướng dẫn thực hành xác định giá trị trống
Để xác định giá trị trống trong SPSS, chúng ta sử dụng chức năng Frequencies – một công cụ đơn giản nhưng hiệu quả:
Các bước thực hiện
- Chọn Analyze → Descriptive Statistics → Frequencies
- Di chuyển tất cả các biến cần kiểm tra vào cửa sổ Variable(s)
- Nhấn OK để thực hiện
Giải thích kết quả
Sau khi thực hiện các bước trên, SPSS sẽ hiển thị bảng Statistics:
Trong bảng Statistics, dòng Missing cho biết số lượng quan sát có giá trị trống của từng biến:
- deviceowned: 6 quan sát có giá trị trống
- color: 1 quan sát có giá trị trống
Phân biệt giá trị trống ngẫu nhiên và không ngẫu nhiên
Việc xác định tính chất của giá trị trống là bước quan trọng để lựa chọn phương pháp xử lý phù hợp. SPSS cung cấp nhiều cách để đánh giá vấn đề này:
Phương pháp đánh giá định tính
1. Đánh giá theo tỷ lệ giá trị trống
Nếu chỉ có một tỷ lệ nhỏ giá trị trống (thường < 5%), khả năng cao đây là giá trị trống ngẫu nhiên. Trong ví dụ trên, biến color với tỷ lệ 1.25% có thể được coi là ngẫu nhiên.
2. Xem xét thiết kế khảo sát
Cần đánh giá lại bảng câu hỏi để xác định:
- Câu hỏi có tối nghĩa hoặc khó hiểu không?
- Câu hỏi có liên quan đến vấn đề nhạy cảm không?
- Thiết kế có buộc người trả lời chọn một trong nhiều tùy chọn không?
3. Phân tích pattern của giá trị trống
Một số câu hỏi có thể có nhiều giá trị trống hơn do thiết kế kiểu “chọn những câu trả lời phù hợp”. Trong trường hợp này, những tùy chọn ít được chọn sẽ có nhiều giá trị trống hơn.
Phương pháp đánh giá định lượng: Missing Values Analysis
SPSS cung cấp công cụ Missing Values Analysis (yêu cầu add-on) để kiểm định tính chất của giá trị trống:
Thực hiện Missing Values Analysis
- Chọn Analyze → Missing Value Analysis
- Thêm các biến cần kiểm tra vào danh sách
- Chọn EM (Expectation-Maximization) test
- Nhấn OK để thực hiện
Giải thích kết quả EM test
Kiểm định EM so sánh các quan sát có giá trị trống với các quan sát không có giá trị trống:
- p-value < 0.05: Có sự khác biệt có ý nghĩa thống kê giữa hai nhóm → Giá trị trống không ngẫu nhiên
- p-value ≥ 0.05: Không có sự khác biệt có ý nghĩa thống kê → Giá trị trống có thể là ngẫu nhiên
Ba chiến lược xử lý giá trị trống
Bất kể giá trị trống có tính chất ngẫu nhiên hay không, có ba chiến lược chính để xử lý trong thực hành kinh tế lượng:
Chiến lược 1: Giữ nguyên giá trị trống
Đây là cách tiếp cận phổ biến nhất trong thực tế, đặc biệt khi:
- Số lượng giá trị trống tương đối ít (< 5%)
- Giá trị trống có tính chất ngẫu nhiên
- Có kế hoạch tạo biến tổng hợp từ nhiều biến khác
Khi chọn chiến lược này, cần hiểu rõ cách SPSS xử lý giá trị trống thông qua hai phương pháp:
a. Listwise deletion (Complete case analysis)
Listwise deletion loại bỏ toàn bộ quan sát nếu có bất kỳ biến nào trong phân tích có giá trị trống:
- Ưu điểm: Đơn giản, dễ thực hiện, đảm bảo tính nhất quán của dữ liệu
- Nhược điểm: Có thể mất nhiều dữ liệu, giảm hiệu năng thống kê (statistical power)
- Phù hợp: Khi tỷ lệ giá trị trống thấp và có tính ngẫu nhiên
b. Pairwise deletion (Available case analysis)
Pairwise deletion chỉ loại bỏ giá trị trống trong từng phép tính cụ thể:
- Ưu điểm: Tối đa hóa việc sử dụng dữ liệu có sẵn
- Nhược điểm: Kích thước mẫu khác nhau cho các phép tính khác nhau
- Phù hợp: Khi kích thước mẫu nhỏ hoặc tỷ lệ giá trị trống cao
Cách thiết lập trong SPSS
Để chỉ định phương pháp xử lý giá trị trống trong SPSS:
Ví dụ trong lệnh Explore:
- Chọn Options → Exclude cases pairwise
- Lưu ý: GLM Multivariate chỉ hỗ trợ Listwise deletion
Chiến lược 2: Xóa bỏ quan sát có giá trị trống
Chiến lược này loại bỏ hoàn toàn các quan sát chứa giá trị trống khỏi tập dữ liệu:
Khi nào nên sử dụng:
- Kích thước mẫu lớn, có thể “chịu đựng” được việc mất dữ liệu
- Đối tượng nghiên cứu không trả lời toàn bộ khối câu hỏi quan trọng
- Giá trị trống tập trung ở một nhóm đối tượng cụ thể
Hạn chế của phương pháp:
- Giảm kích thước mẫu: Có thể làm mất năng lực thống kê (statistical power)
- Tạo bias: Nếu giá trị trống không ngẫu nhiên, mẫu còn lại có thể không đại diện
- Mất thông tin: Loại bỏ toàn bộ quan sát dù chỉ thiếu một vài thông tin
Chiến lược 3: Thay thế giá trị trống
Thay thế giá trị trống (Imputation) bằng các giá trị ước lượng là chiến lược phức tạp nhất nhưng có thể hiệu quả trong một số trường hợp:
Các phương pháp thay thế chính:
1. Mean substitution
Thay thế bằng giá trị trung bình là phương pháp đơn giản nhất:
- Ưu điểm: Đơn giản, nhanh chóng, giữ nguyên kích thước mẫu
- Nhược điểm: Giảm độ biến thiên (variance), có thể tạo bias
- Phù hợp: Tỷ lệ giá trị trống thấp, dữ liệu có phân phối chuẩn
2. Regression substitution
Thay thế bằng giá trị hồi quy sử dụng mối quan hệ với các biến khác:
- Ưu điểm: Tận dụng thông tin từ biến khác, chính xác hơn mean substitution
- Nhược điểm: Phức tạp hơn, cần giả định về mối quan hệ giữa các biến
- Phù hợp: Có mối quan hệ mạnh giữa các biến, tỷ lệ giá trị trống trung bình
3. Multiple Imputation (MI)
Phương pháp thay thế lặp là phương pháp tiên tiến nhất:
- Ưu điểm: Tính toán uncertainty, kết quả chính xác nhất
- Nhược điểm: Phức tạp, yêu cầu kiến thức chuyên sâu
- Phù hợp: Tỷ lệ giá trị trống cao, dữ liệu quan trọng
Thực hiện imputation trong SPSS
Để thực hiện thay thế giá trị trống trong SPSS:
- Chọn Transform → Replace Missing Values
- Chọn phương pháp thay thế phù hợp
- Cấu hình các tham số cần thiết
- Kiểm tra kết quả sau khi thay thế
So sánh các phương pháp xử lý
Để giúp các bạn lựa chọn phương pháp phù hợp, bảng dưới đây so sánh các đặc điểm chính:
Phương pháp | Ưu điểm | Nhược điểm | Phù hợp khi |
---|---|---|---|
Listwise Deletion | Đơn giản, nhất quán | Mất nhiều dữ liệu | Giá trị trống ít, ngẫu nhiên |
Pairwise Deletion | Tối đa hóa dữ liệu | Sample size không nhất quán | Mẫu nhỏ, nhiều giá trị trống |
Case Deletion | Dữ liệu “sạch” | Giảm sample size, bias | Mẫu lớn, trống có hệ thống |
Mean Substitution | Giữ nguyên N | Giảm variance | Ít giá trị trống, phân phối chuẩn |
Multiple Imputation | Chính xác nhất | Phức tạp | Dữ liệu quan trọng, nhiều missing |
Lưu ý quan trọng trong thực hành
Khi xử lý giá trị trống trong thực hành kinh tế lượng, cần lưu ý những điểm quan trọng sau:
Kiểm tra consistency
Báo cáo trong nghiên cứu
Khi trình bày kết quả nghiên cứu, cần:
- Báo cáo tỷ lệ giá trị trống của từng biến
- Giải thích phương pháp xử lý được sử dụng
- Thảo luận về potential bias do giá trị trống gây ra
- So sánh kết quả với/không có giá trị trống (nếu có thể)
Sensitivity analysis
Thực hiện phân tích độ nhạy để kiểm tra:
- Kết quả có thay đổi khi sử dụng phương pháp xử lý khác nhau không?
- Giá trị trống có tạo ra bias đáng kể không?
- Kết luận chính của nghiên cứu có bị ảnh hưởng không?
Ứng dụng trong nghiên cứu kinh tế Việt Nam
Vấn đề giá trị trống đặc biệt quan trọng trong bối cảnh nghiên cứu kinh tế Việt Nam:
Nghiên cứu thu nhập hộ gia đình
Trong khảo sát về thu nhập, nhiều hộ gia đình không muốn tiết lộ thông tin thật về mức lương, tạo ra giá trị trống không ngẫu nhiên. Cần:
- Thiết kế câu hỏi nhạy cảm một cách khéo léo
- Sử dụng phương pháp thay thế phù hợp
- Kiểm tra bias trong ước lượng thu nhập trung bình
Nghiên cứu giáo dục
Dữ liệu điểm số học sinh thường có giá trị trống do học sinh vắng mặt hoặc không tham gia kỳ thi. Cần xem xét:
- Tính ngẫu nhiên của việc vắng mặt
- Tác động lên việc đánh giá hiệu quả giáo dục
- Chiến lược xử lý phù hợp với chính sách giáo dục
Tổng kết
Xử lý giá trị trống là một kỹ năng quan trọng trong thực hành kinh tế lượng. Việc lựa chọn phương pháp xử lý phù hợp phụ thuộc vào nhiều yếu tố: tính chất của giá trị trống, kích thước mẫu, mục tiêu nghiên cứu, và tài nguyên có sẵn.
Không có một phương pháp nào hoàn hảo cho mọi tình huống. Điều quan trọng là hiểu rõ ưu nhược điểm của từng phương pháp, đánh giá cẩn thận đặc điểm của dữ liệu, và lựa chọn chiến lược phù hợp nhất với bối cảnh nghiên cứu cụ thể.
Trong nhiều trường hợp, việc kết hợp nhiều phương pháp và thực hiện phân tích độ nhạy (sensitivity analysis) sẽ giúp đảm bảo tính vững (robust) của kết quả nghiên cứu.
Key Points:
- Giá trị trống có thể ngẫu nhiên (MAR) hoặc không ngẫu nhiên (MNAR), cần phân biệt để xử lý phù hợp
- Giá trị trống ảnh hưởng đến kích thước mẫu, tạo bias và giảm tính chính xác của nghiên cứu
- Có ba chiến lược chính: giữ nguyên (listwise/pairwise deletion), xóa bỏ và thay thế (imputation)
- Listwise deletion phù hợp với ít giá trị trống, pairwise deletion phù hợp với mẫu nhỏ
- Multiple Imputation là phương pháp tiên tiến nhất nhưng phức tạp hơn
- Cần báo cáo minh bạch về phương pháp xử lý và thực hiện sensitivity analysis
- Trong bối cảnh Việt Nam, cần chú ý đặc biệt đến giá trị trống trong câu hỏi nhạy cảm
Phụ lục: Code trên các phần mềm khác
SPSS Syntax
SPSS Syntax (.sps)
* Xử lý giá trị trống (Missing Values) bằng SPSS Syntax
* Tác giả: Thực hành kinh tế lượng
* Dữ liệu: loc-quan-sat.sav
* Mở file dữ liệu
GET FILE='/data/loc-quan-sat.sav'.
* Kiểm tra giá trị trống bằng Frequencies
FREQUENCIES VARIABLES=deviceowned color
/FORMAT=NOTABLE
/STATISTICS=STDDEV VARIANCE RANGE MINIMUM MAXIMUM MEAN MEDIAN MODE
/ORDER=ANALYSIS.
* Phân tích pattern của giá trị trống
MISSING VALUES ANALYSIS VARIABLES=deviceowned color
/MISSING MTYPE=MCAR
/EM.
* Xử lý giá trị trống: Listwise deletion
FREQUENCIES VARIABLES=deviceowned color
/MISSING=EXCLUDE.
* Xử lý giá trị trống: Pairwise deletion
CORRELATIONS /VARIABLES=deviceowned color
/MISSING=PAIRWISE.
* Thay thế giá trị trống bằng mean substitution
TRANSFORM
/REPLACE MISSING VALUES=deviceowned(MEAN)
/REPLACE MISSING VALUES=color(MEAN).
* Thay thế giá trị trống bằng regression substitution
TRANSFORM
/REPLACE MISSING VALUES=deviceowned(REGRESSION)
/REPLACE MISSING VALUES=color(REGRESSION).
* Lưu dataset sau khi xử lý
SAVE OUTFILE='/data/loc-quan-sat-processed.sav'.
Stata
Code Stata
// Xử lý giá trị trống (Missing Values) bằng Stata
// Tác giả: Thực hành kinh tế lượng
// Dữ liệu: loc-quan-sat.dta
* Mở dữ liệu
use "loc-quan-sat.dta", clear
* Kiểm tra giá trị trống
describe deviceowned color
summarize deviceowned color
* Tạo bảng missing values
misstable summarize deviceowned color
* Tạo pattern table cho missing values
misstable patterns deviceowned color
* Kiểm định MCAR (Missing Completely at Random)
// Cài đặt package nếu chưa có
// ssc install mcartest
mcartest deviceowned color
* Xử lý giá trị trống: Listwise deletion
* Tạo biến indicator cho complete cases
egen complete_case = rowmiss(deviceowned color)
replace complete_case = (complete_case == 0)
* Phân tích chỉ trên complete cases
summarize deviceowned color if complete_case == 1
* Xử lý giá trị trống: Pairwise deletion
pwcorr deviceowned color, obs
* Thay thế giá trị trống bằng mean substitution
foreach var in deviceowned color {
summarize `var'
replace `var' = r(mean) if missing(`var')
}
* Thay thế giá trị trống bằng regression substitution
* Ví dụ: dự đoán deviceowned dựa trên color
regress deviceowned color
predict deviceowned_pred if missing(deviceowned)
replace deviceowned = deviceowned_pred if missing(deviceowned)
* Multiple Imputation
// Cài đặt package nếu chưa có
// ssc install ice
ice deviceowned color, m(5) seed(12345)
* Lưu dataset
save "loc-quan-sat-processed.dta", replace
R
Code R
# Xử lý giá trị trống (Missing Values) bằng R
# Tác giả: Thực hành kinh tế lượng
# Dữ liệu: loc-quan-sat.csv
# Cài đặt và load các package cần thiết
packages <- c("VIM", "mice", "Hmisc", "dplyr", "naniar", "ggplot2")
for (pkg in packages) {
if (!require(pkg, character.only = TRUE)) {
install.packages(pkg)
library(pkg, character.only = TRUE)
}
}
# Đọc dữ liệu
data <- read.csv("loc-quan-sat.csv")
# Kiểm tra cấu trúc dữ liệu
str(data)
head(data)
# Kiểm tra giá trị trống
sapply(data, function(x) sum(is.na(x)))
summary(data)
# Tạo pattern table cho missing values
md.pattern(data[c("deviceowned", "color")])
# Visualize missing data pattern
library(VIM)
aggr_plot <- aggr(data[c("deviceowned", "color")],
col = c('navyblue', 'red'),
numbers = TRUE,
sortVars = TRUE,
labels = names(data[c("deviceowned", "color")]),
cex.axis = .7,
gap = 3,
ylab = c("Histogram of missing data", "Pattern"))
# Kiểm định MCAR bằng Little's test
library(naniar)
# Lưu ý: Little's test yêu cầu dữ liệu numeric
data_numeric <- data[c("deviceowned", "color")]
data_numeric$deviceowned <- as.numeric(data_numeric$deviceowned)
data_numeric$color <- as.numeric(data_numeric$color)
# Thực hiện Little's test (cần package BaylorEdPsych)
if (!require(BaylorEdPsych)) {
install.packages("BaylorEdPsych")
library(BaylorEdPsych)
}
LittleMCAR(data_numeric)
# Xử lý giá trị trống: Complete case analysis (Listwise deletion)
data_complete <- na.omit(data[c("deviceowned", "color")])
nrow(data_complete)
# Thống kê mô tả cho complete cases
summary(data_complete)
# Xử lý giá trị trống: Pairwise deletion
cor(data[c("deviceowned", "color")], use = "pairwise.complete.obs")
# Thay thế giá trị trống bằng mean substitution
data_mean_imputed <- data
for (col in c("deviceowned", "color")) {
data_mean_imputed[[col]][is.na(data_mean_imputed[[col]])] <-
mean(data_mean_imputed[[col]], na.rm = TRUE)
}
# Thay thế giá trị trống bằng regression substitution
library(Hmisc)
data_reg_imputed <- data
for (col in c("deviceowned", "color")) {
data_reg_imputed[[col]] <- impute(data_reg_imputed[[col]], "random")
}
# Multiple Imputation bằng package mice
library(mice)
# Tạo 5 imputed datasets
imputed_data <- mice(data[c("deviceowned", "color")], m = 5, seed = 12345)
# Kiểm tra kết quả imputation
print(imputed_data)
# Thực hiện phân tích trên imputed data
fit <- with(imputed_data, lm(deviceowned ~ color))
pooled_results <- pool(fit)
summary(pooled_results)
# So sánh kết quả trước và sau imputation
print("Trước khi xử lý missing values:")
summary(data[c("deviceowned", "color")])
print("Sau khi mean imputation:")
summary(data_mean_imputed[c("deviceowned", "color")])
print("Sau khi multiple imputation:")
summary(complete(imputed_data, 1))
# Visualize kết quả imputation
densityplot(imputed_data)
stripplot(imputed_data, pch = 20, cex = 1.2)
# Lưu kết quả
write.csv(data_mean_imputed, "loc-quan-sat-mean-imputed.csv", row.names = FALSE)
write.csv(complete(imputed_data, 1), "loc-quan-sat-mi-imputed.csv", row.names = FALSE)
Python
Code Python
# Xử lý giá trị trống (Missing Values) bằng Python
# Tác giả: Thực hành kinh tế lượng
# Dữ liệu: loc-quan-sat.csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.impute import SimpleImputer, KNNImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
import warnings
warnings.filterwarnings('ignore')
# Đọc dữ liệu
data = pd.read_csv('loc-quan-sat.csv')
# Kiểm tra thông tin cơ bản
print("Thông tin dữ liệu:")
print(data.info())
print("\nThống kê mô tả:")
print(data.describe())
# Kiểm tra giá trị trống
print("\nSố lượng giá trị trống:")
print(data[['deviceowned', 'color']].isnull().sum())
print("\nTỷ lệ giá trị trống:")
print(data[['deviceowned', 'color']].isnull().sum() / len(data) * 100)
# Tạo pattern table cho missing values
def missing_pattern(df):
"""Tạo bảng pattern cho missing values"""
missing_data = df.isnull()
patterns = missing_data.value_counts()
return patterns
print("\nPattern của missing values:")
print(missing_pattern(data[['deviceowned', 'color']]))
# Visualize missing data
plt.figure(figsize=(12, 8))
# Heatmap của missing values
plt.subplot(2, 2, 1)
sns.heatmap(data[['deviceowned', 'color']].isnull(),
yticklabels=False, cbar=True, cmap='viridis')
plt.title('Heatmap của Missing Values')
# Bar plot của missing values
plt.subplot(2, 2, 2)
missing_counts = data[['deviceowned', 'color']].isnull().sum()
missing_counts.plot(kind='bar')
plt.title('Số lượng Missing Values theo biến')
plt.xticks(rotation=45)
# Missing values pattern
plt.subplot(2, 2, 3)
patterns = missing_pattern(data[['deviceowned', 'color']])
patterns.plot(kind='bar')
plt.title('Pattern của Missing Values')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Kiểm định MCAR bằng Little's test (cần package impyute)
try:
from impyute.diagnostics import mcar_test
result = mcar_test(data[['deviceowned', 'color']].values)
print(f"\nLittle's MCAR test p-value: {result}")
if result < 0.05: print("Bác bỏ H0: Dữ liệu không MCAR") else: print("Chấp nhận H0: Dữ liệu có thể MCAR") except ImportError: print("Package impyute chưa được cài đặt") # Phương pháp 1: Complete case analysis (Listwise deletion) data_complete = data[['deviceowned', 'color']].dropna() print(f"\nSố quan sát sau listwise deletion: {len(data_complete)}") print("Thống kê mô tả sau listwise deletion:") print(data_complete.describe()) # Phương pháp 2: Pairwise deletion print("\nTương quan với pairwise deletion:") correlation_pairwise = data[['deviceowned', 'color']].corr() print(correlation_pairwise) # Phương pháp 3: Mean substitution imputer_mean = SimpleImputer(strategy='mean') data_mean_imputed = data[['deviceowned', 'color']].copy() data_mean_imputed_values = imputer_mean.fit_transform(data_mean_imputed) data_mean_imputed = pd.DataFrame(data_mean_imputed_values, columns=['deviceowned', 'color']) print("\nThống kê mô tả sau mean imputation:") print(data_mean_imputed.describe()) # Phương pháp 4: Median substitution imputer_median = SimpleImputer(strategy='median') data_median_imputed = data[['deviceowned', 'color']].copy() data_median_imputed_values = imputer_median.fit_transform(data_median_imputed) data_median_imputed = pd.DataFrame(data_median_imputed_values, columns=['deviceowned', 'color']) # Phương pháp 5: KNN Imputation imputer_knn = KNNImputer(n_neighbors=5) data_knn_imputed = data[['deviceowned', 'color']].copy() data_knn_imputed_values = imputer_knn.fit_transform(data_knn_imputed) data_knn_imputed = pd.DataFrame(data_knn_imputed_values, columns=['deviceowned', 'color']) # Phương pháp 6: Iterative Imputation (MICE equivalent) imputer_iterative = IterativeImputer(random_state=42) data_iterative_imputed = data[['deviceowned', 'color']].copy() data_iterative_imputed_values = imputer_iterative.fit_transform(data_iterative_imputed) data_iterative_imputed = pd.DataFrame(data_iterative_imputed_values, columns=['deviceowned', 'color']) # So sánh kết quả các phương pháp print("\nSo sánh kết quả các phương pháp imputation:") print("\nDữ liệu gốc:") print(data[['deviceowned', 'color']].describe()) print("\nMean imputation:") print(data_mean_imputed.describe()) print("\nKNN imputation:") print(data_knn_imputed.describe()) print("\nIterative imputation:") print(data_iterative_imputed.describe()) # Visualize kết quả imputation plt.figure(figsize=(15, 10)) # Histogram trước và sau imputation variables = ['deviceowned', 'color'] methods = ['Original', 'Mean', 'KNN', 'Iterative'] data_methods = [data[variables], data_mean_imputed, data_knn_imputed, data_iterative_imputed] for i, var in enumerate(variables): for j, (method, df) in enumerate(zip(methods, data_methods)): plt.subplot(2, 4, i*4 + j + 1) plt.hist(df[var].dropna(), bins=20, alpha=0.7, label=method) plt.title(f'{var} - {method}') plt.xlabel(var) plt.ylabel('Frequency') plt.tight_layout() plt.show() # Đánh giá chất lượng imputation def evaluate_imputation(original, imputed, method_name): """Đánh giá chất lượng imputation""" print(f"\n--- Đánh giá {method_name} ---") for col in original.columns: if original[col].isnull().sum() > 0:
original_mean = original[col].mean()
imputed_mean = imputed[col].mean()
original_std = original[col].std()
imputed_std = imputed[col].std()
print(f"{col}:")
print(f" Mean: {original_mean:.2f} -> {imputed_mean:.2f}")
print(f" Std: {original_std:.2f} -> {imputed_std:.2f}")
evaluate_imputation(data[['deviceowned', 'color']], data_mean_imputed, "Mean Imputation")
evaluate_imputation(data[['deviceowned', 'color']], data_knn_imputed, "KNN Imputation")
evaluate_imputation(data[['deviceowned', 'color']], data_iterative_imputed, "Iterative Imputation")
# Lưu kết quả
data_mean_imputed.to_csv('loc-quan-sat-mean-imputed.csv', index=False)
data_knn_imputed.to_csv('loc-quan-sat-knn-imputed.csv', index=False)
data_iterative_imputed.to_csv('loc-quan-sat-iterative-imputed.csv', index=False)
print("\nCác file đã được lưu:")
print("- loc-quan-sat-mean-imputed.csv")
print("- loc-quan-sat-knn-imputed.csv")
print("- loc-quan-sat-iterative-imputed.csv")
Tài liệu tham khảo
- Little, R. J. A., & Rubin, D. B. (2019). Statistical Analysis with Missing Data. 3rd Edition. John Wiley & Sons.
- Schafer, J. L., & Graham, J. W. (2002). Missing data: Our view of the state of the art. Psychological Methods, 7(2), 147-177.
- Van Buuren, S. (2018). Flexible Imputation of Missing Data. 2nd Edition. CRC Press.
- Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics. 5th Edition. SAGE Publications.
- IBM Corporation. (2021). IBM SPSS Missing Values 28. IBM SPSS Documentation.
- Hoàng Trọng & Chu Nguyễn Mộng Ngọc. (2019). Phân tích dữ liệu nghiên cứu với SPSS. NXB Hồng Đức.
- Nguyễn Khánh Trung. (2020). Thực hành kinh tế lượng với phần mềm thống kê. NXB Thống kê.
- Allison, P. D. (2001). Missing Data. Sage University Papers Series on Quantitative Applications in the Social Sciences.