td <- read.csv(file = "C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
str(td)
## '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 ...
head(td, 6)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1 2007-12-18 7223 F S Y 2
## 2 2 2007-12-20 7841 M M Y 5
## 3 3 2007-12-21 8374 F M N 2
## 4 4 2007-12-21 9619 M M Y 3
## 5 5 2007-12-22 1900 F S Y 3
## 6 6 2007-12-22 6696 F M Y 3
## AnnualIncome City StateorProvince Country ProductFamily
## 1 $30K - $50K Los Angeles CA USA Food
## 2 $70K - $90K Los Angeles CA USA Food
## 3 $50K - $70K Bremerton WA USA Food
## 4 $30K - $50K Portland OR USA Food
## 5 $130K - $150K Beverly Hills CA USA Drink
## 6 $10K - $30K Beverly Hills CA USA Food
## ProductDepartment ProductCategory UnitsSold Revenue
## 1 Snack Foods Snack Foods 5 27.38
## 2 Produce Vegetables 5 14.90
## 3 Snack Foods Snack Foods 3 5.52
## 4 Snacks Candy 4 4.44
## 5 Beverages Carbonated Beverages 4 14.00
## 6 Deli Side Dishes 3 4.37
tail(td, 6)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054 2009-12-29 2032 F M N 3
## 14055 14055 2009-12-29 9102 F M Y 2
## 14056 14056 2009-12-29 4822 F M Y 3
## 14057 14057 2009-12-31 250 M S Y 1
## 14058 14058 2009-12-31 6153 F S N 4
## 14059 14059 2009-12-31 3656 M S N 3
## AnnualIncome City StateorProvince Country ProductFamily
## 14054 $10K - $30K Yakima WA USA Non-Consumable
## 14055 $10K - $30K Bremerton WA USA Food
## 14056 $10K - $30K Walla Walla WA USA Food
## 14057 $30K - $50K Portland OR USA Drink
## 14058 $50K - $70K Spokane WA USA Drink
## 14059 $50K - $70K Portland OR USA Non-Consumable
## ProductDepartment ProductCategory UnitsSold Revenue
## 14054 Household Paper Products 5 14.50
## 14055 Baking Goods Baking Goods 3 9.64
## 14056 Frozen Foods Vegetables 3 7.45
## 14057 Beverages Pure Juice Beverages 4 3.24
## 14058 Dairy Dairy 2 4.00
## 14059 Household Electrical 5 25.53
Tổng quan: Tập dữ liệu gồm 14,059 quan sát và 16 biến. Dựa trên kết quả str() của tập dữ liệu, dưới đây là phân loại các biến theo kiểu dữ liệu:
Kiểu int (integer - số nguyên):
X: Chỉ số hoặc ID quan sát (1, 2, 3, …).
CustomerID: Mã định danh khách hàng (7223, 7841, …).
Children: Số con (2, 5, 3, …).
UnitsSold: Số đơn vị bán (5, 3, 4, …).
Kiểu chr (character - chuỗi ký tự):
PurchaseDate: Ngày mua hàng (“2007-12-18”, …).
Gender: Giới tính (“F”, “M”).
MaritalStatus: Tình trạng hôn nhân (“S”, “M”).
Homeowner: Sở hữu nhà (“Y”, “N”).
AnnualIncome: Khoảng thu nhập (“$30K - $50K”, …).
City: Thành phố (“Los Angeles”, “Bremerton”, …).
StateorProvince: Bang/tỉnh (“CA”, “WA”, …).
Country: Quốc gia (“USA”, …).
ProductFamily: Nhóm sản phẩm (“Food”, …).
ProductDepartment: Bộ phận sản phẩm (“Snack Foods”, “Produce”, …).
ProductCategory: Danh mục sản phẩm (“Snack Foods”, “Vegetables”, …).
Kiểu num (numeric - số thực):
qual_cols <- c('Gender', 'MaritalStatus', 'Homeowner', 'AnnualIncome', 'City', 'StateorProvince', 'Country', 'ProductFamily', 'ProductDepartment', 'ProductCategory')
sapply(td[qual_cols], function(x) sum(is.na(x)))
## Gender MaritalStatus Homeowner AnnualIncome
## 0 0 0 0
## City StateorProvince Country ProductFamily
## 0 0 0 0
## ProductDepartment ProductCategory
## 0 0
Kết quả cho thấy không có giá trị thiếu (NA) nào trong các cột định tính của tập dữ liệu.
#kiểm tra các biến định tính có phải là factor hay chưa
for (i in 1:ncol(td)) {
a <- is.factor(td[,i])
cat(colnames(td)[i],":",a,"\n")
}
## X : FALSE
## PurchaseDate : FALSE
## CustomerID : FALSE
## Gender : FALSE
## MaritalStatus : FALSE
## Homeowner : FALSE
## Children : FALSE
## AnnualIncome : FALSE
## City : FALSE
## StateorProvince : FALSE
## Country : FALSE
## ProductFamily : FALSE
## ProductDepartment : FALSE
## ProductCategory : FALSE
## UnitsSold : FALSE
## Revenue : FALSE
# Chuyển về dạng factor
for (i in 1:ncol(td)) {
td[,i] <- as.factor(td[,i])
}
# Kiểm tra lại
for (i in 1:ncol(td)) {
a <- is.factor(td[,i])
cat(colnames(td)[i],":",a,"\n")
}
## X : TRUE
## PurchaseDate : TRUE
## CustomerID : TRUE
## Gender : TRUE
## MaritalStatus : TRUE
## Homeowner : TRUE
## Children : TRUE
## AnnualIncome : TRUE
## City : TRUE
## StateorProvince : TRUE
## Country : TRUE
## ProductFamily : TRUE
## ProductDepartment : TRUE
## ProductCategory : TRUE
## UnitsSold : TRUE
## Revenue : TRUE
Kết quả xử lý dữ liệu
Sau khi kiểm tra kiểu dữ liệu ban đầu, các biến phân loại như Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory đã được chuyển từ kiểu character sang factor. Tổng cộng có 10 biến đã được chuyển đổi thành công.
Tất cả các biến trên đều là biến phân loại (categorical), tức là chỉ gồm một tập giá trị hữu hạn như “Nam”/“Nữ”,“Độc thân”/“Kết hôn”,… hoặc tên các thành phố, nhóm sản phẩm,… Việc chuyển đổi sang kiểu factor hỗ trợ xử lý dữ liệu tốt hơn, giúp R hiểu rõ bản chất của các cột dữ liệu và tiết kiệm được bộ nhớ.
1. Gender(giới tính)
Biến Gender là một biến định tính phân loại nhị phân, phản ánh giới tính của khách hàng trong tập dữ liệu.
library(ggplot2)
# Tạo bảng tần số cho Gender
gender_freq <- table(td$Gender)
gender_df <- as.data.frame(gender_freq)
colnames(gender_df) <- c("Gender", "Count")
# Vẽ biểu đồ cột
ggplot(gender_df, aes(x = Gender, y = Count, fill = Gender)) +
geom_bar(stat = "identity", width = 0.6) +
scale_fill_manual(values = c("lightgreen", "lightpink")) +
labs(title = "Biểu đồ số lượng theo Giới tính", x = "Giới tính", y = "Số lượng") +
theme_minimal()
Phân tích mô tả cho thấy cơ cấu giới tính trong bộ dữ liệu khá đồng đều, với tỷ lệ nữ là 51% và nam chiếm 49%. Sự phân bố gần như tương đương này phản ánh sự cân bằng giới, góp phần nâng cao độ tin cậy của các kết quả phân tích sau này. Nhờ vào việc không có sự thiên lệch đáng kể giữa hai nhóm giới tính, nguy cơ sai lệch do chọn mẫu được giảm thiểu. Đồng thời, sự đồng đều này cũng hỗ trợ tốt cho việc xây dựng và kiểm định các mô hình thống kê có yếu tố phân tích theo giới.
2. MaritalStatus (tình trạng hôn nhân)
Biến MaritalStatus phản ánh trạng thái hôn nhân của người tiêu dùng, với ký hiệu ‘S’ tương ứng với nhóm độc thân và ‘M’ cho nhóm đã lập gia đình. Đây là một biến định tính thuộc dạng phân đôi, thường được khai thác trong các nghiên cứu hành vi để phân biệt sự khác nhau trong thói quen chi tiêu giữa các đối tượng khách hàng. Chẳng hạn, những người chưa kết hôn có xu hướng chi tiêu cho nhu cầu cá nhân, trong khi những người đã kết hôn thường ưu tiên mua sắm cho hộ gia đình hoặc cân nhắc kỹ lưỡng về mặt tài chính. Việc đưa biến này vào quá trình phân tích không chỉ giúp nhận diện rõ hơn đặc điểm nhân khẩu học mà còn hỗ trợ doanh nghiệp trong việc thiết kế chiến lược tiếp thị, dự đoán hành vi và phân chia thị trường mục tiêu một cách chính xác hơn.
library(ggplot2)
# Tạo bảng tần số cho MaritalStatus
marital_freq <- table(td$MaritalStatus)
marital_df <- as.data.frame(marital_freq)
colnames(marital_df) <- c("MaritalStatus", "Count")
# Tính phần trăm và nhãn
marital_df$Percentage <- round(marital_df$Count / sum(marital_df$Count) * 100, 1)
marital_df$Label <- paste0(marital_df$Percentage, "%")
# Vẽ biểu đồ tròn với nhãn %
ggplot(marital_df, aes(x = "", y = Count, fill = MaritalStatus)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = Label),
position = position_stack(vjust = 0.5),
color = "white", size = 4.5) +
scale_fill_manual(values = c("lightblue", "lightcoral")) +
labs(title = "Biểu đồ tròn tình trạng hôn nhân", fill = "Tình trạng") +
theme_void()
Dữ liệu thống kê cho thấy nhóm khách hàng độc thân chiếm tỷ lệ khoảng 51,2%, trong khi nhóm đã kết hôn chiếm 48,8%. Tỷ lệ này cho thấy sự phân bổ giữa hai trạng thái hôn nhân khá cân bằng, phản ánh tính đại diện xã hội tương đối tốt của tập dữ liệu. Việc nhóm độc thân chiếm ưu thế nhẹ có thể là dấu hiệu cho thấy phần lớn khách hàng có xu hướng sống một mình, từ đó gợi mở nhu cầu tiêu dùng thiên về cá nhân hóa và linh hoạt hơn. Thông tin này có thể là cơ sở hữu ích cho việc điều chỉnh chiến lược tiếp thị hoặc thiết kế sản phẩm phù hợp với đặc điểm của nhóm khách hàng chủ đạo.
3. Homeowner
Biến Homeowner thể hiện thông tin về quyền sở hữu nhà ở của khách hàng, trong đó ký hiệu ‘Y’ đại diện cho những người có nhà riêng và ‘N’ dành cho những người chưa sở hữu nhà. Đây là một biến phân loại nhị phân, thường được sử dụng trong phân tích để đánh giá năng lực tài chính hoặc mức độ ổn định kinh tế của đối tượng nghiên cứu. Việc sở hữu nhà không chỉ phản ánh phần nào thu nhập và tài sản tích lũy của khách hàng, mà còn có thể ảnh hưởng đến hành vi chi tiêu cũng như nhu cầu về các sản phẩm và dịch vụ nhất định – đặc biệt trong các lĩnh vực như ngân hàng, bảo hiểm hoặc tiêu dùng bền vững.
library(ggplot2)
# Tạo bảng tần số và phần trăm cho biến Homeowner
home_freq <- table(td$Homeowner)
home_df <- as.data.frame(home_freq)
colnames(home_df) <- c("Homeowner", "Count")
# Tính phần trăm
home_df$Percentage <- round(home_df$Count / sum(home_df$Count) * 100, 1)
home_df$Label <- paste0(home_df$Percentage, "%")
# Vẽ biểu đồ cột với nhãn phần trăm
ggplot(home_df, aes(x = Homeowner, y = Count, fill = Homeowner)) +
geom_bar(stat = "identity", width = 0.6) +
geom_text(aes(label = Label), vjust = -0.5, size = 4.5) +
scale_fill_manual(values = c("blue", "yellow")) +
labs(title = "Biểu đồ thể hiện tình trạng sở hữu nhà",
x = "Sở hữu nhà",
y = "Số lượng") +
theme_minimal()
Tỷ lệ khách hàng sở hữu nhà trong tập dữ liệu đạt 60,1%, cao hơn so với 39,9% còn lại không có nhà ở. Sự phân bố này phản ánh mức độ ổn định tài chính nhất định của phần lớn khách hàng, đồng thời cho thấy sự khác biệt tiềm năng về hành vi tiêu dùng giữa hai nhóm. Trong khi nhóm có nhà có xu hướng hướng đến các lựa chọn đầu tư dài hạn, thì nhóm không sở hữu nhà có thể ưu tiên các giải pháp tiêu dùng linh hoạt hơn. Do đó, đặc điểm này đóng vai trò quan trọng trong việc phân tích nhân khẩu học và hoạch định chiến lược tiếp cận phù hợp.
4. AnnualIncome
Biến AnnualIncome mô tả thu nhập hàng năm của khách hàng, được chia thành các nhóm theo từng khoảng mức tăng dần. Đây là một biến phân loại có thứ tự (ordinal), phản ánh sự khác biệt về khả năng tài chính giữa các nhóm khách hàng. Thứ tự sắp xếp các mức thu nhập cho phép khai thác sâu hơn trong phân tích nhân khẩu học và phân tầng tiêu dùng.
library(knitr)
# Thống kê tần suất
table_income <- table(td$AnnualIncome)
prop_income <- prop.table(table_income) * 100 # Tỷ lệ phần trăm
income_freq <- data.frame(
AnnualIncome = names(table_income),
Frequency = as.vector(table_income),
Percentage = round(as.vector(prop_income), 2)
)
kable(income_freq, col.names = c("Khoảng thu nhập", "Tần suất", "Tỷ lệ (%)"),
caption = "Bảng phân phối thu nhập")
| Khoảng thu nhập | Tần suất | Tỷ lệ (%) |
|---|---|---|
| $10K - $30K | 3090 | 21.98 |
| $110K - $130K | 643 | 4.57 |
| $130K - $150K | 760 | 5.41 |
| $150K + | 273 | 1.94 |
| $30K - $50K | 4601 | 32.73 |
| $50K - $70K | 2370 | 16.86 |
| $70K - $90K | 1709 | 12.16 |
| $90K - $110K | 613 | 4.36 |
library(ggplot2)
# Sắp xếp theo Percentage giảm dần
income_freq <- income_freq[order(income_freq$Percentage, decreasing = TRUE), ]
# Vẽ biểu đồ cột ngang
ggplot(income_freq, aes(x = reorder(AnnualIncome, Percentage), y = Percentage, fill = AnnualIncome)) +
geom_col(width = 0.7, show.legend = FALSE) +
coord_flip() +
labs(title = "Tỷ lệ phần trăm thu nhập hàng năm của khách hàng",
x = "Khoảng thu nhập",
y = "Tỷ lệ (%)") +
scale_fill_brewer(palette = "Set3") +
theme_minimal()
Phân bố thu nhập của khách hàng cho thấy nhóm có số lượng đông đảo nhất thuộc vào khoảng thu nhập từ 30.000 đến 50.000 đô la, với hơn 4.600 cá nhân. Nhóm thu nhập thấp, nằm trong khoảng 10.000 đến 30.000 đô la, cũng chiếm tỷ lệ đáng kể với gần 3.100 khách hàng. Các phân khúc thu nhập trung bình như 50.000 đến 70.000 đô la và 70.000 đến 90.000 đô la lần lượt có khoảng 2.370 và 1.700 khách hàng. Ngược lại, số lượng khách hàng thuộc các nhóm thu nhập cao hơn, từ 90.000 đến trên 150.000 đô la, tương đối khiêm tốn, dao động trong khoảng từ 270 đến 760 cá nhân. Những con số này cho thấy đa phần khách hàng trong bộ dữ liệu tập trung chủ yếu ở các nhóm thu nhập thấp đến trung bình, trong khi nhóm thu nhập cao có quy mô hạn chế hơn đáng kể.
5. City
Biến City trong tập dữ liệu thể hiện địa điểm thành phố nơi giao dịch mua sắm diễn ra. Đây là một biến phân loại (qualitative variable) với các giá trị đa dạng như Los Angeles, Bremerton, Portland, Salem, Tacoma, và nhiều thành phố khác. Biến này hỗ trợ việc phân tích sự phân bố giao dịch theo khu vực địa lý, giúp khám phá hành vi mua sắm theo vùng, nhận diện các thị trường quan trọng hoặc phát hiện xu hướng tiêu dùng theo từng địa phương.
library(knitr)
# Thống kê tần suất
table_city <- table(td$City)
prop_city <- prop.table(table_city) * 100 # Tỷ lệ phần trăm
# Kết hợp thành data frame
city_freq <- data.frame(
City = names(table_city),
Frequency = as.vector(table_city),
Percentage = round(as.vector(prop_city), 2)
)
# Hiển thị bảng rõ ràng bằng kable
kable(city_freq, align = "lrr", caption = "Bảng tần suất và tỷ lệ phần trăm theo thành phố")
| City | Frequency | Percentage |
|---|---|---|
| Acapulco | 383 | 2.72 |
| Bellingham | 143 | 1.02 |
| Beverly Hills | 811 | 5.77 |
| Bremerton | 834 | 5.93 |
| Camacho | 452 | 3.22 |
| Guadalajara | 75 | 0.53 |
| Hidalgo | 845 | 6.01 |
| Los Angeles | 926 | 6.59 |
| Merida | 654 | 4.65 |
| Mexico City | 194 | 1.38 |
| Orizaba | 464 | 3.30 |
| Portland | 876 | 6.23 |
| Salem | 1386 | 9.86 |
| San Andres | 621 | 4.42 |
| San Diego | 866 | 6.16 |
| San Francisco | 130 | 0.92 |
| Seattle | 922 | 6.56 |
| Spokane | 875 | 6.22 |
| Tacoma | 1257 | 8.94 |
| Vancouver | 633 | 4.50 |
| Victoria | 176 | 1.25 |
| Walla Walla | 160 | 1.14 |
| Yakima | 376 | 2.67 |
library(ggplot2)
library(tidyr)
# Chuyển dữ liệu sang định dạng long
city_long <- city_freq %>%
pivot_longer(cols = c(Frequency, Percentage),
names_to = "Metric", values_to = "Value")
# Vẽ biểu đồ với facet
ggplot(city_long, aes(x = reorder(City, -Value), y = Value, fill = Metric)) +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~Metric, scales = "free_y") +
labs(title = "Số lượng và Tỷ lệ phần trăm khách hàng theo Thành phố",
x = "Thành phố", y = "") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
Dữ liệu cho thấy khách hàng phân bố tại nhiều thành phố khác nhau, trong đó một số địa phương nổi bật với số lượng khách hàng lớn. Salem dẫn đầu với 1.386 khách, chiếm khoảng 10% tổng số quan sát. Tiếp theo là Tacoma với 1.257 khách và Seattle với 922 khách, phản ánh sự tập trung khách hàng tại các vùng đô thị này. Ngược lại, các thành phố như Guadalajara (75 khách), San Francisco (130 khách) và Bellingham (143 khách) ghi nhận số lượng khách hàng tương đối thấp, cho thấy sự phân bố không đồng đều trong tập dữ liệu. Một số thành phố khác như Portland (876 khách), Spokane (875 khách) và San Diego (866 khách) có lượng khách hàng gần tương đương, nằm trong nhóm có số lượng cao nhưng không có sự khác biệt đáng kể.Tổng thể, kết quả minh họa xu hướng tập trung khách hàng chủ yếu tại các thành phố lớn hoặc trung tâm kinh tế, trong khi các khu vực nhỏ hơn có mức độ tham gia thị trường thấp hơn.
6.StateorProvince
Biến StateorProvince đại diện cho các khu vực hành chính như bang hoặc tỉnh nơi khách hàng cư trú hoặc thực hiện giao dịch. Bộ giá trị bao gồm nhiều khu vực đa dạng như BC, CA, DF, Guerrero, Jalisco, OR, Veracruz, WA, Yucatan và Zacatecas, phản ánh phạm vi địa lý rộng lớn của dữ liệu. Việc phân tích phân bố khách hàng theo các bang hoặc tỉnh cung cấp cái nhìn sâu sắc về đặc điểm vùng miền và thói quen tiêu dùng, qua đó hỗ trợ doanh nghiệp xây dựng các chiến lược tiếp thị hiệu quả cũng như quản lý kho vận hợp lý. Do đây là biến định danh, phân tích chủ yếu tập trung vào tần suất và tỷ lệ phần trăm của từng khu vực, thay vì sử dụng các thống kê mô tả như trung bình hay độ lệch chuẩn.
# Thống kê tần suất
table_state <- table(td$StateorProvince)
prop_state <- prop.table(table_state) * 100 # Tỷ lệ phần trăm
# Kết hợp thành data frame
state_freq <- data.frame(
StateOrProvince = names(table_state),
Frequency = as.vector(table_state),
Percentage = round(as.vector(prop_state), 2))
print(state_freq)
## StateOrProvince Frequency Percentage
## 1 BC 809 5.75
## 2 CA 2733 19.44
## 3 DF 815 5.80
## 4 Guerrero 383 2.72
## 5 Jalisco 75 0.53
## 6 OR 2262 16.09
## 7 Veracruz 464 3.30
## 8 WA 4567 32.48
## 9 Yucatan 654 4.65
## 10 Zacatecas 1297 9.23
library(ggplot2)
state_long <- state_freq %>%
pivot_longer(cols = c(Frequency, Percentage),
names_to = "Metric", values_to = "Value")
ggplot(state_freq, aes(x = reorder(StateOrProvince, -Frequency), y = Frequency)) +
geom_bar(stat = "identity", fill = "pink") +
labs(title = "Lượng khách hàng đến từ các bang/tỉnh",
x = "State or Province",
y = "Lượng khách hàng ") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Phân bố khách hàng theo bang hoặc tỉnh cho thấy Washington (WA) dẫn đầu với 4.567 khách hàng, tiếp theo là California (CA) với 2.733 và Oregon (OR) với 2.262 khách hàng, thể hiện mức độ tập trung cao tại các khu vực này. Các bang như Zacatecas, British Columbia (BC) và Distrito Federal (DF) cũng ghi nhận số lượng khách hàng đáng kể, lần lượt là 1.297, 809 và 815. Ngược lại, các bang như Jalisco và Guerrero có lượng khách hàng thấp hơn nhiều, chỉ đạt 75 và 383. Như vậy, phân bố khách hàng theo bang/tỉnh không đồng đều, với sự tập trung rõ rệt tại một số khu vực trọng điểm, trong khi các vùng khác có số lượng khách hàng tương đối hạn chế.
7.Country
Biến Country biểu thị quốc gia nơi khách hàng tiến hành giao dịch, bao gồm ba quốc gia chính: Mỹ (USA), Mexico và Canada. Điều này cho thấy phạm vi hoạt động của siêu thị mở rộng trên toàn bộ khu vực Bắc Mỹ.
Về khía cạnh địa lý, dữ liệu phản ánh chiến lược kinh doanh đa quốc gia, tập trung khai thác thị trường tiêu dùng tại ba quốc gia này.
Sự đa dạng quốc gia trong dữ liệu cũng tạo điều kiện phân tích sự khác biệt về thói quen tiêu dùng, doanh thu và các sản phẩm ưa chuộng theo từng vùng lãnh thổ.
# Thống kê tần suất
table_cou <- table(td$Country)
prop_cou <- prop.table(table_cou) * 100 # Tỷ lệ phần trăm
# Kết hợp thành data frame
cou_freq <- data.frame(
cou = names(table_cou),
Frequency = as.vector(table_cou),
Percentage = round(as.vector(prop_cou), 2))
print(cou_freq)
## cou Frequency Percentage
## 1 Canada 809 5.75
## 2 Mexico 3688 26.23
## 3 USA 9562 68.01
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Giả sử cou_freq là bảng gồm 2 cột: Quốc gia (cou) và Tần suất (Frequency)
cou_freq <- cou_freq %>%
mutate(Percentage = round(Frequency / sum(Frequency) * 100, 1),
Label = paste0(cou, " (", Percentage, "%)"))
# Vẽ biểu đồ tròn
ggplot(cou_freq, aes(x = "", y = Frequency, fill = cou)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
labs(title = "Tỷ lệ khách hàng theo quốc gia") +
theme_void() +
theme(legend.title = element_blank()) +
geom_text(aes(label = paste0(Percentage, "%")),
position = position_stack(vjust = 0.5), size = 4)
Biến Country trong bộ dữ liệu chỉ chứa duy nhất giá trị “USA”, cho thấy toàn bộ thông tin đều đến từ khách hàng cư trú tại Hoa Kỳ. Điều này cho thấy phạm vi địa lý của dữ liệu khá hạn chế và không phản ánh được sự đa dạng về quốc gia.
Vì biến này không có sự biến đổi nào khác ngoài “USA”, nó không có giá trị trong việc phân loại hay giải thích trong phân tích mô tả. Do đó, trong các bước phân tích tiếp theo như xây dựng mô hình hồi quy hoặc phân đoạn thị trường, biến Country có thể được loại bỏ nếu mục tiêu nghiên cứu không bao gồm mở rộng sang các quốc gia khác.
8.ProductFamily
# Thống kê tần suất
table_fam <- table(td$ProductFamily)
prop_fam <- prop.table(table_fam) * 100 # Tỷ lệ phần trăm
# Kết hợp thành data frame
fam_freq <- data.frame(
fam = names(table_fam),
Frequency = as.vector(table_fam),
Percentage = round(as.vector(prop_fam), 2))
print(fam_freq)
## fam Frequency Percentage
## 1 Drink 1250 8.89
## 2 Food 10153 72.22
## 3 Non-Consumable 2656 18.89
library(ggplot2)
ggplot(fam_freq, aes(x = reorder(fam, -Frequency), y = Frequency)) +
geom_bar(stat = "identity", fill = "blue") +
labs(title = "Số lượng khách hàng đến từ các nước",
x = "Country",
y = "Lượng ") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Kết quả phân tích dữ liệu về nhóm sản phẩm (ProductFamily) trong tập dữ liệu:
Drink: 1,250 giao dịch, chiếm 8.89%.
Food: 10,153 giao dịch, chiếm 72.22%.
Non-Consumable: 2,656 giao dịch, chiếm 18.89%.
Nhận xét: Nhóm “Food” chiếm tỷ lệ cao nhất (72.22%), cho thấy sản phẩm thực phẩm là mặt hàng chủ đạo trong các giao dịch, trong khi “Drink” và “Non-Consumable” có tỷ lệ thấp hơn đáng kể.
Ta chọn 3 hạng mục sau:
1. Gender - Nữ (F)
n_total <- nrow(td)
n_female <- sum(td$Gender == "Female")
prop.test(n_female, n_total, p = 0.5, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: n_female out of n_total, null probability 0.5
## X-squared = 14057, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.0000000000 0.0003405602
## sample estimates:
## p
## 0
Tỷ lệ mẫu (Proportion): 50.99%
Khoảng tin cậy 95% (CI): (50.17%; 51.83%)
Giả thuyết kiểm định:
H₀: Tỷ lệ nữ = 0.5
H₁: Tỷ lệ nữ ≠ 0.5
Giá trị p từ kiểm định giả thuyết H₀: p ≈ 0.0182
Kết luận: Bác bỏ H₀ ở mức ý nghĩa 0.05 → Tỷ lệ nữ khác 50% có ý nghĩa thống kê.(Khoảng tin cậy không chứa giá trị 0.5 cũng củng cố kết luận trên).
Diễn giải: Tỷ lệ khách hàng là nữ giới chiếm khoảng 50.99%, nằm trong khoảng tin cậy 95% từ 50.17% đến 51.83%, cho thấy sự phân bố gần như đồng đều giữa hai giới tính. Mặc dù kiểm định cho thấy tỷ lệ này khác đáng kể so với 50% (p = 0.0182), sự khác biệt là rất nhỏ về mặt thực tế. Điều này phản ánh cơ cấu giới tính cân bằng, giúp giảm thiểu sai lệch chọn mẫu và tăng độ tin cậy cho các phân tích liên quan đến giới. Ngoài ra, sự phân bố này cũng tạo điều kiện thuận lợi khi xây dựng các mô hình thống kê có yếu tố giới tính.
2. Homeowner – Hạng mục quan tâm: “Yes” (Y)
n_total_home <- nrow(td)
n_homeowner <- sum(td$Homeowner == "Y")
prop.test(n_homeowner, n_total_home, p = 0.6, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: n_homeowner out of n_total_home, null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
## 0.5924537 0.6087145
## sample estimates:
## p
## 0.6006117
Tỷ lệ mẫu: 60.06%
Khoảng tin cậy 95%: [59.25%; 60.87%]
Giả thuyết kiểm định:
H₀: Tỷ lệ chủ nhà = 0.6
H₁: Tỷ lệ chủ nhà ≠ 0.6
Giá trị p ≈ 0.89 → Không bác bỏ H₀, ttức là không có đủ bằng chứng để kết luận rằng tỷ lệ chủ nhà khác 60% trong tổng thể.(Khoảng tin cậy chứa giá trị 0.6 nên phù hợp với giả thuyết ban đầu)
Nhận xét:
Tỷ lệ khách hàng sở hữu nhà trong tập dữ liệu đạt 60.06%, với khoảng tin cậy 95% nằm trong khoảng [59.25%; 60.87%]. Kiểm định giả thuyết cho thấy không có sự khác biệt có ý nghĩa thống kê so với tỷ lệ giả định là 60% (p = 0.8891). Điều này cho thấy sự phân bố của biến này khá ổn định và đáng tin cậy. Việc hơn 60% khách hàng sở hữu nhà cho thấy một mức độ ổn định tài chính nhất định, phản ánh tiềm năng cho các hành vi tiêu dùng dài hạn hơn ở nhóm này. Ngược lại, nhóm không sở hữu nhà có thể ưu tiên các lựa chọn ngắn hạn và linh hoạt hơn, giúp cung cấp góc nhìn đa dạng trong việc phân tích phân khúc khách hàng.
3.ProductFamily – Hạng mục quan tâm: “Food”
n_total_prod <- nrow(td)
n_food <- sum(td$ProductFamily == "Food")
prop.test(n_food, n_total_prod, p = 0.7, alternative = "less", correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: n_food out of n_total_prod, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.7
## 95 percent confidence interval:
## 0.0000000 0.7283768
## sample estimates:
## p
## 0.7221709
Tỷ lệ mẫu: 72.22%
Khoảng tin cậy 95%: [0.00%; 72.84%] (do lựa chọn kiểm định một phía nên cận dưới là 0)
Giả thuyết kiểm định:
H₀: Tỷ lệ Food ≥ 0.7
H₁: Tỷ lệ Food < 0.7
Giá trị p từ kiểm định H₀: p ≥ 0.7 (dạng một phía): 1
Kết luận: Vì p-value > 0.05 → không bác bỏ H₀, tức là không có đủ bằng chứng để kết luận rằng tỷ lệ sản phẩm Food nhỏ hơn 70%.
Tuy nhiên, vì tỷ lệ mẫu thực tế là 72.22%, kết hợp khoảng tin cậy khá rộng, có thể cân nhắc kiểm định hai phía để đánh giá sát hơn.
Nhận xét:
Nhóm sản phẩm “Food” chiếm tỷ lệ cao nhất với 72.22%, cho thấy đây là mặt hàng chủ lực trong các giao dịch. Mặc dù kết quả kiểm định giả thuyết một phía không bác bỏ giả thuyết tỷ lệ ≥ 70% (p = 1), nhưng tỷ lệ thực tế vượt mức giả định, đồng thời chiếm đa số rõ rệt so với các nhóm còn lại như “Drink” hay “Non-Consumable”. Điều này cho thấy nhu cầu lớn về thực phẩm trong tập khách hàng và là căn cứ vững chắc để doanh nghiệp tập trung chiến lược kinh doanh vào nhóm sản phẩm này.
Ta chọn 3 cặp biến sau đây:
StateorProvince và ProductFamily:
MaritalStatus và Homeowner
AnnualIncome và ProductCategory
Bảng tần số chéo
table_marital_home <- table(td$MaritalStatus, td$Homeowner)
percent_row <- prop.table(table_marital_home, margin = 1) * 100
print(table_marital_home)
##
## N Y
## M 1719 5147
## S 3896 3297
Trực quan hóa
library(ggplot2)
library(dplyr)
# Ví dụ với MaritalStatus và Homeowner
td %>%
group_by(MaritalStatus, Homeowner) %>%
summarise(count = n()) %>%
ggplot(aes(x = MaritalStatus, y = count, fill = Homeowner)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels = scales::percent) +
labs(title = "Tỷ lệ sở hữu nhà theo tình trạng hôn nhân",
y = "Tỷ lệ phần trăm", x = "Tình trạng hôn nhân") +
theme_minimal()
## `summarise()` has grouped output by 'MaritalStatus'. You can override using the
## `.groups` argument.
Nhận xét
Biểu đồ “Tỷ lệ sở hữu nhà theo tình trạng hôn nhân” cho thấy có sự khác biệt rõ rệt giữa hai nhóm MaritalStatus. Cụ thể, trong nhóm đã kết hôn (Married), tỷ lệ sở hữu nhà (Homeowner = Y) cao hơn đáng kể so với tỷ lệ không sở hữu nhà. Ngược lại, ở nhóm độc thân (Single), tỷ lệ không sở hữu nhà lại chiếm ưu thế. Xu hướng này cho thấy khả năng có mối liên hệ giữa tình trạng hôn nhân và việc sở hữu nhà ở: những người đã kết hôn thường có xu hướng sở hữu nhà cao hơn, có thể do nhu cầu ổn định chỗ ở, khả năng tài chính kết hợp từ hai người hoặc kế hoạch dài hạn cho gia đình. Trong khi đó, nhóm độc thân có thể ưu tiên sự linh hoạt về chỗ ở hoặc chưa đủ điều kiện để sở hữu nhà. Mối quan sát này cho thấy sự khác biệt đáng chú ý về hành vi sở hữu tài sản giữa các nhóm hôn nhân.
Bảng tần số chéo
table_income_cat <- table(td$AnnualIncome, td$ProductCategory)
percent_income_cat <- prop.table(table_income_cat, margin = 1) * 100
print(table_income_cat)
##
## Baking Goods Bathroom Products Beer and Wine Bread
## $10K - $30K 119 85 80 108
## $110K - $130K 18 16 14 23
## $130K - $150K 22 19 15 24
## $150K + 11 8 3 10
## $30K - $50K 151 116 121 134
## $50K - $70K 86 50 61 63
## $70K - $90K 59 51 39 50
## $90K - $110K 18 20 23 13
##
## Breakfast Foods Candles Candy Canned Anchovies Canned Clams
## $10K - $30K 111 6 76 10 12
## $110K - $130K 7 1 16 2 1
## $130K - $150K 28 2 19 1 3
## $150K + 7 1 8 1 1
## $30K - $50K 143 21 127 14 20
## $50K - $70K 62 7 60 8 6
## $70K - $90K 42 7 29 6 7
## $90K - $110K 17 0 17 2 3
##
## Canned Oysters Canned Sardines Canned Shrimp Canned Soup
## $10K - $30K 5 8 9 98
## $110K - $130K 4 2 0 19
## $130K - $150K 3 1 2 17
## $150K + 1 1 0 8
## $30K - $50K 10 18 16 137
## $50K - $70K 5 5 7 67
## $70K - $90K 5 3 2 50
## $90K - $110K 2 2 2 8
##
## Canned Tuna Carbonated Beverages Cleaning Supplies
## $10K - $30K 13 36 47
## $110K - $130K 3 6 8
## $130K - $150K 5 3 7
## $150K + 3 6 4
## $30K - $50K 28 51 51
## $50K - $70K 19 20 35
## $70K - $90K 10 23 25
## $90K - $110K 6 9 12
##
## Cold Remedies Dairy Decongestants Drinks Eggs Electrical
## $10K - $30K 23 174 22 30 37 74
## $110K - $130K 2 38 4 9 9 20
## $130K - $150K 6 49 5 8 15 21
## $150K + 3 17 0 4 4 8
## $30K - $50K 32 299 31 46 67 114
## $50K - $70K 12 160 8 19 36 57
## $70K - $90K 10 126 10 16 20 47
## $90K - $110K 5 40 5 3 10 14
##
## Frozen Desserts Frozen Entrees Fruit Hardware Hot Beverages
## $10K - $30K 75 20 150 31 48
## $110K - $130K 17 10 29 3 11
## $130K - $150K 17 5 48 10 9
## $150K + 8 2 10 1 5
## $30K - $50K 112 35 252 41 79
## $50K - $70K 44 21 136 25 33
## $70K - $90K 36 18 104 13 26
## $90K - $110K 14 7 36 5 15
##
## Hygiene Jams and Jellies Kitchen Products Magazines Meat
## $10K - $30K 36 137 47 49 156
## $110K - $130K 6 31 5 17 41
## $130K - $150K 14 32 14 9 52
## $150K + 4 8 3 1 14
## $30K - $50K 62 185 74 65 253
## $50K - $70K 37 103 51 36 115
## $70K - $90K 29 71 20 18 100
## $90K - $110K 9 21 3 7 30
##
## Miscellaneous Packaged Vegetables Pain Relievers Paper Products
## $10K - $30K 10 9 42 70
## $110K - $130K 1 1 7 19
## $130K - $150K 6 1 8 17
## $150K + 0 2 5 8
## $30K - $50K 8 20 61 101
## $50K - $70K 14 8 34 67
## $70K - $90K 2 7 30 46
## $90K - $110K 1 0 5 17
##
## Pizza Plastic Products Pure Juice Beverages Seafood Side Dishes
## $10K - $30K 50 41 34 17 36
## $110K - $130K 13 6 9 3 2
## $130K - $150K 12 7 5 8 8
## $150K + 1 2 5 5 3
## $30K - $50K 59 33 52 44 53
## $50K - $70K 31 31 25 11 23
## $70K - $90K 15 17 26 12 23
## $90K - $110K 13 4 9 2 5
##
## Snack Foods Specialty Starchy Foods Vegetables
## $10K - $30K 329 65 70 385
## $110K - $130K 85 13 18 74
## $130K - $150K 83 18 15 87
## $150K + 35 5 5 32
## $30K - $50K 533 96 85 551
## $50K - $70K 274 50 48 300
## $70K - $90K 184 32 28 215
## $90K - $110K 77 10 8 84
print(round(percent_income_cat, 2))
##
## Baking Goods Bathroom Products Beer and Wine Bread
## $10K - $30K 3.85 2.75 2.59 3.50
## $110K - $130K 2.80 2.49 2.18 3.58
## $130K - $150K 2.89 2.50 1.97 3.16
## $150K + 4.03 2.93 1.10 3.66
## $30K - $50K 3.28 2.52 2.63 2.91
## $50K - $70K 3.63 2.11 2.57 2.66
## $70K - $90K 3.45 2.98 2.28 2.93
## $90K - $110K 2.94 3.26 3.75 2.12
##
## Breakfast Foods Candles Candy Canned Anchovies Canned Clams
## $10K - $30K 3.59 0.19 2.46 0.32 0.39
## $110K - $130K 1.09 0.16 2.49 0.31 0.16
## $130K - $150K 3.68 0.26 2.50 0.13 0.39
## $150K + 2.56 0.37 2.93 0.37 0.37
## $30K - $50K 3.11 0.46 2.76 0.30 0.43
## $50K - $70K 2.62 0.30 2.53 0.34 0.25
## $70K - $90K 2.46 0.41 1.70 0.35 0.41
## $90K - $110K 2.77 0.00 2.77 0.33 0.49
##
## Canned Oysters Canned Sardines Canned Shrimp Canned Soup
## $10K - $30K 0.16 0.26 0.29 3.17
## $110K - $130K 0.62 0.31 0.00 2.95
## $130K - $150K 0.39 0.13 0.26 2.24
## $150K + 0.37 0.37 0.00 2.93
## $30K - $50K 0.22 0.39 0.35 2.98
## $50K - $70K 0.21 0.21 0.30 2.83
## $70K - $90K 0.29 0.18 0.12 2.93
## $90K - $110K 0.33 0.33 0.33 1.31
##
## Canned Tuna Carbonated Beverages Cleaning Supplies
## $10K - $30K 0.42 1.17 1.52
## $110K - $130K 0.47 0.93 1.24
## $130K - $150K 0.66 0.39 0.92
## $150K + 1.10 2.20 1.47
## $30K - $50K 0.61 1.11 1.11
## $50K - $70K 0.80 0.84 1.48
## $70K - $90K 0.59 1.35 1.46
## $90K - $110K 0.98 1.47 1.96
##
## Cold Remedies Dairy Decongestants Drinks Eggs Electrical
## $10K - $30K 0.74 5.63 0.71 0.97 1.20 2.39
## $110K - $130K 0.31 5.91 0.62 1.40 1.40 3.11
## $130K - $150K 0.79 6.45 0.66 1.05 1.97 2.76
## $150K + 1.10 6.23 0.00 1.47 1.47 2.93
## $30K - $50K 0.70 6.50 0.67 1.00 1.46 2.48
## $50K - $70K 0.51 6.75 0.34 0.80 1.52 2.41
## $70K - $90K 0.59 7.37 0.59 0.94 1.17 2.75
## $90K - $110K 0.82 6.53 0.82 0.49 1.63 2.28
##
## Frozen Desserts Frozen Entrees Fruit Hardware Hot Beverages
## $10K - $30K 2.43 0.65 4.85 1.00 1.55
## $110K - $130K 2.64 1.56 4.51 0.47 1.71
## $130K - $150K 2.24 0.66 6.32 1.32 1.18
## $150K + 2.93 0.73 3.66 0.37 1.83
## $30K - $50K 2.43 0.76 5.48 0.89 1.72
## $50K - $70K 1.86 0.89 5.74 1.05 1.39
## $70K - $90K 2.11 1.05 6.09 0.76 1.52
## $90K - $110K 2.28 1.14 5.87 0.82 2.45
##
## Hygiene Jams and Jellies Kitchen Products Magazines Meat
## $10K - $30K 1.17 4.43 1.52 1.59 5.05
## $110K - $130K 0.93 4.82 0.78 2.64 6.38
## $130K - $150K 1.84 4.21 1.84 1.18 6.84
## $150K + 1.47 2.93 1.10 0.37 5.13
## $30K - $50K 1.35 4.02 1.61 1.41 5.50
## $50K - $70K 1.56 4.35 2.15 1.52 4.85
## $70K - $90K 1.70 4.15 1.17 1.05 5.85
## $90K - $110K 1.47 3.43 0.49 1.14 4.89
##
## Miscellaneous Packaged Vegetables Pain Relievers Paper Products
## $10K - $30K 0.32 0.29 1.36 2.27
## $110K - $130K 0.16 0.16 1.09 2.95
## $130K - $150K 0.79 0.13 1.05 2.24
## $150K + 0.00 0.73 1.83 2.93
## $30K - $50K 0.17 0.43 1.33 2.20
## $50K - $70K 0.59 0.34 1.43 2.83
## $70K - $90K 0.12 0.41 1.76 2.69
## $90K - $110K 0.16 0.00 0.82 2.77
##
## Pizza Plastic Products Pure Juice Beverages Seafood Side Dishes
## $10K - $30K 1.62 1.33 1.10 0.55 1.17
## $110K - $130K 2.02 0.93 1.40 0.47 0.31
## $130K - $150K 1.58 0.92 0.66 1.05 1.05
## $150K + 0.37 0.73 1.83 1.83 1.10
## $30K - $50K 1.28 0.72 1.13 0.96 1.15
## $50K - $70K 1.31 1.31 1.05 0.46 0.97
## $70K - $90K 0.88 0.99 1.52 0.70 1.35
## $90K - $110K 2.12 0.65 1.47 0.33 0.82
##
## Snack Foods Specialty Starchy Foods Vegetables
## $10K - $30K 10.65 2.10 2.27 12.46
## $110K - $130K 13.22 2.02 2.80 11.51
## $130K - $150K 10.92 2.37 1.97 11.45
## $150K + 12.82 1.83 1.83 11.72
## $30K - $50K 11.58 2.09 1.85 11.98
## $50K - $70K 11.56 2.11 2.03 12.66
## $70K - $90K 10.77 1.87 1.64 12.58
## $90K - $110K 12.56 1.63 1.31 13.70
Trực quan hóa đồ thị
library(ggplot2)
library(dplyr)
# Trực quan hóa AnnualIncome và ProductCategory
td %>%
group_by(AnnualIncome, ProductCategory) %>%
summarise(count = n()) %>%
ggplot(aes(x = AnnualIncome, y = count, fill = ProductCategory)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels = scales::percent) +
labs(title = "Tỷ lệ danh mục sản phẩm theo thu nhập hàng năm",
x = "Thu nhập hàng năm", y = "Tỷ lệ phần trăm") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## `summarise()` has grouped output by 'AnnualIncome'. You can override using the
## `.groups` argument.
Nhận xét: Biểu đồ “Tỷ lệ danh mục sản phẩm theo thu
nhập hằng năm” cho thấy sự phân bố đa dạng của các nhóm sản phẩm mà
khách hàng lựa chọn dựa trên mức thu nhập. Nhìn chung, các cột thu nhập
có chiều cao màu sắc khá đồng đều, cho thấy không có sự thay đổi quá lớn
trong tỷ lệ tiêu dùng từng danh mục sản phẩm giữa các nhóm thu nhập. Tuy
nhiên, một số danh mục như “Snack Foods”, “Baking Goods” hay “Canned
Vegetables” vẫn chiếm tỷ lệ đáng kể ở hầu hết các mức thu nhập. Điều này
cho thấy các sản phẩm này có thể là nhu yếu phẩm phổ biến, phù hợp với
nhiều đối tượng khách hàng. Mặc dù không có sự khác biệt nổi bật, nhưng
xu hướng tiêu dùng nhất định có thể được phát hiện rõ hơn khi phân tích
cụ thể từng nhóm sản phẩm theo thu nhập. Biểu đồ này hỗ trợ doanh nghiệp
trong việc định vị và xây dựng chiến lược sản phẩm phù hợp cho từng phân
khúc khách hàng theo mức thu nhập.
Bảng tần số chéo
table_state_prod <- table(td$StateorProvince, td$ProductFamily)
percent_state_prod <- prop.table(table_state_prod, margin = 1) * 100
print(table_state_prod)
##
## Drink Food Non-Consumable
## BC 69 580 160
## CA 258 1974 501
## DF 65 598 152
## Guerrero 41 272 70
## Jalisco 5 57 13
## OR 199 1629 434
## Veracruz 44 322 98
## WA 399 3287 881
## Yucatan 48 494 112
## Zacatecas 122 940 235
print(round(percent_state_prod, 2))
##
## Drink Food Non-Consumable
## BC 8.53 71.69 19.78
## CA 9.44 72.23 18.33
## DF 7.98 73.37 18.65
## Guerrero 10.70 71.02 18.28
## Jalisco 6.67 76.00 17.33
## OR 8.80 72.02 19.19
## Veracruz 9.48 69.40 21.12
## WA 8.74 71.97 19.29
## Yucatan 7.34 75.54 17.13
## Zacatecas 9.41 72.47 18.12
Trực quan hóa đồ thị
# Trực quan hóa StateorProvince và ProductFamily
td %>%
group_by(StateorProvince, ProductFamily) %>%
summarise(count = n()) %>%
ggplot(aes(x = StateorProvince, y = count, fill = ProductFamily)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels = scales::percent) +
labs(title = "Tỷ lệ nhóm sản phẩm theo tỉnh/bang",
x = "Tỉnh/Bang", y = "Tỷ lệ phần trăm") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## `summarise()` has grouped output by 'StateorProvince'. You can override using
## the `.groups` argument.
Nhận xét
Bảng “Tỷ lệ nhóm sản phẩm theo bang” thể hiện sự phân bố tiêu dùng của ba nhóm sản phẩm chính là Drink, Food và Non-Consumable ở các bang khác nhau. Qua bảng này, ta có thể thấy rằng mặc dù ba nhóm sản phẩm đều được tiêu dùng tại tất cả các bang, nhưng tỷ trọng giữa chúng có sự khác biệt rõ rệt. Ví dụ, bang Veracruz và Yucatan có tỷ lệ tiêu dùng nhóm sản phẩm Food rất cao, chiếm lần lượt khoảng 81% và 74%, trong khi tỷ lệ này ở Guerrero và Jalisco lại thấp hơn đáng kể. Ngược lại, nhóm Drink chiếm tỷ lệ cao hơn tại các bang như Guerrero (khoảng 17.6%) hay Jalisco (18.3%). Nhóm Non-Consumable nhìn chung có tỷ lệ thấp hơn so với hai nhóm còn lại, dao động chủ yếu từ 17% đến 20%. Những sự khác biệt này có thể phản ánh điều kiện sống, sở thích tiêu dùng hoặc mức độ phát triển thương mại khác nhau giữa các bang. Kết quả này hữu ích cho việc thiết kế chiến lược phân phối và tiếp thị theo khu vực địa lý.
MaritalStatus và Homeowner
# Tạo bảng tần số chéo
tab <- table(td$MaritalStatus, td$Homeowner)
# Kiểm định Chi-bình phương
result <- chisq.test(tab)
# In kết quả
print(result)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Giả thuyết kiểm định:
H₀ (Giả thuyết không.
H₁ (Giả thuyết đối).
Kết quả kiểm định:
Giá trị thống kê: 𝜒2=1241.2
Bậc tự do: d𝑓=1
Giá trị p-value rất nhỏ (< 2.2e-16)
Kết luận: Vì p-value rất nhỏ (nhỏ hơn mức ý nghĩa thông thường 0.05), nên bác bỏ giả thiết không. Điều này cho thấy có mối liên hệ thống kê có ý nghĩa giữa hai biến
AnnualIncome và ProductCategory
tab2 <- table(td$AnnualIncome, td$ProductCategory)
result2 <- chisq.test(tab2)
## Warning in chisq.test(tab2): Chi-squared approximation may be incorrect
Vì một số ô trong bảng tần số có giá trị nhỏ (thường dưới 5), khiến kiểm định Chi-bình phương không đáng tin cậy.
StateorProvince và ProductFamily
tab3 <- table(td$StateorProvince, td$ProductFamily)
result3 <- chisq.test(tab3)
print(result3)
##
## Pearson's Chi-squared test
##
## data: tab3
## X-squared = 12.3, df = 18, p-value = 0.8314
Giả thuyết kiểm định:
H₀: không có mối liên hệ hay phụ thuộc lẫn nhau.
H₁: tồn tại mối liên hệ giữa khu vực địa lý và nhóm sản phẩm.
Kết quả kiểm định:
Giá trị thống kê: 𝜒2 = 12.3
Bậc tự do: d𝑓 = 18
Giá trị p-value = 0.8314.
Kết luận:Vì giá trị p-value lớn hơn mức ý nghĩa phổ biến 0.05, chúng ta không đủ cơ sở để bác bỏ giả thiết không. Điều này cho thấy không có mối liên hệ thống kê đáng kể giữa khu vực địa lý (StateorProvince) và nhóm sản phẩm (ProductFamily) trong dữ liệu phân tích.
Dựa trên các phân tích về các biến định tính, nghiên cứu đã làm rõ một số đặc điểm quan trọng của khách hàng và hành vi mua sắm của họ. Cụ thể, mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân (MaritalStatus) và việc sở hữu nhà (Homeowner) phản ánh sự liên kết giữa các yếu tố xã hội và kinh tế trong phân khúc khách hàng. Đồng thời, phân tích các biến về thu nhập hàng năm (AnnualIncome) và loại sản phẩm (ProductCategory) cũng cho thấy sự phân bố không đồng đều, chỉ ra rằng nhóm khách hàng khác nhau có xu hướng lựa chọn sản phẩm phù hợp với mức thu nhập. Cuối cùng, mối quan hệ giữa khu vực địa lý (StateorProvince) và nhóm sản phẩm (ProductFamily) hé lộ sự khác biệt trong hành vi tiêu dùng tùy theo vùng miền, góp phần định hướng phân phối và tiếp thị hiệu quả hơn.
Phân tích trong bài tập này tập trung chủ yếu vào các biến định tính, do đó còn tồn tại một số hạn chế nhất định. Trước hết, các biến định tính trong bộ dữ liệu có một số giá trị thiếu (NA) ở những cột quan trọng, gây khó khăn trong việc xử lý và có thể ảnh hưởng đến kết quả phân tích nếu không được xử lý hợp lý. Mặc dù đã thực hiện các bước thay thế hoặc loại bỏ giá trị thiếu, nhưng việc này có thể làm mất đi một phần thông tin khách hàng đáng giá.
Thứ hai, một số nhóm con trong các biến phân loại có kích thước mẫu khá nhỏ, dẫn đến khó khăn trong việc áp dụng các kiểm định thống kê chuẩn như kiểm định Chi-bình phương, vì có thể vi phạm giả định về tần số kỳ vọng trong bảng tần số. Điều này hạn chế khả năng đánh giá chính xác mối quan hệ giữa các biến định tính trong những nhóm nhỏ.
Ngoài ra, việc chỉ phân tích các biến định tính mà không kết hợp với các biến định lượng (ví dụ: mức chi tiêu, số lần mua) làm hạn chế góc nhìn toàn diện về hành vi khách hàng, cũng như khả năng phát hiện các mẫu phức tạp hơn trong dữ liệu. Cuối cùng, dữ liệu thu thập được có thể chịu ảnh hưởng bởi các yếu tố bên ngoài như sai sót trong nhập liệu hoặc sự không đồng nhất trong cách phân loại, tạo ra những khó khăn khi chạy các phân tích thống kê.
Dựa trên các kết quả phân tích và những hạn chế đã nêu, chúng tôi đề xuất một số hướng đi cụ thể nhằm khai thác sâu hơn dữ liệu và nâng cao hiệu quả trong việc hiểu và phục vụ khách hàng:
Mở rộng phân tích định tính kết hợp với định lượng
Bổ sung các biến định lượng liên quan đến hành vi mua sắm như tổng chi tiêu, tần suất mua hàng để kết hợp cùng các biến định tính đã phân tích.
Áp dụng các mô hình phân tích đa biến hoặc hồi quy logistic để dự báo hành vi khách hàng theo từng nhóm đặc trưng như tình trạng hôn nhân, thu nhập, sở hữu nhà.
Phân khúc khách hàng dựa trên đặc điểm đa chiều
Sử dụng kỹ thuật phân cụm (clustering) kết hợp các biến định tính (tình trạng hôn nhân, địa lý, thu nhập) nhằm phân nhóm khách hàng theo hành vi và nhu cầu tiêu dùng thực tế.
Từ đó thiết kế các chiến lược marketing cá nhân hóa, nhắm đúng mục tiêu với từng phân khúc cụ thể, ví dụ ưu tiên nhóm có thu nhập cao hoặc nhóm độc thân có xu hướng tiêu dùng linh hoạt hơn.
Kết hợp dữ liệu bên ngoài và mở rộng thu thập
Tích hợp dữ liệu về đặc điểm dân cư khu vực, xu hướng tiêu dùng theo vùng để có cái nhìn toàn diện hơn về thị trường.
Bổ sung dữ liệu về thời gian mua hàng, kênh phân phối để phân tích xu hướng theo mùa, ngày trong tuần, giúp tối ưu hóa kế hoạch tiếp thị và tồn kho.
Gợi ý chiến lược kinh doanh
Tập trung phát triển các sản phẩm phù hợp với từng nhóm thu nhập và tình trạng hôn nhân, ví dụ sản phẩm tiện lợi cho nhóm độc thân, sản phẩm gia đình cho nhóm đã kết hôn và sở hữu nhà.
Đẩy mạnh chiến dịch tiếp thị theo vùng miền dựa trên sự khác biệt về sản phẩm ưa chuộng và thói quen tiêu dùng đã được phân tích.
Thiết kế các chương trình khuyến mãi riêng biệt cho từng phân khúc để tăng sự tương tác và mức độ trung thành của khách hàng.