Đâ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.
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)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] 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. 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] "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"
## '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" ...
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] 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] 0
## 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.
##
## Email Facebook Google Ads Instagram Website YouTube
## 33599 32819 33438 33392 33360 33392
## [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.
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
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)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)
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>
# 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
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.
Chuyển chuỗi sang kiểu Date để phân tích thời gian.
Loại bỏ ký tự tiền tệ và chuyển sang kiểu numeric để tính toán.
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
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10064 37810 56194 62587 83274 159456
## 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
## 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.
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
## 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.
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
## 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.
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
## 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ị.
##
## Thg1 Thg2 Thg3 Thg4 Thg5 Thg6 Thg7 Thg8 Thg9 Thg10 Thg11 Thg12
## 16988 15344 16988 16440 16988 16440 16988 16988 16440 16988 16440 16968
## 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] "Email" "Facebook" "Google Ads" "Instagram" "Website"
## [6] "YouTube"
## [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.
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).
## Avg_ROI Avg_CR
## 1 5.002438 0.08006965
## Var_AC SD_AC
## 1 18815334 4337.665
## 25% 50% 75%
## 325 550 775
## [1] "0.13"
## [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.
Chúng ta sẽ phân tích từng nhóm như sau:
## # 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.
## # 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.
## # 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.
## # 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.
## # 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ể.
## # 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.
## # 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.
## # 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.
## # 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.
## # 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.
## 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.
## 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.
## 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.
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.
## 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ế.
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.
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.
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ể.
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.
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).
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.
## # 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>
## 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 ...
## 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.
## [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"
| 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 |
## [1] 4
| 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 |
## [1] 0
Kết quả trả ra cho thấy dữ liệu không bị trùng lặp
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ị).
## 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.
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")| 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, VayMoi và TraNoGoc 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.
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")| 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.
## [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"
| 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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Ế")| Mean | Median | SD | Variance | Min | Max | Range |
|---|---|---|---|---|---|---|
| 185461493333 | 175740780878 | 79267830966 | 6283389026124499517640 | 92275349999 | 320862393082 | 228587043083 |
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")| Mean | Median | SD | Variance | Min | Max | Range |
|---|---|---|---|---|---|---|
| 133427627649 | 90931774710 | 114796209903 | 13178169807990847177864 | -30308428665 | 378603401448 | 408911830113 |
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)| 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 |
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")| 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 |
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")| 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 |
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ả"))| 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 |
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
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")| t_test_cfo | t_test_cfi | t_test_cff |
|---|---|---|
| 0.3105355 | 0.4531494 | 0.3092235 |
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")| 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 |
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")| 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 |
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")| 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 |
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")| Volatility_LNST | Volatility_CFO | Volatility_CFI | Volatility_CFF |
|---|---|---|---|
| 0.4274086 | 0.8603631 | -1.054016 | -20.76817 |
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")| Trend_LNST | Trend_CFO | Trend_CFI | Trend_CFF |
|---|---|---|---|
| 25306103573 | 12929647428 | 14466980504 | -22777562748 |
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")| 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 |
# 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.
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.
# 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.
# 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
# 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)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 Dataset và Bá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:
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 ý.
Chiến Lược Đầu Tư Mở Rộng và Tái Cơ Cấu Tài Chính:
Hiệu Quả Quản Trị và Các Tỷ Số Tài Chính Then Chốt:
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”.
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ọc và tiế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 định và quản lý hiệu quả các rủi ro tài chính ngắn hạn.