Đọc file dữ liệu gốc
data <- read.csv(file = file.choose(), header = T)
Các biến định tính
# Chọn các biến định tính
dldt <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
# Tạo bộ dữ liệu mới chỉ chứa định tính
dat <- data[, dldt]
Bộ dữ liệu này gồm 14,059 giao dịch mua hàng tại siêu thị, với các thông tin liên quan đến khách hàng và sản phẩm bao gồm mã định danh khách hàng và các thông tin liên quan, vị trí địa lý, chi tiết các sản phẩm được mua.
Dữ liệu này có thể được sử dụng để phân tích hành vi mua sắm của khách hàng, phân khúc thị trường, hoặc đánh giá hiệu quả kinh doanh theo từng sản phẩm, từng khu vực và từng nhóm đối tượng.
Danh sách các biến và mô tả
Cấu trúc bộ dữ liệu Supermarket Transactions
str(data)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
## $ CustomerID : int 7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
## $ Gender : chr "F" "M" "F" "M" ...
## $ MaritalStatus : chr "S" "M" "M" "M" ...
## $ Homeowner : chr "Y" "Y" "N" "Y" ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : chr "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
## $ City : chr "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
## $ StateorProvince : chr "CA" "CA" "WA" "OR" ...
## $ Country : chr "USA" "USA" "USA" "USA" ...
## $ ProductFamily : chr "Food" "Food" "Food" "Food" ...
## $ ProductDepartment: chr "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
## $ ProductCategory : chr "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
## $ UnitsSold : int 5 5 3 4 4 3 4 6 1 2 ...
## $ Revenue : num 27.38 14.9 5.52 4.44 14 ...
Số biến và số quan sát
dim(dat)
## [1] 14059 10
Kiểm tra số lượng NA trong cột định tính
sapply(dat, …): áp dụng hàm cho từng cột trong dữ liệu dat.
sum(is.na(x)): đếm số lượng NA trong từng cột.
# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(dat, function(x) sum(is.na(x)))
na_counts
## Gender MaritalStatus Homeowner AnnualIncome
## 0 0 0 0
## City StateorProvince Country ProductFamily
## 0 0 0 0
## ProductDepartment ProductCategory
## 0 0
Nhận xét - Kết quả thu được cho thấy rằng tất cả các cột định tính đều không có giá trị thiếu (NA) vì số lượng NA trong các cột đều hiển thị là 0
# Chuyển đổi các cột sang factor nếu chưa phải là factor
dat <- as.data.frame(lapply(dat, function(x) {
if (!is.factor(x)) {
return(as.factor(x))
} else {
return(x)
}
}))
Kết quả thu được toàn bộ các biến đã được chuyển đổi thành dạng factor.
Thống kê tuần suất và trực quan hóa
tab_ProductCategory <- table(dat$ProductCategory)
tab_ProductCategory
##
## Baking Goods Bathroom Products Beer and Wine
## 484 365 356
## Bread Breakfast Foods Candles
## 425 417 45
## Candy Canned Anchovies Canned Clams
## 352 44 53
## Canned Oysters Canned Sardines Canned Shrimp
## 35 40 38
## Canned Soup Canned Tuna Carbonated Beverages
## 404 87 154
## Cleaning Supplies Cold Remedies Dairy
## 189 93 903
## Decongestants Drinks Eggs
## 85 135 198
## Electrical Frozen Desserts Frozen Entrees
## 355 323 118
## Fruit Hardware Hot Beverages
## 765 129 226
## Hygiene Jams and Jellies Kitchen Products
## 197 588 217
## Magazines Meat Miscellaneous
## 202 761 42
## Packaged Vegetables Pain Relievers Paper Products
## 48 192 345
## Pizza Plastic Products Pure Juice Beverages
## 194 141 165
## Seafood Side Dishes Snack Foods
## 102 153 1600
## Specialty Starchy Foods Vegetables
## 289 277 1728
table(dat$ProductCategory)/sum(nrow(dat))
##
## Baking Goods Bathroom Products Beer and Wine
## 0.034426346 0.025962017 0.025321858
## Bread Breakfast Foods Candles
## 0.030229746 0.029660716 0.003200797
## Candy Canned Anchovies Canned Clams
## 0.025037343 0.003129668 0.003769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.002489508 0.002845153 0.002702895
## Canned Soup Canned Tuna Carbonated Beverages
## 0.028736041 0.006188207 0.010953837
## Cleaning Supplies Cold Remedies Dairy
## 0.013443346 0.006614980 0.064229319
## Decongestants Drinks Eggs
## 0.006045949 0.009602390 0.014083505
## Electrical Frozen Desserts Frozen Entrees
## 0.025250729 0.022974607 0.008393200
## Fruit Hardware Hot Beverages
## 0.054413543 0.009175617 0.016075112
## Hygiene Jams and Jellies Kitchen Products
## 0.014012376 0.041823743 0.015434953
## Magazines Meat Miscellaneous
## 0.014368020 0.054129028 0.002987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.003414183 0.013656732 0.024539441
## Pizza Plastic Products Pure Juice Beverages
## 0.013798990 0.010029163 0.011736254
## Seafood Side Dishes Snack Foods
## 0.007255139 0.010882709 0.113806103
## Specialty Starchy Foods Vegetables
## 0.020556227 0.019702682 0.122910591
barplot(tab_ProductCategory, main = "Danh mục sản phẩm - ProductCategory", col = "#FF0000", las = 2)
Nhận xét
Các loại thực phẩm phổ biến được quan sát từ biểu đồ:
Vegetables (Rau): với số lượng là 1728 khách hàng và chiếm hết (12.2910591%)
Snack Foods: 1600 khách hàng và chiếm hết (11.3806103%)
Dairy (Sữa): 903 khách hàng và chiếm hết (6.4229319%)
Fruit, Meat, Frozen Foods…
Đây là những mặt hàng tiêu dùng nhanh, có vòng đời ngắn.
Việc khách hàng mua chủ yếu các mặt hàng thiết yếu cho thấy siêu thị hoạt động tốt trong việc phục vụ nhu cầu cơ bản, chứ không phải sản phẩm xa xỉ hay không thường xuyên.
Thống kê tần suất và trực quan hóa
tab_AnnualIncome <- table(dat$AnnualIncome)
tab_AnnualIncome
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
table(dat$AnnualIncome)/sum(nrow(dat))
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 0.21978804 0.04573583 0.05405790 0.01941817 0.32726367
## $50K - $70K $70K - $90K $90K - $110K
## 0.16857529 0.12155914 0.04360196
barplot(tab_AnnualIncome, main = "Thu nhập/tháng - AnnualIncome", col = "lightblue", las = 2)
Nhận xét
Nhóm $30K - $50K chiếm đa số với 3090 khách hàng (chiếm 32.7263675%), theo sau là:
Nhóm $10K - $30K (21.9788036%)
Nhóm $50K - $70K (16.857529%)
Rất ít khách hàng có thu nhập trên $150K (1.9418166%)
Điều này cho thấy rằng chuỗi siêu thị chủ yếu phục vụ nhóm thu nhập trung bình và thấp – phù hợp với chiến lược giá rẻ, hàng hóa thiết yếu.
Chiến lược marketing, khuyến mãi, và chính sách giá nên tập trung vào nhóm này (ví dụ: combo tiết kiệm, chiết khấu theo số lượng).
Thống kê tần suất và trực quan hóa
tab_Country <- table(dat$Country)
tab_Country
##
## Canada Mexico USA
## 809 3688 9562
table(dat$Country)/sum(nrow(dat))
##
## Canada Mexico USA
## 0.05754321 0.26232307 0.68013372
barplot(tab_Country, main = "Quốc gia - Country", col = "orchid", las = 2)
Nhận xét
Tỷ lệ khách hàng theo quốc gia phân bổ theo trình tự giảm dần:
Cao nhất là USA: 68.0133722%
Kế tiếp là Mexico: 26.2323067%
Thấp nhất là Canada: 5.7543211%
US Hoa Kỳ rõ ràng là thị trường trọng điểm với tỷ lệ khách hàng giao dịch cao nhất trong 3 quốc gia. Điều này chứng tỏ Hoa Kỳ là một quốc gia phát triển mạnh với nhu cầu tiêu dùng chiến phần lớn.
Tuy nhiên, sự hiện diện tại Mexico (hơn 1/4 số giao dịch) cho thấy đây là thị trường thứ cấp tiềm năng, có thể mở rộng hoặc tăng nhận diện thương hiệu.
Thống kê tần suất và trực quan hóa
Sử dụng hàm table() để đếm số lần xuất hiện (tần suất) của từng giá trị trong biến định tính.
prop.table(tab_gender) tạo bảng tỷ lệ phần trăm (theo dạng thập phân). Nhân với 100 để ra phần trăm.
round(…, 2) làm tròn 2 chữ số sau dấu phẩy.
barplot() tạo biểu đồ cột từ bảng tần suất.
main: tiêu đề biểu đồ.
col: màu sắc cột (ở đây là màu “steelblue”).
las = 2: xoay nhãn trục hoành (X) theo chiều dọc để dễ đọc.
tab_gender <- table(dat$Gender)
tab_gender
##
## F M
## 7170 6889
table(dat$Gender)/sum(nrow(dat))
##
## F M
## 0.5099936 0.4900064
barplot(tab_gender, main = "Tần suất - Gender", col = "lightyellow", las = 2)
Nhận xét
Dữ liệu cho thấy có 7170 khách hàng là nữ (50.9993598%) và 6889 là khách hàng nam (49.0006402%).
Tỷ lệ giới tính giữa nam và nữ trong dữ liệu khá cân bằng, không có sự khác biệt đáng kể nào.
Điều này cho thấy chuỗi siêu thị hướng tới phục vụ cả hai giới một cách đồng đều, thay vì tập trung vào một nhóm cụ thể.
Mặt khác, việc nữ giới chiếm tỷ lệ nhỉnh hơn đôi chút có thể xuất phát từ vai trò thường thấy của họ trong việc mua sắm nhu yếu phẩm và quản lý chi tiêu gia đình, dẫn đến khả năng cao họ là người thực hiện các giao dịch được ghi nhận trong hóa đơn.
Thống kê tuần suất và trực quan hóa
tab_MaritalStatus <- table(dat$MaritalStatus)
tab_MaritalStatus
##
## M S
## 6866 7193
table(dat$MaritalStatus)/sum(nrow(dat))
##
## M S
## 0.4883704 0.5116296
barplot(tab_MaritalStatus, main = "Tình trạng hôn nhân - MaritalStatus", col = "skyblue", las = 2)
Nhận xét
Số lượng khách hàng độc thân (Single – ký hiệu S) là 6866 người (chiếm 48.8370439%), còn người đã kết hôn (Married – M) là 1, 0 người (chiếm 51.1629561%)
Mặc dù tỷ lệ khá cân bằng, nhưng nhóm độc thân chiếm tỷ lệ cao hơn một chút.
Giải thích hợp lý cho điều này có thể là:
Những người độc thân có xu hướng tự đi mua sắm nhiều hơn, không dựa vào bạn đời.
Ngoài ra, người trẻ độc thân thường sống ở thành thị và sử dụng dịch vụ siêu thị thường xuyên hơn, trong khi người đã kết hôn có thể mua theo nhóm hoặc theo hộ gia đình lớn và ít giao dịch hơn trên mỗi cá nhân.
Thống kê tần suất và trực quan hóa
tab_Homeowner <- table(dat$Homeowner)
tab_Homeowner
##
## N Y
## 5615 8444
table(dat$Homeowner)/sum(nrow(dat))
##
## N Y
## 0.3993883 0.6006117
barplot(tab_Homeowner, main = "Sở hữu nhà - Homeowner", col = "darkseagreen", las = 2)
Nhận xét
Từ kết quả thu được ta thấy có 5615 khách hàng (chiếm 39.9388292%) không sở hữu nhà, còn 8444 khách hàng (chiếm 60.0611708%) là chủ sở hữu nhà.
Đây là một chỉ báo quan trọng về sự ổn định tài chính của khách hàng.
Người sở hữu nhà thường có:
Chi tiêu ổn định hơn.
Nhu cầu mua sắm nhiều hơn cho gia đình (thực phẩm, đồ gia dụng).
Trong khi đó, người không sở hữu nhà (có thể thuê nhà hoặc sống tạm thời) có thể:
Chi tiêu dè dặt hơn.
Ít mua hàng số lượng lớn, hoặc ưu tiên hàng nhỏ gọn, dễ vận chuyển.
Thống kê tần suất và trực quan hóa
tab_City <- table(dat$City)
tab_City
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 383 143 811 834 452
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 75 845 926 654 194
## Orizaba Portland Salem San Andres San Diego
## 464 876 1386 621 866
## San Francisco Seattle Spokane Tacoma Vancouver
## 130 922 875 1257 633
## Victoria Walla Walla Yakima
## 176 160 376
table(dat$City)/sum(nrow(dat))
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 0.027242336 0.010171420 0.057685468 0.059321431 0.032150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.005334661 0.060103848 0.065865282 0.046518245 0.013798990
## Orizaba Portland Salem San Andres San Diego
## 0.033003770 0.062308841 0.098584537 0.044170994 0.061597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.009246746 0.065580767 0.062237712 0.089408920 0.045024539
## Victoria Walla Walla Yakima
## 0.012518671 0.011380610 0.026744434
barplot(tab_City, main = "Thành phố - City", col = "pink", las = 2)
Nhận xét
Các thành phố có tỷ lệ giao dịch cao là:
Salem là thành phố có tỉ lệ khách hàng mua sản phẩm cao nhất với 1386 khách hàng và chiếm hết (9.8584537%)
Theo sau là thành phố Tacoma (1.2518671%)
Kế tiếp là thành phố Los Angeles (6.5865282%) và ta thấy thành phố Seattle với 6.5580767% xấp xỉ bằng với thành phố Los Angeles. Qua đó ta nhìn nhận được rằng 2 thành phố này có lượng khách hàng mua sắm gần như nhau.
Có thể nhận thấy sự tập trung mạnh tại các thành phố bờ Tây Hoa Kỳ, đặc biệt ở các bang Washington, Oregon và California.
Điều này gợi ý rằng:
Các chi nhánh ở các thành phố này có lưu lượng khách hàng lớn, hoặc
Các thành phố này có mật độ dân cư cao, nhu cầu tiêu dùng thường xuyên.
Thống kê tần suất và trực quan hóa
tab_StateorProvince <- table(dat$StateorProvince)
tab_StateorProvince
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
table(dat$StateorProvince)/sum(nrow(dat))
##
## BC CA DF Guerrero Jalisco OR
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378
## Veracruz WA Yucatan Zacatecas
## 0.033003770 0.324845295 0.046518245 0.092254072
barplot(tab_StateorProvince, main = "Bang/Tỉnh - StateorProvince", col = "goldenrod", las = 2)
Nhận xét
Phân bố:
Washington(WA): 32.4845295%
California(CA): 19.4395049%
Oregon(OR): 16.0893378%
Ba bang này đều ở bờ Tây Hoa Kỳ, và là những bang có:
Dân số đông, thị trường bán lẻ phát triển.
Thói quen tiêu dùng hiện đại, sử dụng dịch vụ siêu thị nhiều hơn so với các khu vực nông thôn.
Việc mở rộng kinh doanh hoặc đầu tư thêm vào các bang này là chiến lược khả thi.
Thống kê tần suất và trực quan hóa
tab_ProductFamily <- table(dat$ProductFamily)
tab_ProductFamily
##
## Drink Food Non-Consumable
## 1250 10153 2656
table(dat$ProductFamily)/sum(nrow(dat))
##
## Drink Food Non-Consumable
## 0.08891102 0.72217085 0.18891813
barplot(tab_ProductFamily, main = "Nhóm sản phẩm - ProductFamily", col = "darkblue", las = 2)
Nhận xét
Thực phẩm (Food) chiếm đa số (72.2170851%), cao vượt trội so với:
Non-Consumables chiếm 18.8918131%
Nhóm đồ uống chiếm 8.8911018%
Điều này cho thấy khách hàng mua sắm chủ yếu là để phục vụ nhu cầu ăn uống hàng ngày.
Siêu thị nên tiếp tục đầu tư mạnh vào:
Nguồn cung thực phẩm tươi,
Các sản phẩm thiết yếu giá tốt,
Chính sách ưu đãi số lượng lớn cho thực phẩm.
Thống kê tần suất và trực quan hóa
tab_ProductDepartment <- table(dat$ProductDepartment)
tab_ProductDepartment
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 356 425 1072 680
## Breakfast Foods Canned Foods Canned Products Carousel
## 188 977 109 59
## Checkout Dairy Deli Eggs
## 82 903 699 198
## Frozen Foods Health and Hygiene Household Meat
## 1382 893 1420 89
## Periodicals Produce Seafood Snack Foods
## 202 1994 102 1600
## Snacks Starchy Foods
## 352 277
table(dat$ProductDepartment)/sum(nrow(dat))
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 0.025321858 0.030229746 0.076250089 0.048367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 0.013372217 0.069492852 0.007753041 0.004196600
## Checkout Dairy Deli Eggs
## 0.005832563 0.064229319 0.049719041 0.014083505
## Frozen Foods Health and Hygiene Household Meat
## 0.098300021 0.063518031 0.101002916 0.006330464
## Periodicals Produce Seafood Snack Foods
## 0.014368020 0.141830856 0.007255139 0.113806103
## Snacks Starchy Foods
## 0.025037343 0.019702682
barplot(tab_ProductDepartment, main = "Bộ phận sản phẩm - ProductDepartment", col = "darkred", las = 2)
Nhận xét
Các bộ phân chiếm đa số trong toàn bộ các bộ phận được thống kê:
Produce (Rau quả): 14.1830856%
Snack Foods: 11.3806103%
Household: 10.1002916%
Khách hàng mua nhiều các mặt hàng:
Tươi sống, dễ hỏng (produce) -> yêu cầu bảo quản và chuỗi cung ứng tốt.
Đồ ăn vặt và hàng gia dụng -> phản ánh thói quen tiêu dùng nhanh, tiện lợi.
Đây là cơ hội để tăng cường marketing nhóm sản phẩm tiện lợi, combo bữa ăn, sản phẩm cho hộ gia đình.
# Xác định hạng mục quan tâm
table(dat$Gender)
##
## F M
## 7170 6889
# Số lượng và tổng số
slfemale <- sum(dat$Gender == "F")
totalgender <- length(dat$Gender)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ "Female"
prop.test(slfemale, totalgender, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slfemale out of totalgender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
# Kiểm định giả thuyết: tỷ lệ Female = 0.5
prop.test(slfemale, totalgender, p = 0.5, alternative = "two.sided", conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slfemale out of totalgender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
Giả thuyết
H0: p = 0.5
H1: p ≠ 0.5
Đọc kết quả và kết luận
Tổng số cá thể trong mẫu là 14.059 người, trong đó có 7.170 người là nữ và 6.889 người là nam. Tỷ lệ nữ giới trong mẫu là 50.99936%.
Kết quả kiểm định tỷ lệ một mẫu với giả thuyết tỷ lệ nữ trong tổng thể là 50% (H₀: p = 0.5) cho thấy giá trị thống kê Chi-squared = 5.5765 với 1 bậc tự do, và p-value = 0.0182. Với mức ý nghĩa thông thường α = 0.05, ta bác bỏ giả thuyết không, cho thấy tỷ lệ nữ giới trong mẫu có sự khác biệt có ý nghĩa thống kê so với tỷ lệ 50%.
Khoảng tin cậy 95% cho tỷ lệ nữ trong quần thể nằm trong khoảng từ 50.16931% đến 51.82886%, cho thấy tỷ lệ này chỉ hơi cao hơn 50%.
Tóm lại
Kết luận
# Xác định hạng mục quan tâm
table(dat$Homeowner)
##
## N Y
## 5615 8444
slshn <- sum(dat$Homeowner == "Y")
totalhomeowner <- length(dat$Homeowner)
# Ước lượng khoảng tin cậy
prop.test(slshn, totalhomeowner, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slshn out of totalhomeowner, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5924537 0.6087145
## sample estimates:
## p
## 0.6006117
# Kiểm định giả thuyết H0: tỷ lệ chủ nhà = 0.6
prop.test(slshn, totalhomeowner, p = 0.6, alternative = "two.sided", conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slshn out of totalhomeowner, null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
## 0.5924537 0.6087145
## sample estimates:
## p
## 0.6006117
Giả thuyết 1
H0: p = 0.5
H1: p ≠ 0.5
Đọc kết quả và kết luận
Giả thuyết 2
H0: p = 0.6
H1: p ≠ 0.6
Đọc kết quả và kết luận
Tóm lại:
# Xác định hạng mục đề cập
table(dat$ProductFamily)
##
## Drink Food Non-Consumable
## 1250 10153 2656
slfood <- sum(dat$ProductFamily == "Food")
totalproduct <- length(dat$ProductFamily)
# Ước lượng khoảng tin cậy
prop.test(slfood, totalproduct, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slfood out of totalproduct, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.7146709 0.7295489
## sample estimates:
## p
## 0.7221709
# Kiểm định giả thuyết H0: tỷ lệ >= 0.7 (alternative = "greater": kiểm định 1 phía (>))
prop.test(slfood, totalproduct, p = 0.7, alternative = "greater", conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: slfood out of totalproduct, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 5.101e-09
## alternative hypothesis: true p is greater than 0.7
## 95 percent confidence interval:
## 0.7158789 1.0000000
## sample estimates:
## p
## 0.7221709
Giả thuyết 1
H0: p = 0.5
H1: p ≠ 0.5
Đọc kết quả và kết luận
Kết quả kiểm định tỷ lệ một mẫu cho giả thuyết rằng tỷ lệ sản phẩm thuộc nhóm Food bằng 50% (H₀: p = 0.5) cho thấy:
Giá trị thống kê Chi-squared = 2774.9, df = 1
p-value < 2.2e-16
Với mức ý nghĩa là 0.05, ta bác bỏ giả thuyết H0, nghĩa là tỷ lệ sản phẩm nhóm Food không chiếm 50% trong tổng số “ProductFamily”.
Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.47% đến 72.95%.
Giả thuyết 2
H0: p = 0.7
H1: p > 0.7
Đọc kết quả và kết luận
Kết quả kiểm định tiếp theo kiểm tra xem liệu tỷ lệ sản phẩm nhóm Food có cao hơn 70% hay không, cho thấy:
Giá trị Chi-squared = 32.802, df = 1
p-value = 5.101e-09
Với mức ý nghĩa 0.05, ta tiếp tục bác bỏ giả thuyết không, và chấp nhận giả thuyết đối (H₁: p > 0.7). Điều này chứng tỏ tỷ lệ sản phẩm nhóm Food lớn hơn 70% với ý nghĩa thống kê cao.
Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.58% đến 100%.
install.packages("tidyverse", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
install.packages("janitor", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'janitor' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
install.packages("gmodels", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'gmodels' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
install.packages("ggplot2", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
install.packages("scales", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'scales' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(gmodels)
## Warning: package 'gmodels' was built under R version 4.4.3
library(ggplot2)
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
Bảng tần suất chéo
tab1 <- table(dat$Gender, dat$ProductFamily)
tab1
##
## Drink Food Non-Consumable
## F 669 5149 1352
## M 581 5004 1304
prop.table(tab1, 1) # theo hàng
##
## Drink Food Non-Consumable
## F 0.09330544 0.71813110 0.18856346
## M 0.08433735 0.72637538 0.18928727
Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):
Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).
Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).
So sánh giới tính:
Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.
Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).
Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).
Kết luận:
Trực quan hóa
ggplot(dat, aes(x = Gender, fill = ProductFamily)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ ProductFamily theo Gender", y = "Tỷ lệ", x = "Gender") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()
Nhận xét
Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):
Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).
Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).
So sánh giới tính:
Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.
Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).
Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).
Kết luận:
Kiểm định Chi-bình phương
chi_result1 <- chisq.test(tab1)
chi_result1
##
## Pearson's Chi-squared test
##
## data: tab1
## X-squared = 3.5185, df = 2, p-value = 0.1722
# Giá trị thống kê Chi-squared
chi_result1$statistic
## X-squared
## 3.51849
# Bậc tự do
chi_result1$parameter
## df
## 2
# Giá trị p
chi_result1$p.value
## [1] 0.1721748
Giả thuyết
Giả thuyết H0: Giới tính (Gender) và Nhóm sản phẩm (ProductFamily) là độc lập, không có mối liên hệ.
Giả thuyết H1: Giới tính và Nhóm sản phẩm có liên hệ với nhau.
Kết quả kiểm định:
Giá trị thống kê Chi-squared: X-squared = 3.51849
Bậc tự do: df = 2
Giá trị p: p = 0.1721748
Kết luận:
Bảng tần suất chéo
tab2 <- table(dat$MaritalStatus, dat$Homeowner)
tab2
##
## N Y
## M 1719 5147
## S 3896 3297
prop.table(tab2, 1)
##
## N Y
## M 0.2503641 0.7496359
## S 0.5416377 0.4583623
Trực quan hóa
ggplot(dat, aes(x = MaritalStatus, fill = Homeowner)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ Homeowner theo Marital Status", y = "Tỷ lệ", x = "Marital Status") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("Y" = "#FFDAB9", "N" = "#D8BFD8"))
theme_minimal()
## List of 136
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ linewidth : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.theta : NULL
## $ axis.text.r :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0.5
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.theta : NULL
## $ axis.ticks.r : NULL
## $ axis.minor.ticks.x.top : NULL
## $ axis.minor.ticks.x.bottom : NULL
## $ axis.minor.ticks.y.left : NULL
## $ axis.minor.ticks.y.right : NULL
## $ axis.minor.ticks.theta : NULL
## $ axis.minor.ticks.r : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom : NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.ticks.length.theta : NULL
## $ axis.ticks.length.r : NULL
## $ axis.minor.ticks.length : 'rel' num 0.75
## $ axis.minor.ticks.length.x : NULL
## $ axis.minor.ticks.length.x.top : NULL
## $ axis.minor.ticks.length.x.bottom: NULL
## $ axis.minor.ticks.length.y : NULL
## $ axis.minor.ticks.length.y.left : NULL
## $ axis.minor.ticks.length.y.right : NULL
## $ axis.minor.ticks.length.theta : NULL
## $ axis.minor.ticks.length.r : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ axis.line.theta : NULL
## $ axis.line.r : NULL
## $ legend.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.key.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.key.spacing.x : NULL
## $ legend.key.spacing.y : NULL
## $ legend.frame : NULL
## $ legend.ticks : NULL
## $ legend.ticks.length : 'rel' num 0.2
## $ legend.axis.line : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.position : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.position : NULL
## $ legend.position : chr "right"
## $ legend.position.inside : NULL
## $ legend.direction : NULL
## $ legend.byrow : NULL
## $ legend.justification : chr "center"
## $ legend.justification.top : NULL
## $ legend.justification.bottom : NULL
## $ legend.justification.left : NULL
## $ legend.justification.right : NULL
## $ legend.justification.inside : NULL
## $ legend.location : NULL
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## [list output truncated]
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
Nhận xét
Trong nhóm đã kết hôn (M): Gần 75% là chủ sở hữu nhà (Y).
Trong nhóm độc thân (S): Chỉ khoảng 50% là chủ sở hữu nhà, phần còn lại là không sở hữu nhà (N).
Kiểm định Chi-bình phương
chi_result2 <- chisq.test(tab2)
chi_result2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result2$statistic
## X-squared
## 1241.218
# Bậc tự do
chi_result2$parameter
## df
## 1
# Giá trị p
chi_result2$p.value
## [1] 6.724506e-272
Giả thuyết
Giả thuyết H0: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) là độc lập, không có mối liên hệ.
Giả thuyết H1: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) có liên hệ với nhau.
Kết quả kiểm định:
Giá trị thống kê Chi-squared: X-squared = 1241.22
Bậc tự do: df = 1
Giá trị p: p < 2.2e-16
Kết luận:
Bảng tần suất chéo
tab3 <- table(dat$AnnualIncome, dat$ProductDepartment)
tab3
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## $10K - $30K 80 108 256 148
## $110K - $130K 14 23 49 35
## $130K - $150K 15 24 54 25
## $150K + 3 10 19 20
## $30K - $50K 121 134 336 228
## $50K - $70K 61 63 189 97
## $70K - $90K 39 50 130 91
## $90K - $110K 23 13 39 36
##
## Breakfast Foods Canned Foods Canned Products Carousel Checkout
## $10K - $30K 54 203 29 8 20
## $110K - $130K 3 49 4 1 2
## $130K - $150K 11 46 6 3 9
## $150K + 3 21 0 1 1
## $30K - $50K 63 335 37 30 21
## $50K - $70K 31 170 18 8 22
## $70K - $90K 19 120 11 7 5
## $90K - $110K 4 33 4 1 2
##
## Dairy Deli Eggs Frozen Foods Health and Hygiene Household Meat
## $10K - $30K 174 147 37 327 201 313 24
## $110K - $130K 38 33 9 66 33 63 5
## $130K - $150K 49 45 15 84 51 76 4
## $150K + 17 13 4 26 19 27 2
## $30K - $50K 299 233 67 442 292 432 27
## $50K - $70K 160 107 36 212 134 272 17
## $70K - $90K 126 96 20 151 120 182 7
## $90K - $110K 40 25 10 74 43 55 3
##
## Periodicals Produce Seafood Snack Foods Snacks Starchy Foods
## $10K - $30K 49 420 17 329 76 70
## $110K - $130K 17 77 3 85 16 18
## $130K - $150K 9 109 8 83 19 15
## $150K + 1 33 5 35 8 5
## $30K - $50K 65 650 44 533 127 85
## $50K - $70K 36 344 11 274 60 48
## $70K - $90K 18 264 12 184 29 28
## $90K - $110K 7 97 2 77 17 8
prop.table(tab3, 1)
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## $10K - $30K 0.025889968 0.034951456 0.082847896 0.047896440
## $110K - $130K 0.021772939 0.035769829 0.076205288 0.054432348
## $130K - $150K 0.019736842 0.031578947 0.071052632 0.032894737
## $150K + 0.010989011 0.036630037 0.069597070 0.073260073
## $30K - $50K 0.026298631 0.029124103 0.073027603 0.049554445
## $50K - $70K 0.025738397 0.026582278 0.079746835 0.040928270
## $70K - $90K 0.022820363 0.029256875 0.076067876 0.053247513
## $90K - $110K 0.037520392 0.021207178 0.063621533 0.058727569
##
## Breakfast Foods Canned Foods Canned Products Carousel
## $10K - $30K 0.017475728 0.065695793 0.009385113 0.002588997
## $110K - $130K 0.004665630 0.076205288 0.006220840 0.001555210
## $130K - $150K 0.014473684 0.060526316 0.007894737 0.003947368
## $150K + 0.010989011 0.076923077 0.000000000 0.003663004
## $30K - $50K 0.013692676 0.072810259 0.008041730 0.006520322
## $50K - $70K 0.013080169 0.071729958 0.007594937 0.003375527
## $70K - $90K 0.011117613 0.070216501 0.006436513 0.004095963
## $90K - $110K 0.006525285 0.053833605 0.006525285 0.001631321
##
## Checkout Dairy Deli Eggs Frozen Foods
## $10K - $30K 0.006472492 0.056310680 0.047572816 0.011974110 0.105825243
## $110K - $130K 0.003110420 0.059097978 0.051321928 0.013996890 0.102643857
## $130K - $150K 0.011842105 0.064473684 0.059210526 0.019736842 0.110526316
## $150K + 0.003663004 0.062271062 0.047619048 0.014652015 0.095238095
## $30K - $50K 0.004564225 0.064985873 0.050641165 0.014562052 0.096066073
## $50K - $70K 0.009282700 0.067510549 0.045147679 0.015189873 0.089451477
## $70K - $90K 0.002925688 0.073727326 0.056173201 0.011702750 0.088355764
## $90K - $110K 0.003262643 0.065252855 0.040783034 0.016313214 0.120717781
##
## Health and Hygiene Household Meat Periodicals
## $10K - $30K 0.065048544 0.101294498 0.007766990 0.015857605
## $110K - $130K 0.051321928 0.097978227 0.007776050 0.026438569
## $130K - $150K 0.067105263 0.100000000 0.005263158 0.011842105
## $150K + 0.069597070 0.098901099 0.007326007 0.003663004
## $30K - $50K 0.063464464 0.093892632 0.005868290 0.014127364
## $50K - $70K 0.056540084 0.114767932 0.007172996 0.015189873
## $70K - $90K 0.070216501 0.106495026 0.004095963 0.010532475
## $90K - $110K 0.070146819 0.089722675 0.004893964 0.011419250
##
## Produce Seafood Snack Foods Snacks Starchy Foods
## $10K - $30K 0.135922330 0.005501618 0.106472492 0.024595469 0.022653722
## $110K - $130K 0.119751166 0.004665630 0.132192846 0.024883359 0.027993779
## $130K - $150K 0.143421053 0.010526316 0.109210526 0.025000000 0.019736842
## $150K + 0.120879121 0.018315018 0.128205128 0.029304029 0.018315018
## $30K - $50K 0.141273636 0.009563138 0.115844382 0.027602695 0.018474245
## $50K - $70K 0.145147679 0.004641350 0.115611814 0.025316456 0.020253165
## $70K - $90K 0.154476302 0.007021650 0.107665301 0.016968988 0.016383850
## $90K - $110K 0.158238173 0.003262643 0.125611746 0.027732463 0.013050571
Trực quan hóa
ggplot(dat, aes(x = AnnualIncome, fill = ProductDepartment)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ ProductDepartment theo Annual Income", y = "Tỷ lệ", x = "Annual Income") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()
Nhận xét
Kiểm định chi - bình phương
chi_result3 <- chisq.test(tab3)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
chi_result3
##
## Pearson's Chi-squared test
##
## data: tab3
## X-squared = 170.16, df = 147, p-value = 0.09276
# Giá trị thống kê Chi-squared
chi_result3$statistic
## X-squared
## 170.1572
# Bậc tự do
chi_result3$parameter
## df
## 147
# Giá trị p
chi_result3$p.value
## [1] 0.0927647
Giả thuyết
Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment là độc lập, không có mối liên hệ.
Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment có liên hệ với nhau.
Kết quả kiểm định:
Giá trị thống kê Chi-squared: X-squared = 170.16
Bậc tự do: df = 147
Giá trị p: p = 0.0927647
Kết luận:
Bảng tần suất chéo
tab4 <- table(dat$Homeowner, dat$AnnualIncome)
tab4
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## N 1359 119 136 48 2087 1063
## Y 1731 524 624 225 2514 1307
##
## $70K - $90K $90K - $110K
## N 686 117
## Y 1023 496
prop.table(tab4, 1)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## N 0.242030276 0.021193232 0.024220837 0.008548531 0.371682992 0.189314337
## Y 0.204997631 0.062055898 0.073898626 0.026646139 0.297726196 0.154784462
##
## $70K - $90K $90K - $110K
## N 0.122172752 0.020837044
## Y 0.121151113 0.058739934
Trực quan hóa
ggplot(dat, aes(x = AnnualIncome, fill = Homeowner)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ Homeowner theo Annual Income", y = "Tỷ lệ", x = "Annual Income") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()
Nhận xét
Kiểm định chi - bình phương
chi_result4 <- chisq.test(tab4)
chi_result4
##
## Pearson's Chi-squared test
##
## data: tab4
## X-squared = 546.37, df = 7, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result4$statistic
## X-squared
## 546.3723
# Bậc tự do
chi_result4$parameter
## df
## 7
# Giá trị p
chi_result4$p.value
## [1] 8.517274e-114
Giả thuyết
Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) là độc lập, không có mối liên hệ.
Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) có liên hệ với nhau.
Kết quả kiểm định:
Giá trị thống kê Chi-squared: X-squared = 546.37
Bậc tự do: df = 7
Giá trị p: p <2.2e-16
Kết luận:
Bảng tần suất chéo
tab5 <- table(dat$Gender, dat$Country)
tab5
##
## Canada Mexico USA
## F 373 2056 4741
## M 436 1632 4821
prop.table(tab5, 1)
##
## Canada Mexico USA
## F 0.05202232 0.28675035 0.66122734
## M 0.06328930 0.23689940 0.69981129
Trực quan hóa
ggplot(dat, aes(x = Country, fill = Gender)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ giới tính theo quốc gia", y = "Tỷ lệ", x = "Country") +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("M" = "yellow", "F" = "pink")) +
theme_minimal()
Nhận xét
Kiểm định chi - bình phương
chi_result5 <- chisq.test(tab5)
chi_result5
##
## Pearson's Chi-squared test
##
## data: tab5
## X-squared = 48.725, df = 2, p-value = 2.628e-11
# Giá trị thống kê Chi-squared
chi_result5$statistic
## X-squared
## 48.72464
# Bậc tự do
chi_result5$parameter
## df
## 2
# Giá trị p
chi_result5$p.value
## [1] 2.627719e-11
Giả thuyết
Giả thuyết H0: Giới tính (Gender) và quốc gia (Country) là 2 biến độc lập, không có mối liên hệ.
Giả thuyết H1: Giới tính (Gender) và quốc gia (Country) là 2 biến có mối liên hệ với nhau.
Kết quả kiểm định:
Giá trị thống kê Chi-squared: X-squared = 48.725
Bậc tự do: df = 2
Giá trị p: p = 2.628e-11
Kết luận:
Trong phân tích thống kê định lượng, bảng ngẫu nhiên (contingency table) là một công cụ cơ bản để khảo sát mối liên hệ giữa hai biến phân loại. Trong trường hợp đơn giản nhất, bảng ngẫu nhiên 2x2 biểu diễn sự phân bố của hai biến nhị phân, giúp xác định và đo lường mối liên hệ giữa chúng. Các chỉ số như hiệu tỷ lệ (risk difference), tỷ số nguy cơ (Relative Risk - RR) và tỷ số chênh (Odds Ratio - OR) đóng vai trò quan trọng trong việc lượng hóa mối quan hệ đó. Bài viết này sẽ trình bày chi tiết cấu trúc xác suất sinh ra bảng ngẫu nhiên, phương pháp so sánh hai tỷ lệ, cách xây dựng khoảng tin cậy cho Odds Ratio, và kết thúc bằng một ví dụ thực tiễn trong lĩnh vực kinh doanh.
Một bảng ngẫu nhiên 2x2 là bảng tần suất đếm số quan sát thuộc vào từng tổ hợp của hai biến nhị phân:
\[ \begin{array}{|c|c|c|c|} \hline & \text{Kết quả (+)} & \text{Kết quả (–)} & \text{Tổng} \\ \hline \text{Phơi nhiễm (Yes)} & a & b & a + b \\ \hline \text{Không phơi nhiễm (No)} & c & d & c + d \\ \hline \text{Tổng cộng} & a + c & b + d & n = a + b + c + d \\ \hline \end{array} \]
Để hiểu được sự hình thành của bảng này, cần xác định mô hình xác suất sinh ra dữ liệu — trong đó phổ biến nhất là phân phối Poisson và Multinomial.
Phân phối Poisson thường được sử dụng để mô hình hóa số lượng sự kiện xảy ra trong một khoảng thời gian, không gian hoặc đơn vị cụ thể. Giả sử các sự kiện xảy ra độc lập và với một tỷ lệ trung bình không đổi, mỗi ô trong bảng có thể xem là biến ngẫu nhiên Poisson:
\[ X_{ij} \sim \text{Poisson}(\lambda_{ij}) \]
Ưu điểm:
Phù hợp khi tổng số quan sát không cố định.
Áp dụng trong phân tích số sự kiện như: số lượt truy cập, số đơn hàng lỗi, v.v.
Hạn chế:
Trong trường hợp tổng số quan sát \(n\) là cố định, và mỗi quan sát rơi vào một trong bốn ô với xác suất \(p_1, p_2, p_3, p_4\), thì bảng ngẫu nhiên 2x2 có thể được mô hình hóa theo phân phối đa thức Multinomial như sau:
\[ (a, b, c, d) \sim \text{Multinomial}(n; p_1, p_2, p_3, p_4) \]
Phân phối này thường được sử dụng trong các tình huống mà dữ liệu được thu thập từ khảo sát hoặc nghiên cứu xã hội học với kích thước mẫu cố định. Khi đó, các xác suất \(p_1, p_2, p_3, p_4\) biểu diễn xác suất mà một cá thể rơi vào từng ô trong bảng 2x2.
Ưu điểm của mô hình Multinomial:
Kiểm soát được tổng số mẫu.
Phù hợp cho dữ liệu khảo sát, thử nghiệm.
So sánh giữa phân phối Poisson và Multinomial
| Tiêu chí | Poisson | Multinomial |
|---|---|---|
| Tổng số mẫu | Không cố định | Cố định |
| Ứng dụng chính | Số sự kiện | Tần suất khảo sát |
| Dữ liệu phù hợp | Giao dịch, lỗi, tai nạn | Trả lời khảo sát, phân nhóm |
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Ý nghĩa:
Đo lường chênh lệch tuyệt đối giữa xác suất xảy ra kết quả ở nhóm phơi nhiễm và nhóm không phơi nhiễm.
Thường được sử dụng trong đánh giá tác động của chính sách, can thiệp hoặc chương trình thí điểm, khi sự khác biệt về xác suất là quan trọng hơn so với tỷ số.
Khoảng tin cậy 95% (CI) cho RD có thể được ước lượng bằng:
\[ CI_{RD} = RD \pm Z_{1 - \alpha/2} \cdot SE_{RD} \]
Trong đó: - \(Z_{1 - \alpha/2}\) là giá trị tới hạn (thường ≈ 1.96 với 95% CI),
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Ý nghĩa:
\(RR > 1\): nguy cơ xảy ra kết quả cao hơn ở nhóm phơi nhiễm.
\(RR < 1\): nguy cơ xảy ra kết quả thấp hơn ở nhóm phơi nhiễm.
\(RR = 1\): không có mối liên hệ giữa phơi nhiễm và kết quả.
Ta thường lấy log của RR để tính khoảng tin cậy:
\[ CI_{RR} = \exp \left[ \ln(RR) \pm Z_{1 - \alpha/2} \cdot SE_{\ln(RR)} \right] \]
Trong đó:
\[ SE_{\ln(RR)} = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \]
Ví dụ trong kinh doanh:
Tỷ lệ khách mua hàng khi có khuyến mãi: \(80/100 = 0.8\)
Khi không có khuyến mãi: \(40/100 = 0.4\)
\(RR = 0.8 / 0.4 = 2\)
⇒ Khuyến mãi làm tăng gấp đôi khả năng khách mua hàng.
Hạn chế:
⚠️ Không sử dụng được trong nghiên cứu bệnh chứng (case-control) vì ta không biết nguy cơ tuyệt đối.
⚠️ Dễ gây hiểu nhầm nếu không đi kèm nguy cơ tuyệt đối. Ví dụ: RR = 2 có vẻ cao, nhưng nếu nguy cơ ban đầu là 1%, thì tăng lên 2% vẫn là rất thấp.
⚠️ Không đối xứng: Nếu đổi nhóm tham chiếu thì giá trị RR thay đổi, khác với OR.
\[ OR = \frac{a / b}{c / d} = \frac{ad}{bc} \]
Hay
\[ \text{OR} = \frac{\text{Odds ở nhóm 1}}{\text{Odds ở nhóm 2}} \] OR thường dùng để đo lường mối liên hệ giữa một yếu tố và một kết quả trong bảng 2x2.
OR = 1: Không có sự khác biệt về odds giữa hai nhóm.
OR > 1: Nhóm 1 có odds xảy ra kết quả cao hơn nhóm 2.
OR < 1: Nhóm 1 có odds xảy ra kết quả thấp hơn nhóm 2.
Ví dụ: OR = 2 nghĩa là odds xảy ra kết quả ở nhóm 1 cao gấp 2 lần nhóm 2.
Ý nghĩa:
OR cho biết tỷ lệ odds (tức là “xác suất chia cho 1 trừ xác suất”) giữa hai nhóm.
Thường được sử dụng phổ biến trong mô hình logistic regression.
Trong các nghiên cứu bệnh hiếm (rare disease assumption), OR xấp xỉ với RR.
Ưu điểm của Odds Ratio:
Dễ tính và dễ diễn giải.
Ổn định về mặt toán học khi sử dụng trong các mô hình hồi quy.
Không phụ thuộc vào tỷ lệ hiện diện trong mẫu (đặc biệt trong các thiết kế bệnh – chứng: case-control study).
Để xác định xem OR có ý nghĩa thống kê hay không, cần xây dựng khoảng tin cậy.
Logarithm tự nhiên của Odds Ratio:
\[ \log(OR) = \log\left( \frac{a \cdot d}{b \cdot c} \right) \]
Sai số chuẩn (Standard Error):
\[ SE = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]
Khoảng tin cậy 95% cho \(\log(OR)\):
\[ \log(OR) \pm 1.96 \cdot SE \]
Lấy mũ để có khoảng tin cậy 95% cho OR:
\[ CI_{95\%} = \left[ e^{\log(OR) - 1.96 \cdot SE},\quad e^{\log(OR) + 1.96 \cdot SE} \right] \]
Một công ty thương mại điện tử thử nghiệm chiến dịch khuyến mãi để kiểm tra xem liệu có ảnh hưởng đến hành vi mua hàng không. Họ lấy mẫu 200 khách hàng ngẫu nhiên và thu được bảng sau:
| Mua hàng | Không mua | Tổng | |
|---|---|---|---|
| Có khuyến mãi | 80 | 20 | 100 |
| Không khuyến mãi | 40 | 60 | 100 |
\[ OR = \frac{80 \cdot 60}{20 \cdot 40} = \frac{4800}{800} = 6 \]
→ Odds mua hàng khi có khuyến mãi cao gấp 6 lần so với khi không có khuyến mãi.
\[ \log(OR) = \log(6) \approx 1.79 \]
\[ SE = \sqrt{ \frac{1}{80} + \frac{1}{20} + \frac{1}{40} + \frac{1}{60} } \approx 0.35 \]
\[ CI = \left[ e^{1.79 - 1.96 \cdot 0.35},\quad e^{1.79 + 1.96 \cdot 0.35} \right] \approx \left[ e^{1.11},\quad e^{2.47} \right] = [3.03,\ 11.81] \]
Vì khoảng tin cậy không chứa 1, có thể kết luận rằng khuyến mãi có ảnh hưởng có ý nghĩa thống kê đến hành vi mua hàng.
Với \(OR = 6\) và \(CI = (3.03,\ 11.81)\), doanh nghiệp có thể tự tin triển khai chiến lược khuyến mãi quy mô lớn hơn.
# Tạo bảng chéo giữa Gender và MaritalStatus
table_gender_marital <- table(dat$Gender, dat$MaritalStatus)
addmargins(table_gender_marital) # Thêm hàng và cột tổng
##
## M S Sum
## F 3602 3568 7170
## M 3264 3625 6889
## Sum 6866 7193 14059
# Trích xuất số liệu từ bảng chéo
A <- table_gender_marital["F","S"] # nữ độc thân
B <- table_gender_marital["F","M"] # nữ kết hôn
C <- table_gender_marital["M","S"] # nam độc thân
D <- table_gender_marital["M","M"] # nam kết hôn
# Tính RR
RR <- (A/(A+B))/(C/(C+D))
RR
## [1] 0.945701
# Trong đó: A/(A+B) là tỷ lệ phụ nữ độc thân trong tổng số nữ
# Và: C/(C+D) là tỷ lệ nam giới độc thân trong tổng số nam
RR = 1: Không có sự khác biệt về tỷ lệ độc thân giữa hai giới tính.
RR > 1: Nam giới có tỷ lệ độc thân cao hơn phụ nữ.
RR < 1: Phụ nữ có tỷ lệ độc thân cao hơn nam giới.
Tỷ lệ phụ nữ độc thân bằng khoảng 94.57% tỷ lệ nam giới độc thân. Điều này cho thấy không có sự khác biệt lớn về tỷ lệ độc thân giữa hai giới tính trong dữ liệu.
install.packages("epitools", repos = "https://cran.rstudio.com/")
## Installing package into 'C:/Users/Khanh Hoa/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Khanh Hoa\AppData\Local\Temp\Rtmpcb0VMf\downloaded_packages
library(epitools)
riskratio(table_gender_marital, method="wald")
## $data
##
## M S Total
## F 3602 3568 7170
## M 3264 3625 6889
## Total 6866 7193 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 1.057417 1.023813 1.092123
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.0007045092 0.0007373895 0.0007038837
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
# Chỉ định phương pháp tính khoảng tin cậy (confidence interval) cho Risk Ratio.
# "wald" là phương pháp sử dụng ước lượng Wald, giả định phân phối chuẩn, để tính khoảng tin cậy.
Nhận xét
Relative Risk (RR)
Nhận xét về RR:
Kết luận về RR:
p-value từ các kiểm định:
Nhận xét về p-value:
Tóm tắt và nhận xét tổng quát
Kết luận
Câu hỏi nghiên cứu: Liệu có sự khác biệt về tỷ lệ sở hữu nhà giữa nam và nữ không?
# Tạo bảng chéo giữa Gender và Homeowner
table_gender_homeowner <- table(dat$Gender, dat$Homeowner)
addmargins(table_gender_homeowner) # Thêm hàng và cột tổng
##
## N Y Sum
## F 2826 4344 7170
## M 2789 4100 6889
## Sum 5615 8444 14059
# Trích xuất số liệu từ bảng chéo
A <- table_gender_homeowner["F", "Y"] # nữ sở hữu nhà
B <- table_gender_homeowner["F", "N"] # nữ không sở hữu nhà
C <- table_gender_homeowner["M", "Y"] # nam sở hữu nhà
D <- table_gender_homeowner["M", "N"] # nam không sở hữu nhà
# Tính RR
RR <- (A / (A + B)) / (C / (C + D))
RR
## [1] 1.017989
# Trong đó:
# A / (A + B): Tỷ lệ nữ sở hữu nhà trong tổng số nữ.
# C / (C + D): Tỷ lệ nam sở hữu nhà trong tổng số nam.
riskratio(table_gender_homeowner, method="wald")
## $data
##
## N Y Total
## F 2826 4344 7170
## M 2789 4100 6889
## Total 5615 8444 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.0000000 NA NA
## M 0.9823291 0.9561812 1.009192
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.195158 0.1964833 0.1950884
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm nữ (F) được chọn làm nhóm tham chiếu, nên RR = 1. Điều này có nghĩa chúng ta so sánh nguy cơ sở hữu nhà của nhóm nam (M) với nhóm nữ.
Nhóm nam (M) có RR = 0.9823 nghĩa là:
Khoảng tin cậy 95% của RR là (0.9562 – 1.0092):
Khoảng này bao gồm số 1, nghĩa là giá trị RR thực sự có thể là 1 (không có khác biệt).
Khoảng tin cậy cho ta biết mức độ chính xác của ước lượng RR; khoảng rộng và bao gồm 1 cho thấy sự không chắc chắn và thiếu bằng chứng về sự khác biệt thực sự.
Ta có giả thuyết:
H₀: Tỷ lệ sở hữu nhà ở Nam và Nữ không khác nhau, tức là RR = 1
H₁: Tỷ lệ sở hữu nhà ở Nam và Nữ khác nhau, RR ≠ 1
p-value từ các kiểm định:
Nhận xét về p-value:
Nhận xét tổng quát
Relative Risk cho thấy rằng tỷ lệ sự kiện giữa hai nhóm giới tính F (phụ nữ) và M (nam giới) rất gần nhau, với RR của nhóm M là 0.9823, cho thấy không có sự khác biệt rõ rệt giữa tỷ lệ tình trạng hôn nhân có (Y) giữa hai nhóm.
Confidence Interval cho nhóm nam giới (M) bao gồm giá trị 1, điều này hỗ trợ giả thuyết rằng không có sự khác biệt thống kê đáng kể giữa tỷ lệ sự kiện ở nam và nữ.
Các kiểm định thống kê (Chi-square, Fisher’s exact test) đều cho p-value lớn hơn 0.05, điều này có nghĩa là không có sự khác biệt ý nghĩa giữa hai nhóm giới tính về tỷ lệ tình trạng hôn nhân có (Y).
Tóm lại, các kết quả này cho thấy không có sự khác biệt rõ rệt và có ý nghĩa giữa tỷ lệ tình trạng hôn nhân có (Y) ở phụ nữ và nam giới.
Kết luận
Dựa trên các kết quả từ Relative Risk và các kiểm định thống kê, chúng ta có thể kết luận rằng không có sự khác biệt đáng kể giữa nam và nữ về tỷ lệ tình trạng hôn nhân có (Y). Dữ liệu cho thấy rằng tỷ lệ hôn nhân có (Y) ở nam và nữ là khá tương đồng và không có sự khác biệt thống kê đáng kể.
table_mari_home <- table(dat$MaritalStatus, dat$Homeowner)
addmargins(table_mari_home)
##
## N Y Sum
## M 1719 5147 6866
## S 3896 3297 7193
## Sum 5615 8444 14059
riskratio(table_mari_home)
## $data
##
## N Y Total
## M 1719 5147 6866
## S 3896 3297 7193
## Total 5615 8444 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## M 1.0000000 NA NA
## S 0.6114466 0.5942071 0.6291862
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## M NA NA NA
## S 0 1.822183e-277 3.663022e-272
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm đã kết hôn (M) được dùng làm nhóm tham chiếu với RR = 1.
Nhóm độc thân (S) có:
RR = 0.6114 (khoảng tin cậy 95%: 0.5942 – 0.6292).Vì khoảng này không chứa 1, nên kết quả có ý nghĩa thống kê.
Điều này có nghĩa là người độc thân có nguy cơ sở hữu nhà thấp hơn khoảng 38.86% so với người đã kết hôn.
Khoảng tin cậy 95% khá hẹp và không bao gồm giá trị 1, cho thấy sự khác biệt này là rõ ràng và đáng tin cậy.
Ta thực hiện kiểm định giả thuyết như sau:
H₀: Tỷ lệ sở hữu nhà của người đã kết hôn và độc thân là như nhau (RR = 1).
H₁: Tỷ lệ sở hữu nhà của hai nhóm là khác nhau (RR ≠ 1).
Kết quả phân tích chỉ ra RR = 0.6114 với khoảng tin cậy 95% (0.5942 – 0.6292), và các kiểm định cho p-value ≈ 0 < mức ý nghĩa 0.05. Do đó, ta bác bỏ H₀ và kết luận rằng tình trạng hôn nhân có mối liên hệ thống kê rõ rệt với khả năng sở hữu nhà. Người độc thân có khả năng sở hữu nhà thấp hơn đáng kể so với người đã kết hôn.
# Cài và gọi gói
install.packages("epitools")
## Warning: package 'epitools' is in use and will not be installed
library(epitools)
# Tính odds ratio
or_mh <- oddsratio(table_mari_home, method = "wald", conf.level = 0.95)
or_mh$measure
## odds ratio with 95% C.I.
## estimate lower upper
## M 1.0000000 NA NA
## S 0.2826322 0.2630929 0.3036227
Kết quả phân tích Odds Ratio giữa giới tính và khả năng sở hữu nhà như sau:
Odds Ratio (OR) = 0.956
Khoảng tin cậy 95%: từ 0.894 đến 1.023
Diễn giải:
Giá trị OR = 0.956 cho thấy odds (cơ hội) sở hữu nhà của nữ thấp hơn nam khoảng 4.4%. Tuy nhiên, sự khác biệt là nhỏ.
Do khoảng tin cậy 95% chứa giá trị 1, nên:
Kết luận: Mặc dù nữ có vẻ có odds sở hữu nhà thấp hơn nam một chút, nhưng sự khác biệt không có ý nghĩa thống kê. Do đó, giới tính không phải là yếu tố ảnh hưởng rõ rệt đến khả năng sở hữu nhà trong dữ liệu hiện tại.
# Tính OR và khoảng tin cậy
or_mh <- oddsratio(table_mari_home, method = "wald", conf.level = 0.95)
or_mh$measure
## odds ratio with 95% C.I.
## estimate lower upper
## M 1.0000000 NA NA
## S 0.2826322 0.2630929 0.3036227
Odds Ratio (OR) = 0.283
Khoảng tin cậy 95%: từ 0.263 đến 0.304
Diễn giải:
Giá trị Odds Ratio 0.283 có nghĩa là odds sở hữu nhà của nhóm người độc thân chỉ bằng khoảng 28.3% odds của nhóm người đã kết hôn. Nói cách khác, người đã kết hôn có khả năng sở hữu nhà cao hơn gần 3.5 lần so với người độc thân (vì 1/0.283≈3.53).
Khoảng tin cậy 95% cho Odds Ratio nằm hoàn toàn dưới 1, từ 0.263 đến 0.304, điều này cho thấy sự khác biệt về odds sở hữu nhà giữa hai nhóm là có ý nghĩa thống kê và không phải do ngẫu nhiên.
Kết luận:
Dữ liệu cho thấy tình trạng hôn nhân ảnh hưởng rõ ràng đến khả năng sở hữu nhà. Người đã kết hôn có odds sở hữu nhà cao hơn đáng kể so với người độc thân, và khác biệt này là có ý nghĩa thống kê với mức độ tin cậy 95%. Đây là bằng chứng cho thấy việc đã kết hôn có liên quan chặt chẽ đến khả năng sở hữu nhà trong mẫu khảo sát này.
# Tính OR và khoảng tin cậy
or_gm <- oddsratio(table_gender_marital, method = "wald", conf.level = 0.95)
or_gm$measure
## odds ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 1.121184 1.049386 1.197893
Odds Ratio (OR) = 1.121
Khoảng tin cậy 95%: từ 1.049 đến 1.198
Diễn giải:
Giá trị Odds Ratio 1.121 có nghĩa là odds (cơ hội) đã kết hôn của nữ cao hơn odds đã kết hôn của nam khoảng 12.1%, hay nói cách khác, nữ có khả năng đã kết hôn cao hơn nam khoảng 1.12 lần.
Khoảng tin cậy 95% từ 1.049 đến 1.198, không chứa giá trị 1, chứng tỏ sự khác biệt này là có ý nghĩa thống kê. Điều này nghĩa là với mức tin cậy 95%, chúng ta chắc chắn rằng tỷ lệ đã kết hôn của nữ và nam không bằng nhau.
Kết luận:
Dữ liệu cho thấy nữ giới có odds đã kết hôn cao hơn nam giới khoảng 12%, tương đương với việc nữ có khả năng đã kết hôn gấp 1.12 lần so với nam giới.