BÀI TẬP THỰC HÀNH

Nhiệm vụ 3 (1/6/2025)

A. Chuẩn bị trước buổi học

1. Ôn lại Relative Risk

Relative Risk (RR) là tỷ lệ giữa xác suất xảy ra một sự kiện trong nhóm có yếu tố tác động (phơi nhiễm) so với nhóm không có yếu tố đó.

Trong kinh tế học ứng dụng, RR thường được sử dụng trong các nghiên cứu chính sách, hành vi tiêu dùng, tài chính hành vi, y tế – kinh tế học, để đo lường mức độ ảnh hưởng của một nhân tố đến một kết quả cụ thể.

Về ý nghĩa, RR giúp trả lời câu hỏi: “Người có đặc điểm A có khả năng gặp sự kiện X cao hơn bao nhiêu lần so với người không có đặc điểm A?”

Cách tính Relative Risk:

Nhóm / Kết quả Có sự kiện (Event) Không có sự kiện (No Event) Tổng
Nhóm phơi nhiễm (Exposed) a b a + b
Nhóm không phơi nhiễm (Non-exposed) c d c + d
Tổng cộng a + c b + d a + b + c + d

Khi đó:

\[ RR = \frac{a / (a + b)}{c / (c + d)} \]

Diễn giải:

  • RR > 1: Nhóm phơi nhiễm có nguy cơ xảy ra sự kiện cao hơn → yếu tố phơi nhiễm tăng rủi ro.

  • RR < 1: Nhóm phơi nhiễm có nguy cơ thấp hơn → yếu tố phơi nhiễm có khả năng bảo vệ hoặc giảm rủi ro.

  • RR = 1: Không có sự khác biệt giữa hai nhóm.

2. Cấu trúc xác suất của bảng ngẫu nhiên

Bảng ngẫu nhiên (contingency table) là bảng thể hiện tần số (hoặc xác suất) quan sát được của các tổ hợp giá trị từ hai (hoặc nhiều) biến phân loại.

Để mô hình hóa quá trình sinh ra các giá trị trong bảng ngẫu nhiên, ta cần dùng các phân phối xác suất rời rạc. Hai phân phối phổ biến là:

a. Phân phối Poisson

  • Dùng khi các ô trong bảng được sinh ra độc lập, không bị ràng buộc bởi tổng hàng hoặc tổng cột.

  • Mỗi ô \(X_{ij}\) tuân theo phân phối Poisson:

\[ X_{ij} \sim \text{Poisson}(\lambda_{ij}) \]

  • Tổng quát:
    \(X_{ij}\)số lượng sự kiện xảy ra trong một vùng cụ thể (ô), với kỳ vọng \(\lambda_{ij}\).

Phân phối Multinomial

  • Dùng khi tổng số quan sát \(n\) là cố định và các ô thể hiện số lần xuất hiện của từng loại kết quả.

  • Mỗi bảng được xem như một mẫu ngẫu nhiên gồm \(n\) phần tử, mỗi phần tử thuộc một trong \(r \times c\) loại.

  • Gọi \(p = \{p_{ij}\}\) là xác suất thực sự của từng ô:

\[ (X_{11}, X_{12}, \dots, X_{rc}) \sim \text{Multinomial}(n; p_{11}, p_{12}, \dots, p_{rc}) \]

với \(\sum p_{ij} = 1\)\(\sum X_{ij} = n\).

c. So sánh hai phân phối

Đặc điểm Poisson Multinomial
Tổng số lượng (n) Không cố định Cố định (biết trước)
Mối liên hệ giữa các ô Độc lập Phụ thuộc (do tổng \(n\) cố định)
Phù hợp cho Mô hình log-linear Kiểm định độc lập, fit phân phối
Ước lượng tham số Poisson regression, log-linear Ước lượng tần suất tương đối viết thành bảng

d. Liên hệ và mở rộng

  • Khi tổng số mẫu \(n\) trong phân phối Multinomial lớn, và xác suất mỗi ô nhỏ, thì phân phối Multinomial xấp xỉ bởi các phân phối Poisson độc lập.

  • Đây gọi là xấp xỉ Poisson của phân phối Multinomial:

\[ \text{Multinomial}(n, p_{ij}) \approx \text{Poisson}(n p_{ij}) \]

3. So sánh hai tỷ lệ trong bảng ngẫu nhiên 2x2

a. Relative Risk

Đã thực hiện trong phần 1.

b. Odds Ratio (Tỷ số chênh)

Odds Ratio (OR) – hay Tỷ số chênh – là một khái niệm thống kê thường được sử dụng trong nghiên cứu y học, xã hội học, kinh tế học, và khoa học dữ liệu để đo lường mối liên hệ giữa hai biến phân loại, đặc biệt là để đánh giá mức độ ảnh hưởng của một yếu tố đến một kết quả.

Công thức tính:

Kết quả (+) Kết quả (–)
Nhóm có yếu tố (E+) a b
Nhóm không có (E–) c d

Khi đó OR:

\[ \text{OR} = \frac{c/d}{a/b} = \frac{b \cdot c}{a \cdot d} \]

Ý nghĩa của Odds Ratio:

  • OR = 1 → Không có sự khác biệt giữa hai nhóm (yếu tố không ảnh hưởng).

  • OR > 1 → Nhóm có yếu tố có khả năng xảy ra kết quả cao hơn.

  • OR < 1 → Nhóm có yếu tố có khả năng xảy ra kết quả thấp hơn (có thể có tác dụng bảo vệ).

c. Hiệu hai tỷ lệ

Giả sử có bảng dữ liệu:

Có bệnh (Sự kiện) Không bệnh (Không sự kiện) Tổng
Phơi nhiễm (+) a b a + b
Phơi nhiễm (–) c d c + d
Tổng a + c b + d n = a + b + c + d

Ta có:

\[ \text{Hiệu hai tỷ lệ} \;=\; \frac{a+b}{a}\;-\;\frac{c+d}{c} \]

Đây là sự khác biệt tuyệt đối về xác suất giữa nhóm phơi nhiễm và không phơi nhiễm.

Ý nghĩa:

  • Nếu hiệu này > 0: nguy cơ ở nhóm phơi nhiễm cao hơn.

  • Nếu = 0: không có sự khác biệt.

  • Nếu < 0: nguy cơ ở nhóm không phơi nhiễm cao hơn.

4. Khoảng tin cậy cho các tham số ddo mối liên hệ

a. Khoảng tin cậy cho hiệu hai tỷ lệ

\[ \text{CI} = (p_1 - p_2) \pm Z \cdot \sqrt{ \frac{p_1(1 - p_1)}{n_1} + \frac{p_2(1 - p_2)}{n_2} } \]

Ý nghĩa: Nếu CI không chứa 0 → sự khác biệt có ý nghĩa thống kê.

b. Khoảng tin cậy cho Tỷ số nguy cơ (Relative Risk - RR)

\[ \text{CI}_{\log(RR)} = \log(RR) \pm Z \cdot SE_{\log(RR)} \]

Trong đó:

\[ SE_{\log(RR)} = \sqrt{ \frac{1}{a} - \frac{1}{a+b} + \frac{1}{c} - \frac{1}{c+d} } \]

Sau đó lấy mũ trở lại khoảng tin cậy cho RR:

\[ \text{CI}_{RR} = \left[ e^{\log(RR) - Z \cdot SE}, \; e^{\log(RR) + Z \cdot SE} \right] \]

Ý nghĩa: Nếu CI không chứa 1 → có ý nghĩa thống kê.

c. Khoảng tin cậy cho Tỷ số chênh (Odds Ratio - OR)

Tương tự RR, tính trên log(OR):

\[ \text{CI}_{\log(OR)} = \log(OR) \pm Z \cdot SE_{\log(OR)} \]

Trong đó:

\[ SE_{\log(OR)} = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]

Lấy mũ để ra CI cho OR:

\[ \text{CI}_{OR} = \left[ e^{\log(OR) - Z \cdot SE}, \; e^{\log(OR) + Z \cdot SE} \right] \]

Ý nghĩa: Nếu CI không chứa 1 → OR có ý nghĩa.

5. Thực hiện trên bộ dữ liệu

Đặt vấn đề: Liệu người đã kết hôn so với chưa kết hôn có làm tăng hay giảm odds của việc sở hữu nhà hay không?

Bảng chéo 2x2 về dữ liệu:

table1 <- table(data$MaritalStatus, data$Homeowner)
print(table1)
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297

Thực hiện tính Odds ratio:

(table1["M", "N"] * table1["M", "Y"]) / (table1["S", "N"] * table1["S", "Y"])
## [1] 0.6887984

Nhận xét:

  • OR < 1 → Nhóm M có odds thấp hơn nhóm S.

  • Cụ thể, odds sở hữu nhà của nhóm M chỉ bằng khoảng 68.9% odds của nhóm S.

  • Hay nói cách khác, người đã kết hôn (M) có khả năng sở hữu nhà thấp hơn người chưa kết hôn (S) theo tỷ số chênh.

Tìm khoản tin cậy cho OR:

oddsratio(table1)
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower     upper
##   M 1.000000        NA        NA
##   S 0.282673 0.2630995 0.3036164
## 
## $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] "median-unbiased estimate & mid-p exact CI"

Nhiệm vụ 2 (18/5/2025)

Phần 1: Tìm hiểu và chuẩn bị dữ liệu

1.1 Thực hiện đọc dữ liệu vào R

Việc import dữ liệu vào môi trường làm việc là bước rất quan trọng để đảm bảo quá trình phân tích, xử lý và khai thác thông tin diễn ra hiệu quả. Nếu dữ liệu không được nhập đúng cách, các bước phân tích tiếp theo có thể bị sai lệch hoặc gặp nhiều khó khăn.

Trong bài này, chúng ta sử dụng dữ liệu Supermarket Transactions để tập trung phân tích các biến định tính. Ở R, hàm read.csv thường được dùng để đọc file CSV và lưu dữ liệu thành một data frame, giúp việc xử lý và phân tích dữ liệu trở nên thuận tiện hơn.

data <- read.csv(file.choose(), header = T)

Cấu trúc dữ liệu thể hiện cách tổ chức và kiểu dữ liệu của từng biến trong tập dữ liệu. Việc xem cấu trúc dữ liệu rất quan trọng giúp ta hiểu rõ đặc điểm dữ liệu, phát hiện lỗi và lựa chọn phương pháp xử lý phù hợp, từ đó nâng cao độ chính xác trong phân tích.

Kết quả 1. Cấu trúc của dữ liệu
'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 ...

Hàm str(data) cho thấy cấu trúc của dữ liệu, bao gồm tên các biến, kiểu dữ liệu và một số giá trị mẫu. Qua đó, ta có thể hiểu rõ từng biến trong file, biết được biến nào là định tính, biến nào là định lượng, từ đó thuận tiện cho việc lựa chọn phương pháp phân tích phù hợp.

Bộ dữ liệu Supermarket Transactions ghi lại thông tin về các giao dịch mua sắm tại siêu thị. Cụ thể, nó chứa 14.059 quan sát dữ liệu và 16 biến, mô tả chi tiết về khách hàng, sản phẩm, và thông tin mua hàng. Dưới đây là ý nghĩa chung của từng cột:

  • Biến định lượng:

    • Children: Số lượng con của khách hàng.

    • UnitsSold: Số lượng sản phẩm đã bán trong giao dịch đó.

    • Revenue: Doanh thu từ giao dịch đó (USD).

  • Biến định tính:

    • Gender: Giới tính của khách hàng (F: Nữ, M: Nam).

    • MaritalStatus: Tình trạng hôn nhân (S: Độc thân, M: Đã kết hôn).

    • Homeowner: Có sở hữu nhà hay không (Y: Có ,N: Không).

    • AnnualIncome: Thu nhập hàng năm (ví dụ: “$30K - $50K”).

    • City: Thành phố nơi khách hàng sống.

    • StateorProvince: Bang hoặc tỉnh.

    • Country: Quốc gia (chủ yếu là USA).

    • ProductFamily: Nhóm sản phẩm chính (ví dụ: Food, Drink…).

    • ProductDepartment: Phân ngành sản phẩm (ví dụ: Snack Foods, Produce…).

    • ProductCategory: Danh mục cụ thể sản phẩm (ví dụ: Vegetables, Candy…).

  • Các biến khác:

    • X: Số thứ tự.

    • PurchaseDate: Ngày giao dịch mua hàng.

    • CustomerID: Mã số khách hàng.

Kết quả của câu lệnh str() trên còn cho thấy kiểu dữ liệu của các biến trong tập dữ liệu. Trong kết quả này, các biến dạng ký tự (chr) thường được hiển thị màu đỏ, còn các biến dạng số thực (num) và số nguyên (int) thì có màu vàng.

1.2 Một vài quan sát của dữ liệu

Một số quan sát đầu của dữ liệu:

head(data)
X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children AnnualIncome City StateorProvince Country ProductFamily ProductDepartment ProductCategory UnitsSold Revenue
1 2007-12-18 7223 F S Y 2 $30K - $50K Los Angeles CA USA Food Snack Foods Snack Foods 5 27.38
2 2007-12-20 7841 M M Y 5 $70K - $90K Los Angeles CA USA Food Produce Vegetables 5 14.90
3 2007-12-21 8374 F M N 2 $50K - $70K Bremerton WA USA Food Snack Foods Snack Foods 3 5.52
4 2007-12-21 9619 M M Y 3 $30K - $50K Portland OR USA Food Snacks Candy 4 4.44
5 2007-12-22 1900 F S Y 3 $130K - $150K Beverly Hills CA USA Drink Beverages Carbonated Beverages 4 14.00
6 2007-12-22 6696 F M Y 3 $10K - $30K Beverly Hills CA USA Food Deli Side Dishes 3 4.37

Một số quan sát cuối của dữ liệu:

tail(data)
X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children AnnualIncome City StateorProvince Country ProductFamily ProductDepartment ProductCategory UnitsSold Revenue
14054 14054 2009-12-29 2032 F M N 3 $10K - $30K Yakima WA USA Non-Consumable Household Paper Products 5 14.50
14055 14055 2009-12-29 9102 F M Y 2 $10K - $30K Bremerton WA USA Food Baking Goods Baking Goods 3 9.64
14056 14056 2009-12-29 4822 F M Y 3 $10K - $30K Walla Walla WA USA Food Frozen Foods Vegetables 3 7.45
14057 14057 2009-12-31 250 M S Y 1 $30K - $50K Portland OR USA Drink Beverages Pure Juice Beverages 4 3.24
14058 14058 2009-12-31 6153 F S N 4 $50K - $70K Spokane WA USA Drink Dairy Dairy 2 4.00
14059 14059 2009-12-31 3656 M S N 3 $50K - $70K Portland OR USA Non-Consumable Household Electrical 5 25.53

1.3 Thực hiện kiểm tra giá trị NA trong dữ liệu

Việc kiểm tra giá trị NA trong dữ liệu rất quan trọng vì chúng có thể gây sai lệch kết quả phân tích. Xử lý NA đúng cách giúp đảm bảo dữ liệu đầy đủ, đáng tin cậy và phù hợp cho các phân tích tiếp theo.

na_counts <- colSums(is.na(data))

na_table <- data.frame(
  "Tên biến" = names(na_counts),
  "Số lượng NA" = as.vector(na_counts),
  check.names = FALSE)

left_part <- na_table[1:8,]
right_part <- na_table[9:16,]

combined <- cbind(left_part, right_part)

kable(combined, caption = "<div style='text-align:center; font-weight:bold;'>Kết quả 2. Số lượng giá trị NA trong từng cột</div>", escape = FALSE) %>%
  kable_styling(full_width = FALSE, position = "center") %>%
  column_spec(2, extra_css = "text-align: center;") %>% 
  column_spec(4, extra_css = "text-align: center;")  
Kết quả 2. Số lượng giá trị NA trong từng cột
Tên biến Số lượng NA Tên biến Số lượng NA
X 0 City 0
PurchaseDate 0 StateorProvince 0
CustomerID 0 Country 0
Gender 0 ProductFamily 0
MaritalStatus 0 ProductDepartment 0
Homeowner 0 ProductCategory 0
Children 0 UnitsSold 0
AnnualIncome 0 Revenue 0

Kết quả kiểm tra cho thấy không có giá trị NA trong bất kỳ biến nào của toàn bộ bộ dữ liệu, cho thấy dữ liệu đầy đủ và sẵn sàng cho quá trình phân tích tiếp theo.

Nếu phát hiện các giá trị NA trong dữ liệu, ta có thể áp dụng một số phương pháp xử lý phù hợp tùy vào tính chất của biến.

  • Đối với biến định lượng, có thể thay thế NA bằng giá trị trung bình hoặc trung vị để giữ lại thông tin và tránh làm lệch phân phối.

  • Đối với biến định tính, thay thế bằng mode (giá trị xuất hiện nhiều nhất) là lựa chọn hợp lý nhằm duy trì tính đại diện.

Trường hợp số lượng NA quá lớn hoặc phân bố không đều, có thể xem xét loại bỏ các dòng chứa NA để tránh ảnh hưởng đến kết quả phân tích. Việc lựa chọn phương pháp xử lý cần cân nhắc giữa việc bảo toàn dữ liệu và độ chính xác của các mô hình khi thực hiện.

1.4 Chuyển đổi các biến cần thiết sang factor

Bài thực hành tập trung vào phân tích các biến định lượng, vốn đã được liệt kê cụ thể tại phần 1.1. Đồng thời, phần này cũng trình bày việc kiểm tra kiểu dữ liệu nhằm đảm bảo độ chính xác và nhất quán cho quá trình phân tích.

Trong bảng cấu trúc dữ liệu đã được trình bày trước đó cho thấy rằng đối với các biến định tính được liệt kê đều có kiểu dữ liệu là ký tự (chr).

Để phân tích cụ thể các biến định tính trong R, ta nên chuyển kiểu dữ liệu của chúng sang dạng factor. Việc này giúp R nhận diện đúng bản chất phân loại của biến, từ đó hỗ trợ tốt hơn trong các phân tích thống kê và mô hình hóa.

Để thuận tiện cho việc phân tích, sẽ thực hiện chuyển các biến định tính ở dạng chrtrong dữ liệu sang dạng factor và tạo một bảng mới chỉ chứa các biến định tính này.

categorical_data <- data %>%
  mutate(across(c(Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory), as.factor)) %>%
  select(Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory)

Kiểm tra lại kiểu dữ liệu của bảng mới vừa được tạo ra:

name_factor <- names(categorical_data)[sapply(categorical_data, is.factor)]

name_factor <- data.frame(STT = seq_along(name_factor), "Tên biến" = name_factor, stringsAsFactors = FALSE, check.names = FALSE)

kable(name_factor, caption = "<div style='text-align:center; font-weight:bold;'>Kết quả 3. Các biến được định dạng là `factor`</div>", escape = FALSE) %>% kable_styling(full_width = FALSE) %>%
   column_spec(1, width = "1cm") %>%   
  column_spec(2, width = "3cm")
Kết quả 3. Các biến được định dạng là factor
STT Tên biến
1 Gender
2 MaritalStatus
3 Homeowner
4 AnnualIncome
5 City
6 StateorProvince
7 Country
8 ProductFamily
9 ProductDepartment
10 ProductCategory

Kết quả cho thấy tất cả các biến trong bảng đều được chuyển sang dạng factor.

Một số giá trị đầu của bảng:

head(categorical_data)
Gender MaritalStatus Homeowner AnnualIncome City StateorProvince Country ProductFamily ProductDepartment ProductCategory
F S Y $30K - $50K Los Angeles CA USA Food Snack Foods Snack Foods
M M Y $70K - $90K Los Angeles CA USA Food Produce Vegetables
F M N $50K - $70K Bremerton WA USA Food Snack Foods Snack Foods
M M Y $30K - $50K Portland OR USA Food Snacks Candy
F S Y $130K - $150K Beverly Hills CA USA Drink Beverages Carbonated Beverages
F M Y $10K - $30K Beverly Hills CA USA Food Deli Side Dishes

Phần 2: Phân tích mô tả một biến định tính

2.1 Phân tích mô tả biến Gender (Giới tính)

2.1.1 Thống kê tần suất cho biến

Thống kê tần suất và tần số giúp đếm số lần và tỷ lệ xuất hiện của các giá trị trong dữ liệu. Đây là bước cơ bản để hiểu phân bố và đặc điểm của biến trước khi phân tích sâu hơn.

print(freg_gender <- table(categorical_data$Gender))
## 
##    F    M 
## 7170 6889

Dữ liệu cho thấy số lượng nữ giới (F) là 7170 và số lượng nam giới (M) là 6889.

Dựa vào kết quả tần số, ta có thể tính được tần suất bằng cách lấy số lượng từng nhóm chia cho tổng số quan sát. Tần suất giúp thể hiện tỷ lệ phần trăm của mỗi nhóm trong toàn bộ dữ liệu, từ đó dễ dàng so sánh và đánh giá mức độ phổ biến của từng giá trị.

print(percent_gender <- prop.table(table(categorical_data$Gender))*100)
## 
##        F        M 
## 50.99936 49.00064

Dữ liệu cho thấy số lượng nữ giới (F) chiếm khoảng 51% và nam giới (M) chiếm khoảng 49% trong toàn bộ tập dữ liệu.

2.1.2 Trực quan hóa dữ liệu

ggplot(categorical_data, aes(x = Gender, fill = Gender)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..), 
            position = position_stack(vjust = 1.05), color = "black", size = 5) +
  scale_fill_manual(values = c("F" = "pink", "M" = "steelblue")) +
  labs(title = "Biểu đồ tần số theo giới tính",
       x = "Giới tính",
       y = "Tần số (Số lượng)") +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào biểu đồ tần số theo giới tính, có thể thấy rõ sự chênh lệch về số lượng giữa hai giới tính F (Nữ) và M (Nam). Cụ thể, số lượng giới tính F là 7170, cao hơn đáng kể so với số lượng giới tính M là 6889. Điều này cho thấy giới tính F chiếm tỷ lệ lớn hơn trong tổng số người được thống kê trong biểu đồ này.

ggplot(categorical_data, aes(x = "", fill = Gender)) +
  geom_bar(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("F" = "pink", "M" = "steelblue")) +
  geom_text(aes(label = scales::percent(..count../sum(..count..))),
            stat = "count",
            position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn phân bố giới tính",
       fill = "Giới tính") +
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào biểu đồ tròn phân bố giới tính, ta có thể nhận thấy sự phân bố gần như đồng đều giữa hai giới tính F (Nữ) và M (Nam). Cụ thể, giới tính F chiếm 51% tổng số, trong khi giới tính M chiếm 49%. Điều này cho thấy tỷ lệ giới tính trong mẫu được khảo sát khá cân bằng, với giới nữ có phần nhỉnh hơn một chút.

2.1.3 Nhận xét cho biến Gender

Biến Gender phân loại khách hàng thành hai nhóm chính là nam (M) và nữ (F). Dữ liệu cho thấy số lượng nữ giới (F) là 7,170 khách hàng, chiếm khoảng 51.1% tổng mẫu, trong khi số lượng nam giới (M) là 6,889 khách hàng, chiếm khoảng 48.9%. Tỷ lệ này cho thấy sự phân bố giới tính trong dữ liệu khá cân bằng, giúp đảm bảo tính đại diện và độ tin cậy cho các phân tích liên quan đến giới tính.

2.2 Phân tích mô tả biến MaritalStatus (Tình trạng hôn nhân)

2.2.1 Thống kê tần suất cho biến

print(freg_maritalstatus <- table(categorical_data$MaritalStatus))
## 
##    M    S 
## 6866 7193

Dữ liệu cho thấy số lượng khách hàng đã kết hôn (M) là 6866 và số lượng khách hàng độc thân (S) là 6866.

print(freg_maritalstatus <- prop.table(table(categorical_data$MaritalStatus))*100)
## 
##        M        S 
## 48.83704 51.16296

Dữ liệu cho thấy khách hàng đã kết hôn (M) chiếm khoảng 48.8% tổng số mẫu, trong khi khách hàng độc thân (S) chiếm khoảng 51.16%.

2.2.2 Trực quan hóa dữ liệu

ggplot(categorical_data, aes(x = MaritalStatus, fill = MaritalStatus)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..), 
            position = position_stack(vjust = 1.05), color = "black", size = 5) +
  scale_fill_manual(values = c("M" = "Red", "S" = "Green")) +
  labs(title = "Biểu đồ tần số theo tình trạng hôn nhân",
       x = "Tình trạng hôn nhân",
       y = "Tần số (Số lượng)") +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))

Biểu đồ tần số theo tình trạng hôn nhân cho thấy số lượng người độc thân (S) là 7193, cao hơn so với số lượng người đã kết hôn hoặc có tình trạng hôn nhân khác (M) là 6866. Điều này chỉ ra rằng trong tập dữ liệu này, nhóm người độc thân chiếm đa số.

ggplot(categorical_data, aes(x = "", fill = MaritalStatus)) +
  geom_bar(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("M" = "red", "S" = "green")) +
  geom_text(aes(label = scales::percent(..count../sum(..count..))),
            stat = "count",
            position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn phân tình trạng hôn nhân",
       fill = "Tình trạng hôn nhân") +
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào biểu đồ tròn phân bố tình trạng hôn nhân, ta có thể thấy rằng tình trạng hôn nhân “S” (Độc thân) chiếm tỷ lệ 51.2%, cao hơn một chút so với tình trạng hôn nhân “M” (Đã kết hôn hoặc các tình trạng khác) chiếm 48.8%. Điều này cho thấy trong tập dữ liệu này, nhóm người độc thân có tỷ lệ hơi cao hơn so với nhóm đã có gia đình.

2.2.3 Nhận xét cho biến MaritalStatus

Biến MaritalStatus phản ánh tình trạng hôn nhân của khách hàng, phân thành hai nhóm chính: đã kết hôn (M) và độc thân (S). Dữ liệu cho thấy khách hàng đã kết hôn chiếm khoảng 48.84% tổng số mẫu, trong khi khách hàng độc thân chiếm khoảng 51.16%. Tỷ lệ này cho thấy nhóm khách hàng độc thân chiếm phần hơi lớn hơn, góp phần đa dạng hóa đặc điểm dân số trong mẫu nghiên cứu.

2.3 Phân tích mô tả biến Homeowner

2.3.1 Thống kê tần suất cho biến

print(freg_homeowner<- table(categorical_data$Homeowner))
## 
##    N    Y 
## 5615 8444

Dữ liệu cho thấy số lượng khách hàng đã có nhà (Y) là 8444 và số lượng khách hàng chưa sở hữu nhà (N) là 5615.

print(percent_homeowner <- prop.table(table(categorical_data$Homeowner))*100)
## 
##        N        Y 
## 39.93883 60.06117

Kết quả cho thấy khoảng 60.06% khách hàng đã sở hữu nhà (Y), trong khi 39.94% chưa sở hữu nhà (N).

2.3.2 Trực quan hóa dữ liệu

ggplot(categorical_data, aes(x = Homeowner, fill = Homeowner)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..), 
            position = position_stack(vjust = 0.5), color = "black", size = 5) +
  scale_fill_manual(values = c("Y" = "red", "N" = "blue")) +
  labs(title = "Biểu đồ tần số theo tình trạng sở hữu nhà ở",
       x = "Tình trạng sở hữu nhà",
       y = "Tần số (Số lượng)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào biểu đồ tần số theo tình trạng sở hữu nhà ở, có thể thấy rõ sự chênh lệch lớn giữa hai nhóm. Cụ thể, số lượng người sở hữu nhà (Y) là 8444, cao hơn đáng kể so với số lượng người không sở hữu nhà (N) là 5615. Điều này cho thấy trong tập dữ liệu này, phần lớn dân số là chủ sở hữu nhà.

ggplot(categorical_data, aes(x = "", fill = Homeowner)) +
  geom_bar(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("Y" = "red", "N" = "blue")) +
  geom_text(aes(label = scales::percent(..count../sum(..count..))),
            stat = "count",
            position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn phân tình trạng sở hữu nhà ở",
       fill = "Tình trạng sở hữu nhà") +
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào biểu đồ tròn phân bố tình trạng sở hữu nhà ở, ta có thể nhận thấy rằng tỷ lệ người sở hữu nhà (Y) chiếm 60%, cao hơn đáng kể so với tỷ lệ người không sở hữu nhà (N) chiếm 40%. Điều này khẳng định rằng trong tập dữ liệu được thể hiện, phần lớn dân số là chủ sở hữu nhà.

2.3.3 Nhận xét cho biến Homeowner

Biến Homeowner thể hiện tình trạng sở hữu nhà của khách hàng, với hai giá trị là “Y” (đã sở hữu) và “N” (chưa sở hữu). Dữ liệu cho thấy số lượng khách hàng đã có nhà (Y) là 8,444 người, chiếm khoảng 60.06% tổng mẫu, trong khi số lượng khách hàng chưa sở hữu nhà (N) là 5,615 người, chiếm khoảng 39.94%. Tỷ lệ này cho thấy phần lớn khách hàng trong tập dữ liệu đã có nhà ở.

2.4 Phân tích mô tả biến AnnualIncome

2.4.1 Thống kê tần suất cho biến

print(freg_homeowner<- table(categorical_data$AnnualIncome))
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613

Kết quả của dữ liệu cho thấy bao gồm:

  • 3090 khách hàng có thu nhập hằng năm là $10K - $30K.

  • 4601 khách hàng có thu nhập hằng năm là $30K - $50K.

  • 2370 khách hàng có thu nhập hằng năm là $50K - $70K.

  • 1709 khách hàng có thu nhập hằng năm là $70K - $90K.

  • 613 khách hàng có thu nhập hằng năm là $90K - $110K.

  • 643 khách hàng có thu nhập hằng năm là $110K - $130K.

  • 760 khách hàng có thu nhập hằng năm là $130K - $150K.

  • 273 khách hàng có thu nhập hằng năm là trên $150K.

print(percent_homeowner <- prop.table(table(categorical_data$AnnualIncome))*100)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##     21.978804      4.573583      5.405790      1.941817     32.726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##     16.857529     12.155914      4.360196

Phân bố tỷ lệ phần trăm khách hàng theo mức thu nhập cho thấy:

  • Khoảng 21.98% khách hàng có thu nhập hằng năm từ $10K - $30K.

  • 32.73% khách hàng thuộc nhóm $30K - $50K, là nhóm chiếm tỷ lệ lớn nhất.

  • 16.86% khách hàng có thu nhập từ $50K - $70K.

  • Nhóm $70K - $90K chiếm 12.16% tổng số khách hàng.

  • Nhóm $90K - $110K và $110K - $130K lần lượt chiếm 4.36% và 4.57%.

  • 5.41% khách hàng có thu nhập từ $130K - $150K.

  • Cuối cùng, nhóm thu nhập trên $150K chỉ chiếm 1.94%, là nhóm nhỏ nhất.

2.4.2 Trực quan hóa dữ liệu

# Đặt thứ tự theo mức thu nhập tăng dần
categorical_data$AnnualIncome <- factor(
  categorical_data$AnnualIncome,
  levels = c(
    "$10K - $30K", 
    "$30K - $50K", 
    "$50K - $70K", 
    "$70K - $90K", 
    "$90K - $110K", 
    "$110K - $130K", 
    "$130K - $150K", 
    "$150K +"
  ),
  ordered = TRUE
)
ggplot(categorical_data, aes(x = AnnualIncome)) +
  geom_bar(fill = "steelblue") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, size = 3.5) +  # Hiện số lượng trên đầu cột
  labs(title = "Phân bố khách hàng theo thu nhập hằng năm",
       x = "Thu nhập hằng năm",
       y = "Tần số (Số lượng)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

Biểu đồ phân bố khách hàng theo thu nhập hàng năm cho thấy nhóm có thu nhập từ $30K - $50K chiếm số lượng đông đảo nhất với 4601 khách hàng. Số lượng khách hàng giảm dần ở các mức thu nhập cao hơn, và thấp nhất là nhóm thu nhập trên $150K với chỉ 273 khách hàng. Điều này chỉ ra rằng phần lớn khách hàng trong tập dữ liệu thuộc phân khúc thu nhập trung bình.

ggplot(categorical_data %>% 
         count(AnnualIncome) %>% 
         arrange(AnnualIncome) %>% 
         mutate(Percent = n / sum(n) * 100,
                Label = paste0(round(Percent, 2), "%")),
       aes(x = "", y = n, fill = AnnualIncome)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 2, color = "red") +
  labs(title = "Biểu đồ tròn phân bố khách hàng theo thu nhập hằng năm") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5))

Biểu đồ tròn phân bố khách hàng theo thu nhập hàng năm cho thấy nhóm thu nhập từ $30K - $50K chiếm tỷ lệ lớn nhất với 32.73%. Nhóm $10K - $30K đứng thứ hai với 21.98%. Các nhóm thu nhập cao hơn chiếm tỷ lệ nhỏ dần, với nhóm $150K+ là thấp nhất, chỉ 1.94%. Điều này khẳng định phần lớn khách hàng thuộc phân khúc thu nhập trung bình và thấp.

2.4.3 Nhận xét cho biến AnnualIncome

Phân bố tỷ lệ phần trăm khách hàng theo mức thu nhập cho thấy phần lớn khách hàng tập trung ở nhóm thu nhập trung bình. Cụ thể, nhóm từ $30K - $50K chiếm tỷ lệ cao nhất với 32.73%, cho thấy đây là phân khúc khách hàng chủ đạo. Nhóm thu nhập thấp từ $10K - $30K chiếm 21.98%, đứng thứ hai về tỷ trọng, phản ánh một bộ phận khách hàng có thu nhập hạn chế nhưng vẫn đáng kể. Nhóm thu nhập trung bình khá từ $50K - $70K chiếm 16.86%, và nhóm từ $70K - $90K chiếm 12.16%. Tỷ lệ khách hàng bắt đầu giảm dần ở các nhóm thu nhập cao hơn: $90K - $110K (4.36%), $110K - $130K (4.57%), và $130K - $150K (5.41%). Đáng chú ý, nhóm thu nhập trên $150K chỉ chiếm 1.94%, là nhóm có tỷ lệ thấp nhất. Điều này cho thấy cơ sở khách hàng hiện tại có xu hướng nghiêng về các nhóm thu nhập trung bình và trung bình thấp, trong khi các nhóm thu nhập cao chiếm tỷ lệ rất nhỏ.

2.5 Phân tích mô tả biến City

2.5.1 Thống kê tần suất cho biến

print(freg_city <- table(categorical_data$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

Số lượng khách hàng theo từng thành phố được ghi nhận như sau:

  • Acapulco: 383 khách hàng.

  • Bellingham: 143 khách hàng.

  • Beverly Hills: 811 khách hàng.

  • Bremerton: 834 khách hàng.

  • Camacho: 452 khách hàng.

  • Guadalajara: 75 khách hàng.

  • Hidalgo: 845 khách hàng.

  • Los Angeles: 926 khách hàng.

  • Merida: 654 khách hàng.

  • Mexico City: 194 khách hàng.

  • Orizaba: 464 khách hàng.

  • Portland: 876 khách hàng.

  • Salem: 138 khách hàng.

  • San Andres: 1,386 khách hàng.

  • San Diego: 866 khách hàng.

  • San Francisco: 130 khách hàng.

  • Seattle: 922 khách hàng.

  • Spokane: 875 khách hàng.

  • Tacoma: 1,257 khách hàng.

  • Vancouver: 633 khách hàng.

  • Victoria: 176 khách hàng.

  • Walla Walla: 160 khách hàng.

  • Yakima: 376 khách hàng.

print(percent_City <- prop.table(table(categorical_data$City))*100)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##     2.7242336     1.0171420     5.7685468     5.9321431     3.2150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##     0.5334661     6.0103848     6.5865282     4.6518245     1.3798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##     3.3003770     6.2308841     9.8584537     4.4170994     6.1597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##     0.9246746     6.5580767     6.2237712     8.9408920     4.5024539 
##      Victoria   Walla Walla        Yakima 
##     1.2518671     1.1380610     2.6744434

Tương đương tỷ lệ phần trăm khách hàng theo từng thành phố:

  • Acapulco: 2.72%

  • Bellingham: 1.02%

  • Beverly Hills: 5.77%

  • Bremerton: 5.93%

  • Camacho: 3.22%

  • Guadalajara: 0.53%

  • Hidalgo: 6.01%

  • Los Angeles: 6.59%

  • Merida: 4.65%

  • Mexico City: 1.38%

  • Orizaba: 3.30%

  • Portland: 6.23%

  • Salem: 9.86%

  • San Andres: 4.42%

  • San Diego: 6.16%

  • San Francisco: 0.92%

  • Seattle: 6.56%

  • Spokane: 6.22%

  • Tacoma: 8.94%

  • Vancouver: 4.50%

  • Victoria: 1.25%

  • Walla Walla: 1.14%

  • Yakima: 2.67%

2.5.2 Trực quan hóa dữ liệu

ggplot(categorical_data, aes(x = reorder(City, City, function(x) -length(x)))) +
  geom_bar(fill = "blue") +
  geom_text(stat = "count", aes(label = ..count..), hjust = -0.2, size = 3) +
  coord_flip() +
  labs(title = "Số lượng khách hàng theo thành phố",
       x = "Thành phố",
       y = "Số lượng") +
  theme_minimal()

Biểu đồ số lượng khách hàng theo thành phố cho thấy sự phân bố không đồng đều về số lượng khách hàng giữa các thành phố. Salem là thành phố có số lượng khách hàng đông nhất với 1386 người, tiếp theo là Tacoma với 1257 người. Ngược lại, Guadalajara có số lượng khách hàng thấp nhất với chỉ 75 người. Điều này cho thấy có một số thành phố là thị trường trọng điểm với số lượng khách hàng lớn, trong khi một số khác lại có số lượng khách hàng rất khiêm tốn.

2.5.3 Nhận xét cho biến City

Phân bố khách hàng theo thành phố cho thấy sự tập trung lớn ở các thành phố như San Andres (1,386 khách), Tacoma (1,257 khách) và Los Angeles (926 khách). Các thành phố như Seattle, Portland, Spokane và San Diego cũng có số lượng khách hàng cao, thể hiện tiềm năng thị trường lớn.

Trong khi đó, một số thành phố như Guadalajara, San Francisco, Salem và Victoria có lượng khách hàng thấp, cho thấy mức độ phát triển thị trường còn hạn chế tại đây. Tổng thể, khách hàng tập trung chủ yếu ở các trung tâm lớn, giúp định hướng chiến lược phân bổ nguồn lực hiệu quả hơn.

2.6 Phân tích mô tả biến StateorProvince

2.6.1 Thống kê tần suất cho biến

print(freg_StateorProvince <- table(categorical_data$StateorProvince))
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297

Thống kê về số lượng khách hàng theo từng bang như sau:

  • British Columbia (BC): 809 khách hàng.

  • California (CA): 2,733 khách hàng.

  • Distrito Federal (DF - Mexico City): 815 khách hàng.

  • Guerrero: 383 khách hàng.

  • Jalisco: 75 khách hàng.

  • Oregon (OR): 2,262 khách hàng.

  • Veracruz: 464 khách hàng.

  • Washington (WA): 4,567 khách hàng – là bang có số lượng khách hàng cao nhất.

  • Yucatán: 654 khách hàng.

  • Zacatecas: 1,297 khách hàng.

print(freg_StateorProvince <- prop.table(table(categorical_data$StateorProvince))*100)
## 
##         BC         CA         DF   Guerrero    Jalisco         OR   Veracruz 
##  5.7543211 19.4395049  5.7969984  2.7242336  0.5334661 16.0893378  3.3003770 
##         WA    Yucatan  Zacatecas 
## 32.4845295  4.6518245  9.2254072

Tần suất khách hàng theo từng bang, được liệt kê rõ ràng:

  • British Columbia (BC): 5.75%

  • California (CA): 19.44%

  • Distrito Federal (DF - Mexico City): 5.80%

  • Guerrero: 2.72%

  • Jalisco: 0.53%

  • Oregon (OR): 16.09%

  • Veracruz: 3.30%

  • Washington (WA): 32.48%

  • Yucatán: 4.65%

  • Zacatecas: 9.23%

2.6.2 Trực quan hóa dữ liệu

categorical_data %>%
  count(StateorProvince) %>%
  ggplot(aes(x = reorder(StateorProvince, -n), y = n, fill = StateorProvince)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), vjust = -0.5, size = 3) +
  labs(title = "Biểu đồ tần số khách hàng theo bang/tỉnh",
       x = "Bang / Tỉnh",
       y = "Số lượng khách hàng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Biểu đồ cho thấy sự phân bố khách hàng theo bang/tỉnh. WA dẫn đầu với 4567 khách hàng, theo sau là CA (2733) và OR (2262), cho thấy ba bang này là thị trường chính. Các khu vực còn lại có số lượng khách hàng thấp hơn đáng kể, đặc biệt là Jalisco chỉ có 75 khách hàng.

categorical_data %>%
  count(StateorProvince) %>%
  mutate(Percent = n / sum(n) * 100,
         Label = paste0(round(Percent, 2), "%")) %>%
  ggplot(aes(x = "", y = Percent, fill = StateorProvince)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label),
            position = position_stack(vjust = 0.5),
            size = 2, color = "black") +
  labs(title = "Biểu đồ tròn thể hiện tần suất khách hàng theo bang/tỉnh") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5))

Biểu đồ tròn này minh họa tỷ lệ phần trăm khách hàng ở mỗi bang/tỉnh. WA chiếm tỷ trọng lớn nhất với 32.48%, khẳng định đây là thị trường khách hàng chính. Kế đến là CA với 19.44% và OR với 16.08%, cùng với WA tạo thành ba khu vực có lượng khách hàng đáng kể nhất. Các bang/tỉnh khác như Zacatecas (9.23%), BC (5.75%), DF (5.8%), Yucatan (4.65%), Veracruz (3.3%), Guerrero (2.72%) và Jalisco (0.53%) có tỷ lệ nhỏ hơn nhiều, đặc biệt Jalisco có phần trăm khách hàng thấp nhất. Điều này cho thấy sự tập trung cao độ của khách hàng ở một số bang/tỉnh nhất định, với WA nổi bật nhất.

2.6.3 Nhận xét cho biến StateorProvince

Biến StateorProvince là một biến phân loại (categorical variable), dùng để ghi nhận bang hoặc tỉnh nơi khách hàng đang sinh sống. Phân bố tần suất cho thấy sự chênh lệch rõ rệt giữa các khu vực. Bang Washington (WA) chiếm tỷ lệ cao nhất với 32.48% tổng số khách hàng, tiếp theo là California (CA) (19.44%) và Oregon (OR) (16.09%). Một số bang khác có tỷ lệ khách hàng đáng kể như Zacatecas (9.23%) và British Columbia (BC) (5.75%). Trong khi đó, các khu vực như Jalisco (0.53%) và Guerrero (2.72%) có tỷ lệ khách hàng rất thấp. Điều này phản ánh sự tập trung dân cư và hoạt động kinh doanh chủ yếu tại các bang ven biển hoặc có dân số cao.

2.7 Phân tích mô tả biến Country

2.7.1 Thống kê tần suất cho biến

print(freg_Country <- table(categorical_data$Country))
## 
## Canada Mexico    USA 
##    809   3688   9562

Phân bố cho thấy phần lớn khách hàng thuộc Hoa Kỳ (USA) với 9,562 người, chiếm tỷ lệ áp đảo so với hai quốc gia còn lại. Tiếp theo là Mexico với 3,688 khách hàng, và Canada có số lượng thấp nhất với 809 khách hàng.

print(freg_Country <- prop.table(table(categorical_data$Country))*100)
## 
##    Canada    Mexico       USA 
##  5.754321 26.232307 68.013372

Khách hàng tại Hoa Kỳ (USA) chiếm tỷ lệ lớn nhất, khoảng 68.01% tổng số khách hàng. Tiếp theo là Mexico với khoảng 26.23%, còn lại Canada chiếm khoảng 5.75%.

2.7.2 Trực quan hóa dữ liệu

categorical_data %>%
  count(Country) %>%
  ggplot(aes(x = Country, y = n, fill = Country)) +
  geom_col(color = "black") +
  labs(title = "Biểu đồ cột tần số khách hàng theo quốc gia",
       x = "Quốc gia",
       y = "Số lượng khách hàng") +
  theme_minimal() +
  theme(legend.position = "none")

Biểu đồ cho thấy USA có số lượng khách hàng lớn nhất (gần 10.000), theo sau là Mexico (khoảng 3.500), và Canada ít nhất (khoảng 1.000). USA là thị trường chính.

categorical_data %>%
  count(Country) %>%
  mutate(Percent = n / sum(n) * 100,
         Label = paste0(round(Percent, 2), "%")) %>%
  ggplot(aes(x = "", y = Percent, fill = Country)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label),
            position = position_stack(vjust = 0.5),
            size =3 , color = "black") +
  labs(title = "Biểu đồ tròn tần suất khách hàng theo quốc gia") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5))

Biểu đồ tròn này thể hiện tỷ lệ phần trăm khách hàng ở ba quốc gia. USA chiếm phần lớn nhất với 68.01% tổng số khách hàng. Mexico đứng thứ hai với 26.23%, và Canada có tỷ lệ nhỏ nhất là 5.75%. Điều này khẳng định USA là thị trường khách hàng chủ lực, chiếm ưu thế tuyệt đối, trong khi Mexico là thị trường quan trọng thứ hai và Canada chỉ đóng góp một phần nhỏ.

2.7.3 Nhận xét cho biến Country

Biến Country ghi nhận quốc gia nơi khách hàng sinh sống, với sự phân bố không đồng đều. Phần lớn khách hàng đến từ Hoa Kỳ (USA), chiếm khoảng 68.01% tổng số, cho thấy đây là thị trường chính. Mexico chiếm tỷ lệ đáng kể với khoảng 26.23%, trong khi Canada chiếm phần nhỏ nhất, khoảng 5.75%. Điều này phản ánh sự tập trung chủ yếu của khách hàng ở khu vực Bắc Mỹ, đặc biệt là tại Hoa Kỳ và Mexico.

2.8 Phân tích mô tả biến ProductFamily

2.8.1 Thống kê tần suất cho biến

print(freg_ProductFamily <- table(categorical_data$ProductFamily))
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656

Nhóm sản phẩm bao gồm ba nhóm chính: Food, Non-Consumable, và Drink. Trong đó, nhóm Food chiếm số lượng lớn nhất với 10,153 sản phẩm, tiếp theo là nhóm Non-Consumable với 2,656 sản phẩm, và nhóm Drink có số lượng ít nhất với 1,250 sản phẩm.

print(freg_ProductFamily <- prop.table(table(categorical_data$ProductFamily))*100)
## 
##          Drink           Food Non-Consumable 
##       8.891102      72.217085      18.891813

Nhóm sản phẩm chủ yếu là Food, chiếm khoảng 72.22% tổng số, tiếp theo là nhóm Non-Consumable với gần 18.89%, và nhóm Drink chiếm tỷ lệ nhỏ nhất, khoảng 8.89%.

2.8.2 Trực quan hóa dữ liệu

categorical_data %>%
  count(ProductFamily) %>%
  ggplot(aes(x = ProductFamily, y = n, fill = ProductFamily)) +
  geom_col(color = "black") +
  labs(title = "Biểu đồ cột tần số nhóm sản phẩm",
       x = "Nhóm sản phẩm",
       y = "Số lượng") +
  theme_minimal() +
  theme(legend.position = "none")

Biểu đồ cho thấy nhóm sản phẩm “Food” có tần số cao nhất (khoảng 10.000), theo sau là “Non-Consumable” (khoảng 2.500) và “Drink” thấp nhất (khoảng 1.200). “Food” là nhóm sản phẩm chiếm ưu thế.

categorical_data %>%
  count(ProductFamily) %>%
  mutate(Percent = n / sum(n) * 100,
         Label = paste0(round(Percent, 2), "%")) %>%
  ggplot(aes(x = "", y = Percent, fill = ProductFamily)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = Label),
            position = position_stack(vjust = 0.5),
            size = 3, color = "black") +
  labs(title = "Biểu đồ tròn tần suất theo danh mục sản phẩm (ProductFamily)") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5))

Biểu đồ tròn này thể hiện tỷ lệ phần trăm của từng danh mục sản phẩm. “Food” chiếm tỷ trọng lớn nhất với 72.22%, khẳng định đây là danh mục sản phẩm chủ lực. “Non-Consumable” đứng thứ hai với 18.89%, và “Drink” có tỷ lệ nhỏ nhất là 8.89%. Điều này cho thấy sự tập trung cao độ của sản phẩm vào danh mục “Food”, trong khi “Non-Consumable” và “Drink” chiếm tỷ lệ nhỏ hơn nhiều.

2.8.3 Nhận xét cho biến ProductFamily

Biến ProductFamily ghi nhận các nhóm sản phẩm mà khách hàng lựa chọn. Trong tổng số sản phẩm, nhóm Food chiếm tỷ lệ lớn nhất với khoảng 72.22%, tương ứng với 10,153 sản phẩm. Nhóm Non-Consumable chiếm khoảng 18.89% với 2,656 sản phẩm, trong khi nhóm Drink chỉ chiếm khoảng 8.89% với 1,250 sản phẩm. Sự phân bố này cho thấy khách hàng ưu tiên mua các sản phẩm thực phẩm nhiều hơn, trong khi các nhóm sản phẩm đồ uống và hàng không tiêu thụ chiếm tỷ lệ nhỏ hơn đáng kể. Việc này giúp doanh nghiệp hiểu rõ nhu cầu chính của khách hàng để tập trung phát triển các nhóm sản phẩm chiến lược.

2.9 Phân tích mô tả biến ProductDepartment

2.9.1 Thống kê tần suất cho biến

print(freg_ProductDepartment <- table(categorical_data$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

Tần số cho biến nhóm sản phẩm chi tiết:

  • Nhóm Produce chiếm số lượng lớn nhất với 1,994 sản phẩm.

  • Nhóm Frozen Foods đứng thứ hai với 1,382 sản phẩm.

  • Household cũng có số lượng cao với 1,420 sản phẩm.

  • Nhóm Snack Foods và Canned Foods lần lượt có 1,600 và 977 sản phẩm.

  • Các nhóm Baking Goods (1,072), Beverages (680), và Deli (699) cũng chiếm tỷ lệ đáng kể.

  • Nhóm Health and Hygiene có 893 sản phẩm, cho thấy mặt hàng này cũng được chú ý.

  • Nhóm Dairy với 903 sản phẩm và Breakfast Foods với 188 sản phẩm.

  • Nhóm Alcoholic Beverages tương đối ít với 356 sản phẩm.

  • Các nhóm còn lại như Meat (89), Eggs (198), Seafood (102), Carousel (59), Checkout (82) chiếm tỷ lệ nhỏ hơn.

  • Các nhóm như Periodicals (202), Starchy Foods (277), Snacks (352) cũng có mặt nhưng số lượng không nhiều.

print(freg_ProductDepartment <- prop.table(table(categorical_data$ProductDepartment))*100)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##           2.5321858           3.0229746           7.6250089           4.8367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##           1.3372217           6.9492852           0.7753041           0.4196600 
##            Checkout               Dairy                Deli                Eggs 
##           0.5832563           6.4229319           4.9719041           1.4083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##           9.8300021           6.3518031          10.1002916           0.6330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##           1.4368020          14.1830856           0.7255139          11.3806103 
##              Snacks       Starchy Foods 
##           2.5037343           1.9702682

Về tần suất (phần trăm) theo nhóm sản phẩm:

  • Produce: 14.18%

  • Snack Foods: 11.38%

  • Household: 10.10%

  • Frozen Foods: 9.83%

  • Baking Goods: 7.63%

  • Canned Foods: 6.95%

  • Dairy: 6.42%

  • Health and Hygiene: 6.35%

  • Beverages: 4.84%

  • Deli: 4.97%

  • Baked Goods: 3.02%

  • Alcoholic Beverages: 2.53%

  • Snacks: 2.50%

  • Starchy Foods: 1.97%

  • Breakfast Foods: 1.34%

  • Periodicals: 1.44%

  • Canned Products: 0.78%

  • Meat: 0.63%

  • Seafood: 0.73%

  • Checkout: 0.58%

  • Carousel: 0.42%

2.9.2 Trực quan hóa dữ liệu

categorical_data %>%
  count(ProductDepartment) %>%
  ggplot(aes(x = reorder(ProductDepartment, n), y = n, fill = ProductDepartment)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), 
            hjust = -0.1, size = 2.5) +
  coord_flip() +
  labs(title = "Biểu đồ cột tần số theo ProductDepartment",
       x = "Product Department",
       y = "Số lượng") +
  theme_minimal()

Biểu đồ cột ngang này thể hiện tần số sản phẩm theo từng phòng ban (Product Department). “Produce” có số lượng cao nhất với 1994, tiếp theo là “Snack Foods” (1600) và “Household” (1420). Các phòng ban như “Frozen Foods”, “Baking Goods”, “Canned Foods”, “Dairy”, “Health and Hygiene”, “Deli”, và “Beverages” có số lượng từ khoảng 680 đến 1382. Các phòng ban còn lại có số lượng sản phẩm thấp hơn đáng kể, với “Carousel” có số lượng ít nhất là 59. Điều này cho thấy sự tập trung sản phẩm chủ yếu ở một vài phòng ban hàng đầu.

2.9.3 Nhận xét cho biến ProductDepartment

Biến ProductDepartment ghi nhận sự phân bố đa dạng về số lượng khách hàng trong từng nhóm sản phẩm. Một số nhóm có số lượng khách hàng lớn, ví dụ như nhóm Produce với khoảng 1,994 khách hàng, Snack Foods với 1,600 khách hàng, và Household với 1,420 khách hàng, cho thấy đây là những nhóm sản phẩm được nhiều khách hàng lựa chọn và có nhu cầu cao. Ngoài ra, các nhóm như Frozen Foods (1,382 khách hàng), Baking Goods (1,072 khách hàng), và Canned Foods (977 khách hàng) cũng có sự hiện diện đáng kể, phản ánh sự đa dạng trong thói quen tiêu dùng. Một số nhóm sản phẩm khác như Alcoholic Beverages (356 khách hàng) hay Seafood (102 khách hàng) có số lượng khách hàng thấp hơn, có thể là các mặt hàng đặc thù hoặc ít phổ biến hơn trong danh mục. Tổng thể, dữ liệu cho thấy khách hàng tập trung chủ yếu vào các nhóm sản phẩm thiết yếu và phổ biến, đồng thời cũng có sự phân bố hợp lý với các nhóm sản phẩm đặc trưng, phản ánh xu hướng tiêu dùng đa dạng và rõ ràng trong danh mục sản phẩm.

2.10 Phân tích mô tả biến ProductCategory

2.10.1 Thống kê tần suất cho biến

print(freg_ProductCategory <- table(categorical_data$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

Thống kê về tần số của biến này như sau:

  • Vegetables: 1,728 khách hàng

  • Snack Foods: 1,600 khách hàng

  • Dairy: 903 khách hàng

  • Fruit: 765 khách hàng

  • Meat: 761 khách hàng

  • Jams and Jellies: 588 khách hàng

  • Baking Goods: 484 khách hàng

  • Bread: 425 khách hàng

  • Breakfast Foods: 417 khách hàng

  • Canned Soup: 404 khách hàng

  • Electrical: 355 khách hàng

  • Beer and Wine: 356 khách hàng

  • Candy: 352 khách hàng

  • Frozen Desserts: 323 khách hàng

  • Specialty: 289 khách hàng

  • Paper Products: 345 khách hàng

  • Kitchen Products: 217 khách hàng

  • Eggs: 198 khách hàng

  • Hygiene: 197 khách hàng

  • Magazines: 202 khách hàng

  • Pizza: 194 khách hàng

  • Frozen Entrees: 118 khách hàng

  • Hardware: 129 khách hàng

  • Plastic Products: 141 khách hàng

  • Carbonated Beverages: 154 khách hàng

  • Pure Juice Beverages: 165 khách hàng

  • Side Dishes: 153 khách hàng

  • Cleaning Supplies: 189 khách hàng

  • Pain Relievers: 192 khách hàng

  • Bathroom Products: 365 khách hàng

  • Drinks: 135 khách hàng

  • Canned Anchovies: 44 khách hàng

  • Canned Oysters: 35 khách hàng

  • Canned Clams: 53 khách hàng

  • Canned Sardines: 40 khách hàng

  • Canned Shrimp: 38 khách hàng

  • Candles: 45 khách hàng

  • Cold Remedies: 93 khách hàng

  • Decongestants: 85 khách hàng

  • Miscellaneous: 42 khách hàng

print(freg_ProductCategory <- prop.table(table(categorical_data$ProductCategory))*100)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##            3.4426346            2.5962017            2.5321858 
##                Bread      Breakfast Foods              Candles 
##            3.0229746            2.9660716            0.3200797 
##                Candy     Canned Anchovies         Canned Clams 
##            2.5037343            0.3129668            0.3769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##            0.2489508            0.2845153            0.2702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##            2.8736041            0.6188207            1.0953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##            1.3443346            0.6614980            6.4229319 
##        Decongestants               Drinks                 Eggs 
##            0.6045949            0.9602390            1.4083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##            2.5250729            2.2974607            0.8393200 
##                Fruit             Hardware        Hot Beverages 
##            5.4413543            0.9175617            1.6075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##            1.4012376            4.1823743            1.5434953 
##            Magazines                 Meat        Miscellaneous 
##            1.4368020            5.4129028            0.2987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##            0.3414183            1.3656732            2.4539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##            1.3798990            1.0029163            1.1736254 
##              Seafood          Side Dishes          Snack Foods 
##            0.7255139            1.0882709           11.3806103 
##            Specialty        Starchy Foods           Vegetables 
##            2.0556227            1.9702682           12.2910591

Biến ProductCategory theo tần suất (%) như sau:

  • Vegetables chiếm 12.29% tổng số sản phẩm.

  • Snack Foods chiếm 11.38%.

  • Dairy chiếm 6.42%.

  • Fruit chiếm 5.44%.

  • Meat chiếm 5.41%.

  • Jams and Jellies chiếm 4.18%.

  • Baking Goods chiếm 3.44%.

  • Bread chiếm 3.02%.

  • Breakfast Foods chiếm 2.97%.

  • Canned Soup chiếm 2.87%.

  • Beer and Wine chiếm 2.53%.

  • Candy chiếm 2.50%.

  • Frozen Desserts chiếm 2.30%.

  • Specialty chiếm 2.06%.

  • Bathroom Products chiếm 2.60%.

  • Electrical chiếm 2.53%.

  • Paper Products chiếm 2.45%.

  • Kitchen Products chiếm 1.54%.

  • Hygiene chiếm 1.40%.

  • Cleaning Supplies chiếm 1.34%.

  • Hot Beverages chiếm 1.61%.

  • Magazines chiếm 1.44%.

  • Pain Relievers chiếm 1.37%.

  • Pizza chiếm 1.38%.

  • Frozen Entrees chiếm 0.84%.

  • Plastic Products chiếm 1.00%.

  • Hardware chiếm 0.92%.

  • Carbonated Beverages chiếm 1.10%.

  • Pure Juice Beverages chiếm 1.17%.

  • Side Dishes chiếm 1.09%.

  • Eggs chiếm 1.41%.

  • Drinks chiếm 0.96%.

  • Cold Remedies chiếm 0.66%.

  • Decongestants chiếm 0.60%.

  • Miscellaneous chiếm 0.30%.

  • Packaged Vegetables chiếm 0.34%.

  • Canned Clams chiếm 0.38%.

  • Canned Tuna chiếm 0.62%.

  • Canned Anchovies chiếm 0.31%.

  • Canned Oysters chiếm 0.25%.

  • Canned Sardines chiếm 0.28%.

  • Canned Shrimp chiếm 0.27%.

  • Candles chiếm 0.32%.

2.10.2 Trực quan hóa dữ liệu

categorical_data %>%
  count(ProductCategory) %>%
  ggplot(aes(x = reorder(ProductCategory, n), y = n, fill = ProductCategory)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), 
            hjust = -0.1, size = 2.5) +
  coord_flip() +
  labs(title = "Biểu đồ cột tần số theo ProductCategory",
       x = "Product Category",
       y = "Số lượng") +
  theme_minimal()

Biểu đồ tần số theo danh mục sản phẩm cho thấy “Vegetables” dẫn đầu với 1728 sản phẩm, theo sau là “Snack Foods” (1600) và “Dairy” (903). Nhiều danh mục khác có số lượng thấp hơn, đặc biệt các danh mục cuối bảng như “Canned Oysters” chỉ có 35 sản phẩm. Điều này chỉ ra sự phân bổ sản phẩm không đồng đều, tập trung mạnh vào một số danh mục chính.

2.10.3 Nhận xét cho biến ProductCategory

Biến ProductCategory ghi nhận phân loại các nhóm sản phẩm trong dữ liệu bán hàng, phản ánh sự đa dạng về các loại hàng hóa từ thực phẩm tươi sống, thực phẩm đóng gói đến các sản phẩm gia dụng và chăm sóc cá nhân. Nhóm Vegetables chiếm tỷ lệ lớn nhất với 12.29%, cho thấy rau củ là mặt hàng phổ biến nhất. Tiếp theo là các nhóm Snack Foods với 11.38% và Dairy chiếm 6.42%, thể hiện nhu cầu cao về đồ ăn nhẹ và sản phẩm từ sữa. Ngoài ra, các nhóm như Fruit 5.44%), Meat (5.41%) và Jams and Jellies (4.18%) cũng đóng góp đáng kể vào tổng thể danh mục sản phẩm. Các loại thực phẩm như Baking Goods, Bread, và Breakfast Foods chiếm tỷ lệ từ khoảng 2% đến 3%, cho thấy sự đa dạng của các loại thực phẩm được tiêu thụ. Những sản phẩm đóng hộp như Canned Soup, Canned Tuna, cùng với đồ uống như Beer and Wine, Hot Beverages cũng xuất hiện với tỷ lệ nhỏ hơn nhưng không kém phần quan trọng. Các nhóm hàng hóa khác như sản phẩm vệ sinh, gia dụng và phụ kiện chiếm tỷ lệ nhỏ hơn, thể hiện sự phong phú và đa dạng trong danh mục sản phẩm phục vụ khách hàng. Tổng thể, biến này phản ánh sự phân bổ đa dạng với trọng điểm vào nhóm thực phẩm tươi sống và các sản phẩm tiện lợi trong chuỗi cung ứng hàng hóa.

Phần 3: Ước lượng khoảng và kiểm định giả thuyết cho tỷ lệ (Một biến)

3.1 Ước lượng tỷ lệ cho biến Gender về giới tính nữ

3.1.1 Ước lượng khoảng tin cậy

print(prop_female <- prop.test(7170, 14059))
## 
##  1-sample proportions test with continuity correction
## 
## data:  7170 out of 14059, 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

Dựa trên kết quả kiểm định tỷ lệ một mẫu, với p-value = 0.0182 (< 0.05), ta bác bỏ giả thuyết rằng tỷ lệ thực sự bằng 50%. Tỷ lệ ước lượng từ mẫu là khoảng 50.99%, và khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 50.17% đến 51.83%. Điều này cho thấy tỷ lệ thực sự của nhóm có ý nghĩa thống kê khác 50%.

3.1.2 Kiểm định giả thuyết

Đặt giả thuyết về tỷ lệ nữ trung bình là ít nhất 50%, ta có:

  • \(H_0\): Tỷ lệ nữ trung bình ≥ 50% (p ≥ 0.5)

  • \(H_1\): Tỷ lệ nữ trung bình < 50% (p < 0.5)

Đây là kiểm định một phía bên trái (left-tailed test).

prop.test(7170, 14059, p = 0.5, alternative = "less", correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  7170 out of 14059, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.9909
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.5169613
## sample estimates:
##         p 
## 0.5099936

Kết quả của kiểm định này là:

  • Tỷ lệ mẫu ước lượng: p = 0.50999 (~50.99%)

  • Giá trị p-value = 0.9909, lớn hơn mức ý nghĩa thường dùng (α = 0.05)

  • Khoảng tin cậy 95% cho tỷ lệ p: [0.0000, 0.51696]

Kết luận:

Vì p-value = 0.9909 > 0.05, chúng ta không bác bỏ giả thuyết \(H_0\). Điều này có nghĩa là không có đủ bằng chứng thống kê để kết luận rằng tỷ lệ nữ trong tổng thể nhỏ hơn 50%. Nói cách khác, dữ liệu hiện tại ủng hộ giả thuyết rằng tỷ lệ nữ là ít nhất 50%.

3.2. Ước lượng tỷ lệ cho biến Country về đất nước USA

3.2.1 Ước lượng khỏng tin cậy

print(prop_usa <- prop.test(9562, 14059))
## 
##  1-sample proportions test with continuity correction
## 
## data:  9562 out of 14059, null probability 0.5
## X-squared = 1824, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.6723397 0.6878289
## sample estimates:
##         p 
## 0.6801337

Kết quả của ước lượng tỷ lệ cho thấy, trong khoảng tin cậy 95% cho biết tỷ lệ khách hàng đến từ Mỹ là [0.6723; 0.6878].

3.2.2 Kiểm định giả thuyết

Lập giả thuyết kiểm định cho bài toán: “Tỷ lệ khách hàng đến từ USA < 50%”.

Ta có giả thuyết kiểm định như sau:

  • \(H_0\): Tỷ lệ khách hàng đến từu USA trung bình ≥ 50% (p ≥ 0.5)

  • \(H_1\): Tỷ lệ khách hàng đến từu USA trung bình < 50% (p < 0.5)

prop.test(x = 9562, n = 14059, p = 0.5,
          alternative = "less", correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  9562 out of 14059, null probability 0.5
## X-squared = 1824, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.6866043
## sample estimates:
##         p 
## 0.6801337

Với p-value = 1 (rất lớn hơn 0.05), không có đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\). Nghĩa là không thể kết luận rằng tỷ lệ khách hàng đến từu USA nhỏ hơn 50%.

3.3 Ước lượng tỷ lệ cho biến AnnualIncome

Đặt giả định là những khách hàng có thu nhập dưới 90$ là những người có thu nhập hằng năm ở nhóm thấp.

Và tổng số người có thu nhập thấp trong mẫu là 11,770 khách hàng.

print(prop_income<- prop.test(11770, 14059))
## 
##  1-sample proportions test with continuity correction
## 
## data:  11770 out of 14059, null probability 0.5
## X-squared = 6392.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.8309553 0.8432317
## sample estimates:
##         p 
## 0.8371861

Kết quả của ước lượng tỷ lệ là:

  • Ước lượng điểm cho tỷ lệ này là 83.7%.

  • Khoảng tin cậy 95% cho tỷ lệ thực sự của nhóm thu nhập thấp nằm trong khoảng từ 83.1% đến 84.3%.

3.3.2 Kiểm định giả thuyết

Lập giả thuyết: Những người thuộc thu nhập hằng năm thấp có tỷ lệ là 89%.

  • \(H_0\): Tỷ lệ người có thu nhập thấp là 89% (p = 0.89)

  • \(H_1\): Tỷ lệ người có thu nhập thấp khác 89% (p # 0.5)

prop.test(x = 11770, n = 14059, p = 0.89, alternative = "two.sided", correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  11770 out of 14059, null probability 0.89
## X-squared = 400.02, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.89
## 95 percent confidence interval:
##  0.8309553 0.8432317
## sample estimates:
##         p 
## 0.8371861

Kết quả kiểm định cho thấy: giá trị p_value rất nhỏ (< 2.2e-16), nhỏ hơn mức ý nghĩa phổ biến 0.05, nên ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Kết luận rằng tỷ lệ người có thu nhập thấp thực tế (dưới 90K) không phải là 89%.

Phần 4: Phân tích mối quan hệ giữa hai biến định tính (Bivariate Analysis)

4.1 Phân tích mối quan hệ giữa Gender và MaritalStatus

4.1.1. Bảng tần suất chéo

Câu hỏi: Trong số những khách hàng là nữ thì có bao nhiêu người đã kết hôn.

categorical_data %>%
  filter(Gender == "F") %>%
  count(MaritalStatus) %>%
  kable(col.names = c("Tình trạng hôn nhân", "Số lượng"), caption = "Số lượng khách hàng nữ theo tình trạng hôn nhân") %>%
  kable_styling() %>%
  column_spec(1, width = "4cm", border_right = TRUE, bold = TRUE, background = "lightblue", extra_css = "text-align: left;") %>%
  column_spec(2, width = "4cm", border_left = TRUE, bold = TRUE, background = "lightyellow", extra_css = "text-align: center;")
Số lượng khách hàng nữ theo tình trạng hôn nhân
Tình trạng hôn nhân Số lượng
M 3602
S 3568

4.1.2 Trực quan hóa dữ liệu

categorical_data %>%
  filter(Gender == "F") %>%
  count(MaritalStatus) %>%
  ggplot(aes(x = MaritalStatus, y = n, fill = MaritalStatus)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), vjust = -0.5) +
  labs(title = "Số lượng khách hàng nữ theo tình trạng hôn nhân",
       x = "Tình trạng hôn nhân",
       y = "Số lượng") +
  theme_minimal()

4.1.3 Nhận xét mô tả cho dữ liệu

Trong số các khách hàng nữ, có 3,602 người có tình trạng hôn nhân là “M” (có thể hiểu là đã kết hôn hoặc một trạng thái tương ứng) và 3,568 người có tình trạng “S” (chưa kết hôn hoặc trạng thái khác). Số lượng giữa hai nhóm khá cân bằng, cho thấy tỷ lệ khách hàng nữ đã kết hôn và chưa kết hôn trong bộ dữ liệu là tương đương .

4.1.4 Kiểm định thống kê

Giả thuyết:

  • \(H_0\): Hai biến Gender và MaritalStatus là độc lập, tức không có mối liên hệ giữa giới tính và tình trạng hôn nhân.

  • \(H_1\): Hai biến Gender và MaritalStatus không độc lập, tức có mối liên hệ giữa giới tính và tình trạng hôn nhân.

Thực hiện kiểm định

# Tạo bảng tần suất chéo
table_gender_marital <- table(categorical_data$Gender, categorical_data$MaritalStatus)

# Kiểm định Chi-squared
chi_test <- chisq.test(table_gender_marital)

# In kết quả
chi_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_gender_marital
## X-squared = 11.365, df = 1, p-value = 0.0007485

Nhận xét

  • Giá trị thống kê chi bình phương là 11.365 với bậc tự do 1.

  • Giá trị p_value 0.0007485, nhỏ hơn mức ý nghĩa alpha (0,05).

  • Vì p < 0,05 nên bác bỏ giả thuyết \(H_0\). Điều này có nghĩa là có mối liên hệ có ý nghĩa thống kê giữa hai biến Gender và MaritalStatus. Nói cách khác, tình trạng hôn nhân của khách hàng không hoàn toàn độc lập với giới tính.

4.2 Phân tích mối quan hệ giữa MaritalStatus và ProductDepartment

4.2.1 Bảng tần suất chéo

Câu hỏi: Tình trạng hôn nhân có tác động đến việc sử dụng thực phẩm lành mạnh (Health and Hygiene) như thế nào?

categorical_data %>%
  filter(ProductDepartment == "Health and Hygiene") %>% 
  count(MaritalStatus) %>% 
  kable(col.names = c("Tình trạng hôn nhân", "Số lượng"), caption = "Số lượng khách hàng theo tình trạng hôn nhân và quan tâm tới sản phẩm Health and Hygiene") %>%
  kable_styling() %>%
  column_spec(1, width = "4cm", border_right = TRUE, bold = TRUE, background = "lightblue", extra_css = "text-align: left;") %>%
  column_spec(2, width = "4cm", border_left = TRUE, bold = TRUE, background = "lightyellow", extra_css = "text-align: center;")
Số lượng khách hàng theo tình trạng hôn nhân và quan tâm tới sản phẩm Health and Hygiene
Tình trạng hôn nhân Số lượng
M 435
S 458

4.2.2 Trực quan hóa dữ liệu

categorical_data %>%
  filter(ProductDepartment == "Health and Hygiene") %>%
  count(MaritalStatus) %>%
  ggplot(aes(x = MaritalStatus, y = n, fill = MaritalStatus)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = n), vjust = -0.5) +
  labs(title = "Số lượng khách hàng nữ theo tình trạng hôn nhân",
       x = "Tình trạng hôn nhân",
       y = "Số lượng") +
  theme_minimal()

4.2.3 Nhận xét mô tả dữ liệu

Số lượng khách hàng chưa kết hôn quan tâm đến các sản phẩm Health and Hygiene cao hơn một chút so với khách hàng đã kết hôn. Tuy nhiên, sự chênh lệch là không đáng kể (458 so với 435), cho thấy rằng nhu cầu tiêu dùng các sản phẩm chăm sóc sức khỏe và vệ sinh là phổ biến và được quan tâm tương đối đồng đều giữa hai nhóm tình trạng hôn nhân.

4.2.4 Kiểm định thống kê

Giả thuyết:

  • \(H_0\): Tình trạng hôn nhân và sự quan tâm đến sản phẩm Health and Hygiene là độc lập nhau.

  • \(H_1\): Tình trạng hôn nhân và sự quan tâm đến sản phẩm Health and Hygiene là có liên quan.

Thực hiện kiểm định

# Bảng số liệu
interested <- c(435, 458)  # Married, Single
not_interested <- c(3602 - 435, 3568 - 458)  # Total - Interested

# Tạo bảng tần suất chéo
table_interest <- matrix(c(interested, not_interested), 
                         nrow = 2, byrow = FALSE,
                         dimnames = list(
                           MaritalStatus = c("Married", "Single"),
                           Interest = c("Interested", "NotInterested")
                         ))

# Kiểm định Chi-bình phương
chisq.test(table_interest, correct = TRUE)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_interest
## X-squared = 0.88039, df = 1, p-value = 0.3481

Nhận xét

  • Giá trị thống kê chi bình phương là 0.8804 với bậc tự do 1.

  • Giá trị p_value 0.3481, lớn hơn mức ý nghĩa alpha (0,05).

  • Với mức ý nghĩa 5%, p_value = 0.3481 > 0.05, do đó không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Tức là Không có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và mức độ quan tâm đến sản phẩm Health and Hygiene.

4.3 Phân tích mối quan hệ giữa MaritalStatus và Homeowner

4.3.1 Bảng tần suất chéo

Câu hỏi: Trong những người đã có nhà, tình trạng hôn nhân như thế nào?

categorical_data %>%
  filter(Homeowner == "Y") %>%
  count(MaritalStatus) %>%
  rename(`Tình trạng hôn nhân` = MaritalStatus, `Số lượng` = n) %>%
  kable(col.names = c("Tình trạng hôn nhân", "Số lượng"),
        caption = "Số lượng khách hàng đã có nhà theo tình trạng hôn nhân") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, width = "4cm", border_right = TRUE, bold = TRUE,
              background = "lightblue", extra_css = "text-align: left;") %>%
  column_spec(2, width = "4cm", border_left = TRUE, bold = TRUE,
              background = "lightyellow", extra_css = "text-align: center;")
Số lượng khách hàng đã có nhà theo tình trạng hôn nhân
Tình trạng hôn nhân Số lượng
M 5147
S 3297

4.3.2 Trực quan hóa dữ liệu

homeowner_marital <- categorical_data %>%
  filter(Homeowner == "Y") %>%
  count(MaritalStatus) %>%
  rename(Tình_trạng_hôn_nhân = MaritalStatus, Số_lượng = n) %>%
  mutate(tổng = sum(Số_lượng),
         tỉ_trọng = Số_lượng / tổng,
         label_pos = cumsum(tỉ_trọng) - 0.5 * tỉ_trọng)


ggplot(homeowner_marital, aes(x = "", y = Số_lượng, fill = Tình_trạng_hôn_nhân)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(y = label_pos * tổng, label = Số_lượng), color = "black") +
  labs(title = "Tỷ lệ tình trạng hôn nhân trong nhóm đã có nhà",
       fill = "Tình trạng hôn nhân") +
  theme_minimal() +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text = element_blank(),
        panel.grid = element_blank())

4.3.3 Nhận xét mô tả cho dữ liệu

Trong nhóm những người đã có nhà, tình trạng hôn nhân được phân bố như sau: có 5.147 người đã kết hôn (chiếm tỷ lệ lớn hơn), trong khi 3.297 người chưa kết hôn. Điều này cho thấy phần lớn những người sở hữu nhà đều đã kết hôn, phản ánh xu hướng sở hữu nhà gắn liền với tình trạng hôn nhân ổn định hơn.

4.3.4 Kiểm định thống kê

Giả thuyết:

  • \(H_0\): Tình trạng hôn nhân và việc sở hữu nhà là độc lập với nhau.

  • \(H_1\): Tình trạng hôn nhân và việc sở hữu nhà là phụ thuộc nhau.

Thực hiện kiểm định

table_home_marital <- table(categorical_data$Homeowner, categorical_data$MaritalStatus)

chisq.test(table_home_marital)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_home_marital
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

Nhận xét

  • Giá trị thống kê chi bình phương là 1241.2 với bậc tự do 1.

  • Giá trị p_value < 2.2e-16, nhỏ hơn mức ý nghĩa alpha (0,05).

  • Điều này cho thấy chúng ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0\) và kết luận rằng có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và việc sở hữu nhà.

Phần 5: Tổng kết và thảo luận

Tóm tắt những phát hiện chính:

Dựa trên phân tích các biến định tính, những hiểu biết quan trọng về đặc điểm khách hàng và hành vi mua sắm của họ từ dữ liệu bao gồm:

  • Đặc điểm khách hàng:
    • Giới tính và Tình trạng hôn nhân: Phân bố giới tính khá cân bằng (nữ khoảng 51%, nam khoảng 49%), và tỷ lệ này khác biệt có ý nghĩa thống kê so với 50%, dữ liệu ủng hộ tỷ lệ nữ ít nhất 50%. Tình trạng hôn nhân hơi nghiêng về nhóm độc thân (khoảng 51.16%) so với đã kết hôn (khoảng 48.84%). Có mối liên hệ có ý nghĩa thống kê giữa giới tính và tình trạng hôn nhân.
    • Sở hữu nhà: Phần lớn khách hàng đã sở hữu nhà (khoảng 60.06%). Có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và việc sở hữu nhà, với tỷ lệ người sở hữu nhà đã kết hôn cao hơn người chưa kết hôn.
    • Thu nhập: Phần lớn khách hàng tập trung ở nhóm thu nhập trung bình và trung bình thấp, đặc biệt là nhóm $30K - $50K (32.73%) và $10K - $30K (21.98%). Các nhóm thu nhập cao chiếm tỷ lệ nhỏ.
    • Địa lý: Khách hàng chủ yếu đến từ Hoa Kỳ (68.01%), tiếp theo là Mexico (26.23%) và Canada (5.75%). Trong Hoa Kỳ, các bang Washington (32.48%), California (19.44%), và Oregon (16.09%) là những khu vực có lượng khách hàng lớn nhất. Các thành phố lớn như San Andres, Tacoma, Los Angeles có sự tập trung khách hàng cao.
  • Hành vi mua sắm (theo loại sản phẩm):
    • Nhóm sản phẩm chính (ProductFamily): Nhóm Food chiếm tỷ lệ áp đảo (72.22%), cho thấy đây là nhu cầu mua sắm chính của khách hàng. Nhóm Non-Consumable và Drink chiếm tỷ lệ nhỏ hơn đáng kể.
    • Phân ngành sản phẩm (ProductDepartment): Sự phân bố đa dạng, nhưng các nhóm được mua nhiều nhất là Produce (14.18%), Snack Foods (11.38%), Household (10.10%), và Frozen Foods (9.83%). Điều này phản ánh sự tập trung vào các mặt hàng thiết yếu và phổ biến.
    • Danh mục sản phẩm cụ thể (ProductCategory): Vegetables là danh mục phổ biến nhất (12.29%), tiếp theo là Snack Foods (11.38%) và Dairy (6.42%). Các mặt hàng thực phẩm tươi sống và tiện lợi được ưu tiên.
    • Mối quan hệ giữa Tình trạng hôn nhân và quan tâm đến Sức khỏe/Vệ sinh: Dữ liệu cho thấy không có mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và mức độ quan tâm đến sản phẩm Health and Hygiene. Nhu cầu đối với nhóm sản phẩm này tương đối đồng đều giữa hai nhóm đã kết hôn và độc thân.

Hạn chế của phân tích:

  • Phạm vi phân tích biến: Phân tích chỉ tập trung vào các biến định tính. Các biến định lượng quan trọng như Children, UnitsSold, và Revenue chưa được phân tích mô tả sâu, ước lượng khoảng/kiểm định giả thuyết, hoặc phân tích mối quan hệ (ví dụ: mối quan hệ giữa thu nhập và doanh thu, số lượng con và số lượng sản phẩm mua).
  • Phân tích mối quan hệ còn hạn chế: Phần phân tích mối quan hệ giữa hai biến định tính mới chỉ xem xét một vài cặp biến cụ thể (Gender-MaritalStatus, MaritalStatus-ProductDepartment, MaritalStatus-Homeowner). Nhiều mối quan hệ tiềm năng khác giữa các biến định tính chưa được khám phá (ví dụ: Thu nhập và Tình trạng hôn nhân, Vị trí địa lý và Loại sản phẩm mua).
  • Thiếu phân tích thời gian: Biến PurchaseDate có sẵn, nhưng không được sử dụng trong các phân tích mô tả hoặc quan hệ được trình bày trong nguồn. Do đó, không thể xác định xu hướng mua sắm theo thời gian, mùa vụ, hoặc các mẫu hành vi liên quan đến thời điểm giao dịch.
  • Chất lượng dữ liệu: Bài thực hành đề cập việc kiểm tra NA và dữ liệu không có NA. Tuy nhiên, phân tích không đề cập đến việc kiểm tra các vấn đề chất lượng dữ liệu khác như giá trị ngoại lai (outliers) trong biến định lượng (mặc dù không phân tích biến định lượng).
  • Không đề cập đến phân tích khách hàng cá nhân: Mặc dù có biến CustomerID, phân tích tập trung vào tổng thể hoặc các nhóm lớn, không đi sâu vào hành vi của từng khách hàng hoặc phân tích các nhóm khách hàng (segmentation) dựa trên nhiều biến.

Đề xuất (nếu có):

  • Chiến lược Marketing và Nhắm mục tiêu:
    • Tập trung vào nhóm thu nhập trung bình: Vì nhóm $30K-$50K chiếm tỷ lệ cao nhất, các chiến dịch marketing và chương trình khuyến mãi có thể được thiết kế đặc biệt để thu hút và giữ chân nhóm khách hàng này.
    • Phân bổ nguồn lực theo địa lý: Các bang và thành phố có lượng khách hàng lớn (WA, CA, OR; San Andres, Tacoma, Los Angeles) nên được ưu tiên trong các hoạt động kinh doanh, quảng bá, hoặc mở rộng chi nhánh.
    • Tiếp cận nhóm độc thân: Nhóm độc thân chiếm tỷ lệ hơi lớn hơn. Việc hiểu rõ hơn nhu cầu và hành vi của nhóm này (chưa được phân tích sâu trong nguồn) có thể giúp tạo ra các chiến dịch hoặc sản phẩm phù hợp hơn.
  • Phân loại sản phẩm:
    • Ưu tiên nhóm Food: Vì Food là nhóm sản phẩm chính và chiếm phần lớn doanh số, doanh nghiệp nên đảm bảo chất lượng, sự đa dạng và nguồn cung ổn định cho nhóm này, đặc biệt là các danh mục phổ biến như Vegetables, Snack Foods, Dairy.
    • Đánh giá lại các nhóm sản phẩm có số lượng thấp: Các nhóm như Drink, Non-Consumable hoặc các danh mục rất nhỏ như Canned Oysters, Miscellaneous, Candles có thể cần được đánh giá lại về hiệu quả kinh doanh, chiến lược tồn kho hoặc xem xét có nên mở rộng/thu hẹp hay không.
  • Hiểu mối liên hệ giữa MaritalStatus và Homeowner: Phát hiện về mối liên hệ giữa tình trạng hôn nhân và sở hữu nhà có thể hữu ích cho các chiến lược marketing nhắm vào đối tượng khách hàng có gia đình hoặc đang tìm kiếm sự ổn định lâu dài.

Câu hỏi mở/Hướng nghiên cứu tiếp theo:

  • Phân tích sâu biến định lượng: Khám phá mối quan hệ giữa Revenue, UnitsSold, Children với nhau và với các biến định tính. Ví dụ: Mức thu nhập ảnh hưởng như thế nào đến doanh thu và số lượng sản phẩm mua? Số lượng con có liên quan đến loại sản phẩm mua hoặc tổng doanh thu mỗi giao dịch không?
  • Phân tích thời gian: Phân tích xu hướng bán hàng, doanh thu, và hành vi khách hàng theo thời gian (PurchaseDate). Có mùa vụ nào nổi bật? Xu hướng mua sắm thay đổi như thế nào qua các năm?
  • Khám phá thêm mối quan hệ giữa các biến: Phân tích mối liên hệ giữa Thu nhập và Loại sản phẩm mua, Địa lý (Thành phố/Bang/Quốc gia) và Hành vi mua sắm, Giới tính và Loại sản phẩm mua.
  • Phân đoạn khách hàng (Customer Segmentation): Sử dụng nhiều biến định tính và định lượng để nhóm các khách hàng có đặc điểm và hành vi tương đồng lại với nhau, từ đó phát triển chiến lược tiếp cận phù hợp hơn cho từng phân đoạn.
  • Dự đoán: Xây dựng mô hình dự đoán hành vi mua sắm trong tương lai, doanh thu, hoặc khả năng khách hàng thuộc một nhóm nhất định dựa trên các biến có sẵn.
  • Phân tích giỏ hàng (Market Basket Analysis): Xác định các nhóm sản phẩm thường được mua cùng nhau để tối ưu hóa cách bố trí sản phẩm trong cửa hàng hoặc đề xuất sản phẩm.
  • Kiểm tra chất lượng dữ liệu nâng cao: Mặc dù không có NA, cần kiểm tra thêm các vấn đề khác như giá trị không hợp lý hoặc sai sót trong dữ liệu để đảm bảo độ tin cậy cao nhất cho các phân tích phức tạp hơn.