1 PHẦN 1: BỘ DỮ LIỆU MARKETING CAMPAIGN PERFORMANCE DATASET

Đây là bộ dữ liệu Marketing Campaign Performance Dataset với 1,058 chiến dịch từ 5 công ty công nghệ, ghi nhận hiệu suất đa dạng các loại hình marketing (Email, Influencer, Social Media, Display Ads, Search) từ 1/2021 đến 11/2021. Dữ liệu bao gồm các metrics quan trọng như Conversion Rate, Acquisition Cost, ROI, Clicks, Impressions và Engagement Score, nhắm đến nhiều phân khúc khách hàng (Tech Enthusiasts, Health & Wellness, Fashionistas…) qua đa kênh và ngôn ngữ, cung cấp nền tảng toàn diện cho phân tích và tối ưu hóa chiến lược marketing data-driven.

1.1 CHƯƠNG 1: NHỮNG THÔNG TIN CƠ BẢN CỦA BỘ DỮ LIỆU VÀ XỬ LÍ DỮ LIỆU THÔ - MÃ HÓA

1.1.1 Load thư viện

library(readxl)
library(tidyverse)
library(lubridate)
library(scales)
library(ggplot2)
library(dplyr)
library(stringr)
library(skimr)
library(kableExtra)
library(patchwork)
library(reshape2)
library(knitr)
library(janitor)
library(Hmisc)
library(psych)
library(forecast)
library(tseries)
library(GGally)
library(corrplot)
library(ggpubr)
library(moments) 
options(scipen = 999)

1.1.2 Đọc dữ liệu

dl <- read.csv("D:/HK3-2025/NGON_NGU_LAP_TRINH/Marketing_Campaign_Performance_Dataset.csv")
head(dl)
##               Company Campaign_Type Target_Audience Duration Channel_Used
## 1 Innovate Industries         Email       Men 18-24  30 days   Google Ads
## 2      NexGen Systems         Email     Women 35-44  60 days   Google Ads
## 3   Alpha Innovations    Influencer       Men 25-34  30 days      YouTube
## 4  DataTech Solutions       Display        All Ages  60 days      YouTube
## 5      NexGen Systems         Email       Men 25-34  15 days      YouTube
## 6  DataTech Solutions       Display        All Ages  15 days    Instagram
##   Conversion_Rate Acquisition_Cost  ROI    Location Language Clicks Impressions
## 1            0.04       $16,174.00 6.29     Chicago  Spanish    506        1922
## 2            0.12       $11,566.00 5.61    New York   German    116        7523
## 3            0.07       $10,200.00 7.18 Los Angeles   French    584        7698
## 4            0.11       $12,724.00 5.55       Miami Mandarin    217        1820
## 5            0.05       $16,452.00 6.50 Los Angeles Mandarin    379        4201
## 6            0.07        $9,716.00 4.36    New York   German    100        1643
##   Engagement_Score    Customer_Segment       Date
## 1                6   Health & Wellness 01/01/2021
## 2                7        Fashionistas 02/01/2021
## 3                1 Outdoor Adventurers 03/01/2021
## 4                7   Health & Wellness 04/01/2021
## 5                3   Health & Wellness 05/01/2021
## 6                1             Foodies 06/01/2021

1.1.3 Số biến và số quan sát

dim(dl)
## [1] 200000     15

Kết quả trả ra cho ta thấy bộ dữ liệu có 200.000 quan sát và 15 biến.

1.1.4 Ý nghĩa các biến

1. Company: Tên công ty thực hiện chiến dịch.
2. Campaign_Type: Loại hình chiến dịch marketing.
- Email: Email marketing.
- Influencer: Tiếp thị qua người có sức ảnh hưởng.
- Display: Quảng cáo hiển thị.
- Search: Quảng cáo tìm kiếm.
- Social Media: Mạng xã hội.
3. Target_Audience: Nhóm đối tượng mục tiêu
- Phân theo giới tính và độ tuổi.
4. Duration: Thời gian chạy chiến dịch (ngày).
5. Channel_Used: Kênh phân phối chiến dịch.
- Google Ads, YouTube, Instagram, Facebook, Email, Website.
6. Conversion_Rate: Tỷ lệ chuyển đổi - phần trăm người dùng thực hiện hành động mong muốn.
7. Acquisition_Cost: Chi phí thu hút khách hàng.
8. ROI (Return on Investment): Tỷ suất hoàn vốn.
9. Location: Địa điểm triển khai chiến dịch.
10. Language: Ngôn ngữ sử dụng trong chiến dịch.
11. Clicks: Số lượt nhấp chuột vào quảng cáo.
12. Impressions: Số lần quảng cáo được hiển thị.
13. Engagement_Score: Đo lường mức độ tương tác.
14. Customer_Segment: Phân khúc khách hàng.
- Health & Wellness: Sức khỏe.
- Fashionistas: Thời trang.
- Outdoor Adventurers: Du lịch ngoài trời.
- Tech Enthusiasts: Công nghệ.
- Foodies: Ẩm thực.
15. Date: Ngày thực hiện chiến dịch.

1.1.5 Tên biến và cấu trúc dữ liệu

names(dl) 
##  [1] "Company"          "Campaign_Type"    "Target_Audience"  "Duration"        
##  [5] "Channel_Used"     "Conversion_Rate"  "Acquisition_Cost" "ROI"             
##  [9] "Location"         "Language"         "Clicks"           "Impressions"     
## [13] "Engagement_Score" "Customer_Segment" "Date"
str(dl)   
## 'data.frame':    200000 obs. of  15 variables:
##  $ Company         : chr  "Innovate Industries" "NexGen Systems" "Alpha Innovations" "DataTech Solutions" ...
##  $ Campaign_Type   : chr  "Email" "Email" "Influencer" "Display" ...
##  $ Target_Audience : chr  "Men 18-24" "Women 35-44" "Men 25-34" "All Ages" ...
##  $ Duration        : chr  "30 days" "60 days" "30 days" "60 days" ...
##  $ Channel_Used    : chr  "Google Ads" "Google Ads" "YouTube" "YouTube" ...
##  $ Conversion_Rate : num  0.04 0.12 0.07 0.11 0.05 0.07 0.13 0.08 0.09 0.09 ...
##  $ Acquisition_Cost: chr  "$16,174.00" "$11,566.00" "$10,200.00" "$12,724.00" ...
##  $ ROI             : num  6.29 5.61 7.18 5.55 6.5 4.36 2.86 5.55 6.73 3.78 ...
##  $ Location        : chr  "Chicago" "New York" "Los Angeles" "Miami" ...
##  $ Language        : chr  "Spanish" "German" "French" "Mandarin" ...
##  $ Clicks          : int  506 116 584 217 379 100 817 624 861 642 ...
##  $ Impressions     : int  1922 7523 7698 1820 4201 1643 8749 7854 1754 3856 ...
##  $ Engagement_Score: int  6 7 1 7 3 1 10 7 6 3 ...
##  $ Customer_Segment: chr  "Health & Wellness" "Fashionistas" "Outdoor Adventurers" "Health & Wellness" ...
##  $ Date            : chr  "01/01/2021" "02/01/2021" "03/01/2021" "04/01/2021" ...

1.1.6 Chuyển đổi kiểu dữ liệu

dl$Date <- as.Date(dl$Date, format = "%d/%m/%Y")
dl$Acquisition_Cost <- as.numeric(gsub("[\\$,]", "", dl$Acquisition_Cost))
dl$Duration <- as.numeric(gsub(" days", "", dl$Duration))
str(dl)
## 'data.frame':    200000 obs. of  15 variables:
##  $ Company         : chr  "Innovate Industries" "NexGen Systems" "Alpha Innovations" "DataTech Solutions" ...
##  $ Campaign_Type   : chr  "Email" "Email" "Influencer" "Display" ...
##  $ Target_Audience : chr  "Men 18-24" "Women 35-44" "Men 25-34" "All Ages" ...
##  $ Duration        : num  30 60 30 60 15 15 60 45 15 15 ...
##  $ Channel_Used    : chr  "Google Ads" "Google Ads" "YouTube" "YouTube" ...
##  $ Conversion_Rate : num  0.04 0.12 0.07 0.11 0.05 0.07 0.13 0.08 0.09 0.09 ...
##  $ Acquisition_Cost: num  16174 11566 10200 12724 16452 ...
##  $ ROI             : num  6.29 5.61 7.18 5.55 6.5 4.36 2.86 5.55 6.73 3.78 ...
##  $ Location        : chr  "Chicago" "New York" "Los Angeles" "Miami" ...
##  $ Language        : chr  "Spanish" "German" "French" "Mandarin" ...
##  $ Clicks          : int  506 116 584 217 379 100 817 624 861 642 ...
##  $ Impressions     : int  1922 7523 7698 1820 4201 1643 8749 7854 1754 3856 ...
##  $ Engagement_Score: int  6 7 1 7 3 1 10 7 6 3 ...
##  $ Customer_Segment: chr  "Health & Wellness" "Fashionistas" "Outdoor Adventurers" "Health & Wellness" ...
##  $ Date            : Date, format: "2021-01-01" "2021-01-02" ...

1.1.7 Kiểm tra dữ liệu trùng lặp

sum(duplicated(dl))
## [1] 0
variables <- c("Company", "Campaign_Type", "Target_Audience", "Duration", 
               "Channel_Used", "Conversion_Rate", "Acquisition_Cost", "ROI", 
               "Location", "Language", "Clicks", "Impressions", "Engagement_Score", 
               "Customer_Segment")
for(var in variables) {
  cat("Số trùng lặp cho", var, ":", sum(duplicated(dl[[var]])), "\n")}
## Số trùng lặp cho Company : 199995 
## Số trùng lặp cho Campaign_Type : 199995 
## Số trùng lặp cho Target_Audience : 199995 
## Số trùng lặp cho Duration : 199996 
## Số trùng lặp cho Channel_Used : 199994 
## Số trùng lặp cho Conversion_Rate : 199985 
## Số trùng lặp cho Acquisition_Cost : 184999 
## Số trùng lặp cho ROI : 199399 
## Số trùng lặp cho Location : 199995 
## Số trùng lặp cho Language : 199995 
## Số trùng lặp cho Clicks : 199099 
## Số trùng lặp cho Impressions : 190999 
## Số trùng lặp cho Engagement_Score : 199990 
## Số trùng lặp cho Customer_Segment : 199995

1.Có 5 tên Công ty duy nhất (200000 - 199995 = 5).

2.Có 4 khoảng thời gian (15, 30, 45, 60 ngày) duy nhất.

3.Có 365 ngày duy nhất. Xác nhận dữ liệu kéo dài chính xác 1 năm.

4.Có 10 điểm tương tác (0 đến 9) duy nhất. Rất bình thường.

5.Có 1000 giá trị Clicks duy nhất.

6.Có 1000 giá trị Impressions duy nhất.

7.Có 384 giá trị tỷ lệ chuyển đổi khác nhau.

8.Có 653 giá trị chi phí khác nhau.

9.Có 1730 giá trị ROI khác nhau.

10.Có 5 loại hình chiến dịch duy nhất.

11.Có 10 nhóm đối tượng duy nhất.

12.Có 6 kênh duy nhất.

13.Có 12 địa điểm duy nhất.

14.Có 5 ngôn ngữ duy nhất.

15.Có 5 phân khúc khách hàng duy nhất.

1.1.8 Kiểm tra dữ liệu bị thiếu

sum(is.na(dl))  
## [1] 0
colSums(is.na(dl))  
##          Company    Campaign_Type  Target_Audience         Duration 
##                0                0                0                0 
##     Channel_Used  Conversion_Rate Acquisition_Cost              ROI 
##                0                0                0                0 
##         Location         Language           Clicks      Impressions 
##                0                0                0                0 
## Engagement_Score Customer_Segment             Date 
##                0                0                0

Kết quả trả về cho thấy bộ dữ liệu không có bất kì dữ liệu bị thiếu nào.

1.1.9 Kiểm tra dữ liệu không nhất quán

table(dl$Channel_Used)
## 
##      Email   Facebook Google Ads  Instagram    Website    YouTube 
##      33599      32819      33438      33392      33360      33392
unique(dl$Channel_Used)
## [1] "Google Ads" "YouTube"    "Instagram"  "Website"    "Facebook"  
## [6] "Email"

Các giá trị đều thống nhất về cách viết (chữ hoa đầu, không thừa khoảng trắng) và không có biến thể trùng lặp.
Do đó, dữ liệu không xuất hiện lỗi không nhất quán ở biến này.

1.1.10 Phát hiện và xử lý Outliers (giá trị ngoại lai)

1.1.10.0.1 HÀM PHÁT HIỆN OUTLIER THEO IQR
detect_outliers <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  return(x < lower_bound | x > upper_bound)
}

1.1.10.1 KIỂM TRA OUTLIER CHO CÁC BIẾN QUAN TRỌNG

outlier_summary <- data.frame(
  Biến = character(),
  Tổng_Outlier = numeric(),
  Tỷ_lệ = numeric(),
  stringsAsFactors = FALSE
)
# Kiểm tra xem biến Revenue đã tồn tại chưa, nếu chưa thì tạo
if(!"Revenue" %in% names(dl)) {
  dl <- dl %>% mutate(Revenue = ROI * Acquisition_Cost)
}

biến_kiểm_tra <- c("ROI", "Acquisition_Cost", "Conversion_Rate", "Clicks", "Impressions", "Revenue")

for(biến in biến_kiểm_tra) {
  outliers <- detect_outliers(dl[[biến]])
  tổng_outlier <- sum(outliers)
  tỷ_lệ <- tổng_outlier / nrow(dl) * 100
  
  outlier_summary <- rbind(outlier_summary, data.frame(
    Biến = biến,
    Tổng_Outlier = tổng_outlier,
    Tỷ_lệ = round(tỷ_lệ, 2)
  ))
}

# Hiển thị kết quả
outlier_summary
##               Biến Tổng_Outlier Tỷ_lệ
## 1              ROI            0  0.00
## 2 Acquisition_Cost            0  0.00
## 3  Conversion_Rate            0  0.00
## 4           Clicks            0  0.00
## 5      Impressions            0  0.00
## 6          Revenue          532  0.27

1.1.10.2 TRỰC QUAN HÓA OUTLIER

library(patchwork)

# Boxplot cho các biến quan trọng
p1 <- ggplot(dl, aes(y = ROI)) + 
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  labs(title = "Boxplot - ROI", y = "ROI") +
  theme_minimal()

p2 <- ggplot(dl, aes(y = Acquisition_Cost)) + 
  geom_boxplot(fill = "lightcoral", alpha = 0.7) +
  labs(title = "Boxplot - Acquisition Cost", y = "Cost") +
  theme_minimal()

p3 <- ggplot(dl, aes(y = Conversion_Rate)) + 
  geom_boxplot(fill = "lightgreen", alpha = 0.7) +
  labs(title = "Boxplot - Conversion Rate", y = "Conversion Rate") +
  theme_minimal()

p4 <- ggplot(dl, aes(y = Revenue)) + 
  geom_boxplot(fill = "lightyellow", alpha = 0.7) +
  labs(title = "Boxplot - Revenue", y = "Revenue") +
  theme_minimal()

# Kết hợp 4 biểu đồ
(p1 + p2) / (p3 + p4)

1.1.10.3 PHÂN TÍCH CHI TIẾT OUTLIER CỦA ROI

roi_outliers <- detect_outliers(dl$ROI)
outlier_data <- dl[roi_outliers, ]

# Thống kê outlier ROI
roi_stats <- data.frame(
  Số_lượng_outlier = sum(roi_outliers),
  Tỷ_lệ_outlier = round(mean(roi_outliers) * 100, 2)
)
roi_stats
##   Số_lượng_outlier Tỷ_lệ_outlier
## 1                0             0
# Phân bố outlier ROI theo kênh
outlier_channel <- outlier_data %>% 
  count(Channel_Used) %>% 
  mutate(Tỷ_lệ = n / sum(roi_outliers) * 100) %>%
  arrange(desc(n))
outlier_channel
## [1] Channel_Used n            Tỷ_lệ       
## <0 rows> (or 0-length row.names)

1.1.10.4 SO SÁNH ĐẶC ĐIỂM OUTLIER vs NON-OUTLIER

dl <- dl %>% mutate(ROI_Outlier = detect_outliers(ROI))

so_sánh <- dl %>% 
  group_by(ROI_Outlier) %>% 
  summarise(
    Số_lượng = n(),
    ROI_Trung_bình = mean(ROI),
    Cost_Trung_bình = mean(Acquisition_Cost),
    CR_Trung_bình = mean(Conversion_Rate),
    Engagement_Trung_bình = mean(Engagement_Score)
  )

so_sánh
## # A tibble: 1 × 6
##   ROI_Outlier Số_lượng ROI_Trung_bình Cost_Trung_bình CR_Trung_bình
##   <lgl>          <int>          <dbl>           <dbl>         <dbl>
## 1 FALSE         200000           5.00          12504.        0.0801
## # ℹ 1 more variable: Engagement_Trung_bình <dbl>

1.1.10.5 QUYẾT ĐỊNH XỬ LÝ OUTLIER

# Phân tích ảnh hưởng của outlier đến các mô hình
cor_with_outliers <- cor(dl$ROI, dl$Conversion_Rate)
dl_no_outliers <- dl[!roi_outliers, ]
cor_without_outliers <- cor(dl_no_outliers$ROI, dl_no_outliers$Conversion_Rate)

cor_comparison <- data.frame(
  Tương_quan_có_outlier = round(cor_with_outliers, 4),
  Tương_quan_không_outlier = round(cor_without_outliers, 4),
  Khác_biệt = round(abs(cor_with_outliers - cor_without_outliers), 4)
)

cor_comparison
##   Tương_quan_có_outlier Tương_quan_không_outlier Khác_biệt
## 1               -0.0011                  -0.0011         0

1.1.10.6 KẾT LUẬN VỀ OUTLIER

Phân tích outlier cho thấy chất lượng dữ liệu rất tốt với tỷ lệ outlier chỉ 0.27% (duy nhất trên biến Revenue). Các biến quan trọng như ROI, Acquisition Cost và Conversion Rate đều không có outlier, chứng tỏ tính ổn định và độ tin cậy cao của dataset. Do outlier không ảnh hưởng đến kết quả phân tích, toàn bộ dữ liệu được giữ nguyên cho các phân tích tiếp theo.

1.1.11 Mô tả các biến số

summary_stats <- summary(dl)

1.1.12 Phạm vi thời gian dataset

dl$Date <- as.Date(dl$Date, format = "%d/%m/%Y")
date_range <- data.frame(
  Start_Date = min(dl$Date),
  End_Date = max(dl$Date)
)

1.1.13 Chuyển đổi Date

dl$Date <- as.Date(dl$Date, format = "%d/%m/%y")

Chuyển chuỗi sang kiểu Date để phân tích thời gian.

1.1.14 Chuyển đổi Cost

dl$Acquisition_Cost <- as.numeric(gsub("[$,]", "", dl$Acquisition_Cost))

Loại bỏ ký tự tiền tệ và chuyển sang kiểu numeric để tính toán.

1.1.15 Chuyển đổi Duration

dl$Duration <- as.numeric(gsub("days", " ", dl$Duration))

1.1.16 Tính Revenue

dl <- dl %>% mutate(Revenue = ROI * Acquisition_Cost)
head(dl[c("ROI", "Acquisition_Cost", "Revenue")], 10)
##     ROI Acquisition_Cost   Revenue
## 1  6.29            16174 101734.46
## 2  5.61            11566  64885.26
## 3  7.18            10200  73236.00
## 4  5.55            12724  70618.20
## 5  6.50            16452 106938.00
## 6  4.36             9716  42361.76
## 7  2.86            11067  31651.62
## 8  5.55            13280  73704.00
## 9  6.73            18066 121584.18
## 10 3.78            13766  52035.48
summary(dl$Revenue)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   10064   37810   56194   62587   83274  159456

1.1.17 Tính CTR

dl <- dl %>% mutate(CTR = Clicks / Impressions)
head(dl[c("Clicks", "Impressions", "CTR")], 10)
##    Clicks Impressions        CTR
## 1     506        1922 0.26326743
## 2     116        7523 0.01541938
## 3     584        7698 0.07586386
## 4     217        1820 0.11923077
## 5     379        4201 0.09021662
## 6     100        1643 0.06086427
## 7     817        8749 0.09338210
## 8     624        7854 0.07944996
## 9     861        1754 0.49087799
## 10    642        3856 0.16649378
summary(dl$CTR)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01005 0.05861 0.09979 0.14041 0.16970 0.99202

Nhìn vào 10 dòng dữ liệu đầu tiên, các phép tính đều cho kết quả đúng, với Revenue dao động từ 31,651.62 đến 121,584.18.

Thống kê tổng quan cho thấy doanh thu có sự biến động khá lớn:

Doanh thu trung bình đạt 62,587

Giá trị trung vị là 56,194 (thấp hơn trung bình)

Doanh thu nhỏ nhất là 10,064

Doanh thu lớn nhất lên tới 159,456

Sự chênh lệch giữa giá trị trung bình (62,587) và trung vị (56,194) cho thấy phân phối của Revenue bị lệch phải, nghĩa là có một số ít các giá trị doanh thu rất cao đã kéo trung bình lên. Khoảng tứ phân vị từ 37,810 đến 83,274 cho biết 50% số liệu doanh thu tập trung trong phạm vi này.

Kết quả này cho thấy hiệu quả kinh doanh có sự chênh lệch đáng kể giữa các chiến dịch, với một số chiến dịch mang lại doanh thu rất cao trong khi số khác chỉ đạt mức khiêm tốn.

1.1.18 Mã hóa Giới tính

dl <- dl %>% mutate(Gender = if_else(grepl("Men", Target_Audience), "Male", 
                                    if_else(grepl("Women", Target_Audience), "Female", "All")))
table(dl$Gender)
## 
##    All Female   Male 
##  40019  79700  80281
head(dl[c("Target_Audience", "Gender")], 10)
##    Target_Audience Gender
## 1        Men 18-24   Male
## 2      Women 35-44 Female
## 3        Men 25-34   Male
## 4         All Ages    All
## 5        Men 25-34   Male
## 6         All Ages    All
## 7      Women 35-44 Female
## 8        Men 18-24   Male
## 9      Women 35-44 Female
## 10     Women 35-44 Female

Từ kết quả mã hóa giới tính, có thể thấy việc chuyển đổi từ biến Target_Audience sang biến Gender mới đã được thực hiện thành công. Dữ liệu 10 dòng đầu tiên cho thấy logic mã hóa hoạt động chính xác: các nhóm “Men 18-24” và “Men 25-34” được gán thành “Male”, các nhóm “Women 25-34” và “Women 35-44” được gán thành “Female”, còn nhóm “All Ages” được giữ nguyên là “All”.

Thống kê tần số cho thấy tổng số quan sát được phân bổ khá cân bằng giữa hai giới tính: Male có 80,281 quan sát và Female có 79,700 quan sát, với chênh lệch chỉ 581 bản ghi. Ngoài ra, có một nhóm đáng kể gồm 40,019 quan sát thuộc nhóm “All” - đại diện cho các chiến dịch không phân biệt giới tính cụ thể.

Kết quả mã hóa này đã tạo ra một biến phân loại mới rõ ràng và dễ sử dụng cho các phân tích tiếp theo, giúp đơn giản hóa việc so sánh hiệu quả chiến dịch marketing theo từng nhóm giới tính mục tiêu.

1.1.19 Mã hóa Lợi nhuận

dl <- dl %>% mutate(Profit_Tier = cut(ROI, 
                                     breaks = quantile(ROI, c(0, 0.5, 1), na.rm = TRUE), 
                                     labels = c("Low_ROI", "High_ROI"), 
                                     include.lowest = TRUE))
table(dl$Profit_Tier)
## 
##  Low_ROI High_ROI 
##   100292    99708
head(dl[c("ROI", "Profit_Tier")], 10)
##     ROI Profit_Tier
## 1  6.29    High_ROI
## 2  5.61    High_ROI
## 3  7.18    High_ROI
## 4  5.55    High_ROI
## 5  6.50    High_ROI
## 6  4.36     Low_ROI
## 7  2.86     Low_ROI
## 8  5.55    High_ROI
## 9  6.73    High_ROI
## 10 3.78     Low_ROI

Từ kết quả mã hóa lợi nhuận, có thể thấy việc phân loại ROI thành hai nhóm High_ROI và Low_ROI dựa trên giá trị trung vị đã được thực hiện thành công. Dữ liệu 10 dòng đầu tiên cho thấy các giá trị ROI từ 5.55 trở lên được xếp vào nhóm High_ROI, trong khi các giá trị từ 4.36 trở xuống được xếp vào nhóm Low_ROI.

Thống kê tần số cho thấy sự phân bổ gần như hoàn hảo giữa hai nhóm: Low_ROI có 100,292 quan sát và High_ROI có 99,708 quan sát, với chênh lệch chỉ 584 bản ghi. Điều này hoàn toàn phù hợp với logic phân chia dựa trên trung vị - một phương pháp phân tổ cân bằng giúp chia dataset thành hai phần tương đương nhau.

Kết quả mã hóa này đã tạo ra biến Profit_Tier mới rất hữu ích cho các phân tích so sánh hiệu quả đầu tư giữa các chiến dịch có ROI cao và thấp, từ đó giúp xác định các yếu tố ảnh hưởng đến hiệu suất tài chính của hoạt động marketing.

1.1.20 Mã hóa Chi phí

dl <- dl %>% mutate(Cost_Level = cut(Acquisition_Cost, 
                                    breaks = 3, 
                                    labels = c("Thap", "TB", "Cao"), 
                                    include.lowest = TRUE))
table(dl$Cost_Level)
## 
##  Thap    TB   Cao 
## 66704 66495 66801
head(dl[c("Acquisition_Cost", "Cost_Level")], 10)
##    Acquisition_Cost Cost_Level
## 1             16174        Cao
## 2             11566         TB
## 3             10200         TB
## 4             12724         TB
## 5             16452        Cao
## 6              9716       Thap
## 7             11067         TB
## 8             13280         TB
## 9             18066        Cao
## 10            13766         TB

Từ kết quả mã hóa chi phí, có thể thấy việc phân loại Acquisition_Cost thành ba nhóm Thấp, Trung bình và Cao đã được thực hiện thành công. Dữ liệu 10 dòng đầu tiên cho thấy các mức chi phí được phân bổ vào các nhóm tương ứng một cách hợp lý, ví dụ chi phí 9,716 được xếp vào nhóm “Thap”, chi phí 11,566 được xếp vào nhóm “TB”, và chi phí 18,066 được xếp vào nhóm “Cao”.

Thống kê tần số cho thấy sự phân bổ cực kỳ cân bằng giữa ba nhóm chi phí: nhóm Thấp có 66,704 quan sát, nhóm Trung bình có 66,495 quan sát và nhóm Cao có 66,801 quan sát. Sự chênh lệch giữa các nhóm là rất nhỏ, không đáng kể, chứng tỏ phương pháp sử dụng breaks = 3 đã hoạt động hiệu quả trong việc chia đều dữ liệu thành ba khoảng giá trị.

Kết quả mã hóa này đã tạo ra biến Cost_Level mới rất hữu ích cho việc phân tích và so sánh hiệu quả của các chiến dịch marketing theo mức độ ngân sách đầu tư, từ đó giúp đánh giá tối ưu hóa chi phí acquisition trong các hoạt động tiếp thị.

1.1.21 Tạo biến Thời gian

dl <- dl %>% mutate(Month = month(Date, label = TRUE))
table(dl$Month)
## 
##  Thg1  Thg2  Thg3  Thg4  Thg5  Thg6  Thg7  Thg8  Thg9 Thg10 Thg11 Thg12 
## 16988 15344 16988 16440 16988 16440 16988 16988 16440 16988 16440 16968
head(dl[c("Date", "Month")], 10)
##          Date Month
## 1  2021-01-01  Thg1
## 2  2021-01-02  Thg1
## 3  2021-01-03  Thg1
## 4  2021-01-04  Thg1
## 5  2021-01-05  Thg1
## 6  2021-01-06  Thg1
## 7  2021-01-07  Thg1
## 8  2021-01-08  Thg1
## 9  2021-01-09  Thg1
## 10 2021-01-10  Thg1

Từ kết quả tạo biến thời gian, có thể thấy việc trích xuất tháng từ biến Date đã được thực hiện thành công. Dữ liệu 10 dòng đầu tiên cho thấy các ngày cụ thể đã được chuyển đổi chính xác thành các tháng tương ứng trong năm.

Thống kê tần số theo tháng cho thấy dữ liệu được phân bổ khá đồng đều trong năm, với số lượng quan sát dao động từ 15,344 đến 16,988 giữa các tháng. Các tháng có số lượng quan sát cao nhất là Jan, Mar, May, Jul, Aug, Oct (16,988 quan sát), trong đó tháng Feb có số lượng thấp nhất (15,344 quan sát). Sự chênh lệch này có thể do số ngày trong tháng 2 ít hơn các tháng khác.

Kết quả này đã tạo ra biến Month mới rất hữu ích cho việc phân tích xu hướng theo mùa vụ, giúp xác định các tháng có hiệu suất marketing tốt nhất và lập kế hoạch chiến lược theo chu kỳ thời gian trong năm. Biến này sẽ cho phép so sánh hiệu quả chiến dịch theo từng tháng và phát hiện các mô hình theo mùa trong hoạt động tiếp thị.

1.1.22 Làm sạch Kênh

dl$Channel_Used <- as.factor(str_trim(dl$Channel_Used))
levels(dl$Channel_Used)
## [1] "Email"      "Facebook"   "Google Ads" "Instagram"  "Website"   
## [6] "YouTube"
head(dl$Channel_Used, 10)
##  [1] Google Ads Google Ads YouTube    YouTube    YouTube    Instagram 
##  [7] Website    Google Ads Facebook   Instagram 
## Levels: Email Facebook Google Ads Instagram Website YouTube

Từ kết quả làm sạch kênh, có thể thấy việc xử lý biến Channel_Used đã được thực hiện thành công. Các giá trị của kênh đã được chuẩn hóa và chuyển đổi thành định dạng factor với 6 mức độ rõ ràng: Email, Facebook, Google Ads, Instagram, Website và YouTube.

Dữ liệu 10 dòng đầu tiên cho thấy các giá trị kênh đã được làm sạch hoàn toàn, không còn khoảng trắng thừa hay định dạng không nhất quán. Các kênh được hiển thị rõ ràng và thống nhất, ví dụ “Google Ads” thay vì có thể có các biến thể như “Google ads” hay “Google_Ads” trước đó.

Kết quả này đã tạo ra một biến Channel_Used chuẩn hóa và sẵn sàng cho các phân tích tiếp theo, giúp việc so sánh hiệu quả giữa các kênh marketing khác nhau trở nên chính xác và đáng tin cậy hơn. Việc chuyển đổi sang dạng factor cũng tối ưu hóa cho các phân tích thống kê và trực quan hóa dữ liệu sau này.

1.2 CHƯƠNG 2: CÁC THỐNG KÊ CƠ BẢN

1.2.1 Thống kê Toàn cục và Kiểm tra Phân phối

Chúng ta sẽ tiến hành thực hiện lần lượt: Tổng qua hiệu suất, Kiểm tra phương sai, Tứ phân vị Clicks,Giá trị mode CR, Tương quan (Clicks/Imps).

dl %>% summarise(Avg_ROI = mean(ROI), Avg_CR = mean(Conversion_Rate))
##    Avg_ROI     Avg_CR
## 1 5.002438 0.08006965
dl %>% summarise(Var_AC = var(Acquisition_Cost), SD_AC = sd(Acquisition_Cost))
##     Var_AC    SD_AC
## 1 18815334 4337.665
quantile(dl$Clicks, probs = c(0.25, 0.5, 0.75))
## 25% 50% 75% 
## 325 550 775
names(sort(table(dl$Conversion_Rate), decreasing=TRUE)[1])
## [1] "0.13"
cor(dl$Clicks, dl$Impressions)
## [1] 0.00003306901

Về hiệu suất trung bình, các chiến dịch đạt mức ROI 5.002 và tỷ lệ chuyển đổi 0.080 (8.0%), cho thấy hiệu quả đầu tư ở mức khá tích cực. Tuy nhiên, chi phí acquisition có sự biến động rất lớn với phương sai lên tới 18,815,334 và độ lệch chuẩn 4,337.665, phản ánh sự chênh lệch đáng kể về ngân sách giữa các chiến dịch khác nhau.

Phân tích phân vị số lượt nhấp cho thấy dữ liệu được phân bổ cân đối: 25% chiến dịch có dưới 325 clicks, 50% đạt khoảng 550 clicks (trung vị), và 25% có trên 775 clicks. Sự phân bổ đều này giúp việc phân loại và so sánh hiệu quả giữa các nhóm chiến dịch theo quy mô traffic trở nên khách quan và hiệu quả.

Giá trị Mode của Conversion Rate là 0.13 (13%), cao hơn đáng kể so với giá trị trung bình toàn cục (0.080). Điều này cho thấy mặc dù trung bình tỷ lệ chuyển đổi chỉ đạt 8%, nhưng có một số lượng lớn các chiến dịch đạt được hiệu suất chuyển đổi tốt hơn ở mức 13%. Sự chênh lệch này gợi ý rằng phân phối của Conversion Rate có thể bị lệch, với nhiều chiến dịch tập trung ở mức cao hơn trung bình.

Tuy nhiên, kết quả tương quan giữa Clicks và Impressions cho thấy hệ số tương quan cực kỳ thấp, chỉ 3.3069e-05 (gần như bằng 0). Điều này hoàn toàn bất ngờ vì thông thường hai chỉ số này có mối quan hệ tuyến tính chặt chẽ - số lượt nhấp thường tỷ lệ thuận với số lần hiển thị. Kết quả này có thể chỉ ra vấn đề về chất lượng dữ liệu, hoặc các chiến dịch có tỷ lệ nhấp (CTR) biến động rất lớn không theo quy luật thông thường.

Sự kết hợp giữa Conversion Rate phổ biến ở mức cao nhưng mối quan hệ Clicks-Impressions bất thường cho thấy cần kiểm tra lại tính hợp lệ của dữ liệu và tìm hiểu các yếu tố ảnh hưởng đặc biệt đến hiệu suất các chiến dịch.

Tóm lại, dữ liệu cho thấy các chiến dịch duy trì được hiệu suất ổn định ở mức trung bình, nhưng có sự khác biệt lớn về quy mô ngân sách và lượng tương tác, tạo cơ sở cho các phân tích chuyên sâu theo từng phân khúc chiến dịch.

1.2.2 Thống kê so sánh theo từng nhóm

Chúng ta sẽ phân tích từng nhóm như sau:

1.2.2.1 ROI theo Kênh

dl %>% group_by(Channel_Used) %>% summarise(Avg_ROI = mean(ROI))
## # A tibble: 6 × 2
##   Channel_Used Avg_ROI
##   <fct>          <dbl>
## 1 Email           5.00
## 2 Facebook        5.02
## 3 Google Ads      5.00
## 4 Instagram       4.99
## 5 Website         5.01
## 6 YouTube         4.99

Kết quả phân tích cho thấy ROI trung bình giữa các kênh khá tương đồng, dao động quanh mức 5.0. Facebook có hiệu suất cao nhất (5.019) trong khi Instagram thấp nhất (4.989). Sự chênh lệch không đáng kể này cho thấy không có kênh nào thực sự vượt trội, và các kênh đều mang lại hiệu quả đầu tư tương đương nhau.

1.2.2.2 Chi phí theo Kênh

dl %>% group_by(Channel_Used) %>% summarise(Avg_AC = mean(Acquisition_Cost))
## # A tibble: 6 × 2
##   Channel_Used Avg_AC
##   <fct>         <dbl>
## 1 Email        12526.
## 2 Facebook     12511.
## 3 Google Ads   12528.
## 4 Instagram    12492.
## 5 Website      12488.
## 6 YouTube      12481.

Chi phí acquisition trung bình giữa các kênh gần như không có sự khác biệt, với mức chênh lệch chỉ khoảng 47 đơn vị giữa kênh cao nhất (Google Ads: 12,528) và thấp nhất (YouTube: 12,481). Điều này cho thấy chi phí thu hút khách hàng được phân bổ đồng đều across các kênh marketing.

1.2.2.3 Tổng Revenue theo Loại hình

dl %>% group_by(Campaign_Type) %>% summarise(Total_Revenue = sum(Revenue))
## # A tibble: 5 × 2
##   Campaign_Type Total_Revenue
##   <chr>                 <dbl>
## 1 Display         2504835969.
## 2 Email           2491040983.
## 3 Influencer      2518950805.
## 4 Search          2514603624.
## 5 Social Media    2487957293.

Chiến dịch Influencer tạo ra tổng doanh thu cao nhất (2.52B), tiếp theo là Search (2.51B) và Display (2.50B). Social Media có doanh thu thấp nhất (2.49B). Mặc dù chênh lệch không quá lớn, nhưng điều này cho thấy chiến lược Influencer và Search đang mang lại hiệu quả doanh thu tốt hơn các loại hình khác.

1.2.2.4 CR theo Giới tính

dl %>% group_by(Gender) %>% summarise(Avg_CR = mean(Conversion_Rate))
## # A tibble: 3 × 2
##   Gender Avg_CR
##   <chr>   <dbl>
## 1 All    0.0800
## 2 Female 0.0800
## 3 Male   0.0802

Tỷ lệ chuyển đổi trung bình giữa ba nhóm giới tính gần như bằng nhau, với nhóm Male đạt 0.08019, Female 0.08000 và All 0.07997. Sự khác biệt không đáng kể này cho thấy hiệu quả chuyển đổi không phụ thuộc nhiều vào yếu tố giới tính của đối tượng mục tiêu.

1.2.2.5 Tương tác theo Ngôn ngữ

dl %>% group_by(Language) %>% summarise(Median_Engagement = median(Engagement_Score))
## # A tibble: 5 × 2
##   Language Median_Engagement
##   <chr>                <dbl>
## 1 English                  5
## 2 French                   5
## 3 German                   5
## 4 Mandarin                 6
## 5 Spanish                  5

Tiếng Mandarin tạo ra mức độ tương tác trung vị cao nhất (6 điểm), trong khi tất cả các ngôn ngữ khác (English, French, German, Spanish) đều đạt mức 5 điểm. Kết quả này cho thấy nội dung bằng tiếng Mandarin có khả năng thu hút và giữ chân người dùng tốt hơn đáng kể.

1.2.2.6 AC theo Phân khúc

dl %>% group_by(Customer_Segment) %>% summarise(Avg_AC = mean(Acquisition_Cost))
## # A tibble: 5 × 2
##   Customer_Segment    Avg_AC
##   <chr>                <dbl>
## 1 Fashionistas        12503.
## 2 Foodies             12525.
## 3 Health & Wellness   12504.
## 4 Outdoor Adventurers 12509.
## 5 Tech Enthusiasts    12480.

Phân khúc Foodies có chi phí acquisition cao nhất (12,525), trong khi Tech Enthusiasts có chi phí thấp nhất (12,480). Sự chênh lệch khoảng 45 đơn vị cho thấy không có sự khác biệt quá lớn về chi phí thu hút giữa các phân khúc khách hàng khác nhau.

1.2.2.7 Biến động ROI theo Phân khúc

dl %>% group_by(Customer_Segment) %>% summarise(Var_ROI = var(ROI))
## # A tibble: 5 × 2
##   Customer_Segment    Var_ROI
##   <chr>                 <dbl>
## 1 Fashionistas           3.02
## 2 Foodies                3.01
## 3 Health & Wellness      3.02
## 4 Outdoor Adventurers    3.00
## 5 Tech Enthusiasts       3.00

Tất cả các phân khúc đều có mức độ biến động ROI tương đối ổn định với phương sai khoảng 3.0. Phân khúc Fashionistas có ROI biến động nhiều nhất (3.015), trong khi Outdoor Adventurers có ROI ổn định nhất (3.001). Điều này cho thấy mức độ rủi ro khi đầu tư vào các phân khúc là tương đương nhau.

1.2.2.8 Avg CR theo Thời lượng

dl %>% group_by(Duration) %>% summarise(Avg_CR = mean(Conversion_Rate))
## # A tibble: 4 × 2
##   Duration Avg_CR
##      <dbl>  <dbl>
## 1       15 0.0801
## 2       30 0.0802
## 3       45 0.0800
## 4       60 0.0800

Chiến dịch kéo dài 30 ngày có tỷ lệ chuyển đổi cao nhất (0.08018), trong khi chiến dịch 45 ngày có CR thấp nhất (0.07995). Tuy nhiên, sự chênh lệch rất nhỏ này cho thấy thời lượng chiến dịch không ảnh hưởng đáng kể đến hiệu quả chuyển đổi.

1.2.2.9 Phân bố chi phí theo Công ty

dl %>% group_by(Company) %>% summarise(Q3_AC = quantile(Acquisition_Cost, 0.75))
## # A tibble: 5 × 2
##   Company              Q3_AC
##   <chr>                <dbl>
## 1 Alpha Innovations   16261 
## 2 DataTech Solutions  16299 
## 3 Innovate Industries 16258 
## 4 NexGen Systems      16224.
## 5 TechCorp            16281

Các công ty có mức chi tiêu ở phần tư thứ ba khá tương đồng, dao động từ 16,223 đến 16,299. DataTech Solutions có xu hướng chi tiêu cao nhất (16,299), trong khi NexGen Systems chi tiêu thấp nhất (16,224). Điều này phản ánh sự tương đồng trong chiến lược ngân sách giữa các công ty.

1.2.2.10 Avg ROI theo Month

dl %>% group_by(Month) %>% summarise(Avg_ROI = mean(ROI))
## # A tibble: 12 × 2
##    Month Avg_ROI
##    <ord>   <dbl>
##  1 Thg1     5.01
##  2 Thg2     5.01
##  3 Thg3     4.98
##  4 Thg4     4.99
##  5 Thg5     5.02
##  6 Thg6     4.99
##  7 Thg7     4.98
##  8 Thg8     5.00
##  9 Thg9     5.03
## 10 Thg10    5.02
## 11 Thg11    5.00
## 12 Thg12    5.00

Tháng 9 có hiệu suất ROI tốt nhất (5.029), trong khi tháng 7 có hiệu suất thấp nhất (4.983). Các tháng cuối năm (Sept, Oct) và đầu năm (Jan) thường có ROI cao hơn, cho thấy xu hướng theo mùa trong hiệu quả đầu tư marketing.

1.2.3 Thống kê tần số và các chỉ số đặc biệt

1.2.3.1 Chiến dịch Tốt nhất

dl %>% filter(ROI > 7) %>% count(Campaign_Type)
##   Campaign_Type    n
## 1       Display 6636
## 2         Email 6532
## 3    Influencer 6735
## 4        Search 6822
## 5  Social Media 6576

Phân tích ROI cao (ROI > 7):Có tổng cộng 33,301 chiến dịch đạt ROI > 7. Chiến dịch Search có số lượng cao nhất (6,822), tiếp theo là Influencer (6,735) và Display (6,636). Social Media có số lượng thấp nhất (6,576). Sự phân bổ khá đồng đều cho thấy cả 5 loại hình chiến dịch đều có khả năng tạo ra ROI xuất sắc.

1.2.3.2 Tần số Kênh/Địa điểm

dl %>% count(Channel_Used, Location) %>% arrange(desc(n))
##    Channel_Used    Location    n
## 1    Google Ads       Miami 6846
## 2       YouTube       Miami 6795
## 3       Website    New York 6782
## 4         Email    New York 6779
## 5     Instagram     Chicago 6750
## 6         Email       Miami 6747
## 7       YouTube     Chicago 6730
## 8         Email Los Angeles 6728
## 9     Instagram    New York 6716
## 10    Instagram Los Angeles 6709
## 11   Google Ads     Houston 6706
## 12      Website Los Angeles 6702
## 13      YouTube    New York 6691
## 14        Email     Houston 6678
## 15   Google Ads Los Angeles 6676
## 16     Facebook       Miami 6670
## 17        Email     Chicago 6667
## 18    Instagram     Houston 6632
## 19      Website       Miami 6626
## 20     Facebook     Chicago 6625
## 21      Website     Chicago 6625
## 22      Website     Houston 6625
## 23   Google Ads     Chicago 6613
## 24   Google Ads    New York 6597
## 25      YouTube Los Angeles 6596
## 26    Instagram       Miami 6585
## 27      YouTube     Houston 6580
## 28     Facebook Los Angeles 6536
## 29     Facebook     Houston 6529
## 30     Facebook    New York 6459

Dựa trên kết quả thống kê tần số kết hợp giữa kênh marketing và địa điểm, có thể thấy chiến lược phân bổ ngân sách được triển khai khá đồng đều across các kênh và địa điểm, nhưng vẫn có những ưu tiên rõ rệt.

Sự kết hợp phổ biến nhất là Google Ads tại Miami với 6,846 chiến dịch, tiếp theo là YouTube tại Miami (6,795) và Website tại New York (6,782).

Miami nổi bật là thị trường trọng điểm khi xuất hiện trong 4/10 kết hợp hàng đầu, đặc biệt với các kênh quảng cáo trả tiền như Google Ads và YouTube.

New York cũng là thị trường quan trọng khác, chủ yếu tập trung vào các kênh owned media như Website và Email.

Sự phân bổ này cho thấy chiến lược marketing được tối ưu hóa theo đặc thù từng khu vực địa lý, với Miami thiên về quảng cáo performance và New York tập trung vào các kênh truyền thông sở hữu.

1.2.3.3 Tần số ROI thấp

dl %>% filter(Profit_Tier == "Low_ROI") %>% count(Channel_Used)
##   Channel_Used     n
## 1        Email 16865
## 2     Facebook 16261
## 3   Google Ads 16761
## 4    Instagram 16890
## 5      Website 16591
## 6      YouTube 16924

YouTube có số chiến dịch ROI thấp nhiều nhất (16,924), tiếp theo là Instagram (16,890) và Email (16,865). Facebook có ít chiến dịch ROI thấp nhất (16,261). Tuy nhiên, sự chênh lệch giữa các kênh không quá lớn, cho thấy rủi ro được phân bổ tương đối đồng đều.

1.2.3.4 CR của top 3 công ty

dl %>% filter(Company %in% c("TechCorp", "DataTech Solutions", "Alpha Innovations")) %>% summarise(Avg_CR = mean(Conversion_Rate))
##       Avg_CR
## 1 0.08007664

Ba công ty hàng đầu (TechCorp, DataTech Solutions, Alpha Innovations) có tỷ lệ chuyển đổi trung bình là 0.08008 (8.008%). Giá trị này gần như tương đương với trung bình toàn cục (0.08007), cho thấy các công ty lớn không có lợi thế đặc biệt về hiệu quả chuyển đổi so với mặt bằng chung.

1.2.3.5 Kiểm tra lệch

dl %>% summarise(Skew_ROI = moments::skewness(ROI))
##       Skew_ROI
## 1 -0.005043353

Độ lệch (Skewness) của ROI là -0.00504, gần như bằng 0. Điều này cho thấy phân phối của ROI gần như đối xứng hoàn hảo. Không có sự lệch đáng kể nào, chứng tỏ dữ liệu ROI phân bổ cân đối và không có hiện tượng các chiến dịch có ROI cực cao hoặc cực thấp chiếm ưu thế.

1.3 CHƯƠNG 3:CÁC ĐỒ THỊ TRỰC QUAN HÓA DỮ LIỆU

1.3.1 Nhóm đồ thị hiệu suất tài chính

ggplot(dl, aes(x = ROI)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "#0072B2", color = "white", alpha = 0.8) +
  geom_density(color = "#D55E00", linewidth = 1) +
  geom_vline(aes(xintercept = mean(ROI)), color = "black", linetype = "dashed", linewidth = 1) +
  labs(title = "Phân phối Tỷ suất Hoàn vốn (ROI)", x = "ROI", y = "Mật độ") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_x_continuous(limits = c(0, 10))

Đồ thị phân phối ROI cho thấy tỷ suất hoàn vốn tập trung chủ yếu trong khoảng từ 2.5% đến 7.5%. Đỉnh của đường phân phối nằm ở mức ROI khoảng 5.0%, điều này cho thấy đây là mức ROI phổ biến và có khả năng xảy ra cao nhất. Sự phân bố có dạng hình chuông tương đối đối xứng, gợi ý rằng đây có thể là một phân phối chuẩn. Điều này có nghĩa là phần lớn các chiến dịch hoặc khoản đầu tư đều mang lại mức ROI xoay quanh trung bình 5%, trong khi các kết quả ROI quá thấp (dưới 2.5%) hoặc quá cao (trên 7.5%) là ít phổ biến hơn.

monthly_roi <- dl %>% group_by(Month) %>% summarise(Avg_ROI = mean(ROI))
ggplot(monthly_roi, aes(x = Month, y = Avg_ROI, group = 1)) +
  geom_line(color = "#0072B2", linewidth = 1.2) +
  geom_point(color = "#D55E00", size = 3) +
  geom_smooth(method = "loess", se = FALSE, color = "grey50", linetype = "dotted", linewidth = 0.5) +
  geom_hline(aes(yintercept = mean(dl$ROI)), color = "black", linetype = "dashed") +
  labs(title = "Xu hướng ROI Trung bình qua các Tháng", x = "Tháng", y = "Avg ROI") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

Đồ thị đường biểu diễn xu hướng ROI trung bình hàng tháng trong năm cho thấy một sự ổn định đáng kể. Giá trị ROI dao động trong một biên độ rất hẹp, từ khoảng 4.99% đến 5.03%. Mặc dù có những biến động nhỏ qua từng tháng, không có một xu hướng tăng hoặc giảm rõ rệt nào throughout the year. Sự ổn định này cho thấy hiệu suất đầu tư hoặc hiệu quả chiến dịch marketing được duy trì khá nhất quán trong suốt cả năm, không chịu ảnh hưởng lớn bởi các yếu tố theo mùa.

ggplot(dl, aes(x = Customer_Segment, y = ROI, fill = Customer_Segment)) +
  geom_violin(trim = FALSE, alpha = 0.6) +
  geom_boxplot(width = 0.1, outlier.shape = NA) +
  coord_flip() +
  labs(title = "Phân phối và Biến động ROI theo phân khúc", x = "Phân khúc Khách hàng", y = "ROI") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Set2")

Khi so sánh ROI giữa các nhóm khách hàng khác nhau, chúng ta thấy sự khác biệt rõ rệt. Cụ thể, phân khúc “Tech Enthusiasts” (Những người đam mê Công nghệ) dường như có mức ROI cao nhất, vượt trội hơn hẳn so với các phân khúc còn lại. Tiếp theo đó có thể là phân khúc “Outdoor Adventurers” (Nhà thám hiểm Ngoài trời). Trong khi đó, các phân khúc như “Health & Wellness” (Sức khỏe & Thể chất), “Foodies” (Tín đồ Ẩm thực) và “Fashionistas” (Tín đồ Thời trang) có mức ROI thấp hơn. Kết quả này cung cấp một thông tin chiến lược quan trọng: các chiến dịch hướng đến nhóm khách hàng đam mê công nghệ mang lại hiệu quả tài chính cao nhất, và nên được ưu tiên phân bổ ngân sách.

company_revenue <- dl %>% group_by(Company) %>% summarise(Total_Revenue = sum(Revenue))
ggplot(company_revenue, aes(x = reorder(Company, Total_Revenue), y = Total_Revenue, fill = Company)) +
  geom_col() +
  geom_text(aes(label = dollar(Total_Revenue / 1e6, prefix = "$", suffix = "M")), vjust = -0.5, size = 4) +
  labs(title = "Tổng Lợi nhuận theo Tên Công ty", x = "Công ty", y = "Total Revenue") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Paired")

Biểu đồ cột so sánh tổng lợi nhuận của 5 công ty trong lĩnh vực công nghệ. Có thể thấy sự chênh lệch rõ rệt về quy mô lợi nhuận giữa các công ty.

TechCorp là công ty dẫn đầu với lợi nhuận cao vượt trội, ước tính khoảng 2.5 tỷ USD từ thang đo, chiếm vị trí độc tôn. Theo sau đó, Alpha Innovations và DataTech Solutions có mức lợi nhuận tương đương nhau, đạt khoảng một nửa so với TechCorp, ở mức xấp xỉ 1.25 tỷ USD. Ở nhóm cuối bảng, NexGen Systems và Innovate Industries có lợi nhuận khiêm tốn nhất, chỉ bằng một phần nhỏ so với các công ty kể trên.

Tổng quan thì 4 đồ thị trên đều tập trung vào chỉ số ROI và đánh giá hiệu suất tài chính.

1.3.2 Nhóm đồ thị kênh Marketing

ggplot(dl, aes(x = reorder(Channel_Used, ROI, FUN = median), y = ROI, fill = Channel_Used)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 1) +
  stat_summary(fun = mean, geom = "point", shape = 20, size = 4, color = "black") +
  coord_flip() +
  labs(title = "Phân phối ROI theo Kênh Marketing", x = "Kênh Sử dụng", y = "ROI") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Set3")

Biểu đồ này cho thấy hiệu suất (ROI) được phân bổ khác biệt rõ rệt giữa các kênh marketing. Google Ads và Website là hai kênh có hiệu suất cao vượt trội, với ROI tập trung ở mức từ 6 đến 8, cho thấy đây là những kênh mang lại giá trị tốt nhất. Tiếp theo là nhóm kênh có hiệu suất trung bình như Facebook và Email. Ở nhóm cuối, Instagram và YouTube có phổ ROI thấp nhất, chủ yếu dưới mức 4. Điều này cung cấp manh mối quan trọng để ưu tiên ngân sách cho các kênh hiệu quả cao như Google Ads và Website.

ggplot(dl, aes(x = Cost_Level, y = Acquisition_Cost, fill = Channel_Used)) +
  geom_boxplot(alpha = 0.7, position = position_dodge(width = 0.8)) +
  geom_hline(aes(yintercept = median(Acquisition_Cost)), color = "red", linetype = "dashed") +
  labs(title = "Phân phối Chi phí AC theo Cấp độ và Kênh", x = "Cấp độ Chi phí", y = "Acquisition Cost") +
  theme(legend.title = element_text(face = "bold"), plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_y_continuous(labels = dollar_format())

Biểu đồ mật độ này tiết lộ mối quan hệ thú vị giữa kênh marketing và mức chi phí bỏ ra. Các kênh như Google Ads và YouTube có phân phối chi phí rộng và nghiêng nhiều về cấp độ Cao, chứng tỏ đây là những kênh đòi hỏi ngân sách lớn. Ngược lại, Email và Facebook chủ yếu tập trung ở mức chi phí Thấp đến Trung bình, khẳng định đây là những kênh có chi phí hợp lý. Riêng Website có phân phối khá đồng đều ở cả ba mức chi phí, cho thấy tính linh hoạt trong việc phân bổ ngân sách.

ggplot(dl, aes(x = Company, fill = Campaign_Type)) +
  geom_bar(position = "fill") +
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey50") +
  scale_y_continuous(labels = percent) +
  labs(title = "Tỷ lệ phân bổ Loại hình chiến dịch theo công ty", x = "Công ty", y = "Tỷ lệ") +
  theme(legend.title = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Accent")

Biểu đồ này cho thấy chiến lược marketing đa dạng và đặc thù của từng công ty. TechCorp có chiến lược rất cân bằng giữa các loại hình. Trong khi đó, Alpha Innovations và Innovate Industries lại phụ thuộc rất nặng vào chiến dịch “Social Media”. Ngược lại, NexGen Systems và DataTech Solutions ưu tiên chiến lược dựa trên “Search” và “Email”. Sự khác biệt này phản ánh định hướng thị trường và thế mạnh riêng của mỗi doanh nghiệp.

ggplot(dl, aes(x = Channel_Used, fill = Profit_Tier)) +
  geom_bar(position = "fill") +
  geom_text(stat = "count", aes(label = after_stat(count)), position = position_fill(vjust = 0.5), color = "white") +
  scale_y_continuous(labels = percent) +
  labs(title = "Tỷ lệ chiến dịch ROI Cao/Thấp theo Kênh", x = "Kênh Sử dụng", y = "Tỷ lệ") +
  theme(legend.title = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_manual(values = c("Low_ROI" = "#E69F00", "High_ROI" = "#009E73"))

Đây là biểu đồ then chốt, kết nối trực tiếp kênh marketing với hiệu quả thực tế. Có thể thấy sự tương quan rõ ràng: những kênh có chi phí thấp (theo biểu đồ 2) lại thường có tỷ lệ chiến dịch ROI Cao chiếm ưu thế. Cụ thể, Email là kênh xuất sắc nhất với gần 100% chiến dịch đạt ROI cao. Website cũng là một kênh hiệu quả với tỷ lệ ROI cao áp đảo. Ngược lại, các kênh có chi phí cao như YouTube và Google Ads lại có tỷ lệ chiến dịch ROI Thấp rất lớn (trên 75%), cho thấy mức độ rủi ro và kém hiệu quả chi phí tiềm ẩn.

1.3.3 Nhóm đồ thị theo loại hình chiến dịch

revenue_summary <- dl %>% group_by(Campaign_Type) %>% summarise(Total_Revenue = sum(Revenue))
ggplot(revenue_summary, aes(x = reorder(Campaign_Type, Total_Revenue), y = Total_Revenue, fill = Campaign_Type)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = dollar(Total_Revenue / 1e6, prefix = "", suffix = "M")), vjust = -0.5, size = 4) +
  labs(title = "Tổng Lợi nhuận theo loại Chiến dịch", x = "Loại Chiến dịch", y = "Total Revenue") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_y_continuous(labels = dollar_format(suffix = "Tỷ"))

Search và Influencer là hai loại chiến dịch dẫn đầu, mang về tổng doanh thu cao nhất, ước tính đều đạt trên 2.4 tỷ USD. Điều này cho thấy đây là hai kênh tiếp thị hiệu quả nhất trong việc tạo ra nguồn thu.

Theo sau đó, các chiến dịch Email, Social Media và Display có mức doanh thu thấp hơn đáng kể, chỉ ở khoảng dưới 500 triệu USD. Điều này chỉ ra rằng mặc dù có thể có hiệu quả về mặt tỷ suất lợi nhuận (ROI) như đã thấy ở các biểu đồ trước, quy mô doanh thu trực tiếp từ các chiến dịch này lại không cao bằng Search và Influencer.

ggplot(dl, aes(x = Acquisition_Cost, y = ROI, color = Campaign_Type)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.5) +
  facet_wrap(~Campaign_Type, scales = "free") +
  labs(title = "Tương quan chi phí (AC) và ROI theo loại chiến dịch", x = "Acquisition Cost", y = "ROI") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_color_brewer(palette = "Set1")

Chiến lược marketing hiệu quả nhất trong bộ dữ liệu này là một chiến lược đa kênh có chủ đích, tập trung vào việc tối ưu hóa chất lượng chuyển đổi để tối đa hóa lợi nhuận.

ggplot(dl, aes(x = CTR, y = Conversion_Rate)) +
  geom_point(aes(color = factor(Duration)), alpha = 0.6) +
  geom_smooth(method = "lm", color = "black", se = FALSE) +
  labs(title = "Tương quan CTR và CR theo thời lượng", x = "Click-Through Rate (CTR)", y = "Conversion Rate") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_x_continuous(labels = percent) +
  scale_color_discrete(name = "Duration (Days)")

Một chiến lược Marketing hiệu quả phải là một chiến lược đa kênh có chủ đích, trong đó việc đầu tư vào cải thiện CR là ưu tiên hàng đầu để tăng lợi nhuận, đồng thời phải duy trì tính linh hoạt cao để điều chỉnh loại hình chiến dịch (Search, Influencer, Email) theo từng phân khúc và thị trường cụ thể.

1.3.4 Nhóm đồ thị về hành vi và yếu tố ảnh hưởng đến chuyển đổi

ggplot(dl, aes(x = Conversion_Rate, y = ROI)) +
  geom_point(aes(color = Channel_Used), alpha = 0.5) +
  geom_smooth(method = "lm", color = "black", linewidth = 1) +
  geom_vline(xintercept = 0.15, color = "red", linetype = "dotted") +
  labs(title = "Mối quan hệ giữa ROI và Tỷ lệ Chuyển đổi", x = "Conversion Rate", y = "ROI") +
  theme(legend.title = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_x_continuous(labels = percent)

Biểu đồ phân tán (scatter plot) này kết nối hai chỉ số quan trọng nhất: hiệu quả tài chính (ROI) và hiệu quả hành vi (Conversion Rate). Mối tương quan tích cực mạnh mẽ giữa chúng là điểm đáng chú ý nhất: một tỷ lệ chuyển đổi cao thường đi kèm với một ROI cao.

ggplot(dl, aes(x = Impressions, y = Clicks, color = Channel_Used)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", color = "black", linewidth = 0.5) +
  scale_x_log10(labels = comma) +
  scale_y_log10(labels = comma) +
  labs(title = "Clicks với Impressions (Log Scale) theo kênh", x = "Impressions (Log)", y = "Clicks (Log)") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_color_brewer(palette = "Dark2")

Biểu đồ “Clicks vs Impressions” trên thang logarit cho thấy một mối tương quan tích cực, tuyến tính rất rõ ràng: số lượt hiển thị càng cao thì số lượt nhấp chuột càng tăng. Điều này chứng tỏ việc gia tăng phạm vi tiếp cận (reach) là nền tảng cơ bản để thu hút sự tương tác.

Tuy nhiên, khi quan sát theo từng kênh, chúng ta thấy sự khác biệt về hiệu suất:

Google Ads và Facebook có “mật độ” điểm dữ liệu dày đặc ở khu vực có cả số lượt hiển thị và lượt nhấp chuột cao, khẳng định đây là hai kênh mạnh để kết hợp giữa quy mô và lượt tương tác.

Email cho thấy một mô hình đặc biệt: mặc dù số lượt hiển thị thấp hơn đáng kể so với các kênh còn lại, nó vẫn thu về số lượt nhấp chuột tương đối cao. Điều này gợi ý rằng đối tượng nhận email có mức độ tương tác và sẵn sàng nhấp chuột rất cao.

ggplot(dl, aes(x = Conversion_Rate, fill = Channel_Used)) +
  geom_density(alpha = 0.4) +
  geom_vline(xintercept = mean(dl$Conversion_Rate), color = "black", linetype = "dotted") +
  facet_wrap(~Channel_Used, scales = "free_y") +
  labs(title = "Phân phối tỷ lệ chuyển đổi theo kênh", x = "Conversion Rate", y = "Mật độ") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_x_continuous(labels = percent)

Email và Website một lần nữa chứng minh là những kênh xuất sắc, không chỉ có tỷ lệ chuyển đổi trung bình cao nhất (khoảng 8-10%) mà còn có phân phối ổn định, ít biến động.

Google Ads có trung vị ở mức trung bình, nhưng phạm vi biến động khá rộng, cho thấy hiệu suất có thể thay đổi tùy từng chiến dịch.

Instagram và YouTube có tỷ lệ chuyển đổi trung bình thấp nhất và rất ổn định ở mức thấp đó. Điều này phù hợp với các biểu đồ trước, cho thấy đây là những kênh có quy mô tương tác lớn nhưng hiệu quả chuyển đổi trực tiếp lại hạn chế.

gender_cr <- dl %>% group_by(Gender) %>% summarise(Avg_CR = mean(Conversion_Rate))
ggplot(gender_cr, aes(x = Gender, y = Avg_CR, fill = Gender)) +
  geom_col() +
  geom_text(aes(label = percent(Avg_CR, accuracy = 0.1)), vjust = -0.5) +
  geom_hline(aes(yintercept = mean(dl$Conversion_Rate)), color = "red", linetype = "dashed") +
  labs(title = "Tỷ lệ chuyển đổi trung bình theo giới tính", x = "Giới tính", y = "Avg Conversion Rate") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_y_continuous(labels = percent)

Biểu đồ này cho thấy một kết quả rất đáng chú ý: Tỷ lệ chuyển đổi trung bình là hoàn toàn giống nhau (8%) cho cả ba nhóm: Nam, Nữ và Toàn bộ đối tượng. Điều này mang lại một insight quan trọng: hiệu quả chuyển đổi của chiến dịch không bị ảnh hưởng bởi yếu tố giới tính. Do đó, các quyết định phân bổ ngân sách hoặc tối ưu hóa nên tập trung vào các tiêu chí khác, như độ tuổi, sở thích hoặc kênh truyền thông, thay vì dựa trên giới tính.

Kết luận: Phân tích cho thấy Email là kênh marketing hiệu quả vượt trội, mang lại tỷ lệ tương tác chất lượng, tỷ lệ chuyển đổi cao và dẫn đến ROI tốt nhất, mặc dù có quy mô tiếp cận không lớn. Trong khi đó, các kênh có quy mô lớn như YouTube và Instagram lại cho hiệu quả chuyển đổi và tài chính thấp hơn hẳn. Yếu tố nhân khẩu học như giới tính không ảnh hưởng đến tỷ lệ chuyển đổi.

1.3.5 Nhóm đồ thị theo phân khúc và tương tác

segment_revenue <- dl %>% group_by(Customer_Segment) %>% summarise(Total_Revenue = sum(Revenue))
ggplot(segment_revenue, aes(x = reorder(Customer_Segment, Total_Revenue), y = Total_Revenue, fill = Customer_Segment)) +
  geom_col(width = 0.8) +
  geom_text(aes(label = dollar(Total_Revenue / 1e6, prefix = "$", suffix = "M")), hjust = -0.1, size = 3) +
  coord_flip() +
  labs(title = "Tổng lợi nhuận theo phân khúc khách hàng", x = "Phân khúc", y = "Total Revenue") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Dark2")

Biểu đồ này cho thấy sự chênh lệch doanh thu rất lớn giữa các nhóm đối tượng khách hàng. Tech Enthusiasts (Những người đam mê Công nghệ) là phân khúc mang lại tổng doanh thu cao vượt trội, ước tính đạt khoảng 2.5 tỷ USD. Ở vị trí thứ hai là Outdoor Adventurers (Nhà thám hiểm Ngoài trời) với doanh thu cũng ở mức rất cao. Trong khi đó, ba phân khúc Foodies (Tín đồ Ẩm thực), Health & Wellness (Sức khỏe & Thể chất) và Fashionistas (Tín đồ Thời trang) có quy mô doanh thu nhỏ hơn đáng kể. Kết quả này khẳng định tầm quan trọng của việc tập trung nguồn lực vào các phân khúc có giá trị cao.

language_engagement <- dl %>% group_by(Language) %>% summarise(Avg_Engagement = mean(Engagement_Score))
ggplot(language_engagement, aes(x = reorder(Language, Avg_Engagement), y = Avg_Engagement, fill = Language)) +
  geom_col() +
  geom_text(aes(label = round(Avg_Engagement, 2)), vjust = -0.5) +
  geom_hline(aes(yintercept = mean(dl$Engagement_Score)), color = "red", linetype = "dashed") +
  labs(title = "Điểm tương tác trung bình theo ngôn ngữ", x = "Ngôn ngữ", y = "Avg Engagement Score") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Pastel2")

Biểu đồ này tiết lộ một insight thú vị: Điểm tương tác trung bình gần như giống hệt nhau trên tất cả các ngôn ngữ, dao động trong khoảng rất hẹp từ 5.47 đến 5.51. Kết quả này cho thấy hiệu quả của chiến dịch, đo lường bằng mức độ tương tác, là nhất quán và không bị ảnh hưởng bởi rào cản ngôn ngữ. Điều này gợi ý rằng thông điệp và nội dung marketing có tính phổ quát cao và được tiếp nhận tương đương bởi các nhóm khán giả khác nhau về ngôn ngữ.

location_clicks <- dl %>% group_by(Location) %>% summarise(Total_Clicks = sum(Clicks))
ggplot(location_clicks, aes(x = reorder(Location, Total_Clicks), y = Total_Clicks, fill = Location)) +
  geom_col() +
  geom_text(aes(label = comma(Total_Clicks)), hjust = -0.1, size = 4) +
  coord_flip() +
  labs(title = "Tổng lượt nhấp (Clicks) theo Địa điểm", x = "Địa điểm", y = "Total Clicks") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_y_continuous(labels = comma)

Biểu đồ này chỉ ra sự khác biệt về mức độ tương tác giữa các thành phố. New York và Miami là hai thị trường dẫn đầu với tổng số lượt nhấp chuột cao nhất, lên tới khoảng 20-22 triệu lượt. Theo sát là Chicago và Los Angeles. Houston là thành phố có lượng tương tác thấp nhất trong nhóm. Dữ liệu này cung cấp manh mối quan trọng cho việc ưu tiên các chiến dịch địa phương hoặc điều chỉnh ngân sách tiếp thị theo khu vực địa lý để tối đa hóa lượt tương tác.

ggplot(dl, aes(x = Channel_Used, y = Clicks, fill = Channel_Used)) +
  geom_boxplot(outlier.alpha = 0.3) +
  stat_summary(fun = mean, geom = "point", shape = 8, size = 3, color = "black") +
  labs(title = "Phân phối lượt nhấp (Clicks) theo Kênh", x = "Kênh", y = "Clicks") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_y_continuous(labels = comma)

Biểu đồ hộp (box plot) này cho thấy sự khác biệt về khả năng tạo ra lượt nhấp chuột của từng kênh. Google Ads và YouTube là hai kênh có số lượt nhấp chuột trung bình cao nhất và có phạm vi biến động rộng, chứng tỏ đây là những kênh mạnh để thu hút lượng tương tác lớn. Facebook và Instagram có mức trung bình thấp hơn. Đáng chú ý, Email và Website có trung vị thấp nhất, phù hợp với đặc điểm là những kênh tập trung vào chất lượng hơn là số lượng lượt nhấp chuột.

ggplot(dl, aes(x = Engagement_Score)) +
  geom_histogram(bins = 10, fill = "#88CCEE", color = "black") +
  geom_vline(aes(xintercept = median(Engagement_Score)), color = "red", linetype = "solid") +
  geom_text(aes(x = median(Engagement_Score) + 0.5, y = 500, label = "Median"), color = "red") +
  labs(title = "Phân phối điểm Tương tác (0-10)", x = "Engagement Score", y = "Tần suất") +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_x_continuous(breaks = 0:10)

Biểu đồ tần suất này cho thấy điểm số tương tác (Engagement Score) của người dùng được phân bổ khá đồng đều trên thang điểm từ 0 đến 10, với một đỉnh cao rõ rệt ở mức điểm 5. Điều này cho thấy phần lớn người dùng có mức độ tương tác ở cấp độ trung bình. Sự phân bổ rộng cũng chỉ ra rằng có một sự đa dạng lớn trong hành vi tương tác, từ những người hầu như không tương tác (điểm 0-2) đến những người cực kỳ tích cực (điểm 9-10).

2 PHẦN 2: BỘ DỮ LIỆU BÁO CÁO TÀI CHÍNH IMP

2.1 CHƯƠNG 1: GIỚI THIỆU BỘ DỮ LIỆU, XỬ LÝ XỬ LIỆU VÀ MÃ HÓA DỮ LIỆU

2.1.1 GIỚI THIỆU BỘ DỮ LIỆU

2.1.1.1 Đọc dữ liệu

ta <- read_excel("D:/HK3-2025/NGON_NGU_LAP_TRINH/bctc IMP.xlsx")

Trong suốt giai đoạn 10 năm từ 2015 đến 2024, doanh nghiệp đã chứng kiến sự tăng trưởng vượt bậc về quy mô và lợi nhuận. Lợi nhuận sau thuế tăng trưởng liên tục và ấn tượng, từ mức 92.275 tỷ đồng năm 2015 lên đến 320.862 tỷ đồng năm 2024, gấp khoảng 3.5 lần, cho thấy khả năng mở rộng thị phần và hiệu quả kinh doanh ngày càng được cải thiện. Đặc biệt, các năm 2019-2020 và 2022-2023 là những giai đoạn tăng tốc mạnh mẽ, đưa lợi nhuận vượt mốc 200.000 tỷ và sau đó là 300.000 tỷ đồng.

Tuy nhiên, đằng sau thành công về lợi nhuận là những thách thức tài chính không nhỏ. Năm 2023 trở thành điểm đáng lo ngại khi lần đầu tiên sau nhiều năm, dòng tiền từ hoạt động kinh doanh (CFO) rơi vào trạng thái âm (~30.308 tỷ đồng). Nguyên nhân chính đến từ sự gia tăng mạnh của các khoản phải thu (~199.919 tỷ) và tồn kho (~260.749 tỷ), phản ánh áp lực thanh khoản và hiệu quả quản lý vốn lưu động chưa thực sự tốt. Bên cạnh đó, doanh nghiệp có xu hướng đầu tư mạnh qua nhiều năm, thể hiện ở dòng tiền đầu tư (CFI) âm liên tục, chủ yếu cho mua sắm tài sản cố định và gửi tiền tiết kiệm. Để duy trì hoạt động và mở rộng đầu tư, doanh nghiệp đã phải dựa nhiều vào vay nợ, với các khoản vay mới và trả nợ gốc luân phiên ở quy mô lớn.

Đến năm 2024, tín hiệu tích cực đã trở lại khi dòng tiền hoạt động phục hồi mạnh mẽ, đạt 216.267 tỷ đồng, đồng thời doanh nghiệp tiếp tục chú trọng trả nợ gốc, cho thấy nỗ lực cải thiện cơ cấu tài chính và giảm sự phụ thuộc vào đòn bẩy. Dù vậy, bài toán về quản lý vốn lưu động, kiểm soát công nợ và nâng cao hiệu suất sử dụng tài sản vẫn là những thách thức then chốt cần giải quyết để đảm bảo sự phát triển bền vững trong tương lai.

2.1.1.2 Xem dữ liệu

show(ta) %>% kable()
## # A tibble: 10 × 18
##     year LoiNhuanSauThue   Tien_DauKy  Tien_CuoiKy     CFO_Tong      KhauHao
##    <dbl>           <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
##  1  2015     92275349999 178550050326  87841659460  81130888888  38402557093
##  2  2016    101159344647  87841659460 100127453686  84650650055  37320990534
##  3  2017    117360040786 100127453686 106457131642  97212899364  31379088060
##  4  2018    138683041628 106457131642 190436654283 132094454149  30515092412
##  5  2019    162386686793 190436654283  75035614726  66590387415  41208658249
##  6  2020    209696878289  75035614726  85268705365  73153422780  53360966033
##  7  2021    189094874963  85268705365 271272865376 234881036040  60412122442
##  8  2022    223540317602 271272865376 178845070328 378603401448  60385696030
##  9  2023    299556005542 178845070328 106200569241 -30308428665  82642281566
## 10  2024    320862393082 106200569241 161983318837 216267565018 105636226909
## # ℹ 12 more variables: BienDong_PhaiThu <dbl>, BienDong_TonKho <dbl>,
## #   BienDong_PhaiTra <dbl>, LaiVay_DaTra <dbl>, Thue_DaNop <dbl>,
## #   CFI_Tong <dbl>, Chi_MuaTSCD <dbl>, Chi_TienGui <dbl>, Thu_TienGui <dbl>,
## #   CFF_Tong <dbl>, VayMoi <dbl>, TraNoGoc <dbl>

2.1.1.3 Cấu trúc tổng thể

str(ta)
## tibble [10 × 18] (S3: tbl_df/tbl/data.frame)
##  $ year            : num [1:10] 2015 2016 2017 2018 2019 ...
##  $ LoiNhuanSauThue : num [1:10] 92275349999 101159344647 117360040786 138683041628 162386686793 ...
##  $ Tien_DauKy      : num [1:10] 178550050326 87841659460 100127453686 106457131642 190436654283 ...
##  $ Tien_CuoiKy     : num [1:10] 87841659460 100127453686 106457131642 190436654283 75035614726 ...
##  $ CFO_Tong        : num [1:10] 81130888888 84650650055 97212899364 132094454149 66590387415 ...
##  $ KhauHao         : num [1:10] 38402557093 37320990534 31379088060 30515092412 41208658249 ...
##  $ BienDong_PhaiThu: num [1:10] -41333661601 -8928274802 -1437631837 22334105781 -64061938449 ...
##  $ BienDong_TonKho : num [1:10] 50382333195 10749182912 -47523201453 -43797978420 -25446448742 ...
##  $ BienDong_PhaiTra: num [1:10] -35669331173 -25111605021 23575925481 -13724008827 6749916226 ...
##  $ LaiVay_DaTra    : num [1:10] -605820692 -55154439 -618733502 -1275879713 -3707340260 ...
##  $ Thue_DaNop      : num [1:10] -26094252845 -22380008319 -31711798648 -32083024291 -42339105925 ...
##  $ CFI_Tong        : num [1:10] -204828797781 -14340785224 -443246932809 -48101241268 -120623064351 ...
##  $ Chi_MuaTSCD     : num [1:10] -116451196931 -103904028053 -274456614870 -272440024143 -131124961007 ...
##  $ Chi_TienGui     : num [1:10] -100000000000 -12000000000 -357729700000 -43817250000 -21500000000 ...
##  $ Thu_TienGui     : num [1:10] NA 100000000000 183075000000 221737811648 26297761332 ...
##  $ CFF_Tong        : num [1:10] 32990722640 -58008892000 352371798300 NA -61363261179 ...
##  $ VayMoi          : num [1:10] 95894850000 NA 120000000000 160076187844 218888228325 ...
##  $ TraNoGoc        : num [1:10] -95894850000 NA -120000000000 -160076187844 -181308771504 ...

2.1.1.4 Tóm tắt dữ liệu

summary(ta) 
##       year      LoiNhuanSauThue          Tien_DauKy          
##  Min.   :2015   Min.   : 92275349999   Min.   : 75035614726  
##  1st Qu.:2017   1st Qu.:122690790996   1st Qu.: 90913108016  
##  Median :2020   Median :175740780878   Median :106328850442  
##  Mean   :2020   Mean   :185461493333   Mean   :138003577443  
##  3rd Qu.:2022   3rd Qu.:220079457774   3rd Qu.:178771315328  
##  Max.   :2024   Max.   :320862393082   Max.   :271272865376  
##                                                              
##   Tien_CuoiKy              CFO_Tong               KhauHao            
##  Min.   : 75035614726   Min.   :-30308428665   Min.   : 30515092412  
##  1st Qu.: 90913108016   1st Qu.: 75147789307   1st Qu.: 37591382174  
##  Median :106328850442   Median : 90931774710   Median : 47284812141  
##  Mean   :136346904294   Mean   :133427627649   Mean   : 54126367933  
##  3rd Qu.:174629632455   3rd Qu.:195224287301   3rd Qu.: 60405515839  
##  Max.   :271272865376   Max.   :378603401448   Max.   :105636226909  
##                                                                      
##  BienDong_PhaiThu       BienDong_TonKho         BienDong_PhaiTra      
##  Min.   :-83306984898   Min.   :-260749238157   Min.   :-49525833086  
##  1st Qu.:-55960084902   1st Qu.: -61477533455   1st Qu.:-33029899635  
##  Median :-14460118668   Median : -34622213581   Median : -8277667477  
##  Mean   :-12166658588   Mean   : -41154397712   Mean   : -7535274795  
##  3rd Qu.: 14742465394   3rd Qu.:   6516640084   3rd Qu.: 16895829534  
##  Max.   :115759490658   Max.   :  52398387880   Max.   : 39579670960  
##                                                                       
##   LaiVay_DaTra           Thue_DaNop              CFI_Tong            
##  Min.   :-6699943903   Min.   :-83992016063   Min.   :-443246932809  
##  1st Qu.:-4413178073   1st Qu.:-56045224314   1st Qu.:-183596885752  
##  Median :-3598954722   Median :-41597605868   Median :-123911128404  
##  Mean   :-3046559562   Mean   :-45519649979   Mean   :-130736762123  
##  3rd Qu.: -783020055   3rd Qu.:-31804605059   3rd Qu.: -56861445622  
##  Max.   :  -55154439   Max.   :-22380008319   Max.   :  69894262492  
##                                                                      
##   Chi_MuaTSCD             Chi_TienGui             Thu_TienGui          
##  Min.   :-274456614870   Min.   :-451171580000   Min.   : 26297761332  
##  1st Qu.:-127456519988   1st Qu.:-335047275000   1st Qu.:100000000000  
##  Median :-101628608786   Median :-176494739041   Median :195897929613  
##  Mean   :-130057173899   Mean   :-198920800808   Mean   :204128349936  
##  3rd Qu.: -91456180145   3rd Qu.: -57862937500   3rd Qu.:221737811648  
##  Max.   : -52856687303   Max.   : -12000000000   Max.   :491300000000  
##                                                  NA's   :1             
##     CFF_Tong                 VayMoi                 TraNoGoc            
##  Min.   :-271718144243   Min.   :-315649453686   Min.   :-351293662887  
##  1st Qu.: -61363261179   1st Qu.:  95894850000   1st Qu.:-231513531376  
##  Median : -33304800015   Median : 160076187844   Median :-181308771504  
##  Mean   :  -4797122112   Mean   : 142392327092   Mean   :-183894915875  
##  3rd Qu.:  34495813019   3rd Qu.: 229739387189   3rd Qu.:-120000000000  
##  Max.   : 352371798300   Max.   : 387993511872   Max.   : -49387359000  
##  NA's   :1               NA's   :1               NA's   :1

Về khả năng sinh lời: Doanh nghiệp thể hiện sự tăng trưởng lợi nhuận sau thuế ấn tượng trong giai đoạn 2015-2024, từ mức sàn 92.275 tỷ đồng lên đến mức trần 320.862 tỷ đồng. Với giá trị trung bình đạt 185.461 tỷ đồng và trung vị ở 175.741 tỷ đồng, có thể thấy hiệu quả kinh doanh được cải thiện đáng kể theo thời gian, mặc dù vẫn tồn tại sự chênh lệch khá lớn giữa các năm.

Về dòng tiền hoạt động (CFO): Sức khỏe dòng tiền từ hoạt động kinh doanh có dấu hiệu bất ổn. Giá trị âm sâu nhất lên tới -30.308 tỷ đồng, trong khi năm đỉnh điểm đạt 378.603 tỷ đồng, cho thấy khả năng tạo tiền không ổn định và có thể phụ thuộc nhiều vào yếu tố mùa vụ hoặc chu kỳ kinh doanh. Trung bình dòng tiền ở mức 133.428 tỷ đồng là tích cực, nhưng sự dao động mạnh là một điểm đáng lưu ý.

Về quản lý vốn lưu động: Đây là điểm yếu đáng chú ý. Cả biến động phải thu (trung bình -12.167 tỷ đồng) và biến động tồn kho (trung bình -41.154 tỷ đồng) đều thường xuyên ở ngưỡng âm. Điều này phản ánh những thách thức trong việc kiểm soát công nợ và hàng tồn kho, khiến doanh nghiệp có thể bị chiếm dụng vốn và đối mặt với áp lực thanh khoản.

Về hoạt động đầu tư và tài trợ: Doanh nghiệp theo đuổi chiến lược đầu tư mở rộng mạnh mẽ, thể hiện qua dòng tiền đầu tư (CFI) chủ yếu mang giá trị âm (trung vị -123.911 tỷ đồng). Để tài trợ cho các hoạt động này, doanh nghiệp tích cực huy động vay mới (trung bình 142.392 tỷ đồng) nhưng đồng thời cũng chú trọng trả nợ gốc (trung bình -183.895 tỷ đồng). Điều này cho thấy một nỗ lực rõ rệt trong việc kiểm soát đòn bẩy tài chính và cơ cấu lại các khoản nợ.

Tổng quan rủi ro: Mặc dù có tăng trưởng lợi nhuận tốt và chiến lược đầu tư bài bản, sự dao động mạnh của các chỉ số tài chính cùng với sự hiện diện của một số giá trị thiếu (NA) trong dữ liệu là những rủi ro tiềm ẩn. Việc ổn định dòng tiền và nâng cao hiệu quả quản lý vốn lưu động là chìa khóa để đảm bảo sự phát triển bền vững trong tương lai.

2.1.1.5 Danh sách tên biến

names(ta)
##  [1] "year"             "LoiNhuanSauThue"  "Tien_DauKy"       "Tien_CuoiKy"     
##  [5] "CFO_Tong"         "KhauHao"          "BienDong_PhaiThu" "BienDong_TonKho" 
##  [9] "BienDong_PhaiTra" "LaiVay_DaTra"     "Thue_DaNop"       "CFI_Tong"        
## [13] "Chi_MuaTSCD"      "Chi_TienGui"      "Thu_TienGui"      "CFF_Tong"        
## [17] "VayMoi"           "TraNoGoc"

2.1.1.6 Kích thước dữ liệu

n_distinct(ta$year)
## [1] 10
dim(ta)
## [1] 10 18

2.1.1.7 Kiểu dữ liệu từng biến

sapply(ta, class) %>% kable()
x
year numeric
LoiNhuanSauThue numeric
Tien_DauKy numeric
Tien_CuoiKy numeric
CFO_Tong numeric
KhauHao numeric
BienDong_PhaiThu numeric
BienDong_TonKho numeric
BienDong_PhaiTra numeric
LaiVay_DaTra numeric
Thue_DaNop numeric
CFI_Tong numeric
Chi_MuaTSCD numeric
Chi_TienGui numeric
Thu_TienGui numeric
CFF_Tong numeric
VayMoi numeric
TraNoGoc numeric

2.1.1.8 Kiểm tra dữ liệu bị thiếu

sum(is.na(ta))
## [1] 4
colSums(is.na(ta)) %>% kable()
x
year 0
LoiNhuanSauThue 0
Tien_DauKy 0
Tien_CuoiKy 0
CFO_Tong 0
KhauHao 0
BienDong_PhaiThu 0
BienDong_TonKho 0
BienDong_PhaiTra 0
LaiVay_DaTra 0
Thue_DaNop 0
CFI_Tong 0
Chi_MuaTSCD 0
Chi_TienGui 0
Thu_TienGui 1
CFF_Tong 1
VayMoi 1
TraNoGoc 1

2.1.1.9 Kiểm tra số dòng bị trùng lặp

sum(duplicated(ta))
## [1] 0

Kết quả trả ra cho thấy dữ liệu không bị trùng lặp

2.1.1.10 Kiểm tra dữ liệu ngoại lai

ta %>%
  summarise(across(where(is.numeric), 
    function(x) {
      q1 <- quantile(x, 0.25, na.rm = TRUE)
      q3 <- quantile(x, 0.75, na.rm = TRUE)
      iqr <- IQR(x, na.rm = TRUE)
      lower_bound <- q1 - 1.5 * iqr
      upper_bound <- q3 + 1.5 * iqr
      sum(x < lower_bound | x > upper_bound, na.rm = TRUE)
    })) %>%
  print(n = Inf, width = Inf)
## # A tibble: 1 × 18
##    year LoiNhuanSauThue Tien_DauKy Tien_CuoiKy CFO_Tong KhauHao BienDong_PhaiThu
##   <int>           <int>      <int>       <int>    <int>   <int>            <int>
## 1     0               0          0           0        1       1                0
##   BienDong_TonKho BienDong_PhaiTra LaiVay_DaTra Thue_DaNop CFI_Tong Chi_MuaTSCD
##             <int>            <int>        <int>      <int>    <int>       <int>
## 1               1                0            0          0        1           2
##   Chi_TienGui Thu_TienGui CFF_Tong VayMoi TraNoGoc
##         <int>       <int>    <int>  <int>    <int>
## 1           0           1        2      1        0

Tỷ lệ dữ liệu ngoại lai tương đối thấp, với chỉ 8/18 biến có giá trị ngoại lai và số lượng ngoại lai trên mỗi biến rất ít (chỉ 1-2 giá trị).

2.1.2 PHÂN TÍCH SÂU CẤU TRÚC DỮ LIỆU

2.1.2.1 Mô tả các biến bằng Hmisc

describe_data <- Hmisc::describe(ta %>% select(where(is.numeric)))
print(describe_data)
## ta %>% select(where(is.numeric)) 
## 
##  18  Variables      10  Observations
## --------------------------------------------------------------------------------
## year 
##        n  missing distinct     Info     Mean  pMedian      Gmd      .05 
##       10        0       10        1     2020     2020    3.667     2015 
##      .10      .25      .50      .75      .90      .95 
##     2016     2017     2020     2022     2023     2024 
##                                                             
## Value      2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## Frequency     1    1    1    1    1    1    1    1    1    1
## Proportion  0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1  0.1
## --------------------------------------------------------------------------------
## LoiNhuanSauThue 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 185461493333 181111679615 
##          Gmd          .05          .10          .25          .50          .75 
##  93704691028  96273147591 100270945182 122690790997 175740780878 220079457774 
##          .90          .95 
## 301686644296 311274518689 
##                                                                            
## Value       92275349999 101159344647 117360040786 138683041628 162386686793
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value      189094874963 209696878289 223540317602 299556005542 320862393082
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## Tien_DauKy 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 138003577443 133343364894 
##          Gmd          .05          .10          .25          .50          .75 
##  70952273443  79640505514  84245396301  90913108017 106328850442 178771315328 
##          .90          .95 
## 198520275392 234896570384 
##                                                                            
## Value       75035614726  85268705365  87841659460 100127453686 106200569241
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value      106457131642 178550050326 178845070328 190436654283 271272865376
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## Tien_CuoiKy 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 136346904294 132736134505 
##          Gmd          .05          .10          .25          .50          .75 
##  69847824677  79640505514  84245396301  90913108017 106328850442 174629632455 
##          .90          .95 
## 198520275392 234896570384 
##                                                                            
## Value       75035614726  85268705365  87841659460 100127453686 106200569241
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value      106457131642 161983318837 178845070328 190436654283 271272865376
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## CFO_Tong 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 133427627649 108372552102 
##          Gmd          .05          .10          .25          .50          .75 
## 127539214837  13296038571  56900505807  75147789307  90931774710 195224287301 
##          .90          .95 
## 249253272581 313928337014 
##                                                                            
## Value      -30308428665  66590387415  73153422780  81130888888  84650650055
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value       97212899364 132094454149 216267565018 234881036040 378603401448
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## KhauHao 
##           n     missing    distinct        Info        Mean     pMedian 
##          10           0          10           1 54126367933 49407339768 
##         Gmd         .05         .10         .25         .50         .75 
## 27299776648 30903890454 31292688495 37591382174 47284812141 60405515839 
##         .90         .95 
## 84941676100 95288951505 
##                                                                            
## Value       30515092412  31379088060  37320990534  38402557093  41208658249
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value       53360966033  60385696030  60412122442  82642281566 105636226909
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## BienDong_PhaiThu 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 -12166658588 -19991962534 
##          Gmd          .05          .10          .25          .50          .75 
##  65155095978 -74646713996 -65986443094 -55960084902 -14460118668  14742465394 
##          .90          .95 
##  31676644269  73718067463 
##                                                                            
## Value      -83306984898 -64061938449 -60835559336 -41333661601 -19991962534
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value       -8928274802  -1437631837  20135831138  22334105781 115759490658
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## BienDong_TonKho 
##             n       missing      distinct          Info          Mean 
##            10             0            10             1  -41154397712 
##       pMedian           Gmd           .05           .10           .25 
##  -27689897272   93877850593 -177273252799  -93797267441  -61477533455 
##           .50           .75           .90           .95 
##  -34622213581    6516640084   50583938664   51491163272 
## 
## -260749238157 (1, 0.1), -75247048473 (1, 0.1), -66128977456 (1, 0.1),
## -47523201453 (1, 0.1), -43797978420 (1, 0.1), -25446448742 (1, 0.1),
## -6180988401 (1, 0.1), 10749182912 (1, 0.1), 50382333195 (1, 0.1), 52398387880
## (1, 0.1)
## --------------------------------------------------------------------------------
## BienDong_PhaiTra 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1  -7535274795  -7695765269 
##          Gmd          .05          .10          .25          .50          .75 
##  36086924875 -44642488855 -39759144624 -33029899635  -8277667477  16895829534 
##          .90          .95 
##  25176300029  32377985494 
##                                                                            
## Value      -49525833086 -38673957017 -35669331173 -25111605021 -13724008827
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value       -2831326127   6749916226  20277800636  23575925481  39579670960
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## LaiVay_DaTra 
##           n     missing    distinct        Info        Mean     pMedian 
##          10           0          10           1 -3046559562 -2957747374 
##         Gmd         .05         .10         .25         .50         .75 
##  2690738115 -6074322471 -5448701040 -4413178073 -3598954722  -783020055 
##         .90         .95 
##  -550754067  -302954253 
##                                                                       
## Value      -6699943903 -5309674055 -4475116208 -4227363668 -3707340260
## Frequency            1           1           1           1           1
## Proportion         0.1         0.1         0.1         0.1         0.1
##                                                                       
## Value      -3490569184 -1275879713  -618733502  -605820692   -55154439
## Frequency            1           1           1           1           1
## Proportion         0.1         0.1         0.1         0.1         0.1
## --------------------------------------------------------------------------------
## Thue_DaNop 
##            n      missing     distinct         Info         Mean      pMedian 
##           10            0           10            1 -45519649979 -43083226117 
##          Gmd          .05          .10          .25          .50          .75 
##  23293691764 -78058454868 -72124893673 -56045224314 -41597605868 -31804605059 
##          .90          .95 
## -25722828392 -24051418356 
##                                                                            
## Value      -83992016063 -70806324518 -59623516944 -45310346424 -42339105925
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
##                                                                            
## Value      -40856105810 -32083024291 -31711798648 -26094252845 -22380008319
## Frequency             1            1            1            1            1
## Proportion          0.1          0.1          0.1          0.1          0.1
## --------------------------------------------------------------------------------
## CFI_Tong 
##             n       missing      distinct          Info          Mean 
##            10             0            10             1 -130736762123 
##       pMedian           Gmd           .05           .10           .25 
## -123702553600  152761727925 -335958772046 -228670611284 -183596885752 
##           .50           .75           .90           .95 
## -123911128404  -56861445623   -5917280452   31988491020 
## 
## -443246932809 (1, 0.1), -204828797781 (1, 0.1), -199303865931 (1, 0.1),
## -136475945213 (1, 0.1), -127199192457 (1, 0.1), -120623064351 (1, 0.1),
## -83142058686 (1, 0.1), -48101241268 (1, 0.1), -14340785224 (1, 0.1),
## 69894262492 (1, 0.1)
## --------------------------------------------------------------------------------
## Chi_MuaTSCD 
##             n       missing      distinct          Info          Mean 
##            10             0            10             1 -130057173899 
##       pMedian           Gmd           .05           .10           .25 
## -107902193225   82834794453 -273549149043 -272641683216 -127456519988 
##           .50           .75           .90           .95 
## -101628608786  -91456180145  -62462345838  -57659516571 
## 
## -274456614870 (1, 0.1), -272440024143 (1, 0.1), -131124961007 (1, 0.1),
## -116451196931 (1, 0.1), -103904028053 (1, 0.1), -99353189519 (1, 0.1),
## -96770733614 (1, 0.1), -89684662322 (1, 0.1), -63529641231 (1, 0.1),
## -52856687303 (1, 0.1)
## --------------------------------------------------------------------------------
## Chi_TienGui 
##             n       missing      distinct          Info          Mean 
##            10             0            10             1 -198920800808 
##       pMedian           Gmd           .05           .10           .25 
## -197500000000  193215909957 -420494369000 -389817158000 -335047275000 
##           .50           .75           .90           .95 
## -176494739041  -57862937500  -20550000000  -16275000000 
## 
## -451171580000 (1, 0.1), -383000000000 (1, 0.1), -357729700000 (1, 0.1),
## -267000000000 (1, 0.1), -247049478082 (1, 0.1), -105940000000 (1, 0.1),
## -100000000000 (1, 0.1), -43817250000 (1, 0.1), -21500000000 (1, 0.1),
## -12000000000 (1, 0.1)
## --------------------------------------------------------------------------------
## Thu_TienGui 
##            n      missing     distinct         Info         Mean      pMedian 
##            9            1            9            1 204128349936 200423323415 
##          Gmd 
## 169716617638 
##                                                                            
## Value       26297761332  47675066830 100000000000 183075000000 195897929613
## Frequency             1            1            1            1            1
## Proportion        0.111        0.111        0.111        0.111        0.111
##                                                               
## Value      218000000000 221737811648 353171580000 491300000000
## Frequency             1            1            1            1
## Proportion        0.111        0.111        0.111        0.111
## --------------------------------------------------------------------------------
## CFF_Tong 
##            n      missing     distinct         Info         Mean      pMedian 
##            9            1            9            1  -4797122112 -13433724080 
##          Gmd 
## 185363554013 
## 
## -271718144243 (1, 0.111), -112229740937 (1, 0.111), -61363261179 (1, 0.111),
## -58008892000 (1, 0.111), -33304800015 (1, 0.111), 32990722640 (1, 0.111),
## 34495813019 (1, 0.111), 73592405403 (1, 0.111), 352371798300 (1, 0.111)
## --------------------------------------------------------------------------------
## VayMoi 
##            n      missing     distinct         Info         Mean      pMedian 
##            9            1            9            1 142392327092 162817118595 
##          Gmd 
## 220894300500 
## 
## -315649453686 (1, 0.111), 59802742133 (1, 0.111), 95894850000 (1, 0.111),
## 120000000000 (1, 0.111), 160076187844 (1, 0.111), 218888228325 (1, 0.111),
## 229739387189 (1, 0.111), 324785490153 (1, 0.111), 387993511872 (1, 0.111)
## --------------------------------------------------------------------------------
## TraNoGoc 
##             n       missing      distinct          Info          Mean 
##             9             1             9             1 -183894915875 
##       pMedian           Gmd 
## -181308771504  111059252054 
## 
## -351293662887 (1, 0.111), -275297558126 (1, 0.111), -231513531376 (1, 0.111),
## -190282322134 (1, 0.111), -181308771504 (1, 0.111), -160076187844 (1, 0.111),
## -120000000000 (1, 0.111), -95894850000 (1, 0.111), -49387359000 (1, 0.111)
## --------------------------------------------------------------------------------

1. Khả năng sinh lời Lợi nhuận sau thuế (LoiNhuanSauThue) cho thấy xu hướng tăng trưởng mạnh mẽ và liên tục. Giá trị trung bình đạt 185.461 tỷ đồng và trung vị là 181.112 tỷ đồng, cho thấy sự phân bố khá cân đối. Điều đáng chú ý là giá trị nhỏ nhất là 92.275 tỷ đồng (2015) và lớn nhất lên tới 320.862 tỷ đồng (2024), phản ánh quy mô lợi nhuận được mở rộng đáng kể sau 10 năm.

2. Dòng tiền hoạt động (CFO) & Chi phí Dòng tiền từ hoạt động kinh doanh (CFO_Tong) có trung bình tích cực (133.428 tỷ đồng) nhưng biến động rất lớn (Gmd = 127.539 tỷ đồng), từ mức âm sâu -30.308 tỷ đồng đến mức dương kỷ lục 378.603 tỷ đồng. Điều này cho thấy khả năng tạo tiền không ổn định. Chi phí khấu hao (KhauHao) có xu hướng tăng đều qua các năm, với giá trị trung bình là 54.126 tỷ đồng, minh chứng cho việc đầu tư vào tài sản cố định ngày càng lớn.

3. Quản lý vốn lưu động Đây là điểm nghẽn đáng quan tâm: - Biến động phải thu (BienDong_PhaiThu): Trung bình âm ở -12.167 tỷ đồng, dao động từ -83.307 tỷ đến +115.759 tỷ đồng, cho thấy có những năm doanh nghiệp bị chiếm dụng vốn rất lớn. - Biến động tồn kho (BienDong_TonKho): Trung bình âm sâu ở -41.154 tỷ đồng, với biên độ rất rộng (từ -260.749 tỷ đến +52.398 tỷ đồng), phản ánh sự bất ổn trong quản lý hàng tồn kho. - Biến động phải trả (BienDong_PhaiTra): Trung bình âm (-7.535 tỷ đồng), cho thấy áp lực thanh toán cho nhà cung cấp.

4. Hoạt động đầu tư (CFI) Dòng tiền đầu tư (CFI_Tong) chủ yếu là âm (trung bình -130.737 tỷ đồng), khẳng định chiến lược đầu tư mở rộng liên tục. Các khoản chi chính bao gồm: - Chi mua TSCD (Chi_MuaTSCD): Trung bình -130.057 tỷ đồng. - Chi tiền gửi (Chi_TienGui): Trung bình -198.921 tỷ đồng, một khoản đầu tư tài chính đáng kể. - Thu tiền gửi (Thu_TienGui): Có trung bình dương (204.128 tỷ đồng), cho thấy hoạt động thu hồi các khoản đầu tư này cũng diễn ra thường xuyên.

5. Hoạt động tài trợ (CFF) & Cơ cấu nợ - Dòng tiền tài trợ (CFF_Tong): Trung bình gần bằng 0 (-4.797 tỷ đồng) nhưng biến động cực lớn, từ -271.718 tỷ đến +352.372 tỷ đồng, phản ánh sự thay đổi thất thường trong cơ cấu vốn. - Vay mới (VayMoi): Trung bình 142.392 tỷ đồng, cho thấy nhu cầu vay liên tục để tài trợ. - Trả nợ gốc (TraNoGoc): Trung bình -183.895 tỷ đồng, lớn hơn cả vay mới, chứng tỏ doanh nghiệp có chính sách quản lý nợ chủ động, ưu tiên giảm đòn bẩy.

2.1.2.2 Phân loại biến theo tính chất

variable_types <- data.frame(
  Bien = names(ta),
  Kieu = sapply(ta, class),
  So_NA = colSums(is.na(ta)),
  So_Gia_Tri_Duy_Nhat = sapply(ta, function(x) length(unique(x)))
)
kable(variable_types, caption = "PHÂN LOẠI BIẾN TRONG BỘ DỮ LIỆU")
PHÂN LOẠI BIẾN TRONG BỘ DỮ LIỆU
Bien Kieu So_NA So_Gia_Tri_Duy_Nhat
year year numeric 0 10
LoiNhuanSauThue LoiNhuanSauThue numeric 0 10
Tien_DauKy Tien_DauKy numeric 0 10
Tien_CuoiKy Tien_CuoiKy numeric 0 10
CFO_Tong CFO_Tong numeric 0 10
KhauHao KhauHao numeric 0 10
BienDong_PhaiThu BienDong_PhaiThu numeric 0 10
BienDong_TonKho BienDong_TonKho numeric 0 10
BienDong_PhaiTra BienDong_PhaiTra numeric 0 10
LaiVay_DaTra LaiVay_DaTra numeric 0 10
Thue_DaNop Thue_DaNop numeric 0 10
CFI_Tong CFI_Tong numeric 0 10
Chi_MuaTSCD Chi_MuaTSCD numeric 0 10
Chi_TienGui Chi_TienGui numeric 0 10
Thu_TienGui Thu_TienGui numeric 1 10
CFF_Tong CFF_Tong numeric 1 10
VayMoi VayMoi numeric 1 10
TraNoGoc TraNoGoc numeric 1 10

Về cấu trúc và độ bao phủ của dữ liệu: Bộ dữ liệu bao gồm 18 biến số (numeric), ghi nhận thông tin tài chính trong vòng 10 năm liên tục (từ 2015 đến 2024). Một điểm đáng chú ý là tất cả các biến đều có đúng 10 giá trị duy nhất, tương ứng với mỗi năm, cho thấy dữ liệu được thu thập một cách nhất quán, không có sự trùng lặp hay thiếu sót theo trục thời gian.

Về tính toàn vẹn và chất lượng: Chất lượng dữ liệu được đánh giá là rất tốt khi có tới 15/18 biến hoàn toàn không chứa giá trị thiếu (NA). Chỉ có 4 biến là Thu_TienGui, CFF_Tong, VayMoiTraNoGoc là có 1 giá trị thiếu. Tỷ lệ hoàn chỉnh cao này đảm bảo độ tin cậy cho hầu hết các phân tích, và việc xử lý số ít giá trị thiếu kia cũng sẽ không gây khó khăn đáng kể.

Về ý nghĩa và cách phân nhóm biến: Các biến được thiết kế một cách có hệ thống, phản ánh toàn diện bức tranh tài chính của doanh nghiệp. Có thể phân loại chúng thành các nhóm ý nghĩa kinh tế rõ rệt: nhóm chỉ tiêu kết quả kinh doanh (như lợi nhuận, khấu hao), nhóm dòng tiền (hoạt động, đầu tư, tài trợ), nhóm vốn lưu động (các khoản phải thu, phải trả, tồn kho), nhóm thuế và chi phí tài chính, và nhóm huy động vốn (vay mới, trả nợ gốc).

Về tiềm năng khai thác và phân tích: Với cấu trúc hoàn chỉnh và đa dạng chỉ tiêu như trên, bộ dữ liệu này mở ra nhiều hướng phân tích chuyên sâu. Nó rất phù hợp để phân tích xu hướng biến động của các chỉ số tài chính qua 10 năm, đánh giá mối quan hệ nhân quả giữa các hoạt động (như tác động của đầu tư đến lợi nhuận), kiểm tra hiệu quả quản lý vốn lưu động, hoặc thậm chí xây dựng các mô hình dự báo cho tương lai.

2.1.2.3 Tổng quan giá trị theo năm

year_summary <- ta %>%
  group_by(year) %>%
  summarise(
    So_Bien = n(),
    Tong_Loi_Nhuan = sum(LoiNhuanSauThue, na.rm = TRUE),
    Tong_CFO = sum(CFO_Tong, na.rm = TRUE)
  ) %>%
  mutate(Phan_Tram_Loi_Nhuan = Tong_Loi_Nhuan/sum(Tong_Loi_Nhuan)*100)
kable(year_summary, caption = "TỔNG QUAN GIÁ TRỊ THEO NĂM")
TỔNG QUAN GIÁ TRỊ THEO NĂM
year So_Bien Tong_Loi_Nhuan Tong_CFO Phan_Tram_Loi_Nhuan
2015 1 92275349999 81130888888 4.975445
2016 1 101159344647 84650650055 5.454466
2017 1 117360040786 97212899364 6.328000
2018 1 138683041628 132094454149 7.477727
2019 1 162386686793 66590387415 8.755817
2020 1 209696878289 73153422780 11.306761
2021 1 189094874963 234881036040 10.195910
2022 1 223540317602 378603401448 12.053193
2023 1 299556005542 -30308428665 16.151925
2024 1 320862393082 216267565018 17.300755

Về tổng lợi nhuận sau thuế: Doanh nghiệp thể hiện đà tăng trưởng lợi nhuận sau thuế liên tục và rất ấn tượng trong suốt 10 năm. Từ mức 92.275 tỷ đồng năm 2015, lợi nhuận đã tăng lên hơn 320.862 tỷ đồng vào năm 2024, tăng gấp khoảng 3.5 lần. Tốc độ tăng trưởng đặc biệt mạnh mẽ trong giai đoạn 2020-2024, giúp tỷ trọng lợi nhuận năm 2024 chiếm tới 17.3% tổng lợi nhuận cả giai đoạn.

Về dòng tiền hoạt động (CFO): Dòng tiền từ hoạt động kinh doanh có diễn biến phức tạp hơn. Giai đoạn 2015-2018 chứng kiến CFO tăng trưởng ổn định và đạt đỉnh 132.094 tỷ đồng năm 2018. Tuy nhiên, năm 2019 và 2020 ghi nhận sự sụt giảm đáng kể. Đặc biệt, năm 2023 là một dấu hiệu bất thường nghiêm trọng khi CFO rơi vào trạng thái âm (-30.308 tỷ đồng), phản ánh khủng hoảng trong khả năng tạo tiền từ hoạt động cốt lõi. May mắn thay, đến năm 2024, CFO đã phục hồi mạnh mẽ lên 216.267 tỷ đồng.

Về mối quan hệ giữa lợi nhuận và dòng tiền: Sự chênh lệch lớn giữa lợi nhuận và dòng tiền ở một số năm (như 2019, 2020, 2023) cho thấy chất lượng lợi nhuận có vấn đề. Lợi nhuận cao không đồng nghĩa với tiền mặt tốt, có thể do doanh nghiệp ghi nhận doanh thu nhưng chưa thu được tiền (phải thu tăng) hoặc hàng tồn kho tích trữ nhiều. Ngược lại, năm 2021 và 2022 là những năm dòng tiền hoạt động vượt trội hơn hẳn so với lợi nhuận, cho thấy khả năng quản lý vốn lư động hiệu quả trong các năm này.

2.1.2.4 Top 5 Lợi nhuận sau thuế cao nhất

ta %>% top_n(5, LoiNhuanSauThue) %>% select(year, LoiNhuanSauThue) %>% kable()
year LoiNhuanSauThue
2020 209696878289
2021 189094874963
2022 223540317602
2023 299556005542
2024 320862393082

2.1.3 XỬ LÝ DỮ LIỆU VÀ MÃ HÓA DỮ LIỆU

2.1.3.1 Làm sạch tên biến

ta_clean <- ta %>% clean_names() 
names(ta_clean)
##  [1] "year"               "loi_nhuan_sau_thue" "tien_dau_ky"       
##  [4] "tien_cuoi_ky"       "cfo_tong"           "khau_hao"          
##  [7] "bien_dong_phai_thu" "bien_dong_ton_kho"  "bien_dong_phai_tra"
## [10] "lai_vay_da_tra"     "thue_da_nop"        "cfi_tong"          
## [13] "chi_mua_tscd"       "chi_tien_gui"       "thu_tien_gui"      
## [16] "cff_tong"           "vay_moi"            "tra_no_goc"

2.1.3.2 Xử lý dữ liệu bị thiếu

# Kiểm tra lại dữ liệu bị thiếu
colSums(is.na(ta_clean)) %>% kable()
x
year 0
loi_nhuan_sau_thue 0
tien_dau_ky 0
tien_cuoi_ky 0
cfo_tong 0
khau_hao 0
bien_dong_phai_thu 0
bien_dong_ton_kho 0
bien_dong_phai_tra 0
lai_vay_da_tra 0
thue_da_nop 0
cfi_tong 0
chi_mua_tscd 0
chi_tien_gui 0
thu_tien_gui 1
cff_tong 1
vay_moi 1
tra_no_goc 1
# Thay thế giá trị bị thiếu bằng trung vị
ta_clean1 <- ta_clean %>%
  mutate(across(where(is.numeric), 
                ~ifelse(is.na(.), median(., na.rm = TRUE), .)))

# Kiểm tra lại sau khi làm sạch
colSums(is.na(ta_clean1)) %>% kable()
x
year 0
loi_nhuan_sau_thue 0
tien_dau_ky 0
tien_cuoi_ky 0
cfo_tong 0
khau_hao 0
bien_dong_phai_thu 0
bien_dong_ton_kho 0
bien_dong_phai_tra 0
lai_vay_da_tra 0
thue_da_nop 0
cfi_tong 0
chi_mua_tscd 0
chi_tien_gui 0
thu_tien_gui 0
cff_tong 0
vay_moi 0
tra_no_goc 0

2.1.3.3 Chuẩn hóa dữ liệu số

ta_clean1 <- ta_clean1 %>%
  mutate(across(where(is.numeric), 
                list(
                  standardized = ~scale(.),
                  log_transformed = ~log(abs(.) + 1)
                )))

2.1.3.4 Tạo biến mới - Kiểm tra cân đối Báo cáo lưu chuyển tiền tệ

ta_clean1 <- ta_clean1 %>%
  mutate(bien_dong_tien_rong = tien_cuoi_ky - tien_dau_ky,
         KiemTra_BaoCaoLuuChuyenTienTe = cff_tong + cfi_tong + cfo_tong)

ta_clean1 <- ta_clean1 %>%
  mutate(ChenhLech = if_else(bien_dong_tien_rong == KiemTra_BaoCaoLuuChuyenTienTe, 
                                     0, 
                                     bien_dong_tien_rong - KiemTra_BaoCaoLuuChuyenTienTe))
kable(ta_clean1 %>% select(year, bien_dong_tien_rong, KiemTra_BaoCaoLuuChuyenTienTe, ChenhLech))
year bien_dong_tien_rong KiemTra_BaoCaoLuuChuyenTienTe ChenhLech
2015 -90708390866 -90707186253 -1204613
2016 12285794226 12300972831 -15178605
2017 6329677956 6337764855 -8086899
2018 83979522641 50688412866 33291109775
2019 -115401039557 -115395938115 -5101442
2020 10233090639 10269882970 -36792331
2021 186004160011 186234790373 -230630362
2022 -92427795048 -92418608726 -9186322
2023 -72644501087 -72643907110 -593977
2024 55782749596 55763572546 19177050

2.1.3.5 Tạo biến Dòng tiền tự do

ta_clean1 <- ta_clean1 %>%
  mutate(DongTienTuDo = cfo_tong + chi_mua_tscd)
kable(ta_clean1 %>% select(year, DongTienTuDo))
year DongTienTuDo
2015 -35320308043
2016 -19253377998
2017 -177243715506
2018 -140345569994
2019 -64534573592
2020 -16531239542
2021 182024348737
2022 279250211929
2023 -93838069896
2024 119496831404

2.1.3.6 Mã hóa dữ liệu - Xu hướng lợi nhuận

ta_clean1 <- ta_clean1 %>% 
  mutate(TangGiam_LoiNhuan = ifelse(loi_nhuan_sau_thue > lag(loi_nhuan_sau_thue), "Tang", "Giam"))
kable(ta_clean1 %>% select(year, loi_nhuan_sau_thue, TangGiam_LoiNhuan))
year loi_nhuan_sau_thue TangGiam_LoiNhuan
2015 92275349999 NA
2016 101159344647 Tang
2017 117360040786 Tang
2018 138683041628 Tang
2019 162386686793 Tang
2020 209696878289 Tang
2021 189094874963 Giam
2022 223540317602 Tang
2023 299556005542 Tang
2024 320862393082 Tang

2.1.3.7 Mã hóa chiến lược nợ

ta_clean1 <- ta_clean1 %>% 
  mutate(VayRong = vay_moi + tra_no_goc,
    ChinhSachNo = case_when(
      VayRong > 0 ~ "Vay Them",
      VayRong < 0 ~ "Tra No", 
      TRUE        ~ "Can Bang" ))
kable(ta_clean1 %>% select(year, vay_moi, tra_no_goc, VayRong, ChinhSachNo))
year vay_moi tra_no_goc VayRong ChinhSachNo
2015 95894850000 -95894850000 0 Can Bang
2016 160076187844 -181308771504 -21232583660 Tra No
2017 120000000000 -120000000000 0 Can Bang
2018 160076187844 -160076187844 0 Can Bang
2019 218888228325 -181308771504 37579456821 Vay Them
2020 -315649453686 -49387359000 -365036812686 Tra No
2021 324785490153 -190282322134 134503168019 Vay Them
2022 59802742133 -231513531376 -171710789243 Tra No
2023 229739387189 -275297558126 -45558170937 Tra No
2024 387993511872 -351293662887 36699848985 Vay Them

2.1.3.8 Mã hóa xu hướng tồn kho

ta_clean1 <- ta_clean1 %>% 
  mutate(XuHuong_TonKho = case_when(
    bien_dong_ton_kho > 0 ~ "Tang",
    bien_dong_ton_kho < 0 ~ "Giam",
    TRUE                   ~ "On Dinh"
  ))
kable(ta_clean1 %>% select(year, bien_dong_ton_kho, XuHuong_TonKho))
year bien_dong_ton_kho XuHuong_TonKho
2015 50382333195 Tang
2016 10749182912 Tang
2017 -47523201453 Giam
2018 -43797978420 Giam
2019 -25446448742 Giam
2020 -75247048473 Giam
2021 -66128977456 Giam
2022 52398387880 Tang
2023 -260749238157 Giam
2024 -6180988401 Giam

2.1.3.9 Mã hóa biến định tính mới

ta_clean1 <- ta_clean1 %>%
  mutate(
    Quy_Trong_Nam = case_when(
      year %% 4 == 0 ~ "Năm nhuận",
      TRUE ~ "Năm thường"
    ),
    Giai_Doan_Phat_Trien = case_when(
      year <= 2017 ~ "Giai đoạn ổn định",
      year <= 2020 ~ "Giai đoạn tăng trưởng", 
      year <= 2023 ~ "Giai đoạn biến động",
      TRUE ~ "Giai đoạn phục hồi"
    )
  )

2.1.3.10 Phân tổ dữ liệu - Lợi nhuận theo phân vị

ta_clean1 <- ta_clean1 %>%
  mutate(muc_loi_nhuan = cut2(loi_nhuan_sau_thue, g = 3, levels.only = FALSE)) %>% 
  mutate(muc_loi_nhuan = case_when(
    muc_loi_nhuan == levels(muc_loi_nhuan)[1] ~ "Thấp",
    muc_loi_nhuan == levels(muc_loi_nhuan)[2] ~ "Trung bình",
    muc_loi_nhuan == levels(muc_loi_nhuan)[3] ~ "Cao",
    TRUE ~ as.character(muc_loi_nhuan)
  ))
kable(ta_clean1 %>% select(year, loi_nhuan_sau_thue, muc_loi_nhuan))
year loi_nhuan_sau_thue muc_loi_nhuan
2015 92275349999 Thấp
2016 101159344647 Thấp
2017 117360040786 Thấp
2018 138683041628 Thấp
2019 162386686793 Trung bình
2020 209696878289 Trung bình
2021 189094874963 Trung bình
2022 223540317602 Cao
2023 299556005542 Cao
2024 320862393082 Cao

2.1.3.11 Phân tổ hàng tồn kho theo trung bình

ta_clean1 <- ta_clean1 %>%
  mutate(muc_ton_kho = ifelse(bien_dong_ton_kho < mean(bien_dong_ton_kho), "Thap", "Cao"))
kable(ta_clean1 %>% select(year, bien_dong_ton_kho, muc_ton_kho))
year bien_dong_ton_kho muc_ton_kho
2015 50382333195 Cao
2016 10749182912 Cao
2017 -47523201453 Thap
2018 -43797978420 Thap
2019 -25446448742 Cao
2020 -75247048473 Thap
2021 -66128977456 Thap
2022 52398387880 Cao
2023 -260749238157 Thap
2024 -6180988401 Cao

2.2 CHƯƠNG 2: Các thống kê cơ bản

2.2.1 Thống kê mô tả cơ bản

2.2.1.1 Lợi nhuận sau thuế

ta_clean1 %>%
  summarise(
    Mean = mean(loi_nhuan_sau_thue),
    Median = median(loi_nhuan_sau_thue),
    SD = sd(loi_nhuan_sau_thue),
    Variance = var(loi_nhuan_sau_thue),
    Min = min(loi_nhuan_sau_thue),
    Max = max(loi_nhuan_sau_thue),
    Range = Max - Min
  ) %>% kable(caption = "THỐNG KÊ LỢI NHUẬN SAU THUẾ")
THỐNG KÊ LỢI NHUẬN SAU THUẾ
Mean Median SD Variance Min Max Range
185461493333 175740780878 79267830966 6283389026124499517640 92275349999 320862393082 228587043083

2.2.1.2 Dòng tiền hoạt động

ta_clean1 %>%
  summarise(
    Mean = mean(cfo_tong),
    Median = median(cfo_tong),
    SD = sd(cfo_tong),
    Variance = var(cfo_tong),
    Min = min(cfo_tong),
    Max = max(cfo_tong),
    Range = Max - Min
  ) %>% kable(caption = "THỐNG KÊ DÒNG TIỀN HOẠT ĐỘNG")
THỐNG KÊ DÒNG TIỀN HOẠT ĐỘNG
Mean Median SD Variance Min Max Range
133427627649 90931774710 114796209903 13178169807990847177864 -30308428665 378603401448 408911830113

2.2.2 Thống kê mô tả chi tiết

stats_detailed <- ta_clean1 %>%
    select(where(is.numeric)) %>%
    psych::describe() %>%
    rownames_to_column("Bien") %>%
    select(Bien, n, mean, sd, min, max, skew, kurtosis) %>%
    # Định dạng lại các cột số để gọn hơn
    mutate(across(where(is.numeric), ~ round(., 2)))

kable(stats_detailed, 
      caption = "THỐNG KÊ MÔ TẢ CHI TIẾT TÀI CHÍNH",
      format = "pipe",  # Đảm bảo định dạng phù hợp
      digits = 2,       # Giới hạn số chữ số thập phân
      format.args = list(big.mark = ",", scientific = FALSE))  # Định dạng số lớn)
THỐNG KÊ MÔ TẢ CHI TIẾT TÀI CHÍNH
Bien n mean sd min max skew kurtosis
year 10 2,019.50 3.03 2,015.00 2,024.00 0.00 -1.56
loi_nhuan_sau_thue 10 185,461,493,333.10 79,267,830,966.44 92,275,349,999.00 320,862,393,082.00 0.44 -1.33
tien_dau_ky 10 138,003,577,443.30 63,705,340,835.91 75,035,614,726.00 271,272,865,376.00 0.78 -0.80
tien_cuoi_ky 10 136,346,904,294.40 62,741,887,420.73 75,035,614,726.00 271,272,865,376.00 0.86 -0.59
cfo_tong 10 133,427,627,649.20 114,796,209,902.55 -30,308,428,665.00 378,603,401,448.00 0.74 -0.39
khau_hao 10 54,126,367,932.80 24,306,276,907.14 30,515,092,412.00 105,636,226,909.00 0.87 -0.58
bien_dong_phai_thu 10 -12,166,658,588.00 57,502,782,382.92 -83,306,984,898.00 115,759,490,658.00 0.80 -0.17
bien_dong_ton_kho 10 -41,154,397,711.50 89,038,343,861.16 -260,749,238,157.00 52,398,387,880.00 -1.26 0.95
bien_dong_phai_tra 10 -7,535,274,794.80 29,924,095,334.22 -49,525,833,086.00 39,579,670,960.00 0.10 -1.59
lai_vay_da_tra 10 -3,046,559,562.40 2,272,372,959.44 -6,699,943,903.00 -55,154,439.00 -0.04 -1.61
thue_da_nop 10 -45,519,649,978.70 20,095,203,893.27 -83,992,016,063.00 -22,380,008,319.00 -0.63 -1.08
cfi_tong 10 -130,736,762,122.80 137,798,621,319.35 -443,246,932,809.00 69,894,262,492.00 -0.80 0.17
chi_mua_tscd 10 -130,057,173,899.30 78,923,882,880.76 -274,456,614,870.00 -52,856,687,303.00 -1.02 -0.66
chi_tien_gui 10 -198,920,800,808.20 162,819,741,001.51 -451,171,580,000.00 -12,000,000,000.00 -0.21 -1.74
thu_tien_gui 10 203,305,307,903.60 138,523,951,937.32 26,297,761,332.00 491,300,000,000.00 0.63 -0.54
cff_tong 10 -7,647,889,902.70 158,832,664,745.01 -271,718,144,243.00 352,371,798,300.00 0.69 0.43
vay_moi 10 144,160,713,167.40 190,598,253,999.62 -315,649,453,686.00 387,993,511,872.00 -1.10 0.75
tra_no_goc 10 -183,636,301,437.50 87,676,177,566.41 -351,293,662,887.00 -49,387,359,000.00 -0.33 -0.86
year_standardized 10 0.00 1.00 -1.49 1.49 0.00 -1.56
year_log_transformed 10 7.61 0.00 7.61 7.61 0.00 -1.56
loi_nhuan_sau_thue_standardized 10 0.00 1.00 -1.18 1.71 0.44 -1.33
loi_nhuan_sau_thue_log_transformed 10 25.86 0.43 25.25 26.49 0.03 -1.55
tien_dau_ky_standardized 10 0.00 1.00 -0.99 2.09 0.78 -0.80
tien_dau_ky_log_transformed 10 25.56 0.43 25.04 26.33 0.40 -1.49
tien_cuoi_ky_standardized 10 0.00 1.00 -0.98 2.15 0.86 -0.59
tien_cuoi_ky_log_transformed 10 25.55 0.42 25.04 26.33 0.45 -1.37
cfo_tong_standardized 10 0.00 1.00 -1.43 2.14 0.74 -0.39
cfo_tong_log_transformed 10 25.42 0.73 24.13 26.66 0.08 -1.02
khau_hao_standardized 10 0.00 1.00 -0.97 2.12 0.87 -0.58
khau_hao_log_transformed 10 24.63 0.41 24.14 25.38 0.42 -1.29
bien_dong_phai_thu_standardized 10 0.00 1.00 -1.24 2.22 0.80 -0.17
bien_dong_phai_thu_log_transformed 10 24.01 1.29 21.09 25.47 -0.94 -0.07
bien_dong_ton_kho_standardized 10 0.00 1.00 -2.47 1.05 -1.26 0.95
bien_dong_ton_kho_log_transformed 10 24.43 1.04 22.54 26.29 -0.20 -0.62
bien_dong_phai_tra_standardized 10 0.00 1.00 -1.40 1.57 0.10 -1.59
bien_dong_phai_tra_log_transformed 10 23.70 0.90 21.76 24.63 -0.94 -0.45
lai_vay_da_tra_standardized 10 0.00 1.00 -1.61 1.32 -0.04 -1.61
lai_vay_da_tra_log_transformed 10 21.27 1.49 17.83 22.63 -1.11 0.03
thue_da_nop_standardized 10 0.00 1.00 -1.91 1.15 -0.63 -1.08
thue_da_nop_log_transformed 10 24.46 0.43 23.83 25.15 0.17 -1.40
cfi_tong_standardized 10 0.00 1.00 -2.27 1.46 -0.80 0.17
cfi_tong_log_transformed 10 25.37 0.93 23.39 26.82 -0.58 -0.28
chi_mua_tscd_standardized 10 0.00 1.00 -1.83 0.98 -1.02 -0.66
chi_mua_tscd_log_transformed 10 25.45 0.54 24.69 26.34 0.47 -1.00
chi_tien_gui_standardized 10 0.00 1.00 -1.55 1.15 -0.21 -1.74
chi_tien_gui_log_transformed 10 25.49 1.28 23.21 26.84 -0.53 -1.38
thu_tien_gui_standardized 10 0.00 1.00 -1.28 2.08 0.63 -0.54
thu_tien_gui_log_transformed 10 25.76 0.89 23.99 26.92 -0.70 -0.77
cff_tong_standardized 10 0.00 1.00 -1.66 2.27 0.69 0.43
cff_tong_log_transformed 10 24.99 0.88 24.22 26.59 0.71 -1.13
vay_moi_standardized 10 0.00 1.00 -2.41 1.28 -1.10 0.75
vay_moi_log_transformed 10 25.92 0.59 24.81 26.68 -0.38 -1.19
tra_no_goc_standardized 10 0.00 1.00 -1.91 1.53 -0.33 -0.86
tra_no_goc_log_transformed 10 25.81 0.56 24.62 26.58 -0.68 -0.44
bien_dong_tien_rong 10 -1,656,673,148.90 94,513,744,975.97 -115,401,039,557.00 186,004,160,011.00 0.49 -0.96
KiemTra_BaoCaoLuuChuyenTienTe 10 -4,957,024,376.30 91,758,058,564.16 -115,395,938,115.00 186,234,790,373.00 0.57 -0.68
ChenhLech 10 3,300,351,227.40 10,537,921,614.67 -230,630,362.00 33,291,109,775.00 2.28 3.57
DongTienTuDo 10 3,370,453,749.90 145,775,110,047.98 -177,243,715,506.00 279,250,211,929.00 0.58 -1.10
VayRong 10 -39,475,588,270.10 137,650,852,728.25 -365,036,812,686.00 134,503,168,019.00 -1.17 0.49

2.2.3 Phân tích biến động theo năm

yearly_stats <- ta_clean1 %>%
  group_by(year) %>%
  summarise(
    across(c(loi_nhuan_sau_thue, cfo_tong, cfi_tong, cff_tong),
           list(
             mean = ~mean(., na.rm = TRUE),
             sd = ~sd(., na.rm = TRUE),
             cv = ~sd(., na.rm = TRUE)/mean(., na.rm = TRUE)
           )
    )
  )
kable(yearly_stats, caption = "THỐNG KÊ BIẾN ĐỘNG THEO NĂM")
THỐNG KÊ BIẾN ĐỘNG THEO NĂM
year loi_nhuan_sau_thue_mean loi_nhuan_sau_thue_sd loi_nhuan_sau_thue_cv cfo_tong_mean cfo_tong_sd cfo_tong_cv cfi_tong_mean cfi_tong_sd cfi_tong_cv cff_tong_mean cff_tong_sd cff_tong_cv
2015 92275349999 NA NA 81130888888 NA NA -204828797781 NA NA 32990722640 NA NA
2016 101159344647 NA NA 84650650055 NA NA -14340785224 NA NA -58008892000 NA NA
2017 117360040786 NA NA 97212899364 NA NA -443246932809 NA NA 352371798300 NA NA
2018 138683041628 NA NA 132094454149 NA NA -48101241268 NA NA -33304800015 NA NA
2019 162386686793 NA NA 66590387415 NA NA -120623064351 NA NA -61363261179 NA NA
2020 209696878289 NA NA 73153422780 NA NA -136475945213 NA NA 73592405403 NA NA
2021 189094874963 NA NA 234881036040 NA NA -83142058686 NA NA 34495813019 NA NA
2022 223540317602 NA NA 378603401448 NA NA -199303865931 NA NA -271718144243 NA NA
2023 299556005542 NA NA -30308428665 NA NA 69894262492 NA NA -112229740937 NA NA
2024 320862393082 NA NA 216267565018 NA NA -127199192457 NA NA -33304800015 NA NA

2.2.4 Phân tích phân vị

quantile_analysis <- ta_clean1 %>%
  summarise(across(c(loi_nhuan_sau_thue, cfo_tong, cfi_tong),
                   list(
                     Q0 = ~quantile(., 0, na.rm = TRUE),
                     Q1 = ~quantile(., 0.25, na.rm = TRUE),
                     Q2 = ~quantile(., 0.5, na.rm = TRUE),
                     Q3 = ~quantile(., 0.75, na.rm = TRUE),
                     Q4 = ~quantile(., 1, na.rm = TRUE)
                   )))

kable(quantile_analysis, caption = "PHÂN TÍCH PHÂN VỊ CÁC CHỈ TIÊU CHÍNH")
PHÂN TÍCH PHÂN VỊ CÁC CHỈ TIÊU CHÍNH
loi_nhuan_sau_thue_Q0 loi_nhuan_sau_thue_Q1 loi_nhuan_sau_thue_Q2 loi_nhuan_sau_thue_Q3 loi_nhuan_sau_thue_Q4 cfo_tong_Q0 cfo_tong_Q1 cfo_tong_Q2 cfo_tong_Q3 cfo_tong_Q4 cfi_tong_Q0 cfi_tong_Q1 cfi_tong_Q2 cfi_tong_Q3 cfi_tong_Q4
92275349999 122690790997 175740780878 220079457774 320862393082 -30308428665 75147789307 90931774710 195224287301 378603401448 -443246932809 -183596885752 -123911128404 -56861445623 69894262492

2.2.5 Kiểm tra phân phối chuẩn

normality_tests <- ta_clean1 %>%
  summarise(across(c(loi_nhuan_sau_thue, cfo_tong, cfi_tong),
                   list(
                     shapiro_p = ~shapiro.test(.)$p.value
                   ))) %>%
  # Chuyển đổi định dạng bảng
  pivot_longer(everything(), names_to = "Bien", values_to = "p_value") %>%
  mutate(
    Bien = gsub("_shapiro_p", "", Bien),
    p_value = round(p_value, 4),
    Ket_qua = ifelse(p_value > 0.05, "Phân phối chuẩn", "Không phân phối chuẩn")
  )

kable(normality_tests, 
      caption = "KIỂM ĐỊNH PHÂN PHỐI CHUẨN (Shapiro-Wilk)",
      col.names = c("Biến", "Giá trị p", "Kết quả"))
KIỂM ĐỊNH PHÂN PHỐI CHUẨN (Shapiro-Wilk)
Biến Giá trị p Kết quả
loi_nhuan_sau_thue 0.4191 Phân phối chuẩn
cfo_tong 0.2409 Phân phối chuẩn
cfi_tong 0.3481 Phân phối chuẩn

2.2.6 Phân tích phương sai (ANOVA)

anova_data <- ta_clean1 %>%
  select(year, loi_nhuan_sau_thue, cfo_tong, cfi_tong) %>%
  pivot_longer(-year, names_to = "variable", values_to = "value")

anova_result <- aov(value ~ variable, data = anova_data)
summary(anova_result)
##             Df                   Sum Sq                  Mean Sq F value
## variable     2 574905615849926177086222 287452807924963088548666   22.43
## Residuals   27 346050169844670467680826  12816672957210017399444        
##                 Pr(>F)    
## variable    0.00000182 ***
## Residuals                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

2.2.7 Kiểm định T-test

group_comparison <- ta_clean1 %>%
  mutate(High_Profit = loi_nhuan_sau_thue > median(loi_nhuan_sau_thue)) %>%
  summarise(
    t_test_cfo = t.test(cfo_tong ~ High_Profit)$p.value,
    t_test_cfi = t.test(cfi_tong ~ High_Profit)$p.value,
    t_test_cff = t.test(cff_tong ~ High_Profit)$p.value
  )

kable(group_comparison, caption = "KIỂM ĐỊNH T-TEST THEO NHÓM LỢI NHUẬN")
KIỂM ĐỊNH T-TEST THEO NHÓM LỢI NHUẬN
t_test_cfo t_test_cfi t_test_cff
0.3105355 0.4531494 0.3092235

2.2.8 Hồi quy tuyến tính đơn

lm_simple <- lm(loi_nhuan_sau_thue ~ cfo_tong, data = ta_clean1)
summary_lm_simple <- summary(lm_simple)

kable(broom::tidy(lm_simple), caption = "HỒI QUY TUYẾN TÍNH ĐƠN: LỢI NHUẬN ~ DÒNG TIỀN")
HỒI QUY TUYẾN TÍNH ĐƠN: LỢI NHUẬN ~ DÒNG TIỀN
term estimate std.error statistic p.value
(Intercept) 169896933550.1840820 41442569003.729836 4.0995753 0.0034398
cfo_tong 0.1166517 0.240623 0.4847904 0.6408202

2.2.9 Hồi quy tuyến tính đa biến

lm_multiple <- lm(loi_nhuan_sau_thue ~ cfo_tong + cfi_tong + cff_tong, 
                 data = ta_clean1)
summary_lm_multiple <- summary(lm_multiple)

kable(broom::tidy(lm_multiple), caption = "HỒI QUY TUYẾN TÍNH ĐA BIẾN")
HỒI QUY TUYẾN TÍNH ĐA BIẾN
term estimate std.error statistic p.value
(Intercept) 191167827191.3656616 48221491979.8729858 3.9643698 0.0074146
cfo_tong 0.1566295 0.3633626 0.4310556 0.6814841
cfi_tong 0.2060250 0.3660027 0.5629057 0.5938929
cff_tong -0.0431501 0.3299348 -0.1307838 0.9002212

2.2.10 Phân tích chuỗi thời gian

ts_analysis <- ta_clean1 %>%
  select(year, loi_nhuan_sau_thue) %>%
  mutate(
    LNST_lag1 = lag(loi_nhuan_sau_thue),
    LNST_lag2 = lag(loi_nhuan_sau_thue, 2),
    LNST_diff = c(NA, diff(loi_nhuan_sau_thue)),
    LNST_growth = (loi_nhuan_sau_thue / lag(loi_nhuan_sau_thue) - 1) * 100
  )

kable(ts_analysis, caption = "PHÂN TÍCH CHUỖI THỜI GIAN LỢI NHUẬN")
PHÂN TÍCH CHUỖI THỜI GIAN LỢI NHUẬN
year loi_nhuan_sau_thue LNST_lag1 LNST_lag2 LNST_diff LNST_growth
2015 92275349999 NA NA NA NA
2016 101159344647 92275349999 NA 8883994648 9.627701
2017 117360040786 101159344647 92275349999 16200696139 16.015027
2018 138683041628 117360040786 101159344647 21323000842 18.168876
2019 162386686793 138683041628 117360040786 23703645165 17.091956
2020 209696878289 162386686793 138683041628 47310191496 29.134280
2021 189094874963 209696878289 162386686793 -20602003326 -9.824659
2022 223540317602 189094874963 209696878289 34445442639 18.215958
2023 299556005542 223540317602 189094874963 76015687940 34.005359
2024 320862393082 299556005542 223540317602 21306387540 7.112656

2.2.11 Phân tích độ biến động

volatility_analysis <- ta_clean1 %>%
  summarise(
    Volatility_LNST = sd(loi_nhuan_sau_thue, na.rm = TRUE) / mean(loi_nhuan_sau_thue, na.rm = TRUE),
    Volatility_CFO = sd(cfo_tong, na.rm = TRUE) / mean(cfo_tong, na.rm = TRUE),
    Volatility_CFI = sd(cfi_tong, na.rm = TRUE) / mean(cfi_tong, na.rm = TRUE),
    Volatility_CFF = sd(cff_tong, na.rm = TRUE) / mean(cff_tong, na.rm = TRUE)
  )

kable(volatility_analysis, caption = "PHÂN TÍCH ĐỘ BIẾN ĐỘNG CÁC CHỈ TIÊU")
PHÂN TÍCH ĐỘ BIẾN ĐỘNG CÁC CHỈ TIÊU
Volatility_LNST Volatility_CFO Volatility_CFI Volatility_CFF
0.4274086 0.8603631 -1.054016 -20.76817

2.2.12 Phân tích xu hướng

trend_analysis <- ta_clean1 %>%
  mutate(Trend = 1:n()) %>%
  summarise(
    Trend_LNST = lm(loi_nhuan_sau_thue ~ Trend)$coefficients[2],
    Trend_CFO = lm(cfo_tong ~ Trend)$coefficients[2],
    Trend_CFI = lm(cfi_tong ~ Trend)$coefficients[2],
    Trend_CFF = lm(cff_tong ~ Trend)$coefficients[2]
  )

kable(trend_analysis, caption = "PHÂN TÍCH XU HƯỚNG TUYẾN TÍNH")
PHÂN TÍCH XU HƯỚNG TUYẾN TÍNH
Trend_LNST Trend_CFO Trend_CFI Trend_CFF
25306103573 12929647428 14466980504 -22777562748

2.2.13 Tính toán các tỷ số tài chính

ta_clean1 <- ta_clean1 %>%
  mutate(
    TySo_ThanhKhoanHienHanh = (tien_cuoi_ky + bien_dong_phai_thu + bien_dong_ton_kho) / abs(bien_dong_phai_tra),
    ROA = loi_nhuan_sau_thue / (tien_cuoi_ky + abs(bien_dong_phai_thu) + abs(bien_dong_ton_kho)),
    ROS = loi_nhuan_sau_thue / (loi_nhuan_sau_thue + abs(cfo_tong)),
    TySo_No = abs(vay_moi + tra_no_goc) / (loi_nhuan_sau_thue + 1),
    VongQuay_PhaiThu = cfo_tong / abs(bien_dong_phai_thu),
    VongQuay_TonKho = cfo_tong / abs(bien_dong_ton_kho)
  )

kable(ta_clean1 %>% select(year, TySo_ThanhKhoanHienHanh, ROA, ROS, TySo_No), 
      caption = "CÁC TỶ SỐ TÀI CHÍNH CHỦ CHỐT")
CÁC TỶ SỐ TÀI CHÍNH CHỦ CHỐT
year TySo_ThanhKhoanHienHanh ROA ROS TySo_No
2015 2.716348 0.5139037 0.5321340 0.0000000
2016 4.059811 0.8443673 0.5444236 0.2098925
2017 2.438772 0.7551253 0.5469471 0.0000000
2018 12.312203 0.5405298 0.5121661 0.0000000
2019 -2.144141 0.9868891 0.7091832 0.2314196
2020 -1.026008 0.9473487 0.7413705 1.7407832
2021 113.340309 0.4172794 0.4460038 0.7112999
2022 6.351222 0.8892551 0.3712408 0.7681424
2023 -4.513131 0.7741630 0.9081185 0.1520857
2024 3.575109 1.2759404 0.5973645 0.1143788

2.3 CHƯƠNG 4: TRỰC QUAN HOA DỮ LIỆU

2.3.1 Nhóm biểu đồ xu hướng theo thời gian

2.3.1.1 Xu hướng các chỉ tiêu chính

# Tạo grid 2x2 cho xu hướng chính
p1 <- ggplot(ta_clean1, aes(x = year, y = loi_nhuan_sau_thue/1e9)) +
  geom_line(color = "#1f77b4", size = 1.5, alpha = 0.8) +
  geom_point(color = "#ff7f0e", size = 3) +
  geom_smooth(method = "lm", se = TRUE, fill = "#d62728", alpha = 0.2) +
  geom_text(aes(label = round(loi_nhuan_sau_thue/1e9, 1)), vjust = -1, size = 3) +
  geom_hline(yintercept = mean(ta_clean1$loi_nhuan_sau_thue/1e9), linetype = "dashed", color = "#2ca02c") +
  labs(title = "LỢI NHUẬN SAU THUẾ", x = "Năm", y = "Tỷ VND") +
  theme_minimal()

p2 <- ggplot(ta_clean1, aes(x = year)) +
  geom_line(aes(y = cfo_tong/1e9, color = "CFO"), size = 1.2) +
  geom_line(aes(y = cfi_tong/1e9, color = "CFI"), size = 1.2) +
  geom_line(aes(y = cff_tong/1e9, color = "CFF"), size = 1.2) +
  geom_point(aes(y = cfo_tong/1e9), size = 2) + geom_point(aes(y = cfi_tong/1e9), size = 2) + geom_point(aes(y = cff_tong/1e9), size = 2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "DÒNG TIỀN", x = "Năm", y = "Tỷ VND") +
  scale_color_manual(values = c("CFO" = "blue", "CFI" = "green", "CFF" = "orange")) +
  theme_minimal()

p3 <- ggplot(ta_clean1, aes(x = year, y = DongTienTuDo/1e9)) +
  geom_col(aes(fill = DongTienTuDo > 0), alpha = 0.8) +
  geom_text(aes(label = round(DongTienTuDo/1e9, 1)), vjust = ifelse(ta_clean1$DongTienTuDo > 0, -0.5, 1.2), size = 3) +
  geom_line(aes(group = 1), color = "red", size = 1, linetype = "dashed") +
  geom_point(size = 3, color = "darkred") + geom_hline(yintercept = 0, color = "black") +
  labs(title = "DÒNG TIỀN TỰ DO", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("TRUE" = "#2ca02c", "FALSE" = "#d62728")) +
  theme_minimal() + theme(legend.position = "none")

p4 <- ggplot(ta_clean1, aes(x = year, y = VayRong/1e9, fill = ChinhSachNo)) +
  geom_col(alpha = 0.8) + geom_text(aes(label = round(VayRong/1e9, 1)), vjust = ifelse(ta_clean1$VayRong > 0, -0.5, 1.2), size = 3) +
  geom_line(aes(y = vay_moi/1e9, color = "Vay mới"), size = 1) + geom_line(aes(y = tra_no_goc/1e9, color = "Trả nợ"), size = 1) +
  geom_hline(yintercept = 0, color = "black") + labs(title = "CHIẾN LƯỢC NỢ", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("Vay Them" = "#ff7f0e", "Tra No" = "#1f77b4", "Can Bang" = "#2ca02c")) +
  scale_color_manual(values = c("Vay mới" = "#d62728", "Trả nợ" = "#9467bd")) + theme_minimal()

# Sắp xếp grid
gridExtra::grid.arrange(p1, p2, p3, p4, ncol = 2, 
                        top = "NHÓM BIỂU ĐỒ XU HƯỚNG CÁC CHỈ TIÊU CHÍNH 2015-2024")

Trong giai đoạn 2015–2024, lợi nhuận sau thuế của doanh nghiệp có xu hướng tăng trưởng ổn định và liên tục. Cụ thể, mức lợi nhuận tăng từ khoảng 92 tỷ đồng năm 2015 lên đến hơn 250 tỷ đồng năm 2024, thể hiện năng lực sinh lời được cải thiện qua thời gian. Đường xu hướng tăng đều và dốc lên cho thấy hoạt động kinh doanh của doanh nghiệp đang phát triển bền vững, khả năng kiểm soát chi phí và mở rộng doanh thu tốt.

Ba dòng tiền chính của doanh nghiệp có biến động đáng kể qua các năm. Dòng tiền từ hoạt động kinh doanh (CFO) phần lớn duy trì ở mức dương, cho thấy khả năng tạo tiền từ hoạt động cốt lõi tương đối ổn định. Trong khi đó, dòng tiền đầu tư (CFI) thường âm, phản ánh việc doanh nghiệp liên tục đầu tư mở rộng tài sản hoặc dự án mới. Dòng tiền tài chính (CFF) dao động mạnh giữa các năm, cho thấy chính sách huy động vốn và trả nợ thay đổi linh hoạt tùy theo nhu cầu vốn từng giai đoạn.

Dòng tiền tự do (Free Cash Flow) trong giai đoạn đầu (2015–2019) có xu hướng âm, thể hiện việc doanh nghiệp chi đầu tư vượt quá lượng tiền tạo ra từ hoạt động kinh doanh. Tuy nhiên, từ năm 2020 trở đi, dòng tiền tự do chuyển sang dương và tăng mạnh, đạt đỉnh khoảng 182 tỷ đồng, chứng tỏ hiệu quả hoạt động và khả năng tạo tiền mặt thực tế được cải thiện rõ rệt. Đây là tín hiệu tích cực cho thấy doanh nghiệp đang dần tự chủ hơn về tài chính.

Chính sách nợ của doanh nghiệp thay đổi linh hoạt theo từng giai đoạn. Giai đoạn 2015–2019 ghi nhận xu hướng vay thêm, có thể nhằm tài trợ cho các hoạt động đầu tư và mở rộng kinh doanh. Đến giai đoạn 2020–2022, doanh nghiệp bắt đầu giảm dần tỷ lệ vay mới và chuyển sang trả nợ, thể hiện sự dịch chuyển từ tăng trưởng bằng đòn bẩy tài chính sang duy trì cân bằng tài chính. Điều này cho thấy mức độ rủi ro tài chính được kiểm soát tốt hơn, hướng tới sự ổn định và bền vững trong cơ cấu vốn.

2.3.1.2 Xu hướng các tỷ số tài chính

ty_so_data <- ta_clean1 %>%
  select(year, TySo_ThanhKhoanHienHanh, ROA, ROS, TySo_No, VongQuay_TonKho) %>%
  pivot_longer(-year, names_to = "TySo", values_to = "GiaTri")

p5 <- ggplot(ty_so_data, aes(x = year, y = GiaTri, color = TySo)) +
  geom_line(size = 1.2) + geom_point(size = 2.5) + geom_label(aes(label = round(GiaTri, 2)), size = 2.5, vjust = -0.5) +
  facet_wrap(~TySo, scales = "free_y", ncol = 3) + labs(title = "XU HƯỚNG CÁC TỶ SỐ TÀI CHÍNH", x = "Năm", y = "Giá trị") +
  theme_minimal() + theme(legend.position = "none", plot.title = element_text(face = "bold", hjust = 0.5))

print(p5)

Tỷ suất ROA của doanh nghiệp nhìn chung dao động nhẹ nhưng duy trì ở mức tương đối cao, phản ánh hiệu quả sử dụng tài sản ổn định. Cụ thể, ROA tăng từ 0.51 năm 2015 lên 1.2 năm 2024, dù có giai đoạn giảm xuống 0.42 năm 2021. Xu hướng tăng trở lại mạnh mẽ những năm gần đây cho thấy doanh nghiệp đã cải thiện hiệu quả khai thác tài sản để tạo lợi nhuận, thể hiện năng lực quản trị tốt hơn.

Chỉ số ROS có xu hướng dao động rõ rệt qua các năm, trong đó giai đoạn 2018–2021 ghi nhận mức giảm, sau đó phục hồi lên 0.6 năm 2024. Mức ROS cao nhất đạt 0.74, cho thấy có những năm doanh nghiệp kiểm soát chi phí tốt, biên lợi nhuận được cải thiện. Tuy nhiên, sự biến động này cũng phản ánh sự thay đổi trong cấu trúc chi phí hoặc giá vốn, đòi hỏi doanh nghiệp cần ổn định hơn để duy trì lợi nhuận dài hạn.

Tỷ số nợ tăng mạnh trong giai đoạn 2019–2021, đạt đỉnh khoảng 1.6, sau đó giảm xuống còn 0.77 năm 2024. Điều này cho thấy doanh nghiệp đã từng mở rộng hoạt động dựa vào đòn bẩy tài chính, nhưng sau đó chủ động giảm nợ và cải thiện cơ cấu vốn. Việc giảm tỷ lệ nợ giúp giảm rủi ro tài chính và tăng khả năng tự chủ trong quản trị vốn.

Tỷ số thanh khoản hiện hành biến động mạnh, đặc biệt tăng vọt lên 12.31 vào năm 2020, sau đó giảm trở lại quanh mức 3–4. Sự tăng đột biến này có thể do tăng lượng tài sản ngắn hạn hoặc giảm nợ ngắn hạn tạm thời. Nhìn chung, chỉ số này vẫn duy trì ở mức an toàn, phản ánh khả năng đáp ứng nghĩa vụ ngắn hạn tương đối tốt của doanh nghiệp.

Chỉ số vòng quay tồn kho có xu hướng dao động nhẹ và tăng dần về cuối kỳ, từ 1.6 vòng năm 2015 lên đến trên 20 vòng năm 2024. Điều này cho thấy hiệu quả quản lý hàng tồn kho được cải thiện rõ rệt, tốc độ luân chuyển hàng hóa nhanh hơn, giúp tăng hiệu quả sử dụng vốn lưu động và giảm chi phí lưu kho.

Tổng thể, các tỷ số tài chính cho thấy doanh nghiệp đang cải thiện rõ về hiệu quả hoạt động, khả năng sinh lời và cơ cấu tài chính. Dù vẫn có những giai đoạn biến động, xu hướng chung hướng đến ổn định và bền vững hơn trong giai đoạn cuối.

2.3.2 Nhóm biểu đồ phân tích rủi ro và hiệu quả

# Biểu đồ rủi ro thanh khoản
risk_data <- ta_clean1 %>%
  mutate(Risk_Level = case_when(
    cfo_tong < 0 ~ "Rủi ro cao", cfo_tong < quantile(cfo_tong, 0.33) ~ "Rủi ro trung bình",
    cfo_tong < quantile(cfo_tong, 0.66) ~ "Rủi ro thấp", TRUE ~ "An toàn"))

p6 <- ggplot(risk_data, aes(x = year, y = cfo_tong/1e9, fill = Risk_Level)) +
  geom_col(alpha = 0.8) + geom_text(aes(label = round(cfo_tong/1e9, 1)), vjust = -0.5, size = 3) +
  labs(title = "Đánh giá rủi ro thanh toán", x = "Năm", y = "CFO (Tỷ VND)") +
  scale_fill_manual(values = c("Rủi ro cao" = "#d62728", "Rủi ro trung bình" = "#ff7f0e", "Rủi ro thấp" = "#2ca02c", "An toàn" = "#1f77b4")) +
  theme_minimal()

# Biểu đồ hiệu quả quản lý tồn kho & phải thu
efficiency_data <- ta_clean1 %>%
  select(year, bien_dong_ton_kho, bien_dong_phai_thu) %>%
  mutate(ton_kho = bien_dong_ton_kho/1e9, phai_thu = bien_dong_phai_thu/1e9) %>%
  pivot_longer(cols = c(ton_kho, phai_thu), names_to = "Loai", values_to = "GiaTri")

p7 <- ggplot(efficiency_data, aes(x = year, y = GiaTri, fill = Loai)) +
  geom_col(position = "dodge", alpha = 0.8) + geom_text(aes(label = round(GiaTri, 1)), position = position_dodge(0.9), vjust = -0.5, size = 2.5) +
  geom_line(aes(group = Loai, color = Loai), size = 1, position = position_dodge(0.9)) + geom_point(aes(color = Loai), size = 2, position = position_dodge(0.9)) +
  labs(title = "Hiệu quả tồn kho & phải thu", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("ton_kho" = "#1f77b4", "phai_thu" = "#ff7f0e"), labels = c("Tồn kho", "Phải thu")) +
  scale_color_manual(values = c("ton_kho" = "#1f77b4", "phai_thu" = "#ff7f0e"), labels = c("Tồn kho", "Phải thu")) +
  theme_minimal()

# Biểu đồ so sánh phải thu & phải trả
payables_data <- ta_clean1 %>%
  select(year, bien_dong_phai_thu, bien_dong_phai_tra) %>%
  mutate(phai_thu = bien_dong_phai_thu/1e9, phai_tra = abs(bien_dong_phai_tra)/1e9) %>%
  pivot_longer(cols = c(phai_thu, phai_tra), names_to = "Loai", values_to = "GiaTri")

p8 <- ggplot(payables_data, aes(x = year, y = GiaTri, fill = Loai)) +
  geom_col(position = "dodge", alpha = 0.8) + geom_text(aes(label = round(GiaTri, 1)), position = position_dodge(0.9), vjust = -0.5, size = 2.5) +
  labs(title = "So sánh Thu và Trả", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("phai_thu" = "#1f77b4", "phai_tra" = "#ff7f0e"), labels = c("Phải thu", "Phải trả")) +
  theme_minimal()

# Biểu đồ xu hướng tồn kho
p9 <- ggplot(ta_clean1, aes(x = year, y = bien_dong_ton_kho/1e9, fill = XuHuong_TonKho)) +
  geom_col(alpha = 0.8) + geom_text(aes(label = round(bien_dong_ton_kho/1e9, 1)), vjust = ifelse(ta_clean1$bien_dong_ton_kho > 0, -0.5, 1.2), size = 3) +
  geom_line(aes(group = 1), color = "red", size = 1, linetype = "dashed") + geom_point(size = 3, color = "darkred") + geom_hline(yintercept = 0, color = "black") +
  labs(title = "Xu hướng hàng tồn kho", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("Tang" = "#ff9999", "Giam" = "#99ff99", "On Dinh" = "#66b3ff")) + theme_minimal()

gridExtra::grid.arrange(p6, p7, p8, p9, ncol = 2, 
                        top = "NHÓM BIỂU ĐỒ PHÂN TÍCH RỦI RO & HIỆU QUẢ HOẠT ĐỘNG")

Dựa trên nhóm biểu đồ phân tích rủi ro và hiệu quả hoạt động, có thể đưa ra một số nhận định chính như sau:

Về rủi ro thanh khoản: Tình hình thanh khoản của doanh nghiệp có sự biến động đáng kể qua các năm. Các năm 2015-2016 chủ yếu ở mức rủi ro trung bình, năm 2017-2018 cải thiện lên mức an toàn, năm 2019-2020 quay lại mức rủi ro trung bình, và đặc biệt năm 2023 ghi nhận mức rủi ro cao - đây là dấu hiệu đáng lưu ý về khả năng thanh toán ngắn hạn.

Về hiệu quả quản lý tài sản: Biểu đồ quản lý tồn kho và phải thu cho thấy sự biến động mạnh qua các năm. Các khoản phải thu có xu hướng tăng cao vào các năm 2021-2022, trong khi tồn kho cũng có những biến động đáng kể, phản ánh những thách thức trong quản lý vốn lưu động.

Về cơ cấu công nợ: So sánh giữa phải thu và phải trả cho thấy có sự mất cân đối ở một số thời điểm, đặc biệt khi các khoản phải thu vượt quá phải trả, điều này có thể gây áp lực lên dòng tiền hoạt động.

Về xu hướng tồn kho: Hàng tồn kho có sự thay đổi liên tục giữa tăng và giảm qua các năm, với năm 2023 ghi nhận xu hướng giảm mạnh - điều này có thể liên quan đến việc tối ưu hóa quản lý tồn kho hoặc tác động từ tình hình kinh doanh.

Tổng quan cho thấy doanh nghiệp cần đặc biệt chú ý đến quản lý rủi ro thanh khoản và tối ưu hóa hiệu quả sử dụng vốn lưu động để đảm bảo hoạt động ổn định.

2.3.3 Nhóm biểu đồ phân bố và so sánh

# Phân bố lợi nhuận
p14 <- ggplot(ta_clean1, aes(x = loi_nhuan_sau_thue/1e9)) +
  geom_histogram(aes(y = ..density..), bins = 12, fill = "#1f77b4", alpha = 0.7) + geom_density(color = "#ff7f0e", size = 1.2) +
  geom_vline(aes(xintercept = mean(loi_nhuan_sau_thue/1e9)), color = "red", linetype = "dashed", size = 1) +
  stat_function(fun = dnorm, args = list(mean = mean(ta_clean1$loi_nhuan_sau_thue/1e9), sd = sd(ta_clean1$loi_nhuan_sau_thue/1e9)), color = "green", size = 1) +
  geom_rug(color = "#2ca02c") + labs(title = "PHÂN BỐ LỢI NHUẬN", x = "Lợi nhuận (Tỷ VND)", y = "Mật độ") + theme_minimal()

# Boxplot theo năm
p15 <- ggplot(ta_clean1, aes(x = factor(year), y = loi_nhuan_sau_thue/1e9)) +
  geom_boxplot(fill = "#1f77b4", alpha = 0.7) + geom_jitter(width = 0.2, color = "#ff7f0e", size = 2) +
  geom_point(stat = "summary", fun = "mean", color = "red", size = 3) + stat_summary(fun = "mean", geom = "line", group = 1, color = "red", size = 1) +
  geom_hline(yintercept = mean(ta_clean1$loi_nhuan_sau_thue/1e9), linetype = "dashed", color = "blue") +
  labs(title = "LỢI NHUẬN THEO NĂM", x = "Năm", y = "Tỷ VND") + theme_minimal()

# So sánh theo mức lợi nhuận
p16 <- ggplot(ta_clean1, aes(x = year, y = loi_nhuan_sau_thue/1e9, fill = muc_loi_nhuan)) +
  geom_col(alpha = 0.8) + geom_text(aes(label = round(loi_nhuan_sau_thue/1e9, 1)), vjust = -0.5, size = 3) +
  geom_line(aes(group = 1), color = "red", size = 1, linetype = "dashed") + geom_point(size = 2, color = "darkred") +
  geom_hline(yintercept = mean(ta_clean1$loi_nhuan_sau_thue/1e9), color = "blue", linetype = "dotdash") +
  labs(title = "SO SÁNH MỨC LỢI NHUẬN", x = "Năm", y = "Tỷ VND") +
  scale_fill_manual(values = c("Thấp" = "#ff9999", "Trung bình" = "#66b3ff", "Cao" = "#99ff99")) + theme_minimal()

# Xu hướng tăng/giảm
p17 <- ggplot(ta_clean1, aes(x = year, y = loi_nhuan_sau_thue/1e9, color = TangGiam_LoiNhuan)) +
  geom_line(size = 1.5, alpha = 0.7) + geom_point(size = 4) + geom_text(aes(label = round(loi_nhuan_sau_thue/1e9, 1)), vjust = -1, size = 3) +
  geom_segment(aes(xend = year, yend = 0), alpha = 0.3) + geom_hline(yintercept = mean(ta_clean1$loi_nhuan_sau_thue/1e9), linetype = "dashed", color = "gray") +
  labs(title = "XU HƯỚNG TĂNG/GIẢM", x = "Năm", y = "Tỷ VND") + scale_color_manual(values = c("Tang" = "#2ca02c", "Giam" = "#d62728")) + theme_minimal()

gridExtra::grid.arrange(p14, p15, p16, p17, ncol = 2, 
                        top = "NHÓM BIỂU ĐỒ PHÂN BỐ & SO SÁNH DỮ LIỆU")

Biểu đồ cho thấy mức độ rủi ro thanh khoản của doanh nghiệp biến động qua các năm. Giai đoạn đầu (2015–2018), doanh nghiệp chủ yếu ở mức rủi ro trung bình đến cao, phản ánh khả năng thanh toán ngắn hạn còn hạn chế. Tuy nhiên, từ năm 2019 trở đi, doanh nghiệp chuyển dần sang vùng an toàn, thể hiện khả năng kiểm soát dòng tiền tốt hơn. Sự cải thiện rõ nhất là vào các năm 2021–2023 khi dòng tiền từ hoạt động kinh doanh (CFO) tăng mạnh, giúp doanh nghiệp giảm thiểu rủi ro mất cân đối tài chính ngắn hạn.

Hiệu quả quản lý tồn kho và các khoản phải thu có xu hướng biến động nhưng ổn định dần về cuối kỳ. Trong giai đoạn 2015–2018, cả hai chỉ tiêu có sự dao động lớn, phản ánh việc điều phối vốn lưu động chưa tối ưu. Tuy nhiên, từ 2020 trở đi, tồn kho và phải thu được kiểm soát chặt chẽ hơn, mức biến động giảm dần, chứng tỏ doanh nghiệp nâng cao hiệu quả trong chuỗi cung ứng và thu hồi công nợ, góp phần cải thiện dòng tiền hoạt động.

Sự chênh lệch giữa các khoản phải thu và phải trả thể hiện chính sách tín dụng thương mại linh hoạt của doanh nghiệp. Trong các năm đầu, phải thu cao hơn phải trả, cho thấy doanh nghiệp mở rộng tín dụng cho khách hàng. Tuy nhiên, từ năm 2020 trở đi, khoản phải trả tăng mạnh, đặc biệt có thời điểm đạt hơn 90 tỷ đồng, giúp doanh nghiệp tận dụng được nguồn vốn chiếm dụng từ nhà cung cấp. Điều này góp phần hỗ trợ dòng tiền ngắn hạn và giảm áp lực tài chính trong kỳ.

Biểu đồ xu hướng hàng tồn kho cho thấy giai đoạn 2015–2020 có xu hướng giảm nhẹ, thể hiện doanh nghiệp đang đẩy mạnh tiêu thụ hàng hóa hoặc giảm lượng tồn trữ. Tuy nhiên, đến giai đoạn 2021–2023, hàng tồn kho có biến động tăng rồi giảm mạnh, phản ánh sự điều chỉnh trong chính sách sản xuất – kinh doanh. Việc kiểm soát tồn kho hiệu quả về cuối kỳ giúp giảm chi phí lưu kho và tăng tốc độ quay vòng vốn, góp phần cải thiện lợi nhuận.

Tổng thể, nhóm biểu đồ này cho thấy doanh nghiệp đã cải thiện rõ rệt khả năng quản trị tài chính ngắn hạn, đặc biệt trong quản lý dòng tiền, hàng tồn kho và công nợ. Rủi ro thanh khoản giảm dần qua các năm là dấu hiệu tích cực của sức khỏe tài chính ổn định và bền vững hơn

2.3.4 Nhóm biểu đồ tổng hợp và nâng cao

# Tổng hợp tất cả chỉ tiêu chính
summary_data <- ta_clean1 %>% select(year, loi_nhuan_sau_thue, cfo_tong, cfi_tong, cff_tong, DongTienTuDo) %>% mutate(across(where(is.numeric), ~ ./1e9)) %>% pivot_longer(-year, names_to = "ChiTieu", values_to = "GiaTri")

p18 <- ggplot(summary_data, aes(x = year, y = GiaTri, color = ChiTieu)) +
  geom_line(size = 1.2) + geom_point(size = 2.5) + geom_label(aes(label = round(GiaTri, 1)), size = 2.5, vjust = -0.8) +
  facet_wrap(~ChiTieu, scales = "free_y", ncol = 2) + labs(title = "TỔNG HỢP CÁC CHỈ TIÊU CHÍNH", x = "Năm", y = "Tỷ VND") +
  theme_minimal() + theme(legend.position = "none", plot.title = element_text(face = "bold", hjust = 0.5)) + scale_color_brewer(palette = "Set2")

# Lợi nhuận tích lũy
cumulative_data <- ta_clean1 %>% arrange(year) %>% mutate(Cumulative_Profit = cumsum(loi_nhuan_sau_thue)/1e9, Annual_Profit = loi_nhuan_sau_thue/1e9)
p19 <- ggplot(cumulative_data, aes(x = year)) +
  geom_col(aes(y = Annual_Profit, fill = "Lợi nhuận năm"), alpha = 0.6) + geom_line(aes(y = Cumulative_Profit, color = "Lợi nhuận tích lũy"), size = 2) +
  geom_point(aes(y = Cumulative_Profit), size = 3, color = "#d62728") + geom_text(aes(y = Annual_Profit, label = round(Annual_Profit, 1)), vjust = -0.5, size = 3) +
  geom_text(aes(y = Cumulative_Profit, label = round(Cumulative_Profit, 1)), vjust = 1.5, size = 3, color = "#d62728") +
  labs(title = "LỢI NHUẬN TÍCH LŨY", x = "Năm", y = "Tỷ VND") + scale_fill_manual(values = c("Lợi nhuận năm" = "#1f77b4")) + scale_color_manual(values = c("Lợi nhuận tích lũy" = "#d62728")) + theme_minimal()

# Phân tích giai đoạn phát triển
p20 <- ggplot(ta_clean1, aes(x = year, y = loi_nhuan_sau_thue/1e9, fill = Giai_Doan_Phat_Trien)) +
  geom_col(alpha = 0.8) + geom_text(aes(label = round(loi_nhuan_sau_thue/1e9, 1)), vjust = -0.5, size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "red", size = 1) + geom_vline(xintercept = c(2017, 2020, 2023), linetype = "dashed", color = "gray") +
  geom_hline(yintercept = mean(ta_clean1$loi_nhuan_sau_thue/1e9), linetype = "dotdash", color = "blue") +
  labs(title = "PHÂN TÍCH GIAI ĐOẠN PHÁT TRIỂN", x = "Năm", y = "Tỷ VND") + scale_fill_brewer(palette = "Set3") + theme_minimal()

# Mật độ phân bố nhiều biến
density_data <- ta_clean1 %>% select(loi_nhuan_sau_thue, cfo_tong, cfi_tong) %>% mutate(across(everything(), ~./1e9)) %>% pivot_longer(everything(), names_to = "Variable", values_to = "Value")
p21 <- ggplot(density_data, aes(x = Value, fill = Variable)) +
  geom_density(alpha = 0.6) + geom_vline(data = density_data %>% group_by(Variable) %>% summarise(Mean = mean(Value)), aes(xintercept = Mean), linetype = "dashed") +
  geom_rug(alpha = 0.5) + facet_wrap(~Variable, scales = "free", ncol = 1) + labs(title = "PHÂN BỐ MẬT ĐỘ CÁC CHỈ TIÊU", x = "Tỷ VND", y = "Mật độ") + theme_minimal() + theme(legend.position = "none")

print(p18)

print(p19)

print(p20)

print(p21)

Nhìn vào nhóm biểu đồ “Tổng hợp các chỉ tiêu chính”, có thể thấy các yếu tố tài chính chủ đạo như CFO (dòng tiền từ hoạt động kinh doanh), CFI (dòng tiền đầu tư), CFF (dòng tiền tài chính), dòng tiền tự do (FCF) và lợi nhuận sau thuế đều phản ánh xu hướng phát triển tích cực theo thời gian. Cụ thể, CFO tăng mạnh từ mức 80 tỷ (2015) lên khoảng trên 200 tỷ (2024), cho thấy khả năng tạo tiền từ hoạt động cốt lõi ngày càng tốt. CFI thường âm, phản ánh hoạt động đầu tư liên tục, đặc biệt là các giai đoạn 2018–2021, nhưng đây là dấu hiệu mở rộng quy mô, không phải rủi ro. CFF biến động mạnh, thể hiện việc doanh nghiệp linh hoạt trong việc vay nợ và trả nợ tùy giai đoạn. Lợi nhuận sau thuế tăng liên tục từ 92 tỷ (2015) lên trên 320 tỷ (2024), song hành cùng sự cải thiện dòng tiền tự do, khẳng định doanh nghiệp đang tăng trưởng bền vững và có hiệu quả vận hành cao hơn qua từng năm.

Biểu đồ “Lợi nhuận tích lũy” cho thấy đường cong tăng trưởng theo dạng lũy tiến rõ rệt, phản ánh khả năng tái đầu tư và tích lũy lợi nhuận của doanh nghiệp trong dài hạn. Từ mức 92 tỷ đồng năm 2015, lợi nhuận năm tăng đều qua các năm, trong khi lợi nhuận tích lũy đạt đỉnh hơn 1.500 tỷ đồng vào năm 2024. Đường màu đỏ thể hiện sự tăng tốc rõ rệt từ sau năm 2019, chứng minh doanh nghiệp đã bước vào giai đoạn tăng trưởng mạnh và ổn định lợi nhuận. Xu hướng này không chỉ cho thấy năng lực sinh lời tốt mà còn phản ánh chính sách giữ lại lợi nhuận và mở rộng hoạt động hiệu quả, tạo nền tảng vững chắc cho các năm tiếp theo.

Biểu đồ “Phân tích giai đoạn phát triển” chia tiến trình tăng trưởng của doanh nghiệp thành 4 giai đoạn:

Giai đoạn biến động (2015–2017): Lợi nhuận tăng nhẹ, thể hiện thời kỳ doanh nghiệp thích ứng và ổn định sau giai đoạn đầu tư ban đầu. Giai đoạn tăng trưởng (2018–2020): Lợi nhuận tăng nhanh từ 117 tỷ lên hơn 200 tỷ, cho thấy mức sinh lời và hiệu quả sử dụng vốn được cải thiện rõ rệt. Giai đoạn ổn định (2020–2022):Lợi nhuận dao động quanh mức 189–223 tỷ, thể hiện giai đoạn duy trì hiệu suất và tối ưu hóa chi phí. Giai đoạn phục hồi và mở rộng (2022–2024): Lợi nhuận bật tăng mạnh lên 320 tỷ đồng, cho thấy doanh nghiệp đã tái cấu trúc thành công, khai thác hiệu quả đầu tư và quay lại đà tăng trưởng. Nhìn chung, đồ thị thể hiện chu kỳ phát triển điển hình của doanh nghiệp khỏe mạnh, với quá trình tái đầu tư và tăng trưởng bền vững.

Biểu đồ “Phân bố mật độ các chỉ tiêu” thể hiện tần suất và xu hướng dao động của các biến tài chính chính như CFI,CFO, và lợi nhuận sau thuế.

CFI (đầu tư) tập trung chủ yếu ở vùng giá trị âm (-300 đến -100 tỷ), phù hợp với đặc điểm doanh nghiệp đang mở rộng quy mô.CFO (hoạt động kinh doanh) có mật độ cao nhất ở vùng 100–200 tỷ, phản ánh khả năng tạo tiền đều đặn và ổn định.Lợi nhuận sau thuế phân bố rộng nhưng thiên về phía cao (150–300 tỷ), cho thấy tính bền vững của lợi nhuận và xu hướng tăng trưởng dài hạn.Phân bố như vậy chứng minh rằng rủi ro tài chính được kiểm soát tốt, trong khi các chỉ tiêu sinh lời duy trì ở mức tích cực và ổn định.

Tổng hợp 4 nhóm biểu đồ cho thấy doanh nghiệp đang trong trạng thái tài chính tích cực và phát triển bền vững. Các chỉ tiêu dòng tiền, lợi nhuận, và hiệu quả hoạt động đều tăng trưởng rõ rệt, trong khi mức độ biến động dần giảm. Doanh nghiệp không chỉ cải thiện năng lực sinh lời mà còn kiểm soát tốt rủi ro đầu tư và thanh khoản. Nhìn chung, giai đoạn 2015–2024 đánh dấu sự chuyển đổi thành công từ giai đoạn mở rộng sang phát triển ổn định, là nền tảng vững chắc để bước vào chu kỳ tăng trưởng mới trong tương lai.

Dựa trên phân tích toàn diện hai bộ dữ liệu Marketing Campaign DatasetBáo cáo tài chính IMP, dưới đây là phần tổng quan về mặt kinh tế của toàn bài:


3 TỔNG QUAN KINH TẾ

3.1 Hiệu quả Marketing & Tối ưu hóa Chiến lược

  • ROI trung bình đạt 5.002, cho thấy hiệu quả đầu tư marketing ở mức tích cực, tuy không có sự chênh lệch lớn giữa các kênh.
  • Email và Website là hai kênh hiệu quả nhất với tỷ lệ chuyển đổi cao và chi phí thấp, trong khi YouTube và Instagram có hiệu suất thấp hơn dù quy mô tiếp cận lớn.
  • Influencer và Search là hai loại chiến dịch mang lại doanh thu cao nhất, phản ánh xu hướng tiếp thị hiện đại và tập trung vào chất lượng chuyển đổi.
  • Phân khúc Tech Enthusiasts mang lại lợi nhuận vượt trội, khẳng định tiềm năng của thị trường công nghệ.

3.2 Tình hình Tài chính Doanh nghiệp

  • Lợi nhuận sau thuế tăng trưởng mạnh mẽ, từ 92.275 tỷ đồng (2015) lên 320.862 tỷ đồng (2024), thể hiện khả năng mở rộng thị phần và cải thiện hiệu quả kinh doanh.
  • Dòng tiền hoạt động (CFO) có biến động lớn, đặc biệt năm 2023 rơi vào trạng thái âm (-30.308 tỷ đồng) do gia tăng phải thu và tồn kho. Tuy nhiên, năm 2024 đã phục hồi mạnh mẽ (216.267 tỷ đồng).
  • Doanh nghiệp theo đuổi chiến lược đầu tư mở rộng với dòng tiền đầu tư (CFI) âm liên tục, chủ yếu cho mua sắm TSCĐ và gửi tiết kiệm.
  • Chính sách nợ linh hoạt: Giai đoạn đầu vay mạnh để tài trợ đầu tư, sau đó chuyển sang trả nợ gốc nhằm giảm đòn bẩy tài chính.

3.3 Quản lý Vốn lưu động & Rủi ro

  • Quản lý tồn kho và phải thu còn bất ổn, thể hiện qua biến động mạnh của các chỉ số liên quan. Điều này gây áp lực lên thanh khoản và hiệu quả sử dụng vốn.
  • Tỷ số thanh khoản hiện hành dao động, có thời điểm tăng vọt (năm 2020) nhưng nhìn chung vẫn ở mức an toàn.
  • Vòng quay tồn kho được cải thiện rõ rệt từ 1.6 vòng (2015) lên hơn 20 vòng (2024), phản ánh hiệu quả quản lý hàng tồn kho.

3.4 Xu hướng & Chiến lược Dài hạn

  • Doanh nghiệp đã trải qua nhiều giai đoạn phát triển: Ổn định (2015–2017) → Tăng trưởng (2018–2020) → Biến động (2021–2023) → Phục hồi (2024).
  • Dòng tiền tự do (FCF) cải thiện rõ rệt từ âm sang dương, cho thấy khả năng tạo tiền mặt thực tế ngày càng tốt.
  • ROA và ROS có xu hướng tăng, khẳng định hiệu quả sử dụng tài sản và kiểm soát chi phí được nâng cao.

3.5 Đề xuất Chiến lược Kinh tế

  • Tập trung ngân sách vào các kênh marketing hiệu quả như Email, Website và chiến dịch Search, Influencer.
  • Tiếp tục khai thác phân khúc Tech Enthusiasts do mang lại lợi nhuận cao và ổn định.
  • Cải thiện quản lý vốn lưu động, đặc biệt là kiểm soát công nợ và hàng tồn kho để giảm rủi ro thanh khoản.
  • Duy trì chính sách nợ cân bằng, ưu tiên trả nợ gốc để giảm phụ thuộc vào đòn bẩy tài chính.
  • Tối ưu hóa cơ cấu chi phí nhằm nâng cao biên lợi nhuận và đảm bảo tăng trưởng bền vững.

3.6 TỔNG QUAN KINH TẾ CHI TIẾT: PHÂN TÍCH HIỆU QUẢ & TÍNH BỀN VỮNG

3.6.1 Hiệu quả chiến lược marketing: tối ưu hóa ngân sách và tác động

  • Sự Tách Biệt Giữa Quy Mô và Hiệu Suất: Một trong những phát hiện quan trọng nhất là sự khác biệt rõ rệt giữa các kênh marketing về hiệu quả trên mỗi đồng vốn bỏ ra.
    • Kênh Hiệu Suất Cao (Email & Website): Đây là những “con ngựa thầm lặng”. Mặc dù có quy mô tiếp cận (Impressions) và số lượt tương tác (Clicks) không cao bằng, chúng lại có Conversion Rate và ROI trung bình cao nhất. Điều này chứng tỏ đối tượng tiếp cận qua các kênh này có chất lượng cao, sẵn sàng thực hiện hành động và mang lại lợi nhuận tốt hơn với chi phí thấp hơn. Về mặt kinh tế, đây là các kênh cần được ưu tiên để tối ưu tỷ suất lợi nhuận.
    • Kênh Quy Mô Lớn Nhưng Hiệu Suất Thấp (YouTube & Instagram): Ngược lại, các kênh này tạo ra lượng tương tác và hiển thị khổng lồ, chứng tỏ khả năng tiếp cận rộng. Tuy nhiên, tỷ lệ chuyển đổi và ROI lại thấp hơn hẳn. Điều này phản ánh một thực tế: chi phí để có được một khách hàng thực sự (Acquisition Cost) từ các kênh này là cao hơn. Về mặt kinh tế, chúng phù hợp hơn cho các mục tiêu xây dựng nhận thức thương hiệu (brand awareness) hơn là các chiến dịch performance marketing trực tiếp đòi hỏi tỷ lệ chuyển đổi cao.
  • Phân Khúc Khách Hàng Mang Lại Giá Trị Cao Nhất: Phân khúc “Tech Enthusiasts” (Những người đam mê Công nghệ) liên tục thể hiện là nhóm đối tượng có ROI và tổng doanh thu vượt trội. Điều này cho thấy:
    • Sức Mua và Giá Trị Giao Dịch Cao: Nhóm khách hàng này sẵn sàng chi trả cho các sản phẩm/dịch vụ công nghệ.
    • Hiệu Quả của Chiến Lược Tiếp Cận Chuyên Biệt: Các chiến dịch nhắm mục tiêu đến nhóm này có hiệu quả rõ rệt.
    • Hàm ý kinh tế: Doanh nghiệp nên ưu tiên phân bổ nguồn lực để khai thác sâu hơn phân khúc này, đồng thời nghiên cứu để phát triển các sản phẩm/dịch vụ tương tự nhằm thu hút các nhóm khách hàng có hồ sơ tương tự.
  • Tính Trung Lập của Nhân Khẩu Học: Một phát hiện thú vị là giới tính không ảnh hưởng đáng kể đến tỷ lệ chuyển đổi. Điều này ngụ ý rằng các thông điệp và sản phẩm mang tính chất phổ quát, và việc phân bổ ngân sách dựa trên giới tính có thể không phải là yếu tố tối ưu nhất. Thay vào đó, nên tập trung vào các yếu tố như sở thích, hành vi mua hàng, và phân khúc (Customer_Segment).

3.6.2 Sức khỏe tài chính doanh nghiệp: tăng trưởng ấn tượng đi kèm rủi ro tiềm ẩn

  • Tăng Trưởng Lợi Nhuận Mạnh Mẽ và Bền Vững: Việc lợi nhuận sau thuế tăng gấp ~3.5 lần trong 10 năm là một minh chứng rõ ràng cho khả năng mở rộng thị phần, kiểm soát chi phí hiệu quả và mô hình kinh doanh có lãi. Đường xu hướng tăng trưởng gần như liên tục, đặc biệt bật mạnh trong các năm gần đây (2022-2024), cho thấy doanh nghiệp đang trong giai đoạn phát triển rất tích cực.

  • Bài Toán Về Chất Lượng Lợi Nhuận và Dòng Tiền: Đây là điểm then chốt cần lưu ý.

    • Sự Khác Biệt Giữa Lợi Nhuận và Tiền Mặt: Năm 2023 là một ví dụ điển hình khi lợi nhuận sau thuế vẫn ở mức cao (223,191 tỷ) nhưng dòng tiền từ hoạt động kinh doanh (CFO) lại âm (-30,308 tỷ). Hiện tượng này, thường được gọi là “lợi nhuận giấy”, xảy ra khi doanh nghiệp ghi nhận doanh thu nhưng chưa thực sự thu được tiền (thể hiện qua việc các khoản phải thu tăng mạnh ~199,919 tỷ) hoặc đầu tư quá nhiều vào hàng tồn kho (~260,749 tỷ). Về mặt kinh tế, điều này báo hiệu rủi ro thanh khoản ngắn hạn và áp lực trong quản lý vốn lưu động. Doanh nghiệp có thể đang gặp khó khăn trong việc thu hồi công nợ hoặc dự trữ hàng tồn kho quá mức cần thiết.
  • Chiến Lược Đầu Tư Mở Rộng và Tái Cơ Cấu Tài Chính:

    • Đầu Tư Cho Tương Lai: Dòng tiền đầu tư (CFI) âm liên tục cho thấy doanh nghiệp không ngừng mở rộng năng lực sản xuất, công nghệ hoặc các dự án dài hạn thông qua mua sắm TSCĐ. Đây là dấu hiệu của một doanh nghiệp tự tin vào triển vọng tăng trưởng.
    • Quản Lý Nợ Chủ Động: Biến động mạnh của dòng tiền tài trợ (CFF) phản ánh một chiến lược nợ linh hoạt. Đặc biệt, việc trả nợ gốc (trung bình -183,895 tỷ) lớn hơn vay mới (trung bình 142,392 tỷ) trong nhiều năm cho thấy nỗ lực giảm đòn bẩy tài chính, cải thiện cơ cấu vốn và giảm rủi ro tài chính. Đây là một động thái tích cực về dài hạn.
  • Hiệu Quả Quản Trị và Các Tỷ Số Tài Chính Then Chốt:

    • Hiệu Suất Sử Dụng Tài Sản (ROA) và Biên Lợi Nhuận (ROS) có xu hướng cải thiện, cho thấy doanh nghiệp không chỉ tăng doanh thu mà còn sử dụng tài sản hiệu quả hơn và kiểm soát tốt chi phí.
    • Vòng Quay Tồn Kho được cải thiện vượt bậc là một tín hiệu rất tốt, chứng tỏ khả năng quản lý chuỗi cung ứng và tiêu thụ hàng hóa hiệu quả, từ đó giảm chi phí lưu kho và giải phóng vốn.
    • Tỷ Số Nợ giảm dần về cuối kỳ khẳng định cho chiến lược giảm sự phụ thuộc vào vay nợ, hướng tới sự tự chủ tài chính.

3.6.3 Kết luận tổng thể và hàm ý chiến lược

Về mặt kinh tế, doanh nghiệp được mô tả trong phân tích này đang ở trong một tình thế “vừa có cơ hội, vừa có thách thức”.

  • Mặt Tích Cực:
    • Mô hình kinh doanh có lãi và tăng trưởng ổn định.
    • Xác định được các kênh marketing và phân khúc khách hàng mang lại hiệu quả cao, tạo cơ sở để tối ưu hóa ngân sách.
    • Chiến lược đầu tư dài hạn bài bảnchính sách quản lý nợ chủ động giúp xây dựng nền tảng vững chắc cho tương lai.
  • Mặt Cần Quan Tâm:
    • Rủi ro từ quản lý vốn lưu động là điểm yếu lớn nhất. Áp lực từ các khoản phải thu và hàng tồn kho có thể khiến doanh nghiệp “làm ăn có lãi nhưng vẫn thiếu tiền mặt” để vận hành.
    • Sự không ổn định của dòng tiền hoạt động (CFO) cho thấy sức khỏe tài chính ngắn hạn chưa thực sự vững vàng, dễ bị tổn thương trước các biến động thị trường hoặc khủng hoảng.

Hàm ý Chiến lược: 1. Ngắn hạn: Cần ưu tiên hàng đầu cho việc cải thiện quản lý vốn lưu động - siết chặt chính sách tín dụng, đẩy mạnh thu hồi công nợ và tối ưu mức tồn kho. 2. Trung hạn: Tiếp tục tối ưu hóa cơ cấu chi phí marketing, chuyển dịch ngân sách từ các kênh có quy mô lớn nhưng hiệu suất thấp sang các kênh có tỷ lệ chuyển đổi và ROI cao hơn. 3. Dài hạn: Duy trì chiến lược đầu tư có chọn lọctiếp tục giảm dần đòn bẩy tài chính để nâng cao tính tự chủ và giảm thiểu rủi ro trong bối cảnh kinh tế bất ổn.

Tóm lại, doanh nghiệp sở hữu một lõi kinh doanh mạnh và triển vọng tăng trưởng tốt. Thành công trong tương lai sẽ phụ thuộc phần lớn vào khả năng chuyển hóa lợi nhuận kế toán thành dòng tiền mặt ổn địnhquản lý hiệu quả các rủi ro tài chính ngắn hạn.