Nối dữ liệu với SPSS – Merging data
Sắp xếp và nối dữ liệu trong thực hành kinh tế lượng với SPSS

Tóm tắt: Nối dữ liệu (merge files) là kỹ năng quan trọng trong thực hành kinh tế lượng, cho phép kết hợp thông tin từ nhiều nguồn khác nhau. Bài viết hướng dẫn chi tiết hai phương pháp chính: nối dữ liệu không so khớp (thêm quan sát và thêm biến) và nối dữ liệu có so khớp (sử dụng key variables). Các kỹ thuật này đặc biệt hữu ích khi xử lý dữ liệu kinh tế Việt Nam từ nhiều nguồn khảo sát khác nhau.
Giới thiệu về nối dữ liệu trong thực hành kinh tế lượng
Nội dung chính
- Giới thiệu về nối dữ liệu trong thực hành kinh tế lượng
- Điều kiện và yêu cầu kỹ thuật
- Ví dụ thực tế từ kinh tế Việt Nam
- Hướng dẫn thực hành chi tiết
- Lưu ý quan trọng và cảnh báo
- Ứng dụng trong nghiên cứu kinh tế Việt Nam
- 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, nối dữ liệu (data merging) là một kỹ năng cốt lõi mà mọi nhà nghiên cứu kinh tế cần thành thạo. Việc này đặc biệt quan trọng khi làm việc với dữ liệu kinh tế Việt Nam, nơi thông tin thường được thu thập từ nhiều nguồn khác nhau.
Trong bối cảnh nghiên cứu kinh tế Việt Nam, chúng ta thường gặp các tình huống sau:
- Dữ liệu hộ gia đình từ Tổng cục Thống kê ở nhiều năm khác nhau cần kết hợp
- Thông tin doanh nghiệp từ các nguồn khác nhau (tài chính, sản xuất, xuất khẩu)
- Dữ liệu giáo dục từ nhiều trường, nhiều năm học cần tổng hợp
- Thông tin kinh tế vĩ mô từ các bộ ngành khác nhau
SPSS cung cấp công cụ mạnh mẽ để thực hiện việc nối dữ liệu thông qua menu Data → Merge Files, với hai phương pháp chính:
- Add Cases: Thêm quan sát (rows) từ file khác
- Add Variables: Thêm biến (columns) từ file khác
Điều kiện và yêu cầu kỹ thuật
Trước khi thực hiện nối dữ liệu trong thực hành kinh tế lượng, cần hiểu rõ các điều kiện và yêu cầu kỹ thuật:
Yêu cầu về định dạng file
Định dạng file hỗ trợ: SPSS hỗ trợ nối các file có định dạng .sav (SPSS native format). Các định dạng khác như Excel, CSV cần được chuyển đổi trước khi thực hiện.
Yêu cầu về cấu trúc dữ liệu
- Các biến cùng tên phải có cùng định dạng (numeric, string)
- Các biến cùng tên phải có cùng độ dài (đối với biến string)
- Cần xác định rõ biến khóa (key variables) khi nối có so khớp
- Dữ liệu cần được sắp xếp theo biến khóa trước khi nối
Ví dụ thực tế từ kinh tế Việt Nam
Để minh họa các kỹ thuật nối dữ liệu, chúng ta sử dụng bộ dữ liệu mô phỏng về học sinh trung học phổ thông tại Việt Nam. Tình huống thực tế:
Bối cảnh nghiên cứu: Một nghiên cứu về thành tích học tập của học sinh THPT tại TP.HCM cần kết hợp dữ liệu từ nhiều nguồn: điểm thi từ Sở Giáo dục, thông tin gia đình từ khảo sát riêng, và dữ liệu về điều kiện trường học từ báo cáo của các trường.
Chúng ta có các file dữ liệu sau:
- hsb1.sav: 100 học sinh với 11 biến (bao gồm điểm toán, khoa học, xã hội)
- hsb2.sav: 200 học sinh với 8 biến (không có điểm các môn học)
- hsb.sav: 200 học sinh với 11 biến đầy đủ
Hướng dẫn thực hành chi tiết
Phần A: Nối dữ liệu không so khớp
Nối dữ liệu không so khớp là phương pháp cơ bản nhất, phù hợp khi cần kết hợp dữ liệu từ các nguồn có cấu trúc tương tự.Phương pháp 1: Thêm quan sát
Khi cần tăng số lượng quan sát bằng cách kết hợp dữ liệu (Add Cases) từ nhiều file có cùng cấu trúc biến:
Bước 1: Truy cập chức năng Add Cases
Để thêm quan sát vào file hiện hành:
- Chọn Add Cases… từ menu Data → Merge Files
- Giao diện sẽ hiển thị tùy chọn chọn file để nối
Bước 2: Chọn file dữ liệu cần nối
Tìm và chọn file chứa các quan sát cần ghép:
- Bấm nút Browse để tìm file
- Chọn file dữ liệu phù hợp (ví dụ: hsb2.sav)
- Xác nhận lựa chọn
Bước 3: Cấu hình so khớp biến
Bấm Continue để mở cửa sổ cấu hình. SPSS sẽ tự động so khớp các biến giữa hai file:
Giải thích các mục trong cửa sổ:
- Variables in New Active Dataset: Các biến chung sẽ có trong file kết quả
- Unpaired Variables: Các biến không khớp giữa hai file
Bước 4: Thực hiện nối dữ liệu
Bấm OK để hoàn tất quá trình ghép quan sát.
Kết quả và diễn giải
Kết quả sau khi nối:
- Từ file ban đầu hsb1.sav: 11 biến, 100 quan sát
- Sau khi thêm từ hsb2.sav: 8 biến, 200 quan sát
- Mất 3 biến (math, science, socst) vì không có trong file hsb2.sav
- Chỉ giữ lại 8 biến chung ở cả hai file
Phương pháp 2: Thêm biến (Add Variables)
Khi cần bổ sung thêm biến cho các quan sát hiện có:
Bước 1: Truy cập chức năng Add Variables
Chọn Add Variables… từ menu Data → Merge Files:
Bước 2: Chọn file chứa biến cần thêm
Bước 3: Cấu hình biến cần nối
Bấm Continue để mở cửa sổ cấu hình biến:
Phân loại biến trong cửa sổ:
- New Active Dataset: Biến sẽ có trong file kết quả
- Excluded Variables: Biến không được đưa vào file kết quả
Kết quả thêm biến
Kết quả quan trọng:
- Từ file hsb2.sav: 8 biến, 200 quan sát
- Sau khi thêm từ hsb1.sav: 11 biến, 200 quan sát
- Tăng 3 biến (math, science, socst)
- Số quan sát không thay đổi
Vấn đề về độ tin cậy dữ liệu
Vấn đề cần lưu ý: Khi thêm biến mà không có so khớp, SPSS sẽ nối dữ liệu theo thứ tự xuất hiện. Điều này có thể dẫn đến việc thông tin không chính xác nếu các quan sát không tương ứng với nhau giữa hai file.
Bàn luận về nối dữ liệu
Ở trường hợp thêm biến, các bạn có nghĩ 100 quan sát ở file mới sau khi thêm biến có phải là 100 quan sát chung của 2 file dữ liệu hsb2 (file hiện hành) và file hsb1 không? Hơn nữa, dữ liệu sau khi nối có đạt độ tin cậy cao không (nghĩa là 3 biến math, science và socst thêm vào có phản ánh đúng cho 100 quan sát ở file dữ liệu sau khi nối không? Nếu tất cả là không thì các bạn giải quyết vấn đề này ra sao?
Phần B: Nối dữ liệu có so khớp
Nối dữ liệu có so khớp là phương pháp nâng cao, đảm bảo tính chính xác bằng cách sử dụng biến khóa (key variables) để liên kết dữ liệu.Ba trường hợp nối dữ liệu có so khớp
Khi nối file bằng cách bổ sung biến, có 3 trường hợp có thể xảy ra:
- Trường hợp 1: Quan sát trong file kết quả chỉ chứa dữ liệu từ file hiện hành
- Trường hợp 2: Quan sát trong file kết quả chỉ chứa dữ liệu từ file sử dụng
- Trường hợp 3: Quan sát trong file kết quả chứa dữ liệu từ cả hai file
Nguyên tắc quan trọng: Trường hợp 3 đòi hỏi giá trị của các biến trên cả hai file phải giống nhau. Các biến chung sẽ làm tiêu chuẩn kết nối (Key Variables) của hai file.
Ví dụ thực hành chi tiết
Thực hiện nối dữ liệu giữa hai file:
- hsb2.sav (file hiện hành): 100 quan sát, 8 biến (id, female, race, ses, schtyp, prog, read, write)
- hsb.sav (file sử dụng): 200 quan sát, 11 biến (thêm 3 biến math, science, socst)
Bước 1: Sắp xếp dữ liệu
Trước khi nối dữ liệu có so khớp, cần sắp xếp cả hai file theo biến khóa:
Sắp xếp file hsb2.sav
- Mở file hsb2.sav
- Chọn Sort Cases… từ menu Data
Trong cửa sổ Sort Cases:
- Đưa biến đại diện cho mỗi quan sát (id) vào ô Sort by
- Ở mục Save Sorted Data, chọn Save file with sorted data
- Bấm nút File… và chọn đường dẫn lưu
- Nên lưu chồng lên file đang cần sắp xếp
Lưu ý quan trọng: Thực hiện tương tự cho file hsb.sav trước khi bắt đầu nối dữ liệu. Cả hai file phải được sắp xếp theo cùng một biến khóa.
Bước 2: Thực hiện nối có so khớp
Nối hsb.sav vào hsb2.sav để bổ sung 3 biến math, science và socst:
- Mở file hsb2.sav (file hiện hành)
- Chọn Add Variables… từ menu Data → Merge Files
- Chọn An external SPSS Statistics data file
- Tìm đến file hsb.sav
- Bấm Open và Continue
Bước 3: Cấu hình so khớp biến khóa
Trong cửa sổ cấu hình, các ký hiệu sau được sử dụng:
Ký hiệu trong SPSS:
- Dấu (*): Biến thuộc file hiện hành (hsb2.sav)
- Dấu (+): Biến thuộc file sử dụng (hsb.sav)
Để thực hiện so khớp các quan sát:
- Chọn Match cases on key variables in sorted files
- Đưa biến id từ khung Excluded Variables vào ô Key Variables
- Biến id là biến chung đại diện cho mỗi quan sát ở 2 file
Chú ý quan trọng: Giá trị của các biến trong mục Key Variables ở 2 file phải hoàn toàn giống nhau, có phân biệt chữ hoa và chữ thường. Ví dụ: “vietlod” và “Vietlod” được coi là 2 quan sát khác nhau.
Bước 4: Chọn tùy chọn nối dữ liệu
SPSS cung cấp ba lựa chọn chính:
Tùy chọn 1: Both files provide cases
Các quan sát trong file kết quả chứa dữ liệu từ cả hai file (trường hợp 3).
Tùy chọn 2: Non-active dataset is keyed table
Tìm dữ liệu ở file sử dụng cho mỗi quan sát ở file hiện hành. Phù hợp khi chỉ muốn bổ sung biến cho các quan sát hiện có.
Tùy chọn 3: Active dataset is keyed table
Tìm dữ liệu ở file hiện hành cho mỗi quan sát ở file sử dụng.
Kết quả và diễn giải
Kết quả với Non-active dataset is keyed table
Khi chọn tùy chọn này:
- Giữ nguyên 100 quan sát từ file hiện hành
- Bổ sung thành công 3 biến từ file sử dụng
- Đảm bảo tính chính xác cao nhất
- Phù hợp cho mục đích bổ sung thông tin
Kết quả với Both files provide cases hoặc Active dataset is keyed table
Cả hai tùy chọn này cho kết quả tương tự:
- Tăng số quan sát lên 200
- Bổ sung đầy đủ ba biến từ file sử dụng
- Bao gồm cả quan sát mới và quan sát gốc
- Phù hợp khi muốn mở rộng cả chiều rộng và chiều dài dữ liệu
Lưu ý quan trọng và cảnh báo
Các vấn đề thường gặp
Lỗi thường gặp khi nối dữ liệu:
- Không sắp xếp dữ liệu trước khi nối có so khớp
- Biến khóa có giá trị không khớp giữa hai file
- Định dạng biến không tương thích giữa các file
- Nhầm lẫn giữa các tùy chọn nối dữ liệu
Nguyên tắc thực hành tốt
- Sao lưu dữ liệu: Luôn tạo bản sao lưu trước khi nối
- Kiểm tra kết quả: Xem xét số quan sát và biến sau khi nối
- Xác minh tính chính xác: So sánh một vài quan sát mẫu
- Ghi chú quá trình: Ghi chú các bước đã thực hiện
Lời khuyên cho nghiên cứu kinh tế
Trong nghiên cứu kinh tế Việt Nam:
- Luôn sử dụng nối có so khớp khi có biến định danh
- Kiểm tra tính nhất quán của biến khóa trước khi nối
- Cân nhắc sử dụng biến khóa phức hợp (nhiều biến) khi cần thiết
- Đảm bảo cùng kỳ thời gian khi nối dữ liệu thời gian
Ứng dụng trong nghiên cứu kinh tế Việt Nam
Nghiên cứu hộ gia đình
Khi nghiên cứu về hộ gia đình Việt Nam, việc nối dữ liệu thường được áp dụng trong:
- Kết hợp dữ liệu thu nhập và chi tiêu từ các cuộc điều tra khác nhau
- Nối thông tin nhân khẩu học với dữ liệu kinh tế
- Tích hợp dữ liệu từ nhiều năm để phân tích xu hướng
- Kết hợp thông tin cộng đồng với dữ liệu hộ gia đình
Nghiên cứu doanh nghiệp
Trong phân tích doanh nghiệp Việt Nam:
- Nối dữ liệu tài chính với thông tin sản xuất
- Kết hợp dữ liệu xuất nhập khẩu với báo cáo doanh nghiệp
- Tích hợp thông tin về nhân lực với hiệu quả hoạt động
- Nối dữ liệu ngành với thông tin vĩ mô
Nghiên cứu giáo dục
Trong lĩnh vực giáo dục:
- Kết hợp điểm thi với thông tin gia đình học sinh
- Nối dữ liệu trường học với thành tích học tập
- Tích hợp thông tin giáo viên với kết quả lớp học
- Kết hợp dữ liệu đầu vào và đầu ra giáo dục
Tổng kết
Nối dữ liệu là kỹ năng cốt lõi trong thực hành kinh tế lượng, đặc biệt quan trọng khi làm việc với dữ liệu kinh tế Việt Nam từ nhiều nguồn khác nhau. SPSS cung cấp công cụ mạnh mẽ và linh hoạt để thực hiện các thao tác nối dữ liệu phức tạp.
Việc thành thạo các kỹ thuật nối dữ liệu sẽ giúp các bạn:
Lợi ích chính của việc thành thạo nối dữ liệu:
- Tận dụng tối đa thông tin từ nhiều nguồn dữ liệu
- Tạo ra dataset phong phú cho phân tích sâu
- Đảm bảo tính chính xác và tin cậy của nghiên cứu
- Tiết kiệm thời gian và công sức trong nghiên cứu
Trong bối cảnh kinh tế Việt Nam, nơi dữ liệu thường được phân tán ở nhiều nguồn khác nhau, việc thành thạo các kỹ thuật nối dữ liệu trở thành yếu tố then chốt để thực hiện các nghiên cứu chất lượng cao và có ý nghĩa thực tiễn.
Key Points:
- Nối dữ liệu có hai phương pháp chính: Add Cases (thêm quan sát) và Add Variables (thêm biến)
- Nối không so khớp đơn giản nhưng có thể thiếu chính xác
- Nối có so khớp yêu cầu sắp xếp dữ liệu và sử dụng key variables
- Ba tùy chọn nối có so khớp phù hợp với các mục đích nghiên cứu khác nhau
- Cần kiểm tra kỹ kết quả sau khi nối để đảm bảo tính chính xác
- Kỹ năng này đặc biệt quan trọng trong nghiên cứu kinh tế Việt Nam
Phụ lục – Code cho các phần mềm khác
SPSS Syntax
SPSS Syntax (.sps)
* Nối dữ liệu trong SPSS Syntax
* Tác giả: Thực hành kinh tế lượng
* Mục đích: Hướng dẫn nối dữ liệu với SPSS Syntax
* Mở file dữ liệu chính
GET FILE='hsb2.sav'.
* Phương pháp 1: Thêm quan sát (Add Cases)
* Nối thêm quan sát từ file khác
ADD FILES /FILE=*
/FILE='hsb1.sav'.
EXECUTE.
* Lưu kết quả
SAVE OUTFILE='merged_cases.sav'.
* Phương pháp 2: Thêm biến không so khớp (Add Variables)
GET FILE='hsb2.sav'.
MATCH FILES /FILE=*
/FILE='hsb1.sav'
/BY id.
EXECUTE.
* Lưu kết quả
SAVE OUTFILE='merged_variables_simple.sav'.
* Phương pháp 3: Sắp xếp dữ liệu trước khi nối
* Sắp xếp file chính
GET FILE='hsb2.sav'.
SORT CASES BY id.
SAVE OUTFILE='hsb2_sorted.sav'.
* Sắp xếp file phụ
GET FILE='hsb.sav'.
SORT CASES BY id.
SAVE OUTFILE='hsb_sorted.sav'.
* Nối dữ liệu có so khớp - Both files provide cases
GET FILE='hsb2_sorted.sav'.
MATCH FILES /FILE=*
/FILE='hsb_sorted.sav'
/BY id.
EXECUTE.
SAVE OUTFILE='merged_both_files.sav'.
* Nối dữ liệu có so khớp - Table lookup (Non-active dataset is keyed table)
GET FILE='hsb2_sorted.sav'.
MATCH FILES /FILE=*
/TABLE='hsb_sorted.sav'
/BY id.
EXECUTE.
SAVE OUTFILE='merged_table_lookup.sav'.
* Kiểm tra kết quả sau khi nối
FREQUENCIES VARIABLES=id.
DESCRIPTIVES VARIABLES=math science socst.
* Tạo báo cáo tóm tắt
CROSSTABS /TABLES=female BY schtyp
/CELLS=COUNT ROW COLUMN TOTAL.
Stata
Stata (.do file)
* Nối dữ liệu 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 nối dữ liệu
* Thiết lập thư mục làm việc
cd "C:/data"
* Phương pháp 1: Append - Thêm quan sát
* Mở file chính
use "hsb2.dta", clear
* Thêm quan sát từ file khác
append using "hsb1.dta"
* Kiểm tra kết quả
describe
summarize
* Lưu kết quả
save "merged_append.dta", replace
* Phương pháp 2: Merge - Nối có so khớp
* One-to-one merge (1:1)
use "hsb2.dta", clear
sort id
save "hsb2_sorted.dta", replace
use "hsb.dta", clear
sort id
save "hsb_sorted.dta", replace
* Thực hiện merge 1:1
use "hsb2_sorted.dta", clear
merge 1:1 id using "hsb_sorted.dta"
* Kiểm tra kết quả merge
tab _merge
list id math science socst if _merge != 3
* Giữ lại chỉ những quan sát matched
keep if _merge == 3
drop _merge
* Lưu kết quả
save "merged_1to1.dta", replace
* Many-to-one merge (m:1) - ví dụ nối thông tin trường học
use "students.dta", clear
sort school_id
merge m:1 school_id using "schools.dta"
* One-to-many merge (1:m) - ví dụ nối thông tin học sinh vào trường
use "schools.dta", clear
sort school_id
merge 1:m school_id using "students.dta"
* Many-to-many merge (m:m) - ít sử dụng, cần cẩn thận
use "dataset1.dta", clear
merge m:m id using "dataset2.dta"
* Các tùy chọn merge hữu ích
* keep() - chỉ giữ lại quan sát thỏa mãn điều kiện
use "hsb2_sorted.dta", clear
merge 1:1 id using "hsb_sorted.dta", keep(matched master)
* nogenerate - không tạo biến _merge
use "hsb2_sorted.dta", clear
merge 1:1 id using "hsb_sorted.dta", nogenerate
* update - cập nhật giá trị missing từ using file
use "hsb2_sorted.dta", clear
merge 1:1 id using "hsb_sorted.dta", update
* Kiểm tra chất lượng dữ liệu sau merge
duplicates report id
duplicates list id if _merge == 3
* Tạo báo cáo
tabulate female schtyp
summarize math science socst, detail
R
R (.R script)
# Nối dữ liệu 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 nối dữ liệu
# Tải các thư viện cần thiết
library(haven) # Đọc file SPSS
library(dplyr) # Xử lý dữ liệu
library(readr) # Đọc file CSV
library(stringr) # Xử lý chuỗi
# Đọc dữ liệu từ các file SPSS
hsb1 <- read_sav("hsb1.sav")
hsb2 <- read_sav("hsb2.sav")
hsb_full <- read_sav("hsb.sav")
# Kiểm tra cấu trúc dữ liệu
str(hsb1)
str(hsb2)
str(hsb_full)
# Phương pháp 1: rbind - Thêm quan sát (tương đương Add Cases)
# Chỉ giữ lại các cột chung
common_cols <- intersect(names(hsb1), names(hsb2))
hsb1_common <- hsb1[, common_cols]
hsb2_common <- hsb2[, common_cols]
# Nối theo hàng
merged_rows <- rbind(hsb1_common, hsb2_common)
cat("Kết quả nối theo hàng:\n")
cat("Số quan sát:", nrow(merged_rows), "\n")
cat("Số biến:", ncol(merged_rows), "\n")
# Phương pháp 2: cbind - Thêm biến (cần cẩn thận về thứ tự)
# Chỉ sử dụng khi chắc chắn về thứ tự quan sát
# Không khuyến khích trong thực tế
# Phương pháp 3: Merge/Join functions - Nối có so khớp
# Inner join - chỉ giữ quan sát có trong cả hai file
inner_merged <- merge(hsb2, hsb_full, by = "id", all = FALSE)
# Left join - giữ tất cả quan sát từ file trái
left_merged <- merge(hsb2, hsb_full, by = "id", all.x = TRUE)
# Right join - giữ tất cả quan sát từ file phải
right_merged <- merge(hsb2, hsb_full, by = "id", all.y = TRUE)
# Full outer join - giữ tất cả quan sát từ cả hai file
full_merged <- merge(hsb2, hsb_full, by = "id", all = TRUE)
# Sử dụng dplyr (cú pháp hiện đại hơn)
# Inner join
inner_dplyr <- hsb2 %>%
inner_join(hsb_full, by = "id")
# Left join
left_dplyr <- hsb2 %>%
left_join(hsb_full, by = "id")
# Right join
right_dplyr <- hsb2 %>%
right_join(hsb_full, by = "id")
# Full join
full_dplyr <- hsb2 %>%
full_join(hsb_full, by = "id")
# Anti join - các quan sát trong hsb2 nhưng không có trong hsb_full
anti_dplyr <- hsb2 %>%
anti_join(hsb_full, by = "id")
# Semi join - các quan sát trong hsb2 có trong hsb_full
semi_dplyr <- hsb2 %>%
semi_join(hsb_full, by = "id")
# Merge với nhiều key variables
# multi_key_merge <- merge(df1, df2, by = c("var1", "var2"))
# Kiểm tra kết quả merge
check_merge_results <- function(original1, original2, merged) {
cat("File 1 - Quan sát:", nrow(original1), "Biến:", ncol(original1), "\n")
cat("File 2 - Quan sát:", nrow(original2), "Biến:", ncol(original2), "\n")
cat("Merged - Quan sát:", nrow(merged), "Biến:", ncol(merged), "\n")
# Kiểm tra missing values
cat("Missing values trong merged data:\n")
print(sapply(merged, function(x) sum(is.na(x))))
}
# Kiểm tra các kết quả
cat("=== INNER JOIN ===\n")
check_merge_results(hsb2, hsb_full, inner_dplyr)
cat("\n=== LEFT JOIN ===\n")
check_merge_results(hsb2, hsb_full, left_dplyr)
cat("\n=== FULL JOIN ===\n")
check_merge_results(hsb2, hsb_full, full_dplyr)
# Xử lý các vấn đề phổ biến khi merge
# 1. Xử lý tên biến trùng lặp
merged_with_suffix <- merge(hsb2, hsb_full,
by = "id",
suffixes = c("_hsb2", "_full"))
# 2. Merge với tolerance cho số (nếu cần)
# Sử dụng thư viện fuzzyjoin cho fuzzy matching
# 3. Tạo biến indicator để theo dõi nguồn gốc
hsb2_with_source <- hsb2 %>%
mutate(source = "hsb2")
hsb_full_with_source <- hsb_full %>%
mutate(source = "full")
# Combine với indicator
combined_with_source <- bind_rows(hsb2_with_source, hsb_full_with_source)
# Validation và quality checks
validate_merge <- function(df) {
cat("Kiểm tra chất lượng dữ liệu sau merge:\n")
# Kiểm tra duplicates
cat("Số ID trùng lặp:", sum(duplicated(df$id)), "\n")
# Kiểm tra missing values
missing_summary <- df %>%
summarise_all(~sum(is.na(.))) %>%
gather(variable, missing_count) %>%
filter(missing_count > 0)
if(nrow(missing_summary) > 0) {
cat("Biến có missing values:\n")
print(missing_summary)
} else {
cat("Không có missing values\n")
}
# Summary statistics
cat("\nThống kê mô tả:\n")
print(summary(df))
}
# Validate kết quả
validate_merge(inner_dplyr)
# Lưu kết quả
write_sav(inner_dplyr, "merged_inner_r.sav")
write_sav(left_dplyr, "merged_left_r.sav")
write_sav(full_dplyr, "merged_full_r.sav")
# Tạo báo cáo merge
create_merge_report <- function(df, filename) {
report <- list(
n_observations = nrow(df),
n_variables = ncol(df),
variable_names = names(df),
missing_summary = sapply(df, function(x) sum(is.na(x))),
numeric_summary = summary(select_if(df, is.numeric))
)
# Lưu báo cáo
saveRDS(report, paste0(filename, "_report.rds"))
return(report)
}
# Tạo báo cáo cho các merge khác nhau
inner_report <- create_merge_report(inner_dplyr, "inner_merge")
left_report <- create_merge_report(left_dplyr, "left_merge")
full_report <- create_merge_report(full_dplyr, "full_merge")
cat("Hoàn thành quá trình nối dữ liệu và validation!\n")
Python
Python (.py script)
# Nối dữ liệu 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 nối dữ liệu
import pandas as pd
import numpy as np
import pyreadstat
import warnings
warnings.filterwarnings('ignore')
# Đọc dữ liệu từ file SPSS
print("Đọc dữ liệu từ các file SPSS...")
# Đọc các file dữ liệu
hsb1, meta1 = pyreadstat.read_sav("hsb1.sav")
hsb2, meta2 = pyreadstat.read_sav("hsb2.sav")
hsb_full, meta_full = pyreadstat.read_sav("hsb.sav")
# Kiểm tra thông tin cơ bản
print("=== THÔNG TIN CƠ BẢN ===")
print(f"HSB1: {hsb1.shape[0]} quan sát, {hsb1.shape[1]} biến")
print(f"HSB2: {hsb2.shape[0]} quan sát, {hsb2.shape[1]} biến")
print(f"HSB_FULL: {hsb_full.shape[0]} quan sát, {hsb_full.shape[1]} biến")
print(f"\nCác biến trong HSB1: {list(hsb1.columns)}")
print(f"Các biến trong HSB2: {list(hsb2.columns)}")
print(f"Các biến trong HSB_FULL: {list(hsb_full.columns)}")
# Phương pháp 1: concat - Thêm quan sát (tương đương Add Cases)
print("\n=== PHƯƠNG PHÁP 1: THÊM QUAN SÁT ===")
# Tìm các cột chung
common_columns = list(set(hsb1.columns) & set(hsb2.columns))
print(f"Các biến chung: {common_columns}")
# Chọn chỉ các cột chung
hsb1_common = hsb1[common_columns]
hsb2_common = hsb2[common_columns]
# Nối theo hàng (axis=0)
merged_concat = pd.concat([hsb1_common, hsb2_common],
axis=0,
ignore_index=True,
sort=False)
print(f"Kết quả nối theo hàng: {merged_concat.shape[0]} quan sát, {merged_concat.shape[1]} biến")
# Thêm cột để theo dõi nguồn gốc
hsb1_with_source = hsb1_common.copy()
hsb1_with_source['source'] = 'hsb1'
hsb2_with_source = hsb2_common.copy()
hsb2_with_source['source'] = 'hsb2'
merged_with_source = pd.concat([hsb1_with_source, hsb2_with_source],
axis=0,
ignore_index=True)
# Phương pháp 2: Merge/Join - Nối có so khớp
print("\n=== PHƯƠNG PHÁP 2: NỐI CÓ SO KHỚP ===")
# Inner join - chỉ giữ quan sát có trong cả hai file
inner_merged = pd.merge(hsb2, hsb_full, on='id', how='inner')
print(f"Inner join: {inner_merged.shape[0]} quan sát, {inner_merged.shape[1]} biến")
# Left join - giữ tất cả quan sát từ file trái
left_merged = pd.merge(hsb2, hsb_full, on='id', how='left')
print(f"Left join: {left_merged.shape[0]} quan sát, {left_merged.shape[1]} biến")
# Right join - giữ tất cả quan sát từ file phải
right_merged = pd.merge(hsb2, hsb_full, on='id', how='right')
print(f"Right join: {right_merged.shape[0]} quan sát, {right_merged.shape[1]} biến")
# Outer join - giữ tất cả quan sát từ cả hai file
outer_merged = pd.merge(hsb2, hsb_full, on='id', how='outer')
print(f"Outer join: {outer_merged.shape[0]} quan sát, {outer_merged.shape[1]} biến")
# Xử lý tên cột trùng lặp bằng suffixes
merged_with_suffixes = pd.merge(hsb2, hsb_full,
on='id',
how='inner',
suffixes=('_hsb2', '_full'))
# Merge với nhiều key columns (nếu cần)
# multi_key_merge = pd.merge(df1, df2, on=['key1', 'key2'], how='inner')
# Phương pháp 3: Join method của DataFrame
print("\n=== SỬ DỤNG JOIN METHOD ===")
# Set index trước khi join
hsb2_indexed = hsb2.set_index('id')
hsb_full_indexed = hsb_full.set_index('id')
# Inner join sử dụng join method
joined_inner = hsb2_indexed.join(hsb_full_indexed,
how='inner',
rsuffix='_full')
print(f"Join method (inner): {joined_inner.shape[0]} quan sát, {joined_inner.shape[1]} biến")
# Validation và kiểm tra chất lượng
def validate_merge(df, name):
"""Kiểm tra chất lượng dữ liệu sau merge"""
print(f"\n=== VALIDATION: {name.upper()} ===")
# Thông tin cơ bản
print(f"Kích thước: {df.shape[0]} quan sát, {df.shape[1]} biến")
# Kiểm tra duplicates trên ID
if 'id' in df.columns:
duplicates = df['id'].duplicated().sum()
print(f"Số ID trùng lặp: {duplicates}")
# Kiểm tra missing values
missing_summary = df.isnull().sum()
missing_cols = missing_summary[missing_summary > 0]
if len(missing_cols) > 0:
print("Biến có missing values:")
for col, missing_count in missing_cols.items():
percentage = (missing_count / len(df)) * 100
print(f" {col}: {missing_count} ({percentage:.1f}%)")
else:
print("Không có missing values")
# Thống kê mô tả cho biến số
numeric_cols = df.select_dtypes(include=[np.number]).columns
if len(numeric_cols) > 0:
print(f"\nThống kê mô tả ({len(numeric_cols)} biến số):")
print(df[numeric_cols].describe().round(2))
# Validate các kết quả merge
validate_merge(inner_merged, "Inner Merge")
validate_merge(left_merged, "Left Merge")
validate_merge(outer_merged, "Outer Merge")
# Tạo function để so sánh kết quả merge
def compare_merge_methods(hsb2, hsb_full):
"""So sánh các phương pháp merge khác nhau"""
results = {}
# Thực hiện các loại merge
methods = {
'inner': 'inner',
'left': 'left',
'right': 'right',
'outer': 'outer'
}
for name, method in methods.items():
merged = pd.merge(hsb2, hsb_full, on='id', how=method)
results[name] = {
'observations': merged.shape[0],
'variables': merged.shape[1],
'missing_values': merged.isnull().sum().sum(),
'data': merged
}
# Tạo bảng so sánh
comparison = pd.DataFrame({
'Method': list(results.keys()),
'Observations': [results[k]['observations'] for k in results.keys()],
'Variables': [results[k]['variables'] for k in results.keys()],
'Missing Values': [results[k]['missing_values'] for k in results.keys()]
})
print("\n=== SO SÁNH CÁC PHƯƠNG PHÁP MERGE ===")
print(comparison.to_string(index=False))
return results
# Thực hiện so sánh
merge_comparison = compare_merge_methods(hsb2, hsb_full)
# Advanced: Merge với điều kiện phức tạp
print("\n=== MERGE NÂNG CAO ===")
# Merge với tolerance (cho số liệu)
def merge_with_tolerance(df1, df2, key_col, tolerance=0.1):
"""Merge với dung sai cho biến số"""
merged_list = []
for idx, row in df1.iterrows():
key_val = row[key_col]
matches = df2[abs(df2[key_col] - key_val) <= tolerance]
if not matches.empty:
# Lấy match gần nhất
closest_match = matches.iloc[0]
merged_row = pd.concat([row, closest_match])
merged_list.append(merged_row)
return pd.DataFrame(merged_list)
# Merge conditional
def conditional_merge(df1, df2, conditions):
"""Merge với điều kiện tùy chỉnh"""
results = []
for idx, row1 in df1.iterrows():
for jdx, row2 in df2.iterrows():
if all(conditions(row1, row2)):
merged_row = pd.concat([row1, row2])
results.append(merged_row)
break
return pd.DataFrame(results)
# Lưu kết quả ra file
print("\n=== LƯU KẾT QUẢ ===")
# Lưu ra SPSS format
pyreadstat.write_sav(inner_merged, "merged_inner_python.sav")
pyreadstat.write_sav(left_merged, "merged_left_python.sav")
pyreadstat.write_sav(outer_merged, "merged_outer_python.sav")
# Lưu ra CSV
inner_merged.to_csv("merged_inner_python.csv", index=False)
left_merged.to_csv("merged_left_python.csv", index=False)
# Lưu ra Excel với nhiều sheet
with pd.ExcelWriter("merge_results_python.xlsx") as writer:
inner_merged.to_excel(writer, sheet_name="Inner_Merge", index=False)
left_merged.to_excel(writer, sheet_name="Left_Merge", index=False)
outer_merged.to_excel(writer, sheet_name="Outer_Merge", index=False)
# Thêm sheet so sánh
comparison_df = pd.DataFrame(merge_comparison).T
comparison_df.to_excel(writer, sheet_name="Comparison")
# Tạo báo cáo tổng hợp
def create_merge_report(merge_results):
"""Tạo báo cáo tổng hợp về quá trình merge"""
report = {
'timestamp': pd.Timestamp.now(),
'original_files': {
'hsb1': hsb1.shape,
'hsb2': hsb2.shape,
'hsb_full': hsb_full.shape
},
'merge_results': {}
}
for method, result in merge_results.items():
report['merge_results'][method] = {
'shape': (result['observations'], result['variables']),
'missing_values': result['missing_values'],
'data_quality_score': 100 - (result['missing_values'] /
(result['observations'] * result['variables']) * 100)
}
return report
# Tạo và lưu báo cáo
final_report = create_merge_report(merge_comparison)
# In báo cáo
print("\n=== BÁO CÁO TỔNG HỢP ===")
print(f"Thời gian thực hiện: {final_report['timestamp']}")
print("\nFile gốc:")
for file, shape in final_report['original_files'].items():
print(f" {file}: {shape[0]} quan sát × {shape[1]} biến")
print("\nKết quả merge:")
for method, stats in final_report['merge_results'].items():
print(f" {method}: {stats['shape'][0]} quan sát × {stats['shape'][1]} biến")
print(f" Missing values: {stats['missing_values']}")
print(f" Data quality score: {stats['data_quality_score']:.1f}%")
print("\nHoàn thành quá trình nối dữ liệu!")
Tài liệu tham khảo
- 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.
- Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics. 5th Edition. SAGE Publications.
- 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.
- Wickham, H., & Grolemund, G. (2017). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.