1 GIỚI THIỆU

Bộ dữ liệu “Orders_Sales_Data” được chúng em chọn lựa trên website Kaggle, bộ dữ liệu thể hiện về mặt thống kê qua hoạt động mua hàng và được lưu lại dưới dạng dữ liệu của từng đối tượng.Phân tích bộ dữ liệu trên giúp các
nhà đầu tư lựa chọn danh mục hàng hóa nên đầu tư mạnh và ngược lại, hiểu được bản chất là hãy để dữ liệu biết nói cho chúng ta hiểu qua các bước mà nhóm em chuẩn bị phân tích sau .

2 THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU

# Đọc dữ liệu
data <- read.csv("C:/Users/CHI LINH/Downloads/Sales_Orders_Data.csv", sep = ";")

# Kiểm tra cấu trúc cơ bản của dataset
cat("=== THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU ===\n")
## === THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU ===
cat("Số quan sát (dòng):", nrow(data), "\n")
## Số quan sát (dòng): 1048575
cat("Số biến (cột):", ncol(data), "\n")
## Số biến (cột): 11
cat("\n")
# Kiểm tra dữ liệu trùng lặp
cat("Số quan sát trùng lặp:", sum(duplicated(data)), "\n")
## Số quan sát trùng lặp: 0
cat("\n")
# Kiểm tra dữ liệu thiếu (missing values)
cat("DỮ LIỆU THIẾU THEO TỪNG CỘT:\n")
## DỮ LIỆU THIẾU THEO TỪNG CỘT:
missing_summary <- sapply(data, function(x) sum(is.na(x)))
print(missing_summary)
##      Order_ID   Customer_ID Customer_Type       Product      Category 
##             0             0             0             0             0 
##    Unit_Price      Quantity      Discount   Total_Price        Region 
##             0             0             0             0             0 
##    Order_Date 
##             0
cat("\n")
# Giải thích ý nghĩa các biến trong dữ liệu 
library(knitr)

thong_tin_bien <- data.frame(
  "Tên Biến" = c("Order_ID", "Customer_ID", "Customer_Type", "Product", 
                 "Category", "Unit_Price", "Quantity", "Discount",
                 "Total_Price", "Region", "Order_Date"),
  "Mô Tả" = c(
    "Mã đơn hàng (định danh duy nhất cho mỗi đơn hàng)",
    "Mã khách hàng (định danh khách hàng)",
    "Phân loại khách hàng (B2B - Doanh nghiệp/B2C - Cá nhân)",
    "Tên sản phẩm",
    "Danh mục sản phẩm",
    "Đơn giá sản phẩm",
    "Số lượng sản phẩm trong đơn hàng",
    "Tỷ lệ chiết khấu áp dụng (%)",
    "Tổng giá trị đơn hàng (sau chiết khấu)",
    "Khu vực địa lý",
    "Ngày đặt hàng"
  )
)

cat("=== Ý NGHĨA CÁC BIẾN TRONG DATASET ===\n")
## === Ý NGHĨA CÁC BIẾN TRONG DATASET ===
kable(thong_tin_bien, caption = "THÔNG TIN MÔ TẢ CÁC BIẾN TRONG BỘ DỮ LIỆU")
THÔNG TIN MÔ TẢ CÁC BIẾN TRONG BỘ DỮ LIỆU
Tên.Biến Mô.Tả
Order_ID Mã đơn hàng (định danh duy nhất cho mỗi đơn hàng)
Customer_ID Mã khách hàng (định danh khách hàng)
Customer_Type Phân loại khách hàng (B2B - Doanh nghiệp/B2C - Cá nhân)
Product Tên sản phẩm
Category Danh mục sản phẩm
Unit_Price Đơn giá sản phẩm
Quantity Số lượng sản phẩm trong đơn hàng
Discount Tỷ lệ chiết khấu áp dụng (%)
Total_Price Tổng giá trị đơn hàng (sau chiết khấu)
Region Khu vực địa lý
Order_Date Ngày đặt hàng
# Hiển thị cấu trúc chi tiết của dữ liệu
cat("=== CẤU TRÚC DỮ LIỆU ===\n")
## === CẤU TRÚC DỮ LIỆU ===
str(data)
## 'data.frame':    1048575 obs. of  11 variables:
##  $ Order_ID     : chr  "ORD1" "ORD1" "ORD1" "ORD1" ...
##  $ Customer_ID  : chr  "CUS1496" "CUS1496" "CUS1496" "CUS1496" ...
##  $ Customer_Type: chr  "B2B" "B2B" "B2B" "B2B" ...
##  $ Product      : chr  "Vio Wasser" "Evian" "Sprite" "Rauch Multivitamin" ...
##  $ Category     : chr  "Water" "Water" "Soft Drinks" "Juices" ...
##  $ Unit_Price   : num  1.66 1.56 1.17 3.22 0.87 9.09 2.14 0.43 1.21 1.38 ...
##  $ Quantity     : int  53 90 73 59 35 2 44 13 92 3 ...
##  $ Discount     : num  0.1 0.1 0.05 0.1 0.1 0 0.1 0.05 0.1 0.05 ...
##  $ Total_Price  : num  79.2 126.4 81.1 171 27.4 ...
##  $ Region       : chr  "Baden-Württemberg" "Baden-Württemberg" "Baden-Württemberg" "Baden-Württemberg" ...
##  $ Order_Date   : chr  "23/08/2023" "23/08/2023" "23/08/2023" "23/08/2023" ...
summary(data)
##    Order_ID         Customer_ID        Customer_Type        Product         
##  Length:1048575     Length:1048575     Length:1048575     Length:1048575    
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    Category           Unit_Price         Quantity         Discount      
##  Length:1048575     Min.   :  0.320   Min.   :  1.00   Min.   :0.00000  
##  Class :character   1st Qu.:  1.050   1st Qu.:  6.00   1st Qu.:0.00000  
##  Mode  :character   Median :  1.750   Median : 11.00   Median :0.00000  
##                     Mean   :  5.847   Mean   : 23.14   Mean   :0.02973  
##                     3rd Qu.:  3.210   3rd Qu.: 30.00   3rd Qu.:0.05000  
##                     Max.   :160.440   Max.   :100.00   Max.   :0.15000  
##   Total_Price          Region           Order_Date       
##  Min.   :    0.30   Length:1048575     Length:1048575    
##  1st Qu.:    8.40   Class :character   Class :character  
##  Median :   21.14   Mode  :character   Mode  :character  
##  Mean   :  130.98                                        
##  3rd Qu.:   69.77                                        
##  Max.   :12682.78

GIẢI THÍCH PHẦN 2:

Đoạn code R đầu tiên thực hiện các bước kiểm tra cơ bản để đánh giá chất lượng và quy mô của bộ dữ liệu. Kết quả từ các lệnh nrow, ncol, sum(duplicated(data)) và sapply(…) cho thấy:

  • Bộ dữ liệu rất lớn, bao gồm 1,048,575 giao dịch và 11 đặc điểm (cột).

  • Dữ liệu hoàn toàn sạch, không có dòng nào bị trùng lặp và không có giá trị nào bị thiếu. Điều này cho thấy dữ liệu đã sẵn sàng cho việc phân tích mà không cần các bước xử lý phức tạp.

3 DATA CLEANING & TRANSFORMATION

# Chuyển đổi kiểu dữ liệu cho các biến phân loại và ngày tháng
data$Order_Date <- as.Date(data$Order_Date, format = "%d/%m/%Y")
data$Customer_Type <- as.factor(data$Customer_Type)
data$Category <- as.factor(data$Category)
data$Region <- as.factor(data$Region)



# Kiểm tra lại cấu trúc sau khi chuyển đổi
cat("=== CẤU TRÚC DỮ LIỆU SAU KHI CHUYỂN ĐỔI ===\n")
## === CẤU TRÚC DỮ LIỆU SAU KHI CHUYỂN ĐỔI ===
str(data)
## 'data.frame':    1048575 obs. of  11 variables:
##  $ Order_ID     : chr  "ORD1" "ORD1" "ORD1" "ORD1" ...
##  $ Customer_ID  : chr  "CUS1496" "CUS1496" "CUS1496" "CUS1496" ...
##  $ Customer_Type: Factor w/ 2 levels "B2B","B2C": 1 1 1 1 1 2 1 1 1 1 ...
##  $ Product      : chr  "Vio Wasser" "Evian" "Sprite" "Rauch Multivitamin" ...
##  $ Category     : Factor w/ 4 levels "Alcoholic Beverages",..: 4 4 3 2 4 1 2 4 4 4 ...
##  $ Unit_Price   : num  1.66 1.56 1.17 3.22 0.87 9.09 2.14 0.43 1.21 1.38 ...
##  $ Quantity     : int  53 90 73 59 35 2 44 13 92 3 ...
##  $ Discount     : num  0.1 0.1 0.05 0.1 0.1 0 0.1 0.05 0.1 0.05 ...
##  $ Total_Price  : num  79.2 126.4 81.1 171 27.4 ...
##  $ Region       : Factor w/ 16 levels "Baden-Württemberg",..: 1 1 1 1 1 15 6 6 6 6 ...
##  $ Order_Date   : Date, format: "2023-08-23" "2023-08-23" ...
# Tạo các biến mới phục vụ phân tích
library(dplyr)

data <- data %>%
  mutate(
    Month = format(Order_Date, "%Y-%m"),
    Year = format(Order_Date, "%Y"),
    Quarter = quarters(Order_Date), 
    Day_of_Week = weekdays(Order_Date),
    Revenue_Before_Discount = Unit_Price * Quantity,
    Discount_Amount = Revenue_Before_Discount * Discount,
    
    Is_High_Discount = Discount > 0.1,
    
    Discount_Category = case_when(
    Discount == 0 ~ "No Discount",
    Discount <= 0.05 ~ "Low Discount",
    Discount <= 0.1 ~ "Medium Discount",
    TRUE ~ "High Discount"
  ),
  Order_Size = case_when(
    Total_Price < 100 ~ "Small",
    Total_Price < 500 ~ "Medium",
    Total_Price < 1000 ~ "Large",
    TRUE ~ "Very Large"
  )
  )

head(data,20)
##    Order_ID Customer_ID Customer_Type            Product            Category
## 1      ORD1     CUS1496           B2B         Vio Wasser               Water
## 2      ORD1     CUS1496           B2B              Evian               Water
## 3      ORD1     CUS1496           B2B             Sprite         Soft Drinks
## 4      ORD1     CUS1496           B2B Rauch Multivitamin              Juices
## 5      ORD1     CUS1496           B2B       Gerolsteiner               Water
## 6      ORD2     CUS2847           B2C    Sauvignon Blanc Alcoholic Beverages
## 7      ORD3     CUS1806           B2B       Tomato Juice              Juices
## 8      ORD3     CUS1806           B2B             Vittel               Water
## 9      ORD3     CUS1806           B2B     San Pellegrino               Water
## 10     ORD3     CUS1806           B2B              Evian               Water
## 11     ORD4     CUS2275           B2C       Mountain Dew         Soft Drinks
## 12     ORD5     CUS7919           B2B     Hohes C Orange              Juices
## 13     ORD5     CUS7919           B2B           Red Bull         Soft Drinks
## 14     ORD5     CUS7919           B2B         Chardonnay Alcoholic Beverages
## 15     ORD5     CUS7919           B2B          Tanqueray Alcoholic Beverages
## 16     ORD6      CUS533           B2B   Rotkäppchen Sekt Alcoholic Beverages
## 17     ORD6      CUS533           B2B        Mango Juice              Juices
## 18     ORD6      CUS533           B2B        Apollinaris               Water
## 19     ORD6      CUS533           B2B       Mountain Dew         Soft Drinks
## 20     ORD6      CUS533           B2B           Riesling Alcoholic Beverages
##    Unit_Price Quantity Discount Total_Price             Region Order_Date
## 1        1.66       53     0.10       79.18  Baden-Württemberg 2023-08-23
## 2        1.56       90     0.10      126.36  Baden-Württemberg 2023-08-23
## 3        1.17       73     0.05       81.14  Baden-Württemberg 2023-08-23
## 4        3.22       59     0.10      170.98  Baden-Württemberg 2023-08-23
## 5        0.87       35     0.10       27.40  Baden-Württemberg 2023-08-23
## 6        9.09        2     0.00       18.18 Schleswig-Holstein 2023-03-16
## 7        2.14       44     0.10       84.74            Hamburg 2022-11-20
## 8        0.43       13     0.05        5.31            Hamburg 2022-11-20
## 9        1.21       92     0.10      100.19            Hamburg 2022-11-20
## 10       1.38        3     0.05        3.93            Hamburg 2022-11-20
## 11       0.99       11     0.00       10.89             Bayern 2023-11-05
## 12       1.52        8     0.05       11.55             Bayern 2023-08-05
## 13       2.13       16     0.05       32.38             Bayern 2023-08-05
## 14       6.45        3     0.05       18.38             Bayern 2023-08-05
## 15      33.36       43     0.15     1219.31             Bayern 2023-08-05
## 16       5.89       44     0.05      246.20           Saarland 2023-02-18
## 17       2.50       10     0.05       23.75           Saarland 2023-02-18
## 18       0.82       13     0.05       10.13           Saarland 2023-02-18
## 19       1.87       89     0.15      141.47           Saarland 2023-02-18
## 20      11.48       21     0.05      229.03           Saarland 2023-02-18
##      Month Year Quarter Day_of_Week Revenue_Before_Discount Discount_Amount
## 1  2023-08 2023      Q3      Thứ Tư                   87.98          8.7980
## 2  2023-08 2023      Q3      Thứ Tư                  140.40         14.0400
## 3  2023-08 2023      Q3      Thứ Tư                   85.41          4.2705
## 4  2023-08 2023      Q3      Thứ Tư                  189.98         18.9980
## 5  2023-08 2023      Q3      Thứ Tư                   30.45          3.0450
## 6  2023-03 2023      Q1     Thứ Năm                   18.18          0.0000
## 7  2022-11 2022      Q4    Chủ Nhật                   94.16          9.4160
## 8  2022-11 2022      Q4    Chủ Nhật                    5.59          0.2795
## 9  2022-11 2022      Q4    Chủ Nhật                  111.32         11.1320
## 10 2022-11 2022      Q4    Chủ Nhật                    4.14          0.2070
## 11 2023-11 2023      Q4    Chủ Nhật                   10.89          0.0000
## 12 2023-08 2023      Q3     Thứ Bảy                   12.16          0.6080
## 13 2023-08 2023      Q3     Thứ Bảy                   34.08          1.7040
## 14 2023-08 2023      Q3     Thứ Bảy                   19.35          0.9675
## 15 2023-08 2023      Q3     Thứ Bảy                 1434.48        215.1720
## 16 2023-02 2023      Q1     Thứ Bảy                  259.16         12.9580
## 17 2023-02 2023      Q1     Thứ Bảy                   25.00          1.2500
## 18 2023-02 2023      Q1     Thứ Bảy                   10.66          0.5330
## 19 2023-02 2023      Q1     Thứ Bảy                  166.43         24.9645
## 20 2023-02 2023      Q1     Thứ Bảy                  241.08         12.0540
##    Is_High_Discount Discount_Category Order_Size
## 1             FALSE   Medium Discount      Small
## 2             FALSE   Medium Discount     Medium
## 3             FALSE      Low Discount      Small
## 4             FALSE   Medium Discount     Medium
## 5             FALSE   Medium Discount      Small
## 6             FALSE       No Discount      Small
## 7             FALSE   Medium Discount      Small
## 8             FALSE      Low Discount      Small
## 9             FALSE   Medium Discount     Medium
## 10            FALSE      Low Discount      Small
## 11            FALSE       No Discount      Small
## 12            FALSE      Low Discount      Small
## 13            FALSE      Low Discount      Small
## 14            FALSE      Low Discount      Small
## 15             TRUE     High Discount Very Large
## 16            FALSE      Low Discount     Medium
## 17            FALSE      Low Discount      Small
## 18            FALSE      Low Discount      Small
## 19             TRUE     High Discount     Medium
## 20            FALSE      Low Discount     Medium

GIẢI THÍCH PHẦN 3:

Để phục vụ cho việc phân tích, code đã thực hiện các bước chuẩn hóa và tạo thêm dữ liệu mới:

  • Chuyển đổi kiểu dữ liệu: Sử dụng các lệnh as.Date và as.factor để chuyển đổi các cột Order_Date, Customer_Type, Category, và Region sang đúng định dạng ngày tháng và phân loại, giúp R hiểu và xử lý dữ liệu một cách chính xác.

  • Tạo biến mới: Dùng lệnh mutate để tạo ra các cột mới như Month, Year, Revenue_Before_Discount (Doanh thu trước giảm giá), và Discount_Category (Phân loại mức giảm giá). Các biến này rất hữu ích để phân tích sâu hơn về xu hướng theo thời gian và hiệu quả của các chương trình khuyến mãi.

4 PHÂN TỔ DỮ LIỆU

4.1 Phân tổ theo Loại khách hàng và Khu vực

library(dplyr)

# Phân tích hiệu suất bán hàng theo loại khách hàng và khu vực
customer_region_summary <- data %>%
  group_by(Customer_Type, Region) %>%
  summarise(
    Total_Orders = n_distinct(Order_ID),        # Tổng số đơn hàng
    Total_Revenue = sum(Total_Price),           # Tổng doanh thu
    Avg_Order_Value = mean(Total_Price),        # Giá trị đơn hàng trung bình
    .groups = 'drop'
  )

cat("=== PHÂN TÍCH HIỆU SUẤT THEO LOẠI KHÁCH HÀNG VÀ KHU VỰC ===\n")
## === PHÂN TÍCH HIỆU SUẤT THEO LOẠI KHÁCH HÀNG VÀ KHU VỰC ===
print(customer_region_summary)
## # A tibble: 32 × 5
##    Customer_Type Region               Total_Orders Total_Revenue Avg_Order_Value
##    <fct>         <fct>                       <int>         <dbl>           <dbl>
##  1 B2B           Baden-Württemberg            7399      6296401.            282.
##  2 B2B           Bayern                       7453      6426283.            286.
##  3 B2B           Berlin                       7725      6880328.            298.
##  4 B2B           Brandenburg                  7403      6525847.            292.
##  5 B2B           Bremen                       7977      5761768.            241.
##  6 B2B           Hamburg                      8705      7480221.            287.
##  7 B2B           Hessen                       8337      7249384.            289.
##  8 B2B           Mecklenburg-Vorpomm…         8225      7227687.            295.
##  9 B2B           Niedersachsen                7248      6109817.            278.
## 10 B2B           Nordrhein-Westfalen          7523      6060823.            270.
## # ℹ 22 more rows

GIẢI THÍCH 4.1:

  • Code sử dụng group_by(Customer_Type, Region) để nhóm dữ liệu, sau đó tính toán các chỉ số bán hàng chính như tổng số đơn hàng, tổng doanh thu và giá trị trung bình mỗi đơn hàng. Kết quả cho thấy, khách hàng B2B (doanh nghiệp) có giá trị đơn hàng trung bình (Avg_Order_Value) cao hơn đáng kể so với khách hàng B2C (cá nhân) ở tất cả các khu vực.

4.2 Phân tổ theo Danh mục sản phẩm và Tháng

# Phân tích xu hướng bán hàng theo danh mục và thời gian
category_monthly_summary <- data %>%
  group_by(Category, Month) %>%
  summarise(
    Total_Quantity = sum(Quantity),             # Tổng số lượng bán ra
    Total_Revenue = sum(Total_Price),           # Tổng doanh thu
    Avg_Unit_Price = mean(Unit_Price),          # Giá bán trung bình
    .groups = 'drop'
  )

cat("=== PHÂN TÍCH THEO DANH MỤC SẢN PHẨM VÀ THÁNG (10 DÒNG ĐẦU) ===\n")
## === PHÂN TÍCH THEO DANH MỤC SẢN PHẨM VÀ THÁNG (10 DÒNG ĐẦU) ===
print(head(category_monthly_summary, 10))
## # A tibble: 10 × 5
##    Category            Month   Total_Quantity Total_Revenue Avg_Unit_Price
##    <fct>               <chr>            <int>         <dbl>          <dbl>
##  1 Alcoholic Beverages 2021-01         170963      2973048.           17.4
##  2 Alcoholic Beverages 2021-02         156497      2683922.           17.8
##  3 Alcoholic Beverages 2021-03         168305      2812860.           17.7
##  4 Alcoholic Beverages 2021-04         170120      2815952.           17.6
##  5 Alcoholic Beverages 2021-05         167744      2865023.           17.5
##  6 Alcoholic Beverages 2021-06         172310      2910454.           17.4
##  7 Alcoholic Beverages 2021-07         171715      2841055.           17.3
##  8 Alcoholic Beverages 2021-08         170586      2948309.           17.5
##  9 Alcoholic Beverages 2021-09         162690      2784813.           17.3
## 10 Alcoholic Beverages 2021-10         170464      2906880.           17.7

GIẢI THÍCH 4.2:

  • Bằng cách nhóm dữ liệu theo Category và Month, đoạn code này tính toán tổng doanh thu và số lượng bán ra hàng tháng cho mỗi danh mục sản phẩm. Kết quả cho phép theo dõi sự biến động doanh số theo mùa vụ, giúp xác định danh mục nào bán chạy nhất vào những thời điểm cụ thể trong năm. Ví dụ, danh mục “Đồ uống có cồn” (Alcoholic Beverages) có doanh thu ổn định qua các tháng

4.3 Phân tổ theo Mức chiết khấu

# Phân tích hiệu quả của các mức chiết khấu khác nhau
discount_analysis <- data %>%
  group_by(Discount_Group = cut(Discount, 
                               breaks = c(-0.1, 0, 0.05, 0.1, 0.15, 1),
                               labels = c("0%", "0-5%", "5-10%", "10-15%", ">15%"))) %>%
  summarise(
    Number_of_Orders = n(),                     # Số lượng đơn hàng
    Total_Revenue = sum(Total_Price),           # Tổng doanh thu
    Avg_Order_Value = mean(Total_Price),        # Giá trị đơn hàng trung bình
    .groups = 'drop'
  )

cat("=== PHÂN TÍCH HIỆU QUẢ CHIẾT KHẤU ===\n")
## === PHÂN TÍCH HIỆU QUẢ CHIẾT KHẤU ===
print(discount_analysis)
## # A tibble: 4 × 4
##   Discount_Group Number_of_Orders Total_Revenue Avg_Order_Value
##   <fct>                     <int>         <dbl>           <dbl>
## 1 0%                       674968     32189768.            47.7
## 2 0-5%                     168122     28801144.           171. 
## 3 5-10%                    161028     57373493.           356. 
## 4 10-15%                    44457     18976217.           427.

GIẢI THÍCH 4.3:

  • Code sử dụng hàm cut() để chia các đơn hàng thành nhiều nhóm dựa trên tỷ lệ chiết khấu (Discount). Kết quả phân tích cho thấy một quy luật rõ ràng: các mức chiết khấu cao hơn (ví dụ: 10-15%) có xu hướng mang lại giá trị trung bình trên mỗi đơn hàng (Avg_Order_Value) cao hơn. Điều này gợi ý rằng chính sách chiết khấu có hiệu quả trong việc khuyến khích khách hàng mua nhiều hơn.

5 PHÂN TÍCH BIẾN

5.1 Phân tích biến Doanh thu (Total_Price)

library(ggplot2)
library(scales)

# Bảng tần số và tần suất cho biến Total_Price
price_intervals <- cut(data$Total_Price, 
                      breaks = c(0, 100, 500, 1000, 5000, 10000, Inf),
                      labels = c("0-100", "100-500", "500-1000", "1000-5000", "5000-10000", ">10000"),
                      right = FALSE)

frequency_table <- table(price_intervals)
percentage_table <- prop.table(frequency_table) * 100

revenue_distribution <- data.frame(
  Khoảng_Doanh_Thu = names(frequency_table),
  Tần_Số = as.numeric(frequency_table),
  Tần_Suất = as.numeric(percentage_table)
)

cat("=== BẢNG TẦN SỐ VÀ TẦN SUẤT DOANH THU ===\n")
## === BẢNG TẦN SỐ VÀ TẦN SUẤT DOANH THU ===
kable(revenue_distribution, digits = 2)
Khoảng_Doanh_Thu Tần_Số Tần_Suất
0-100 842588 80.36
100-500 155141 14.80
500-1000 24442 2.33
1000-5000 23681 2.26
5000-10000 2557 0.24
>10000 166 0.02
# Thống kê mô tả biến doanh thu
cat("=== THỐNG KÊ MÔ TẢ BIẾN TOTAL_PRICE ===\n")
## === THỐNG KÊ MÔ TẢ BIẾN TOTAL_PRICE ===
summary(data$Total_Price)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     0.30     8.40    21.14   130.98    69.77 12682.78
# Phân phối doanh thu
ggplot(data, aes(x = Total_Price)) +
  geom_histogram(bins = 50, fill = "steelblue", alpha = 0.7) +
  scale_x_continuous(labels = comma) +
  labs(title = "PHÂN PHỐI DOANH THU",
       subtitle = "Biểu đồ histogram thể hiện phân phối giá trị đơn hàng",
       x = "Doanh Thu (Total_Price)", 
       y = "Số Lượng Đơn Hàng") +
  theme_minimal()

GIẢI THÍCH 5.1:

  • Biểu đồ histogram được tạo ra từ ggplot cho thấy phần lớn các đơn hàng có giá trị thấp, tập trung ở khoảng dưới 1,000. Tuy nhiên, có một số ít đơn hàng giá trị rất cao (ngoại lai), cho thấy sự chênh lệch lớn trong quy mô mua sắm của khách hàng.

5.2 Phân tích biến Loại khách hàng (Customer_Type)

# Đếm số lượng B2B và B2C
customer_count <- data %>%
  count(Customer_Type) %>%
  mutate(Percentage = n / sum(n) * 100)

cat("=== PHÂN BỐ LOẠI KHÁCH HÀNG ===\n")
## === PHÂN BỐ LOẠI KHÁCH HÀNG ===
kable(customer_count, digits = 2)
Customer_Type n Percentage
B2B 373607 35.63
B2C 674968 64.37
# So sánh hiệu suất giữa các loại khách hàng
customer_summary <- data %>%
  group_by(Customer_Type) %>%
  summarise(
    Count = n(),                                # Số lượng giao dịch
    Percentage = n()/nrow(data)*100,           # Tỷ lệ phần trăm
    Total_Revenue = sum(Total_Price),           # Tổng doanh thu
    Avg_Transaction_Value = mean(Total_Price)   # Giá trị giao dịch trung bình
  )

cat("=== PHÂN TÍCH THEO LOẠI KHÁCH HÀNG ===\n")
## === PHÂN TÍCH THEO LOẠI KHÁCH HÀNG ===
print(customer_summary)
## # A tibble: 2 × 5
##   Customer_Type  Count Percentage Total_Revenue Avg_Transaction_Value
##   <fct>          <int>      <dbl>         <dbl>                 <dbl>
## 1 B2B           373607       35.6    105150854.                 281. 
## 2 B2C           674968       64.4     32189768.                  47.7
# Biểu đồ so sánh doanh thu
ggplot(customer_summary, aes(x = Customer_Type, y = Total_Revenue, fill = Customer_Type)) +
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = comma) +
  labs(title = "SO SÁNH DOANH THU THEO LOẠI KHÁCH HÀNG",
       subtitle = "B2B vs B2C",
       x = "Loại Khách Hàng", 
       y = "Tổng Doanh Thu") +
  theme_minimal() +
  theme(legend.position = "none")

GIẢI THÍCH 5.2:

  • Bảng tóm tắt và biểu đồ cột so sánh hai nhóm khách hàng. Mặc dù số lượng giao dịch của khách hàng B2C (64.4%) nhiều hơn gần gấp đôi so với B2B (35.6%), nhưng tổng doanh thu từ B2B lại cao hơn gấp 3 lần. Điều này khẳng định khách hàng doanh nghiệp có giá trị chiến lược quan trọng hơn về mặt doanh thu.

5.3 Phân tích biến Khu vực (Region)

# Phân tích hiệu suất theo khu vực địa lý
region_summary <- data %>%
  group_by(Region) %>%
  summarise(
    Total_Orders = n_distinct(Order_ID),        # Tổng số đơn hàng
    Total_Revenue = sum(Total_Price),           # Tổng doanh thu
    Avg_Order_Value = mean(Total_Price),        # Giá trị đơn hàng trung bình
    .groups = 'drop'
  ) %>%
  arrange(desc(Total_Revenue))                  # Sắp xếp theo doanh thu giảm dần

cat("=== PHÂN TÍCH HIỆU SUẤT THEO KHU VỰC ===\n")
## === PHÂN TÍCH HIỆU SUẤT THEO KHU VỰC ===
print(region_summary)
## # A tibble: 16 × 4
##    Region                 Total_Orders Total_Revenue Avg_Order_Value
##    <fct>                         <int>         <dbl>           <dbl>
##  1 Hamburg                       23426      9619253.            137.
##  2 Hessen                        21071      9181452.            145.
##  3 Mecklenburg-Vorpommern        21414      9120188.            142.
##  4 Saarland                      22011      9020347.            136.
##  5 Rheinland-Pfalz               22668      9011789.            133.
##  6 Berlin                        21284      8879189.            139.
##  7 Thüringen                     21830      8734228.            134.
##  8 Bayern                        21476      8430479.            130.
##  9 Brandenburg                   20570      8402955.            136.
## 10 Niedersachsen                 22428      8320694.            123.
## 11 Sachsen-Anhalt                21416      8251296.            128.
## 12 Baden-Württemberg             21317      8237277.            128.
## 13 Sachsen                       22213      8213791.            123.
## 14 Schleswig-Holstein            21976      8193415.            124.
## 15 Nordrhein-Westfalen           21978      8139463.            124.
## 16 Bremen                        22115      7584805.            114.
# Biểu đồ doanh thu theo khu vực
ggplot(region_summary, aes(x = reorder(Region, Total_Revenue), y = Total_Revenue)) +
  geom_bar(stat = "identity", fill = "darkorange", alpha = 0.8) +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(title = "DOANH THU THEO KHU VỰC",
       subtitle = "Sắp xếp theo thứ tự doanh thu giảm dần",
       x = "Khu Vực", 
       y = "Tổng Doanh Thu") +
  theme_minimal()

GIẢI THÍCH 5.3:

  • Bằng cách nhóm và sắp xếp dữ liệu theo khu vực, biểu đồ cột cho thấy Hamburg và Hessen là hai khu vực mang lại doanh thu cao nhất. Ngược lại, Bremen là khu vực có doanh thu thấp nhất. Thông tin này giúp doanh nghiệp xác định các thị trường trọng điểm để tập trung nguồn lực marketing và bán hàng.