d <- read.csv("C:/Users/PC/OneDrive/Máy tính/NV6.csv", header = T)
Bộ dữ liệu bao gồm hồ sơ học tập của học sinh từ hai môn học trung học: Toán học (student-mat.csv) và Ngôn ngữ Bồ Đào Nha (student-por.csv), được thu thập từ hai trường học tại Bồ Đào Nha. Mỗi bộ gồm 32 thuộc tính, phản ánh thông tin về nhân khẩu học, bối cảnh gia đình, hỗ trợ học tập, hoạt động cá nhân và thành tích học tập (G1, G2, G3). Có 382 học sinh học cả hai môn, có thể xác định bằng cách khớp các đặc điểm cá nhân trong hai bộ dữ liệu.
Các nhóm thuộc tính chính:
Nhân khẩu học: trường học, giới tính, tuổi, địa chỉ cư trú, quy mô gia đình, tình trạng sống chung của cha mẹ.
Bối cảnh cha mẹ: trình độ học vấn, nghề nghiệp.
Hỗ trợ học tập: hỗ trợ giáo dục, lớp học phụ đạo, hỗ trợ từ gia đình.
Hoạt động cá nhân: tham gia ngoại khóa, sử dụng Internet, quan hệ yêu đương.
Thói quen và xã hội: thời gian học, thời gian đi lại, quan hệ gia đình, thời gian rảnh, mức độ tiêu thụ rượu.
Thành tích học tập: điểm số 3 kỳ (G1, G2, G3), số lần nghỉ học, số lần trượt lớp trước.
Ứng dụng tiềm năng:
Dự đoán điểm cuối (G3) dựa trên các yếu tố cá nhân và xã hội.
Phân tích ảnh hưởng của trình độ học vấn và nghề nghiệp phụ huynh đến thành tích học sinh.
Khám phá mối liên hệ giữa thói quen học tập, tiêu thụ rượu và kết quả học tập.
Đánh giá hiệu quả của các chương trình hỗ trợ giáo dục và hoạt động ngoại khóa.
Bộ dữ liệu Thực hành chứa tổng cộng 395 bản ghi với 33 biến đặc trưng.
str(d)
## 'data.frame': 395 obs. of 33 variables:
## $ school : chr "GP" "GP" "GP" "GP" ...
## $ sex : chr "F" "F" "F" "F" ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : chr "U" "U" "U" "U" ...
## $ famsize : chr "GT3" "GT3" "LE3" "GT3" ...
## $ Pstatus : chr "A" "T" "T" "T" ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : chr "at_home" "at_home" "at_home" "health" ...
## $ Fjob : chr "teacher" "other" "other" "services" ...
## $ reason : chr "course" "course" "other" "home" ...
## $ guardian : chr "mother" "father" "mother" "mother" ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : chr "yes" "no" "yes" "no" ...
## $ famsup : chr "no" "yes" "no" "yes" ...
## $ paid : chr "no" "no" "yes" "yes" ...
## $ activities: chr "no" "no" "no" "yes" ...
## $ nursery : chr "yes" "no" "yes" "yes" ...
## $ higher : chr "yes" "yes" "yes" "yes" ...
## $ internet : chr "no" "yes" "yes" "yes" ...
## $ romantic : chr "no" "no" "no" "yes" ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : int 1 1 3 1 2 2 1 1 1 1 ...
## $ health : int 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : int 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : int 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : int 6 6 10 15 10 15 11 6 19 15 ...
Các biến trong bộ dữ liệu bao gồm:
school: mã trường học mà học sinh đang theo học, dạng chuỗi ký tự (“GP” hoặc “MS”).
sex: giới tính học sinh, dạng ký tự (“F” cho nữ, “M” cho nam).
age: tuổi của học sinh, kiểu số nguyên.
address: loại địa chỉ cư trú (“U” cho khu đô thị, “R” cho nông thôn), dạng ký tự.
famsize: quy mô gia đình (“LE3” nếu ≤ 3 người, “GT3” nếu > 3 người), dạng ký tự.
Pstatus: tình trạng sống chung của cha mẹ (“T”: sống cùng nhau, “A”: sống riêng), kiểu ký tự.
Medu: trình độ học vấn của mẹ, kiểu số nguyên (từ 0: không học đến 4: đại học).
Fedu: trình độ học vấn của cha, kiểu số nguyên (tương tự Medu).
Mjob: nghề nghiệp của mẹ, dạng ký tự (“teacher”, “health”, “services”, “at_home”, “other”).
Fjob: nghề nghiệp của cha, dạng ký tự (như Mjob).
reason: lý do chọn trường, kiểu ký tự (“home”, “reputation”, “course”, “other”).
guardian: người giám hộ chính của học sinh (“mother”, “father”, “other”), dạng ký tự.
traveltime: thời gian đi đến trường (1: <15 phút, 2: 15–30 phút, 3: 30 phút–1 giờ, 4: >1 giờ), kiểu số nguyên.
studytime: thời gian học mỗi tuần (1: <2h, 2: 2–5h, 3: 5–10h, 4: >10h), kiểu số nguyên.
failures: số lần học lại lớp trước đó, kiểu số nguyên.
schoolsup: có nhận hỗ trợ học tập tại trường không (“yes” hoặc “no”), dạng ký tự.
famsup: có được gia đình hỗ trợ học tập không (“yes” hoặc “no”), dạng ký tự.
paid: có học thêm có trả phí không (“yes” hoặc “no”), kiểu ký tự.
activities: có tham gia hoạt động ngoại khóa không (“yes” hoặc “no”), kiểu ký tự.
nursery: có từng học mẫu giáo không (“yes” hoặc “no”), kiểu ký tự.
higher: mong muốn học lên cao đẳng/đại học (“yes” hoặc “no”), kiểu ký tự.
internet: có Internet ở nhà không (“yes” hoặc “no”), kiểu ký tự.
romantic: đang trong mối quan hệ yêu đương hay không (“yes” hoặc “no”), kiểu ký tự.
famrel: mức độ quan hệ trong gia đình (1: rất xấu – 5: rất tốt), kiểu số nguyên.
freetime: thời gian rảnh rỗi sau giờ học (1: rất ít – 5: rất nhiều), kiểu số nguyên.
goout: mức độ đi chơi với bạn bè (1: rất ít – 5: rất thường xuyên), kiểu số nguyên.
Dalc: mức độ tiêu thụ rượu trong ngày thường (1: rất thấp – 5: rất cao), kiểu số nguyên.
Walc: mức độ tiêu thụ rượu cuối tuần (1: rất thấp – 5: rất cao), kiểu số nguyên.
health: tình trạng sức khỏe hiện tại (1: rất kém – 5: rất tốt), kiểu số nguyên.
absences: số ngày nghỉ học, kiểu số nguyên.
G1: điểm kiểm tra kỳ 1, kiểu số nguyên.
G2: điểm kiểm tra kỳ 2, kiểu số nguyên.
G3: điểm cuối khóa học, kiểu số nguyên.
dldt <- c("school", "sex", "address", "famsize", "Pstatus", "Mjob", "Fjob",
"reason", "guardian", "schoolsup", "famsup", "paid",
"activities", "nursery", "higher", "internet", "romantic")
dt <- d[ , dldt]
any(is.na(dt))
## [1] FALSE
# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class)
## school sex address famsize Pstatus Mjob
## "character" "character" "character" "character" "character" "character"
## Fjob reason guardian schoolsup famsup paid
## "character" "character" "character" "character" "character" "character"
## activities nursery higher internet romantic
## "character" "character" "character" "character" "character"
dt <- data.frame(lapply(dt, as.factor))
Bảng tần số
# Lập bảng tần số chéo giữa SEX và PAID
SP <- table(dt$sex, dt$paid)
# Thêm tổng hàng và tổng cột
SP1 <- addmargins(SP)
SP1
##
## no yes Sum
## F 100 108 208
## M 114 73 187
## Sum 214 181 395
Bảng tần suất
# Lập bảng tần suất theo hàng (sv có việc làm)
SP_prop <- prop.table(SP, margin = 1)
# Hiển thị bảng tần suất
SP_prop
##
## no yes
## F 0.4807692 0.5192308
## M 0.6096257 0.3903743
Biểu đồ
# Chuyển bảng sang dạng data frame
SP_df <- as.data.frame(SP)
# Đổi tên cột cho rõ ràng
colnames(SP_df) <- c("SEX", "HIGHER", "Count")
library("ggplot2")
ggplot(SP_df, aes(x = `HIGHER`, y = Count, fill = `SEX`)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
geom_text(aes(label = Count),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3.5) +
labs(
title = "Biểu đồ 1. ",
x = "Paid",
y = "Giới tính",
fill = "Làm thêm"
) +
theme_minimal() +
scale_fill_brewer(palette = "Pastel1")
Giả thuyết kiểm định:
H₀: Việc học thêm và giới tính là hai biến độc lập.
H₁: Việc học thêm và giới tính có liên quan với nhau.
# Thực hiện kiểm định Chi bình phương
chiSP_score <- chisq.test(SP)
print(chiSP_score)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: SP
## X-squared = 6.0772, df = 1, p-value = 0.01369
# Lập bảng tần số chéo giữa
SP_score <- table(dt$sex, dt$paid)
# Thêm tổng hàng và tổng cột
sp1 <- addmargins(SP_score)
sp1
##
## no yes Sum
## F 100 108 208
## M 114 73 187
## Sum 214 181 395
# Số sinh viên có việc làm có điểm số cao hoặc thấp
counts <- c(SP_score["F", "yes"], SP_score["F", "no"])
# Tổng số sinh viên trong từng nhóm điểm
totals <- c(sum(SP_score[, "yes"]), sum(SP_score[, "no"]))
# Kiểm định tỉ lệ một phía: p1 < p2
test_recovery_less <- prop.test(counts, totals, alternative = "less", correct = FALSE)
test_recovery_less
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts out of totals
## X-squared = 6.586, df = 1, p-value = 0.9949
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.0000000 0.2115194
## sample estimates:
## prop 1 prop 2
## 0.5966851 0.4672897
Kết quả kiểm định:
Giá trị thống kê Chi bình phương: X² = 6.586
Bậc tự do (df) = 1
p-value = 0.9949
Với p-value = 0.9949 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là, trong dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giới tính muốn học thêm hay không.
library(epitools)
riskratio(SP_score, method= "wald")
## $data
##
## no yes Total
## F 100 108 208
## M 114 73 187
## Total 214 181 395
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 0.751832 0.6022941 0.9384974
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.01055016 0.0115295 0.01027837
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Tỷ lệ học sinh nữ trong nhóm đi học thêm bằng (78/187)/(108/208) thấp hơn khoảng 25% so với tỷ lệ hs nam
Điều này có nghĩa là:
Tỷ lệ học thêm của học sinh nam thấp hơn khoảng 25% so với học sinh nữ. Nói cách khác, học sinh nữ có khả năng học thêm cao hơn đáng kể so với nam.
Kết quả kiểm định thống kê:
Risk Ratio = 0.752, khoảng tin cậy 95%: [0.602; 0.938]
P-value = 0.0103, Chi-square < 0.05
OR_result1 <- oddsratio(SP_score)
print(OR_result1)
## $data
##
## no yes Total
## F 100 108 208
## M 114 73 187
## Total 214 181 395
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## F 1.0000000 NA NA
## M 0.5940053 0.3967869 0.8857578
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.01055016 0.0115295 0.01027837
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỷ lệ nhóm học sinh nam đi học thêm xấp xỉ khoảng 59.4% so với tỷ lệ của nhóm học sinh nữ, theo ước lượng odds ratio là 0.594
dldt <- read.csv(file.choose(), fileEncoding = "UTF-8-BOM")
is.data.frame(dldt) # Phải là TRUE
## [1] TRUE
# Chuyển sex về dạng factor: F = 0, M = 1
dldt$sex <- factor(dldt$sex, levels = c("F", "M"))
# Chuyển higher về dạng factor: no = 0, yes = 1
dldt$higher <- factor(dldt$paid, levels = c("no", "yes"))
ml_model <- glm(sex ~ paid, data = dldt, family = binomial(link = "logit"))
summary(ml_model)
##
## Call:
## glm(formula = sex ~ paid, family = binomial(link = "logit"),
## data = dldt)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.1310 0.1370 0.956 0.3389
## paidyes -0.5227 0.2043 -2.559 0.0105 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.47 on 394 degrees of freedom
## Residual deviance: 539.86 on 393 degrees of freedom
## AIC: 543.86
##
## Number of Fisher Scoring iterations: 4
Học sinh có học thêm có khả năng là nữ cao hơn đáng kể so với học sinh không học thêm. Odds để là nam ở nhóm học thêm thấp hơn 40.7% so với nhóm không học thêm, và sự khác biệt này có ý nghĩa thống kê (p = 0.0105).
library(ggplot2)
dldt$predicted_prob <- predict(ml_model, type = "response")
ggplot(dldt, aes(x = paid, y = predicted_prob)) +
stat_summary(fun = mean, geom = "bar", fill = "skyblue") +
labs(y = "Xác suất là nam", x = "Paid (có học thêm)") +
theme_minimal()
dldt$sex_bin <- ifelse(dldt$sex == "M", 1, 0)
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
logit_model <- glm(sex_bin ~ higher + studytime + Walc,
data = dldt,
family = binomial(link = "logit"))
summary(logit_model)
##
## Call:
## glm(formula = sex_bin ~ higher + studytime + Walc, family = binomial(link = "logit"),
## data = dldt)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.53676 0.38813 1.383 0.1667
## higheryes -0.48579 0.22366 -2.172 0.0299 *
## studytime -0.65598 0.14602 -4.492 7.04e-06 ***
## Walc 0.39127 0.09019 4.338 1.44e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.47 on 394 degrees of freedom
## Residual deviance: 484.77 on 391 degrees of freedom
## AIC: 492.77
##
## Number of Fisher Scoring iterations: 4
Phương trình hồi quy logistic được ước lượng như sau:
\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = 0.5368 - 0.4858 \cdot \text{higher} - 0.6560 \cdot \text{studytime} + 0.3913 \cdot \text{Walc} \]
Trong đó:
higher
: biến nhị phân (1 = có định hướng học đại
học)studytime
: thời gian học mỗi tuầnWalc
: mức độ uống rượu vào cuối tuần(Intercept) = 0.5368, không có ý nghĩa thống kê (p = 0.1667), biểu thị log-odds để là nam khi học sinh không có định hướng học đại học, học ít và không uống rượu.
higher (yes): Hệ số = -0.4858, p = 0.0299
→ Học sinh có định hướng học đại học có khả năng là nữ cao hơn, và mối quan hệ này có ý nghĩa thống kê ở mức 5%.
studytime: Hệ số = -0.6560, p = 7.04e-06
→ Mỗi mức tăng trong thời gian học làm giảm xác suất là nam, cho thấy nữ sinh có xu hướng học nhiều hơn nam sinh. Hệ số có ý nghĩa thống kê rất cao.
Walc (mức độ uống rượu cuối tuần): Hệ số = 0.3913, p = 1.44e-05
→ Mỗi mức tăng trong mức độ uống rượu làm tăng xác suất là nam, cho thấy nam sinh có xu hướng uống rượu vào cuối tuần nhiều hơn. Hệ số có ý nghĩa thống kê rất cao.
Đánh giá độ phù hợp của mô hình
Giảm deviance từ 546.47 xuống 480.56 cho thấy mô hình có giá trị giải thích nhất định.
Giá trị AIC = 494.56 cũng chấp nhận được khi so với các mô hình tương đương.
probit_model <- glm(sex_bin ~ higher + studytime + Walc,
data = dldt,
family = binomial(link = "probit"))
summary(probit_model)
##
## Call:
## glm(formula = sex_bin ~ higher + studytime + Walc, family = binomial(link = "probit"),
## data = dldt)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.30842 0.23692 1.302 0.1930
## higheryes -0.30573 0.13554 -2.256 0.0241 *
## studytime -0.38665 0.08638 -4.476 7.59e-06 ***
## Walc 0.23884 0.05421 4.406 1.05e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 546.47 on 394 degrees of freedom
## Residual deviance: 485.20 on 391 degrees of freedom
## AIC: 493.2
##
## Number of Fisher Scoring iterations: 4
Phương trình hồi quy Probit được ước lượng như sau:
\[ \Phi^{-1}(\hat{\pi}) = 0.3084 - 0.3057 \cdot \text{higher} - 0.3867 \cdot \text{studytime} + 0.2388 \cdot \text{Walc} \]
Trong đó:
\(\Phi^{-1}(\hat{\pi})\): là hàm nghịch đảo của phân phối chuẩn tích lũy (inverse CDF – chuẩn hóa), đại diện cho xác suất để học sinh là nam.
higher
: Có định hướng học đại học (yes = 1)
studytime
: Thời gian học mỗi tuần (tính theo
mức)
Walc
: Mức độ uống rượu vào cuối tuần (càng cao càng
uống nhiều)
Giới tính học sinh có mối liên hệ thống kê đáng kể với một số yếu tố học tập và hành vi cá nhân:
Mô hình hồi quy Probit:
Học sinh có định hướng học đại học có xác suất là nam thấp hơn (hệ số = -0.3057, p = 0.0241)
Thời gian học nhiều hơn làm giảm xác suất là nam (hệ số = -0.3867, p < 0.001)
Mức độ uống rượu vào cuối tuần cao hơn làm tăng xác suất là nam (hệ số = 0.2388, p < 0.001)
Hồi quy logistic đa thức là một mở rộng của hồi quy logistic nhị phân, được sử dụng khi biến phụ thuộc là biến phân loại với từ 3 mức trở lên và không có thứ tự rõ ràng.
Giả sử biến phụ thuộc \(Y \in \{1, 2, ..., K\}\), và \(X = (X_1, X_2, ..., X_p)\) là tập hợp các biến độc lập. Khi chọn nhóm \(Y = 1\) làm nhóm tham chiếu, mô hình hồi quy được viết như sau:
\[ \log\left(\frac{P(Y = k \mid X)}{P(Y = 1 \mid X)}\right) = \beta_{0k} + \beta_{1k} X_1 + \beta_{2k} X_2 + \dots + \beta_{pk} X_p \quad \text{với } k = 2, ..., K \]
Các tham số \(\beta\) được ước lượng bằng phương pháp Maximum Likelihood Estimation (MLE).
Hàm mất mát là:
\[ \ell(\beta) = \sum_{i=1}^{n} \sum_{k=1}^{K} y_{ik} \log(P(Y_i = k \mid X_i)) \]
Mỗi hệ số \(\beta_{jk}\) đại diện cho sự thay đổi log-odds giữa nhóm \(Y = k\) và nhóm tham chiếu \(Y = 1\), khi biến \(X_j\) tăng 1 đơn vị, giữ các biến khác không đổi.
Ví dụ: - Nếu \(\beta_{jk} > 0\): khi \(X_j\) tăng, khả năng \(Y = k\) xảy ra cao hơn so với \(Y = 1\) - Nếu \(\beta_{jk} < 0\): khả năng xảy ra \(Y = k\) thấp hơn so với \(Y = 1\)
\[ P(Y = k \mid X) = \frac{\exp(\eta_k)}{1 + \sum_{l=2}^{K} \exp(\eta_l)} \quad \text{với } \eta_k = \beta_{0k} + \sum_{j=1}^{p} \beta_{jk} X_j \]
\[ P(Y = 1 \mid X) = \frac{1}{1 + \sum_{l=2}^{K} \exp(\eta_l)} \] –
Ứng dụng
Ưu điểm | Nhược điểm |
---|---|
Phù hợp với biến phụ thuộc nhiều mức | Khó diễn giải trực quan nếu nhiều nhóm |
Không yêu cầu thứ tự trong các nhóm | Có thể quá khớp nếu quá nhiều biến |
Mở rộng hợp lý từ logistic nhị phân | Không mô hình hóa thứ tự giữa các mức |
Tiêu chí | Logistic nhị phân | Logistic đa thức |
---|---|---|
Số mức của biến phụ thuộc | 2 | ≥ 3 |
Số phương trình hồi quy | 1 | \(K - 1\) |
Hàm liên kết | logit | log odds so với nhóm tham chiếu |
Diễn giải | đơn giản | phức tạp hơn, nhiều log-odds |