# Đọc dữ liệu
data <- read.csv("C:/Users/Welcome !/OneDrive - UFM/Desktop/CarSales.csv")
str(data)
## 'data.frame': 269 obs. of 10 variables:
## $ SalePrice : int 95000 130000 75000 68500 110000 102500 120000 89000 178500 130000 ...
## $ TotalDiscount : num 500 0 0 0 0 1750 0 0 950 0 ...
## $ DeliveryCharge: int 750 1000 1000 1000 1750 500 1500 1000 1750 1000 ...
## $ Make : chr "Rolls Royce" "Aston Martin" "Aston Martin" "Aston Martin" ...
## $ VehicleType : chr "Saloon" "Coupe" "Coupe" "Coupe" ...
## $ CostPrice : int 50000 15500 75890 99000 62000 62000 75000 88000 75890 62000 ...
## $ Color : chr "Red" "Blue" "Silver" "Night Blue" ...
## $ ClientType : chr "Wholesaler" "Wholesaler" "Wholesaler" "Wholesaler" ...
## $ ClientSize : chr "Large" "Large" "Large" "Large" ...
## $ CountryName : chr "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
Bộ dữ liệu gồm 269 quan sát và 10 biến liên quan đến thông tin bán hàng của các loại xe, bao gồm thông tin giá cả, loại xe, nhà sản xuất, đặc điểm khách hàng và quốc gia mua hàng.
Các biến trong bộ dữ liệu:
SalePrice (int): Giá bán của xe (tính bằng đơn vị tiền tệ nhất định).
TotalDiscount (float): Tổng mức chiết khấu được áp dụng cho mỗi xe.
DeliveryCharge (int): Phí giao hàng.
Make (object): Hãng sản xuất xe (ví dụ: Rolls Royce, Aston Martin, Jaguar…).
VehicleType (object): Loại xe (Coupe, Saloon, SUV).
CostPrice (int): Giá vốn của xe.
Color (object): Màu sắc của xe.
ClientType (object): Loại khách hàng (Dealer hoặc Wholesaler).
CountryName (object): Quốc gia nơi xe được bán (ví dụ: United Kingdom, Germany…).
head(data)
## SalePrice TotalDiscount DeliveryCharge Make VehicleType CostPrice
## 1 95000 500 750 Rolls Royce Saloon 50000
## 2 130000 0 1000 Aston Martin Coupe 15500
## 3 75000 0 1000 Aston Martin Coupe 75890
## 4 68500 0 1000 Aston Martin Coupe 99000
## 5 110000 0 1750 Rolls Royce Saloon 62000
## 6 102500 1750 500 Rolls Royce Saloon 62000
## Color ClientType ClientSize CountryName
## 1 Red Wholesaler Large United Kingdom
## 2 Blue Wholesaler Large United Kingdom
## 3 Silver Wholesaler Large United Kingdom
## 4 Night Blue Wholesaler Large United Kingdom
## 5 Red Wholesaler Large United Kingdom
## 6 Black Wholesaler Large United Kingdom
tail(data)
## SalePrice TotalDiscount DeliveryCharge Make VehicleType CostPrice
## 264 25250 200 25 Triumph Coupe 22000
## 265 28000 200 50 Triumph Coupe 22000
## 266 25250 200 25 Triumph Coupe 22000
## 267 28000 200 25 Triumph Coupe 22000
## 268 28000 200 25 Triumph Coupe 22000
## 269 28000 200 25 Triumph Coupe 22000
## Color ClientType ClientSize CountryName
## 264 Canary Yellow Dealer Small United Kingdom
## 265 Blue Dealer Large United Kingdom
## 266 Blue Dealer Small United Kingdom
## 267 Red Wholesaler Large United Kingdom
## 268 Red Dealer Small United Kingdom
## 269 Green Dealer Large United Kingdom
any(is.na(data))
## [1] FALSE
Kết quả trả về FALSE nghĩa là không có bất kỳ giá trị thiếu (NA) nào trong toàn bộ dataframe
data[] <- lapply(data, function(x) if (is.character(x)) as.factor(x) else x)
qual_data <- data[sapply(data, is.factor)]
Đoạn code trên dùng để tự động chuyển tất cả các cột có kiểu dữ liệu character trong dataframe data sang kiểu factor. Việc này rất quan trọng vì các biến dạng chữ thường biểu thị cho dữ liệu phân loại, và khi được chuyển thành factor, R sẽ hiểu đúng bản chất của chúng như các nhóm hoặc mức phân loại riêng biệt. Điều này giúp các mô hình thống kê và phân tích sau đó xử lý chính xác hơn các biến này, đồng thời hỗ trợ việc phân tích và trực quan hóa dữ liệu dễ dàng hơn.
# Tạo bảng tần số cho biến MAKE
freq_tableMake <- table(qual_data$Make)
# Tính tỷ lệ phần trăm
percent_tableMake <- prop.table(freq_tableMake) * 100
## Tần số các quan sát của biến Make :
##
## Aston Martin Bentley Jaguar MGB Rolls Royce Triumph
## 44 48 85 24 34 23
## TVR
## 11
## Tỷ lệ phần trăm các quan sát của biến Make:
##
## Aston Martin Bentley Jaguar MGB Rolls Royce Triumph
## 16.36 17.84 31.60 8.92 12.64 8.55
## TVR
## 4.09
library(ggplot2)
# Chuyển table thành dataframe để dùng ggplot2
df <- as.data.frame(freq_tableMake)
colnames(df) <- c("Make", "Freq")
# Đặt thứ tự hãng xe theo yêu cầu của bạn
brands_order <- c("Aston Martin", "Bentley", "Jaguar", "MGB", "Rolls Royce", "Triumph", "TVR")
df$Make <- factor(df$Make, levels = brands_order)
# Màu sắc tùy chỉnh cho từng hãng (bạn đổi màu tùy ý)
colors <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2")
# Vẽ biểu đồ cột với ggplot2
ggplot(df, aes(x = Make, y = Freq, fill = Make)) +
geom_col() +
geom_text(aes(label = Freq), vjust = -0.3) + # Hiển thị số liệu trên đỉnh cột
scale_fill_manual(values = colors) + # Gán màu tùy chỉnh theo hãng
labs(title = " Số lượng các xe bán được theo nhãn hiệu ", y = "Số lượng", x = "Hãng xe") +
theme_minimal() +
theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
Hãng Jaguar có số lượng xe bán ra cao nhất, với 85 xe, chiếm tỷ trọng lớn nhất trong toàn bộ dữ liệu. Điều này cho thấy Jaguar có sức tiêu thụ mạnh nhất trong số các hãng được khảo sát. Bentley và Aston Martin lần lượt xếp thứ hai và ba với 48 và 44 xe được bán ra. Đây là hai hãng cũng có thị phần đáng kể. Rolls Royce đứng ở mức trung bình với 34 xe bán ra. MGB, Triumph và TVR là các hãng có lượng tiêu thụ thấp hơn, đặc biệt TVR chỉ bán được 11 xe, thấp nhất trong tất cả các hãng. Cơ cấu bán hàng không đồng đều giữa các hãng xe, trong đó Jaguar là hãng vượt trội, có thể do chiến lược marketing tốt, giá cả hợp lý hoặc độ phổ biến thương hiệu cao hơn. Các hãng có lượng xe bán thấp như TVR hoặc Triumph có thể đang gặp khó khăn trong cạnh tranh thị trường, hoặc có thể đang nhắm tới một phân khúc khách hàng hẹp hơn.
# Tạo bảng tần số
freq_tableVehicleType <- table(qual_data$VehicleType)
# Tính tỷ lệ phần trăm
percent_tableVehicleType <- prop.table(freq_tableVehicleType) * 100
## Tần số các quan sát của biến VehicleType :
##
## Convertible Coupe Saloon
## 16 137 116
## Tỷ lệ phần trăm các quan sát của biến VehicleType:
##
## Convertible Coupe Saloon
## 5.95 50.93 43.12
# Chuyển bảng tần số thành data frame
df_vehicle <- as.data.frame(freq_tableVehicleType)
colnames(df_vehicle) <- c("VehicleType", "Frequency")
# Vẽ biểu đồ cột
library(ggplot2)
ggplot(df_vehicle, aes(x = VehicleType, y = Frequency, fill = VehicleType)) +
geom_bar(stat = "identity") +
geom_text(aes(label = Frequency), vjust = -0.5) +
labs(title = "Tần số theo loại xe (VehicleType)", x = "Loại xe", y = "Tần số") +
theme_minimal() +
theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
Loại Coupe chiếm ưu thế rõ rệt với 137 xe, là loại xe được bán nhiều nhất trong bộ dữ liệu, cho thấy đây là kiểu xe được ưa chuộng nhất. Saloon cũng có lượng tiêu thụ cao, với 116 xe – tuy ít hơn Coupe, nhưng vẫn thể hiện nhu cầu khá lớn từ người mua. Convertible có số lượng thấp nhất, chỉ 16 xe, cho thấy loại xe mui trần này ít phổ biến hơn, có thể do đặc điểm khí hậu, giá thành, hoặc nhu cầu sử dụng thực tế không cao. Coupe và Saloon là hai dòng xe chính được người tiêu dùng ưa chuộng. Convertible dường như là dòng xe có tính đặc thù và chỉ phù hợp với một nhóm khách hàng nhỏ. Do đó, các nhà sản xuất hoặc đại lý có thể cân nhắc tập trung vào hai phân khúc chính là Coupe và Saloon để tối ưu hóa doanh số và lợi nhuận.
# Tạo bảng tần số
freq_tableColor <- table(qual_data$Color)
# Tính tỷ lệ phần trăm
percent_tableColor <- prop.table(freq_tableColor) * 100
## Tần số các quan sát của biến Color :
##
## Black Blue British Racing Green
## 22 34 27
## Canary Yellow Dark Purple Green
## 42 23 22
## Night Blue Red Silver
## 20 49 30
## Tỷ lệ phần trăm các quan sát của biến Color:
##
## Black Blue British Racing Green
## 8.18 12.64 10.04
## Canary Yellow Dark Purple Green
## 15.61 8.55 8.18
## Night Blue Red Silver
## 7.43 18.22 11.15
# Chuyển bảng tần số thành data frame
df_color <- as.data.frame(freq_tableColor)
colnames(df_color) <- c("Color", "Frequency")
# Tạo một bảng ánh xạ giữa Color và mã màu thực tế
color_map <- c(
"Black" = "black",
"Blue" = "blue",
"British Racing Green" = "#004225",
"Canary Yellow" = "yellow",
"Dark Purple" = "#301934",
"Green" = "green",
"Night Blue" = "#191970",
"Red" = "red",
"Silver" = "gray"
)
# Vẽ biểu đồ cột
library(ggplot2)
ggplot(df_color, aes(x = Color, y = Frequency, fill = Color)) +
geom_bar(stat = "identity") +
scale_fill_manual(values = color_map) +
geom_text(aes(label = Frequency), vjust = -0.5) +
labs(title = "Tần số xe bán ra theo màu sắc", x = "Màu xe", y = "Tần số") +
theme_minimal() +
theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
Màu đỏ (Red) là màu phổ biến nhất với 49 xe, chứng tỏ đây là màu xe được ưa chuộng nhất trong dữ liệu khảo sát. Màu vàng (Canary Yellow) đứng thứ hai với 42 xe, là màu sắc nổi bật, thường thu hút sự chú ý. Màu xanh dương (Blue) và bạc (Silver) cũng khá phổ biến, lần lượt có 34 và 30 xe được bán. Các màu có tần suất thấp hơn gồm: Night Blue: 20 xe Green và Black: 22 xe Dark Purple: 23 xe British Racing Green (một tông xanh đậm truyền thống) đạt 27 xe, cho thấy vẫn có lượng người tiêu dùng yêu thích màu sắc cổ điển này. Màu sắc nổi bật (Red, Yellow) có xu hướng bán chạy hơn, có thể do tính thu hút và khả năng gây ấn tượng. Các màu tối (Black, Night Blue, Dark Purple) ít phổ biến hơn, mặc dù thường gắn liền với sự sang trọng hoặc truyền thống. Dữ liệu này có thể hữu ích trong việc lên kế hoạch sản xuất và nhập hàng theo thị hiếu thị trường, đồng thời hỗ trợ chiến lược marketing nhắm vào sở thích màu sắc cụ thể.
# Tạo bảng tần số
freq_tableCountryName <- table(qual_data$CountryName)
# Tính tỷ lệ phần trăm
percent_tableCountryName <- prop.table(freq_tableCountryName) * 100
## Tần số các quan sát của biến CountryName :
##
## France Germany Spain Switzerland United Kingdom
## 18 4 6 10 215
## USA
## 16
## Tỷ lệ phần trăm các quan sát của biến CountryName:
##
## France Germany Spain Switzerland United Kingdom
## 6.69 1.49 2.23 3.72 79.93
## USA
## 5.95
# Chuyển bảng tần số thành data frame
df_country <- as.data.frame(freq_tableCountryName)
colnames(df_country) <- c("CountryName", "Frequency")
# Vẽ biểu đồ cột
library(ggplot2)
ggplot(df_country, aes(x = CountryName, y = Frequency, fill = CountryName)) +
geom_bar(stat = "identity") +
geom_text(aes(label = Frequency), vjust = -0.5) +
labs(title = "Tần số theo quốc gia sản xuất (CountryName)",
x = "Quốc gia",
y = "Tần số") +
theme_minimal() +
theme(legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1))
Biểu đồ thể hiện số lượng xe được sản xuất theo từng quốc gia. Dễ dàng nhận thấy rằng có sự chênh lệch lớn giữa các quốc gia về số lượng xe được bán ra. * Vương quốc Anh (United Kingdom) là quốc gia dẫn đầu với số lượng áp đảo: 215 xe, chiếm phần lớn tổng số xe bán ra. Điều này cho thấy vai trò thống trị của các hãng xe đến từ Anh trong dữ liệu khảo sát, có thể liên quan đến sự phổ biến hoặc khả năng tiếp cận sản phẩm tại thị trường khảo sát. * Các quốc gia khác có số lượng xe bán ra thấp hơn rất nhiều:
Biểu đồ phản ánh sự không đồng đều trong nguồn gốc xuất xứ xe được tiêu thụ, với Anh là nước chiếm ưu thế tuyệt đối. Các quốc gia khác như Pháp, Mỹ và Thụy Sĩ có mức độ hiện diện nhất định, trong khi Đức và Tây Ban Nha chỉ góp mặt với số lượng hạn chế. Điều này có thể bắt nguồn từ sự khác biệt trong chiến lược phân phối, sở thích thị trường, hoặc ưu thế cạnh tranh của các hãng xe Anh.
Giả thuyết kiểm định
H₀: Tỷ lệ xe đến từ Germany trong tổng thể bằng 0.40
H₁: Tỷ lệ xe từ Germany trong tổng thể khác 0.40
# CountryName: Germany
country_table <- table(qual_data$CountryName)
n_country <- sum(country_table)
x_country <- country_table["Germany"]
# Ước lượng khoảng tin cậy 95%
prop.test(x_country, n_country, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: x_country out of n_country, null probability 0.5
## X-squared = 251.3, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.004774032 0.040202762
## sample estimates:
## p
## 0.01486989
# Kiểm định H0: p = 0.40
prop.test(x_country, n_country, p = 0.40, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x_country out of n_country, null probability 0.4
## X-squared = 164.65, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.004774032 0.040202762
## sample estimates:
## p
## 0.01486989
Vì p-value < 0.05, ta bác bỏ giả thuyết H₀. Điều này cho thấy rằng tỷ lệ xe đến từ Germany trong tổng thể khác 40% một cách có ý nghĩa thống kê ở mức ý nghĩa 5%.
→ Cụ thể, tỷ lệ thực tế là 1.49%, thấp hơn rất nhiều so với giả định ban đầu là 40%.
Giả thuyết kiểm định:
H₀ (Giả thuyết không): Tỷ lệ xe dạng Convertible trong tổng thể bằng 0.20
H₁ (Giả thuyết đối): Tỷ lệ xe dạng Convertible trong tổng thể khác 0.20
# VehicleType: Convertible
vehicle_table <- table(qual_data$VehicleType)
n_vehicle <- sum(vehicle_table)
x_vehicle <- vehicle_table["Convertible"]
# Ước lượng khoảng tin cậy 95%
prop.test(x_vehicle, n_vehicle, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: x_vehicle out of n_vehicle, null probability 0.5
## X-squared = 207.05, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.03550642 0.09664827
## sample estimates:
## p
## 0.05947955
# Kiểm định giả thuyết H0: p = 0.20
prop.test(x_vehicle, n_vehicle, p = 0.20, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x_vehicle out of n_vehicle, null probability 0.2
## X-squared = 32.326, df = 1, p-value = 1.304e-08
## alternative hypothesis: true p is not equal to 0.2
## 95 percent confidence interval:
## 0.03550642 0.09664827
## sample estimates:
## p
## 0.05947955
Vì p-value < 0.05, ta bác bỏ giả thuyết H₀. Điều này cho thấy rằng tỷ lệ xe dạng Convertible trong tổng thể khác 20% một cách có ý nghĩa thống kê ở mức ý nghĩa 5%.
→ Cụ thể, với tỷ lệ mẫu chỉ khoảng 5.95%, tỷ lệ Convertible thực tế thấp hơn nhiều so với mức giả định 20% trong giả thuyết không.
Giả thuyết kiểm định:
H₀: Tỷ lệ màu xe Red trong tổng thể bằng 0.25
H₁: Tỷ lệ màu xe Red trong tổng thể khác 0.25
# Color: Red
color_table <- table(qual_data$Color)
n_color <- sum(color_table)
x_color <- color_table["Red"]
# Ước lượng khoảng tin cậy 95%
prop.test(x_color, n_color, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: x_color out of n_color, null probability 0.5
## X-squared = 107.43, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1389612 0.2346576
## sample estimates:
## p
## 0.1821561
# Kiểm định H0: p = 0.25
prop.test(x_color, n_color, p = 0.25, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x_color out of n_color, null probability 0.25
## X-squared = 6.2466, df = 1, p-value = 0.01244
## alternative hypothesis: true p is not equal to 0.25
## 95 percent confidence interval:
## 0.1389612 0.2346576
## sample estimates:
## p
## 0.1821561
Vì p-value = 0.01244 < 0.05, ta bác bỏ giả thuyết H₀. Điều này cho thấy rằng tỷ lệ xe có màu đỏ trong tổng thể khác 25% một cách có ý nghĩa thống kê ở mức ý nghĩa 5%.
→ Cụ thể, tỷ lệ xe màu đỏ trong mẫu là 18.22%, thấp hơn đáng kể so với giả định ban đầu là 25%.
# Bảng tần suất
table1 <- table(data$VehicleType, data$Color)
print(table1)
##
## Black Blue British Racing Green Canary Yellow Dark Purple Green
## Convertible 0 0 0 5 3 2
## Coupe 10 18 11 21 16 11
## Saloon 12 16 16 16 4 9
##
## Night Blue Red Silver
## Convertible 0 4 2
## Coupe 13 22 15
## Saloon 7 23 13
# Tỷ lệ phần trăm theo hàng
round(prop.table(table1, margin = 1)*100, 2)
##
## Black Blue British Racing Green Canary Yellow Dark Purple Green
## Convertible 0.00 0.00 0.00 31.25 18.75 12.50
## Coupe 7.30 13.14 8.03 15.33 11.68 8.03
## Saloon 10.34 13.79 13.79 13.79 3.45 7.76
##
## Night Blue Red Silver
## Convertible 0.00 25.00 12.50
## Coupe 9.49 16.06 10.95
## Saloon 6.03 19.83 11.21
# Biểu đồ cột chồng
library(ggplot2)
df1 <- as.data.frame(table1)
colnames(df1) <- c("VehicleType", "Color", "Count")
ggplot(df1, aes(x = VehicleType, y = Count, fill = Color)) +
geom_bar(stat = "identity", position = "stack") + # đổi từ "dodge" sang "stack"
labs(title = "Mối quan hệ giữa VehicleType và Color") +
theme_minimal()
Nhận xét Biểu đồ cột chồng thể hiện mối quan hệ giữa loại xe (VehicleType) và màu sắc (Color), qua đó cho thấy sự phân bố màu sắc theo từng loại xe trong tập dữ liệu.
Loại xe phổ biến nhất:
Phân bố màu sắc:
Màu sắc phổ biến:
Biểu đồ cho thấy Coupe và Saloon là hai loại xe phổ biến, với màu sắc phong phú và đa dạng. Các màu được ưa chuộng nhất có thể kể đến là Silver, Red, Green và Blue, trong khi Convertible có ít đại diện và ít màu sắc hơn, cho thấy đây có thể là dòng xe ít được lựa chọn hoặc ít có mặt trên thị trường. Biểu đồ phản ánh rõ rệt sự ưa chuộng màu sắc theo từng loại xe, đồng thời cung cấp thông tin hữu ích cho việc đánh giá xu hướng màu sắc trong từng dòng sản phẩm.
Giả thuyết kiểm định
H₀ (Giả thuyết không): VehicleType và Color độc lập (không liên quan).
H₁ (Giả thuyết đối): VehicleType và Color có liên quan.
# Kiểm định Chi-bình phương
chisq1 <- chisq.test(table1)
## Warning in chisq.test(table1): Chi-squared approximation may be incorrect
chisq1
##
## Pearson's Chi-squared test
##
## data: table1
## X-squared = 21.486, df = 16, p-value = 0.1606
Vì p-value = 0.1606 > 0.05 (mức ý nghĩa α = 5%), không có đủ bằng chứng để bác bỏ H₀.
Do đó, chúng ta không thể kết luận rằng có mối liên hệ giữa hai biến VehicleType và Color.
# Bảng tần suất
table2 <- table(data$Make, data$CountryName)
print(table2)
##
## France Germany Spain Switzerland United Kingdom USA
## Aston Martin 5 0 0 0 38 1
## Bentley 6 0 1 2 35 4
## Jaguar 5 2 2 7 60 9
## MGB 0 0 0 0 24 0
## Rolls Royce 1 0 0 0 33 0
## Triumph 0 0 2 0 21 0
## TVR 1 2 1 1 4 2
# Tỷ lệ phần trăm theo hàng
round(prop.table(table2, margin = 1)*100, 2)
##
## France Germany Spain Switzerland United Kingdom USA
## Aston Martin 11.36 0.00 0.00 0.00 86.36 2.27
## Bentley 12.50 0.00 2.08 4.17 72.92 8.33
## Jaguar 5.88 2.35 2.35 8.24 70.59 10.59
## MGB 0.00 0.00 0.00 0.00 100.00 0.00
## Rolls Royce 2.94 0.00 0.00 0.00 97.06 0.00
## Triumph 0.00 0.00 8.70 0.00 91.30 0.00
## TVR 9.09 18.18 9.09 9.09 36.36 18.18
# Biểu đồ cột chồng
df2 <- as.data.frame(table2)
colnames(df2) <- c("Make", "Country", "Count")
ggplot(df2, aes(x = Make, y = Count, fill = Country)) +
geom_bar(stat = "identity", position = "stack") + # position = "stack" hoặc bỏ luôn
labs(title = "Mối quan hệ giữa Make và CountryName") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Giả thuyết kiểm định
H₀: Make và CountryName độc lập (không liên quan).
H₁: Make và CountryName có liên quan.
# Kiểm định Chi-bình phương
chisq2 <- chisq.test(table2)
## Warning in chisq.test(table2): Chi-squared approximation may be incorrect
chisq2
##
## Pearson's Chi-squared test
##
## data: table2
## X-squared = 69.638, df = 30, p-value = 5.427e-05
Vì p-value = 0.00005427 < 0.05 (mức ý nghĩa α = 5%), bác bỏ H₀.
Do đó, chúng ta có đủ bằng chứng thống kê để kết luận rằng hai biến Make và CountryName có mối liên hệ ý nghĩa thống kê.
# Bảng tần suất chéo
table4 <- table(data$VehicleType, data$CountryName)
print(table4)
##
## France Germany Spain Switzerland United Kingdom USA
## Convertible 0 0 1 1 12 2
## Coupe 9 3 4 2 112 7
## Saloon 9 1 1 7 91 7
# Tỷ lệ phần trăm theo hàng
round(prop.table(table4, margin = 1) * 100, 2)
##
## France Germany Spain Switzerland United Kingdom USA
## Convertible 0.00 0.00 6.25 6.25 75.00 12.50
## Coupe 6.57 2.19 2.92 1.46 81.75 5.11
## Saloon 7.76 0.86 0.86 6.03 78.45 6.03
# Trực quan hóa: biểu đồ cột chồng
df4 <- as.data.frame(table4)
colnames(df4) <- c("VehicleType", "CountryName", "Count")
library(ggplot2)
ggplot(df4, aes(x = VehicleType, y = Count, fill = CountryName)) +
geom_bar(stat = "identity", position = "stack") + # đổi thành stacked bar
labs(title = "Mối quan hệ giữa VehicleType và CountryName",
x = "Vehicle Type",
y = "Số lượng",
fill = "Country") +
theme_minimal()
Giả thuyết kiểm định
H₀ (Giả thuyết không): VehicleType và CountryName là hai biến độc lập, không có mối liên hệ.
H₁ (Giả thuyết đối): VehicleType và CountryName có mối liên hệ (không độc lập).
# Kiểm định Chi-bình phương
chisq4 <- chisq.test(table4)
## Warning in chisq.test(table4): Chi-squared approximation may be incorrect
chisq4
##
## Pearson's Chi-squared test
##
## data: table4
## X-squared = 9.9785, df = 10, p-value = 0.4424
Vì p-value = 0.4424 > 0.05 (mức ý nghĩa α = 5%), không có đủ bằng chứng để bác bỏ H₀.
Do đó, chúng ta không thể kết luận rằng có mối liên hệ giữa hai biến VehicleType và CountryName.
Ký hiệu πi là tỷ lệ “thành công” của biến phụ thuộc (response variable) tương ứng với từng biểu hiện của biến độc lập. Từ bảng tần xuất, chúng ta tính π1π2 , phân số này gọi là Rủi ro tương đối (Relative risk) giữa 2 biểu hiện khác nhau của biến phụ thuộc. Từ bảng
dt <- table(data$VehicleType, data$ClientType)
addmargins(dt)
##
## Dealer Wholesaler Sum
## Convertible 9 7 16
## Coupe 113 24 137
## Saloon 96 20 116
## Sum 218 51 269
Chúng ta tính rủi ro tương đối (relative risk).
Lọc dữ liệu: Chỉ giữ 2 loại VehicleType (nếu muốn xem kết quae của 2 quan sát kia thì loại bỏ 1 quan sát còn lại “Saloon”)
# Bước 1: Lọc dữ liệu chỉ lấy Convertible và Coupe
data2 <- subset(data, VehicleType %in% c("Convertible", "Coupe"))
# Bước 2: Loại bỏ các levels không có trong dữ liệu để table không giữ lại Saloon
data2$VehicleType <- droplevels(data2$VehicleType)
# Bước 3: Tạo bảng 2x2
dtt <- table(data2$VehicleType, data2$ClientType)
print(dtt)
##
## Dealer Wholesaler
## Convertible 9 7
## Coupe 113 24
# Tính risk ratio
epitools::riskratio(dtt)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##
## Dealer Wholesaler Total
## Convertible 9 7 16
## Coupe 113 24 137
## Total 122 31 153
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Convertible 1.0000000 NA NA
## Coupe 0.4004171 0.2061589 0.7777199
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Convertible NA NA NA
## Coupe 0.02632665 0.02154627 0.01350367
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Dữ liệu trên trình bày kết quả phân tích tỷ số rủi ro (risk ratio) giữa hai loại xe — Convertible và Coupe — theo hai nhóm khách hàng: Dealer và Wholesaler. Bảng dữ liệu cho thấy trong số 16 xe Convertible được bán, có 9 xe bán cho Dealer và 7 cho Wholesaler; trong khi đó, có 113 xe Coupe bán cho Dealer và 24 xe cho Wholesaler, tổng cộng 137 xe.
Kết quả ước lượng tỷ số rủi ro (risk ratio) cho loại xe Convertible là 1.000, vì đây là nhóm tham chiếu (baseline). Đối với Coupe, tỷ số rủi ro là 0.4004, với khoảng tin cậy 95% từ 0.2062 đến 0.7777. Điều này có nghĩa là xác suất bán Coupe cho Dealer thấp hơn khoảng 60% so với Convertible, và kết quả này có ý nghĩa thống kê vì khoảng tin cậy không bao gồm 1.
Phần giá trị p thể hiện mức ý nghĩa thống kê cho nhóm Coupe: tất cả các phép kiểm (mid-p exact, Fisher exact, và kiểm định chi bình phương) đều cho kết quả p-value nhỏ hơn 0.05 (0.026, 0.021, và 0.014 tương ứng), cho thấy sự khác biệt này là có ý nghĩa.
Phần $correction = FALSE cho biết rằng phép kiểm không
dùng hiệu chỉnh liên tục. Phương pháp được dùng là ước lượng hợp
lý tối đa (MLE) không điều kiện, với khoảng tin cậy dựa trên
xấp xỉ chuẩn kiểu Wald.
Tóm lại, kết quả cho thấy khả năng Coupe được bán cho Dealer thấp hơn đáng kể so với Convertible, với sự khác biệt này có ý nghĩa thống kê ở mức 5%.
Odds Ratio (OR) là một chỉ số thống kê dùng để đo lường mức độ liên kết giữa một yếu tố phơi nhiễm (exposure) và một kết quả (outcome). Cụ thể, OR so sánh tỷ lệ odds (tỷ lệ xảy ra trên không xảy ra) của một sự kiện trong nhóm phơi nhiễm với odds của cùng sự kiện trong nhóm không phơi nhiễm.
Trong bối cảnh bảng chéo giữa VehicleType và ClientType, OR cho biết mức độ khách hàng loại này (ví dụ: Dealer) có khả năng chọn loại xe cụ thể (ví dụ: Coupe) so với một loại xe tham chiếu (ví dụ: Convertible).
Odds Ratio chỉ có ý nghĩa thống kê rõ ràng khi:
Chỉ có 2 mức trong biến phân tích (nhóm phơi nhiễm và nhóm tham chiếu),
Chỉ có 2 kết quả có thể xảy ra (kết quả có và không).
Do đó, để tính OR chính xác, bảng chéo giữa hai biến phải là bảng 2×2. Nếu số lượng mức độ lớn hơn 2 (như 3 loại xe), ta phải chọn 2 nhóm để phân tích — điều này thường được gọi là binarization hay subset lựa chọn.
epitools::oddsratio(dtt)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##
## Dealer Wholesaler Total
## Convertible 9 7 16
## Coupe 113 24 137
## Total 122 31 153
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Convertible 1.0000000 NA NA
## Coupe 0.2751865 0.09163159 0.8530527
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Convertible NA NA NA
## Coupe 0.02632665 0.02154627 0.01350367
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Dữ liệu bảng chéo giữa hai biến loại khách hàng (ClientType) và loại xe (VehicleType), sau khi loại bỏ một nhóm trong VehicleType để tạo bảng 2x2, cho phép sử dụng các chỉ số đo lường như Odds Ratio (tỷ số chênh). Kết quả cho thấy, khi chọn Convertible làm nhóm tham chiếu (OR = 1), nhóm Coupe có Odds Ratio ước lượng là 0.2752 với khoảng tin cậy 95% dao động từ 0.0916 đến 0.8531. Vì khoảng tin cậy không bao gồm giá trị 1, điều này cho thấy sự khác biệt giữa hai nhóm là có ý nghĩa thống kê. Ngoài ra, các kiểm định như Fisher’s exact (p = 0.0215), mid-p exact (p = 0.0263) và chi-square (p = 0.0135) đều cho kết quả p-value nhỏ hơn 0.05, củng cố cho kết luận rằng khách hàng loại Dealer có khả năng chọn Coupe thấp hơn đáng kể so với Convertible. Việc tạo bảng 2x2 là cần thiết bởi các công thức tính Odds Ratio và các kiểm định liên quan chỉ áp dụng cho dữ liệu phân loại nhị phân; do đó, nếu không tái cấu trúc bảng hoặc loại bớt một nhóm để phù hợp, các chỉ số này sẽ không thể tính toán chính xác. Tuy nhiên, cần lưu ý rằng việc loại bỏ một nhóm quan sát có thể dẫn đến mất mát thông tin và cần được cân nhắc cẩn thận về mặt logic nghiên cứu.