pacman::p_load(haven, dplyr, tidyverse, car, lmtest, sandwich)
L1 <- read_dta('/Users/leeakun_dino/Desktop/Quantitative analysis in Economics/Dta/UEL_MS26.dta')PTĐL_QT2_option
Phân tích thu nhập của hộ gia đình Việt Nam
Tính toán, ước lượng trên R
Xem các biến trong dữ liệu (file excel, trình bày tên biến trong R)
L1 |>
variable.names() [1] "MATINH" "MAHUYEN" "MAXA" "MADIABAN"
[5] "HOSO" "hoctoilop" "Bangcap_hocvan" "Bangcap_nghe"
[9] "IDHO" "TTNT" "GIOITINHCHUHO" "DANTOCCHUHO"
[13] "KYDIEUTRA" "LOAIPHIEU" "Q1B" "Q2A"
[17] "Q2B" "Q2C" "Q2D" "Q2E"
[21] "Q2F" "Q3A" "Q4A" "Q4B"
[25] "Q4C" "Q4D" "Q4E" "TONGTHU"
[29] "TONGCHI" "THUNHAP" "THUBQ" "TONGCHITIEU"
[33] "TONGCHITIEUBQ" "SONHANKHAU" "M2CT" "M2TN"
[37] "M3A_C1" "M3A_C10" "M3A_C11" "M3A_C12"
[41] "M3CT1" "M3CT2" "M3CT3" "M3CT"
[45] "M3TN" "M4ATN1" "M4ATN2" "M4ATN3"
[49] "M4ATN4" "M4ATN5" "M4ATN6" "M4ATN"
[53] "M4B0_C1" "M4B0TN" "M4B1_C1A" "M4B1_C1B"
[57] "M4B11T" "M4B12T" "M4B13T" "M4B14T"
[61] "M4B15T" "M4B1T2" "M4B1T" "M4B1C"
[65] "M4B2_C1A" "M4B2_C1B" "M4B2T2" "M4B21T"
[69] "M4B22T" "M4B21C" "M4B22C" "M4B3_C1A"
[73] "M4B3_C1B" "M4B3T2" "M4B3T" "M4B3C"
[77] "M4B4_C1A" "M4B4_C1B" "M4B4T2" "M4B4T"
[81] "M4B4C" "M4B5_C1A" "M4B5_C1B" "M4B5T2"
[85] "M4B5T1" "M4B5C" "M4C_C1" "M4CTT"
[89] "M4CT" "M4CCT" "M4CC" "M4D_01"
[93] "M4D_02" "M4D_03" "M4D_04" "M4D_05"
[97] "M4D_06" "M4D_07" "M4D_08" "M4D_09"
[101] "M4D_10" "M4D_11" "M4D_12" "N_M4D_12GHIRO"
[105] "M4DTN" "M5A1CT" "M5A1C4" "M5A1C5"
[109] "M5A2CT" "M5A2C6" "M5A2C7" "M5A2C8"
[113] "M5B1CT" "M5B1C6" "M5B1C7" "M5B1C8"
[117] "M5B2CT" "M5B2C4" "M5B2C5" "M5B3CT"
[121] "M6A_C7" "M7_C1" "M7_C2" "M7_C3"
[125] "M7_C4A" "M7_C4AGHIRO" "M7_C4B" "M7_C4BGHIRO"
[129] "M7_C4C" "M7_C4CGHIRO" "M7_C4D" "M7_C5"
[133] "M7_C6" "M7_C7" "M7_C8" "M7_C8A"
[137] "M7_C9" "M7_C10" "M7_C11" "M7_C12"
[141] "M7_C13" "M7_C13GHIRO" "M7_C13A" "M7_C13AGHIRO"
[145] "M7_C14" "M7_C15" "M7_C15GHIRO" "M7_C16"
[149] "M7_C16GHIRO" "M7_C17" "M7_C18" "M7_C18GHIRO"
[153] "M7_C19" "M7_C20" "M8_C1" "M8_C201"
[157] "M8_C202" "M8_C203" "M8_C204" "M8_C205"
[161] "M8_C206" "M8_C207" "M8_C208" "M8_C209"
[165] "M8_C210" "M8_C210GHIRO" "M8_C3" "M8_C401"
[169] "M8_C402" "M8_C403" "M8_C404" "M8_C405"
[173] "M8_C406" "M8_C407" "M8_C408" "M8_C409"
[177] "M8_C410" "M8_C410GHIRO" "M8_C5" "M8_C601"
[181] "M8_C602" "M8_C603" "M8_C604" "M8_C605"
[185] "M8_C605GHIRO" "M8_C701" "M8_C702" "M8_C703"
[189] "M8_C704" "M8_C705" "M8_C706" "M8_C706GHIRO"
[193] "M8_C707" "M8_C801" "M8_C802" "M8_C803"
[197] "M8_C804" "M8_C805" "M8_C805GHIRO" "M8_C806"
Phân tích thống kê mô tả chung về thu nhập của hộ gia đình VN
L1 |>
select(THUNHAP, THUBQ) |>
summary() THUNHAP THUBQ
Min. : -205441 Min. : -4280
1st Qu.: 86077 1st Qu.: 2353
Median : 155352 Median : 3875
Mean : 197278 Mean : 4750
3rd Qu.: 247275 3rd Qu.: 5778
Max. :10343089 Max. :143654
-> Thu nhập bình quân của hộ gia đình VN đạt mức hơn 4.7 triệu đồng/ người/ tháng. Chênh lệch bình quân giữa các hộ là khoảng 4.5 triệu (rất lớn).
Chênh lệch thu nhập theo: thành thị nông thôn
#Xem thử có bao nhiêu hộ ở thành thị, nông thôn trong dữ liệu
L1 |>
select(TTNT) |>
table() |>
prop.table() |># Nếu cần tính tỷ lệ phần trăm (-> so sánh) thì dùng thêm lệnh này
round(digits=4) *100 #Ý nghĩa code: làm tròn đến chữ số thập phân thứ 4 -> nhân 100TTNT
1 2
33.74 66.26
L1 |>
select(TTNT, THUBQ) |>
group_by(TTNT) |>
summarize(Thunhapbq_TB=mean(THUBQ, na.rm=T),
Thunhapbq_SD=sd(THUBQ, na.rm=T),
Thunhapbq_median=median(THUBQ, na.rm=T))# A tibble: 2 × 4
TTNT Thunhapbq_TB Thunhapbq_SD Thunhapbq_median
<dbl> <dbl> <dbl> <dbl>
1 1 6218. 5523. 4950
2 2 4003. 3688. 3374
L1 |>
select(TTNT, THUBQ) |>
mutate(dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn")) |>
group_by(dothi) |>
summarize(Trungbinh=mean(THUBQ, na.rm=T),
Trungvi=median(THUBQ, na.rm=T),
Dolechchuan=sd(THUBQ, na.rm=T)
)# A tibble: 2 × 4
dothi Trungbinh Trungvi Dolechchuan
<chr> <dbl> <dbl> <dbl>
1 1. Thành thị 6218. 4950 5523.
2 2. Nông thôn 4003. 3374 3688.
Chênh lệch thu nhập theo: giới tính chủ hộ
L1 |>
select(GIOITINHCHUHO) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam", "2. Nữ")) |>
select(Gioi) |>
table() |>
prop.table()|>
round(digits = 4)*100Gioi
1. Nam 2. Nữ
71.99 28.01
L1 |>
select(GIOITINHCHUHO, TTNT, THUBQ) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam", "2. Nữ")) |>
mutate(dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn"))|>
na.omit() |> #Đây là lệnh xoá những dòng dữ liệu bị thiếu
group_by( dothi, Gioi) |>
summarize(Trungbinh=mean(THUBQ, na.rm=T),
Trungvi=median(THUBQ, na.rm=T),
Dolechchuan=sd(THUBQ, na.rm=T)
)`summarise()` has regrouped the output.
ℹ Summaries were computed grouped by dothi and Gioi.
ℹ Output is grouped by dothi.
ℹ Use `summarise(.groups = "drop_last")` to silence this message.
ℹ Use `summarise(.by = c(dothi, Gioi))` for per-operation grouping
(`?dplyr::dplyr_by`) instead.
# A tibble: 4 × 5
# Groups: dothi [2]
dothi Gioi Trungbinh Trungvi Dolechchuan
<chr> <chr> <dbl> <dbl> <dbl>
1 1. Thành thị 1. Nam 6114. 4891 5447.
2 1. Thành thị 2. Nữ 6400. 5108 5652.
3 2. Nông thôn 1. Nam 4017. 3386 3819.
4 2. Nông thôn 2. Nữ 3960. 3345 3232.
=> Thu nhập của các hộ gia đình ở khu vực thành thị nhìn chung cao hơn khu vực nông thôn. Một số hộ có mức thu nhập rất cao đã làm mức thu nhập bình quân tăng lên đáng kể. Đồng thời, chênh lệch thu nhập giữa các hộ vẫn còn khá lớn.
L1 |>
select(GIOITINHCHUHO) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam",
if_else(GIOITINHCHUHO==2, "2. Nữ", "3. Khác"))) |>
select(Gioi) |>
table() |>
prop.table() |>
knitr::kable(digits = 4)| Gioi | Freq |
|---|---|
| 1. Nam | 0.7199 |
| 2. Nữ | 0.2801 |
L1 |>
select(GIOITINHCHUHO, THUBQ) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam",
if_else(GIOITINHCHUHO==2, "2. Nữ", "3. Khác"))) |>
group_by(Gioi) |>
na.omit() |>
summarize(Trungbinh=mean(THUBQ, na.rm=T),
Trungvi=median(THUBQ, na.rm=T),
Dolechchuan=sd(THUBQ, na.rm=T)
)# A tibble: 2 × 4
Gioi Trungbinh Trungvi Dolechchuan
<chr> <dbl> <dbl> <dbl>
1 1. Nam 4640. 3802 4470.
2 2. Nữ 5035. 4029 4624.
Kết hợp phân tích: Tỷ lệ
2 biến định tính: Giới tính và Thành thị nông thôn
L1 |>
select(GIOITINHCHUHO, TTNT) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam",
if_else(GIOITINHCHUHO==2, "2. Nữ", "3. Khác")),
dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn")) |>
select(Gioi,dothi) |>
table() |>
prop.table() |>
knitr::kable(digits = 4)| 1. Thành thị | 2. Nông thôn | |
|---|---|---|
| 1. Nam | 0.2140 | 0.5060 |
| 2. Nữ | 0.1235 | 0.1566 |
L1 |>
select(GIOITINHCHUHO, TTNT) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam",
if_else(GIOITINHCHUHO==2, "2. Nữ", "3. Khác")),
dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn")) |>
select(Gioi,dothi) |>
table() |>
prop.table(1) |>
knitr::kable(digits = 4)| 1. Thành thị | 2. Nông thôn | |
|---|---|---|
| 1. Nam | 0.2972 | 0.7028 |
| 2. Nữ | 0.4409 | 0.5591 |
Kết hợp phân tích: Tke Mô Tả
L1 |>
select(GIOITINHCHUHO,TTNT, THUBQ) |>
mutate(Gioi=if_else(GIOITINHCHUHO==1, "1. Nam",
if_else(GIOITINHCHUHO==2, "2. Nữ", "3. Khác")),
dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn")) |>
group_by(dothi, Gioi) |>
na.omit() |>
summarize(Trungbinh=mean(THUBQ, na.rm=T),
Trungvi=median(THUBQ, na.rm=T),
Dolechchuan=sd(THUBQ, na.rm=T)
)`summarise()` has regrouped the output.
ℹ Summaries were computed grouped by dothi and Gioi.
ℹ Output is grouped by dothi.
ℹ Use `summarise(.groups = "drop_last")` to silence this message.
ℹ Use `summarise(.by = c(dothi, Gioi))` for per-operation grouping
(`?dplyr::dplyr_by`) instead.
# A tibble: 4 × 5
# Groups: dothi [2]
dothi Gioi Trungbinh Trungvi Dolechchuan
<chr> <chr> <dbl> <dbl> <dbl>
1 1. Thành thị 1. Nam 6114. 4891 5447.
2 1. Thành thị 2. Nữ 6400. 5108 5652.
3 2. Nông thôn 1. Nam 4017. 3386 3819.
4 2. Nông thôn 2. Nữ 3960. 3345 3232.
Các nguồn thu nhập
L1|>
mutate(dothi=if_else(TTNT==1, "1. Thành thị", "2. Nông thôn")) |>
rename(inc_Wage=M4ATN,
inc_Rent=M4B0TN,
inc_Crop=M4B1T,
inc_Livestock=M4B21T,
inc_Hunt=M4B22T,
inc_Agri_ser=M4B3T,
inc_Forest=M4B4T,
inc_Fish=M4B5T1,
inc_Nonagri=M4CT,
inc_Others=M4DTN) |>
select(dothi,TONGTHU, starts_with("inc")) |>
group_by(dothi) |>
summarize(
Sh_wage= paste0(round(mean(inc_Wage/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_rent=paste0(round(mean(inc_Rent/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_crop=paste0(round(mean(inc_Crop/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_livestock=paste0(round(mean(inc_Livestock/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_hunt=paste0(round(mean(inc_Hunt/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_agri_ser=paste0(round(mean(inc_Agri_ser/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_forest=paste0(round(mean(inc_Forest/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_fish=paste0(round(mean(inc_Fish/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_nonagri=paste0(round(mean(inc_Nonagri/TONGTHU, na.rm=T), digits = 4)*100, "%"),
Sh_others=paste0(round(mean(inc_Others/TONGTHU, na.rm=T), digits = 4)*100, "%"))# A tibble: 2 × 11
dothi Sh_wage Sh_rent Sh_crop Sh_livestock Sh_hunt Sh_agri_ser Sh_forest
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1. Thành t… 55.29% 0.1% 3.43% 1.22% 0% 0.02% 0.29%
2 2. Nông th… 40.3% 0.38% 16.38% 6.43% 0.06% 0.2% 1.83%
# ℹ 3 more variables: Sh_fish <chr>, Sh_nonagri <chr>, Sh_others <chr>
L1|>
group_by(TTNT) |>
reframe(total=M4ATN+M4B0TN+M4B1T+M4B21T+M4B22T+M4B3T+M4B4T+M4B5T1+M4CT+M4DTN,
inc_Wage=M4ATN,
inc_Rent=M4B0TN,
inc_Crop=M4B1T,
inc_Livestock=M4B21T,
inc_Hunt=M4B22T,
inc_Agri_ser=M4B3T,
inc_Forest=M4B4T,
inc_Fish=M4B5T1,
inc_Nonagri=M4CT,
inc_Others=M4DTN,
Sh_wage=mean(inc_Wage/total, na.rm=T),
Sh_rent=mean(inc_Rent/total, na.rm=T),
Sh_crop=mean(inc_Crop/total, na.rm=T),
Sh_livestock=mean(inc_Livestock/total, na.rm=T),
Sh_hunt=mean(inc_Hunt/total, na.rm=T),
Sh_agri_ser=mean(inc_Agri_ser/total, na.rm=T),
Sh_forest=mean(inc_Forest/total, na.rm=T),
Sh_fish=mean(inc_Fish/total, na.rm=T),
Sh_nonagri=mean(inc_Nonagri/total, na.rm=T),
Sh_others=mean(inc_Others/total, na.rm=T)) |>
select(TTNT, starts_with("Sh")) |>
distinct(TTNT, .keep_all = T)# A tibble: 2 × 11
TTNT Sh_wage Sh_rent Sh_crop Sh_livestock Sh_hunt Sh_agri_ser Sh_forest
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0.560 0.00102 0.0336 0.0111 0.0000445 0.000236 0.00275
2 2 0.408 0.00395 0.165 0.0622 0.000593 0.00203 0.0181
# ℹ 3 more variables: Sh_fish <dbl>, Sh_nonagri <dbl>, Sh_others <dbl>
L1 |> select(MATINH, THUBQ,hoctoilop, TONGTHU, SONHANKHAU, GIOITINHCHUHO,
TONGCHITIEUBQ)|>
na.omit() |>
filter(hoctoilop<99) -> p1
ggplot2::ggplot(p1,
aes(THUBQ,SONHANKHAU,
colour=as.factor(GIOITINHCHUHO))) +
geom_boxplot()Warning: Orientation is not uniquely specified when both the x and y aesthetics are
continuous. Picking default orientation 'x'.
(BÀI TẬP QT2_option)
Tính tỷ lệ phần trăm về mức chênh lệch
Phân tích ngũ phân vị
Trung bình cộng (Mean) rất dễ bị ảnh hưởng bởi các giá trị ngoại lai. Để mô tả bức tranh một cách toàn diện, sau đây tôi sẽ dùng kỹ thuật “Ngũ phân vị” để sắp xếp toàn bộ dữ liệu theo thứ tự tăng dần, sau đó chia đều mẫu thành 5 phần bằng nhau, mỗi phần chiếm 20% số hộ:
- Nhóm 1 (Q1): 20% số hộ có thu nhập thấp nhất (Nhóm nghèo nhất).
- Nhóm 5 (Q5): 20% số hộ có thu nhập cao nhất (Nhóm giàu nhất).
Hệ số chênh lệch giữa Q5 và Q1 hay còn gọi là tỷ số S80/S20 trong kinh tế học vĩ mô là chỉ báo cốt lõi được Ngân hàng Thế giới (Worldbank) và Tổng cục Thống kê dùng để đo lường khoảng cách giàu nghèo.
L1 |>
# Kỹ thuật gán phân vị dựa trên thứ hạng (Ranking)
mutate(Nhom_ThuNhap = ntile(THUBQ, 5)) |>
group_by(Nhom_ThuNhap) |>
summarize(ThuNhap_TB = mean(THUBQ, na.rm = TRUE)) |>
# Chuyển đổi dữ liệu để tính toán hàng dọc thành hàng ngang
tidyr::pivot_wider(names_from = Nhom_ThuNhap, names_prefix = "Nhom_", values_from = ThuNhap_TB) |>
# Tính hệ số k (gấp bao nhiêu lần) và khoảng cách theo phần trăm
mutate(HeSo_k = Nhom_5 / Nhom_1,
ChenhLech_PhanTram = (Nhom_5 - Nhom_1) / Nhom_1 * 100)# A tibble: 1 × 7
Nhom_1 Nhom_2 Nhom_3 Nhom_4 Nhom_5 HeSo_k ChenhLech_PhanTram
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1335. 2678. 3869. 5332. 10541. 7.90 690.
Giải thích kỹ thuật lệnh: Hàm “ntile(THUBQ, 5)” tự động tính toán các giá trị ngưỡng phân vị của biến “THUBQ” và gán cho mỗi hộ gia đình một nhãn từ 1 đến 5. Hàm này tự xử lý các giá trị khuyết thiếu (NA) một cách hợp lý để đảm bảo số lượng quan sát trong các nhóm bằng nhau tối đa.
Diễn giải kết quả kỹ thuật:
Đoạn code trên sẽ trả về Hệ số k. Nếu hệ số k bằng 5, điều đó có nghĩa là nhóm 20% giàu nhất có thu nhập trung bình gấp 5 lần nhóm 20% nghèo nhất.
Mức độ biến động của hệ số này qua các năm là thước đo trực quan nhất cho thấy chính sách an sinh xã hội và phân phối lại thu nhập của quốc gia có đang hiệu quả hay không.
=> Kết quả cho thấy thu nhập tăng dần theo các nhóm dân cư, trong đó nhóm có thu nhập cao nhất đạt khoảng 10.541, cao gấp gần 8 lần nhóm có thu nhập thấp nhất. Đồng thời kết quả kiểm tra chênh lệch cũng cho thấy thu nhập của nhóm cao nhất cao hơn khoảng 690% so với nhóm thấp nhất. Điều này phản ánh sự chênh lệch đáng kể về mức sống giữa các nhóm thu nhập.
Tỷ lệ chênh lệch thu nhập theo: Thành thị Nông thôn
Phần trăm chênh lệch
- Dùng nhóm có thu nhập thấp hơn làm gốc để tính xem nhóm cao hơn vượt bao nhiêu phần trăm.
#Chênh lệch theo Khu vực (Thành thị vs Nông thôn)
L1 |>
group_by(TTNT) |>
summarize(Trungbinh = mean(THUBQ, na.rm = TRUE)) |>
mutate(KhuVuc = if_else(TTNT == 1, "ThanhThi", "NongThon")) |>
select(KhuVuc, Trungbinh) |>
# Kỹ thuật tái cấu trúc dữ liệu từ dạng dọc (long) sang dạng ngang (wide) để dễ tính toán
tidyr::pivot_wider(names_from = KhuVuc, values_from = Trungbinh) |>
# Tính toán tỷ lệ phần trăm chênh lệch
mutate(ChenhLech_PhanTram = (ThanhThi - NongThon) / NongThon * 100)# A tibble: 1 × 3
ThanhThi NongThon ChenhLech_PhanTram
<dbl> <dbl> <dbl>
1 6218. 4003. 55.3
Giải thích kỹ thuật lệnh: Hàm pivot_wider() biến các giá trị của cột Khuvuc thành các cột độc lập (ThanhThi va NongThon). Việc này đưa dữ liệu về dạng một hàng duy nhất, giúp R thực hiện phép tính toán học trên các vector cột một cách trực tiếp và tối ưu tốc độ xử lý.
=> Thu nhập bình quân ở Thành thị cao hơn Nông thôn khoảng 55.35%. Đây là mức chênh lệch rất lớn, phản ánh sự phân cực rõ rệt về cơ hội việc làm, năng suất lao động và cấu trúc kinh tế giữa hai khu vực.
Kiểm định trung bình giá trị thu nhập bình quân theo thành thị vs nông thôn
Trực quan hoá tác động đồng thời của 2 biến định tính
Khi chúng ta muốn xem xét tác động đồng thời của hai biến định tính (TTNT - Khu vực và GIOITINHCHUHO - Giới tính) lên một biến định lượng (THUBQ), việc đọc các bảng số liệu đan xen rất dễ gây nhầm lẫn.
Sử dụng biểu đồ cột nhóm (Grouped Bar Chart với thuộc tính (
position = "dodge") cho phép ta phân tích hiệu ứng tương tác bằng thị giác trước khi tiến hành các kiểm định sâu hơn như ANOVA hay Hồi quy tuyến tính.
library(ggplot2)
# Chuẩn bị dữ liệu tinh gọn trước khi vẽ
data_plot <- L1 |>
filter(GIOITINHCHUHO %in% c(1, 2)) |>
mutate(Gioi = if_else(GIOITINHCHUHO == 1, "Chủ hộ: Nam", "Chủ hộ: Nữ"),
Dothi = if_else(TTNT == 1, "Thành thị", "Nông thôn")) |>
group_by(Dothi, Gioi) |>
summarize(Trungbinh = mean(THUBQ, na.rm = TRUE), .groups = 'drop')
# Tiến hành vẽ biểu đồ biểu diễn khoảng cách
ggplot(data_plot, aes(x = Dothi, y = Trungbinh, fill = Gioi)) +
# position = "dodge" giúp đặt các cột cạnh nhau thay vì chồng lên nhau
geom_col(position = position_dodge(width = 0.7), width = 0.6) +
# Hiển thị trực tiếp giá trị số trên đầu cột để tăng tính scannable
geom_text(aes(label = round(Trungbinh, 0)),
position = position_dodge(width = 0.7),
vjust = -0.5, size = 3.5, fontface = "bold") +
labs(title = "Cấu trúc thu nhập bình quân theo khu vực và giới tính chủ hộ",
subtitle = "Đơn vị: Ngàn đồng / người / tháng",
x = "Khu vực địa lý", y = "Thu nhập bình quân (THUBQ)", fill = "") +
theme_minimal() +
scale_fill_brewer(palette = "Set2") # Phối màu chuẩn nghiên cứu khoa họcGiải thích kỹ thuật lệnh: Trong đồ họa ggplot2, việc thiết lập position = position_dodge(width = 0.7) đồng bộ ở cả geom_col() và geom_text() là bắt buộc. Điều này đảm bảo các nhãn chữ số hiển thị chính xác ngay giữa đỉnh của từng cột tương ứng, không bị lệch hoặc dính vào nhau khi tách nhóm.
Diễn giải kết quả kỹ thuật:
Ở Thành thị: Hộ có chủ hộ là Nữ (6400) có thu nhập cao hơn hộ có chủ hộ là Nam (6114) khoảng 4.68%.
Ở Nông thôn: Sự chênh lệch đảo chiều nhưng khoảng cách cực kỳ nhỏ: hộ chủ hộ Nam (4017) chỉ nhỉnh hơn hộ chủ hộ Nữ (3960) khoảng 1.44%.
Kết luận kỹ thuật: Giới tính của chủ hộ không phải là yếu tố quyết định sự phân hóa thu nhập ở khu vực nông thôn, nhưng ở thành thị, các hộ do nữ làm chủ lại thể hiện năng lực kinh tế tốt hơn đáng kể trong mẫu dữ liệu này.
Bổ sung phân tích về kiểm định trung bình
(Trong phân tích, tránh tránh đưa ra các bảng giá trị thống kê chuyên biệt cho những người đọc thông thường, không có dữ liệu, không biết về dữ liệu phân tích + Khi phân tích nên trình bày nhiều biểu đồ (trực quan hơn), hoặc diễn giải kỹ thuật phân tích. Các bảng thống kê chuyên biệt nên để ở phụ lục)