Trong nghiên cứu kinh tế và kinh doanh, nhiều biến quan trọng mang tính chất định tính, ví dụ như giới tính, hành vi tiêu dùng (mua/không mua), sở hữu tài sản (có/không). Phân tích thống kê đối với những biến này giúp hiểu được cấu trúc dân số, đặc điểm khách hàng và mối quan hệ giữa các nhóm.
Có hai cấp độ phân tích cơ bản:
Giả sử ta quan sát biến định tính như “Giới tính” với hai giá trị: Nam, Nữ. Có thể mô tả biến này bằng:
Các biểu đồ thường dùng: bar chart (cột), pie chart (tròn) để thể hiện tỷ lệ từng nhóm.
Giả sử ta đang quan tâm đến một biến nhị phân (ví dụ: sở hữu nhà – Có/Không).
Nếu trong mẫu có \(\hat{p}\) là tỷ lệ người “Có nhà”, ta ước lượng KTC 95% cho tỷ lệ thật \(p\) bằng:
\[ \hat{p} \pm z_{0.025} \cdot \sqrt{ \frac{ \hat{p}(1 - \hat{p}) }{n} } \]
Trong đó:
Giả thuyết kiểm định:
Dùng kiểm định z:
\[ z = \frac{ \hat{p} - p_0 }{ \sqrt{ \frac{p_0(1 - p_0)}{n} } } \]
Hai biến định tính (vd: Giới tính & Sở hữu nhà) được trình bày dưới dạng bảng chéo 2x2:
| Có nhà | Không có | Tổng | |
|---|---|---|---|
| Nam | a | b | a + b |
| Nữ | c | d | c + d |
| Tổng | a + c | b + d | n |
Mục tiêu: kiểm tra xem hai biến có quan hệ hay độc lập.
Giả thuyết:
Thống kê kiểm định:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó:
Bảng chéo (bảng đếm) thực chất là một biểu hiện cụ thể của một mô hình xác suất ngẫu nhiên.
Mục đích: Giúp hiểu rằng các kiểm định như Chi-square không chỉ mang tính cơ học, mà có nền tảng xác suất phía sau.
Khi muốn so sánh hai nhóm về một kết quả nhị phân, có ba thước đo phổ biến:
\[ \hat{p}_1 - \hat{p}_2 \]
\[ (\hat{p}_1 - \hat{p}_2) \pm z \cdot \sqrt{ \frac{ \hat{p}_1 (1 - \hat{p}_1) }{n_1} + \frac{ \hat{p}_2 (1 - \hat{p}_2) }{n_2} } \]
\[ RR = \frac{ \hat{p}_1 }{ \hat{p}_2 } \]
Nếu xác suất xảy ra sự kiện là \(p\), thì:
\[ \text{Odds} = \frac{p}{1 - p} \]
→ là “tỷ số cược”: bao nhiêu lần có so với không.
\[ OR = \frac{ \text{Odds nhóm 1} }{ \text{Odds nhóm 2} } = \frac{ad}{bc} \]
→ Khi sự kiện là hiếm (xác suất nhỏ), OR và RR gần như tương đương.
Do phân phối OR lệch, nên KTC tính dựa trên log(OR):
\[ \text{KTC 95%}: \log(OR) \pm z \cdot SE(\log(OR)) \Rightarrow \text{Exponentiate để ra } [L, U] \]
Nếu KTC chứa 1 → không có khác biệt có ý nghĩa thống kê.
Khách hàng nữ có khả năng sở hữu nhà cao hơn khách hàng nam không?
Giả sử bảng 2x2:
| Có nhà | Không | Tổng | |
|---|---|---|---|
| Nam | 40 | 60 | 100 |
| Nữ | 66 | 54 | 120 |
Phân tích dữ liệu định tính không chỉ dừng lại ở đếm số liệu và vẽ biểu đồ. Các thước đo như hiệu tỷ lệ, RR, OR và kiểm định Chi-bình phương cho phép người nghiên cứu rút ra kết luận có cơ sở xác suất. Odds Ratio, dù ban đầu có vẻ khó hiểu, nhưng lại là công cụ cực kỳ hữu ích, đặc biệt trong các mô hình kinh tế lượng hiện đại.
library(showtext)
font_add(family = "Arial", regular = "arial.ttf")
showtext_auto()
library(tidyverse)
library(ggplot2)
library(epitools)
library(DescTools)
library(DT)
library(energy)
library(readr)
options(digits = 4)
Bộ dữ liệu Consumer Behavior and Shopping Habits trên Kaggle cung cấp thông tin chi tiết về hành vi mua sắm và sở thích của người tiêu dùng trong lĩnh vực thương mại điện tử. Dữ liệu này được mô tả là một tập hợp toàn diện, bao gồm nhiều khía cạnh về hành vi người tiêu dùng, giúp các nhà phân tích và doanh nghiệp hiểu rõ hơn về cách người tiêu dùng đưa ra quyết định mua sắm. Bộ dữ liệu này rất hữu ích để phân tích xu hướng mua sắm, tối ưu hóa chiến lược tiếp thị, cải thiện sản phẩm và nâng cao trải nghiệm khách hàng.
#Đọc dữ liệu từ file CSV
data <- read.csv("C:/Users/Hoang Quyen/Downloads/shopping_behavior_updated.csv")
#Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame': 3900 obs. of 18 variables:
## $ Customer.ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Age : int 55 19 50 21 45 46 63 27 26 57 ...
## $ Gender : chr "Male" "Male" "Male" "Male" ...
## $ Item.Purchased : chr "Blouse" "Sweater" "Jeans" "Sandals" ...
## $ Category : chr "Clothing" "Clothing" "Clothing" "Footwear" ...
## $ Purchase.Amount..USD. : int 53 64 73 90 49 20 85 34 97 31 ...
## $ Location : chr "Kentucky" "Maine" "Massachusetts" "Rhode Island" ...
## $ Size : chr "L" "L" "S" "M" ...
## $ Color : chr "Gray" "Maroon" "Maroon" "Maroon" ...
## $ Season : chr "Winter" "Winter" "Spring" "Spring" ...
## $ Review.Rating : num 3.1 3.1 3.1 3.5 2.7 2.9 3.2 3.2 2.6 4.8 ...
## $ Subscription.Status : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Shipping.Type : chr "Express" "Express" "Free Shipping" "Next Day Air" ...
## $ Discount.Applied : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Promo.Code.Used : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Previous.Purchases : int 14 2 23 49 31 14 49 19 8 4 ...
## $ Payment.Method : chr "Venmo" "Cash" "Credit Card" "PayPal" ...
## $ Frequency.of.Purchases: chr "Fortnightly" "Fortnightly" "Weekly" "Weekly" ...
#Hiển thị 5 dòng đầu và cuối
head(data, 5)
## Customer.ID Age Gender Item.Purchased Category Purchase.Amount..USD.
## 1 1 55 Male Blouse Clothing 53
## 2 2 19 Male Sweater Clothing 64
## 3 3 50 Male Jeans Clothing 73
## 4 4 21 Male Sandals Footwear 90
## 5 5 45 Male Blouse Clothing 49
## Location Size Color Season Review.Rating Subscription.Status
## 1 Kentucky L Gray Winter 3.1 Yes
## 2 Maine L Maroon Winter 3.1 Yes
## 3 Massachusetts S Maroon Spring 3.1 Yes
## 4 Rhode Island M Maroon Spring 3.5 Yes
## 5 Oregon M Turquoise Spring 2.7 Yes
## Shipping.Type Discount.Applied Promo.Code.Used Previous.Purchases
## 1 Express Yes Yes 14
## 2 Express Yes Yes 2
## 3 Free Shipping Yes Yes 23
## 4 Next Day Air Yes Yes 49
## 5 Free Shipping Yes Yes 31
## Payment.Method Frequency.of.Purchases
## 1 Venmo Fortnightly
## 2 Cash Fortnightly
## 3 Credit Card Weekly
## 4 PayPal Weekly
## 5 PayPal Annually
tail(data, 5)
## Customer.ID Age Gender Item.Purchased Category Purchase.Amount..USD.
## 3896 3896 40 Female Hoodie Clothing 28
## 3897 3897 52 Female Backpack Accessories 49
## 3898 3898 46 Female Belt Accessories 33
## 3899 3899 44 Female Shoes Footwear 77
## 3900 3900 52 Female Handbag Accessories 81
## Location Size Color Season Review.Rating Subscription.Status
## 3896 Virginia L Turquoise Summer 4.2 No
## 3897 Iowa L White Spring 4.5 No
## 3898 New Jersey L Green Spring 2.9 No
## 3899 Minnesota S Brown Summer 3.8 No
## 3900 California M Beige Spring 3.1 No
## Shipping.Type Discount.Applied Promo.Code.Used Previous.Purchases
## 3896 2-Day Shipping No No 32
## 3897 Store Pickup No No 41
## 3898 Standard No No 24
## 3899 Express No No 24
## 3900 Store Pickup No No 33
## Payment.Method Frequency.of.Purchases
## 3896 Venmo Weekly
## 3897 Bank Transfer Bi-Weekly
## 3898 Venmo Quarterly
## 3899 Venmo Weekly
## 3900 Venmo Quarterly
#Kiểm tra NA trong các cột định tính
cat_vars <- c("Gender", "Item.Purchased", "Category", "Location", "Size", "Color",
"Season", "Subscription.Status", "Shipping.Type", "Discount.Applied",
"Promo.Code.Used", "Payment.Method", "Frequency.of.Purchases")
sapply(data[cat_vars], function(x) sum(is.na(x)))
## Gender Item.Purchased Category
## 0 0 0
## Location Size Color
## 0 0 0
## Season Subscription.Status Shipping.Type
## 0 0 0
## Discount.Applied Promo.Code.Used Payment.Method
## 0 0 0
## Frequency.of.Purchases
## 0
#Chuyển đổi sang factor
data[cat_vars] <- lapply(data[cat_vars], as.factor)
#Kiểm tra lại cấu trúc
str(data[cat_vars])
## 'data.frame': 3900 obs. of 13 variables:
## $ Gender : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
## $ Item.Purchased : Factor w/ 25 levels "Backpack","Belt",..: 3 24 12 15 3 21 17 19 5 8 ...
## $ Category : Factor w/ 4 levels "Accessories",..: 2 2 2 3 2 3 2 2 4 1 ...
## $ Location : Factor w/ 50 levels "Alabama","Alaska",..: 17 19 21 39 37 50 26 18 48 25 ...
## $ Size : Factor w/ 4 levels "L","M","S","XL": 1 1 3 2 2 2 2 1 1 2 ...
## $ Color : Factor w/ 25 levels "Beige","Black",..: 8 13 13 13 22 24 8 6 20 17 ...
## $ Season : Factor w/ 4 levels "Fall","Spring",..: 4 4 2 2 2 3 1 4 3 2 ...
## $ Subscription.Status : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ Shipping.Type : Factor w/ 6 levels "2-Day Shipping",..: 2 2 3 4 3 5 3 3 2 1 ...
## $ Discount.Applied : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ Promo.Code.Used : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
## $ Payment.Method : Factor w/ 6 levels "Bank Transfer",..: 6 2 3 5 5 6 2 3 6 2 ...
## $ Frequency.of.Purchases: Factor w/ 7 levels "Annually","Bi-Weekly",..: 4 4 7 7 1 7 6 7 1 6 ...
Dựa trên mô tả từ nguồn và phân tích cấu trúc dữ liệu, các cột trong bộ dữ liệu bao gồm:
Tổng kết phân loại biến: - Biến định tính (Categorical): 12 biến - Gender, Item Purchased, Category, Location, Size, Color, Season, Subscription Status, Shipping Type, Discount Applied, Promo Code Used, Payment Method, Frequency of Purchases. - Biến định lượng (Numerical): 4 biến - Customer ID, Age, Purchase Amount (USD), Review Rating, Previous Purchases.
Bộ dữ liệu Consumer Behavior and Shopping Habits chứa 3900 dòng và 18 cột, với 12 biến định tính và 4 biến định lượng. Nó cung cấp một cái nhìn toàn diện về hành vi tiêu dùng, từ nhân khẩu học đến thói quen mua sắm, rất hữu ích cho các nhà phân tích dữ liệu và doanh nghiệp muốn tối ưu hóa chiến lược kinh doanh.
#Bảng tần số và tỷ lệ
gender_freq <- table(data$Gender)
gender_prop <- prop.table(gender_freq) * 100
gender_table <- data.frame(Frequency = gender_freq, Percentage = gender_prop)
print(gender_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 Female 1248 Female 32
## 2 Male 2652 Male 68
#Biểu đồ tròn
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(data, aes(x = "", fill = Gender)) +
geom_bar(width = 1) +
coord_polar("y") +
labs(title = "Phân bố Giới tính", fill = "Gender") +
theme_void()
Tỷ lệ người mua theo giới tính cho thấy Male chiếm ưu thế rõ rệt với 68%, trong khi Female chỉ chiếm 32%. Biểu đồ tròn minh họa sự mất cân đối này rất rõ ràng. Kết quả này khác biệt đáng kể so với xu hướng thực tế trong các bộ dữ liệu thương mại điện tử, vốn thường ghi nhận tỷ lệ Female ở mức khoảng 68%. Do đó, có khả năng tồn tại sai sót trong khâu nhập liệu hoặc thu thập dữ liệu, và cần tiến hành kiểm tra, đối chiếu lại dữ liệu gốc để đảm bảo tính chính xác.
# Bảng tần số và tỷ lệ
item_freq <- table(data$Item.Purchased)
item_prop <- prop.table(item_freq) * 100
item_table <- data.frame(Frequency = item_freq, Percentage = item_prop)
print(item_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 Backpack 143 Backpack 3.666667
## 2 Belt 161 Belt 4.128205
## 3 Blouse 171 Blouse 4.384615
## 4 Boots 144 Boots 3.692308
## 5 Coat 161 Coat 4.128205
## 6 Dress 166 Dress 4.256410
## 7 Gloves 140 Gloves 3.589744
## 8 Handbag 153 Handbag 3.923077
## 9 Hat 154 Hat 3.948718
## 10 Hoodie 151 Hoodie 3.871795
## 11 Jacket 163 Jacket 4.179487
## 12 Jeans 124 Jeans 3.179487
## 13 Jewelry 171 Jewelry 4.384615
## 14 Pants 171 Pants 4.384615
## 15 Sandals 160 Sandals 4.102564
## 16 Scarf 157 Scarf 4.025641
## 17 Shirt 169 Shirt 4.333333
## 18 Shoes 150 Shoes 3.846154
## 19 Shorts 157 Shorts 4.025641
## 20 Skirt 158 Skirt 4.051282
## 21 Sneakers 145 Sneakers 3.717949
## 22 Socks 159 Socks 4.076923
## 23 Sunglasses 161 Sunglasses 4.128205
## 24 Sweater 164 Sweater 4.205128
## 25 T-shirt 147 T-shirt 3.769231
# Biểu đồ cột (do có nhiều giá trị)
ggplot(data, aes(x = Item.Purchased, fill = Item.Purchased)) +
geom_bar() +
labs(title = "Phân bố Sản phẩm được mua", x = "Item Purchased", y = "Tần số") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Dữ liệu ghi nhận có khoảng 25 loại sản phẩm khác nhau, trong đó Blouse chỉ chiếm 4.38% tổng số lượt mua (171/3900). Biểu đồ cột thể hiện sự phân bố khá đồng đều giữa các mặt hàng phổ biến như Blouse, Pants, và Jewelry. Không có sản phẩm nào vượt trội hoàn toàn về tần suất, điều này phản ánh sự đa dạng trong lựa chọn sản phẩm của khách hàng – một đặc điểm phổ biến trong hành vi mua sắm thời trang.
# Bảng tần số và tỷ lệ
category_freq <- table(data$Category)
category_prop <- prop.table(category_freq) * 100
category_table <- data.frame(Frequency = category_freq, Percentage = category_prop)
print(category_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 Accessories 1240 Accessories 31.794872
## 2 Clothing 1737 Clothing 44.538462
## 3 Footwear 599 Footwear 15.358974
## 4 Outerwear 324 Outerwear 8.307692
# Biểu đồ tròn
ggplot(data, aes(x = "", fill = Category)) +
geom_bar(width = 1) +
coord_polar("y") +
labs(title = "Phân bố Danh mục Sản phẩm", fill = "Category") +
theme_void()
Danh mục sản phẩm Clothing chiếm tỷ trọng lớn nhất với 44.54%, tiếp theo là Accessories, Footwear, và Outerwear. Biểu đồ tròn thể hiện rõ Clothing là danh mục nổi bật, cho thấy xu hướng tập trung mua sắm vào các sản phẩm thời trang cơ bản.
# Bảng tần số và tỷ lệ
location_freq <- table(data$Location)
location_prop <- prop.table(location_freq) * 100
location_table <- data.frame(Frequency = location_freq, Percentage = location_prop)
print(location_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 Alabama 89 Alabama 2.282051
## 2 Alaska 72 Alaska 1.846154
## 3 Arizona 65 Arizona 1.666667
## 4 Arkansas 79 Arkansas 2.025641
## 5 California 95 California 2.435897
## 6 Colorado 75 Colorado 1.923077
## 7 Connecticut 78 Connecticut 2.000000
## 8 Delaware 86 Delaware 2.205128
## 9 Florida 68 Florida 1.743590
## 10 Georgia 79 Georgia 2.025641
## 11 Hawaii 65 Hawaii 1.666667
## 12 Idaho 93 Idaho 2.384615
## 13 Illinois 92 Illinois 2.358974
## 14 Indiana 79 Indiana 2.025641
## 15 Iowa 69 Iowa 1.769231
## 16 Kansas 63 Kansas 1.615385
## 17 Kentucky 79 Kentucky 2.025641
## 18 Louisiana 84 Louisiana 2.153846
## 19 Maine 77 Maine 1.974359
## 20 Maryland 86 Maryland 2.205128
## 21 Massachusetts 72 Massachusetts 1.846154
## 22 Michigan 73 Michigan 1.871795
## 23 Minnesota 88 Minnesota 2.256410
## 24 Mississippi 80 Mississippi 2.051282
## 25 Missouri 81 Missouri 2.076923
## 26 Montana 96 Montana 2.461538
## 27 Nebraska 87 Nebraska 2.230769
## 28 Nevada 87 Nevada 2.230769
## 29 New Hampshire 71 New Hampshire 1.820513
## 30 New Jersey 67 New Jersey 1.717949
## 31 New Mexico 81 New Mexico 2.076923
## 32 New York 87 New York 2.230769
## 33 North Carolina 78 North Carolina 2.000000
## 34 North Dakota 83 North Dakota 2.128205
## 35 Ohio 77 Ohio 1.974359
## 36 Oklahoma 75 Oklahoma 1.923077
## 37 Oregon 74 Oregon 1.897436
## 38 Pennsylvania 74 Pennsylvania 1.897436
## 39 Rhode Island 63 Rhode Island 1.615385
## 40 South Carolina 76 South Carolina 1.948718
## 41 South Dakota 70 South Dakota 1.794872
## 42 Tennessee 77 Tennessee 1.974359
## 43 Texas 77 Texas 1.974359
## 44 Utah 71 Utah 1.820513
## 45 Vermont 85 Vermont 2.179487
## 46 Virginia 77 Virginia 1.974359
## 47 Washington 73 Washington 1.871795
## 48 West Virginia 81 West Virginia 2.076923
## 49 Wisconsin 75 Wisconsin 1.923077
## 50 Wyoming 71 Wyoming 1.820513
# Biểu đồ cột
ggplot(data, aes(x = Location, fill = Location)) +
geom_bar() +
labs(title = "Phân bố Địa điểm", x = "Location", y = "Tần số") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
Phân tích địa lý cho thấy New York chỉ chiếm 2.23%, trong khi các tiểu bang như California và Texas cũng có tần suất xuất hiện cao. Biểu đồ cột phản ánh sự phân bổ khá đều giữa ~50 bang, không có bang nào chiếm ưu thế áp đảo. Điều này cho thấy dữ liệu được thu thập từ nhiều khu vực khác nhau, phản ánh tính đại diện cao.
# Bảng tần số và tỷ lệ
size_freq <- table(data$Size)
size_prop <- prop.table(size_freq) * 100
size_table <- data.frame(Frequency = size_freq, Percentage = size_prop)
print(size_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 L 1053 L 27
## 2 M 1755 M 45
## 3 S 663 S 17
## 4 XL 429 XL 11
# Biểu đồ tròn
ggplot(data, aes(x = "", fill = Size)) +
geom_bar(width = 1) +
coord_polar("y") +
labs(title = "Phân bố Kích cỡ", fill = "Size") +
theme_void()
Kích cỡ M (Medium) chiếm tỷ lệ cao nhất với 45%, vượt trội so với các size còn lại như L, S, và XL. Biểu đồ tròn khẳng định xu hướng chọn kích cỡ trung bình – đây là kết quả phù hợp với chuẩn cơ thể phổ biến trong ngành thời trang.
# Bảng tần số và tỷ lệ
season_freq <- table(data$Season)
season_prop <- prop.table(season_freq) * 100
season_table <- data.frame(Frequency = season_freq, Percentage = season_prop)
print(season_table)
## Frequency.Var1 Frequency.Freq Percentage.Var1 Percentage.Freq
## 1 Fall 975 Fall 25.00000
## 2 Spring 999 Spring 25.61538
## 3 Summer 955 Summer 24.48718
## 4 Winter 971 Winter 24.89744
# Biểu đồ tròn
ggplot(data, aes(x = "", fill = Season)) +
geom_bar(width = 1) +
coord_polar("y") +
labs(title = "Phân bố Mùa mua sắm", fill = "Season") +
theme_void()
Phân bố theo mùa khá đồng đều với mùa Xuân (Spring) chiếm 25.62%. Các mùa còn lại (Summer, Fall, Winter) có tỷ lệ xấp xỉ nhau (~25%). Biểu đồ tròn xác nhận không có sự thiên lệch rõ rệt theo mùa, điều này phản ánh hành vi mua sắm không phụ thuộc vào yếu tố thời vụ trong tập dữ liệu này.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ Female
n <- nrow(data)
female_count <- sum(data$Gender == "Female")
prop_female <- female_count / n
se_female <- sqrt(prop_female * (1 - prop_female) / n)
ci_female <- prop_female + c(-1, 1) * 1.96 * se_female
cat("Khoảng tin cậy 95% cho tỷ lệ Nữ:", round(ci_female * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ lệ Nữ: 30.54 33.46 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ Nữ = 0.5)
prop.test(female_count, n, p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: female_count out of n, null probability 0.5
## X-squared = 504.72, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3054166 0.3349408
## sample estimates:
## p
## 0.32
Kết quả:
Nhận xét: Vì \(p\)-value rất nhỏ (< 0.05), bác bỏ \(H_0\). Tỷ lệ nữ trong mẫu khác biệt có ý nghĩa thống kê so với 50%, cho thấy dữ liệu có thiên lệch giới tính nghiêng về nam.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ Blouse
item_count <- sum(data$Item.Purchased == "Blouse")
prop_item <- item_count / n
se_item <- sqrt(prop_item * (1 - prop_item) / n)
ci_item <- prop_item + c(-1, 1) * 1.96 * se_item
cat("Khoảng tin cậy 95% cho tỷ lệ Blouse:", round(ci_item * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ lệ Blouse: 3.74 5.03 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ Blouse = 0.05)
prop.test(item_count, n, p = 0.05, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: item_count out of n, null probability 0.05
## X-squared = 2.9811, df = 1, p-value = 0.08424
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
## 0.03773730 0.05087059
## sample estimates:
## p
## 0.04384615
Kết quả:
Nhận xét: Vì \(p\)-value > 0.05, không bác bỏ \(H_0\). Tỷ lệ khách mua Blouse không khác biệt đáng kể so với giả định 5%, tức là giả định ban đầu hợp lý.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ Clothing
category_count <- sum(data$Category == "Clothing")
prop_category <- category_count / n
se_category <- sqrt(prop_category * (1 - prop_category) / n)
ci_category <- prop_category + c(-1, 1) * 1.96 * se_category
cat("Khoảng tin cậy 95% cho tỷ lệ Clothing:", round(ci_category * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ lệ Clothing: 42.98 46.1 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ Clothing = 0.4)
prop.test(category_count, n, p = 0.4, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: category_count out of n, null probability 0.4
## X-squared = 33.282, df = 1, p-value = 7.97e-09
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.4297199 0.4611577
## sample estimates:
## p
## 0.4453846
Kết quả:
Nhận xét: Vì \(p\)-value < 0.05, bác bỏ \(H_0\). Tỷ lệ sản phẩm Clothing cao hơn 40% một cách có ý nghĩa thống kê, chứng tỏ đây là loại hàng hóa chiếm ưu thế trong dữ liệu.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ New York
location_count <- sum(data$Location == "New York")
prop_location <- location_count / n
se_location <- sqrt(prop_location * (1 - prop_location) / n)
ci_location <- prop_location + c(-1, 1) * 1.96 * se_location
cat("Khoảng tin cậy 95% cho tỷ tỉ lệ New York:", round(ci_location * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ tỉ lệ New York: 1.77 2.69 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ New York = 0.02)
prop.test(location_count, n, p = 0.02, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: location_count out of n, null probability 0.02
## X-squared = 0.94519, df = 1, p-value = 0.3309
## alternative hypothesis: true p is not equal to 0.02
## 95 percent confidence interval:
## 0.01800617 0.02757519
## sample estimates:
## p
## 0.02230769
Kết quả:
Nhận xét: Vì \(p\)-value > 0.05, không bác bỏ \(H_0\). Tỷ lệ khách hàng từ New York phù hợp với giả định 2%, không có sự khác biệt đáng kể.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ Size M
size_count <- sum(data$Size == "M")
prop_size <- size_count / n
se_size <- sqrt(prop_size * (1 - prop_size) / n)
ci_size <- prop_size + c(-1, 1) * 1.96 * se_size
cat("Khoảng tin cậy 95% cho tỷ lệ Size M:", round(ci_size * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ lệ Size M: 43.44 46.56 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ Size M = 0.4)
prop.test(size_count, n, p = 0.4, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: size_count out of n, null probability 0.4
## X-squared = 40.417, df = 1, p-value = 2.052e-10
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.4343155 0.4657837
## sample estimates:
## p
## 0.45
Kết quả:
Nhận xét: Vì \(p\)-value rất nhỏ, bác bỏ \(H_0\). Tỷ lệ khách hàng chọn Size M cao hơn 40% một cách đáng kể, xác nhận đây là size phổ biến nhất.
# Ước lượng khoảng tin cậy 95% cho tỷ lệ Spring
season_count <- sum(data$Season == "Spring")
prop_season <- season_count / n
se_season <- sqrt(prop_season * (1 - prop_season) / n)
ci_season <- prop_season + c(-1, 1) * 1.96 * se_season
cat("Khoảng tin cậy 95% cho tỷ lệ Spring:", round(ci_season * 100, 2), "%\n")
## Khoảng tin cậy 95% cho tỷ lệ Spring: 24.25 26.99 %
Giả thuyết:
# Kiểm định giả thuyết (H0: Tỷ lệ Spring = 0.25)
prop.test(season_count, n, p = 0.25, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: season_count out of n, null probability 0.25
## X-squared = 0.75521, df = 1, p-value = 0.3848
## alternative hypothesis: true p is not equal to 0.25
## 95 percent confidence interval:
## 0.2425730 0.2702191
## sample estimates:
## p
## 0.2561538
Kết quả:
Nhận xét: Vì \(p\)-value > 0.05, không bác bỏ \(H_0\). Tỷ lệ đơn hàng trong mùa Xuân không khác biệt đáng kể so với 25%, cho thấy phân bố đơn hàng đồng đều theo mùa.
Biến độc lập: Season
# Tạo cột nhị phân cho Item.Purchased (Blouse = Y, không phải Blouse = N)
data$Blouse <- ifelse(data$Item.Purchased == "Blouse", "Y", "N")
# Tạo bảng tần số
tmp_season <- table(data$Season, data$Blouse)
addmargins(tmp_season)
##
## N Y Sum
## Fall 933 42 975
## Spring 953 46 999
## Summer 912 43 955
## Winter 931 40 971
## Sum 3729 171 3900
# Rủi ro tương đối (Relative Risk)
# Tính RR với Y là Blouse, so sánh các mùa với Spring
library(epitools)
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
cat("\nRủi ro tương đối (Season, Blouse = Y):\n")
##
## Rủi ro tương đối (Season, Blouse = Y):
riskratio(tmp_season, rev = 'c') # Đổi cột để Y là Blouse
## $data
##
## Y N Total
## Fall 42 933 975
## Spring 46 953 999
## Summer 43 912 955
## Winter 40 931 971
## Total 171 3729 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Fall 1.0000000 NA NA
## Spring 0.9968972 0.9780844 1.016072
## Summer 0.9979630 0.9790263 1.017266
## Winter 1.0019670 0.9834663 1.020816
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Fall NA NA NA
## Spring 0.7511795 0.8274736 0.7492895
## Summer 0.8355881 0.9117484 0.8347120
## Winter 0.8374976 0.9102619 0.8362825
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
epitab(tmp_season, method = 'riskratio', rev = 'c')
## $tab
##
## Y p0 N p1 riskratio lower upper p.value
## Fall 42 0.04307692 933 0.9569231 1.0000000 NA NA NA
## Spring 46 0.04604605 953 0.9539540 0.9968972 0.9780844 1.016072 0.8274736
## Summer 43 0.04502618 912 0.9549738 0.9979630 0.9790263 1.017266 0.9117484
## Winter 40 0.04119464 931 0.9588054 1.0019670 0.9834663 1.020816 0.9102619
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
epitab()) xác nhận không có ý nghĩa
thống kê, phù hợp với tỷ lệ đồng đều (~4-5%).# Tỷ lệ chênh (Odds Ratio)
# Tính OR với Y là Blouse, so sánh các mùa với Spring
cat("\nTỷ lệ chênh (Season, Blouse = Y):\n")
##
## Tỷ lệ chênh (Season, Blouse = Y):
oddsratio(tmp_season, rev = 'c')
## $data
##
## Y N Total
## Fall 42 933 975
## Spring 46 953 999
## Summer 43 912 955
## Winter 40 931 971
## Total 171 3729 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Fall 1.0000000 NA NA
## Spring 0.9329309 0.6057622 1.433182
## Summer 0.9548638 0.6161842 1.478726
## Winter 1.0475269 0.6715138 1.636456
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Fall NA NA NA
## Spring 0.7511795 0.8274736 0.7492895
## Summer 0.8355881 0.9117484 0.8347120
## Winter 0.8374976 0.9102619 0.8362825
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
epitab(tmp_season, method = 'oddsratio', rev = 'c')
## $tab
##
## Y p0 N p1 oddsratio lower upper p.value
## Fall 42 0.2456140 933 0.2502011 1.0000000 NA NA NA
## Spring 46 0.2690058 953 0.2555645 0.9326157 0.6079339 1.430702 0.8274736
## Summer 43 0.2514620 912 0.2445696 0.9547596 0.6180504 1.474906 0.9117484
## Winter 40 0.2339181 931 0.2496648 1.0477492 0.6731517 1.630804 0.9102619
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
| ## Phân tích cặp biến: Gender và Size Biến độc lập: Gender |
| Biến phụ thuộc: Size (chọn “M” làm “thành công”) |
# Tạo cột nhị phân cho Size (M = Y, không phải M = N)
data$Size_M <- ifelse(data$Size == "M", "Y", "N")
# Tạo bảng tần số
tmp_gender <- table(data$Gender, data$Size_M)
addmargins(tmp_gender)
##
## N Y Sum
## Female 658 590 1248
## Male 1487 1165 2652
## Sum 2145 1755 3900
# Rủi ro tương đối (Relative Risk)
# Tính RR với Y là Size M, so sánh Male với Female
cat("\nRủi ro tương đối (Gender, Size M = Y):\n")
##
## Rủi ro tương đối (Gender, Size M = Y):
riskratio(tmp_gender, rev = 'c') # Đổi cột để Y là Size M
## $data
##
## Y N Total
## Female 590 658 1248
## Male 1165 1487 2652
## Total 1755 2145 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.063472 0.9991309 1.131957
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.05029278 0.05334186 0.05004174
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
epitab(tmp_gender, method = 'riskratio', rev = 'c')
## $tab
##
## Y p0 N p1 riskratio lower upper p.value
## Female 590 0.4727564 658 0.5272436 1.000000 NA NA NA
## Male 1165 0.4392911 1487 0.5607089 1.063472 0.9991309 1.131957 0.05334186
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
epitab(method = 'riskratio') nhất quán với
riskratio(), sử dụng kiểm định Fisher để tính \(p\)-value.# Tỷ lệ chênh (Odds Ratio)
# Tính OR với Y là Size M, so sánh Male với Female
cat("\nTỷ lệ chênh (Gender, Size M = Y):\n")
##
## Tỷ lệ chênh (Gender, Size M = Y):
oddsratio(tmp_gender, rev = 'c')
## $data
##
## Y N Total
## Female 590 658 1248
## Male 1165 1487 2652
## Total 1755 2145 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.144455 0.9998011 1.309921
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.05029278 0.05334186 0.05004174
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
epitab(tmp_gender, method = 'oddsratio', rev = 'c')
## $tab
##
## Y p0 N p1 oddsratio lower upper p.value
## Female 590 0.3361823 658 0.3067599 1.000000 NA NA NA
## Male 1165 0.6638177 1487 0.6932401 1.144488 0.9999395 1.309932 0.05334186
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
epitab(method = 'oddsratio') nhất quán với
oddsratio(), sử dụng phương pháp “median-unbiased estimate”
và kiểm định Fisher.# Tạo bảng tần số chéo
table_season_item <- table(data$Season, data$Item.Purchased)
cat("\nBảng tần số chéo: Season và Item.Purchased\n")
##
## Bảng tần số chéo: Season và Item.Purchased
print(addmargins(table_season_item))
##
## Backpack Belt Blouse Boots Coat Dress Gloves Handbag Hat Hoodie
## Fall 34 41 42 35 34 36 37 48 50 36
## Spring 39 41 46 40 46 43 42 36 27 36
## Summer 45 39 43 38 42 47 29 35 37 31
## Winter 25 40 40 31 39 40 32 34 40 48
## Sum 143 161 171 144 161 166 140 153 154 151
##
## Jacket Jeans Jewelry Pants Sandals Scarf Shirt Shoes Shorts Skirt
## Fall 54 32 35 38 44 40 39 26 35 46
## Spring 35 32 42 32 44 41 42 40 47 46
## Summer 33 31 47 50 40 43 38 46 40 28
## Winter 41 29 47 51 32 33 50 38 35 38
## Sum 163 124 171 171 160 157 169 150 157 158
##
## Sneakers Socks Sunglasses Sweater T-shirt Sum
## Fall 31 42 39 42 39 975
## Spring 39 40 33 52 38 999
## Summer 36 42 37 28 30 955
## Winter 39 35 52 42 40 971
## Sum 145 159 161 164 147 3900
# Kiểm định Chi-bình phương
chi_season_item <- chisq.test(table_season_item)
cat("\nKiểm định Chi-bình phương: Season và Item.Purchased\n")
##
## Kiểm định Chi-bình phương: Season và Item.Purchased
print(chi_season_item)
##
## Pearson's Chi-squared test
##
## data: table_season_item
## X-squared = 78.192, df = 72, p-value = 0.2887
- **Kết quả**:
- \(\chi^2 = 78\), bậc tự do (\( df \)) = 72, \( p \)-value = 0.3.