1. Giới thiệu về bộ dữ liệu

Nguồn của bộ dữ liệu

  • Dữ liệu được sử dụng trong bài tập này có tên là “Student Spending Habits”, tạm dịch: Thói quen chi tiêu của sinh viên.

  • Bộ dữ liệu được thu thập và công bố trênnền tảng Kaggle, nhằm phục vụ mục đích học tập và nghiên cứu trong lĩnh vực phân tích dữ liệu.

  • Nguồn trích dẫn cụ thể: Student Spending Habits Dataset

  • Dữ liệu mô phỏng kết quả khảo sát về tình hình chi tiêu của sinh viên đại học, bao gồm nhiều nhóm đối tượng khác nhau dựa trên đặc điểm nhân khẩu học và ngành học. Thông tin được thu thập thông qua bảng khảo sát trực tuyến, với trọng tâm là các khoản chi tiêu thường gặp cũng như sự khác biệt trong hành vi tài chính của sinh viên.


Đọc dữ liệu

Bộ dữ liệu “Student Spending” mô phỏng chi tiết thói quen chi tiêu của 1.000 sinh viên đại học đến từ nhiều nhóm nhân khẩu học và chuyên ngành khác nhau. Mỗi quan sát tương ứng với một sinh viên, bao gồm thông tin cá nhân (tuổi, giới tính, năm học, chuyên ngành), thu nhập và hỗ trợ tài chính, cùng với các khoản chi tiêu theo từng danh mục cụ thể và phương thức thanh toán ưa thích.

library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(skimr)
library(psych)
library(csv)
library(DT)
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
library(forcats)
library(knitr)
library(tibble)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
data <- read.csv("F:/Ngôn ngữ lập trình/student_spending (1).csv", header = T)
datatable(data)

Tên các biến và ý nghĩa

Trước khi tiến hành phân tích, ta cần tìm hiểu cụ thể các biến có trong bộ dữ liệu, bao gồm tên biến, kiểu dữ liệu và ý nghĩa nội dung. Việc hiểu rõ các biến giúp xác định chính xác phương pháp xử lý phù hợp cho từng loại biến (định tính hay định lượng).

Tên của các biến trong bộ dữ liệu có thể được liệt kê thông qua lệnh names() như sau:

names(data)
##  [1] "X"                        "age"                     
##  [3] "gender"                   "year_in_school"          
##  [5] "major"                    "monthly_income"          
##  [7] "financial_aid"            "tuition"                 
##  [9] "housing"                  "food"                    
## [11] "transportation"           "books_supplies"          
## [13] "entertainment"            "personal_care"           
## [15] "technology"               "health_wellness"         
## [17] "miscellaneous"            "preferred_payment_method"

Dưới đây là bảng mô tả chi tiết từng biến:

variable_description <- data.frame(
  Bien = c("Unnamed: 0", "Age", "Gender", "Year in School", "Major", 
           "Monthly Income", "Financial Aid", "Tuition", "Housing", "Food", 
           "Transportation", "Books & Supplies", "Entertainment", 
           "Personal Care", "Technology", "Health & Wellness", 
           "Miscellaneous", "Preferred Payment Method"),
  
  Mo_ta = c("Chỉ số dòng trong tập dữ liệu (tự sinh ra, có thể bỏ qua)",
            "Tuổi của sinh viên",
            "Giới tính của sinh viên (Nam, Nữ, Không phân biệt)",
            "Năm học hiện tại (Năm nhất, Năm hai, Năm ba, Năm cuối)",
            "Ngành học chính của sinh viên",
            "Thu nhập hàng tháng của sinh viên (USD)",
            "Số tiền hỗ trợ tài chính/học bổng nhận được (USD)",
            "Chi phí học phí hàng tháng (USD)",
            "Chi phí nhà ở hàng tháng (USD)",
            "Chi phí thực phẩm hàng tháng (USD)",
            "Chi phí đi lại hàng tháng (USD)",
            "Chi phí sách vở và dụng cụ học tập (USD)",
            "Chi phí giải trí hàng tháng (USD)",
            "Chi phí chăm sóc cá nhân hàng tháng (USD)",
            "Chi phí công nghệ hàng tháng (USD)",
            "Chi phí sức khỏe và chăm sóc sức khỏe (USD)",
            "Các chi phí lặt vặt khác (USD)",
            "Phương thức thanh toán ưa thích (Tiền mặt, Thẻ tín dụng/Ghi nợ, Ứng dụng thanh toán)"),
  
  stringsAsFactors = FALSE
)

kbl(variable_description, col.names = c("Biến", "Mô tả"), booktabs = TRUE) %>%
  kable_styling(latex_options = c("striped", "hold_position"))
Biến Mô tả
Unnamed: 0 Chỉ số dòng trong tập dữ liệu (tự sinh ra, có thể bỏ qua)
Age Tuổi của sinh viên
Gender Giới tính của sinh viên (Nam, Nữ, Không phân biệt)
Year in School Năm học hiện tại (Năm nhất, Năm hai, Năm ba, Năm cuối)
Major Ngành học chính của sinh viên
Monthly Income Thu nhập hàng tháng của sinh viên (USD)
Financial Aid Số tiền hỗ trợ tài chính/học bổng nhận được (USD)
Tuition Chi phí học phí hàng tháng (USD)
Housing Chi phí nhà ở hàng tháng (USD)
Food Chi phí thực phẩm hàng tháng (USD)
Transportation Chi phí đi lại hàng tháng (USD)
Books & Supplies Chi phí sách vở và dụng cụ học tập (USD)
Entertainment Chi phí giải trí hàng tháng (USD)
Personal Care Chi phí chăm sóc cá nhân hàng tháng (USD)
Technology Chi phí công nghệ hàng tháng (USD)
Health & Wellness Chi phí sức khỏe và chăm sóc sức khỏe (USD)
Miscellaneous Các chi phí lặt vặt khác (USD)
Preferred Payment Method Phương thức thanh toán ưa thích (Tiền mặt, Thẻ tín dụng/Ghi nợ, Ứng dụng thanh toán)

Cấu trúc của dữ liệu

Để có cái nhìn tổng quan về dữ liệu, ta sử dụng hàm str(). Lệnh này sẽ hiển thị tổng số dòng (quan sát) và số cột (biến), tên các biến cùng kiểu dữ liệu tương ứng (số, chuỗi ký tự, nhân tố), cũng như một vài giá trị đầu tiên của từng biến, giúp xác định nhanh cấu trúc và đặc điểm cơ bản của tập dữ liệu.

str(data)
## 'data.frame':    1000 obs. of  18 variables:
##  $ X                       : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ age                     : int  19 24 24 23 20 25 23 23 22 18 ...
##  $ gender                  : chr  "Non-binary" "Female" "Non-binary" "Female" ...
##  $ year_in_school          : chr  "Freshman" "Junior" "Junior" "Senior" ...
##  $ major                   : chr  "Psychology" "Economics" "Economics" "Computer Science" ...
##  $ monthly_income          : int  958 1006 734 617 810 523 1354 631 1402 1423 ...
##  $ financial_aid           : int  270 875 928 265 522 790 69 748 248 74 ...
##  $ tuition                 : int  5939 4908 3051 4935 3887 3151 4973 3966 5638 3977 ...
##  $ housing                 : int  709 557 666 652 825 413 812 571 599 626 ...
##  $ food                    : int  296 365 220 289 372 386 398 269 354 249 ...
##  $ transportation          : int  123 85 137 114 168 122 101 92 82 117 ...
##  $ books_supplies          : int  188 252 99 223 194 131 213 251 155 123 ...
##  $ entertainment           : int  41 74 130 99 48 73 21 37 123 51 ...
##  $ personal_care           : int  78 92 23 30 71 38 38 90 41 74 ...
##  $ technology              : int  134 226 239 163 88 234 157 152 162 243 ...
##  $ health_wellness         : int  127 129 112 105 71 108 117 56 172 34 ...
##  $ miscellaneous           : int  72 68 133 55 104 99 48 62 194 196 ...
##  $ preferred_payment_method: chr  "Credit/Debit Card" "Credit/Debit Card" "Cash" "Mobile Payment App" ...

Dựa trên kết quả từ str(), bộ dữ liệu bao gồm 1.000 quan sát18 biến. Trong đó, các biến thể hiện thông tin nhân khẩu học, tình hình tài chính, chi tiêu và hành vi thanh toán của sinh viên.

Để phục vụ cho quá trình phân tích, ta cần xác định các biến định tính trong bộ dữ liệu. Việc này giúp phân biệt giữa các biến phân loại (danh mục) và biến định lượng, từ đó lựa chọn phương pháp phân tích phù hợp. Trong R, ta có thể sử dụng đoạn mã sau để lọc ra tên các biến định tính:

qualitative_vars <- names(data)[sapply(data, function(x) is.factor(x) || is.character(x))]
qualitative_vars
## [1] "gender"                   "year_in_school"          
## [3] "major"                    "preferred_payment_method"

Câu lệnh trên trả về danh sách các biến có kiểu dữ liệu là factor hoặc character, vốn thường được dùng để biểu diễn thông tin phân loại như giới tính, ngành học, hoặc phương thức thanh toán.

Phân tích dữ liệu tập trung vào việc khám phá đặc điểm chi tiêu của sinh viên, và đánh giá vai trò của các biến định tính trong việc phản ánh thông tin cá nhân và hành vi tiêu dùng.

Sau khi lọc và kiểm tra kiểu dữ liệu, có thể xác định được 4 biến định tính chính trong bộ dữ liệu như sau:

  • Gender: Giới tính của sinh viên
    (Male – Nam, Female – Nữ, Non-binary – Không phân biệt giới tính)

  • Year in School: Năm học hiện tại của sinh viên
    (Freshman – Năm nhất, Sophomore – Năm hai, Junior – Năm ba, Senior – Năm cuối)

  • Major: Ngành học chính

  • Preferred Payment Method: Phương thức thanh toán ưa thích
    (Cash – Tiền mặt, Credit/Debit Card – Thẻ tín dụng/Ghi nợ, Mobile Payment App – Ứng dụng thanh toán di động)

Ngoài ra, các biến định lượng phản ánh tình hình tài chính và chi tiêu bao gồm:

  • Monthly Income: Thu nhập hàng tháng (USD)
  • Financial Aid: Học bổng/Hỗ trợ tài chính (USD)
  • Tuition, Housing, Food, Transportation, Books & Supplies, Entertainment, Personal Care, Technology, Health & Wellness, Miscellaneous: Các khoản chi tiêu cụ thể theo danh mục (USD)

2. Phân tích mô tả 1 biến

Sau khi đã xác định được các biến định tính, ta tiến hành trích lọc riêng các biến này để phục vụ phân tích mô tả và kiểm định giả thuyết cho từng nhóm phân loại. Tập con dữ liệu mới này được đặt tên là dl để tiện thao tác và xử lý trong các bước tiếp theo.

dldt <- data[, qualitative_vars]

Biến Gender

Tần số và tần suất

Bảng tần số

tanso_gender <- table(dldt$gender)
tanso_gender
## 
##     Female       Male Non-binary 
##        323        356        321

Biểu đồ

barplot(
  tanso_gender,
  main   = "Tần số theo giới tính",
  xlab   = "Giới tính",
  ylab   = "Số quan sát",
  las    = 1,                      
  col    = c("pink", "blue","green"),  
  border = "white")

Bảng tần suất

tansuat_gender <- tanso_gender/sum(nrow(dldt))
tansuat_gender
## 
##     Female       Male Non-binary 
##      0.323      0.356      0.321

Biểu đồ

# Màu cho từng lát
cols <- c("pink", "green","yellow")

# Nhãn phần trăm 
nhangender <- paste0(round(tansuat_gender * 100, 1), "%")

# Vẽ pie chart không nhãn
pie(
  tansuat_gender,
  labels = NA,               # ẩn nhãn ngay trên lát
  main   = "Tần suất theo giới tính",
  col    = cols,
  border = "white"
)

# Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_gender), nhangender),
  fill   = cols,
)

Nhận xét:

Kết quả phân tích cho thấy cơ cấu giới tính trong bộ dữ liệu khá đồng đều giữa ba nhóm:

  • Male (Nam): chiếm khoảng 35.6%
  • Female (Nữ): chiếm khoảng 32.3%
  • Non-binary (Không phân biệt giới tính): chiếm khoảng 32.1%

Biểu đồ tần số và tần suất cho thấy sự phân bố giới tính tương đối cân bằng, với sự chênh lệch không đáng kể giữa các nhóm. Điều này cho thấy dữ liệu được thu thập khá đại diện, tạo điều kiện thuận lợi cho việc phân tích so sánh theo giới tính trong các phần tiếp theo.

Ước lượng khoảng và kiểm định giả thuyết

Ước lượng khoảng tin cậy 95% cho sinh viên nữ

n_female <- sum(dldt$gender == "Female")
n_total <- nrow(dldt)
prop.test(n_female, n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_female out of n_total, null probability 0.5
## X-squared = 124.61, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2942555 0.3531225
## sample estimates:
##     p 
## 0.323

Tỷ lệ ước lượng: Khoảng 32.3% sinh viên trong mẫu là nữ.

Khoảng tin cậy 95%: nằm trong khoảng từ 29.43% đến 35.31%.

Diễn giải: Kết quả kiểm định cho thấy tỷ lệ sinh viên nữ trong mẫu là khoảng 32.3%. Khoảng tin cậy 95% cho tỷ lệ này được tính từ kết quả prop.test(). Vì khoảng tin cậy không bao gồm 50% và p-value nhỏ hơn 0.05, ta có thể kết luận rằng tỷ lệ sinh viên nữ trong tổng thể khác 50% với độ tin cậy cao.


Đặt giả thuyết và Kiểm định

  • Giả thuyết H₀ (H0): Tỷ lệ sinh viên nữ trong tổng thể là 50% (p = 0.5).

  • Giả thuyết H₁ (H1): Tỷ lệ sinh viên nữ trong tổng thể khác 50% (p ≠ 0.5).

Quy tắc quyết định:

  • Nếu p-value < 0.05 → Bác bỏ giả thuyết H₀: Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên nữ khác 50%.

  • Nếu p-value ≥ 0.05 → Không bác bỏ giả thuyết H₀: Chưa đủ bằng chứng để kết luận tỷ lệ sinh viên nữ khác 50%.

prop.test(n_female, n_total, p = 0.5, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_female out of n_total, null probability 0.5
## X-squared = 124.61, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2942555 0.3531225
## sample estimates:
##     p 
## 0.323

Kết quả: p-value < 2.2e-16 < 0.05 → bác bỏ giả thuyết H₀.
Do đó, có thể kết luận rằng tỷ lệ sinh viên nữ khác 50%, và thực tế là khoảng 32.3%, thấp hơn so với mức giả định.


Biến Year in school

Tần số và tần suất

Bảng tần số

tanso_year <- table(dldt$year_in_school)
tanso_year
## 
##  Freshman    Junior    Senior Sophomore 
##       253       247       254       246

Biểu đồ

barplot(
  tanso_year,
  main   = "Tần số theo năm học",
  xlab   = "Năm học",
  ylab   = "Số quan sát",
  las    = 1,                            
  col    = c("skyblue", "orange", "lightgreen", "plum"),  
  border = "white"
)

Bảng tần suất

tansuat_year <- tanso_year / sum(tanso_year)
tansuat_year
## 
##  Freshman    Junior    Senior Sophomore 
##     0.253     0.247     0.254     0.246

Biểu đồ

# Màu cho từng lát
cols <- c("skyblue", "orange", "lightgreen", "plum")

# Nhãn phần trăm
nhan_year <- paste0(round(tansuat_year * 100, 1), "%")

# Vẽ biểu đồ tròn
pie(
  tansuat_year,
  labels = NA,
  main   = "Tần suất theo năm học",
  col    = cols,
  border = "white"
)

# Thêm chú thích
legend(
  x      = "topright",
  legend = paste(names(tansuat_year), nhan_year),
  fill   = cols
)

Nhận xét:

Kết quả phân tích cho thấy cơ cấu năm học trong bộ dữ liệu khá đồng đều giữa bốn nhóm:

  • Freshman (Năm nhất): chiếm khoảng 25.3%

  • Sophomore (Năm hai): chiếm khoảng 24.6%

  • Junior (Năm ba): chiếm khoảng 24.7%

  • Senior (Năm tư): chiếm khoảng 25.4%

Biểu đồ tần số và tần suất cho thấy sự phân bố sinh viên theo năm học tương đối cân bằng, với sự chênh lệch rất nhỏ giữa các nhóm. Điều này cho thấy dữ liệu được thu thập khá đại diện cho các năm học, tạo điều kiện thuận lợi cho các phân tích so sánh theo năm học trong các phần tiếp theo.


Ước lượng khoảng và kiểm định giả thuyết

Ước lượng khoảng tin cậy 95% cho sinh viên năm nhất

n_freshman <- sum(dldt$year_in_school == "Freshman")
n_total <- nrow(dldt)
prop.test(n_freshman, n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_freshman out of n_total, null probability 0.5
## X-squared = 243.05, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2265552 0.2813702
## sample estimates:
##     p 
## 0.253

Tỷ lệ ước lượng: Khoảng 25.3% sinh viên trong mẫu là sinh viên năm nhất.

Khoảng tin cậy 95%: nằm trong khoảng từ 22.66% đến 28.14%.

Diễn giải: Kết quả kiểm định cho thấy tỷ lệ sinh viên năm nhất trong mẫu là khoảng 25.3%. Khoảng tin cậy 95% cho tỷ lệ này được tính từ kết quả prop.test(). Vì khoảng tin cậy không bao gồm 50% và p-value nhỏ hơn 0.05, ta có thể kết luận rằng tỷ lệ sinh viên năm nhất trong tổng thể khác 50% với độ tin cậy cao.


Đặt giả thuyết và Kiểm định

  • Giả thuyết H₀ (H0): Tỷ lệ sinh viên năm nhất trong tổng thể là 20% (p = 0.2).

  • Giả thuyết H₁ (H1): Tỷ lệ sinh viên năm nhất trong tổng thể bé hơn 20% (p < 0.2).

Quy tắc quyết định:

  • Nếu p-value < 0.05 → Bác bỏ giả thuyết H₀: Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên năm nhất nhỏ hơn 20%.

  • Nếu p-value ≥ 0.05 → Không đủ cơ sở bác bỏ giả thuyết H₀: Chưa đủ bằng chứng để kết luận tỷ lệ sinh viên năm nhất nhỏ hơn 20%.

prop.test(n_freshman, n_total, p = 0.2, alternative = "less", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_freshman out of n_total, null probability 0.2
## X-squared = 17.227, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.2
## 95 percent confidence interval:
##  0.0000000 0.2767716
## sample estimates:
##     p 
## 0.253

Kết quả: p-value = 1 > 0.05 → không đủ cơ sở bác bỏ giả thuyết H₀. Do đó, chưa có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên năm nhất nhỏ hơn 20%. Tỷ lệ thực tế trong mẫu là khoảng 25.3%, cao hơn so với giả định ban đầu.


Biến Major

Tần số và tần suất

Bảng tần số

tanso_major <- table(dldt$major)
tanso_major
## 
##          Biology Computer Science        Economics      Engineering 
##              228              192              204              192 
##       Psychology 
##              184

Biểu đồ

barplot(
  tanso_major,
  main   = "Tần số theo chuyên ngành",
  xlab   = "Chuyên ngành",
  ylab   = "Số quan sát",
  las    = 1,  
  col    = rainbow(length(tanso_major)),
  border = "white",
  cex.names = 0.8  
)

Bảng tần suất

tansuat_major <- tanso_major / nrow(dldt)
tansuat_major
## 
##          Biology Computer Science        Economics      Engineering 
##            0.228            0.192            0.204            0.192 
##       Psychology 
##            0.184

Biểu đồ

cols_major <- rainbow(length(tansuat_major))
nhanmajor <- paste0(round(tansuat_major * 100, 1), "%")

pie(
  tansuat_major,
  labels = NA,
  main   = "Tần suất theo chuyên ngành",
  col    = cols_major,
  border = "white"
)

legend(
  x      = "topright",
  legend = paste(names(tansuat_major), nhanmajor),
  fill   = cols_major,
)

Nhận xét:

Kết quả phân tích cho thấy cơ cấu chuyên ngành trong bộ dữ liệu có sự phân bố tương đối đồng đều giữa năm nhóm chính:

  • Biology: chiếm khoảng 22.8%

  • Computer Science: chiếm khoảng 19.2%

  • Economics: chiếm khoảng 20.4%

  • Engineering: chiếm khoảng 19.2%

  • Psychology: chiếm khoảng 18.4%

Biểu đồ tần số và tần suất cho thấy sự phân bố sinh viên theo chuyên ngành khá cân bằng, với một chút chênh lệch giữa các nhóm. Nhóm Biology có số lượng sinh viên cao nhất (228 sinh viên), trong khi các nhóm còn lại dao động từ 184 đến 204 sinh viên. Điều này cho thấy dữ liệu được thu thập tương đối đồng đều giữa các chuyên ngành, hỗ trợ tốt cho các phân tích tiếp theo theo chuyên ngành học.


Ước lượng khoảng và kiểm định giả thuyết

Ước lượng khoảng tin cậy 95% cho chuyên ngành phổ biến nhất

most_common_major <- names(which.max(tanso_major))
most_common_major
## [1] "Biology"
n_major <- max(tanso_major)
n_total <- nrow(dldt)
prop.test(n_major, n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_major out of n_total, null probability 0.5
## X-squared = 294.85, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2025887 0.2555330
## sample estimates:
##     p 
## 0.228

Tỷ lệ ước lượng: Khoảng 22.8% sinh viên thuộc chuyên ngành phổ biến nhất (Biology).

Diễn giải: Dựa trên kết quả kiểm định, tỷ lệ sinh viên thuộc chuyên ngành phổ biến nhất được ước lượng và khoảng tin cậy 95% được tính bằng prop.test().

Kiểm định giả thuyết một phía (greater)

  • Giả thuyết H₀ (H0): Tỷ lệ sinh viên theo chuyên ngành phổ biến nhất là 20% (p = 0.2).

  • Giả thuyết H₁ (H1): Tỷ lệ sinh viên theo chuyên ngành đó lớn hơn 20% (p > 0.2).

Quy tắc quyết định:

  • Nếu p-value < 0.05 → bác bỏ H₀

  • Nếu p-value ≥ 0.05 → không bác bỏ H₀

prop.test(n_major, n_total, p = 0.2, alternative = "greater", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_major out of n_total, null probability 0.2
## X-squared = 4.7266, df = 1, p-value = 0.01485
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
##  0.2064467 1.0000000
## sample estimates:
##     p 
## 0.228

Kết quả: p-value = 0.01485 < 0.05 → đủ cơ sở để bác bỏ giả thuyết H₀.
Do đó, có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên chọn chuyên ngành Biology lớn hơn 20%.
Tỷ lệ thực tế trong mẫu là khoảng 22.8%, cao hơn so với giả định ban đầu.


Biến Preferred Payment Method

Tần số và tần suất

Bảng tần số

tanso_payment <- table(dldt$preferred_payment_method)
tanso_payment
## 
##               Cash  Credit/Debit Card Mobile Payment App 
##                310                340                350

Biểu đồ

barplot(
  tanso_payment,
  main   = "Tần số theo phương thức thanh toán ưa thích",
  xlab   = "Phương thức",
  ylab   = "Số quan sát",
  las    = 1,
  col    = terrain.colors(length(tanso_payment)),
  border = "white")

Bảng tần suất

tansuat_payment <- tanso_payment / nrow(dldt)
tansuat_payment
## 
##               Cash  Credit/Debit Card Mobile Payment App 
##               0.31               0.34               0.35

Biểu đồ

cols_payment <- terrain.colors(length(tansuat_payment))
nhanpayment <- paste0(round(tansuat_payment * 100, 1), "%")

pie(
  tansuat_payment,
  labels = NA,
  main   = "Tần suất theo phương thức thanh toán ưa thích",
  col    = cols_payment,
  border = "white"
)

legend(
  x      = "topright",
  legend = paste(names(tansuat_payment), nhanpayment),
  fill   = cols_payment,
)

Nhận xét:

Kết quả phân tích cho thấy cơ cấu Preferred Payment Method trong bộ dữ liệu có sự phân bố tương đối đồng đều giữa ba nhóm chính:

  • Cash: chiếm khoảng 31%

  • Credit/Debit Card: chiếm khoảng 34%

  • Mobile Payment App: chiếm khoảng 35%

Biểu đồ tần số và tần suất cho thấy sự phân bố theo phương thức thanh toán khá cân bằng, với một chút chênh lệch giữa các nhóm. Nhóm Mobile Payment App có số lượng người dùng cao nhất (350 người), trong khi các nhóm còn lại dao động từ 310 đến 340 người. Điều này cho thấy dữ liệu được thu thập tương đối đồng đều giữa các phương thức thanh toán, hỗ trợ tốt cho các phân tích tiếp theo về hành vi người dùng.


Ước lượng khoảng và kiểm định giả thuyết

Ước lượng khoảng tin cậy 95% cho phương thức phổ biến nhất

most_common_payment <- names(which.max(tanso_payment))
most_common_payment
## [1] "Mobile Payment App"
n_payment <- max(tanso_payment)
n_total <- nrow(dldt)
prop.test(n_payment, n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_payment out of n_total, null probability 0.5
## X-squared = 89.401, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3205743 0.3805931
## sample estimates:
##    p 
## 0.35

Tỷ lệ ước lượng: Khoảng 35% sinh viên chọn phương thức thanh toán phổ biến nhất (Mobile Payment App).

Kiểm định giả thuyết một phía (greater)

  • Giả thuyết H₀ (H0): Tỷ lệ chọn phương thức thanh toán phổ biến nhất là 30% (p = 0.3).

  • Giả thuyết H₁ (H1): Tỷ lệ chọn phương thức đó lớn hơn 30% (p > 0.3).

Quy tắc quyết định:

  • Nếu p-value < 0.05 → bác bỏ H₀

  • Nếu p-value ≥ 0.05 → không bác bỏ H₀

prop.test(n_payment, n_total, p = 0.3, alternative = "greater", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_payment out of n_total, null probability 0.3
## X-squared = 11.668, df = 1, p-value = 0.0003179
## alternative hypothesis: true p is greater than 0.3
## 95 percent confidence interval:
##  0.3251349 1.0000000
## sample estimates:
##    p 
## 0.35

Kết quả: p-value = 0.0003179 < 0.05 → đủ cơ sở để bác bỏ giả thuyết H₀.
Do đó, có đủ bằng chứng thống kê để kết luận rằng tỷ lệ chọn phương thức thanh toán phổ biến nhất lớn hơn 30%.
Tỷ lệ thực tế trong mẫu là khoảng 35%, cao hơn so với giả định ban đầu.


3. Mối quan hệ giữa 2 biến định tính

Biến Gender và Preferred Payment Method

Tần số chéo

Bảng tần số

GP <- table(dldt$gender, dldt$preferred_payment_method)
GP
##             
##              Cash Credit/Debit Card Mobile Payment App
##   Female       97               106                120
##   Male        111               120                125
##   Non-binary  102               114                105
addmargins(table(dldt$gender, dldt$preferred_payment_method))
##             
##              Cash Credit/Debit Card Mobile Payment App  Sum
##   Female       97               106                120  323
##   Male        111               120                125  356
##   Non-binary  102               114                105  321
##   Sum         310               340                350 1000

Biểu đồ

ggplot(
  dldt %>% 
    group_by(gender, preferred_payment_method) %>% 
    summarise(count = n()) %>% 
    ungroup(), 
  aes(x = gender, y = count, fill = preferred_payment_method)
) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
  labs(
    title = "Số lượng sinh viên theo giới tính và phương thức thanh toán ưa thích",
    y = "Số lượng",
    x = "Giới tính",
    fill = "Phương thức ưa thích"
  ) +
  theme_minimal()
## `summarise()` has grouped output by 'gender'. You can override using the
## `.groups` argument.

Nhận xét

Trong nhóm nữ giới, có 97 sinh viên chọn Cash, 106 chọn Credit/Debit Card, và 120 chọn Mobile Payment App. Nhóm nam giới111 sinh viên chọn Cash, 120 chọn Credit/Debit Card, và 125 chọn Mobile Payment App. Trong khi đó, nhóm không phân biệt giới tính (Non-binary)102 sinh viên chọn Cash, 114 chọn Credit/Debit Card, và 105 chọn Mobile Payment App.

Nhìn chung, từ biểu đồ cho thấy sự phân bố sinh viên giữa các nhóm giới tính và phương thức thanh toán khá đồng đều, không có sự chênh lệch đáng kể, phản ánh cơ cấu mẫu cân đối và phù hợp cho các phân tích tiếp theo.


Kiểm định chi bình phương

chisq.test(GP)
## 
##  Pearson's Chi-squared test
## 
## data:  GP
## X-squared = 1.4315, df = 4, p-value = 0.8387

Giả thuyết kiểm định:

  • H₀ (Giả thuyết không): Giới tính và năm học độc lập nhau (không có mối liên hệ).
  • H₁ (Giả thuyết thay thế): Có mối liên hệ giữa giới tính và năm học.

Giải thích ý nghĩa kiểm định:

  • Nếu p-value < 0.05: Có mối liên hệ giữa giới tính và năm học.
  • Nếu p-value > 0.05: Không có đủ bằng chứng để kết luận hai biến có liên hệ.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: 1.4315
  • Bậc tự do (df): 4
  • Giá trị p (p-value): 0.8387

Kết luận thống kê:p-value = 0.8387 > 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết H₀. Do đó, ta kết luận rằng không có mối liên hệ có ý nghĩa thống kê giữa giới tính và năm học. Nói cách khác, phân bố giới tính của sinh viên không khác biệt đáng kể giữa các năm học trong tập dữ liệu này.

Thảo luận thêm: Kết quả kiểm định phù hợp với quan sát từ biểu đồ tần suất trước đó: tỷ lệ nam và nữ sinh được phân bố khá đồng đều qua các năm học. Điều này cho thấy yếu tố giới tính không ảnh hưởng đáng kể đến sự phân bố theo năm học, phản ánh sự cân bằng giới tính trong quá trình tuyển sinh hoặc phân bố chương trình học. Tuy nhiên, để hiểu sâu hơn về ảnh hưởng của giới tính trong môi trường học tập, có thể cần phân tích thêm các yếu tố khác như chuyên ngành, kết quả học tập, hoặc hoạt động ngoại khóa.


Ước lượng khoảng và kiểm định giả thuyết

  • Giả thuyết H₀ (H0): Tỷ lệ sinh viên nữ chọn thanh toán bằng tiền mặt bằng với tỷ lệ sinh viên nam chọn thanh toán bằng tiền mặt (p₁ = p₂).

  • Giả thuyết H₁ (H1): Tỷ lệ sinh viên nữ chọn thanh toán bằng tiền mặt khác với tỷ lệ sinh viên nam (p₁ ≠ p₂).

Quy tắc quyết định:

  • Nếu p-value < 0.05 → bác bỏ H₀

  • Nếu p-value ≥ 0.05 → không đủ cơ sở bác bỏ H₀

# Lấy số người chọn Cash theo giới tính
n_female <- GP["Female", "Cash"]
n_male   <- GP["Male", "Cash"]

# Tổng số người nam/nữ chỉ xét Cash và Mobile Payment App
total_female <- GP["Female", "Cash"] + GP["Female", "Mobile Payment App"]
total_male   <- GP["Male", "Cash"] + GP["Male", "Mobile Payment App"]

# Kiểm định chênh lệch tỷ lệ
prop.test(
  x = c(n_female, n_male),
  n = c(total_female, total_male),
  alternative = "two.sided",
  conf.level = 0.95
)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(n_female, n_male) out of c(total_female, total_male)
## X-squared = 0.16282, df = 1, p-value = 0.6866
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.11957736  0.07290861
## sample estimates:
##    prop 1    prop 2 
## 0.4470046 0.4703390

Kết quả: p-value = 0.6866 > 0.05 → không đủ cơ sở để bác bỏ giả thuyết H₀.
Do đó, chưa có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên nữ và nam chọn thanh toán bằng tiền mặt là khác nhau.

Tỷ lệ thực tế trong mẫu là khoảng 44.7% ở nữ47.0% ở nam, khá tương đồng.


Tỷ số nguy cơ Relative Risk

Trong phân tích thống kê, Relative Risk (RR) chỉ phù hợp với bảng 2x2. Do đó, ta chỉ xét hai nhóm giới tính MaleFemale, cùng với hai nhóm phương thức thanh toán CashMobile Payment App.

Trước tiên, lọc dữ liệu chỉ giữ lại các trường hợp liên quan:

sub_data <- subset(dldt, gender %in% c("Male", "Female") & preferred_payment_method %in% c("Cash", "Mobile Payment App"))
table(sub_data$gender, sub_data$preferred_payment_method)
##         
##          Cash Mobile Payment App
##   Female   97                120
##   Male    111                125

Sau khi lọc, ta thu được bảng chéo giữa giới tính và năm học. Tiếp theo, ta tính toán Relative Risk để so sánh xác suất là thanh toán tiền mặt giữa hai nhóm giới tính:

library(DescTools)
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
## 
##     AUC, ICC, SD
RelRisk(table(sub_data$gender, sub_data$preferred_payment_method))
## [1] 0.9503882
  • RR = 0.95 nghĩa là: Nữ giới có khả năng chọn phương thức thanh toán bằng tiền mặt thấp hơn 5% so với nam giới.
  • Nói cách khác, trong nhóm sinh viên, tỷ lệ chọn Cash ở nữ thấp hơn nam, tuy nhiên mức chênh lệch này là rất nhỏ.
  • Do chỉ dựa vào RR đơn thuần (không có khoảng tin cậy hay kiểm định), ta chỉ nên xem đây là kết quả mô tả ban đầu, chưa thể rút ra kết luận chắc chắn.
library(epitools)
riskratio(table(sub_data$gender, sub_data$preferred_payment_method))
## $data
##         
##          Cash Mobile Payment App Total
##   Female   97                120   217
##   Male    111                125   236
##   Total   208                245   453
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9578037 0.8083892 1.134834
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.6202408    0.6378892  0.6185753
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • RR = 0.958, 95% CI = [0.8084 ; 1.1348]
  • P-value (Chi-square) = 0.6186

Điều này cho thấy:

  • Mặc dù nam giới có vẻ ít chọn phương thức thanh toán bằng ví điện tử hơn so với nữ giới, sự khác biệt không có ý nghĩa thống kê:

  • khoảng tin cậy 95% bao gồm giá trị 1 → không loại trừ khả năng hai nhóm có tỷ lệ chọn Cash tương đương.

  • P-value > 0.05 → không đủ bằng chứng để kết luận rằng giới tính là yếu tố ảnh hưởng đến lựa chọn thanh toán bằng tiền mặt.


Tỷ số chênh Odd Ratio

OddsRatio(table(sub_data$gender, sub_data$preferred_payment_method))
## [1] 0.9102853
  • Giá trị Odds Ratio = 0.9103 được tính bằng cách lấy tỉ số lựa chọn Cash/Mobile Payment App của nữ giới chia cho tỉ số của nam giới, tức:

    \[ OR = \frac{97/120}{111/125} \approx 0.9103 \]

  • Điều này có nghĩa là, so với nam giới, nữ giới có khả năng chọn phương thức thanh toán bằng tiền mặt (Cash) thấp hơn khoảng 9% so với chọn Mobile Payment App.

  • Tỷ lệ chọn Cash so với Mobile Payment App trong nhóm nam cao hơn một chút so với nhóm nữ, cho thấy nam giới có xu hướng ưu tiên chọn phương thức thanh toán bằng tiền mặt hơn so với nữ.

  • Tuy nhiên, mức chênh lệch này khá nhỏ và theo kết quả phân tích thống kê (với khoảng tin cậy chứa giá trị 1 và p-value > 0.05), sự khác biệt này không có ý nghĩa thống kê.

oddsratio(table(sub_data$gender, sub_data$preferred_payment_method))
## $data
##         
##          Cash Mobile Payment App Total
##   Female   97                120   217
##   Male    111                125   236
##   Total   208                245   453
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9105594 0.6281319 1.319046
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.6202408    0.6378892  0.6185753
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Odds Ratio (OR) = 0.911, 95% CI = [0.6281 ; 1.3190]
  • P-value (Chi-square) = 0.6186

Nhận xét:

  • Nam giới có khả năng chọn phương thức thanh toán bằng tiền mặt thấp hơn khoảng 9% so với nữ giới (OR < 1), nhưng sự khác biệt này không có ý nghĩa thống kê.

  • Khoảng tin cậy 95% bao gồm giá trị 1, cho thấy không thể loại trừ khả năng tỷ lệ chọn phương thức thanh toán giữa nam và nữ là tương đương.

  • P-value lớn hơn 0.05 (p = 0.6186) chứng tỏ không đủ bằng chứng để bác bỏ giả thuyết không, tức không có sự khác biệt có ý nghĩa giữa hai nhóm giới tính về lựa chọn phương thức thanh toán.

  • Do đó, giới tính không phải là yếu tố ảnh hưởng đáng kể đến việc lựa chọn phương thức thanh toán trong mẫu khảo sát này.