Bộ dữ liệu Taco Sales mô phỏng dữ liệu bán hàng Taco của các nhà hàng trên nhiều thành phố Hoa Kỳ từ ngày 01/01/2024 đến ngày 25/05/2025. Bộ dữ liệu được thu thập và công bố tại https://www.kaggle.com/datasets/atharvasoundankar/taco-sales-dataset-20242025
# Tải và đọc file dữ liệu
sl <- read.csv("D:/AnhThu/DATA_DT/Taco Sales.csv")
sl
# Xem cấu trúc của bộ dữ liệu
str(sl)
## 'data.frame': 1000 obs. of 13 variables:
## $ Order.ID : int 770487 671858 688508 944962 476417 678856 183667 379946 771088 694731 ...
## $ Restaurant.Name : chr "El Taco Loco" "El Taco Loco" "Taco Haven" "Spicy Taco House" ...
## $ Location : chr "New York" "San Antonio" "Austin" "Dallas" ...
## $ Order.Time : chr "01-08-2024 14:55" "23-11-2024 17:11" "21-11-2024 20:24" "21-09-2024 06:43" ...
## $ Delivery.Time : chr "01-08-2024 15:36" "23-11-2024 17:25" "21-11-2024 21:02" "21-09-2024 07:28" ...
## $ Delivery.Duration..min.: int 41 14 38 45 15 83 45 31 17 73 ...
## $ Taco.Size : chr "Regular" "Regular" "Large" "Regular" ...
## $ Taco.Type : chr "Chicken Taco" "Beef Taco" "Pork Taco" "Chicken Taco" ...
## $ Toppings.Count : int 5 1 2 2 0 0 1 3 2 1 ...
## $ Distance..km. : num 3.01 6.2 20.33 3 24.34 ...
## $ Price.... : num 9.25 4.25 7 5.5 4.5 3 5.75 6.75 5.5 5.75 ...
## $ Tip.... : num 2.22 3.01 0.02 1.9 1.14 2.32 0.63 2.97 0.33 1.23 ...
## $ Weekend.Order : logi FALSE TRUE FALSE TRUE FALSE FALSE ...
Bộ dữ liệu là data frame, bao gồm 1000 quan sát và 13 biến. Bộ dữ liệu bao gồm các biến sau:
Order.ID: Mã đơn hàng,
Restaurant.Name: Tên nhà hàng Taco,
Location: Nơi đặt hành,
Order.Time: Thời điểm đặt hàng,
Delivery.Time: Thời điểm giao hàng,
Delivery.Duration.min: Thời gian giao hàng (phút),
Taco.Size: Kích cỡ bánh Taco,
Taco.Type: Loại bánh Taco,
Toppings.Count: Số lượng topping được thêm vào Taco,
Distance (km): Khoảng cách từ nhà hàng đến khách hàng,
Price ($): Giá bánh Taco,
Tip ($): Số tiền khách hành boa,
Weekend.Order: Đơn đặt hàng vào cuối tuần.
Ở bài này, các biến định tính được lựa chọn để phân tích, bao gồm: Restaurant.Name, Location, Taco.Size, Taco.Type và Weekend.Order. Ta tiến hành kiểm tra xem có giá trị bị thiếu (NA) trong các biến định tính.
# Rút trích các dữ liệu định tính
sales <- select(sl, c("Restaurant.Name", "Location", "Taco.Size", "Taco.Type", "Weekend.Order"))
# Kiểm tra số lượng giá trị bị thiếu (NA)
sum(is.na(sales))
## [1] 0
is.na() tạo ra một bảng giá trị TRUE nếu
giá trị bị thiếu (NA), FALSE nếu không bị NA. Kết quả sum()
cho biết số lượng TRUE, tức là đếm số ô bị thiếu dữ liệu.Dựa vào kết quả kiểm tra = 0, cho thấy không có giá trị bị thiếu (NA) trong các biến định tính của bộ dữ liệu.
Bảng tần số thể hiện nhà hàng Taco:
# Đếm số lượng các nhà hàng
table(sales$Restaurant.Name)
##
## Casa del Taco El Taco Loco Grande Tacos La Vida Taco
## 104 85 106 98
## Spicy Taco House Taco Fiesta Taco Haven Taco Time Express
## 100 99 95 91
## The Taco Stand Urban Tacos
## 105 117
# Trực quan hóa dữ liệu
sales %>% group_by(Restaurant.Name) %>% summarise(n = n()) %>%
ggplot(aes(x = Restaurant.Name, y = n)) +
geom_col(fill='pink') +
coord_flip() +
labs(x = "Nhà hàng", y = "Số lượng đơn hàng", title = "Phân bổ số lượng đơn hàng theo nhà hàng")
Nhận xét:
Dựa vào bảng tần số và biểu đồ cho thấy sự chênh lệch đáng kể về số lượng đơn hàng giữa các nhà hàng ở Hoa Kỳ. Cụ thể:
Trong số 1000 quan sát, tương ứng với 1000 đơn hàng, có 104 đơn hàng từ nhà hàng Casa del Taco, 85 đơn từ El Taco Loco, 106 đơn từ Grande Tacos, 98 đơn từ La Vida Taco, 100 đơn từ Spicy Taco House, 99 đơn từ Taco Fiesta, 95 đơn từ Taco Haven, 91 đơn từ Taco Time Express, 105 đơn từ The Taco Stand và 117 đơn từ Urban Tacos.
“Urban Tacos”, “Grande Tacos”, “The Taco Stand” và “Casa del Taco” lần lượt là những chuỗi nhà hàng có hoạt động tích cực, số lượng đơn hàng lớn so với các nhà hàng còn lại, điều này có thể phản ánh chất lượng và dịch vụ của nhà hàng. Trong khi đó, nhà hàng “El Taco Loco” có đơn hàng ít nhất, cho thấy nhà hàng có quy mô nhỏ hơn, hoặc ít phổ biến trong khu vực. Các nhà hàng còn lại có số lượng đơn hàng tương đối ổn định, ở mức trung bình.
Bảng tần số thể hiện nơi đặt hàng:
# Đếm số lượng địa chỉ đặt hàng
table(sales$Location)
##
## Austin Chicago Dallas Houston Los Angeles New York
## 95 116 80 101 101 96
## Phoenix San Antonio San Diego San Jose
## 99 113 101 98
# Trực quan hóa dữ liệu
sales %>% group_by(Location) %>% summarise(n = n()) %>%
ggplot(aes(x = Location, y = n)) +
geom_col(fill = 'orange') +
coord_flip() +
labs(x = "Thành phố", y = "Số lượng đơn hàng", title = "Số lượng đơn hàng phân bổ theo nơi đặt hàng")
Nhận xét:
Dựa vào bảng tần số và biểu đồ cho thấy: Trong số 1000 quan sát, tương ứng 1000 đơn hàng, có 95 đơn hàng ở Austin, 116 đơn hàng ở Chicago, 80 đơn ở Dallas, 101 đơn hàng ở Houston, San Diego và Los Angeles, 96 đơn hàng ở New York, 99 đơn hàng ở Phoenix San, 113 đơn hàng ở San Diego, và 98 đơn hàng ở San Jose.
Chicago và San Antonio là hai thị trường lớn nhất, với số lượng đơn hàng vượt trội so với các thành phố khác. Theo sau đó, lần lượt là các thành phố Houston, San Diego và Los Angeles, Phoenix San, San Jose, New York, Austin, Dallas.
Bảng tần số kích cỡ Taco:
# Bảng tần số
table(sales$Taco.Size)
##
## Large Regular
## 498 502
# Bảng tần suất kích cỡ Taco
table(sales$Taco.Size)/sum(nrow(sales))
##
## Large Regular
## 0.498 0.502
# Trực quan hóa dữ liệu
sales %>% group_by(Taco.Size) %>% summarise(n = n()) %>%
mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>%
ggplot(aes(x = "", y = n, fill = Taco.Size)) +
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 kích cỡ Taco") +
theme_void()
Nhận xét:
Taco bán ở Hoa Kỳ có 2 kích cỡ, trong đó có 498 đơn hàng bánh cỡ lớn (Large) và 502 đơn hàng bánh cỡ thường (Regular). Như vậy, tỷ lệ 2 loại kích cỡ tương đương nhau, số lượng phân bổ khá đồng đều, có 49,8% là Taco cỡ lớn và 50,2% Taco cỡ thường.
Bảng tần số loại Taco:
# Bảng tần số
table(sales$Taco.Type)
##
## Beef Taco Chicken Taco Fish Taco Pork Taco Veggie Taco
## 182 218 211 192 197
# Trực quan hóa dữ liệu
ggplot(sales, aes(x = Taco.Type, fill = Taco.Type)) +
geom_bar() +
labs(x = "Loại Taco", y = "Số lượng đơn hàng", title = "Biểu đồ tần số các loại Taco")
Nhận xét:
Các loại Taco được bán bao gồm: Beef Taco (182 đơn hàng), Chicken Taco (218 đơn hàng), Fish Taco (211 đơn hàng), Pork Taco (192 đơn hàng) và Veggie Taco (197 đơn). Biểu đồ tần số cho thấy sự phân bổ đồng đều giữa các loại Taco, trong đó Chicken Taco là loại phổ biến nhất.
Bảng tần số đơn hàng cuối tuần và trong tuần:
# Bảng tần số
table(sales$Weekend.Order)
##
## FALSE TRUE
## 725 275
# Bảng tần suất
table(sales$Weekend.Order)/sum(nrow(sales))
##
## FALSE TRUE
## 0.725 0.275
# Trực quan hóa dữ liệu
sales %>% group_by(Weekend.Order) %>% summarise(n = n()) %>%
mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>%
ggplot(aes(x = "", y = n, fill = Weekend.Order)) +
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 đơn đặt hàng của 1 tuần") +
theme_void()
Nhận xét:
Biến Weekend.Order thể hiện đơn đặt hàng của mỗi tuần, trong đó TRUE thể hiện có đơn đặt hàng vào cuối tuần và FALSE là đơn đặt hàng trong tuần. Dựa vào bảng tần suất và biểu đồ, ta thấy số lượng đơn hàng trong tuần gấp 2,6 lần đơn đặt hàng vào cuối tuần. Trong bộ dữ liệu này, số lượng đơn hàng vào cuối tuần (TRUE) chiếm khoảng 27,5% và 72,5% còn lại là các đơn hàng trong tuần.
Với độ tin cậy 95%, tỷ lệ của hạng mục “Los Angeles” trong tổng thể được thể hiện như sau:
# Số lượng địa điểm đặt hàng là Los Angeles
Los <- sum(sales$Location == "Los Angeles")
# Tổng số đơn hàng
total <- nrow(sales)
# Ước lượng khoảng tin cậy 95%
prop.test(Los, total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: Los out of total, null probability 0.5
## X-squared = 635.21, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.08336666 0.12176842
## sample estimates:
## p
## 0.101
Ý nghĩa: Tỷ lệ địa điểm đặt hàng là Los Angeles trong tập đơn hàng là 10,1%. Với độ tin cậy 95%, tỷ lệ địa điểm đặt hàng trong toàn bộ đơn hàng nằm trong khoảng 8,34% đến 12,18%.
Kiểm định giả thuyết:
Đặt giả thuyết:
H0: p = 0.2
H1: p ≠ 0.2
prop.test(Los, total, p = 0.2, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: Los out of total, null probability 0.2
## X-squared = 60.639, df = 1, p-value = 6.856e-15
## alternative hypothesis: true p is not equal to 0.2
## 95 percent confidence interval:
## 0.08336666 0.12176842
## sample estimates:
## p
## 0.101
Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 6.856e - 15 < 0.05 . Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Los Angeles không phải là 20% mà là nằm trong khoảng tin cậy [8,34%, 12,18%].
Hạng mục “Chicken Taco” của biến Taco.Type
Với độ tin cậy 95%, tỷ lệ của hạng mục “Chicken Taco” trong tổng thể được thể hiện như sau:
# Số lượng địa điểm đặt hàng là Los Angeles
chicken <- sum(sales$Taco.Type == "Chicken Taco")
# Ước lượng khoảng tin cậy 95%
prop.test(chicken, total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: chicken out of total, null probability 0.5
## X-squared = 316.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1930378 0.2451626
## sample estimates:
## p
## 0.218
Ý nghĩa: Tỷ lệ taco loại Chicken Taco trong tập đơn hàng là 21,8%. Với độ tin cậy 95%, tỷ lệ Chicken Taco trong toàn bộ đơn hàng nằm trong khoảng 19,3% đến 24,52%.
Kiểm định giả thuyết:
Đặt giả thuyết:
H0: p = 0.5
H1: p ≠ 0.5
prop.test(chicken, total, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: chicken out of total, null probability 0.5
## X-squared = 316.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1930378 0.2451626
## sample estimates:
## p
## 0.218
Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 2.2e - 16 < 0.05 . Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Chicken Taco không phải là 50% mà là nằm trong khoảng tin cậy [19,3%, 24,52%].
Hai biến Location và Taco.Size được lựa chọn để phân tích lựa chọn kích cỡ Taco có sự khác biệt gì giữa các thành phố hay không.
Bảng tần suất thể hiện tỷ lệ kích cỡ Taco theo từng thành phố như sau:
# Bảng tần số Kích cỡ và thành phố
table_loc_size <- table(sales$Location, sales$Taco.Size)
# Tính tỷ lệ % theo từng thành phố
tyle <- round(prop.table(table_loc_size, margin = 1)*100,2)
tyle
##
## Large Regular
## Austin 38.95 61.05
## Chicago 56.03 43.97
## Dallas 42.50 57.50
## Houston 52.48 47.52
## Los Angeles 62.38 37.62
## New York 50.00 50.00
## Phoenix 46.46 53.54
## San Antonio 50.44 49.56
## San Diego 40.59 59.41
## San Jose 55.10 44.90
Diễn giải kết quả: Bảng tần suất cho biết, tại mỗi thành phố cụ thể có bao nhiêu % đơn hàng là cỡ lớn và cỡ thường. Dựa vào bảng tần suất có sự khác biệt giữa các thành phố. Los Angeles nổi bật với 62,38% đơn hàng là Taco cỡ lớn, trong khi đó khách hàng ở Austin ưa thích Taco cỡ thường hơn (chỉ 38,95% đơn hàng cỡ lớn).
Biểu đồ thể hiện tỷ lệ kích cỡ Taco với Location
ggplot(sales, aes(x = Location, fill = Taco.Size)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "Tỷ lệ kích thước Taco theo thành phố", x = "Thành phố", y = "Tỷ lệ phần trăm") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Giải thích câu lệnh:
| Thành phần | Ý nghĩa |
|---|---|
aes(x = Location, fill = Taco.Size) |
Chia cột theo kích thước taco ở từng địa điểm |
geom_bar(position = "fill") |
Biểu đồ cột tỷ lệ (mỗi cột cao 100%) |
scale_y_continuous(labels = percent_format()) |
Hiển thị trục y dưới dạng phần trăm |
Để kiểm tra mối quan hệ giữa Location và Taco.Size, ta sử dụng kiểm định Chi-square test để khẳng định mối quan hệ này.
Đặt giả thuyết:
H0: Location và Taco.Size độc lập,
H1: Location và Taco.Size có liên quan
chisq.test(table_loc_size)
##
## Pearson's Chi-squared test
##
## data: table_loc_size
## X-squared = 19.65, df = 9, p-value = 0.0202
Kết luận thống kê: Giá trị p_value = 0.0202 < 0.05 nên ta bác bỏ giả thuyết H0. Vậy địa chỉ đặt hàng Location và kích cỡ Taco Taco.Size có mối liên hệ với nhau.
Vì Relative Risk chỉ thực hiện được cho 2 biến định tính nhị phân, hay dữ liệu bảng 2x2. Do đó, ta tiến hành xét thành phố Los Angeles, New York và kích cỡ Large/Regular
# Lọc dữ liệu
sales_2x2 <- sales %>% filter(Location == "Los Angeles"| Location == "New York")
# Bảng tần số chéo
table_2x2 <- table(sales_2x2$Location, sales_2x2$Taco.Size)
table_2x2
##
## Large Regular
## Los Angeles 63 38
## New York 48 48
# Tính rủi ro tương đối chọn Taco cỡ lớn giữa 2 thành phố
RelRisk(table_2x2)
## [1] 1.247525
Diễn giải: Kết quả tính toán Relative Risk (RR) giữa 2 thành phố L.A, New York và 2 kích cỡ Large, Regular cho thấy RR = 1,24725. Nghĩa là tỷ lệ Taco cỡ lớn ở Los Angeles cao hơn khoảng 1,25 lần so với ở New York hay người ở Los Angeles có xu hướng chọn Taco cỡ lớn nhiều hơn so với người ở New York.
# Tính relative risk chọn Taco cỡ thường đối với 2 thành phố
riskratio(table_2x2)
## $data
##
## Large Regular Total
## Los Angeles 63 38 101
## New York 48 48 96
## Total 111 86 197
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Los Angeles 1.000000 NA NA
## New York 1.328947 0.9640028 1.83205
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Los Angeles NA NA NA
## New York 0.08290087 0.08650859 0.08000065
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Kết quả:
Tỷ lệ chọn Taco cỡ thường tại New York cao hơn tại L.A với RR = 1,3289. Nghĩa là khách hàng ở New York có xu hướng chọn Taco cỡ thường cao hơn khoảng 32.89% so với khách hàng ở Los Angeles.
Khoảng tin cậy 95% của RR nằm trong khoảng [0.964; 1,832], bao gồm giá trị 1.
Kết quả kiểm định mid-p exact, Fisher’s exact test và kiểm định Chi-squared đều cho ra kết quả p_value > 0.05
Ý nghĩa: Kết quả cho thấy khách hàng ở New York có xu hướng chọn Taco cỡ Regular nhiều hơn so với Los Angeles, nhưng sự khác biệt này không có ý nghĩa thống kê, do đó chưa đủ cơ sở khẳng định có mối liên hệ rõ ràng giữa địa điểm và kích thước Taco ưa thích.
oddsratio(table_2x2)
## $data
##
## Large Regular Total
## Los Angeles 63 38 101
## New York 48 48 96
## Total 111 86 197
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Los Angeles 1.000000 NA NA
## New York 1.652192 0.9368725 2.933679
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Los Angeles NA NA NA
## New York 0.08290087 0.08650859 0.08000065
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Kết quả:
Tỷ lệ chênh Odds Ratio = 1,652, tức là tỷ lệ bánh Taco loại lớn (so với loại thường) ở New York cao hơn ở Los Angeles khoảng 65,2%.
Khoảng tin cậy 95% nằm trong khoảng [0.934; 2,934]. Tuy nhiên khoảng tin cậy 95% bao gồm giá trị 1, nên sự khác biệt tỷ lệ không có ý nghĩa thống kê ở mức ý nghĩa 0.05.
Kết quả kiểm định mid-p exact, Fisher’s exact test và kiểm định Chi-squared đều cho ra kết quả p_value > 0.05.
Ý nghĩa: Kết quả cho thấy tỷ lệ khách hàng ở New York có xu hướng chọn Taco cỡ Large (so với cỡ Regular) nhiều hơn so với Los Angeles, nhưng sự khác biệt này không có ý nghĩa thống kê, do đó chưa đủ cơ sở khẳng định rằng có sự khác biệt thực sự về tỷ lệ lựa chọn taco cỡ lớn giữa hai thành phố.