KTL cơ bảnXử lý dữ liệu

Lọc quan sát với SPSS

Lọc quan sát và tách dữ liệu trong thực hành kinh tế lượng với SPSS

Tóm tắt: Lọc quan sát và tách dữ liệu là hai kỹ thuật thiết yếu trong thực hành kinh tế lượng với SPSS. Bài viết này hướng dẫn chi tiết cách sử dụng công cụ Select Cases để lọc các quan sát thỏa mãn điều kiện cụ thể và Split File để tách dữ liệu thành các nhóm phân tích riêng biệt. Thông qua giao diện đồ họa trực quan của SPSS, các bạn sẽ học cách áp dụng các điều kiện lọc phức tạp và so sánh các chỉ tiêu theo nhóm một cách hiệu quả cho nghiên cứu kinh tế.

Giới thiệu về lọc quan sát và tách dữ liệu

Nội dung chính

Trong thực hành kinh tế lượng, việc xử lý và chuẩn bị dữ liệu là bước quan trọng quyết định đến chất lượng của toàn bộ quá trình phân tích. Không phải lúc nào dữ liệu thô cũng được sắp xếp sẵn sàng để đáp ứng các yêu cầu phân tích cụ thể. Thường xuyên, các nhà nghiên cứu cần lọc quan sát hoặc tách dữ liệu để tạo ra các tập con phù hợp với mục tiêu nghiên cứu.

Hai kỹ thuật chính mà chúng ta sẽ tìm hiểu trong bài viết này bao gồm:

  • Lọc quan sát (Select Cases): Chọn lọc các quan sát thỏa mãn điều kiện cụ thể
  • Tách dữ liệu (Split File): Chia nhỏ dữ liệu thành các nhóm để phân tích riêng biệt

Ví dụ minh họa trong bối cảnh Việt Nam

Để hiểu rõ tầm quan trọng của hai kỹ thuật này, hãy xem xét một nghiên cứu thực tế về thị trường lao động Việt Nam. Giả sử chúng ta có dữ liệu khảo sát về 1000 lao động trên toàn quốc, bao gồm thông tin về giới tính, độ tuổi, trình độ học vấn, và mức lương.

Khi thực hiện nghiên cứu về “Ảnh hưởng của giới tính đến mức lương trong ngành công nghệ thông tin”, chúng ta cần:

  • Lọc quan sát: Chỉ chọn những lao động làm việc trong ngành CNTT
  • Tách dữ liệu: Phân tích riêng biệt cho từng nhóm tuổi hoặc trình độ học vấn
  • So sánh nhóm: Đánh giá sự khác biệt giữa nam và nữ trong từng phân nhóm

Đây chính là lúc các công cụ Select Cases và Split File trong SPSS trở nên vô cùng hữu ích.

Tầm quan trọng trong thực hành kinh tế lượng

Việc lọc quan sát và tách dữ liệu mang lại những lợi ích quan trọng trong thực hành kinh tế lượng:

Tăng độ chính xác của phân tích

  • Loại bỏ các quan sát không liên quan đến câu hỏi nghiên cứu
  • Giảm thiểu nhiễu trong dữ liệu
  • Tập trung vào nhóm đối tượng cụ thể
  • Tăng tính đồng nhất của mẫu nghiên cứu

Hỗ trợ phân tích so sánh

Khi nghiên cứu các hiện tượng kinh tế, việc so sánh giữa các nhóm là điều không thể thiếu:

  • So sánh theo địa vùng: Miền Bắc vs Miền Nam
  • So sánh theo thời gian: Trước và sau chính sách
  • So sánh theo đặc điểm: Doanh nghiệp nhà nước vs tư nhân
  • So sánh theo nhóm tuổi: Lao động trẻ vs lao động có kinh nghiệm

Tối ưu hóa hiệu quả phân tích

  • Giảm thời gian xử lý dữ liệu lớn
  • Tăng tốc độ chạy các phép tính thống kê
  • Dễ dàng tulip xuất kết quả theo nhóm
  • Hỗ trợ tạo báo cáo phân tầng

Phần I: Lọc quan sát với Select Cases

Lọc quan sát là quá trình chọn ra những quan sát thỏa mãn các tiêu chí cụ thể từ tổng thể dữ liệu. Trong SPSS, công cụ Select Cases cung cấp giao diện trực quan để thực hiện nhiệm vụ này một cách hiệu quả.

Chuẩn bị dữ liệu mẫu

Để thực hành, chúng ta sử dụng file dữ liệu mẫu được thiết kế đặc biệt cho bài học này. File dữ liệu chứa thông tin về lao động với các biến chính:

  • sex: Giới tính (1 = nữ, 2 = nam)
  • age: Nhóm tuổi (1-5 tương ứng các khoảng tuổi khác nhau)
  • education: Trình độ học vấn
  • income: Mức thu nhập
Tải về dữ liệu mẫu

Hướng dẫn thực hiện lọc quan sát cơ bản

Để minh họa quá trình lọc quan sát, chúng ta sẽ thực hiện việc chọn lọc chỉ những lao động nữ để phân tích riêng. Quá trình này được thực hiện theo các bước sau:

Bước 1: Mở dữ liệu và truy cập công cụ

  1. Mở file loc-quan-sat.sav trong SPSS
  2. Vào menu Data → chọn Select Cases…

Giao diện menu Data - Select Cases trong SPSS

Bước 2: Cấu hình điều kiện lọc

Cửa sổ Select Cases sẽ hiện ra với nhiều tùy chọn lọc khác nhau. Để lọc theo điều kiện cụ thể:

  1. Chọn If condition is satisfied trong cửa sổ Select Cases

Cửa sổ Select Cases với tùy chọn If condition is satisfied

Bước 3: Thiết lập biểu thức điều kiện

  1. Bấm vào nút If… để mở cửa sổ Select Cases: If
  2. Chọn biến sex từ danh sách bên trái
  3. Nhập biểu thức điều kiện =1 (vì giá trị 1 đại diện cho nữ giới)

Cửa sổ Select Cases If với biểu thức điều kiện sex=1

Lưu ý về mã hóa dữ liệu: Trong file dữ liệu mẫu, giá trị “1” được mã hóa cho giới tính nữ (female). Các bạn cần kiểm tra cách mã hóa trong Variable View để đảm bảo sử dụng đúng giá trị.

Bước 4: Chọn phương thức xử lý

  1. Bấm Continue để quay lại cửa sổ Select Cases
  2. Tại đây, có ba tùy chọn xử lý dữ liệu:
  • Filter out unselected cases: Ẩn các quan sát không thỏa mãn (khuyến nghị)
  • Copy selected cases to a new dataset: Tạo dataset mới với dữ liệu đã lọc
  • Delete unselected cases: Xóa vĩnh viễn các quan sát không thỏa mãn

Cửa sổ Select Cases với các tùy chọn xử lý dữ liệu

Chúng ta chọn Filter out unselected cases và bấm OK.

Bước 5: Kiểm tra kết quả

Sau khi thực hiện lọc, SPSS sẽ hiển thị kết quả trong Data View:

Kết quả lọc quan sát trong Data View của SPSS

Kết quả quan sát được:

  • Các quan sát nam giới được đánh dấu bằng đường gạch chéo (bị lọc ra)
  • Cột filter_$ mới xuất hiện với giá trị 1 cho quan sát được chọn
  • Chỉ các quan sát nữ giới được giữ lại cho phân tích tiếp theo

Lọc quan sát với điều kiện phức tạp

Trong thực hành kinh tế lượng thực tế, chúng ta thường cần áp dụng nhiều điều kiện cùng lúc. SPSS hỗ trợ việc kết hợp các điều kiện thông qua các toán tử logic.

Ví dụ: Lọc lao động nữ trong độ tuổi từ 28-31

Để lọc các quan sát là lao động nữ trong nhóm tuổi cụ thể, chúng ta sử dụng biểu thức điều kiện kết hợp:

(sex=1) & (age=4)

Trong đó:

  • & là toán tử AND (và)
  • | là toán tử OR (hoặc)
  • = là toán tử bằng
  • <> là toán tử khác
  • >, <, >=, <= là các toán tử so sánh

Biểu thức điều kiện phức tạp trong SPSS Select Cases

Kết quả sau khi áp dụng điều kiện phức tạp:

Kết quả lọc với điều kiện phức tạp trong SPSS

Các toán tử và hàm hữu ích

SPSS cung cấp nhiều toán tử và hàm để tạo ra các điều kiện lọc phức tạp:

Toán tửÝ nghĩaVí dụ
&AND (và)(sex=1) & (age>2)
|OR (hoặc)(education=1) | (education=5)
~NOT (không)~(income<3)
RANGETrong khoảngRANGE(age,2,4)
MISSINGGiá trị thiếuMISSING(income)

Quản lý và tắt bộ lọc

Sau khi thực hiện lọc, các bạn có thể:

  • Reset bộ lọc: Bấm nút Reset trong cửa sổ Select Cases
  • Tắt hoàn toàn: Chọn All cases thay vì If condition is satisfied
  • Chỉnh sửa điều kiện: Mở lại Select Cases và thay đổi biểu thức
  • Kiểm tra trạng thái: Quan sát cột filter_$ để xác nhận

Phần II: Tách dữ liệu với Split File

Tách dữ liệu là kỹ thuật chia nhỏ dataset thành các nhóm con để thực hiện phân tích riêng biệt cho từng nhóm. Đây là công cụ mạnh mẽ khi chúng ta cần so sánh các chỉ tiêu thống kê giữa các nhóm khác nhau.

Ứng dụng trong nghiên cứu kinh tế

Trong thực hành kinh tế lượng, Split File đặc biệt hữu ích khi:

  • So sánh hiệu quả kinh doanh giữa các ngành
  • Phân tích xu hướng theo thời gian cho từng vùng miền
  • Đánh giá tác động chính sách theo nhóm doanh nghiệp
  • Nghiên cứu hành vi tiêu dùng theo nhóm tuổi

Hướng dẫn thực hiện Split File

Để minh họa, chúng ta sẽ thực hiện việc tách dữ liệu theo nhóm tuổi để đánh giá phân bố giới tính trong từng nhóm tuổi.

Bước 1: Truy cập công cụ Split File

Từ menu chính của SPSS:

  1. Chọn DataSplit File…

Giao diện menu Data - Split File trong SPSS

Bước 2: Cấu hình tách dữ liệu

Cửa sổ Split File sẽ mở ra với các tùy chọn:

  1. Chọn Compare groups để so sánh các nhóm
  2. Đưa biến age vào ô Groups Based on

Cửa sổ Split File với cấu hình Compare groups theo age

Các tùy chọn Split File:

  • Analyze all cases, do not create groups: Không tách dữ liệu (mặc định)
  • Compare groups: Tách và hiển thị kết quả so sánh
  • Organize output by groups: Tách và sắp xếp kết quả theo nhóm

Bước 3: Thực hiện và kiểm tra kết quả

  1. Bấm OK để áp dụng cấu hình

Sau khi Split File được kích hoạt, Data View sẽ hiển thị dữ liệu đã được sắp xếp theo nhóm:

Kết quả sau khi Split File theo age trong SPSS

Thực hiện phân tích trên dữ liệu đã tách

Một khi Split File đã được kích hoạt, mọi phân tích tiếp theo sẽ được thực hiện riêng biệt cho từng nhóm tuổi. Để minh họa, chúng ta sẽ tạo bảng tần suất cho biến giới tính:

Tạo bảng tần suất theo nhóm

  1. Vào menu AnalyzeDescriptive StatisticsFrequencies
  2. Đưa biến sex vào khung Variable(s)
  3. Bấm OK để thực hiện

Cửa sổ Frequencies với biến sex trong SPSS

Diễn giải kết quả

Kết quả sẽ hiển thị bảng tần suất riêng biệt cho từng nhóm tuổi:

Kết quả bảng tần suất theo nhóm tuổi trong SPSS

Lợi ích của kết quả Split File:

  • Dễ dàng so sánh phân bố giới tính giữa các nhóm tuổi
  • Phát hiện xu hướng và mẫu hình trong từng nhóm
  • Tự động tính toán thống kê riêng cho mỗi nhóm
  • Hỗ trợ tạo báo cáo phân tầng chuyên nghiệp

Quản lý và tắt Split File

Để tắt chức năng Split File và quay về phân tích toàn bộ dữ liệu:

  • Mở lại menu DataSplit File
  • Chọn “Analyze all cases, do not create groups
  • Bấm OK để áp dụng
  • Kiểm tra Data View để đảm bảo dữ liệu đã được reset

Ứng dụng nâng cao trong thực hành kinh tế lượng

Việc kết hợp Select CasesSplit File mở ra nhiều khả năng phân tích mạnh mẽ trong thực hành kinh tế lượng:

Kịch bản phân tích phức tạp

Nghiên cứu case: Phân tích chênh lệch lương theo giới tính

Giả sử chúng ta muốn nghiên cứu chênh lệch lương giữa nam và nữ trong ngành tài chính. Quy trình phân tích sẽ bao gồm:

  • Bước 1: Sử dụng Select Cases để lọc chỉ lao động ngành tài chính
  • Bước 2: Áp dụng Split File theo trình độ học vấn
  • Bước 3: Thực hiện t-test so sánh lương giữa nam và nữ trong từng nhóm học vấn
  • Bước 4: Phân tích kết quả và rút ra kết luận

Nghiên cứu case: Hiệu quả chính sách theo vùng miền

Để đánh giá tác động của một chính sách kinh tế:

  1. Lọc dữ liệu: Chọn thời kì trước và sau chính sách
  2. Tách theo vùng: Split File theo vùng (Bắc/Trung/Nam)
  3. So sánh chỉ số: Phân tích GDP, tỉ lệ thất nghiệp…
  4. Đánh giá tác động: Xác định vùng nào được hưởng lợi nhiều nhất

Best practices và lưu ý

  • Backup dữ liệu: Luôn sao lưu file gốc trước khi lọc
  • Ghi chú quy trình: Ghi chú các bước lọc để tái lập
  • Kiểm tra kết quả: Verify số lượng quan sát sau mỗi bước
  • Reset sau phân tích: Tắt filter và split để tránh nhầm lẫn

Lưu ý quan trọng và cảnh báo

Khi sử dụng các công cụ lọc và tách dữ liệu trong thực hành kinh tế lượng, cần chú ý những điểm sau:

Về tính đại diện của mẫu

Cảnh báo quan trọng: Việc lọc quá nhiều quan sát có thể làm giảm tính đại diện của mẫu và ảnh hưởng đến khả năng tổng quát hóa kết quả. Cần cân nhắc kỹ lưỡng giữa việc tăng độ chính xác và duy trì tính đại diện.

Về báo cáo kết quả

  • Minh bạch quy trình: Báo cáo đầy đủ các bước lọc dữ liệu
  • Justify lựa chọn: Giải thích lý do cho mỗi điều kiện lọc
  • Kiểm tra robustness: Kiểm tra với các tiêu chí lọc khác nhau
  • Thảo luận limitation: Nêu rõ hạn chế do việc lọc dữ liệu

Các lỗi thường gặp

Lỗi phổ biến khi lọc và tách dữ liệu:

  • Quên tắt filter/split trước phân tích mới
  • Sử dụng sai mã hóa biến trong điều kiện
  • Lọc quá nghiêm khắt dẫn đến mẫu quá nhỏ
  • Không kiểm tra phân phối sau khi lọc
  • Không backup dữ liệu gốc

Tổng kết

Lọc quan sát và tách dữ liệu là hai kỹ thuật nền tảng trong thực hành kinh tế lượng với SPSS. Thông qua việc sử dụng công cụ Select CasesSplit File, các nhà nghiên cứu có thể:

  1. Đầu tiên, tối ưu hóa chất lượng dữ liệu bằng cách loại bỏ các quan sát không liên quan và tập trung vào nhóm đối tượng cụ thể. Điều này giúp tăng độ chính xác và ý nghĩa của các kết quả phân tích.
  2. Thứ hai, thực hiện phân tích so sánh hiệu quả giữa các nhóm khác nhau. Split File cho phép tự động tạo ra các báo cáo phân tầng, giúp nhận diện các mẫu hình và xu hướng trong từng phân nhóm.
  3. Thứ ba, hỗ trợ nghiên cứu đa chiều và phức tạp. Việc kết hợp hai kỹ thuật này mở ra khả năng thực hiện các nghiên cứu tinh vi về các hiện tượng kinh tế đa dạng.
  4. Cuối cùng, việc nắm vững các kỹ thuật này là điều kiện tiên quyết để các bạn sinh viên có thể tiến hành các nghiên cứu thực hành kinh tế lượng chuyên nghiệp và đạt kết quả tin cậy.

Điểm chính cần nhớ:

  • Select Cases giúp lọc quan sát theo điều kiện cụ thể
  • Split File hỗ trợ phân tích so sánh giữa các nhóm
  • Có thể kết hợp nhiều điều kiện phức tạp với các toán tử logic
  • Luôn backup dữ liệu gốc trước khi thực hiện lọc
  • Cần tắt filter/split sau khi hoàn thành phân tích
  • Báo cáo minh bạch các bước xử lý dữ liệu trong nghiên cứu

Phụ lục: Code trong các phần mềm khác

Để hỗ trợ các bạn làm quen với nhiều công cụ phân tích khác nhau trong thực hành kinh tế lượng, phần này cung cấp code tương đương cho việc lọc quan sát và tách dữ liệu trong SPSS Syntax, Stata, R và Python.

SPSS Syntax

SPSS Syntax (.sps)


* Lọc quan sát và tách dữ liệu trong SPSS Syntax
* Mở file dữ liệu
GET FILE='/data/loc-quan-sat.sav'.

* ====================
* PHẦN 1: LỌC QUAN SÁT
* ====================

* Lọc chỉ lao động nữ (sex = 1)
SELECT IF (sex = 1).
EXECUTE.

* Hoặc sử dụng USE ALL để reset
USE ALL.

* Lọc với điều kiện phức tạp: nữ giới từ 28-31 tuổi
SELECT IF (sex = 1 AND age = 4).
EXECUTE.

* Lọc nhiều điều kiện với OR
SELECT IF (education = 1 OR education = 5).
EXECUTE.

* Lọc với khoảng giá trị
SELECT IF (RANGE(income, 2, 4)).
EXECUTE.

* Lọc loại bỏ missing values
SELECT IF NOT(MISSING(income)).
EXECUTE.

* Tạo filter variable thay vì xóa dữ liệu
COMPUTE filter_var = (sex = 1 AND age = 4).
FILTER BY filter_var.

* Reset filter
FILTER OFF.

* ====================
* PHẦN 2: TÁCH DỮ LIỆU
* ====================

* Tách dữ liệu theo nhóm tuổi
SORT CASES BY age.
SPLIT FILE SEPARATE BY age.

* Thực hiện phân tích tần suất theo nhóm
FREQUENCIES VARIABLES=sex
  /ORDER=ANALYSIS
  /STATISTICS=DEFAULT.

* Tách theo nhiều biến
SORT CASES BY age sex.
SPLIT FILE SEPARATE BY age sex.

* Phân tích mô tả theo nhóm
DESCRIPTIVES VARIABLES=income
  /STATISTICS=MEAN STDDEV MIN MAX.

* So sánh nhóm với layered output
SPLIT FILE LAYERED BY age.
CROSSTABS
  /TABLES=sex BY education
  /FORMAT=AVALUE TABLES
  /STATISTICS=CHISQ 
  /CELLS=COUNT EXPECTED ROW COLUMN TOTAL.

* Reset split file
SPLIT FILE OFF.

* ====================
* VÍ DỤ ỨNG DỤNG THỰC TẾ
* ====================

* Nghiên cứu case: Phân tích lương theo giới tính trong từng ngành
* Bước 1: Lọc ngành tài chính (giả sử industry = 3)
SELECT IF (industry = 3).

* Bước 2: Tách theo trình độ học vấn
SORT CASES BY education.
SPLIT FILE SEPARATE BY education.

* Bước 3: So sánh lương giữa nam và nữ
T-TEST GROUPS=sex(1 2)
  /MISSING=ANALYSIS
  /VARIABLES=salary
  /CRITERIA=CI(.95).

* Bước 4: Reset để phân tích khác
USE ALL.
SPLIT FILE OFF.

* ====================
* XỬ LÝ DỮ LIỆU NÂNG CAO
* ====================

* Tạo biến phân nhóm tuổi mới
RECODE age (1=1) (2=1) (3=2) (4=2) (5=3) INTO age_group.
VALUE LABELS age_group
  1 'Trẻ (<=27)' 2 'Trung niên (28-35)' 3 'Lớn tuổi (>35)'.

* Lọc và phân tích theo nhóm tuổi mới
SELECT IF (age_group >= 2).
SPLIT FILE SEPARATE BY age_group.

* Phân tích hồi quy theo nhóm
REGRESSION
  /MISSING LISTWISE
  /STATISTICS COEFF OUTS R ANOVA
  /CRITERIA=PIN(.05) POUT(.10)
  /NOORIGIN 
  /DEPENDENT salary
  /METHOD=ENTER education experience.

* Cleanup
USE ALL.
SPLIT FILE OFF.
FILTER OFF.

* Lưu dataset đã xử lý
SAVE OUTFILE='/data/processed_data.sav'
  /COMPRESSED.

Stata

Stata (.do)


* Lọc quan sát và tách dữ liệu trong Stata
* Mở dữ liệu
use "/data/loc-quan-sat.dta", clear

* ====================
* PHẦN 1: LỌC QUAN SÁT
* ====================

* Hiển thị số quan sát ban đầu
count
local total_obs = r(N)
display "Tổng số quan sát ban đầu: `total_obs'"

* Lọc chỉ lao động nữ (sex = 1)
keep if sex == 1
count
display "Sau khi lọc nữ giới: " r(N) " quan sát"

* Reload dữ liệu gốc
use "/data/loc-quan-sat.dta", clear

* Lọc với điều kiện phức tạp: nữ giới từ 28-31 tuổi
keep if sex == 1 & age == 4
count
display "Nữ giới 28-31 tuổi: " r(N) " quan sát"

* Reload và lọc nhiều điều kiện với OR
use "/data/loc-quan-sat.dta", clear
keep if education == 1 | education == 5
count
display "Học vấn thấp hoặc cao: " r(N) " quan sát"

* Reload và lọc với khoảng giá trị
use "/data/loc-quan-sat.dta", clear
keep if inrange(income, 2, 4)
count
display "Thu nhập trung bình: " r(N) " quan sát"

* Reload và lọc loại bỏ missing values
use "/data/loc-quan-sat.dta", clear
keep if !missing(income)
count
display "Không missing thu nhập: " r(N) " quan sát"

* Tạo indicator variable cho filtering
use "/data/loc-quan-sat.dta", clear
generate filter_var = (sex == 1 & age == 4)
keep if filter_var == 1

* ====================
* PHẦN 2: TÁCH DỮ LIỆU
* ====================

* Reload dữ liệu đầy đủ
use "/data/loc-quan-sat.dta", clear

* Phân tích tần suất theo nhóm tuổi
bysort age: tabulate sex

* Phân tích mô tả theo nhóm
bysort age: summarize income, detail

* Tạo bảng cross-tabulation theo nhóm
bysort age: tabulate sex education, chi2

* So sánh trung bình giữa các nhóm
bysort age: ttest income, by(sex)

* Phân tích hồi quy theo nhóm
bysort age: regress income education experience

* ====================
* VÍ DỤ ỨNG DỤNG THỰC TẾ
* ====================

* Nghiên cứu case: Phân tích chênh lệch lương theo giới tính
* Reload dữ liệu
use "/data/loc-quan-sat.dta", clear

* Bước 1: Lọc ngành tài chính (giả sử industry == 3)
keep if industry == 3

* Bước 2: Phân tích theo trình độ học vấn
foreach edu of numlist 1/5 {
    display "=== Phân tích cho trình độ học vấn `edu' ==="
    
    * T-test so sánh lương nam/nữ
    ttest salary if education == `edu', by(sex)
    
    * Regression với controls
    regress salary i.sex experience age if education == `edu'
    
    * Tính effect size
    quietly summarize salary if education == `edu' & sex == 1
    local mean_female = r(mean)
    quietly summarize salary if education == `edu' & sex == 2  
    local mean_male = r(mean)
    local diff = `mean_male' - `mean_female'
    
    display "Chênh lệch lương (Nam - Nữ): " %9.2f `diff'
}

* ====================
* XỬ LÝ DỮ LIỆU NÂNG CAO
* ====================

* Reload dữ liệu
use "/data/loc-quan-sat.dta", clear

* Tạo biến phân nhóm tuổi mới
generate age_group = .
replace age_group = 1 if inlist(age, 1, 2)
replace age_group = 2 if inlist(age, 3, 4)  
replace age_group = 3 if age == 5

label define age_group_lbl ///
    1 "Trẻ (<=27)" /// 2 "Trung niên (28-35)" /// 3 "Lớn tuổi (>35)"
label values age_group age_group_lbl

* Phân tích theo nhóm tuổi mới
bysort age_group: summarize salary, detail
bysort age_group: tabulate sex, chi2

* Tạo interaction effects
generate sex_age_interaction = sex * age_group

* Phân tích ANOVA
anova salary i.sex##i.age_group

* Vẽ biểu đồ so sánh
graph box salary, over(sex) over(age_group) ///
    title("Phân phối lương theo giới tính và nhóm tuổi") ///
    ytitle("Lương") ///
    legend(label(1 "Nữ") label(2 "Nam"))

* Lưu kết quả
save "/data/analyzed_data.dta", replace

* Xuất bảng tóm tắt
tabstat salary, by(age_group) statistics(mean sd min max n) ///
    columns(statistics) format(%9.2f)

* Tạo báo cáo theo nhóm
foreach group of numlist 1/3 {
    local group_label : label age_group_lbl `group'
    display "=== Báo cáo cho nhóm `group_label' ==="
    
    summarize salary if age_group == `group', detail
    tabulate sex if age_group == `group'
    
    correlate salary education experience if age_group == `group'
}

R

R (.R)


# Lọc quan sát và tách dữ liệu trong R
# Cài đặt và tải các package cần thiết
if (!require(dplyr)) install.packages("dplyr")
if (!require(foreign)) install.packages("foreign")
if (!require(psych)) install.packages("psych")
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(gridExtra)) install.packages("gridExtra")

library(dplyr)
library(foreign)
library(psych)
library(ggplot2)
library(gridExtra)

# Đọc dữ liệu SPSS
data <- read.spss("/data/loc-quan-sat.sav", to.data.frame = TRUE)

# Hiển thị thông tin cơ bản
cat("Thông tin dữ liệu gốc:\n")
cat("Số quan sát:", nrow(data), "\n")
cat("Số biến:", ncol(data), "\n")
str(data)

# ====================
# PHẦN 1: LỌC QUAN SÁT
# ====================

cat("\n=== PHẦN 1: LỌC QUAN SÁT ===\n")

# Backup dữ liệu gốc
data_original <- data

# Lọc chỉ lao động nữ (sex = 1)
data_female <- data %>% filter(sex == 1)
cat("Sau khi lọc nữ giới:", nrow(data_female), "quan sát\n")

# Lọc với điều kiện phức tạp: nữ giới từ 28-31 tuổi
data_female_age4 <- data %>% 
  filter(sex == 1 & age == 4)
cat("Nữ giới 28-31 tuổi:", nrow(data_female_age4), "quan sát\n")

# Lọc nhiều điều kiện với OR
data_education_extreme <- data %>% 
  filter(education == 1 | education == 5)
cat("Học vấn thấp hoặc cao:", nrow(data_education_extreme), "quan sát\n")

# Lọc với khoảng giá trị
data_middle_income <- data %>% 
  filter(income >= 2 & income <= 4)
cat("Thu nhập trung bình:", nrow(data_middle_income), "quan sát\n")

# Lọc loại bỏ missing values
data_complete <- data %>% 
  filter(!is.na(income))
cat("Không missing thu nhập:", nrow(data_complete), "quan sát\n")

# Tạo indicator variable cho filtering
data <- data %>%
  mutate(filter_var = ifelse(sex == 1 & age == 4, 1, 0))

# Hàm để lọc dữ liệu với điều kiện phức tạp
filter_data <- function(data, condition_str) {
  # Ví dụ sử dụng: filter_data(data, "sex == 1 & age %in% c(3,4)")
  filtered <- data %>% filter(eval(parse(text = condition_str)))
  cat("Điều kiện:", condition_str, "- Kết quả:", nrow(filtered), "quan sát\n")
  return(filtered)
}

# ====================
# PHẦN 2: TÁCH DỮ LIỆU VÀ PHÂN TÍCH THEO NHÓM
# ====================

cat("\n=== PHẦN 2: TÁCH DỮ LIỆU VÀ PHÂN TÍCH ===\n")

# Sử dụng dữ liệu gốc
data <- data_original

# Phân tích tần suất theo nhóm tuổi
cat("Bảng tần suất giới tính theo nhóm tuổi:\n")
frequency_by_age <- data %>%
  group_by(age, sex) %>%
  summarise(count = n(), .groups = 'drop') %>%
  spread(sex, count, fill = 0)
print(frequency_by_age)

# Phân tích mô tả theo nhóm
cat("\nThống kê mô tả thu nhập theo nhóm tuổi:\n")
desc_by_age <- data %>%
  group_by(age) %>%
  summarise(
    n = n(),
    mean_income = mean(income, na.rm = TRUE),
    sd_income = sd(income, na.rm = TRUE),
    min_income = min(income, na.rm = TRUE),
    max_income = max(income, na.rm = TRUE),
    .groups = 'drop'
  )
print(desc_by_age)

# Tạo bảng cross-tabulation với test chi-square
cat("\nCross-tabulation giới tính vs học vấn theo nhóm tuổi:\n")
cross_tab_results <- data %>%
  group_by(age) %>%
  do(chi_test = chisq.test(table(.$sex, .$education))) %>%
  mutate(
    chi_square = map_dbl(chi_test, ~.x$statistic),
    p_value = map_dbl(chi_test, ~.x$p.value)
  ) %>%
  select(-chi_test)
print(cross_tab_results)

# T-test so sánh thu nhập nam/nữ theo nhóm tuổi
cat("\nT-test so sánh thu nhập nam/nữ theo nhóm tuổi:\n")
ttest_results <- data %>%
  group_by(age) %>%
  do(ttest = t.test(income ~ sex, data = .)) %>%
  mutate(
    t_statistic = map_dbl(ttest, ~.x$statistic),
    p_value = map_dbl(ttest, ~.x$p.value),
    mean_diff = map_dbl(ttest, ~diff(.x$estimate))
  ) %>%
  select(-ttest)
print(ttest_results)

# ====================
# VÍ DỤ ỨNG DỤNG THỰC TẾ
# ====================

cat("\n=== VÍ DỤ ỨNG DỤNG: PHÂN TÍCH CHÊNH LỆCH LƯƠNG ===\n")

# Giả sử có biến industry, lọc ngành tài chính
# data_finance <- data %>% filter(industry == 3)

# Sử dụng dữ liệu hiện tại để demo
analyze_salary_gap <- function(data) {
  # Phân tích theo từng trình độ học vấn
  results <- data %>%
    group_by(education) %>%
    summarise(
      n = n(),
      mean_salary_male = mean(income[sex == 2], na.rm = TRUE),
      mean_salary_female = mean(income[sex == 1], na.rm = TRUE),
      salary_gap = mean_salary_male - mean_salary_female,
      gap_percentage = (salary_gap / mean_salary_female) * 100,
      .groups = 'drop'
    )
  
  return(results)
}

salary_analysis <- analyze_salary_gap(data)
print(salary_analysis)

# ====================
# XỬ LÝ DỮ LIỆU NÂNG CAO
# ====================

cat("\n=== XỬ LÝ DỮ LIỆU NÂNG CAO ===\n")

# Tạo biến phân nhóm tuổi mới
data <- data %>%
  mutate(
    age_group = case_when(
      age %in% c(1, 2) ~ 1,
      age %in% c(3, 4) ~ 2,
      age == 5 ~ 3,
      TRUE ~ NA_real_
    ),
    age_group_label = case_when(
      age_group == 1 ~ "Trẻ (<=27)", age_group == 2 ~ "Trung niên (28-35)", age_group == 3 ~ "Lớn tuổi (>35)"
    )
  )

# Phân tích ANOVA
cat("ANOVA: Thu nhập theo giới tính và nhóm tuổi\n")
anova_model <- aov(income ~ factor(sex) * factor(age_group), data = data)
summary(anova_model)

# Tạo interaction effects
data <- data %>%
  mutate(sex_age_interaction = sex * age_group)

# Regression analysis theo nhóm
cat("\nRegression analysis theo nhóm tuổi:\n")
regression_by_group <- data %>%
  group_by(age_group_label) %>%
  do(model = lm(income ~ sex + education, data = .)) %>%
  mutate(
    r_squared = map_dbl(model, ~summary(.x)$r.squared),
    sex_coeff = map_dbl(model, ~coef(.x)["sex"]),
    sex_p_value = map_dbl(model, ~summary(.x)$coefficients["sex", "Pr(>|t|)"])
  ) %>%
  select(-model)
print(regression_by_group)

# ====================
# VISUALIZATION
# ====================

cat("\n=== TẠO BIỂU ĐỒ MINH HỌA ===\n")

# Biểu đồ phân phối thu nhập theo nhóm
p1 <- ggplot(data, aes(x = factor(age_group_label), y = income, fill = factor(sex))) +
  geom_boxplot() +
  labs(
    title = "Phân phối thu nhập theo giới tính và nhóm tuổi",
    x = "Nhóm tuổi",
    y = "Thu nhập",
    fill = "Giới tính"
  ) +
  scale_fill_manual(values = c("lightblue", "lightpink"),
                    labels = c("Nữ", "Nam")) +
  theme_minimal()

# Biểu đồ tần suất
p2 <- data %>%
  count(age_group_label, sex) %>%
  ggplot(aes(x = age_group_label, y = n, fill = factor(sex))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Số lượng quan sát theo giới tính và nhóm tuổi",
    x = "Nhóm tuổi",
    y = "Số quan sát",
    fill = "Giới tính"
  ) +
  scale_fill_manual(values = c("lightblue", "lightpink"),
                    labels = c("Nữ", "Nam")) +
  theme_minimal()

# Hiển thị biểu đồ
grid.arrange(p1, p2, ncol = 1)

# ====================
# EXPORT RESULTS
# ====================

cat("\n=== XUẤT KẾT QUẢ ===\n")

# Tạo summary report
create_summary_report <- function(data) {
  report <- list(
    total_observations = nrow(data),
    missing_data = colSums(is.na(data)),
    summary_stats = describe(data[sapply(data, is.numeric)]),
    frequency_tables = lapply(data[sapply(data, is.factor)], table)
  )
  return(report)
}

summary_report <- create_summary_report(data)

# Lưu kết quả
write.csv(salary_analysis, "salary_gap_analysis.csv", row.names = FALSE)
write.csv(desc_by_age, "descriptive_by_age.csv", row.names = FALSE)
write.csv(regression_by_group, "regression_by_group.csv", row.names = FALSE)

# Lưu dữ liệu đã xử lý
save(data, file = "processed_data.RData")

cat("Đã xuất các file kết quả:\n")
cat("- salary_gap_analysis.csv\n")
cat("- descriptive_by_age.csv\n") 
cat("- regression_by_group.csv\n")
cat("- processed_data.RData\n")

# ====================
# ADVANCED FUNCTIONS
# ====================

# Hàm phân tích tổng hợp
comprehensive_analysis <- function(data, group_var, outcome_var, treatment_var) {
  group_var <- enquo(group_var)
  outcome_var <- enquo(outcome_var)
  treatment_var <- enquo(treatment_var)
  
  results <- data %>%
    group_by(!!group_var) %>%
    summarise(
      n = n(),
      mean_outcome = mean(!!outcome_var, na.rm = TRUE),
      sd_outcome = sd(!!outcome_var, na.rm = TRUE),
      treatment_effect = mean(!!outcome_var[!!treatment_var == 2], na.rm = TRUE) - 
                        mean(!!outcome_var[!!treatment_var == 1], na.rm = TRUE),
      .groups = 'drop'
    )
  
  return(results)
}

# Ví dụ sử dụng hàm
analysis_results <- comprehensive_analysis(data, age_group, income, sex)
print(analysis_results)

cat("\nHoàn thành phân tích lọc quan sát và tách dữ liệu!\n")

Python

Python (.py)


# Lọc quan sát và tách dữ liệu trong Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import pyreadstat
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings('ignore')

# Thiết lập matplotlib cho tiếng Việt
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['figure.figsize'] = (12, 8)

print("LỌC QUAN SÁT VÀ TÁCH DỮ LIỆU TRONG PYTHON")
print("="*50)

# Đọc dữ liệu SPSS
try:
    data, meta = pyreadstat.read_sav('/data/loc-quan-sat.sav')
    print("✅ Đọc dữ liệu SPSS thành công")
except Exception as e:
    print(f"⚠️ Lỗi đọc file: {e}")
    # Tạo dữ liệu mẫu cho demo
    np.random.seed(123)
    data = pd.DataFrame({
        'sex': np.random.choice([1, 2], size=200, p=[0.6, 0.4]),
        'age': np.random.choice([1, 2, 3, 4, 5], size=200),
        'education': np.random.choice([1, 2, 3, 4, 5], size=200),
        'income': np.random.choice([1, 2, 3, 4, 5], size=200),
        'industry': np.random.choice([1, 2, 3, 4], size=200)
    })
    print("✅ Tạo dữ liệu mẫu thành công")

# Hiển thị thông tin cơ bản
print(f"\nThông tin dữ liệu gốc:")
print(f"Số quan sát: {len(data)}")
print(f"Số biến: {len(data.columns)}")
print(f"Tên các biến: {list(data.columns)}")

# Backup dữ liệu gốc
data_original = data.copy()

# ====================
# PHẦN 1: LỌC QUAN SÁT
# ====================

print(f"\n{'='*20}")
print("PHẦN 1: LỌC QUAN SÁT")
print(f"{'='*20}")

# Lọc chỉ lao động nữ (sex = 1)
data_female = data[data['sex'] == 1].copy()
print(f"Sau khi lọc nữ giới: {len(data_female)} quan sát")

# Lọc với điều kiện phức tạp: nữ giới từ 28-31 tuổi
data_female_age4 = data[(data['sex'] == 1) & (data['age'] == 4)].copy()
print(f"Nữ giới 28-31 tuổi: {len(data_female_age4)} quan sát")

# Lọc nhiều điều kiện với OR
data_education_extreme = data[(data['education'] == 1) | (data['education'] == 5)].copy()
print(f"Học vấn thấp hoặc cao: {len(data_education_extreme)} quan sát")

# Lọc với khoảng giá trị
data_middle_income = data[(data['income'] >= 2) & (data['income'] <= 4)].copy() print(f"Thu nhập trung bình: {len(data_middle_income)} quan sát") # Lọc loại bỏ missing values data_complete = data.dropna(subset=['income']).copy() print(f"Không missing thu nhập: {len(data_complete)} quan sát") # Tạo indicator variable cho filtering data['filter_var'] = ((data['sex'] == 1) & (data['age'] == 4)).astype(int) # Hàm để lọc dữ liệu với điều kiện phức tạp def filter_data(df, condition_str, description=""): """ Lọc dữ liệu theo điều kiện string Ví dụ: filter_data(data, "(sex == 1) & (age.isin([3,4]))", "Nữ tuổi trung niên") """ try: filtered = df.query(condition_str).copy() print(f"Điều kiện '{description}': {condition_str} - Kết quả: {len(filtered)} quan sát") return filtered except Exception as e: print(f"Lỗi khi lọc: {e}") return df.copy() # Ví dụ sử dụng hàm lọc nâng cao advanced_filter_examples = [ ("(sex == 1) & (age >= 3)", "Nữ từ trung niên trở lên"),
    ("education.isin([1, 5]) & (income > 2)", "Học vấn thấp/cao + thu nhập khá"),
    ("(sex == 2) | (income >= 4)", "Nam hoặc thu nhập cao"),
]

for condition, desc in advanced_filter_examples:
    filter_data(data, condition, desc)

# ====================
# PHẦN 2: TÁCH DỮ LIỆU VÀ PHÂN TÍCH THEO NHÓM
# ====================

print(f"\n{'='*30}")
print("PHẦN 2: TÁCH DỮ LIỆU VÀ PHÂN TÍCH")
print(f"{'='*30}")

# Sử dụng dữ liệu gốc
data = data_original.copy()

# Phân tích tần suất theo nhóm tuổi
print("Bảng tần suất giới tính theo nhóm tuổi:")
frequency_by_age = pd.crosstab(data['age'], data['sex'], margins=True)
print(frequency_by_age)

# Phân tích mô tả theo nhóm
print("\nThống kê mô tả thu nhập theo nhóm tuổi:")
desc_by_age = data.groupby('age')['income'].agg([
    'count', 'mean', 'std', 'min', 'max'
]).round(2)
print(desc_by_age)

# Tạo bảng cross-tabulation với test chi-square
print("\nChi-square test giới tính vs học vấn theo nhóm tuổi:")
chi_square_results = []
for age_group in data['age'].unique():
    subset = data[data['age'] == age_group]
    contingency_table = pd.crosstab(subset['sex'], subset['education'])
    chi2, p_value, dof, expected = stats.chi2_contingency(contingency_table)
    chi_square_results.append({
        'age_group': age_group,
        'chi_square': chi2,
        'p_value': p_value,
        'significant': p_value < 0.05 }) chi_square_df = pd.DataFrame(chi_square_results) print(chi_square_df) # T-test so sánh thu nhập nam/nữ theo nhóm tuổi print("\nT-test so sánh thu nhập nam/nữ theo nhóm tuổi:") ttest_results = [] for age_group in data['age'].unique(): subset = data[data['age'] == age_group] female_income = subset[subset['sex'] == 1]['income'].dropna() male_income = subset[subset['sex'] == 2]['income'].dropna() if len(female_income) > 1 and len(male_income) > 1:
        t_stat, p_value = stats.ttest_ind(male_income, female_income)
        mean_diff = male_income.mean() - female_income.mean()
        ttest_results.append({
            'age_group': age_group,
            't_statistic': t_stat,
            'p_value': p_value,
            'mean_difference': mean_diff,
            'significant': p_value < 0.05 }) ttest_df = pd.DataFrame(ttest_results) print(ttest_df) # ==================== # VÍ DỤ ỨNG DỤNG THỰC TẾ # ==================== print(f"\n{'='*40}") print("VÍ DỤ ỨNG DỤNG: PHÂN TÍCH CHÊNH LỆCH LƯƠNG") print(f"{'='*40}") def analyze_salary_gap(df, group_col, outcome_col, gender_col): """ Phân tích chênh lệch lương theo nhóm """ results = [] for group in df[group_col].unique(): subset = df[df[group_col] == group] male_data = subset[subset[gender_col] == 2][outcome_col].dropna() female_data = subset[subset[gender_col] == 1][outcome_col].dropna() if len(male_data) > 0 and len(female_data) > 0:
            mean_male = male_data.mean()
            mean_female = female_data.mean()
            salary_gap = mean_male - mean_female
            gap_percentage = (salary_gap / mean_female) * 100 if mean_female > 0 else 0
            
            results.append({
                'group': group,
                'n_total': len(subset),
                'n_male': len(male_data),
                'n_female': len(female_data),
                'mean_salary_male': mean_male,
                'mean_salary_female': mean_female,
                'salary_gap': salary_gap,
                'gap_percentage': gap_percentage
            })
    
    return pd.DataFrame(results)

# Phân tích chênh lệch theo trình độ học vấn
salary_analysis = analyze_salary_gap(data, 'education', 'income', 'sex')
print("Phân tích chênh lệch thu nhập theo trình độ học vấn:")
print(salary_analysis.round(2))

# ====================
# XỬ LÝ DỮ LIỆU NÂNG CAO
# ====================

print(f"\n{'='*30}")
print("XỬ LÝ DỮ LIỆU NÂNG CAO")
print(f"{'='*30}")

# Tạo biến phân nhóm tuổi mới
def create_age_groups(age):
    if age in [1, 2]:
        return 1
    elif age in [3, 4]:
        return 2
    elif age == 5:
        return 3
    else:
        return np.nan

data['age_group'] = data['age'].apply(create_age_groups)
data['age_group_label'] = data['age_group'].map({
    1: 'Trẻ (<=27)', 2: 'Trung niên (28-35)', 3: 'Lớn tuổi (>35)'
})

# ANOVA: Thu nhập theo giới tính và nhóm tuổi
print("ANOVA: Thu nhập theo giới tính và nhóm tuổi")
groups = []
for sex in [1, 2]:
    for age_grp in [1, 2, 3]:
        subset_income = data[(data['sex'] == sex) & (data['age_group'] == age_grp)]['income'].dropna()
        if len(subset_income) > 0:
            groups.append(subset_income)

if len(groups) > 1:
    f_stat, p_value = stats.f_oneway(*groups)
    print(f"F-statistic: {f_stat:.4f}, p-value: {p_value:.4f}")
else:
    print("Không đủ dữ liệu cho ANOVA")

# Regression analysis theo nhóm
print("\nRegression analysis theo nhóm tuổi:")
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

regression_results = []
for age_grp in data['age_group'].unique():
    if pd.isna(age_grp):
        continue
        
    subset = data[data['age_group'] == age_grp].dropna(subset=['income', 'sex', 'education'])
    
    if len(subset) > 5:  # Cần ít nhất 5 quan sát
        X = subset[['sex', 'education']]
        y = subset['income']
        
        model = LinearRegression()
        model.fit(X, y)
        y_pred = model.predict(X)
        r_squared = r2_score(y, y_pred)
        
        regression_results.append({
            'age_group': age_grp,
            'age_group_label': data[data['age_group'] == age_grp]['age_group_label'].iloc[0],
            'n_obs': len(subset),
            'r_squared': r_squared,
            'sex_coefficient': model.coef_[0],
            'education_coefficient': model.coef_[1],
            'intercept': model.intercept_
        })

regression_df = pd.DataFrame(regression_results)
print(regression_df.round(4))

# ====================
# VISUALIZATION
# ====================

print(f"\n{'='*20}")
print("TẠO BIỂU ĐỒ MINH HỌA")
print(f"{'='*20}")

# Thiết lập style
plt.style.use('seaborn-v0_8')
fig, axes = plt.subplots(2, 2, figsize=(15, 12))

# Biểu đồ 1: Boxplot phân phối thu nhập
sns.boxplot(data=data, x='age_group_label', y='income', hue='sex', ax=axes[0,0])
axes[0,0].set_title('Phân phối thu nhập theo giới tính và nhóm tuổi')
axes[0,0].set_xlabel('Nhóm tuổi')
axes[0,0].set_ylabel('Thu nhập')
axes[0,0].legend(title='Giới tính', labels=['Nữ', 'Nam'])

# Biểu đồ 2: Bar chart số lượng quan sát
count_data = data.groupby(['age_group_label', 'sex']).size().unstack(fill_value=0)
count_data.plot(kind='bar', ax=axes[0,1], color=['lightblue', 'lightpink'])
axes[0,1].set_title('Số lượng quan sát theo giới tính và nhóm tuổi')
axes[0,1].set_xlabel('Nhóm tuổi')
axes[0,1].set_ylabel('Số quan sát')
axes[0,1].legend(title='Giới tính', labels=['Nữ', 'Nam'])
axes[0,1].tick_params(axis='x', rotation=45)

# Biểu đồ 3: Heatmap correlation
correlation_data = data[['sex', 'age', 'education', 'income']].corr()
sns.heatmap(correlation_data, annot=True, cmap='coolwarm', center=0, ax=axes[1,0])
axes[1,0].set_title('Ma trận tương quan')

# Biểu đồ 4: Violin plot
sns.violinplot(data=data, x='education', y='income', hue='sex', ax=axes[1,1])
axes[1,1].set_title('Phân phối thu nhập theo học vấn và giới tính')
axes[1,1].set_xlabel('Trình độ học vấn')
axes[1,1].set_ylabel('Thu nhập')
axes[1,1].legend(title='Giới tính', labels=['Nữ', 'Nam'])

plt.tight_layout()
plt.savefig('data_analysis_visualization.png', dpi=300, bbox_inches='tight')
plt.show()

# ====================
# EXPORT RESULTS
# ====================

print(f"\n{'='*15}")
print("XUẤT KẾT QUẢ")
print(f"{'='*15}")

# Tạo summary report
def create_summary_report(df):
    """Tạo báo cáo tổng hợp"""
    report = {
        'total_observations': len(df),
        'total_variables': len(df.columns),
        'missing_data': df.isnull().sum().to_dict(),
        'data_types': df.dtypes.to_dict(),
        'numeric_summary': df.describe().to_dict(),
        'categorical_summary': {col: df[col].value_counts().to_dict() 
                              for col in df.select_dtypes(include=['object']).columns}
    }
    return report

summary_report = create_summary_report(data)

# Lưu kết quả vào file
salary_analysis.to_csv('salary_gap_analysis.csv', index=False)
desc_by_age.to_csv('descriptive_by_age.csv')
chi_square_df.to_csv('chi_square_results.csv', index=False)
ttest_df.to_csv('ttest_results.csv', index=False)
regression_df.to_csv('regression_by_group.csv', index=False)

# Lưu dữ liệu đã xử lý
data.to_pickle('processed_data.pkl')

print("✅ Đã xuất các file kết quả:")
files_created = [
    'salary_gap_analysis.csv',
    'descriptive_by_age.csv',
    'chi_square_results.csv',
    'ttest_results.csv',
    'regression_by_group.csv',
    'processed_data.pkl',
    'data_analysis_visualization.png'
]

for file in files_created:
    print(f"   - {file}")

# ====================
# ADVANCED FUNCTIONS
# ====================

class DataAnalyzer:
    """Class cho phân tích dữ liệu nâng cao"""
    
    def __init__(self, data):
        self.data = data.copy()
        self.original_data = data.copy()
    
    def filter_data(self, conditions):
        """Lọc dữ liệu theo nhiều điều kiện"""
        filtered_data = self.data.copy()
        for condition in conditions:
            filtered_data = filtered_data.query(condition)
        return filtered_data
    
    def split_analysis(self, group_col, analysis_func):
        """Thực hiện phân tích theo nhóm"""
        results = {}
        for group in self.data[group_col].unique():
            subset = self.data[self.data[group_col] == group]
            results[group] = analysis_func(subset)
        return results
    
    def compare_groups(self, group_col, outcome_col, method='ttest'):
        """So sánh giữa các nhóm"""
        groups = self.data[group_col].unique()
        results = []
        
        for i in range(len(groups)):
            for j in range(i+1, len(groups)):
                group1_data = self.data[self.data[group_col] == groups[i]][outcome_col].dropna()
                group2_data = self.data[self.data[group_col] == groups[j]][outcome_col].dropna()
                
                if method == 'ttest' and len(group1_data) > 1 and len(group2_data) > 1:
                    stat, p_val = stats.ttest_ind(group1_data, group2_data)
                    results.append({
                        'group1': groups[i],
                        'group2': groups[j],
                        'statistic': stat,
                        'p_value': p_val,
                        'significant': p_val < 0.05
                    })
        
        return pd.DataFrame(results)

# Ví dụ sử dụng class
analyzer = DataAnalyzer(data)

# So sánh các nhóm tuổi
age_comparison = analyzer.compare_groups('age_group', 'income')
print(f"\nSo sánh thu nhập giữa các nhóm tuổi:")
print(age_comparison.round(4))

print(f"\n{'='*50}")
print("HOÀN THÀNH PHÂN TÍCH LỌC QUAN SÁT VÀ TÁCH DỮ LIỆU!")
print(f"{'='*50}")

Tài liệu tham khảo

Để nắm vững hơn về lọc quan sát và tách dữ liệu trong thực hành kinh tế l

Xem thêm
Back to top button