Tập dữ liệu được sử dụng trong phân tích này nhằm khảo sát nhu cầu và hành vi lựa chọn xe hơi của người tiêu dùng. Mỗi quan sát trong bộ dữ liệu đại diện cho một mẫu xe cụ thể, với các đặc điểm kỹ thuật khác nhau và mức đánh giá tổng thể từ hệ thống.
Các biến gồm có:
buying: Giá mua xe (Expensive,low)maint: Chi phí bảo trì (high,low)doors: Số cửa (2,more2)persons: Số chỗ ngồi (little, more)lug_boot: Kích thước khoang hành lý (small, big)safety: Mức độ an toàn (low,high)class: Mức đánh giá tổng thể của xe (unacc, acc)df <- read.csv("C:/Users/Admin/Documents/PHÂN TÍCH DỮ LIỆU ĐỊNH TÍNH/data car (2).csv", stringsAsFactors = FALSE)
str(df)
## 'data.frame': 1728 obs. of 7 variables:
## $ buying : chr "Expensive" "Expensive" "Expensive" "Expensive" ...
## $ maint : chr "high" "high" "high" "high" ...
## $ doors : chr "little" "little" "little" "little" ...
## $ persons : chr "2" "2" "2" "2" ...
## $ lug_boot: chr "small" "small" "small" "small" ...
## $ safety : chr "low" "low" "high" "low" ...
## $ class : chr "unacc" "acc" "acc" "acc" ...
colSums(is.na(df))
## buying maint doors persons lug_boot safety class
## 0 0 0 0 0 0 0
df$buying <- as.factor(df$buying)
df$maint <- as.factor(df$maint)
df$doors <- as.factor(df$doors)
df$persons <- as.factor(df$persons)
df$lug_boot <- as.factor(df$lug_boot)
df$safety <- as.factor(df$safety)
df$class <- as.factor(df$class)
tanso_buying <- table(df$buying)
tanso_buying
##
## Expensive low
## 908 820
tansuat_buying <- tanso_buying / nrow(df)
tansuat_buying
##
## Expensive low
## 0.525463 0.474537
barplot(tansuat_buying,
main = "Biểu đồ phân bố - Buying",
xlab = "Buying",
ylab = "Tần suất",
col = "lightblue",
border = "black")
pie(tansuat_buying,
main = "Biểu đồ tròn - Buying",
col = rainbow(length(tansuat_buying)),
labels = paste(names(tansuat_buying), " (", round(tansuat_buying * 100, 1), "%)", sep = ""))
Nhận xét:
Kết quả phân tích cho thấy biến “buying” (Giá mua xe) có phân bố hoàn toàn gần như đồng đều giữa 2 nhóm:
Yếu tố giá cả là một trong những tiêu chí quan trọng hàng đầu ảnh hưởng đến quyết định mua xe, đặc biệt với những người tiêu dùng có ngân sách giới hạn. Trong kết quả này thì nhóm giá gần như tương đồng gần bằng nhau, không có sự chênh lệch nhiều
n_low <- sum(df$buying == "low")
n_total <- nrow(df)
prop.test(n_low, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_low out of n_total, null probability 0.5
## X-squared = 4.3802, df = 1, p-value = 0.03636
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4507875 0.4984010
## sample estimates:
## p
## 0.474537
Giả thiết đặt ra:
Giả thuyết H₀ (H0): Tỷ lệ chọn mức giá low trong tổng biến buying là 50% (p = .05).
Giả thuyết H₁ (H1): Tỷ lệ chọn mức giá low trong tổng biến buying khác 50% (p ≠ 0.5)
Nếu p-value < 0.05 bác bỏ H₀ và ngược lại **p-value ≥ 0.05* chưa đủ bằng chứng bác bỏ giả thuyết H₀
Nhận xét:
Tỷ lệ chọn mức low trong dữ liệu là
47.45%, và nằm trong khoảng tin cậy
95% từ 45.08% đến 49.84% so với giả định
50%.
Vì p-value = 0.03636 < 0.05, nên
chúng ta bác bỏ giả thuyết rằng tỷ lệ mức "low" là
50%.
Biểu đồ và bảng tần suất cho thấy có sự chênh lệch
nhẹ giữa hai nhóm giá mua (Expensive và
low), tuy nhiên vẫn tương đối cân
bằng.
Điều này cho thấy dữ liệu biến buying không
phân phối hoàn toàn đều, và sự khác biệt nhỏ này có ý
nghĩa thống kê, là cơ sở hữu ích để phân tích hành vi lựa chọn
theo mức giá.
tanso_maint <- table(df$maint)
tanso_maint
##
## high low
## 835 893
tansuat_maint <- tanso_maint / nrow(df)
tansuat_maint
##
## high low
## 0.4832176 0.5167824
barplot(tansuat_maint,
main = "Biểu đồ phân bố - Maint",
xlab = "Maint",
ylab = "Tần suất",
col = "lightgreen",
border = "black")
pie(tansuat_maint,
main = "Biểu đồ tròn - Maint",
col = rainbow(length(tansuat_maint)),
labels = paste(names(tansuat_maint), " (", round(tansuat_maint * 100, 1), "%)", sep = ""))
Nhận xét:
Tỷ lệ xe có mức maint (chi phí bảo trì) là
low chiếm 51.68%, nhỉnh hơn một chút so
với mức high là 48.32%.
Sự chênh lệch giữa hai nhóm không lớn, cho thấy
phân bố của biến maint khá đồng đều giữa
hai mức chi phí bảo trì.
Biểu đồ cột và biểu đồ tròn minh họa rõ ràng sự phân bố tương đối cân bằng khi so sánh các nhóm xe theo tiêu chí bảo trì, tức là không có sự chênh lệnh nhiều ở hai mức
n_low_maint <- sum(df$maint == "low")
n_total_maint <- nrow(df)
prop.test(n_low_maint, n_total_maint, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_low_maint out of n_total_maint, null probability 0.5
## X-squared = 1.8802, df = 1, p-value = 0.1703
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4929207 0.5405687
## sample estimates:
## p
## 0.5167824
Giả thiết đặt ra:
Nhận xét:
Tỷ lệ chọn mức low trong biến maint là
51.68%, nằm trong khoảng tin cậy 95% từ 49.29%
đến 54.06%.
Vì p-value = 0.1703 > 0.05, nên chưa
đủ bằng chứng để bác bỏ giả thuyết rằng tỷ lệ mức "low" là
50%.
Biểu đồ và tần suất cho thấy phân bố giữa hai mức chi phí bảo trì
(high và low) là tương đối cân bằng, không có
mức nào chiếm ưu thế rõ rệt. Điều này phản ánh rằng dữ liệu biến
maint có sự phân phối gần đều, cho thấy lựa chọn xe không
quá thiên lệch về chi phí bảo trì trong tập dữ liệu khảo sát.
tanso_doors <- table(df$doors)
tanso_doors
##
## little more
## 942 786
tansuat_doors <- tanso_doors / nrow(df)
tansuat_doors
##
## little more
## 0.5451389 0.4548611
barplot(tansuat_doors,
main = "Biểu đồ phân bố - Doors",
xlab = "Doors",
ylab = "Tần suất",
col = "lightcoral",
border = "black")
pie(tansuat_doors,
main = "Biểu đồ tròn - Doors",
col = rainbow(length(tansuat_doors)),
labels = paste(names(tansuat_doors), " (", round(tansuat_doors * 100, 1), "%)", sep = ""))
Nhận xét:
Tỷ lệ xe có số cửa thuộc nhóm little chiếm
54.51%, cao hơn một chút so với nhóm more
là 45.49%.Sự chênh lệch này không quá lớn, cho thấy dữ
liệu có phân bố khá cân bằng giữa hai loại thiết kế xe.
Biểu đồ cột và tròn thể hiện rõ ràng rằng xe ít cửa có xu hướng được chọn nhiều hơn trong tập dữ liệu, có thể liên quan đến sở thích xe nhỏ gọn hoặc xe cá nhân.
Kết quả này có thể phản ánh thực tế rằng người tiêu dùng có xu hướng ưa chuộng xe ít cửa, tiện lợi, dễ di chuyển, nhất là trong môi trường đô thị hoặc gia đình ít người.
n_doors_2 <- sum(df$doors == "2")
n_total <- nrow(df)
prop.test(n_doors_2, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_doors_2 out of n_total, null probability 0.5
## X-squared = 1726, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.000000000 0.002765346
## sample estimates:
## p
## 0
Giả thiết đặt ra:
Kết quả kiểm định:
Nhận xét:
Vì p-value < 0.05, ta bác bỏ giả thuyết H₀, tức là tỷ lệ xe có 2 cửa khác biệt có ý nghĩa thống kê so với giả định 50%.
Tỷ lệ thực tế là 0%, cho thấy không có bất kỳ mẫu xe nào trong dữ liệu có 2 cửa.
Điều này phản ánh rằng xe 2 cửa gần như không được lựa chọn hoặc không có trong tập khảo sát, phù hợp với thực tế thị trường khi dòng xe 2 cửa thường ít phổ biến do hạn chế về số chỗ ngồi và tính thực dụng.
tanso_persons <- table(df$persons)
tanso_persons
##
## 2 more2
## 558 1170
tansuat_persons <- tanso_persons / nrow(df)
tansuat_persons
##
## 2 more2
## 0.3229167 0.6770833
barplot(tansuat_persons,
main = "Biểu đồ phân bố - Persons",
xlab = "Persons",
ylab = "Tần suất",
col = "lightsalmon",
border = "black")
pie(tansuat_persons,
main = "Biểu đồ tròn - Persons",
col = rainbow(length(tansuat_persons)),
labels = paste(names(tansuat_persons), " (", round(tansuat_persons * 100, 1), "%)", sep = ""))
Nhận xét:
Tỷ lệ xe có 2 chỗ ngồi chỉ chiếm
32.29%, trong khi nhóm xe có từ 3 chỗ ngồi trở
lên (more2) chiếm tới 67.71%.Phân
bố này cho thấy người tiêu dùng có xu hướng ưu tiên xe có sức
chứa lớn hơn, phù hợp với nhu cầu di chuyển theo nhóm, gia đình
hoặc mục đích sử dụng linh hoạt hơn.
Biểu đồ minh họa rõ ràng sự thiên lệch về lựa chọn giữa hai nhóm, điều này có thể phản ánh thị hiếu tiêu dùng hiện nay ưu tiên tính thực dụng và sức chứa trong lựa chọn xe hơi.
n_persons_2 <- sum(df$persons == "2")
n_total <- nrow(df)
prop.test(n_persons_2, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_persons_2 out of n_total, null probability 0.5
## X-squared = 216.04, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3010002 0.3456290
## sample estimates:
## p
## 0.3229167
Giả thiết đặt ra:
Kết quả kiểm định:
2 trong biến persons là
32.29%, nằm trong khoảng tin cậy 95% từ 30.10%
đến 34.56%.Kết luận:
Vì p-value < 0.05, ta bác bỏ giả thuyết H₀, tức là tỷ lệ xe có 2 chỗ ngồi khác biệt có ý nghĩa thống kê so với 50%.
Biểu đồ và tần suất cho thấy tỷ lệ xe more2 (từ 3
chỗ trở lên) chiếm ưu thế vượt trội, phản ánh xu hướng tiêu dùng
ưa chuộng xe có nhiều chỗ ngồi hơn.
Điều này phù hợp với hành vi lựa chọn thực tế trong bối cảnh gia đình hoặc nhóm người, và cho thấy xe 2 chỗ không phải là lựa chọn phổ biến trong tập dữ liệu khảo sát.
tanso_lug <- table(df$lug_boot)
tanso_lug
##
## big small
## 1122 606
tansuat_lug <- tanso_lug / nrow(df)
tansuat_lug
##
## big small
## 0.6493056 0.3506944
barplot(tansuat_lug,
main = "Biểu đồ phân bố - Lug Boot",
xlab = "Lug Boot",
ylab = "Tần suất",
col = "lightcyan",
border = "black")
pie(tansuat_lug,
main = "Biểu đồ tròn - Lug Boot",
col = rainbow(length(tansuat_lug)),
labels = paste(names(tansuat_lug), " (", round(tansuat_lug * 100, 1), "%)", sep = ""))
Nhận xét:
Tỷ lệ xe có khoang hành lý lớn
(big) chiếm tới 64.91%, trong khi
nhóm khoang hành lý nhỏ (small) chỉ chiếm
35.09%.Phân bố này cho thấy người tiêu dùng có xu hướng
ưu tiên lựa chọn các mẫu xe có không gian chứa đồ rộng rãi, phù hợp với
nhu cầu vận chuyển linh hoạt, đặc biệt là các hộ gia đình hoặc chuyến đi
dài ngày.
Biểu đồ trực quan cũng thể hiện sự thiên lệch rõ rệt về phía nhóm
big, phản ánh thị hiếu thị trường đang nghiêng về sự tiện
lợi và công năng sử dụng trong lựa chọn xe hơi.
n_lug_small <- sum(df$lug_boot == "small")
n_total <- nrow(df)
prop.test(n_lug_small, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_lug_small out of n_total, null probability 0.5
## X-squared = 153.49, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3282646 0.3737952
## sample estimates:
## p
## 0.3506944
Giả thiết đặt ra:
small) trong tổng thể là
50% (p = 0.5)Kết quả kiểm định:
small trong biến lug_boot
là 35.09%, nằm trong khoảng tin cậy 95% từ
32.83% đến 37.38%Kết luận:
Vì p-value < 0.05, ta bác bỏ giả
thuyết H₀, tức là tỷ lệ chọn khoang hành lý small
khác biệt có ý nghĩa thống kê so với 50%.
Biểu đồ và tần suất cho thấy khoang hành lý lớn
(big) chiếm ưu thế rõ rệt, phản ánh xu hướng người
tiêu dùng ưu tiên tính tiện nghi, không gian chứa đồ rộng
rãi khi lựa chọn xe.
Đây là yếu tố quan trọng để doanh nghiệp định hướng phát triển sản phẩm, đặc biệt trong phân khúc xe gia đình hoặc phục vụ nhu cầu vận chuyển nhiều đồ đạc.
tanso_safety <- table(df$safety)
tanso_safety
##
## high low
## 615 1113
tansuat_safety <- tanso_safety / nrow(df)
tansuat_safety
##
## high low
## 0.3559028 0.6440972
barplot(tansuat_safety,
main = "Biểu đồ phân bố - Safety",
xlab = "Safety",
ylab = "Tần suất",
col = "khaki",
border = "black")
pie(tansuat_safety,
main = "Biểu đồ tròn - Safety",
col = rainbow(length(tansuat_safety)),
labels = paste(names(tansuat_safety), " (", round(tansuat_safety * 100, 1), "%)", sep = ""))
Nhận xét:
Tỷ lệ xe có mức an toàn thấp (low)
chiếm tới 64.41%, trong khi nhóm mức an toàn
cao (high) chỉ chiếm 35.59%.Phân
bố này cho thấy người tiêu dùng trong tập dữ liệu có xu hướng
lựa chọn các mẫu xe không đặt nặng yếu tố an toàn, có
thể vì lý do giá cả, thói quen sử dụng, hoặc tính năng khác được ưu tiên
hơn, tuy nhiên vấn đề này vẫn được cho coi là đúng với thị trường hiện
tại
Vì vậy có thể đây sẽ là yếu tố mà doanh nghiệp cần lưu ý khi xây dựng chiến lược sản phẩm, đặc biệt nếu nhắm vào phân khúc giá rẻ hoặc thị trường phổ thông – đồng thời cũng là cơ hội để truyền thông nâng cao nhận thức về an toàn trong tiêu dùng xe hơi.
n_safety_low <- sum(df$safety == "low")
n_total <- nrow(df)
prop.test(n_safety_low, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_safety_low out of n_total, null probability 0.5
## X-squared = 142.95, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.6209331 0.6666139
## sample estimates:
## p
## 0.6440972
Giả thiết đặt ra:
low trong tổng thể là 50% (p = 0.5)low khác 50% (p ≠ 0.5)Kết quả kiểm định:
low trong biến safety là
64.41%, nằm trong khoảng tin cậy 95% từ 62.09%
đến 66.66%Kết luận:
Vì p-value < 0.05, ta bác bỏ giả
thuyết H₀, tức là tỷ lệ chọn mức an toàn low
khác biệt có ý nghĩa thống kê so với 50%.
Biểu đồ và tần suất cũng cho thấy sự thiên lệch rõ
rệt về phía mức low, phản ánh rằng yếu tố an toàn
chưa được đặt làm ưu tiên hàng đầu trong lựa chọn xe
của người tiêu dùng trong tập dữ liệu khảo sát.Đây có thể được coi là 1
biến hạn chế sai lệch trong đề tài bởi vì nó không đúng thực tế
tanso_class <- table(df$class)
tanso_class
##
## acc unacc
## 519 1209
tansuat_class <- tanso_class / nrow(df)
tansuat_class
##
## acc unacc
## 0.3003472 0.6996528
barplot(tansuat_class,
main = "Biểu đồ phân bố - Class",
xlab = "Class",
ylab = "Tần suất",
col = "plum",
border = "black")
pie(tansuat_class,
main = "Biểu đồ tròn - Class",
col = rainbow(length(tansuat_class)),
labels = paste(names(tansuat_class), " (", round(tansuat_class * 100, 1), "%)", sep = ""))
Nhận xét:
Kết quả phân tích cho thấy biến class (Phân loại xe) có
sự phân bố không đồng đều giữa các nhóm:
Tỷ lệ xe được đánh giá “acceptable” (acc)** chỉ
chiếm 30.03%, trong khi số lượng xe bị đánh giá
“unacceptable” (unacc) chiếm tới
69.97%.Phân bố này cho thấy phần lớn các mẫu xe trong
dữ liệu không đạt chuẩn chất lượng hoặc mức đánh giá tối thiểu, dẫn đến
việc bị xếp loại unacc.
Biểu đồ cột và tròn minh họa rõ sự chênh lệch lớn giữa hai nhóm, cho thấy đây là một bộ dữ liệu với xu hướng thiên về đánh giá khắt khe hoặc các mẫu xe có thông số kỹ thuật chưa tốt.
n_unacc <- sum(df$class == "unacc")
n_total <- nrow(df)
prop.test(n_unacc, n_total, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_unacc out of n_total, null probability 0.5
## X-squared = 274.72, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.677321 0.721087
## sample estimates:
## p
## 0.6996528
Giả thiết đặt ra:
unacc trong tổng thể là 50% (p =
0.5)unacc
khác 50% (p ≠ 0.5)Kết quả kiểm định:
unacc trong biến class là
69.97%, nằm trong khoảng tin cậy 95% từ 67.73%
đến 72.11%Kết luận:
Vì p-value < 0.05, ta bác bỏ giả
thuyết H₀, tức là tỷ lệ xe bị đánh giá
unacc khác biệt có ý nghĩa thống kê so với
50%.
Biểu đồ và tần suất cho thấy phần lớn xe trong dữ liệu
không đạt mức đánh giá chấp nhận được, dẫn đến tỷ lệ
unacc chiếm ưu thế.
Đây là dấu hiệu cho thấy chất lượng xe trong dữ liệu nhìn chung khá thấp, hoặc hệ thống đánh giá đang nghiêm khắc. Điều này có thể ảnh hưởng lớn đến niềm tin người tiêu dùng và là căn cứ để doanh nghiệp cải thiện tiêu chuẩn sản phẩm hoặc truyền thông rõ hơn về tính năng nổi bật của xe.
table_cb <- table(df$class, df$buying)
table_cb
##
## Expensive low
## acc 265 254
## unacc 643 566
round(prop.table(table_cb, margin = 1) * 100, 2)
##
## Expensive low
## acc 51.06 48.94
## unacc 53.18 46.82
Quan sát bảng tần số chéo cho thấy:
Trong nhóm xe được đánh giá là acc (chấp nhận
được):
Ngược lại, trong nhóm unacc (không chấp nhận
được):
unacc cũng phân bố tương đối đồng đều giữa
hai mức giá, nhưng vẫn hơi nghiêng về phía xe đắt
tiền.Sự chênh lệch nhỏ giữa các tỷ lệ cho thấy giá mua không
phải là yếu tố duy nhất quyết định mức độ đánh giá xe
(class), vì cả xe đắt (Expensive) và
rẻ (low) đều có tỷ lệ bị đánh giá
unacc.
Điều này phản ánh rằng chất lượng đánh giá xe không phụ
thuộc rõ rệt vào giá bán, mà có thể liên quan nhiều hơn đến các
yếu tố như an toàn (safety), chi phí bảo trì
(maint), hoặc số chỗ ngồi (persons).
chisq.test(table_cb)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_cb
## X-squared = 0.57497, df = 1, p-value = 0.4483
Giả thiết đặt ra:
buying) và mức đánh
giá xe (class)buying và
classKết quả kiểm định:
Kết luận:
Vì p-value = 0.4483 > 0.05, ta không bác bỏ giả thuyết H₀
Điều này cho thấy, giá mua xe không ảnh hưởng rõ rệt đến
mức độ đánh giá chất lượng (acc hay
unacc) trong bộ dữ liệu này.
Điều này phản ánh rằng người tiêu dùng hoặc hệ thống đánh giá không hoàn toàn căn cứ vào giá cả khi đưa ra nhận định chất lượng xe.Đây là cơ sở cho thấy giá không phải là yếu tố quyết định chất lượng, và doanh nghiệp nên tập trung cải thiện các yếu tố kỹ thuật, an toàn, hoặc chi phí sử dụng thay vì chỉ cạnh tranh bằng giá.
library(ggplot2)
ggplot(df, aes(x = class, fill = buying)) +
geom_bar(position = "dodge") +
labs(
title = "Biểu đồ cột nhóm: Class và Buying",
x = "Class",
y = "Số lượng",
fill = "Buying"
) +
theme_minimal()
install.packages(“epitools”) library(epitools)
library(epitools)
# Tạo lại bảng 2x2 từ bảng tần số chéo trên
table_cb2x2 <- matrix(c(265, 643, 254, 566),
nrow = 2,
byrow = TRUE,
dimnames = list(Class = c("acc", "unacc"),
Buying = c("Expensive", "low")))
Tính Risk Ratio
riskratio(table_cb2x2)
## $data
## Buying
## Class Expensive low Total
## acc 265 643 908
## unacc 254 566 820
## Total 519 1209 1728
##
## $measure
## risk ratio with 95% C.I.
## Class estimate lower upper
## acc 1.0000000 NA NA
## unacc 0.9747146 0.9161034 1.037076
##
## $p.value
## two-sided
## Class midp.exact fisher.exact chi.square
## acc NA NA NA
## unacc 0.4180589 0.430796 0.4174733
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Kết quả phân tích Risk Ratio (RR) giữa hai biến
class (gồm acc và unacc) và
buying (Expensive vs low) cho
thấy:
Với RR= 0.9747 nghĩa là nhóm xe bị đánh giá unacc có nguy cơ chọn mức low thấp hơn 0.9747 lần so với nhóm acc
Hay nói cách khác RR = 0.9747 nghĩa là: nguy cơ
chọn mức giá low ở nhóm unacc giảm nhẹ
khoảng 2.5% so với nhóm acctheo công thức (1 -
0.9747 = 0.0253 hay 2.53%)
Tất cả các giá trị p- value cho nhóm “unacc” (ví dụ: 0.4180589, 0.430796, 0.4174733) đều lớn hơn 0.05. Điều này khẳng định rằng không có đủ bằng chứng thống kê để kết luận có sự khác biệt đáng kể về nguy cơ giữa nhóm “unacc” và “acc”.
Tính Oddsratio
oddsratio(table_cb2x2)
## $data
## Buying
## Class Expensive low Total
## acc 265 643 908
## unacc 254 566 820
## Total 519 1209 1728
##
## $measure
## odds ratio with 95% C.I.
## Class estimate lower upper
## acc 1.0000000 NA NA
## unacc 0.9183985 0.7473962 1.128577
##
## $p.value
## two-sided
## Class midp.exact fisher.exact chi.square
## acc NA NA NA
## unacc 0.4180589 0.430796 0.4174733
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Kết quả cho thấy:
Hay nói cách khác giá trị OR = 0.9184 cho
thấy:
→ Odds (khả năng xảy ra tương đối) để xe thuộc nhóm
unacc được chọn ở mức giá
low thấp hơn khoảng 8.2%
so với nhóm acc. ( do odds <1)
Điều này được tính theo công thức:
\[
(1 - OR) \times 100\% = (1 - 0.9184) \times 100\% \approx 8.2\%
\]
`- Tất cả các giá trị p- value cho nhóm “unacc” (0.4180589, 0.430796, 0.4174733) đều lớn hơn 0.05. Điều này khẳng định rằng không có đủ bằng chứng thống kê để kết luận có sự khác biệt đáng kể về nguy cơ giữa nhóm “unacc” và “acc”.
class.Sau quá trình phân tích, có thể nhận thấy rằng bộ dữ liệu hiện tại chưa thật sự phản ánh đầy đủ và chính xác nhu cầu mua xe của người tiêu dùng trong bối cảnh hiện tại, bởi các lý do sau:
Bộ dữ liệu chủ yếu dựa trên các yếu tố định tính như giá xe, kích thước cốp, dung tích chở người,… mà không xét đến các yếu tố quan trọng khác như thương hiệu xe, mức độ an toàn, hiệu suất tiêu thụ nhiên liệu, chính sách hậu mãi,…
Dữ liệu có vẻ đã cũ hoặc không cập nhật với thị trường thực tế ngày nay, vốn đã thay đổi nhiều về xu hướng tiêu dùng, công nghệ xe, và mức độ cạnh tranh.
Ước lượng hợp lý cực đại (MLE) là một phương pháp thống kê nhằm tìm giá trị tham số \(\theta\) sao cho xác suất xảy ra của tập dữ liệu quan sát là lớn nhất, dựa trên hàm phân phối xác suất giả định.
Giả sử \(X_1, X_2, ..., X_n\) là mẫu ngẫu nhiên độc lập từ phân phối có hàm mật độ xác suất \(f(x; \theta)\), thì:
Hàm hợp lý (Likelihood): \[ L(\theta) = \prod_{i=1}^{n} f(x_i; \theta) \]
Log-likelihood: \[ \ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log f(x_i; \theta) \]
Ước lượng MLE: \[ \hat{\theta}_{MLE} = \arg\max_{\theta} \ell(\theta) \]
Giả sử \(X_1, X_2, ..., X_n \sim \text{Bernoulli}(p)\), với \(0 < p < 1\).
Hàm mật độ: \[ f(x; p) = p^x (1-p)^{1-x} \]
Hàm hợp lý: \[ L(p) = \prod_{i=1}^{n} p^{x_i}(1-p)^{1-x_i} \]
Log-likelihood: \[ \ell(p) = \sum_{i=1}^{n} \left[ x_i \log(p) + (1 - x_i) \log(1 - p) \right] \]
Đạo hàm log-likelihood: \[ \frac{d\ell(p)}{dp} = \frac{\sum x_i}{p} - \frac{n - \sum x_i}{1 - p} \]
Giải phương trình: \[ \frac{d\ell(p)}{dp} = 0 \Rightarrow \hat{p} = \frac{\sum x_i}{n} \]
GLM ( Generalized Linear Model ) là một mô hình hồi quy mở rộng từ hồi quy tuyến tính truyền thống, cho phép mô hình hóa nhiều loại biến phụ thuộc: nhị phân, đếm, liên tục dương,…
GLM gồm 3 thành phần chính:
Là phần tuyến tính:
\[
\eta = \beta_0 + \beta_1 X_1 + \dots + \beta_k X_k
\]
Còn gọi là bộ dự báo tuyến tính \(\eta\).
Mô tả ảnh hưởng tuyến tính của các biến độc lập \(X\) lên biến phụ thuộc đã biến đổi qua hàm liên kết.
Kết nối kỳ vọng của \(Y\) với thành phần hệ thống \(\eta\): \[ g(\mu) = \eta \quad \text{hoặc} \quad \mu = g^{-1}(\eta) \]
Đảm bảo:
Phân phối Normal
- Hàm liên kết: \(g(\mu) = \mu\) (hàm
đồng nhất)
- Mô hình: Hồi quy tuyến tính (Linear Regression)
Phân phối Binomial
- Hàm liên kết: \(g(\mu) = \log\left(
\frac{\mu}{1 - \mu} \right)\) (hàm logit)
- Mô hình: Hồi quy logistic (Logistic Regression)
Phân phối Poisson
- Hàm liên kết: \(g(\mu) = \log(\mu)\)
(hàm log)
- Mô hình: Hồi quy Poisson (Poisson Regression)
Phân phối Gamma
- Hàm liên kết: \(g(\mu) = 1/\mu\) (hàm
nghịch đảo)
- Mô hình: Hồi quy Gamma (Gamma Regression)
Tình huống:
Giả sử bạn muốn dự đoán xác suất một khách hàng mua sản phẩm (Yes = 1,
No = 0) dựa trên số lần họ truy cập website (visits) và số
email quảng cáo đã nhận (emails).
Ta xây dựng một mô hình GLM như sau:
customer_response (0
hoặc 1)visits,
emailspurchase là nhị phân)Phân tích 3 thành phần GLM trong ví dụ
Thành phần Hệ thống (Systematic Component)
\[
\eta = \beta_0 + \beta_1 \cdot visits + \beta_2 \cdot emails
\]
Đây là tổ hợp tuyến tính của các biến độc lập.
Thành phần Ngẫu nhiên (Random Component)
Biến purchase tuân theo phân phối Bernoulli, thuộc họ phân
phối hàm mũ.
Hàm Liên kết (Link Function)
Sử dụng hàm logit:
\[
g(\mu) = \log\left( \frac{\mu}{1 - \mu} \right)
\]
với \(\mu = E[Y] = \text{xác suất mua
hàng}\)
Hàm liên kết (logit)
Hàm logistic sử dụng logit – log của odds (tỷ số xác suất), được định nghĩa như sau:
\[ \text{logit}(p_i) = \log\left(\frac{p_i}{1 - p_i} \right) \] Trong đó: \[ p_i = \frac{1}{1 + e^{-\eta_i}} = \frac{e^{\eta_i}}{1 + e^{\eta_i}} \] Log-likelihood của mô hình logistic với dữ liệu nhị phân
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right] \] Diễn giải
Hàm liên kết (probit)
Hàm probit sử dụng hàm phân phối tích lũy chuẩn chuẩn hóa \(\Phi\) làm nghịch đảo của liên kết:
\[ \Phi^{-1}(p_i) = \eta_i = X_i \beta \]
Với:
\(\Phi\) là hàm phân phối tích lũy chuẩn chuẩn hóa:
\[ \Phi(z) = \int_{-\infty}^{z} \frac{1}{\sqrt{2\pi}} \exp\left(-\frac{t^2}{2}\right) dt \]
Hàm xác suất
\[ p_i = \Phi(\eta_i) = \Phi(X_i \beta) \] Hàm Log-Likelihood
\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(\Phi(X_i \beta)) + (1 - y_i) \log(1 - \Phi(X_i \beta)) \right] \]
Trong phân tích hồi quy nhị phân, ngoài mô hình logit và probit, ta còn có mô hình cloglog (complementary log-log), thích hợp khi xác suất xảy ra sự kiện gần 0 hoặc gần 1 không đối xứng.
Mô hình cloglog sử dụng hàm liên kết:
\[ g(p) = \log(-\log(1 - p)) \]
trong đó \(p = P(Y = 1 | X)\) là xác suất của biến phụ thuộc nhị phân.
Khi đó, mô hình tuyến tính tổng quát có dạng:
\[ \log(-\log(1 - p)) = \beta_0 + \beta_1 X_1 + \dots + \beta_k X_k \]
Ngược lại, ta có:
\[ p = 1 - \exp(-\exp(\beta_0 + \beta_1 X_1 + \dots + \beta_k X_k)) \]
Đặc điểm
So sánh cụ thể giữa các mô hình: Logit - Probit - Cloglog
| Đặc điểm | Logit | Probit | Cloglog |
|---|---|---|---|
| Hàm liên kết (link) | \(\log\left(\frac{p}{1 - p}\right)\) | \(\Phi^{-1}(p)\) | \(\log(-\log(1 - p))\) |
| Phân phối nền tảng | Logistic | Chuẩn (normal) | Gumbel (phân phối cực trị) |
| Đối xứng của hàm liên kết | Có | Có | Không |
| Cách ước lượng | Ước lượng tối đa xác suất (MLE) | Ước lượng tối đa xác suất (MLE) | Ước lượng tối đa xác suất (MLE) |
| Ý nghĩa thực tiễn | Biến đổi log-odds | Biến đổi sang điểm z chuẩn hóa | Biến đổi log(-log(1-p)) tương ứng với rủi ro tích lũy |
| Tính chất hàm liên kết | Đối xứng quanh \(p=0.5\) | Đối xứng quanh \(p=0.5\) | Không đối xứng, dốc nhanh khi p gần 0 hoặc 1 |
| Ưu điểm | Dễ hiểu, phổ biến, tính toán nhanh | Dựa trên giả định phân phối chuẩn | Phù hợp với dữ liệu có xác suất lệch hoặc sự kiện hiếm |
| Nhược điểm | Không phù hợp nếu xác suất lệch | Tính toán có thể phức tạp hơn | Ít phổ biến, khó diễn giải trực tiếp hệ số |
Ma trận nhầm lẫn là một công cụ phổ biến để đánh giá hiệu quả của các mô hình phân loại, đặc biệt trong bài toán phân loại nhị phân. Ma trận này biểu diễn số lượng dự đoán đúng và sai của mô hình theo từng loại nhãn.
| Dự đoán: Positive (P) | Dự đoán: Negative (N) | |
|---|---|---|
| Thực tế: Positive (P) | True Positive (TP) | False Negative (FN) |
| Thực tế: Negative (N) | False Positive (FP) | True Negative (TN) |
Trong đó:
Giải thích các chỉ số dùng trong MTNL
Accuracy (Độ chính xác): Tỷ lệ dự đoán đúng trên tổng số
mẫu
\[
\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}
\]
Precision (Độ chính xác dương): Tỷ lệ dự đoán Positive
đúng trên tổng số dự đoán Positive
\[
\text{Precision} = \frac{TP}{TP + FP}
\]
Recall (Độ nhạy, Sensitivity): Tỷ lệ dự đoán Positive
đúng trên tổng số mẫu thực tế Positive
\[
\text{Recall} = \frac{TP}{TP + FN}
\]
F1-score: Trung bình điều hòa của Precision và
Recall
\[
F1 = 2 \times \frac{\text{Precision} \times
\text{Recall}}{\text{Precision} + \text{Recall}}
\]
Ví dụ minh họa
Giả sử bạn xây dựng mô hình dự đoán bệnh có (1) hoặc không có (0). Kết quả thu được, bạn có:
Qua ma trận nhầm lẫn, bạn biết được mô hình có xu hướng bỏ sót bệnh nhân (FN cao) hay báo động sai (FP cao), từ đó cải thiện mô hình hoặc lựa chọn ngưỡng phù hợp.
df <- read.csv("data car (2).csv")
head(df)
## buying maint doors persons lug_boot safety class
## 1 Expensive high little 2 small low unacc
## 2 Expensive high little 2 small low acc
## 3 Expensive high little 2 small high acc
## 4 Expensive high little 2 small low acc
## 5 Expensive high little 2 small low acc
## 6 Expensive high little 2 small high acc
str(df)
## 'data.frame': 1728 obs. of 7 variables:
## $ buying : chr "Expensive" "Expensive" "Expensive" "Expensive" ...
## $ maint : chr "high" "high" "high" "high" ...
## $ doors : chr "little" "little" "little" "little" ...
## $ persons : chr "2" "2" "2" "2" ...
## $ lug_boot: chr "small" "small" "small" "small" ...
## $ safety : chr "low" "low" "high" "low" ...
## $ class : chr "unacc" "acc" "acc" "acc" ...
df$target <- ifelse(df$class == "unacc", 0, 1)
table(df$target)
##
## 0 1
## 1209 519
Tổng quan phân phối biến
Sau khi biến class được chuyển thành biến nhị phân target, trong đó:
target = 1 biểu thị các xe có chất lượng chấp nhận được trở lên (acc),
target = 0 biểu thị các xe bị đánh giá là không chấp nhận được (unacc),
ta thu được phân phối như sau:
Số lượng xe không chấp nhận được: 1.209 quan sát (chiếm khoảng 70%)
Số lượng xe chấp nhận được trở lên: 519 quan sát (chiếm khoảng 30%)
df$buying <- factor(df$buying)
df$maint <- factor(df$maint)
df$safety <- factor(df$safety)
# tạo biến giả
df_encoded <- model.matrix(target ~ buying + maint + safety, data = df)[, -1]
df_model <- data.frame(target = df$target, df_encoded)
# Hồi quy logistic
model_logit <- glm(target ~ ., data = df_model, family = binomial(link = "logit"))
summary(model_logit)
##
## Call:
## glm(formula = target ~ ., family = binomial(link = "logit"),
## data = df_model)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.87100 0.11892 -7.324 2.40e-13 ***
## buyinglow 0.03663 0.10784 0.340 0.734
## maintlow 0.72796 0.10940 6.654 2.85e-11 ***
## safetylow -0.64303 0.10950 -5.873 4.29e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2112.2 on 1727 degrees of freedom
## Residual deviance: 2029.0 on 1724 degrees of freedom
## AIC: 2037
##
## Number of Fisher Scoring iterations: 4
Nhận xét:
Dựa trên kết quả hồi quy logistic với hàm liên kết logit, ta nhận được các hệ số ước lượng và giá trị kiểm định như sau:
Biến maintlow có hệ số \(\hat{\beta} = 0.72796\), với giá trị
p-value rất nhỏ (\(2.85 \times
10^{-11}\)), có ý nghĩa thống kê ở mức 1%. Điều này cho thấy, khi
chi phí bảo trì ở mức thấp (maint = low), xác suất xe được
đánh giá là “chấp nhận được trở lên” tăng lên đáng kể.
Biến safetylow có hệ số âm \(\hat{\beta} = -0.64403\) và p-value cực kỳ
nhỏ (\(4.29 \times 10^{-9}\)), cũng có
ý nghĩa thống kê ở mức 1%. Điều này cho thấy mức độ an toàn thấp làm
giảm đáng kể xác suất xe được đánh giá là chấp nhận được.
Biến buyinglow có hệ số dương rất nhỏ \(\hat{\beta} = 0.03663\), nhưng p-value là
0.734, không có ý nghĩa thống kê, tức là ảnh hưởng của giá mua ở mức
thấp không đáng kể trong việc phân biệt khả năng được chấp nhận.
Intercept (hệ số chặn) có ý nghĩa thống kê cao, và phản
ánh log-odds khi tất cả các biến giả đều bằng 0
# Hồi quy probit
model_probit <- glm(target ~ ., data = df_model, family = binomial(link = "probit"))
summary(model_probit)
##
## Call:
## glm(formula = target ~ ., family = binomial(link = "probit"),
## data = df_model)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.517585 0.071355 -7.254 4.06e-13 ***
## buyinglow -0.003252 0.064663 -0.050 0.96
## maintlow 0.431793 0.064978 6.645 3.03e-11 ***
## safetylow -0.385140 0.066239 -5.814 6.09e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2112.2 on 1727 degrees of freedom
## Residual deviance: 2030.2 on 1724 degrees of freedom
## AIC: 2038.2
##
## Number of Fisher Scoring iterations: 4
Nhận xét:
Dựa trên mô hình hồi quy Probit với hàm liên kết chuẩn, ta thu được các kết quả ước lượng và kiểm định như sau:
Biến maintlow có hệ số \(\hat{\beta} = 0.43179\), với giá trị
p-value rất nhỏ \((3.03 \times
10^{-11})\), có ý nghĩa thống kê ở mức 1%. Điều này cho thấy, khi
chi phí bảo trì ở mức thấp (maint = low), xác suất xe được
đánh giá là “chấp nhận được trở lên” tăng lên đáng kể.
Biến safetylow có hệ số âm \(\hat{\beta} = -0.38514\) và p-value cực kỳ
nhỏ \((6.09 \times 10^{-9})\), cũng có
ý nghĩa thống kê ở mức 1%. Điều này cho thấy mức độ an toàn thấp làm
giảm đáng kể xác suất xe được đánh giá là chấp nhận được.
Biến buyinglow có hệ số rất nhỏ \(\hat{\beta} = -0.00325\), với p-value là
0.96, không có ý nghĩa thống kê, tức là ảnh hưởng của giá mua ở mức thấp
không đáng kể trong việc phân biệt khả năng được chấp nhận.
Intercept (hệ số chặn) có ý nghĩa thống kê cao, và phản ánh log-probit khi tất cả các biến giả đều bằng 0
coef_logit <- coef(model_logit)
coef_probit <- coef(model_probit)
comparison <- data.frame(
Variable = names(coef_logit),
Logit_Coeff = round(coef_logit, 4),
Probit_Coeff = round(coef_probit, 4)
)
comparison
## Variable Logit_Coeff Probit_Coeff
## (Intercept) (Intercept) -0.8710 -0.5176
## buyinglow buyinglow 0.0366 -0.0033
## maintlow maintlow 0.7280 0.4318
## safetylow safetylow -0.6430 -0.3851
Nhận xét:
Bảng trên thể hiện sự khác biệt giữa hệ số hồi quy thu được từ mô hình Logit và Probit
Biến maintlow có hệ số dương trong cả hai mô hình
(logit: 0.7280, probit: 0.4318), cho thấy chi phí bảo trì thấp làm tăng
khả năng xe được đánh giá là chấp nhận được.
Biến safetylow có hệ số âm ở cả hai mô hình (logit:
-0.6430, probit: -0.3851), cho thấy mức độ an toàn thấp làm giảm xác
suất xe được đánh giá tích cực.
Biến buyinglow có hệ số gần 0 ở cả hai mô hình
(logit: 0.0366, probit: -0.0033) và không có ý nghĩa thống kê. Do đó,
biến này không có tác động đáng kể đến khả năng xe được chấp
nhận.
Hệ số chặn (intercept) khác biệt giữa hai mô hình (logit: -0.8710, probit: -0.5176), phản ánh khác biệt về thang đo của hai hàm liên kết, nhưng không ảnh hưởng đến ý nghĩa thống kê của các biến độc lập.
df_model$pred_logit <- predict(model_logit, type = "response")
df_model$pred_probit <- predict(model_probit, type = "response")
df_model$pred_class_logit <- ifelse(df_model$pred_logit >= 0.5, 1, 0)
df_model$pred_class_probit <- ifelse(df_model$pred_probit >= 0.5, 1, 0)
acc_logit <- mean(df_model$pred_class_logit == df_model$target)
acc_probit <- mean(df_model$pred_class_probit == df_model$target)
c("Accuracy - Logistic" = acc_logit, "Accuracy - Probit" = acc_probit)
## Accuracy - Logistic Accuracy - Probit
## 0.6996528 0.6996528
Sau khi chạy mô hình hồi quy logistic hoặc probit, ta sẽ thu được một giá trị xác suất dự đoán cho mỗi quan sát – ký hiệu là \(\hat{p} = P(Y = 1 | X)\), tức là xác suất để biến phụ thuộc bằng 1, dựa trên các biến đầu vào.Tuy nhiên trong bài toán data car ta cần xem mỗi quan sát nên được xếp vào nhóm 0 hay 1. Vì thế, ta cần xác định một ngưỡng phân loại – thường là 0.5:
Để đánh giá độ chính xác(Accuracy) của mô hình bằng cách so sánh nhãn dự đoán với nhãn thực tế. Cụ thể, độ chính xácđược tính theo công thức:
\[ \text{Accuracy} = \frac{\text{Số lượng dự đoán đúng}}{\text{Tổng số quan sát}} = \frac{\sum_{i=1}^{n} I(\hat{y}_i = y_i)}{n} \]
Trong đó: - \(\hat{y}_i\): kết quả mô hình dự đoán (sau phân loại) - \(y_i\): nhãn thực tế của dữ liệu - \(I(\hat{y}_i = y_i)\): hàm chỉ thị, trả về 1 nếu dự đoán đúng, 0 nếu sai
Nhận xét kết quả thu được
Sau khi áp dụng cả hai mô hình vào bộ dữ liệu xe, ta thu được kết quả phân loại với độ chính xác (Accuracy) như sau:
-> Cả hai mô hình đều cho ra độ chính xác hoàn toàn giống nhau, tức là khoảng 70% các trường hợp đã được dự đoán đúng so với dữ liệu thực tế.Điều này cho thấy hai mô hình có hiệu suất tương đương nhau trên bộ dữ liệu này khi sử dụng cùng một tập biến giải thích và ngưỡng phân loại 0.5.