library(ggplot2)
library(dplyr)
# Đọc file csv vào R
d <- read.csv("D:/AnhThu/PTDL ĐỊNH TÍNH/DATA/Supermarket Transactions.csv", header = T)
d
# Xem cấu trúc của bộ dữ liệu
str(d)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "12/18/2007" "12/20/2007" "12/21/2007" "12/21/2007" ...
## $ 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 ...
Bộ dữ liệu là data frame, bao gồm 14059 quan sát và 16 biến. Các biến định lượng là các biến: Children, UnitsSold và Revenue. Các biến định tính là các biến: Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateoProvince, Country, ProductFamily, ProductDepartment, ProductCategory. Cụ thể:
Gender: Giới tính của khách hàng: F = Female (Phụ nữ), M = Male (Đàn ông).
MaritalStatus: Tình trạng hôn nhân: S = Single (độc thân), M = Married (đã kết hôn).
Homeowner: Khách hàng có sở hữu nhà không: Y = Yes, N = No.
Children: Số con của khách hàng.
AnnualIncome: Thu nhập hàng năm của khách hàng (được biểu thị dưới dạng các khoảng).
City: Thành phố nơi khách hàng sinh sống.
StateorProvince: Bang hoặc tỉnh tương ứng với thành phố.
Country: Quốc gia.
ProductFamily: Nhóm sản phẩm chính.
ProductDepartment: Bộ phận các sản phẩm chi tiết hơn trong từng nhóm.
ProductCategory: Danh mục cụ thể của sản phẩm.
UnitsSold: Số lượng đơn vị sản phẩm được bán trong một giao dịch với mỗi khách hàng.
Revenue: Tổng doanh thu (USD) từ giao dịch với khách hàng.
Ngoài ra các biến X là số thứ tự, PurchaseDate là ngày giao dịch mua hàng tại siêu thị và CustomerID là mã khách hàng.
# Hiển thị 6 dòng đầu tiên của dữ liệu
head(d,6)
# Hiển thị 6 dòng cuối của dữ liệu
tail(d,6)
Ở bài này, các biến định tính được lựa chọn để phân tích, gồm 10 biến định tính:
Gender: Giới tính của khách hàng: F = Female (Phụ nữ), M = Male (Đàn ông).
MaritalStatus: Tình trạng hôn nhân: S = Single (độc thân), M = Married (đã kết hôn).
Homeowner: Khách hàng có sở hữu nhà không: Y = Yes, N = No.
AnnualIncome: Thu nhập hàng năm của khách hàng (được biểu thị dưới dạng các khoảng).
City, StateorProvince, Country: Thông tin vị trí địa lý của khách hàng.
ProductFamily, ProductDepartment, ProductCategory: Phân loại các sản phẩm được mua.
# Rút trích các dữ liệu định tính
a <- select(d,-c(1,2,3,7,15,16)) # tạo dữ liệu a chứa các biến định tính
# Kiểm tra số lượng giá trị NA trong từng cột của a
sapply(a, 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
## sapply(): áp dụng một hàm lên từng cột của a
## function(x): hàm ẩn danh xử lý từng cột của a
## is.na(x): trả về kết quả TRUE/ FALSE cho biết phần tử nào có NA (với TRUE là có xuất hiện NA)
## sum(is,na()): Tính tổng số lần TRUE xuất hiện, tức là tính tổng các phần tử bị thiếu NA
Kết quả cho thấy tổng số lượng các giá trị bị thiếu bằng 0, nghĩa là không có giá trị thiếu trong các cột định tính.
table(a$Gender)
##
## F M
## 7170 6889
Câu lệnh table() tạo ra bảng tần số, đếm số lần xuất
hiện của từng phần tử trong biến của dữ liệu cần phân tích.
Nhận xét: Dựa trên bảng kết quả, trong số 14059 quan sát, tương ứng với 14059 khách hàng, có 7170 khách hàng là nữ và 6889 khách hàng còn lại thuộc giới tính nam. Ngoài ra, số lượng khách hàng phân loại theo giới tính còn được thể hiện thông qua biểu đồ tần số:
# Biểu đồ cột thể hiện tần số giới tính
a %>% group_by(Gender) %>% summarise(n = n()) %>%
ggplot(aes(x = Gender, y = n))+
geom_col(fill='pink')+
geom_text(aes(label = n), vjust = 2) +
labs(x = "Giới tính", y="Số lượng khách hàng", title = "Biểu đồ thể hiện tần số giới tính")
Giải thích câu lệnh:
a: lấy dữ liệu từ bộ dữ liệu a,
%>%: toán tử pipe để truyền kết quả từ trái sang
phải,
group_by(Gender): nhóm dữ liệu theo biến Gender
(giới tính),
summarise(n = n()): đếm số khách hàng theo giới tính
và gán số lượng khách hàng vào n,
ggplot(aes(x = Gender, y = n)): tạo biểu đồ với trục
x là Gender và trục y là n,
geom_col(fill = 'pink'): vẽ biểu đồ cột
geom_col và tô màu hồng cho cột (`fill = ‘pink’),
geom_text(aes(label = n), vjust = 2): thêm văn bảng
vào biểu đồ geom_text với nhãn là số lượng khách theo giới
tính aes(label = n) và điều chỉnh vị trí dọc của văn bản
với vjust > 0 là ở trên cột.
labs(): thêm tên cho trục X, trục Y và tên của biểu
đồ.
# Bảng tần suất giới tính
table(a$Gender)/sum(nrow(a))
##
## F M
## 0.5099936 0.4900064
# Biểu đồ thể hiện tần suất giới tính
a %>% group_by(Gender) %>% summarise(n = n()) %>%
mutate(pc = paste0(round(n/sum(n)*100),"%")) %>%
ggplot(aes(x = "", y = n, fill = Gender)) +
geom_col(width = 1) +
coord_polar(theta = "y") +
geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
labs(title = "Biểu đồ tròn thể hiện tần suất giới tính") +
theme_void()
Giải thích câu lệnh: tương tự như các câu lệnh trên, ở biểu đồ này xuất hiện một số câu lệnh mới như sau:
mutate(): tạo biến mới có tên là pc, với pc là tính
tỷ lệ % của từng giới tính round(n/sum(n)*100) và tỷ lệ
được hiển thị theo % paste0(..., "%"),
x = "": tạo cột duy nhất không cần trục x,
fill = Gender: tô màu cho từng giới tính,
width = 1: độ rộng của cột bằng 1,
coord_polar(): chuyển sang biểu đồ tròn,
theta = "y": xoay theo chiều trục y để tạo ra hình
tròn,
position = position_stack(vjust = 0.5): vị trí của
nhãn được đặt ở giữa của biểu đồ,
theme_void(): xóa bỏ các trục, đường kẻ,…
Nhận xét: Biểu đồ tròn thể hiện tần suất phân bổ khách hàng theo giới tính. Biểu đồ hình tròn với màu cam thể hiện tỷ lệ giới tính nữ và màu xanh thể hiện tỷ lệ giới tính nam. Có thể thấy, số lượng phân bổ khá đồng đều. Vậy trong bộ dữ liệu này có 50.9993598 % là khách hàng nữ và 49.0006402 % là khách hàng nam.
Bảng tần số thể hiện tình trạng hôn nhân MaritalStatus của khách hàng được thể hiện như sau:
# Bảng tần số
table(a$MaritalStatus)
##
## M S
## 6866 7193
Từ bảng tần số, khách hàng có gia đình có số lượng ít hơn so với khách hàng còn độc thân, cụ thể: có 6866 khách hàng đã kết hôn (ký hiệu Marriage) và 7193 khách hàng còn độc thân (ký hiệu S - Single).
# Biều đồ thể hiện tần số của biến MaritalStatus
a %>% group_by(MaritalStatus) %>% summarise(n = n()) %>%
ggplot(aes(x = MaritalStatus, y = n)) +
geom_col(fill = 'lightblue') +
geom_text(aes(label = n), vjust = 2) +
labs(x = "Tình trạng hôn nhân", y="Số lượng khách hàng", title = "Biểu đồ thể hiện tần số tình trạng hôn nhân")
Bảng tần suất thể hiện tỷ lệ tình trạng hôn nhân MaritalStatus của khách hàng được thể hiện như sau:
table(a$MaritalStatus)/sum(nrow(a))
##
## M S
## 0.4883704 0.5116296
Bảng tần số thể hiện tình trạng có nhà hay không của khách hàng, thông qua biến Homeowner như sau:
table(a$Homeowner)
##
## N Y
## 5615 8444
Dựa vào bảng tần số của Homeowner, cho biết khách hàng có sở hữu nhà hay không, với N là không có nhà và Y là có sở hữu nhà. Kết quả thống kê ta có 5615 khách hàng không có nhà và ngược lại 8444 khách có nhà ở.
# Bảng tần suất Homeowner
table(a$Homeowner)/sum(nrow(a))
##
## N Y
## 0.3993883 0.6006117
# Biểu đồ thể hiện tình trạng nhà ở Homeowner
a %>% group_by(Homeowner) %>% summarise(n = n()) %>%
mutate(pc = paste0(round(n/sum(n)*100),"%")) %>%
ggplot(aes(x = "", y = n, fill = Homeowner)) +
geom_col(width = 1) +
coord_polar(theta = "y") +
geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
labs(title = "Biểu đồ tròn thể hiện tần suất tình trạng nhà ở") +
theme_void()
# Bảng tần suất thu nhập hàng năm của khách hàng
table(a$AnnualIncome)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
# Biểu đồ thể hiện thu nhập của khách hàng
a %>% group_by(AnnualIncome) %>% summarise(n = n()) %>%
ggplot(aes(x = AnnualIncome, y = n))+
geom_col(fill='brown')+
geom_text(aes(label = n), vjust = -0.5) +
labs(x = "Giới tính", y="Số lượng khách hàng", title = "Biểu đồ thể hiện thu nhập hàng năm")
Nhận xét: Biểu đồ cột thể hiện thu nhập hằng năm của khách hàng bao gồm các nhóm:
Nhóm thu nhập từ $10K - $30K gồm 3090 khách hàng,
Nhóm thu nhập từ $30K - $50K gồm 4610 khách hàng,
Nhóm thu nhâp từ $50K - $70K gồm 2370 khách hàng,
Nhóm thu nhập từ $70K - $90K gồm 1709 khách hàng,
Nhóm thu nhập từ $90K - $110K gồm 613 khách hàng,
Nhóm thu nhập từ $110K - $130K gồm 643 khách hàng,
Nhóm thu nhập từ $130K - $150K gồm 760 khách hàng và
Có 273 khách hàng có thu nhập trên $150K.
Biểu đồ này phản ánh xu hướng phổ biến là phần lớn người lao động có mức thu nhập trung bình, trong khi mức thu nhập cao và thu nhập thấp có số người tương đối ít.
Bảng tần suất thể hiện tỷ lệ các khoảng thu nhập hằng năm của khách hàng như sau:
table(a$AnnualIncome)/sum(nrow(a))
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 0.21978804 0.04573583 0.05405790 0.01941817 0.32726367
## $50K - $70K $70K - $90K $90K - $110K
## 0.16857529 0.12155914 0.04360196
Kết quả thống kê biến City được thể hiện như sau:
# Bảng tần số thành phố, nơi khách hàng cư trú
table(a$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
# Biểu đồ thể hiện tần số của City
ggplot(d, aes(x = City)) +
geom_bar(fill = 'orange') +
labs(x = 'Thành phố', y = 'Số lượng khách hàng', title = "Biểu đồ thể hiện tần số của thành phố") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
_ Nhận xét: Biểu đồ cho thấy số lượng khách hàng phân bố không đồng đều giữa các thành phố. Thành phố Salem có số lượng khách hàng cao nhất, tiếp theo là Tacoma và Seattle. Trong khi đó, các thành phố như Guadalajara, San Francisco và Walla Walla có số lượng khách hàng thấp nhất. Điều này cho thấy mức độ thu hút khách hàng tại các thành phố là khác nhau, và các thành phố có lượng khách hàng cao có thể là đối tượng tiềm năng để mở rộng siêu thị tại các nơi này.
Bảng tần suất thể hiện tỷ lệ khách hàng từ các thành phố thông qua biến City như sau:
table(a$City)/sum(nrow(a))
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 0.027242336 0.010171420 0.057685468 0.059321431 0.032150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.005334661 0.060103848 0.065865282 0.046518245 0.013798990
## Orizaba Portland Salem San Andres San Diego
## 0.033003770 0.062308841 0.098584537 0.044170994 0.061597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.009246746 0.065580767 0.062237712 0.089408920 0.045024539
## Victoria Walla Walla Yakima
## 0.012518671 0.011380610 0.026744434
Bảng tần số thể hiện các bang hoặc tỉnh tương ứng với thành phố, nơi khách hàng sinh sống bao gồm 10 bang (hoặc tỉnh) thông qua biến StateorProvine:
# Bảng tần số
table(a$StateorProvince)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
Thông qua bảng tần số thể hiện các bang hoặc tỉnh tương ướng với thành phố, nơi khách hàng sinh sống. Số khách hàng đến từ các bang (hoặc tỉnh) được thể hiện như sau: có 809 khách hàng đến từ BC, 2733 khách hàng từ CA, 815 khách hàng từ DF, 383 khách hàng đến từ Guerrero, 75 khách hàng từ Jalisco, 2262 khách hàng từ OR, 464 khách hàng đến từ Veracruz, 4567 khách hàng từ WA, 654 khách hàng từ Yucatan và Zacatecas có 1297 khách hàng.
# Biểu đồ tần số các bang hoặc tỉnh
ggplot(d, aes(x = StateorProvince)) +
geom_bar(fill = 'blue') +
labs(x = 'Bang (tỉnh)', y = 'Số lượng khách hàng', title = "Biểu đồ thể hiện tần số của bang (hoặc tỉnh) ")
Tỷ lệ bang hoặc tỉnh, nơi khách hàng sinh sống được thể hiện thông qua bảng tần suất như sau:
table(a$StateorProvince)/sum(nrow(a))
##
## BC CA DF Guerrero Jalisco OR
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378
## Veracruz WA Yucatan Zacatecas
## 0.033003770 0.324845295 0.046518245 0.092254072
# Bảng tần số các quốc gia
table(a$Country)
##
## Canada Mexico USA
## 809 3688 9562
Biến Country thể hiện khách hàng đến từ 3 quốc gia khác nhau như 809 khách hàng từ Canada, 3688 khách hàng đến từ Mexico và 9562 khách hàng còn lại đến từ USA.
a %>% group_by(Country) %>% summarise(n = n()) %>%
ggplot(aes(x = Country, y = n))+
geom_col(fill='purple')+
geom_text(aes(label = n), vjust = -0.5) +
labs(x = "Quốc gia", y="Số lượng khách hàng", title = "Biểu đồ thể hiện tần số quốc gia")
Bảng tần suất thể hiện tỷ lệ khách hàng phân bổ theo quốc gia như sau:
table(a$Country)/sum(nrow(a))
##
## Canada Mexico USA
## 0.05754321 0.26232307 0.68013372
Trong bộ dữ liệu này, lượng khách hàng đến từ Canada chiếm khoảng 5.7543211%, khách hàng đến từ Mexico chiếm 26.2323067% và 68.0133722% là khách hàng đến từ USA.
table(a$ProductFamily)
##
## Drink Food Non-Consumable
## 1250 10153 2656
Bảng tần số thể hiện các sản phẩm chính ProductFamily được mua bao gồm: Drink, Food và Non-Consumable, trong đó có 1250 khách hàng mua các sản phẩm đồ uống (Drink), 10153 khách hàng mua đồ ăn (Food) và 2656 khách hàng mua hàng không tiêu dùng (Non-Consumable).
a %>% group_by(ProductFamily) %>% summarise(n = n()) %>%
ggplot(aes(x = ProductFamily, y = n))+
geom_col(fill='red')+
geom_text(aes(label = n), vjust = -0.5) +
labs(x = "Sản phẩm chính", y="Tần số", title = "Biểu đồ thể hiện tần số các sản phẩm chính")
table(a$ProductFamily)/sum(nrow(a))
##
## Drink Food Non-Consumable
## 0.08891102 0.72217085 0.18891813
Trong bộ dữ liệu này, các sản phẩm đồ uống (Drink) chiếm khoảng 8.8911018%, sản phẩm đồ ăn (Food) chiếm 72.2170851% và 18.8918131% là phần trăm sản phẩm Non - Consumable.
# Bảng tần số
table(a$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
# Biểu đồ thể hiện tần số
ggplot(d, aes(x = ProductDepartment)) +
geom_bar(fill = 'green') +
labs(x = 'ProductDepartment', y = 'Tần số', title = "Biểu đồ thể hiện tần số các bộ phận sản phẩm cần mua") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Biến ProductDepartment thể hiện chi tiết các bộ phẩn sản phẩm cần mua trong từng nhóm sản phẩm chính, bao gồm: Seafood, Alcoholic Beverages, Household,…ứng với từng khách hàng.
Bảng tần suất thể hiện tỷ lệ của mỗi bộ phận sản phẩm trong biến ProductDepartment:
table(a$ProductDepartment)/sum(nrow(a))
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 0.025321858 0.030229746 0.076250089 0.048367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 0.013372217 0.069492852 0.007753041 0.004196600
## Checkout Dairy Deli Eggs
## 0.005832563 0.064229319 0.049719041 0.014083505
## Frozen Foods Health and Hygiene Household Meat
## 0.098300021 0.063518031 0.101002916 0.006330464
## Periodicals Produce Seafood Snack Foods
## 0.014368020 0.141830856 0.007255139 0.113806103
## Snacks Starchy Foods
## 0.025037343 0.019702682
# Bảng tần số
table(a$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ị tần số
ggplot(d, aes(x = ProductCategory)) +
geom_bar(fill = 'navy') +
labs(x = 'ProducCategory', y = 'Tần số', title = "Biểu đồ thể hiện tần số các sản phẩm cần mua") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Tương tự ProductDepartment, biến ProductCategory là danh mục cụ thể của các sản phầm mà khách hàng cần mua, ví dụ Vegetables, Jams and Jellies, Baking Goods,…
Tỷ lệ các sản phẩm cụ thể cần mua của khách hàng được thể hiện thông qua bảng tần suất như sau:
table(a$ProductCategory)/sum(nrow(a))
##
## Baking Goods Bathroom Products Beer and Wine
## 0.034426346 0.025962017 0.025321858
## Bread Breakfast Foods Candles
## 0.030229746 0.029660716 0.003200797
## Candy Canned Anchovies Canned Clams
## 0.025037343 0.003129668 0.003769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.002489508 0.002845153 0.002702895
## Canned Soup Canned Tuna Carbonated Beverages
## 0.028736041 0.006188207 0.010953837
## Cleaning Supplies Cold Remedies Dairy
## 0.013443346 0.006614980 0.064229319
## Decongestants Drinks Eggs
## 0.006045949 0.009602390 0.014083505
## Electrical Frozen Desserts Frozen Entrees
## 0.025250729 0.022974607 0.008393200
## Fruit Hardware Hot Beverages
## 0.054413543 0.009175617 0.016075112
## Hygiene Jams and Jellies Kitchen Products
## 0.014012376 0.041823743 0.015434953
## Magazines Meat Miscellaneous
## 0.014368020 0.054129028 0.002987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.003414183 0.013656732 0.024539441
## Pizza Plastic Products Pure Juice Beverages
## 0.013798990 0.010029163 0.011736254
## Seafood Side Dishes Snack Foods
## 0.007255139 0.010882709 0.113806103
## Specialty Starchy Foods Vegetables
## 0.020556227 0.019702682 0.122910591
Ở phần này, ta chọn 3 hạng mục từ 3 biến định tính của dữ liệu. Các hạng mục được chọn bao gồm:
Hạng mục “F” của biến Gender là
khách hàng có giới tính nữ.
Hạng mục “M” của biến MaritalStatus
là khách hàng đã kết hôn.
Hạng mục “Food” của biến
ProcductFamily là các sản phẩm đồ ăn.
Với khoảng tin cậy 95%, tỷ lệ của các hạng mục trong tổng thể được thể hiện như sau:
Ước lượng Khoảng Tin cậy
# Số lượng khách hàng là nữ
female <- sum(a$Gender == "F")
# Tổng số khách hàng
total <- nrow(a)
# Ước lượng khoảng tin cậy 95%
prop.test(female, total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: female out of total, 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
Tỷ lệ khách hàng nữ trong tập khách hàng là 0,509999 hay 50,99%.
Khoảng tin cậy 95% cho tỷ lệ này là **[50,17%, 51,83%].
Ý nghĩa: Với độ tin cậy 95%, khẳng định rằng tỷ lệ khách hàng là nữ trong toàn bộ khách hàng nằm trong khoảng 50,17% đến 51,83%.
Kiểm định Giả thuyết
Đặt giả thuyết:
H0: Tỷ lệ Nữ (F) trong tổng thể = 0,5;
H1: Tỷ lệ Nữ (F) ≠ 0,5.
# Kiểm định giả thuyết H0: tỷ lệ Nữ = 0,5
prop.test(female, total, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: female out of total, 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
Kết quả thu được p_value = 0,0182. Vì p_value \(<\) 0.05, nên ta bác bỏ H0 ở mức ý nghĩa 5%. Do đó, kết luận rằng tỷ lệ Nữ giới trong toàn bộ khách hàng không phải là 50%, vượt 50% và nằm trong khoảng tin cậy.
Ước lượng Khoảng Tin cậy
# Số lượng khách hàng đã kết hôn
mar <- sum(a$MaritalStatus == "M")
# Tổng số khách hàng
total_mar <- nrow(a)
# Ước lượng khoảng tin cậy 95%
prop.test(mar, total_mar, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: mar out of total_mar, null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.00597
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4800765 0.4966708
## sample estimates:
## p
## 0.4883704
Tỷ lệ khách hàng đã kết hôn trong tập khách hàng được ước lượng là 48,84%.
Khoảng tin cậy 95% cho tỷ lệ này là từ [48,01%, 49,67%].
Ý nghĩa: Với độ tin cậy 95%, tỷ lệ khách hàng đã kết hôn trong toàn bộ khách hàng nằm trong khoảng từ 48,01% đến 49,67%.
Kiểm định giả thuyết
Đặt giả thuyết:
Giả thuyết H0: p = 0.5 (tỷ lệ kết hôn là 50%),
Giả thuyết H1: p ≠ 0.5 (tỷ lệ kết hôn ≠ 50%).
prop.test(mar, total_mar, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: mar out of total_mar, null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.00597
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4800765 0.4966708
## sample estimates:
## p
## 0.4883704
Kết quả kiểm định tỷ lệ cho thấy tỷ lệ kết hôn trong mẫu là 0.4883 (48,83%), với khoảng tin cậy 95% là từ 48,01% đến 49,67%.
Giá trị p_value thu được p_value = 0.0597, nhỏ hơn mức ý nghĩa α = 0.05. Do đó, giả thuyết H0 bị bác bỏ. Do đó, kết luận rằng tỷ lệ Nữ giới trong toàn bộ khách hàng không phải là 50% mà nằm trong khoảng tin cậy [48,01%, 49,67%].
Ước lượng khoảng tin cậy
# Số lượng Food trong tổng thể ProductFamily
fod <- sum(a$ProductFamily == "Food")
# Tổng số khách hàng
total_fod <- nrow(a)
# Ước lượng khoảng tin cậy
prop.test(fod, total_fod, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: fod out of total_fod, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.7146709 0.7295489
## sample estimates:
## p
## 0.7221709
Kết quả ước lượng cho thấy **tỷ lệ sản phẩm thuộc nhóm “Food” trong mẫu là 72.22%.
Khoảng tin cậy 95% cho tỷ lệ này từ 71,47% đến 72,95%
Ý nghĩa: Với độ tin cậy 95% có thể thấy rằng tỷ lệ thực tế của các sản phẩm “Food” trong toàn bộ tập khách hàng nằm trong khoảng từ 71.47% đến 72.95%. Điều này chứng tỏ, khách hàng tại siêu thị tập trung chủ yếu mua các sản phẩm là “Food”.
Kiểm định giải thuyết
Đặt giả thuyết:
Giả thuyết H0: p = 0.7 (tỷ lệ Food là 50%),
Giả thuyết H1: p ≠ 0.7 (tỷ lệ Food ≠ 50%).
prop.test(fod, total_fod, p = 0.7, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: fod out of total_fod, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 1.02e-08
## alternative hypothesis: true p is not equal to 0.7
## 95 percent confidence interval:
## 0.7146709 0.7295489
## sample estimates:
## p
## 0.7221709
Kết quả kiểm định:
Giá trị p_value = 1.02e - 08 < 0.05.
Giá trị p_value thu được nhỏ hơn mức ý nghĩa α = 0.05, ta bác bỏ giả thuyết H0. Như vậy, tỷ lệ sản phẩm “Food” trong tổng thể thực sự khác 70%.
Tiến hành chọn 3 cặp biến để kiểm tra mối quan hệ giữa chúng. Ba cặp biến được chọn bao gồm:
Gender và MaritalStatus,
Homeowner và Country,
AnnualIncome và Homeowner
Bảng tần suất chéo (contigency table) cho 2 biến Gender và MaritalStatus thể hiện như sau:
# Bảng tần suất chéo
table_gender_Mari <- table(a$Gender, a$MaritalStatus)
table_gender_Mari
##
## M S
## F 3602 3568
## M 3264 3625
Kết quả bảng tần suất giữa 2 biến như sau:
Có 3602 khách hàng nữ đã kết hôn và 3568 khách hàng nữ còn độc thân.
Có 3264 khách hàng nam đã kết hôn và 3625 khách hàng nam còn độc thân.
Tính toán tỷ lệ phần trăm theo hàng:
# Tính tỷ lệ % theo từng giới tính
prop.table(table_gender_Mari, margin = 1)
##
## M S
## F 0.5023710 0.4976290
## M 0.4737988 0.5262012
Giải thích các câu lệnh:
prop.table(): được dùng để chuyển bảng đếm thành
bảng tỷ lệ (proportion).
margin = 1: tính phần trăm theo hàng, với mỗi hàng
tương ứng 100%.
Việc lựa chọn tính toán tỷ lệ phần trăm theo hàng (hay theo từng giới tính) nhằm tìm hiểu xu hướng hôn nhân của từng nhóm giới tính.
Kết quả tính toán cho thấy:
Trong tổng số khách hàng thuộc giới tính nữ, 50,24% khách hàng đã kết hôn và 49,76% khách hàng độc thân.
Trong tổng số khách hàng thuộc giới tính nam, 47,38% khách hàng đã kết hôn và 52,62% khách hàng độc thân.
a %>%
ggplot(aes(x = Gender, fill = MaritalStatus)) +
geom_bar(position = "dodge") +
labs(x = "Gender", y = "Số lượng khách hàng", title = "Tình trạng hôn nhân phân bổ theo giới tính")
Câu lệnh position = "dodge" dùng để điều chỉnh vị trí
các cột của nhóm, hiển thị song song các cột trên cùng một trục x.
Nhận xét: Tổng số khách hàng nam và khách hàng nữ là tương đương nhau, tuy nhiên tình trạng hôn nhân phân bổ khác nhau giữa nam và nữ:
Đối với nữ giới:
Đối với nam giới:
Để kiểm tra mối quan hệ giữa Gender và MaritalStatus, ta sử dụng kiểm định Chi-square test để khẳng định mối quan hệ này.
Đặt giả thuyết:
H0: Gender và MaritalStatus độc lập,
H1: Gender và MaritalStatus có liên quan
# Kiểm định tính độc lập cho 2 biến
chisq.test(table_gender_Mari)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_gender_Mari
## X-squared = 11.365, df = 1, p-value = 0.0007485
Kết quả kiểm định:
Giá trị Chi - bình phương: X-square = 11.365,
Bậc tự do: df = 1,
Giá trị p_value = 0.0007485.
Kết luận thống kê: Giá trị p_value = 0.0007485 < 0.05 nên ta bác bỏ giả thuyết H0. Vậy giới tính Gender và tình trạng hôn nhân MaritalStatus có mối liên hệ với nhau.
Dựa trên biểu đồ phân bố tình trạng hôn nhân theo giới tính và kết quả kiểm định Chi-bình phương, có thể thấy rõ ràng rằng giới tính có ảnh hưởng đến tình trạng hôn nhân của khách hàng trong tập dữ liệu này. Cụ thể, tỷ lệ khách hàng nữ (F) đã kết hôn (M) cao hơn so với tỷ lệ nữ độc thân (S), trong khi đó, nam giới (M) lại có xu hướng độc thân nhiều hơn. Điều này có thể phản ánh nhóm khách hàng nữ có xu hướng lập gia đình sớm hơn. Từ đây, siêu thị có thể phát triển nhiều sản phẩm dựa trên giới tính và hôn nhân.
Bảng tần suất chéo (contigency) cho Homeowner và Country như sau:
table_home_country <- table(a$Homeowner, a$Country)
table_home_country
##
## Canada Mexico USA
## N 320 1473 3822
## Y 489 2215 5740
Kết quả bảng tần suất giữa 2 biến như sau:
Đối với khách hàng có nhà ở, có 320 khách đến từ Canada, 1473 khách hàng đến từ Mexico và 3822 khách từ USA.
Đối với khách hàng không có nhà, có 489 người đến từ Canada, 2215 người đến từ Mexico và 5740 người đến từ USA
Tính toán tỷ lệ phần trăm theo hàng
prop.table(table_home_country, margin = 2)
##
## Canada Mexico USA
## N 0.3955501 0.3994035 0.3997072
## Y 0.6044499 0.6005965 0.6002928
Việc lựa chọn tính toán tỷ lệ phần trăm theo quốc gia nhằm tìm hiểu xu hướng sở hữu nhà của từng quốc gia.
Kết quả tính toán cho thấy:
Trong tổng số khách hàng ở Canada, 39,56% khách hàng có nhà ở và 60,44% khách hàng không có nhà.
Trong tổng số khách hàng ở Mexico, 39,94% khách hàng có nhà ở và 60,06% khách hàng không có nhà.
Trong tổng số khách hàng ở Mỹ (USA), 39,97% khách hàng có nhà ở và 60,03% khách hàng không có nhà.
a %>% ggplot(aes(x = Country, fill = Homeowner)) +
geom_bar(position = "dodge") +
labs(x = "Quốc gia", y = "Số lượng khách hàng", title = "Tình trạng nhà ở phân bổ theo quốc gia")
Nhận xét:
Biểu đồ trên thể hiện tình trạng nhà ở của khách hàng được phân bố theo ba quốc gia: Canada, Mexico và Hoa Kỳ (USA). Dễ dàng nhận thấy rằng ở cả hai nhóm khách hàng có nhà (Y) và không có nhà (N), số lượng khách hàng đến từ Hoa Kỳ luôn chiếm tỷ lệ cao nhất, trong đó nhóm có nhà ở chiếm ưu thế rõ rệt với 5740 người. Mexico đứng thứ hai về số lượng khách hàng ở cả hai nhóm, với số lượng khách hàng có nhà nhiều hơn so với không có nhà. Canada có số lượng khách hàng thấp nhất trong cả hai nhóm và chênh lệch giữa hai trạng thái nhà ở không quá lớn. Điều này cho thấy sự khác biệt đáng kể trong tình trạng nhà ở của khách hàng giữa các quốc gia, đặc biệt là Hoa Kỳ có tỷ lệ người sở hữu nhà cao hơn hẳn so với hai quốc gia còn lại.
Để kiểm tra mối quan hệ giữa Homeowner và Country, ta sử dụng kiểm định Chi-square Test để khẳng định mối quan hệ này:
Đặt giả thuyết:
H0: Homeowner và Country độc lập,
H1: Homeowner và Country có mối liên hệ nhau
chisq.test(table_home_country)
##
## Pearson's Chi-squared test
##
## data: table_home_country
## X-squared = 0.053742, df = 2, p-value = 0.9735
Kết quả kiểm định:
Giá trị Chi - bình phương: X-square = 0.053742,
Bậc tự do: df = 2,
Giá trị p_value = 0.9735.
Kết luận thống kê: Giá trị p_value = 0.0007485 > 0.05 nên ta chấp nhận giả thuyết H0. Vậy tình trạng nhà ở Homeower và quốc gia Country không có mối liên hệ với nhau (2 biến độc lập).
Bảng tần suất chéo (contigency) cho AnnualIncome và Homeowner như sau:
table_income_home <- table(a$AnnualIncome, a$Homeowner)
table_income_home
##
## N Y
## $10K - $30K 1359 1731
## $110K - $130K 119 524
## $130K - $150K 136 624
## $150K + 48 225
## $30K - $50K 2087 2514
## $50K - $70K 1063 1307
## $70K - $90K 686 1023
## $90K - $110K 117 496
Tính toán tỷ lệ phần trăm theo hàng:
prop.table(table_income_home, margin = 1)
##
## N Y
## $10K - $30K 0.4398058 0.5601942
## $110K - $130K 0.1850700 0.8149300
## $130K - $150K 0.1789474 0.8210526
## $150K + 0.1758242 0.8241758
## $30K - $50K 0.4535970 0.5464030
## $50K - $70K 0.4485232 0.5514768
## $70K - $90K 0.4014043 0.5985957
## $90K - $110K 0.1908646 0.8091354
Việc lựa chọn tính toán tỷ lệ phần trăm sở hữu nhà theo thu nhập hằng nhập hằng năm của khách hàng nhằm thấy xu hướng sở hữu nhà.
Kết quả tính toán cho thấy:
Kết quả cho thấy, tỷ lệ người sở hữu nhà (Y) có xu hướng tăng đáng kể ở các mức thu nhập cao hơn. Cụ thể, ở nhóm thu nhập từ $110K – $130K, có tới 81.49% người thuộc nhóm này sở hữu nhà; các nhóm $130K – $150K và $150K+ cũng duy trì tỷ lệ rất cao, lần lượt là 82.11% và 82.42%. Ngược lại, ở nhóm thu nhập thấp từ $10K – $30K, tỷ lệ người sở hữu nhà chỉ là 56.02%; Các nhóm thu nhập từ $30K - $50K, $50K - $70K, $70K - $90K và $90K - $110K có tỷ lệ sở hữu nhà lần lượt là: 54,64%, 55,15%, 59,86% và 80,91%.
a %>% ggplot(aes(x = AnnualIncome, fill = Homeowner)) +
geom_bar(position = "dodge") +
labs(x = "Thu nhập hàng năm", y = "Số lượng khách hàng", title = "Tình trạng nhà ở phân bổ theo thu nhập") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nhận xét:
Biểu đồ trên mô tả tình trạng nhà ở của khách hàng được phân bố theo các nhóm thu nhập hàng năm. Nhìn chung, số lượng khách hàng sở hữu nhà (màu xanh) có xu hướng cao hơn so với nhóm không sở hữu nhà (màu đỏ) ở hầu hết các mức thu nhập.Ở tất cả các mức thu nhập, số lượng khách hàng có nhà ở đều cao hơn so với nhóm không có nhà ở. Nhóm thu nhập từ $30K–$50K có số lượng khách hàng đông nhất, cả ở hai trạng thái có và không có nhà, trong đó khách hàng có nhà chiếm ưu thế rõ rệt. Tương tự, ở các nhóm thu nhập từ $50K–$70K và $70K–$90K, số lượng khách hàng có nhà cũng vượt trội hơn. Đáng chú ý, ngay cả ở các mức thu nhập thấp như $10K–$30K hay cao như trên $150K, số lượng khách hàng có nhà vẫn nhiều hơn nhóm không có nhà. Điều này cho thấy rằng dù thu nhập có ảnh hưởng đến tình trạng nhà ở, nhưng không phải là yếu tố duy nhất quyết định, và việc sở hữu nhà diễn ra ở mọi phân khúc thu nhập
Để kiểm tra mối quan hệ giữa Homeowner và AnnualIncome, ta sử dụng kiểm định Chi-square Test để khẳng định mối quan hệ này:
Đặt giả thuyết:
H0: Homeowner và AnnualIncome độc lập,
H1: Homeowner và AnnualIncome có mối liên hệ nhau
chisq.test(table_income_home)
##
## Pearson's Chi-squared test
##
## data: table_income_home
## X-squared = 546.37, df = 7, p-value < 2.2e-16
Kết quả kiểm định:
Giá trị Chi - bình phương: X-square = 546.37,
Bậc tự do: df = 7,
Giá trị p_value < 2.2e - 16.
Kết luận thống kê: Giá trị p_value < 2.2e - 16 nhỏ hơn rất nhiều so với mức ý nghĩa 0.05 nên ta bác bỏ giả thuyết H0. Vậy thu nhập hằng năm AnnualIncome và tình trạng nhà ở Homeower có mối liên hệ với nhau.
Dựa trên biểu đồ phân bố nhà ở theo thu nhập và kết quả kiểm định Chi-bình phương, có thể thấy rõ ràng rằng thu nhập có ảnh hưởng đến tình trạng nhà ở của khách hàng trong tập dữ liệu này. Cụ thể, thu nhập càng tăng thì tỷ lệ sở hữu nhà càng cao.Một khách hàng có thu nhập cao thường có điều kiện kinh tế tốt hơn để sở hữu bất động sản. Mối quan hệ này cũng phản ánh một xu hướng tiêu dùng và tài chính đáng chú ý, giúp doanh nghiệp có thể xác định những phân khúc khách hàng tiềm năng trong các chiến lược bán hàng, tiếp thị hoặc cung cấp dịch vụ tài chính như cho vay mua nhà.
Dựa trên phân tích một số biến định tính trong bộ dữ liệu khách hàng của siêu thị, một số hiểu biết quan trọng có thể rút ra như sau:
Giới tính khách hàng (Gender): có sự phân bổ đồng đều giữa nam và nữ, cho thấy siêu thị thu hút cả hai giới gần như ngang nhau, không có sự thiên lệch rõ rệt.
Tương tự như giới tính, tình trạng hôn nhân (MaritalStatus) của khách hàng tại siêu thị khá đều, mặc dù tỷ lệ khách hàng độc thân chiếm ưu thế nhẹ. Khi phân tích mối quan hệ giữa giới tính và hôn nhân, kết quả cho thấy nữ giới có xu hướng kết hôn nhiều hơn so với nam giới.
Thu nhập của khách hàng tại thu nhập đa dạng trong nhiều khoảng, thu nhập này có mối liên hệ tới việc sở hữu nhà của mỗi người khách. Đặc biệt tại các quốc gia lớn như Hoa Kỳ (USA) việc sở hữu nhà cũng lớn hơn 2 quốc gia còn lại là Mexico và Canada.
Hạn chế của phân tích là giới hạn phân tích một số biến định tính gây ra giới hạn trong việc hiểu rõ hành vi mua sắm của khách hàng. Cụ thể, việc bỏ qua các biến định lượng như giá trị đơn hàng, số lượng mua hàng hay số con của khách hàng khiến cho bức tranh toàn diện về hành vi tiêu dùng chưa được phản ánh đầy đủ. Ngoài ra, dữ liệu phân tích không thể hiện rõ yếu tố mùa vụ dù thực tế nhân tố này cũng ảnh hưởng đến hành vi mua sắm.
Dựa trên các đặc điểm định tính đã phân tích, siêu thị có thể xây dựng một số chiến lược marketing nhằm tối ưu hóa hoạt động kinh doanh và tăng cường hiệu quả tiếp cận khách hàng mục tiêu. Trước hết, với sự phân bố đồng đều giữa nam và nữ, siêu thị nên duy trì chiến lược tiếp thị trung tính về giới, đồng thời có thể thiết kế các chương trình ưu đãi hoặc sản phẩm phù hợp hơn với từng nhóm giới tính và tình trạng hôn nhân – chẳng hạn, các gói mua sắm gia đình dành cho nhóm khách hàng đã kết hôn, và các sản phẩm tiện lợi, cá nhân hóa cho khách hàng độc thân. Ngoài ra, sự khác biệt về thu nhập và tỷ lệ sở hữu nhà theo quốc gia gợi ý rằng siêu thị nên phân loại khách hàng theo mức thu nhập và khu vực địa lý để đưa ra các gói sản phẩm, mức giá hoặc ưu đãi phù hợp. Tại Hoa Kỳ – nơi tỷ lệ sở hữu nhà cao – siêu thị có thể đẩy mạnh các mặt hàng gia dụng, thiết bị nội thất hoặc các chương trình tích điểm dài hạn. Ngược lại, tại các khu vực như Mexico hoặc Canada, nơi mức độ sở hữu nhà thấp hơn, nên ưu tiên các sản phẩm tiêu dùng nhanh, tiện lợi và linh hoạt về giá cả.
Một số câu hỏi và hướng nghiên cứu nếu có thời gian và dữ liệu bổ sung như sau:
Liệu có mối quan hệ giữa trình độ học vấn, ngành nghề hoặc độ tuổi với hành vi tiêu dùng và mức thu nhập của khách hàng không?
Khách hàng có xu hướng mua sắm vào thời điểm nào trong ngày, trong tuần hoặc theo mùa vụ; mùa vụ có ảnh hưởng tới hiệu quả bán hàng hay không?
Có sự khác biệt đáng kể về hành vi tiêu dùng của khách hàng giữa các quốc gia (Mỹ, Canada, Mexico) không?
Nếu kết hợp với các biến định lượng như giá trị đơn hàng hoặc tần suất mua hàng, siêu thị có thể xây dựng phân khúc khách hàng được không?