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

1.1 Đọc và Làm quen Dữ liệu

# Đọc dữ liệu

data <- read.csv("C:/Users/Welcome !/OneDrive - UFM/Desktop/CarSales.csv")

a. Cấu trúc của dữ liệu

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…).

b. Hiển thị một vài dòng đầu và cuối của dữ liệu

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

c. Kiểm tra dữ liệu bị thiếu (missing values)

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

d. Chuyển đổi các biến cần thiết sang kiểu factor

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.

Phần 2: Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)

2.1 Phân tích theo nhãn hiệu xe ( MAKE)

# 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.

2.2 Phân tích theo loại xe (VehicleType)

# 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.

2.3 Phân tích theo màu sắc (Color)

# 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ể.

2.4 Phân tích theo khu vực (Color)

# 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))

Nhận xét biểu đồ: Tần số theo quốc gia sản xuất (CountryName)

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:

  • Pháp (France): 18 xe
  • Hoa Kỳ (USA): 16 xe
  • Thụy Sĩ (Switzerland): 10 xe
  • Tây Ban Nha (Spain): 6 xe
  • Đức (Germany): chỉ có 4 xe

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.

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

3.1. Biến CountryName

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%.

3.2. Biến VehicleType

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.

3.3. Biến Color

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%.

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

Cặp 1: VehicleType vs Color

# 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)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:

  • Coupe là loại xe phổ biến nhất với tổng số lượng vượt trội so với hai loại còn lại.
  • Saloon đứng thứ hai về số lượng.
  • Convertible là loại ít phổ biến nhất, với số lượng xe rất khiêm tốn.

Phân bố màu sắc:

  • Coupe và Saloon đều có sự đa dạng về màu sắc, với gần như tất cả các màu đều được sử dụng.
  • Trong cả hai loại này, các màu Silver, Red, Green, Canary Yellow, British Racing Green và Blue chiếm phần lớn diện tích, thể hiện tần suất sử dụng cao.
  • Convertible có số lượng rất ít xe, nhưng vẫn có sự xuất hiện của nhiều màu sắc, nổi bật là GreenSilver.

Màu sắc phổ biến:

  • Màu SilverRed xuất hiện nhiều trong cả hai loại xe phổ biến là Coupe và Saloon.
  • Các màu như Night Blue, Dark Purple, và Black xuất hiện ít hơn, nhưng vẫn góp mặt trong các dòng xe chính.

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, GreenBlue, 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.

Cặp 2: Make vs CountryName

# 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ê.

Cặp 3: VehicleType vs CountryName

# 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.

Rủi ro tương đối (Relative Risk/Risk Ratio)

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 — ConvertibleCoupe — theo hai nhóm khách hàng: DealerWholesaler. 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 Convertible1.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%.

Tỷ lệ chênh (Odd Ratio)

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.