Tuần này, chúng ta đi sâu vào suy diễn thống kê trên bảng ngẫu nhiên (Contingency Table), đặc biệt tập trung vào:
Đọc dữ liệu và khám phá
library("csv")
## Warning: package 'csv' was built under R version 4.4.3
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
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 ...
Đầu tiên, ta sẽ sử dụng 2 biến định tính: Gender (Giới tính) và Homeowner (Có sở hữu nhà hay không) để tiến hành đưa ra ví dụ cũng như phân tích.
Bảng ngẫu nhiên (contingency table) là công cụ thống kê dùng để trình bày tần số của các biến phân loại. Trong trường hợp đơn giản nhất – bảng 2x2 – bảng có dạng:
Biến B = Yes | Biến B = No | |
---|---|---|
Biến A = Yes | a | b |
Biến A = No | c | d |
Trong phân tích thống kê, bảng 2x2 thường dùng để:
Bảng có thể sinh ra từ các phân phối như:
Các bước thực hiện trong R
table_gender_homeowner <- table(data$Gender, data$Homeowner)
table_gender_homeowner
##
## N Y
## F 2826 4344
## M 2789 4100
Lý thuyết: Kiểm định Chi-square
Dùng để kiểm tra xem hai biến phân loại có độc lập thống kê không.
Chỉ số kiểm định: \[ X^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó:
Nếu p-value < 0.05, ta có đủ cơ sở để bác bỏ H₀ → Có bằng chứng về sự phụ thuộc giữa hai biến.
Các bước thực hiện trong R
chisq.test(table_gender_homeowner, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: table_gender_homeowner
## X-squared = 1.6788, df = 1, p-value = 0.1951
Khái niệm: Relative Risk (RR) là tỷ lệ giữa xác suất xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.
Công thức:
\[ RR = \frac{\frac{a}{a+b}}{\frac{c}{c+d}} \]
Diễn giải:
Khái niệm: Odds Ratio (OR) là tỷ lệ giữa odds xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.
Công thức:
\[ OR = \frac{\frac{a}{b}}{\frac{c}{d}} = \frac{a \times d}{b \times c} \]
Diễn giải:
Các bước thực hiện trên R
# Lấy số liệu
a <- table_gender_homeowner["F", "Y"]
b <- table_gender_homeowner["F", "N"]
c <- table_gender_homeowner["M", "Y"]
d <- table_gender_homeowner["M", "N"]
# Tính Odds
odds_female <- a / b
odds_male <- c / d
# Odds Ratio (OR)
or <- odds_female / odds_male
# Relative Risk (RR)
risk_female <- a / (a + b)
risk_male <- c / (c + d)
rr <- risk_female / risk_male
list(
odds_female = odds_female,
odds_male = odds_male,
OR = or,
RR = rr
)
## $odds_female
## [1] 1.537155
##
## $odds_male
## [1] 1.470061
##
## $OR
## [1] 1.04564
##
## $RR
## [1] 1.017989
Khoảng tin cậy 95% cho Odds Ratio
Do OR không phân phối chuẩn, nên lấy log(OR) để xây dựng khoảng tin cậy:
\[ CI_{log(OR)} = \log(OR) \pm Z \cdot SE_{log(OR)} \]
Với: \[ SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} \]
Chuyển về thang OR bằng hàm mũ: \(e^{CI}\).
Các bước thực hiện trên R
se_log_or <- sqrt(1/a + 1/b + 1/c + 1/d)
z <- 1.96 # hệ số cho 95%
ci_lower <- exp(log(or) - z * se_log_or)
ci_upper <- exp(log(or) + z * se_log_or)
c(ci_lower, ci_upper)
## [1] 0.9773755 1.1186731
Nhận xét:
Kết luận cần đi kèm với kiểm định Chi-square và khoảng tin cậy, không nên chỉ nhìn vào OR/RR.
Đây là một ví dụ điển hình cho việc sử dụng Odds Ratio trong kinh tế/xã hội học để mô tả mối liên hệ giữa hai đặc điểm phân loại.
Tạo bảng tần số
# Bảng tần số chéo giữa MaritalStatus và Homeowner
tbl <- table(data$MaritalStatus, data$Homeowner)
tbl
##
## N Y
## M 1719 5147
## S 3896 3297
Nhận xét
Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.
Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.
Kiểm định Chi-square
chi_test <- chisq.test(tbl)
chi_test
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tbl
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Kết quả kiểm định:
Giá trị thống kê Chi-bình phương: X-squared = 1241.2
Bậc tự do: df = 1
Giá trị p: p-value < 2.2e-16
Kết luận:
Tính Odds Ratio và Relative Risk
# Lọc dữ liệu: chỉ lấy Married và Single
data2 <- subset(data, MaritalStatus %in% c("M", "S"))
# Tạo bảng 2x2
tbl2 <- table(data2$MaritalStatus, data2$Homeowner)
tbl2
##
## N Y
## M 1719 5147
## S 3896 3297
# Tính toán Odds Ratio và Relative Risk
library(epiR)
## Warning: package 'epiR' was built under R version 4.4.3
## Loading required package: survival
## Package epiR 2.0.84 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
##
epi_result <- epi.2by2(tbl2, method = "cohort.count", conf.level = 0.95)
epi_result
## Outcome+ Outcome- Total Inc risk *
## Exposure+ 1719 5147 6866 25.04 (24.02 to 26.08)
## Exposure- 3896 3297 7193 54.16 (53.00 to 55.32)
## Total 5615 8444 14059 39.94 (39.13 to 40.75)
##
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Inc risk ratio 0.46 (0.44, 0.48)
## Inc odds ratio 0.28 (0.26, 0.30)
## Attrib risk in the exposed * -29.13 (-30.67, -27.59)
## Attrib fraction in the exposed (%) -116.34 (-126.59, -106.62)
## Attrib risk in the population * -14.22 (-15.63, -12.82)
## Attrib fraction in the population (%) -35.62 (-35.74, -35.46)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 1242.432 Pr>chi2 = <0.001
## Fisher exact test that OR = 1: Pr>chi2 = <0.001
## Wald confidence limits
## CI: confidence interval
## * Outcomes per 100 population units
Bảng chéo tần suất giữa MaritalStatus và Homeowner
Marital Status | Không sở hữu nhà (N) | Có sở hữu nhà (Y) | Tổng cộng |
---|---|---|---|
Married (M) | 1,719 | 5,147 | 6,866 |
Single (S) | 3,896 | 3,297 | 7,193 |
Tổng cộng | 5,615 | 8,444 | 14,059 |
Tỷ lệ hiện mắc (Incidence Risk)
Những người độc thân có xác suất không sở hữu nhà cao hơn gấp đôi so với người đã kết hôn.
Relative Risk (RR)
Nguy cơ không sở hữu nhà ở nhóm đã kết hôn chỉ bằng 46% so với nhóm độc thân.
Odds Ratio (OR)
Xác suất không sở hữu nhà ở nhóm đã kết hôn thấp hơn 72% so với nhóm độc thân.
Risk Difference và Attribution
Điều này cho thấy rằng việc kết hôn có thể giúp giảm đáng kể rủi ro không sở hữu nhà ở cấp độ cá nhân lẫn dân số.
Kiểm định ý nghĩa thống kê
Kết quả kiểm định cho thấy mối liên hệ giữa tình trạng hôn nhân và việc sở hữu nhà là rất có ý nghĩa thống kê (p < 0.001).
Kết luận:
Trong hoạt động này, chúng ta sẽ sử dụng dữ liệu Supermarket Transactions để phân tích mối liên hệ giữa các biến nhị phân. Mục tiêu là:
Bộ dữ liệu “Supermarket Transactions” phản ánh các giao dịch mua hàng của khách hàng tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng dữ liệu tương ứng với một giao dịch, bao gồm thông tin nhân khẩu học (giới tính, loại thành viên, chi nhánh), đặc điểm sản phẩm (loại sản phẩm, kênh thanh toán), và các yếu tố hành vi tiêu dùng (thời gian mua sắm, mức độ hài lòng, giá trị đơn hàng,…). Tập dữ liệu gồm 14.059 quan sát và 16 biến, cung cấp nền tảng chi tiết để phân tích hành vi khách hàng và hiệu quả kinh doanh của siêu thị.
# Đọc file
library("csv")
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
# Hiển thị cấu trúc dữ liệu
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 ...
# Hiển thị vài dòng đầu và cuối
head(data)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1 2007-12-18 7223 F S Y 2
## 2 2 2007-12-20 7841 M M Y 5
## 3 3 2007-12-21 8374 F M N 2
## 4 4 2007-12-21 9619 M M Y 3
## 5 5 2007-12-22 1900 F S Y 3
## 6 6 2007-12-22 6696 F M Y 3
## AnnualIncome City StateorProvince Country ProductFamily
## 1 $30K - $50K Los Angeles CA USA Food
## 2 $70K - $90K Los Angeles CA USA Food
## 3 $50K - $70K Bremerton WA USA Food
## 4 $30K - $50K Portland OR USA Food
## 5 $130K - $150K Beverly Hills CA USA Drink
## 6 $10K - $30K Beverly Hills CA USA Food
## ProductDepartment ProductCategory UnitsSold Revenue
## 1 Snack Foods Snack Foods 5 27.38
## 2 Produce Vegetables 5 14.90
## 3 Snack Foods Snack Foods 3 5.52
## 4 Snacks Candy 4 4.44
## 5 Beverages Carbonated Beverages 4 14.00
## 6 Deli Side Dishes 3 4.37
tail(data)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054 2009-12-29 2032 F M N 3
## 14055 14055 2009-12-29 9102 F M Y 2
## 14056 14056 2009-12-29 4822 F M Y 3
## 14057 14057 2009-12-31 250 M S Y 1
## 14058 14058 2009-12-31 6153 F S N 4
## 14059 14059 2009-12-31 3656 M S N 3
## AnnualIncome City StateorProvince Country ProductFamily
## 14054 $10K - $30K Yakima WA USA Non-Consumable
## 14055 $10K - $30K Bremerton WA USA Food
## 14056 $10K - $30K Walla Walla WA USA Food
## 14057 $30K - $50K Portland OR USA Drink
## 14058 $50K - $70K Spokane WA USA Drink
## 14059 $50K - $70K Portland OR USA Non-Consumable
## ProductDepartment ProductCategory UnitsSold Revenue
## 14054 Household Paper Products 5 14.50
## 14055 Baking Goods Baking Goods 3 9.64
## 14056 Frozen Foods Vegetables 3 7.45
## 14057 Beverages Pure Juice Beverages 4 3.24
## 14058 Dairy Dairy 2 4.00
## 14059 Household Electrical 5 25.53
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))
# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)
# Kiểm tra lại cấu trúc
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 : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
## $ MaritalStatus : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
## $ Homeowner : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
## $ City : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
## $ StateorProvince : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
## $ Country : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ProductFamily : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
## $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
## $ ProductCategory : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
## $ UnitsSold : int 5 5 3 4 4 3 4 6 1 2 ...
## $ Revenue : num 27.38 14.9 5.52 4.44 14 ...
Giải thích các biến
Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:
Tên Biến | Ý Nghĩa |
---|---|
PurchaseDate | Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm). |
CustomerID | Mã định danh duy nhất cho mỗi khách hàng. |
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
Children | Số lượng con cái của khách hàng. |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
table_gender_home <- table(data$Gender, data$Homeowner)
table_gender_home
##
## N Y
## F 2826 4344
## M 2789 4100
Dựa vào bảng trên:
Nữ (F) có tổng cộng 7170 người, trong đó 4344 người sở hữu nhà, chiếm khoảng 60.6%.
Nam (M) có tổng cộng 6889 người, với 4100 người sở hữu nhà, tương ứng khoảng 59.5%.
Nhận xét:
Tỷ lệ sở hữu nhà của nữ có vẻ nhỉnh hơn một chút so với nam (khoảng
60.6% so với 59.5%), tuy nhiên sự khác biệt này là khá nhỏ.
Để đánh giá rõ ràng hơn về mức độ liên hệ giữa hai biến, ta sẽ tiếp tục
tính các chỉ số định lượng như:
Hiệu hai tỷ lệ (Difference in Proportions), Relative Risk (RR), Odds
Ratio (OR).
prop_table <- prop.table(table_gender_home, margin = 1)
prop_table
##
## N Y
## F 0.3941423 0.6058577
## M 0.4048483 0.5951517
diff_prop <- prop_table[1, "Y"] - prop_table[2, "N"]
diff_prop
## [1] 0.2010094
Tỷ lệ sở hữu nhà:
Ở nữ là 0.6059 (tức là 60.6%)
Ở nam là 0.5952 (tức là 59.5%)
Hiệu hai tỷ lệ giữa nữ và nam là 0.201, tương đương 20.1 điểm phần trăm.
Kết luận:
Tỷ lệ nữ sở hữu nhà cao hơn nam khoảng 1.00%, tuy nhiên mức chênh lệch này khá nhỏ và chưa thể kết luận có ý nghĩa thống kê nếu chưa tính khoảng tin cậy (confidence interval) hoặc thực hiện các kiểm định thống kê chính thức như kiểm định z hoặc chi bình phương.
library(epitools)
##
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
##
## ratetable
rr_result <- riskratio(table_gender_home)
rr_result$measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.0000000 NA NA
## M 0.9823291 0.9561812 1.009192
Dựa vào kết quả ta thấy Relative Risk (RR) của nam so với nữ là 0.9823. Khoảng tin cậy 95% của RR nằm trong khoảng từ 0.9562 đến 1.0092.
Kết luận:
RR < 1 cho thấy nam có tỷ lệ sở hữu nhà thấp hơn nữ một chút (chỉ còn
khoảng 98.23% so với nữ). Tuy nhiên, vì khoảng tin cậy 95% bao gồm giá
trị 1.0, nên không có bằng chứng đủ mạnh để kết luận sự khác biệt này có
ý nghĩa thống kê. Nói cách khác, tỷ lệ sở hữu nhà giữa nam và nữ có thể
coi là tương đương.
library(epitools)
or_result <- oddsratio(table_gender_home)
or_result
## $data
##
## N Y Total
## F 2826 4344 7170
## M 2789 4100 6889
## Total 5615 8444 14059
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 0.956381 0.8938974 1.023169
##
## $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] "median-unbiased estimate & mid-p exact CI"
or_result$conf.int
## NULL
Phân tích bảng thì giữa hai nhóm giới tính (F và M) cho thấy:
Do tất cả các giá trị p đều lớn hơn mức ý nghĩa thông thường (α = 0.05), không có sự khác biệt có ý nghĩa thống kê giữa nhóm nam và nữ về biến được phân tích.
Như vậy, kết quả cho thấy không có mối liên quan rõ rệt giữa giới tính và biến, theo phân tích odds ratio và các kiểm định xác suất tương ứng.