
Tóm tắt: Mã hóa và tạo biến mới (recode variables) là kỹ năng thiết yếu trong thực hành kinh tế lượng, cho phép chuyển đổi dữ liệu thô thành dạng phù hợp cho phân tích. Bài viết hướng dẫn chi tiết ba phương pháp chính: mã hóa giá trị đơn lẻ, mã hóa theo khoảng giá trị, và mã hóa thành nhóm phân loại. Các kỹ thuật này đặc biệt quan trọng khi xử lý dữ liệu kinh tế Việt Nam với các thang đo và phân loại đa dạng.
Giới thiệu về mã hóa biến trong thực hành kinh tế lượng
Nội dung chính
- Giới thiệu về mã hóa biến trong thực hành kinh tế lượng
- Phân loại các phương pháp mã hóa
- Ví dụ thực tế từ kinh tế Việt Nam
- Hướng dẫn thực hành chi tiết
- Ứng dụng trong nghiên cứu kinh tế Việt Nam
- Lưu ý quan trọng và cảnh báo
- Tối ưu hóa quy trình mã hóa
- Tổng kết
- Phụ lục – Code cho các phần mềm khác
- Tài liệu tham khảo
Trong thực hành kinh tế lượng, mã hóa biến (variable recoding) là một bước quan trọng trong quá trình chuẩn bị dữ liệu. Đây là kỹ năng cần thiết mà mọi nhà nghiên cứu kinh tế phải thành thạo.
Trong bối cảnh nghiên cứu kinh tế Việt Nam, việc mã hóa biến thường được áp dụng trong các tình huống sau:
- Chuyển đổi điểm số thành xếp loại học lực (giỏi, khá, trung bình)
- Phân loại thu nhập hộ gia đình thành các nhóm (thấp, trung bình, cao)
- Mã hóa dữ liệu khảo sát thỏa mãn khách hàng thành hai nhóm (hài lòng/không hài lòng)
- Chuyển đổi tuổi thành nhóm tuổi cho phân tích nhân khẩu học
SPSS cung cấp hai phương pháp mã hóa chính:
- Mã hóa trong cùng một biến: Thay đổi trực tiếp giá trị của biến gốc
- Mã hóa tạo biến mới: Tạo ra biến mới từ biến gốc (khuyến khích)
Lợi ích của việc tạo biến mới: Giữ nguyên dữ liệu gốc, tránh mất mát thông tin và cho phép so sánh kết quả trước/sau mã hóa.
Phân loại các phương pháp mã hóa
Trong thực hành kinh tế lượng với SPSS, có ba dạng mã hóa chính được sử dụng phổ biến:
Mã hóa giá trị đơn lẻ
Mã hóa giá trị đơn lẻ được sử dụng khi cần thay thế các giá trị cụ thể bằng giá trị mới. Phương pháp này phù hợp cho việc xếp hạng hoặc chuyển đổi mã số.Mã hóa theo khoảng giá trị
Mã hóa theo khoảng giá trị được áp dụng khi cần phân loại dữ liệu liên tục thành các nhóm rời rạc. Đây là phương pháp phổ biến trong phân tích thống kê mô tả.Mã hóa thành nhóm phân loại
Mã hóa thành nhóm phân loại thường được sử dụng để tạo biến dummy hoặc biến phân loại cho mô hình hồi quy.Ví dụ thực tế từ kinh tế Việt Nam
Để minh họa cho các phương pháp mã hóa, chúng ta sẽ sử dụng các ví dụ thực tế từ bối cảnh kinh tế Việt Nam:
Bối cảnh nghiên cứu: Một nghiên cứu về hiệu quả giáo dục tại các trường đại học Việt Nam cần phân loại sinh viên theo nhiều tiêu chí khác nhau: xếp hạng thành tích, phân loại điểm số, và mức độ hài lòng với dịch vụ giáo dục.
Hướng dẫn thực hành chi tiết
Phương pháp 1: Mã hóa các giá trị đơn lẻ
Phương pháp này được sử dụng khi cần xếp hạng hoặc chuyển đổi thứ tự của các giá trị cụ thể.
Ví dụ minh họa
Dữ liệu thể hiện số lần chạy thử nghiệm của các vận động viên (1 là nhanh nhất, 5 là chậm nhất):
Điểm các lần chạy | |||||
Điểm | 1 | 2 | 3 | 4 | 5 |
Số lần chạy | 90 | 140 | 63 | 14 | 23 |
Các bước thực hiện
Bước 1: Nhập dữ liệu
Nhập dữ liệu vào cửa sổ Data Editor và đặt tên biến là Runs:
Bước 2: Truy cập chức năng Recode
Vào menu Transform → Recode Into Different Variables…:
Bước 3: Chọn biến cần mã hóa
Chuyển biến Runs trong khung bên trái vào khung Numeric Variable → Output Variable bên phải:
Bước 4: Đặt tên cho biến mới
Trong khung Output Variable, thực hiện các thiết lập sau:
- Đặt tên biến mới: Runs_ranked
- Đặt nhãn: Xếp hạng các lần chạy
- Bấm nút Change để xác nhận
Bước 5: Thiết lập quy tắc mã hóa
Bấm nút Old and New Values… để thiết lập quy tắc chuyển đổi:
Lần lượt thực hiện mã hóa theo quy tắc:
- Giá trị 140 (cao nhất) → 1 (xếp hạng nhất)
- Giá trị 90 → 2 (xếp hạng nhì)
- Giá trị 63 → 3 (xếp hạng ba)
- Giá trị 23 → 4 (xếp hạng tư)
- Giá trị 14 (thấp nhất) → 5 (xếp hạng cuối)
Lưu ý: Sử dụng nút Add để thêm mỗi quy tắc, Change để sửa đổi, hoặc Remove để xóa quy tắc đã tạo.
Kết quả
Sau khi hoàn thành, biến mới Runs_ranked sẽ được tạo ra:
Phương pháp 2: Mã hóa theo khoảng giá trị
Phương pháp này được sử dụng để phân loại dữ liệu liên tục thành các nhóm rời rạc.
Ví dụ minh họa
Dữ liệu điểm số của 10 sinh viên cần được phân loại theo thang điểm chữ:
Điểm thi cuối kì của 10 sinh viên | |||||||||||
Điểm số | 58 | 86 | 74 | 70 | 79 | 60 | 35 | 42 | 55 | 91 |
Quy tắc phân loại theo thang điểm Việt Nam:
- Loại 1 (Giỏi): 75-100 điểm
- Loại 2 (Khá): 61-74 điểm
- Loại 3 (Trung bình): 41-60 điểm
- Loại 4 (Yếu): 0-40 điểm
Các bước thực hiện
Bước 1: Nhập dữ liệu
Nhập dữ liệu vào cửa sổ Data Editor và đặt tên biến là Scores:
Bước 2: Truy cập chức năng Recode
Vào menu Transform → Recode Into Different Variables…:
Bước 3: Thiết lập biến đầu ra
Chuyển biến Scores vào khung đầu ra và thiết lập:
- Tên biến mới: Scores_ranges
- Nhãn: Khoảng điểm
- Bấm Change để xác nhận
Bước 4: Thiết lập quy tắc khoảng giá trị
Bấm Old and New Values… và thiết lập các khoảng:
Thiết lập theo thứ tự:
- Range: 75 through 100 → New Value: 1
- Range: 61 through 74 → New Value: 2
- Range: 41 through 60 → New Value: 3
- Range: 0 through 40 → New Value: 4
Lưu ý quan trọng: Sử dụng tùy chọn Range – through để thiết lập khoảng giá trị. Đảm bảo các khoảng không bị trùng lặp hoặc bỏ sót.
Kết quả
Sau khi hoàn thành, dữ liệu sẽ được phân loại theo khoảng điểm:
Phương pháp 3: Mã hóa thành 2 nhóm phân loại
Phương pháp này tạo ra biến phân loại nhị phân, thường được sử dụng trong phân tích hồi quy logistic.
Ví dụ minh họa
Dữ liệu đánh giá mức độ thỏa mãn dịch vụ (thang điểm 10) cần được phân loại thành hai nhóm:
Mức độ thỏa mãn về một dịch vụ mới | |||||||||||||
Điểm số | 3 | 6 | 8 | 9 | 7 | 2 | 10 | 6 | 4 | 8 | 9 | 3 |
Quy tắc phân loại:
- Hài lòng: Điểm từ 6 trở lên
- Không hài lòng: Điểm từ 5 trở xuống
Các bước thực hiện
Bước 1: Nhập dữ liệu
Nhập dữ liệu vào cửa sổ Data Editor và đặt tên biến là Ratings:
Bước 2: Truy cập chức năng Recode
Vào menu Transform → Recode Into Different Variables…:
Bước 3: Thiết lập biến đầu ra
Chuyển biến Ratings vào khung đầu ra và thiết lập:
- Tên biến mới: Ratings2group
- Nhãn: Thỏa mãn?
- Bấm Change để xác nhận
Bước 4: Thiết lập quy tắc phân loại
Bấm Old and New Values… và thiết lập hai nhóm:
Nhóm 1: Không thỏa mãn (điểm ≤ 5)
Nhóm 2: Thỏa mãn (điểm ≥ 6)
Thiết lập cụ thể:
- Lowest through value: 5 → New Value: “Không thỏa mãn”
- Value through Highest: 6 → New Value: “Thỏa mãn”
Quan trọng: Đánh dấu chọn ô Output variables are strings để biến mới có dạng chuỗi (string) thay vì số.
Kết quả
Sau khi hoàn thành, dữ liệu sẽ được phân loại thành hai nhóm:
Ứng dụng trong nghiên cứu kinh tế Việt Nam
Nghiên cứu thu nhập hộ gia đình
Trong khảo sát thu nhập hộ gia đình, việc mã hóa biến thường được áp dụng để:
- Phân loại thu nhập thành các nhóm (nghèo, trung bình, giàu)
- Mã hóa trình độ học vấn thành các bậc học
- Chuyển đổi khu vực sinh sống thành nhóm (thành thị/nông thôn)
- Phân loại nghề nghiệp theo các ngành kinh tế
Nghiên cứu thị trường
Trong nghiên cứu thị trường và hành vi tiêu dùng:
- Mã hóa mức độ hài lòng khách hàng thành các nhóm
- Phân loại độ tuổi khách hàng theo nhóm mục tiêu
- Chuyển đổi tần suất mua hàng thành nhóm khách hàng
- Mã hóa thu nhập thành phân khúc thị trường
Nghiên cứu giáo dục
Trong lĩnh vực giáo dục:
- Chuyển đổi điểm số thành xếp loại học lực
- Mã hóa kết quả thi thành nhóm đậu/rớt
- Phân loại trường học theo công/tư, vùng miền
- Mã hóa phương pháp giảng dạy thành các nhóm
Lưu ý quan trọng và cảnh báo
Nguyên tắc thực hành tốt
Các nguyên tắc cần tuân thủ:
- Luôn tạo biến mới thay vì mã hóa trực tiếp trên biến gốc
- Đặt tên biến có ý nghĩa và dễ hiểu
- Sử dụng nhãn biến (variable labels) mô tả rõ ràng
- Kiểm tra kết quả sau khi mã hóa
Các lỗi thường gặp
Những lỗi cần tránh:
- Quên thiết lập các khoảng giá trị liên tiếp
- Không kiểm tra giá trị missing sau khi mã hóa
- Mã hóa trực tiếp trên biến gốc làm mất dữ liệu
- Không đặt nhãn cho các giá trị mới
Kiểm tra chất lượng sau mã hóa
Các bước kiểm tra cần thiết:
- Sử dụng Frequencies để kiểm tra phân bố giá trị mới
- So sánh với dữ liệu gốc để đảm bảo tính chính xác
- Kiểm tra các giá trị missing bất thường
- Xác minh logic mã hóa với một vài trường hợp cụ thể
Tối ưu hóa quy trình mã hóa
Sử dụng Value Labels
Sau khi mã hóa, nên thiết lập nhãn giá trị để dễ dàng diễn giải:
- Vào Variable View trong Data Editor
- Chọn biến vừa tạo và bấm vào cột Values
- Thiết lập nhãn cho từng giá trị số
- Áp dụng để hiển thị nhãn thay vì số
Lưu trữ syntax cho tái sử dụng
SPSS tự động tạo syntax cho mỗi thao tác mã hóa. Các bạn nên:
- Sao chép syntax từ Output Navigator
- Lưu thành file .sps để tái sử dụng
- Chỉnh sửa syntax cho phù hợp với dữ liệu mới
- Sử dụng syntax để đảm bảo tính nhất quán
Tổng kết
Mã hóa và tạo biến mới là kỹ năng cốt lõi trong thực hành kinh tế lượng với SPSS. Việc thành thạo ba phương pháp chính – mã hóa giá trị đơn lẻ, mã hóa theo khoảng, và mã hóa thành nhóm phân loại – sẽ giúp các bạn:
Lợi ích chính:
- Chuẩn bị dữ liệu hiệu quả cho các phân tích thống kê
- Tạo ra các biến phù hợp với mô hình nghiên cứu
- Đảm bảo tính chính xác và nhất quán trong xử lý dữ liệu
- Tối ưu hóa quy trình phân tích dữ liệu
Trong bối cảnh nghiên cứu kinh tế Việt Nam, việc áp dụng đúng các kỹ thuật mã hóa sẽ giúp tạo ra những phân tích chất lượng cao, phù hợp với đặc thù kinh tế – xã hội của nước ta.
Key Points:
- Mã hóa biến có ba phương pháp chính: giá trị đơn lẻ, khoảng giá trị, và nhóm phân loại
- Luôn tạo biến mới thay vì mã hóa trực tiếp trên biến gốc
- Sử dụng “Recode Into Different Variables” để đảm bảo an toàn dữ liệu
- Kiểm tra kết quả mã hóa bằng bảng tần suất
- Thiết lập nhãn biến và nhãn giá trị để dễ dàng diễn giải
- Lưu trữ syntax để tái sử dụng và đảm bảo tính nhất quán
Phụ lục – Code cho các phần mềm khác
SPSS Syntax
SPSS Syntax (.sps)
* Mã hóa và tạo biến mới trong SPSS Syntax
* Tác giả: Thực hành kinh tế lượng
* Mục đích: Hướng dẫn các phương pháp mã hóa biến
* Mở file dữ liệu
* GET FILE='data.sav'.
* Phương pháp 1: Mã hóa giá trị đơn lẻ
* Tạo biến xếp hạng từ số lần chạy
RECODE Runs (90=2) (140=1) (63=3) (14=5) (23=4) INTO Runs_ranked.
VARIABLE LABELS Runs_ranked 'Xếp hạng các lần chạy'.
VALUE LABELS Runs_ranked
1 'Hạng nhất'
2 'Hạng nhì'
3 'Hạng ba'
4 'Hạng tư'
5 'Hạng năm'.
EXECUTE.
* Phương pháp 2: Mã hóa theo khoảng giá trị
* Phân loại điểm số thành các nhóm
RECODE Scores (75 thru 100=1) (61 thru 74=2) (41 thru 60=3) (0 thru 40=4) INTO Scores_ranges.
VARIABLE LABELS Scores_ranges 'Khoảng điểm'.
VALUE LABELS Scores_ranges
1 'Giỏi (75-100)'
2 'Khá (61-74)'
3 'Trung bình (41-60)'
4 'Yếu (0-40)'.
EXECUTE.
* Phương pháp 3: Mã hóa thành 2 nhóm phân loại
* Tạo biến nhị phân từ đánh giá thỏa mãn
RECODE Ratings (LOWEST thru 5='Không thỏa mãn') (6 thru HIGHEST='Thỏa mãn') INTO Ratings2group.
VARIABLE LABELS Ratings2group 'Mức độ thỏa mãn'.
EXECUTE.
* Kiểm tra kết quả mã hóa
FREQUENCIES VARIABLES=Runs_ranked Scores_ranges Ratings2group.
* Tạo bảng crosstab để kiểm tra
CROSSTABS /TABLES=Runs BY Runs_ranked /CELLS=COUNT.
CROSSTABS /TABLES=Scores BY Scores_ranges /CELLS=COUNT.
CROSSTABS /TABLES=Ratings BY Ratings2group /CELLS=COUNT.
* Mã hóa nâng cao: Sử dụng IF-THEN logic
* Tạo biến phức tạp hơn
COMPUTE Performance_level = 0.
IF (Scores >= 90) Performance_level = 1.
IF (Scores >= 80 AND Scores < 90) Performance_level = 2. IF (Scores >= 70 AND Scores < 80) Performance_level = 3. IF (Scores >= 60 AND Scores < 70) Performance_level = 4.
IF (Scores < 60) Performance_level = 5.
VARIABLE LABELS Performance_level 'Mức độ thành tích'.
VALUE LABELS Performance_level
1 'Xuất sắc'
2 'Giỏi'
3 'Khá'
4 'Trung bình'
5 'Yếu'.
EXECUTE.
* Lưu file với biến mới
SAVE OUTFILE='data_recoded.sav'.
Stata
Stata (.do file)
* Mã hóa và tạo biến mới trong Stata
* Tác giả: Thực hành kinh tế lượng
* Mục đích: Hướng dẫn các phương pháp mã hóa biến
* Mở file dữ liệu
* use "data.dta", clear
* Phương pháp 1: Mã hóa giá trị đơn lẻ
* Tạo biến xếp hạng từ số lần chạy
generate Runs_ranked = .
replace Runs_ranked = 1 if Runs == 140
replace Runs_ranked = 2 if Runs == 90
replace Runs_ranked = 3 if Runs == 63
replace Runs_ranked = 4 if Runs == 23
replace Runs_ranked = 5 if Runs == 14
* Hoặc sử dụng recode command
recode Runs (90=2) (140=1) (63=3) (14=5) (23=4), gen(Runs_ranked_alt)
* Đặt nhãn biến và giá trị
label variable Runs_ranked "Xếp hạng các lần chạy"
label define rank_labels 1 "Hạng nhất" 2 "Hạng nhì" 3 "Hạng ba" 4 "Hạng tư" 5 "Hạng năm"
label values Runs_ranked rank_labels
* Phương pháp 2: Mã hóa theo khoảng giá trị
* Phân loại điểm số thành các nhóm
generate Scores_ranges = .
replace Scores_ranges = 1 if Scores >= 75 & Scores <= 100 replace Scores_ranges = 2 if Scores >= 61 & Scores <= 74 replace Scores_ranges = 3 if Scores >= 41 & Scores <= 60 replace Scores_ranges = 4 if Scores >= 0 & Scores <= 40
* Hoặc sử dụng recode với ranges
recode Scores (0/40=4) (41/60=3) (61/74=2) (75/100=1), gen(Scores_ranges_alt)
* Đặt nhãn
label variable Scores_ranges "Khoảng điểm"
label define score_labels 1 "Giỏi (75-100)" 2 "Khá (61-74)" 3 "Trung bình (41-60)" 4 "Yếu (0-40)"
label values Scores_ranges score_labels
* Phương pháp 3: Mã hóa thành 2 nhóm phân loại
* Tạo biến nhị phân từ đánh giá thỏa mãn
generate Ratings2group = ""
replace Ratings2group = "Không thỏa mãn" if Ratings <= 5 replace Ratings2group = "Thỏa mãn" if Ratings >= 6
* Hoặc tạo biến số
generate satisfaction_dummy = 0
replace satisfaction_dummy = 1 if Ratings >= 6
label variable satisfaction_dummy "Mức độ thỏa mãn"
label define satisfaction_labels 0 "Không thỏa mãn" 1 "Thỏa mãn"
label values satisfaction_dummy satisfaction_labels
* Kiểm tra kết quả mã hóa
tab Runs_ranked
tab Scores_ranges
tab Ratings2group
* Tạo bảng crosstab để kiểm tra
tab Runs Runs_ranked
tab Scores Scores_ranges
tab Ratings satisfaction_dummy
* Mã hóa nâng cao: Sử dụng egen
* Tạo percentiles
egen score_percentiles = cut(Scores), group(4)
label variable score_percentiles "Quartiles điểm số"
* Tạo z-scores
egen score_zscore = std(Scores)
label variable score_zscore "Z-score của điểm số"
* Mã hóa dựa trên điều kiện phức tạp
generate performance_category = ""
replace performance_category = "Xuất sắc" if Scores >= 90
replace performance_category = "Giỏi" if Scores >= 80 & Scores < 90 replace performance_category = "Khá" if Scores >= 70 & Scores < 80 replace performance_category = "Trung bình" if Scores >= 60 & Scores < 70
replace performance_category = "Yếu" if Scores < 60
* Lưu file với biến mới
save "data_recoded.dta", replace
* Tạo báo cáo tóm tắt
summarize Runs Runs_ranked Scores Scores_ranges Ratings satisfaction_dummy
R
R (.R script)
# Mã hóa và tạo biến mới trong R
# Tác giả: Thực hành kinh tế lượng
# Mục đích: Hướng dẫn các phương pháp mã hóa biến
# Tải thư viện cần thiết
library(haven) # Đọc file SPSS
library(dplyr) # Xử lý dữ liệu
library(forcats) # Xử lý factor
library(car) # Recode function
# Đọc dữ liệu (nếu có)
# data <- read_sav("data.sav")
# Tạo dữ liệu mẫu
Runs <- c(90, 140, 63, 14, 23)
Scores <- c(58, 86, 74, 70, 79, 60, 35, 42, 55, 91)
Ratings <- c(3, 6, 8, 9, 7, 2, 10, 6, 4, 8, 9, 3)
# Tạo data frame
data <- data.frame(
ID = 1:max(length(Runs), length(Scores), length(Ratings)),
Runs = rep(Runs, length.out = max(length(Runs), length(Scores), length(Ratings))),
Scores = rep(Scores, length.out = max(length(Runs), length(Scores), length(Ratings))),
Ratings = rep(Ratings, length.out = max(length(Runs), length(Scores), length(Ratings)))
)
# Phương pháp 1: Mã hóa giá trị đơn lẻ
# Tạo biến xếp hạng từ số lần chạy
# Cách 1: Sử dụng ifelse
data$Runs_ranked <- ifelse(data$Runs == 140, 1,
ifelse(data$Runs == 90, 2,
ifelse(data$Runs == 63, 3,
ifelse(data$Runs == 23, 4,
ifelse(data$Runs == 14, 5, NA)))))
# Cách 2: Sử dụng recode từ dplyr
data <- data %>%
mutate(Runs_ranked_alt = recode(Runs,
`140` = 1,
`90` = 2,
`63` = 3,
`23` = 4,
`14` = 5
))
# Cách 3: Sử dụng case_when
data <- data %>%
mutate(Runs_ranked_case = case_when(
Runs == 140 ~ 1,
Runs == 90 ~ 2,
Runs == 63 ~ 3,
Runs == 23 ~ 4,
Runs == 14 ~ 5,
TRUE ~ NA_real_
))
# Tạo factor với labels
data$Runs_ranked_factor <- factor(data$Runs_ranked,
levels = 1:5,
labels = c("Hạng nhất", "Hạng nhì", "Hạng ba", "Hạng tư", "Hạng năm")
)
# Phương pháp 2: Mã hóa theo khoảng giá trị
# Phân loại điểm số thành các nhóm
# Cách 1: Sử dụng cut function
data$Scores_ranges <- cut(data$Scores,
breaks = c(0, 40, 60, 74, 100),
labels = c("Yếu (0-40)", "Trung bình (41-60)", "Khá (61-74)", "Giỏi (75-100)"),
include.lowest = TRUE,
right = TRUE
)
# Cách 2: Sử dụng case_when
data <- data %>%
mutate(Scores_ranges_case = case_when(
Scores >= 75 & Scores <= 100 ~ "Giỏi (75-100)", Scores >= 61 & Scores <= 74 ~ "Khá (61-74)", Scores >= 41 & Scores <= 60 ~ "Trung bình (41-60)", Scores >= 0 & Scores <= 40 ~ "Yếu (0-40)",
TRUE ~ NA_character_
))
# Tạo biến số từ phân loại
data <- data %>%
mutate(Scores_ranges_num = case_when(
Scores >= 75 & Scores <= 100 ~ 1, Scores >= 61 & Scores <= 74 ~ 2, Scores >= 41 & Scores <= 60 ~ 3, Scores >= 0 & Scores <= 40 ~ 4,
TRUE ~ NA_real_
))
# Phương pháp 3: Mã hóa thành 2 nhóm phân loại
# Tạo biến nhị phân từ đánh giá thỏa mãn
# Cách 1: Biến character
data$Ratings2group <- ifelse(data$Ratings >= 6, "Thỏa mãn", "Không thỏa mãn")
# Cách 2: Biến logical
data$satisfaction_logical <- data$Ratings >= 6
# Cách 3: Biến factor
data$satisfaction_factor <- factor( ifelse(data$Ratings >= 6, 1, 0),
levels = c(0, 1),
labels = c("Không thỏa mãn", "Thỏa mãn")
)
# Cách 4: Biến dummy (0/1)
data$satisfaction_dummy <- as.numeric(data$Ratings >= 6)
# Kiểm tra kết quả mã hóa
# Tạo bảng tần suất
table(data$Runs_ranked, useNA = "always")
table(data$Scores_ranges, useNA = "always")
table(data$Ratings2group, useNA = "always")
# Tạo bảng crosstab để kiểm tra
table(data$Runs, data$Runs_ranked, useNA = "always")
table(data$Scores, data$Scores_ranges_num, useNA = "always")
table(data$Ratings, data$satisfaction_dummy, useNA = "always")
# Mã hóa nâng cao
# Sử dụng quantiles
data$score_quartiles <- cut(data$Scores,
breaks = quantile(data$Scores, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE),
labels = c("Q1", "Q2", "Q3", "Q4"),
include.lowest = TRUE
)
# Tạo z-scores
data$score_zscore <- scale(data$Scores)[,1]
# Mã hóa dựa trên điều kiện phức tạp
data <- data %>%
mutate(performance_category = case_when(
Scores >= 90 ~ "Xuất sắc",
Scores >= 80 & Scores < 90 ~ "Giỏi", Scores >= 70 & Scores < 80 ~ "Khá", Scores >= 60 & Scores < 70 ~ "Trung bình",
Scores < 60 ~ "Yếu",
TRUE ~ NA_character_
))
# Sử dụng forcats để reorder factors
data$performance_category <- factor(data$performance_category,
levels = c("Yếu", "Trung bình", "Khá", "Giỏi", "Xuất sắc"),
ordered = TRUE
)
# Kiểm tra kết quả
summary(data)
str(data)
# Tạo bảng tổng hợp
library(knitr)
kable(table(data$performance_category), caption = "Phân loại thành tích")
# Lưu dữ liệu
write_sav(data, "data_recoded.sav")
write.csv(data, "data_recoded.csv", row.names = FALSE)
# Tạo báo cáo validation
validation_report <- data %>%
summarise(
n_total = n(),
n_runs_missing = sum(is.na(Runs_ranked)),
n_scores_missing = sum(is.na(Scores_ranges_num)),
n_ratings_missing = sum(is.na(satisfaction_dummy)),
runs_unique = n_distinct(Runs_ranked, na.rm = TRUE),
scores_unique = n_distinct(Scores_ranges_num, na.rm = TRUE),
ratings_unique = n_distinct(satisfaction_dummy, na.rm = TRUE)
)
print(validation_report)
Python
Python (.py script)
# Mã hóa và tạo biến mới trong Python
# Tác giả: Thực hành kinh tế lượng
# Mục đích: Hướng dẫn các phương pháp mã hóa biến
import pandas as pd
import numpy as np
import pyreadstat
from sklearn.preprocessing import LabelEncoder, KBinsDiscretizer
# Đọc dữ liệu (nếu có)
# data, meta = pyreadstat.read_sav("data.sav")
# Tạo dữ liệu mẫu
runs_data = [90, 140, 63, 14, 23]
scores_data = [58, 86, 74, 70, 79, 60, 35, 42, 55, 91]
ratings_data = [3, 6, 8, 9, 7, 2, 10, 6, 4, 8, 9, 3]
# Tạo DataFrame
max_length = max(len(runs_data), len(scores_data), len(ratings_data))
data = pd.DataFrame({
'ID': range(1, max_length + 1),
'Runs': runs_data * (max_length // len(runs_data) + 1),
'Scores': scores_data * (max_length // len(scores_data) + 1),
'Ratings': ratings_data * (max_length // len(ratings_data) + 1)
})
# Cắt dữ liệu về độ dài phù hợp
data = data.head(max_length)
print("Dữ liệu ban đầu:")
print(data.head())
# Phương pháp 1: Mã hóa giá trị đơn lẻ
# Tạo biến xếp hạng từ số lần chạy
# Cách 1: Sử dụng map
runs_mapping = {140: 1, 90: 2, 63: 3, 23: 4, 14: 5}
data['Runs_ranked'] = data['Runs'].map(runs_mapping)
# Cách 2: Sử dụng replace
data['Runs_ranked_alt'] = data['Runs'].replace(runs_mapping)
# Cách 3: Sử dụng numpy.where (nested)
data['Runs_ranked_where'] = np.where(data['Runs'] == 140, 1,
np.where(data['Runs'] == 90, 2,
np.where(data['Runs'] == 63, 3,
np.where(data['Runs'] == 23, 4,
np.where(data['Runs'] == 14, 5, np.nan)))))
# Cách 4: Sử dụng pd.cut với bins tùy chỉnh
data['Runs_ranked_cut'] = pd.cut(data['Runs'],
bins=[0, 20, 30, 70, 100, 150],
labels=[5, 4, 3, 2, 1])
# Tạo mapping cho nhãn
rank_labels = {1: 'Hạng nhất', 2: 'Hạng nhì', 3: 'Hạng ba', 4: 'Hạng tư', 5: 'Hạng năm'}
data['Runs_ranked_label'] = data['Runs_ranked'].map(rank_labels)
# Phương pháp 2: Mã hóa theo khoảng giá trị
# Phân loại điểm số thành các nhóm
# Cách 1: Sử dụng pd.cut
data['Scores_ranges'] = pd.cut(data['Scores'],
bins=[0, 40, 60, 74, 100],
labels=['Yếu (0-40)', 'Trung bình (41-60)', 'Khá (61-74)', 'Giỏi (75-100)'],
include_lowest=True)
# Cách 2: Sử dụng numpy.where
data['Scores_ranges_where'] = np.where(data['Scores'] >= 75, 'Giỏi (75-100)',
np.where(data['Scores'] >= 61, 'Khá (61-74)',
np.where(data['Scores'] >= 41, 'Trung bình (41-60)',
np.where(data['Scores'] >= 0, 'Yếu (0-40)', np.nan))))
# Cách 3: Sử dụng conditions và choices
conditions = [
(data['Scores'] >= 75) & (data['Scores'] <= 100), (data['Scores'] >= 61) & (data['Scores'] <= 74), (data['Scores'] >= 41) & (data['Scores'] <= 60), (data['Scores'] >= 0) & (data['Scores'] <= 40) ] choices = ['Giỏi (75-100)', 'Khá (61-74)', 'Trung bình (41-60)', 'Yếu (0-40)'] data['Scores_ranges_select'] = np.select(conditions, choices, default=np.nan) # Tạo biến số từ phân loại score_num_mapping = {'Giỏi (75-100)': 1, 'Khá (61-74)': 2, 'Trung bình (41-60)': 3, 'Yếu (0-40)': 4} data['Scores_ranges_num'] = data['Scores_ranges'].map(score_num_mapping) # Phương pháp 3: Mã hóa thành 2 nhóm phân loại # Tạo biến nhị phân từ đánh giá thỏa mãn # Cách 1: Biến string data['Ratings2group'] = np.where(data['Ratings'] >= 6, 'Thỏa mãn', 'Không thỏa mãn')
# Cách 2: Biến boolean
data['satisfaction_bool'] = data['Ratings'] >= 6
# Cách 3: Biến dummy (0/1)
data['satisfaction_dummy'] = (data['Ratings'] >= 6).astype(int)
# Cách 4: Sử dụng pd.get_dummies cho one-hot encoding
satisfaction_dummies = pd.get_dummies(data['Ratings2group'], prefix='satisfaction')
data = pd.concat([data, satisfaction_dummies], axis=1)
# Kiểm tra kết quả mã hóa
print("\nKết quả mã hóa:")
print("Runs_ranked:")
print(data['Runs_ranked'].value_counts().sort_index())
print("\nScores_ranges:")
print(data['Scores_ranges'].value_counts())
print("\nRatings2group:")
print(data['Ratings2group'].value_counts())
# Tạo bảng crosstab để kiểm tra
print("\nBảng crosstab kiểm tra:")
print("Runs vs Runs_ranked:")
print(pd.crosstab(data['Runs'], data['Runs_ranked'], margins=True))
print("\nScores vs Scores_ranges_num:")
print(pd.crosstab(data['Scores'], data['Scores_ranges_num'], margins=True))
print("\nRatings vs satisfaction_dummy:")
print(pd.crosstab(data['Ratings'], data['satisfaction_dummy'], margins=True))
# Mã hóa nâng cao
# Sử dụng quantiles
data['score_quartiles'] = pd.qcut(data['Scores'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
# Tạo z-scores
data['score_zscore'] = (data['Scores'] - data['Scores'].mean()) / data['Scores'].std()
# Sử dụng KBinsDiscretizer từ scikit-learn
discretizer = KBinsDiscretizer(n_bins=4, encode='ordinal', strategy='quantile')
data['scores_binned'] = discretizer.fit_transform(data[['Scores']]).flatten()
# Mã hóa dựa trên điều kiện phức tạp
def categorize_performance(score):
if score >= 90:
return 'Xuất sắc'
elif score >= 80:
return 'Giỏi'
elif score >= 70:
return 'Khá'
elif score >= 60:
return 'Trung bình'
else:
return 'Yếu'
data['performance_category'] = data['Scores'].apply(categorize_performance)
# Sử dụng LabelEncoder
le = LabelEncoder()
data['performance_encoded'] = le.fit_transform(data['performance_category'])
# Tạo mapping cho giải mã
performance_mapping = dict(zip(le.transform(le.classes_), le.classes_))
print("\nPerformance mapping:", performance_mapping)
# Kiểm tra kết quả cuối cùng
print("\nThông tin tổng quan:")
print(data.info())
print("\nMô tả dữ liệu:")
print(data.describe(include='all'))
# Tạo bảng tổng hợp
summary_stats = data.groupby('performance_category').agg({
'Scores': ['count', 'mean', 'std', 'min', 'max'],
'satisfaction_dummy': 'mean'
}).round(2)
print("\nBảng tổng hợp theo performance_category:")
print(summary_stats)
# Validation - kiểm tra missing values
print("\nKiểm tra missing values:")
print(data.isnull().sum())
# Lưu dữ liệu
data.to_csv('data_recoded.csv', index=False)
pyreadstat.write_sav(data, 'data_recoded.sav')
# Tạo báo cáo validation
validation_report = {
'total_rows': len(data),
'runs_ranked_missing': data['Runs_ranked'].isnull().sum(),
'scores_ranges_missing': data['Scores_ranges_num'].isnull().sum(),
'ratings_missing': data['satisfaction_dummy'].isnull().sum(),
'runs_unique_values': data['Runs_ranked'].nunique(),
'scores_unique_values': data['Scores_ranges_num'].nunique(),
'ratings_unique_values': data['satisfaction_dummy'].nunique()
}
print("\nBáo cáo validation:")
for key, value in validation_report.items():
print(f"{key}: {value}")
# Tạo visualization (tùy chọn)
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# Biểu đồ 1: Runs ranking
data['Runs_ranked'].value_counts().sort_index().plot(kind='bar', ax=axes[0,0])
axes[0,0].set_title('Phân bố xếp hạng lần chạy')
axes[0,0].set_xlabel('Xếp hạng')
axes[0,0].set_ylabel('Tần suất')
# Biểu đồ 2: Scores ranges
data['Scores_ranges'].value_counts().plot(kind='bar', ax=axes[0,1])
axes[0,1].set_title('Phân bố khoảng điểm')
axes[0,1].set_xlabel('Khoảng điểm')
axes[0,1].set_ylabel('Tần suất')
# Biểu đồ 3: Satisfaction
data['Ratings2group'].value_counts().plot(kind='bar', ax=axes[1,0])
axes[1,0].set_title('Phân bố mức độ thỏa mãn')
axes[1,0].set_xlabel('Mức độ thỏa mãn')
axes[1,0].set_ylabel('Tần suất')
# Biểu đồ 4: Performance category
data['performance_category'].value_counts().plot(kind='bar', ax=axes[1,1])
axes[1,1].set_title('Phân bố loại thành tích')
axes[1,1].set_xlabel('Loại thành tích')
axes[1,1].set_ylabel('Tần suất')
plt.tight_layout()
plt.savefig('recode_visualization.png', dpi=300, bbox_inches='tight')
plt.show()
print("\nHoàn thành quá trình mã hóa và tạo biến mới!")
Tài liệu tham khảo
- Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics. 5th Edition. SAGE Publications.
- George, D., & Mallery, P. (2019). IBM SPSS Statistics 26 Step by Step: A Simple Guide and Reference. 15th Edition. Routledge.
- IBM Corporation. (2023). IBM SPSS Statistics Base 29.0.0 User’s Guide. IBM Corporation.
- Pallant, J. (2020). SPSS Survival Manual: A Step by Step Guide to Data Analysis Using IBM SPSS. 7th Edition. McGraw-Hill Education.
- Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2019). Multivariate Data Analysis. 8th Edition. Cengage Learning.
- Tabachnick, B. G., & Fidell, L. S. (2019). Using Multivariate Statistics. 7th Edition. Pearson.