PTĐL_QT2_option

Phân tích thu nhập của hộ gia đình Việt Nam

pacman::p_load(haven, dplyr, tidyverse, car, lmtest, sandwich) 
L1 <- read_dta('/Users/leeakun_dino/Desktop/Quantitative analysis in Economics/Dta/UEL_MS26.dta')

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 100
TTNT
    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)*100
Gioi
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ọc

Giả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()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)