library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)
library(countrycode)
library(knitr)
library(kableExtra)
library(scales)
library(broom)
library(tidyverse)
library(viridis)
library(ggthemes)
library(treemapify)
library(ggpmisc)
library(patchwork)
library(ggridges)
library(ggalluvial)
library(showtext)
font_add_google("Roboto", "Roboto")
showtext_auto()
– tidyverse: Một siêu thư viện dùng để tải một bộ sưu tập các thư viện cốt lõi (dplyr, ggplot2, tidyr…) cho việc phân tích dữ liệu cùng một lúc.
– dplyr: Dùng để xử lý và thao tác dữ liệu (lọc hàng, chọn cột, tạo biến mới, sắp xếp, nhóm và tóm tắt). Đây là thư viện xử lý dữ liệu chính.
– ggplot2: Dùng để trực quan hóa dữ liệu và vẽ các loại biểu đồ một cách linh hoạt theo từng lớp (layers).
– tidyr: Dùng để dọn dẹp và tái cấu trúc layout của bảng dữ liệu, chủ yếu là chuyển đổi giữa dạng rộng và dài.
– lubridate: Dùng để làm việc với dữ liệu ngày tháng và thời gian một cách dễ dàng.
– countrycode: Dùng để chuyển đổi tên và mã quốc gia giữa các hệ thống mã hóa khác nhau (ví dụ: “Vietnam” sang “VNM”).
– knitr: Là lệnh chạy trên R Markdown, dùng để chạy code R và kết quả của nó (văn bản, bảng, biểu đồ) thành một báo cáo hoàn chỉnh (HTML, PDF, Word). Hàm kable() của nó dùng để tạo bảng biểu đẹp.
– kableExtra: Dùng để nâng cấp các bảng biểu, làm cho chúng đẹp hơn, chuyên nghiệp hơn và có nhiều chức năng hơn.
– scales: Dùng để định dạng lại các nhãn trên trục và chú giải của biểu đồ ggplot2 cho dễ đọc hơn (ví dụ: định dạng phần trăm, nghìn tỷ).
– broom: Dùng để xử lý kết quả đầu ra của các mô hình thống kê và chuyển chúng thành các bảng dữ liệu sạch sẽ, dễ sử dụng.
– viridis: Cung cấp các bảng màu đẹp mắt, khoa học và thân thiện.
– ggthemes: Cung cấp một bộ sưu tập các chủ đề được thiết kế sẵn cho ggplot2, mô phỏng phong cách của các ấn phẩm nổi tiếng.
– treemapify: Dùng để vẽ biểu đồ Treemap, hiệu quả để thể hiện cơ cấu tỷ trọng dữ liệu phân cấp.
– ggpmisc: Dùng để thêm các chú thích thống kê vào biểu đồ ggplot2 một cách dễ dàng.
– patchwork: Dùng để ghép nối nhiều biểu đồ ggplot lại với nhau thành một bố cục phức tạp một cách cực kỳ đơn giản (sử dụng các toán tử như +, /, |).
– ggridges: Dùng để vẽ biểu đồ phân phối gối lên nhau, rất tốt để so sánh sự phân bố của một biến số qua nhiều nhóm.
– ggalluvial: Dùng để vẽ biểu đồ luồng và biểu đồ Sankey, chuyên dùng để trực quan hóa các mối quan hệ và luồng di chuyển giữa nhiều biến phân loại.
– showtext: Dùng để xử lý và hiển thị các font chữ tùy chỉnh (bao gồm cả font tiếng Việt) bên trong các biểu đồ R, đặc biệt hữu ích khi xuất file PDF.
– Trong bối cảnh ngành khách sạn ngày càng cạnh tranh, việc ra quyết định dựa trên dữ liệu đã trở thành yếu tố sống còn để tối ưu hóa vận hành, tối đa hóa doanh thu và nâng cao trải nghiệm khách hàng. Để phục vụ cho mục đích nghiên cứu và phân tích các yếu tố ảnh hưởng đến hành vi đặt phòng, bài luận này sử dụng bộ dữ liệu công khai có tên “Hotel Booking Demand”.
– Bộ dữ liệu này được cung cấp bởi Nuno Antonio, Ana Almeida, và Luis Nunes trong bài báo khoa học “Hotel booking demand datasets” đăng trên tạp chí Data in Brief và đã được phổ biến rộng rãi trên các nền tảng khoa học dữ liệu như Kaggle và TidyTuesday. Dữ liệu ghi lại các giao dịch đặt phòng thực tế tại hai khách sạn: một khách sạn nghỉ dưỡng (Resort Hotel) và một khách sạn thành phố (City Hotel) đều tọa lạc tại Bồ Đào Nha.
hotels_raw <- read.csv("D:/R/hotel_bookings.csv/hotel_bookings.csv")
hotels_focused <- hotels_raw %>%
select(hotel, is_canceled, lead_time, adr, is_repeated_guest)
glimpse(hotels_focused)
## Rows: 119,390
## Columns: 5
## $ hotel <chr> "Resort Hotel", "Resort Hotel", "Resort Hotel", "Res…
## $ is_canceled <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0…
## $ lead_time <int> 342, 737, 7, 13, 14, 14, 0, 9, 85, 75, 23, 35, 68, 1…
## $ adr <dbl> 0.00, 0.00, 75.00, 75.00, 98.00, 98.00, 107.00, 103.…
## $ is_repeated_guest <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
Giải thích kỹ thuật:
– (1): Nó liệt kê số dòng, số cột sau đó là tên, kiểu dữ liệu (
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là bước kiểm tra kiểu dữ liệu ban đầu. Nó xác nhận hotel là biến phân loại dạng chữ, còn các biến khác là biến số, phù hợp cho việc tính toán.
– Kinh tế: Cho cái nhìn đầu tiên về các biến sẽ được phân tích, xác nhận sự hiện diện của các yếu tố quan trọng như loại khách sạn, giá phòng và hành vi khách hàng.
head(hotels_focused)
## hotel is_canceled lead_time adr is_repeated_guest
## 1 Resort Hotel 0 342 0 0
## 2 Resort Hotel 0 737 0 0
## 3 Resort Hotel 0 7 75 0
## 4 Resort Hotel 0 13 75 0
## 5 Resort Hotel 0 14 98 0
## 6 Resort Hotel 0 14 98 0
Giải thích kỹ thuật:
– (1): Là một hàm cơ bản của R dùng để trích xuất 6 dòng đầu tiên của một bảng dữ liệu giúp người dùng nhìn lướt qua dữ liệu.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Cung cấp một ví dụ trực quan về cấu trúc dữ liệu, cho thấy mỗi hàng là một quan sát và mỗi cột là một biến.
– Kinh tế: Giúp hình dung về các giá trị thực tế, ví dụ adr = 0 hoặc lead_time có giá trị lớn, gợi ý về các điểm dữ liệu cần được chú ý hoặc làm sạch sau này.
summary(hotels_focused)
## hotel is_canceled lead_time adr
## Length:119390 Min. :0.0000 Min. : 0 Min. : -6.38
## Class :character 1st Qu.:0.0000 1st Qu.: 18 1st Qu.: 69.29
## Mode :character Median :0.0000 Median : 69 Median : 94.58
## Mean :0.3704 Mean :104 Mean : 101.83
## 3rd Qu.:1.0000 3rd Qu.:160 3rd Qu.: 126.00
## Max. :1.0000 Max. :737 Max. :5400.00
## is_repeated_guest
## Min. :0.00000
## 1st Qu.:0.00000
## Median :0.00000
## Mean :0.03191
## 3rd Qu.:0.00000
## Max. :1.00000
Giải thích kỹ thuật:
– (1): Là một hàm đa hình của R. Khi áp dụng lên một data frame, nó sẽ tự động tạo ra các thống kê tóm tắt phù hợp cho từng cột: tần suất cho biến character và các đại lượng thống kê (min, max, mean, median, quartiles) cho biến numeric.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là bước phân tích dữ liệu Khám phá cốt lõi, giúp hiểu về khuynh hướng trung tâm và độ phân tán của từng biến.
– Kinh tế: Tỷ lệ hủy phòng trung bình là 37% (từ mean của is_canceled). Có sự chênh lệch lớn giữa mean và median của lead_time, cho thấy phân phối lệch phải (nhiều người đặt gần ngày nhưng một số ít đặt rất xa). Phát hiện vấn đề dữ liệu: adr có giá trị âm, điều này là vô lý và cần được xử lý.
colSums(
is.na(hotels_focused))
## hotel is_canceled lead_time adr
## 0 0 0 0
## is_repeated_guest
## 0
Giải thích kỹ thuật:
– (1): Tính tổng số lượng TRUE theo từng cột, cho ra số lượng giá trị bị thiếu của mỗi biến.
– (2): Tạo ra một ma trận logic (TRUE/FALSE) có cùng kích thước với data frame, đánh dấu TRUE ở những ô có giá trị NA (bị thiếu).
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một bước kiểm tra tính toàn vẹn của dữ liệu.
– Kinh tế: Kết quả 0 cho tất cả các cột là một tin tốt, có nghĩa là 5 biến được chọn rất sạch và không yêu cầu các kỹ thuật xử lý dữ liệu bị thiếu phức tạp.
hotels_clean <- hotels_focused %>%
filter(adr >= 0 & adr <= 1000)
adr_bi_loc <- hotels_focused %>%
filter(adr < 0 | adr > 1000)
kable(adr_bi_loc)
| hotel | is_canceled | lead_time | adr | is_repeated_guest |
|---|---|---|---|---|
| Resort Hotel | 0 | 195 | -6.38 | 1 |
| City Hotel | 1 | 35 | 5400.00 | 0 |
Giải thích kỹ thuật:
– (2) và (4): Lọc những hàng thỏa mãn điều kiện adr >= 0 và adr <= 1000 đồng thời xem xét các dữ liệu data frame có adr < 0 và adr > 1000.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một bước làm sạch dữ liệu cơ bản, loại bỏ các giá trị ngoại lai hoặc các điểm dữ liệu không hợp lệ.
– Kinh tế: Đảm bảo tính chính xác cho các phân tích sau này. Giá phòng không thể âm hoặc giá không thể biến động cao bất thường, việc loại bỏ các giá trị này giúp cho các tính toán về doanh thu và giá trung bình trở nên đáng tin cậy.
hotel_summary <- hotels_clean %>%
group_by(hotel) %>%
summarise(
so_luong_dat = n(),
ty_le_huy = mean(is_canceled)
)
kable(hotel_summary)
| hotel | so_luong_dat | ty_le_huy |
|---|---|---|
| City Hotel | 79329 | 0.4172623 |
| Resort Hotel | 40059 | 0.2776405 |
Giải thích kỹ thuật:
– (2): Nhóm tất cả các hàng lại thành hai nhóm con: “City Hotel” và “Resort Hotel”.
– (3): Thực hiện các phép tính trên mỗi nhóm đã tạo.
– (4): Đếm số lượng hàng trong mỗi nhóm.
– (5): Tính giá trị trung bình của cột is_canceled (với 0 và 1, giá trị trung bình chính là tỷ lệ của các giá trị 1).
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một phép tổng hợp có điều kiện, tóm tắt dữ liệu để so sánh giữa các nhóm.
– Kinh tế: Phát hiện một thông tin quan trọng: City Hotel có rủi ro hủy phòng cao hơn (~42%) so với Resort Hotel (~28%). Điều này có thể là do đối tượng khách hàng hoặc mục đích chuyến đi khác nhau.
loyalty_summary <- hotels_clean %>%
group_by(is_repeated_guest) %>%
summarise(
ty_le_huy = mean(is_canceled),
gia_trung_binh = mean(adr),
dat_truoc_tb = mean(lead_time)
)
kable(loyalty_summary)
| is_repeated_guest | ty_le_huy | gia_trung_binh | dat_truoc_tb |
|---|---|---|---|
| 0 | 0.3778455 | 103.01766 | 106.42584 |
| 1 | 0.1449199 | 64.46459 | 30.74324 |
Giải thích kỹ thuật:
– (2): Nhóm tất cả các hàng lại thành hai nhóm con: “0” và “1”.
– (3): Thực hiện các phép tính trên mỗi nhóm đã tạo.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh các đặc điểm trung bình giữa hai nhóm khách hàng.
– Kinh tế: Xác nhận một quy luật kinh doanh phổ biến rằng khách hàng trung thành có giá trị hơn. Họ có tỷ lệ hủy thấp hơn, đặt phòng gần ngày hơn và có thể chấp nhận mức giá khác so với khách mới.
count_by_hotel <- hotels_clean %>%
count(hotel, sort = TRUE)
kable(count_by_hotel)
| hotel | n |
|---|---|
| City Hotel | 79329 |
| Resort Hotel | 40059 |
Giải thích kỹ thuật:
– (2): Nó đếm tần suất xuất hiện của mỗi loại khách sạn và tự động sắp xếp kết quả.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một phép tính tần suất đơn giản.
– Kinh tế: Cho biết cơ cấu của mẫu dữ liệu. City Hotel chiếm số lượng lớn hơn trong tập dữ liệu, điều này có nghĩa là các kết quả phân tích tổng thể có thể bị lệch bởi hành vi của khách hàng tại City Hotel.
count_by_cancellation <- hotels_clean %>%
count(is_canceled)
kable(count_by_cancellation)
| is_canceled | n |
|---|---|
| 0 | 75165 |
| 1 | 44223 |
Giải thích kỹ thuật:
– (2): Để đếm tần suất của các giá trị 0 và 1 trong cột is_canceled.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán tần suất của biến mục tiêu.
– Kinh tế: Cung cấp con số tuyệt đối về số lượt hủy và không hủy. Nó cho phép tính toán tỷ lệ hủy chung của toàn bộ dữ liệu, là một con số tham chiếu cơ sở quan trọng cho mọi phân tích sau này.
top_5_adr <- hotels_clean %>%
arrange(desc(adr)) %>%
head(5)
kable(top_5_adr)
| hotel | is_canceled | lead_time | adr | is_repeated_guest |
|---|---|---|---|---|
| City Hotel | 0 | 0 | 510.0 | 0 |
| Resort Hotel | 0 | 1 | 508.0 | 1 |
| City Hotel | 0 | 81 | 451.5 | 0 |
| Resort Hotel | 1 | 378 | 450.0 | 0 |
| Resort Hotel | 1 | 59 | 437.0 | 0 |
Giải thích kỹ thuật:
– (2): Sắp xếp toàn bộ data frame theo cột adr theo thứ tự giảm dần.
– (3): Trích xuất 5 dòng đầu tiên sau khi đã sắp xếp.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một phương pháp để xác định các giá trị ngoại lai cực đoan trong dữ liệu.
– Kinh tế: Giúp phát hiện các giao dịch bất thường. Việc nhận diện các điểm dữ liệu này rất quan trọng vì chúng có thể làm sai lệch các kết quả thống kê như giá trị trung bình nếu không được xử lý cẩn thận.
hotels_processed <- hotels_clean %>%
mutate(
lead_time_group = case_when(
lead_time <= 7 ~ "Đặt gần (<= 1 tuần)",
lead_time <= 180 ~ "Đặt trước vừa phải (1 tuần - 6 tháng)",
TRUE ~ "Đặt rất sớm (> 6 tháng)"
)
)
kable(head(hotels_processed, 6)) %>%
kable_styling(latex_options = "scale_down")
| hotel | is_canceled | lead_time | adr | is_repeated_guest | lead_time_group |
|---|---|---|---|---|---|
| Resort Hotel | 0 | 342 | 0 | 0 | Đặt rất sớm (> 6 tháng) |
| Resort Hotel | 0 | 737 | 0 | 0 | Đặt rất sớm (> 6 tháng) |
| Resort Hotel | 0 | 7 | 75 | 0 | Đặt gần (<= 1 tuần) |
| Resort Hotel | 0 | 13 | 75 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) |
| Resort Hotel | 0 | 14 | 98 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) |
| Resort Hotel | 0 | 14 | 98 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) |
Giải thích kỹ thuật:
– (2): Dùng để tạo ra một cột mới hoặc chỉnh sửa một cột hiện có.
– (3): Là một hàm điều kiện mạnh mẽ, hoạt động như một chuỗi if-else if-else. Nó kiểm tra từng điều kiện từ trên xuống dưới:
(4): Nếu lead_time nhỏ hơn hoặc bằng 7, gán chuỗi đặt gần.
(5): Nếu điều kiện trên sai, nó sẽ kiểm tra điều kiện này.
(6): TRUE luôn đúng, hoạt động như mệnh đề else cuối cùng, bắt tất cả các trường hợp còn lại (những lượt đặt có lead_time > 180).
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một kỹ thuật phân loại hay rời rạc hóa. Biến một biến số liên tục (lead_time) thành một biến phân loại có thứ tự với 3 cấp độ. Việc này giúp đơn giản hóa dữ liệu, dễ dàng hơn cho việc so sánh và trực quan hóa giữa các nhóm.
– Kinh tế: Đặt gần thường là nhóm khách đi công tác hoặc khách du lịch tự phát. Họ có nhu cầu chắc chắn và ít rủi ro hủy phòng nhưng có thể nhạy cảm với giá phút chót. Đặt trước vừa phải là phân khúc khách du lịch phổ thông, bao gồm các cặp đôi, gia đình lên kế hoạch cho kỳ nghỉ. Đặt rất sớm thường là nhóm khách lên kế hoạch từ rất xa cho các kỳ nghỉ lớn, sự kiện đặc biệt hoặc để săn các gói ưu đãi. Nhóm này giúp khách sạn có cái nhìn sớm về công suất phòng trong tương lai nhưng cũng tiềm ẩn rủi ro hủy phòng cao nhất do kế hoạch có thể thay đổi.
hotels_processed <- hotels_processed %>%
mutate(
price_tier = cut(
adr,
breaks = c(0, 75, 150, Inf),
labels = c("Giá thấp (<75)", "Giá trung bình (75-150)", "Giá cao (>150)"),
include.lowest = TRUE,
right = FALSE
)
)
kable(head(hotels_processed, 6)) %>%
kable_styling(latex_options = "scale_down", font_size = 7)
| hotel | is_canceled | lead_time | adr | is_repeated_guest | lead_time_group | price_tier |
|---|---|---|---|---|---|---|
| Resort Hotel | 0 | 342 | 0 | 0 | Đặt rất sớm (> 6 tháng) | Giá thấp (<75) |
| Resort Hotel | 0 | 737 | 0 | 0 | Đặt rất sớm (> 6 tháng) | Giá thấp (<75) |
| Resort Hotel | 0 | 7 | 75 | 0 | Đặt gần (<= 1 tuần) | Giá trung bình (75-150) |
| Resort Hotel | 0 | 13 | 75 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) | Giá trung bình (75-150) |
| Resort Hotel | 0 | 14 | 98 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) | Giá trung bình (75-150) |
| Resort Hotel | 0 | 14 | 98 | 0 | Đặt trước vừa phải (1 tuần - 6 tháng) | Giá trung bình (75-150) |
Giải thích kỹ thuật:
– (3): Là một hàm cơ bản của R, được thiết kế chuyên dụng để chia một biến số liên tục thành các khoảng.
– (5): Định nghĩa các điểm ngắt. Nó sẽ tạo ra các khoảng: [0, 75), [75, 150), [150, ∞).
– (6): Gán tên cho từng khoảng tương ứng.
– (7): Đảm bảo rằng giá trị nhỏ nhất (số 0) được bao gồm trong khoảng đầu tiên.
– (8): Quy định rằng khoảng được tính là [a, b) (bao gồm a, không bao gồm b), thay vì mặc định là (a, b].
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một kỹ thuật phân loại. cut() phù hợp khi các điểm ngắt đã được xác định trước.
– Kinh tế: Giá thấp thường là phân khúc khách hàng nhạy cảm về giá, bao gồm khách du lịch trong thời gian ngắn hoặc những người đi công tác có ngân sách eo hẹp. Giá trung bình là phân khúc thị trường đại chúng, bao gồm phần lớn khách du lịch, các gia đình và khách công tác. Đây thường là phân khúc lớn và quan trọng nhất đối với doanh thu của khách sạn. Giá cao là phân khúc khách hàng cao cấp, những người sẵn sàng chi trả nhiều hơn cho các phòng hạng sang, dịch vụ vượt trội, vị trí đắc địa và trải nghiệm độc đáo.
cancellation_by_lead_time <- hotels_processed %>%
group_by(lead_time_group) %>%
summarise(
so_luong_dat = n(),
ty_le_huy = mean(is_canceled)
)
kable(cancellation_by_lead_time)
| lead_time_group | so_luong_dat | ty_le_huy |
|---|---|---|
| Đặt gần (<= 1 tuần) | 19746 | 0.0963233 |
| Đặt rất sớm (> 6 tháng) | 24691 | 0.5701268 |
| Đặt trước vừa phải (1 tuần - 6 tháng) | 74951 | 0.3768329 |
Giải thích kỹ thuật:
– (2): Gom tất cả các hàng có cùng giá trị trong lead_time_group lại với nhau, chuẩn bị cho các phép tính theo nhóm.
– (3): Thực hiện các phép tính tổng hợp trên mỗi nhóm đã tạo.
– (4): Đếm số lượng hàng trong mỗi nhóm.
– (5): Vì is_canceled là 0 (không hủy) và 1 (hủy), việc tính trung bình cộng của nó chính là tính tỷ lệ của các giá trị 1, tức là tỷ lệ hủy phòng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một phép tổng hợp có điều kiện. Bằng việc đang tính toán một đại lượng thống kê cho từng cấp độ của một biến phân loại.
– Kinh tế: Tỷ lệ hủy tăng vọt theo thời gian đặt trước. Nhóm đặt gần chỉ có tỷ lệ hủy 9.6%, trong khi nhóm đặt rất sớm có tỷ lệ hủy lên tới 57%. Đây là một quy luật kinh tế quan trọng. Khách hàng đặt phòng từ rất sớm thường chưa chắc chắn về kế hoạch của mình; họ đặt để giữ chỗ và có nhiều khả năng thay đổi. Ngược lại, khách đặt gần ngày đi thường có nhu cầu chắc chắn và ít khả năng thay đổi.
adr_by_lead_time <- hotels_processed %>%
group_by(lead_time_group) %>%
summarise(
gia_trung_binh = mean(adr)
)
kable(adr_by_lead_time)
| lead_time_group | gia_trung_binh |
|---|---|
| Đặt gần (<= 1 tuần) | 89.97078 |
| Đặt rất sớm (> 6 tháng) | 93.00434 |
| Đặt trước vừa phải (1 tuần - 6 tháng) | 107.79430 |
Giải thích kỹ thuật:
– (2): Gom tất cả các hàng có cùng giá trị trong lead_time_group lại với nhau, chuẩn bị cho các phép tính theo nhóm.
– (3): Thực hiện các phép tính tổng hợp trên mỗi nhóm đã tạo.
– (4): Tính giá phòng trung bình cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán giá trị trung bình có điều kiện.
– Kinh tế: Nhóm đặt trước vừa phải có giá trung bình cao nhất (107.79). Đây là tổng giá trung bình của việc đặt phòng, nơi tập trung phần lớn khách du lịch có kế hoạch. Khách sạn nhận thấy nhu cầu cao nhất trong khoảng thời gian này và do đó áp dụng mức giá cao nhất để tối đa hóa doanh thu. Cả nhóm đặt gần (89.97) và đặt rất sớm (93.00) đều có mức giá thấp hơn đáng kể. Đặt gần có mức giá thấp hơn có thể là một chiến lược để thu hút khách vãng lai và lấp đầy những phòng còn trống vào phút chót. Đặt rất sớm có mức giá thấp hơn có thể là một hình thức ưu đãi để khuyến khích khách hàng cam kết sớm giúp khách sạn có được lượng đặt phòng nền tảng và dự báo tốt hơn.
hotels_processed <- hotels_processed %>%
mutate(
guest_profile = paste0(
ifelse(is_repeated_guest == 1, "Khách quay lại", "Khách mới"),
" @ ",
hotel
)
)
count(hotels_processed, guest_profile)
## guest_profile n
## 1 Khách mới @ City Hotel 77297
## 2 Khách mới @ Resort Hotel 38282
## 3 Khách quay lại @ City Hotel 2032
## 4 Khách quay lại @ Resort Hotel 1777
Giải thích kỹ thuật:
– (3): Là hàm nối chuỗi ký tự. Nó ghép các chuỗi lại với nhau mà không có dấu cách. Ví dụ: “Khách mới” + ” @ ” + “City Hotel” sẽ thành “Khách mới @ City Hotel”.
– (4): Hàm điều kiện để tạo ra một nhãn văn bản dựa trên giá trị của is_repeated_guest.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một kỹ thuật tạo biến tương tác dưới dạng phân loại. Từ việc đã tạo ra một biến mới (guest_profile) thể hiện sự kết hợp của hai biến gốc (is_repeated_guest và hotel).
– Kinh tế: Số lượng khách mới (77297 ở City Hotel và 38282 ở Resort Hotel) chiếm phần lớn áp đảo so với khách quay lại (2032 ở City Hotel và 1777 ở Resort Hotel). Điều này cho thấy mô hình kinh doanh của cả hai khách sạn phụ thuộc rất lớn vào việc liên tục thu hút khách hàng mới. Tỷ lệ khách hàng trung thành là rất thấp.
cancellation_by_profile <- hotels_processed %>%
group_by(guest_profile) %>%
summarise(
ty_le_huy = mean(is_canceled)
) %>%
arrange(desc(ty_le_huy))
kable(cancellation_by_profile)
| guest_profile | ty_le_huy |
|---|---|
| Khách mới @ City Hotel | 0.4225261 |
| Khách mới @ Resort Hotel | 0.2876287 |
| Khách quay lại @ City Hotel | 0.2170276 |
| Khách quay lại @ Resort Hotel | 0.0624648 |
Giải thích kỹ thuật:
– (2): Gom tất cả các hàng có cùng giá trị trong guest_profile lại với nhau, chuẩn bị cho các phép tính theo nhóm.
– (3): Thực hiện các phép tính tổng hợp trên mỗi nhóm đã tạo.
– (4): Tính tỷ lệ hủy trung bình cho mỗi nhóm.
– (6): Sắp xếp kết quả theo tỷ lệ hủy giảm dần giúp nhanh chóng xác định nhóm rủi ro nhất.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán các tỷ lệ có điều kiện trên một biến tương tác, cho phép phân tích sâu hơn về mối quan hệ giữa các biến.
– Kinh tế: Khách mới ở City Hotel là phân khúc rủi ro cao nhất. Nhóm này có tỷ lệ hủy phòng cao nhất, lên tới 42.25%. Khách hàng lần đầu đến với City Hotel có khả năng hủy phòng rất cao. Điều này có thể do họ đặt qua các kênh linh hoạt, đặt nhiều lựa chọn hoặc nhu cầu công tác của họ dễ thay đổi. Khách quay lại ở Resort Hotel là phân khúc tốt nhất. Nhóm này có tỷ lệ hủy phòng thấp nhất một cách đáng kinh ngạc, chỉ 6.2%. Những khách hàng đã từng trải nghiệm và quyết định quay lại Resort Hotel gần như chắc chắn sẽ đến, mang lại nguồn doanh thu ổn định và dễ dự đoán.
hotels_processed <- hotels_processed %>%
mutate(
cancellation_risk = case_when(
hotel == "City Hotel" & lead_time > 180 ~ "Rủi ro cao",
hotel == "Resort Hotel" & lead_time > 240 ~ "Rủi ro cao",
lead_time <= 7 ~ "Rủi ro thấp",
TRUE ~ "Rủi ro trung bình"
)
)
count(hotels_processed, cancellation_risk)
## cancellation_risk n
## 1 Rủi ro cao 20821
## 2 Rủi ro thấp 19746
## 3 Rủi ro trung bình 78821
Giải thích kỹ thuật:
– (3): Được sử dụng với các điều kiện kết hợp. Dấu & có nghĩa là “và”.
– (4): Điều kiện này kiểm tra cả hai biến hotel và lead_time cùng một lúc.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là một ví dụ về việc xây dựng một biến phân loại mới dựa trên một bộ quy tắc. Chúng ta đang mã hóa kiến thức nghiệp vụ thành một biến mới.
– Kinh tế: Nhóm rủi ro trung bình có số lượng lớn nhất với 78821 lượt đặt. Đây là nhóm khách hàng phổ thông, đặt phòng trong khoảng thời gian thông thường. Việc quản lý tốt rủi ro của nhóm này sẽ có tác động lớn nhất đến kết quả kinh doanh chung. Số lượng của nhóm rủi ro cao (20821) và rủi ro thấp (19746) là tương đương nhau. Điều này cho thấy có một sự cân bằng giữa hai nhóm khách hàng có hành vi trái ngược: nhóm đặt rất sớm (rủi ro cao) và nhóm đặt rất gần ngày (rủi ro thấp).
adr_by_hotel <- hotels_processed %>%
group_by(hotel) %>%
summarise(
gia_trung_binh = mean(adr)
)
kable(adr_by_hotel)
| hotel | gia_trung_binh |
|---|---|
| City Hotel | 105.23772 |
| Resort Hotel | 94.95546 |
Giải thích kỹ thuật:
– (2): Gom tất cả các hàng có cùng giá trị trong hotel lại với nhau, chuẩn bị cho các phép tính theo nhóm.
– (3): Thực hiện các phép tính tổng hợp trên mỗi nhóm đã tạo.
– (4): Tính giá phòng trung bình cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Thực hiện phép tính trung bình nhóm cơ bản, là bước đầu tiên trước khi thực hiện các kiểm định thống kê khác để xem sự khác biệt hay không.
– Kinh tế: Giá trung bình của City Hotel (105.2) cao hơn so với Resort Hotel (94.9). Điều này là hợp lý và phản ánh đặc thù thị trường. Khách sạn trong thành phố thường phục vụ khách công tác hoặc khách du lịch có nhu cầu di chuyển cao, họ thường sẵn sàng chi trả cao hơn cho sự tiện lợi về vị trí.
overall_cancel_rate <- mean(hotels_processed$is_canceled)
hotels_processed <- hotels_processed %>%
mutate(
potential_value = adr * (1 - overall_cancel_rate)
)
select(hotels_processed, adr, potential_value) %>% head()
## adr potential_value
## 1 0 0.00000
## 2 0 0.00000
## 3 75 47.21894
## 4 75 47.21894
## 5 98 61.69942
## 6 98 61.69942
Giải thích kỹ thuật:
– (1): Tạo một biến mới bằng cách kết hợp một biến ở cấp độ hàng (adr) với một giá trị tổng hợp ở cấp độ toàn bộ dữ liệu (overall_cancel_rate).
– (4): Công thức tính giá trị kỳ vọng đơn giản. Nó lấy giá trị danh nghĩa (adr) nhân với xác suất nó không bị hủy (1 - ty_le_huy).
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một biến dự báo đơn giản. Chúng ta đang ước tính một giá trị trong tương lai dựa trên thông tin hiện có.
– Kinh tế: Một lượt đặt có adr là 75 không có nghĩa là khách sạn chắc chắn sẽ thu được 75. Sau khi điều chỉnh theo tỷ lệ hủy chung, giá trị kỳ vọng thực sự của lượt đặt đó chỉ còn khoảng 47.2. Chỉ số này giúp ban quản lý có một cái nhìn thận trọng và thực tế hơn về doanh thu trong tương lai. Nó không chỉ là có thể kiếm được bao nhiêu mà là có khả năng kiếm được bao nhiêu.
multi_dim_summary <- hotels_processed %>%
group_by(hotel, price_tier) %>%
summarise(
so_luong_dat = n(),
gia_trung_binh = mean(adr),
ty_le_huy = mean(is_canceled),
.groups = "drop"
)
kable(multi_dim_summary)
| hotel | price_tier | so_luong_dat | gia_trung_binh | ty_le_huy |
|---|---|---|---|---|
| City Hotel | Giá thấp (<75) | 15099 | 58.17681 | 0.4587059 |
| City Hotel | Giá trung bình (75-150) | 54702 | 105.17558 | 0.4102409 |
| City Hotel | Giá cao (>150) | 9528 | 180.17178 | 0.3918976 |
| Resort Hotel | Giá thấp (<75) | 19707 | 49.25527 | 0.2378343 |
| Resort Hotel | Giá trung bình (75-150) | 12994 | 103.54545 | 0.2896722 |
| Resort Hotel | Giá cao (>150) | 7358 | 202.18505 | 0.3630063 |
Giải thích kỹ thuật:
– (2): Điểm mấu chốt ở đây là group_by có thể nhận nhiều hơn một biến. Nó sẽ tạo ra các nhóm con cho mọi tổ hợp duy nhất của các biến được cung cấp (ví dụ: City Hotel - Giá thấp, Resort Hotel - Giá thấp,…).
– (7): Là một tùy chọn trong summarise, khuyên dùng để hủy cấu trúc nhóm sau khi đã tính toán xong, tránh các lỗi không mong muốn ở các bước sau.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là kỹ thuật tạo bảng chéo hoặc bảng contingecy cho các đại lượng thống kê. Nó cho phép phân tích mối quan hệ và tương tác giữa hai hoặc nhiều biến phân loại.
– Kinh tế: Phân khúc City Hotel - Giá trung bình có so_luong_dat cao nhất một cách áp đảo (54702 lượt). Mọi chiến lược nhằm cải thiện trải nghiệm hoặc giảm tỷ lệ hủy của nhóm này sẽ có tác động lớn nhất đến kết quả kinh doanh chung. Phân khúc Resort Hotel - Giá cao có gia_trung_binh cao nhất toàn bảng (202.18). Mặc dù Resort Hotel có giá trung bình chung thấp hơn nhưng ở phân khúc cao cấp nó lại có khả năng định giá cao hơn cả City Hotel. Điều này cho thấy khách hàng sẵn sàng chi trả rất cao cho các trải nghiệm nghỉ dưỡng cao cấp.
lead_time_vs_cancellation <- hotels_processed %>%
group_by(is_canceled) %>%
summarise(lead_time_trung_binh = mean(lead_time))
kable(lead_time_vs_cancellation)
| is_canceled | lead_time_trung_binh |
|---|---|
| 0 | 79.98316 |
| 1 | 144.85130 |
Giải thích kỹ thuật:
– (2): Chia toàn bộ dữ liệu thành hai nhóm: nhóm có is_canceled = 0 (không hủy) và nhóm có is_canceled = 1 (đã hủy).
– (3): Tính giá trị trung bình của lead_time cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán giá trị trung bình có điều kiện để so sánh đặc điểm của hai nhóm.
– Kinh tế: Nhóm khách đã hủy có thời gian đặt phòng trung bình là 144.85 ngày, gần gấp đôi so với nhóm không hủy chỉ là 79.98 ngày. Đây là một bằng chứng rất mạnh mẽ cho thấy lead_time là một chỉ báo rủi ro quan trọng. Khách hàng đặt phòng càng xa ngày đến, xác suất họ hủy phòng càng cao.
adr_vs_cancellation <- hotels_processed %>%
group_by(is_canceled) %>%
summarise(adr_trung_binh = mean(adr))
kable(adr_vs_cancellation)
| is_canceled | adr_trung_binh |
|---|---|
| 0 | 99.98911 |
| 1 | 104.84460 |
Giải thích kỹ thuật:
– (2): Chia toàn bộ dữ liệu thành hai nhóm: nhóm có is_canceled = 0 (không hủy) và nhóm có is_canceled = 1 (đã hủy).
– (3): Tính giá trị trung bình của adr cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh giá trị trung bình của một biến số giữa hai nhóm.
– Kinh tế: Nhóm khách đã hủy có giá phòng trung bình là 104.8, cao hơn một chút so với nhóm không hủy là 99.9. Mặc dù sự chênh lệch không quá lớn nhưng nó cho thấy một xu hướng rõ ràng rằng những lượt đặt phòng có giá trị cao hơn có một chút xu hướng bị hủy nhiều hơn.
cancellation_by_hotel_count <- hotels_processed %>%
count(hotel, is_canceled)
kable(cancellation_by_hotel_count)
| hotel | is_canceled | n |
|---|---|---|
| City Hotel | 0 | 46228 |
| City Hotel | 1 | 33101 |
| Resort Hotel | 0 | 28937 |
| Resort Hotel | 1 | 11122 |
Giải thích kỹ thuật:
– (2): Nó thực hiện hai việc cùng lúc: nhóm dữ liệu theo tất cả các tổ hợp của hotel và is_canceled (ví dụ: City Hotel - Hủy, City Hotel - Không hủy…), sau đó đếm số lượng hàng trong mỗi tổ hợp.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một bảng tần suất chéo, cho thấy tần suất phân bố của các quan sát theo hai biến phân loại.
– Kinh tế: Số lượt hủy tại City Hotel là 33101, cao gần gấp ba lần so với số lượt hủy tại Resort Hotel (11122). Mặc dù City Hotel có tổng số lượt đặt phòng nhiều hơn nhưng quy mô hủy phòng tuyệt đối của nó lớn hơn rất nhiều. Điều này khẳng định rằng phần lớn vấn đề hủy phòng mà chuỗi khách sạn này đối mặt bắt nguồn từ City Hotel.
cancellation_by_profile_detailed <- hotels_processed %>%
group_by(hotel, is_repeated_guest) %>%
summarise(ty_le_huy = mean(is_canceled), .groups = "drop")
kable(cancellation_by_profile_detailed)
| hotel | is_repeated_guest | ty_le_huy |
|---|---|---|
| City Hotel | 0 | 0.4225261 |
| City Hotel | 1 | 0.2170276 |
| Resort Hotel | 0 | 0.2876287 |
| Resort Hotel | 1 | 0.0624648 |
Giải thích kỹ thuật:
– (2): Nhóm dữ liệu theo 4 tổ hợp: (City Hotel, Mới), (City Hotel, Cũ), (Resort Hotel, Mới), (Resort Hotel, Cũ).
– (3): Tính tỷ lệ hủy cho mỗi nhóm trong 4 nhóm trên.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán tỷ lệ có điều kiện trên hai biến phân loại, cho phép phân tích sâu hơn về mối quan hệ tương tác.
– Kinh tế: Khách quay lại ở Resort Hotel có tỷ lệ hủy cực kỳ thấp, chỉ 6.2%. Đây là nhóm khách hàng an toàn và đáng tin cậy nhất. Ngược lại khách mới ở City Hotel có tỷ lệ hủy cao nhất, lên tới 42.2%. Đây chính là nguồn gây ra rủi ro lớn nhất cho toàn bộ hệ thống.
cancellation_by_tier_city <- hotels_processed %>%
filter(hotel == "City Hotel") %>%
group_by(price_tier) %>%
summarise(ty_le_huy = mean(is_canceled))
kable(cancellation_by_tier_city)
| price_tier | ty_le_huy |
|---|---|
| Giá thấp (<75) | 0.4587059 |
| Giá trung bình (75-150) | 0.4102409 |
| Giá cao (>150) | 0.3918976 |
Giải thích kỹ thuật:
– (2): Tạo một tập dữ liệu con chỉ chứa các lượt đặt của City Hotel.
– (3): Nhóm tập dữ liệu con này theo 3 cấp giá đã tạo.
– (4): Tính tỷ lệ hủy cho mỗi cấp giá.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Phân tích có điều kiện trên một tập dữ liệu con, tập trung vào một phân khúc cụ thể.
– Kinh tế: Có một xu hướng rõ ràng rằng nhóm giá thấp có tỷ lệ hủy cao nhất (45.87%) và tỷ lệ này giảm dần khi giá tăng lên giá cao chỉ có tỷ lệ hủy 39.18%. Đây là một thông tin quan trọng và có phần nghịch lý so với suy nghĩ thông thường. Nó cho thấy rằng tại City Hotel, những khách hàng đặt phòng giá rẻ nhất lại là những người ít chắc chắn nhất về kế hoạch của họ.
repeat_rate_by_hotel <- hotels_processed %>%
group_by(hotel) %>%
summarise(ty_le_quay_lai = mean(is_repeated_guest))
kable(repeat_rate_by_hotel)
| hotel | ty_le_quay_lai |
|---|---|
| City Hotel | 0.0256148 |
| Resort Hotel | 0.0443596 |
Giải thích kỹ thuật:
– (2): Nhóm dữ liệu theo loại khách sạn.
– (3): Vì is_repeated_guest là 0/1, trung bình của nó chính là tỷ lệ khách quay lại.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh tỷ lệ giữa hai nhóm.
– Kinh tế: Cả hai tỷ lệ đều rất thấp, chỉ 2.5% cho City Hotel và 4.4% cho Resort Hotel. Điều này khẳng định lại rằng mô hình kinh doanh của cả hai khách sạn đều đang phụ thuộc nặng nề vào việc thu hút khách hàng mới. Việc xây dựng lòng trung thành của khách hàng là một điểm yếu lớn cần được cải thiện.
lead_time_by_loyalty <- hotels_processed %>%
group_by(is_repeated_guest) %>%
summarise(lead_time_trung_binh = mean(lead_time))
kable(lead_time_by_loyalty)
| is_repeated_guest | lead_time_trung_binh |
|---|---|
| 0 | 106.42584 |
| 1 | 30.74324 |
Giải thích kỹ thuật:
– (2): Nhóm theo khách mới/cũ.
– (3): Tính trung bình lead_time cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh các đặc điểm trung bình của hai nhóm để hiểu sự khác biệt giữa chúng.
– Kinh tế: Khách mới có thời gian đặt phòng trung bình là 106.4 ngày. Điều này cho thấy khách hàng lần đầu thường cần một quá trình tìm hiểu, so sánh và lập kế hoạch dài hơi trước khi đưa ra quyết định. Khách quay lại có thời gian đặt phòng trung bình chỉ 30.7 ngày. Khách hàng trung thành vì đã quen thuộc và tin tưởng vào dịch vụ nên họ ra quyết định nhanh hơn nhiều. Việc đặt phòng của họ thường mang tính tự phát hơn hoặc cho các nhu cầu đã được xác định rõ.
adr_by_loyalty <- hotels_processed %>%
group_by(is_repeated_guest) %>%
summarise(adr_trung_binh = mean(adr))
kable(adr_by_loyalty)
| is_repeated_guest | adr_trung_binh |
|---|---|
| 0 | 103.01766 |
| 1 | 64.46459 |
Giải thích kỹ thuật:
– (2): Nhóm theo khách mới/cũ.
– (3): Tính trung bình adr cho mỗi nhóm.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh các đặc điểm trung bình của hai nhóm để hiểu sự khác biệt giữa chúng.
– Kinh tế: Khách mới có giá phòng trung bình là 103, cao hơn đáng kể so với khách quay lại chỉ là 64.4. Điều này cho thấy khách hàng lần đầu có xu hướng trả giá phòng cao hơn. Lý do có thể là họ đặt phòng qua các kênh có giá cao hơn, ít có khả năng tiếp cận các chương trình khuyến mãi hoặc đặt phòng vào mùa cao điểm.
lead_time_distribution_repeated <- hotels_processed %>%
filter(is_repeated_guest == 1)
display_table1 <- lead_time_distribution_repeated %>%
head(6) %>%
select(hotel, lead_time, lead_time_group, adr, is_canceled)
kable(display_table1, booktabs = TRUE) %>%
kable_styling(latex_options = "hold_position", font_size = 9)
| hotel | lead_time | lead_time_group | adr | is_canceled |
|---|---|---|---|---|
| Resort Hotel | 6 | Đặt gần (<= 1 tuần) | 0.00 | 0 |
| Resort Hotel | 202 | Đặt rất sớm (> 6 tháng) | 90.95 | 1 |
| Resort Hotel | 187 | Đặt rất sớm (> 6 tháng) | 66.00 | 1 |
| Resort Hotel | 202 | Đặt rất sớm (> 6 tháng) | 55.68 | 1 |
| Resort Hotel | 173 | Đặt trước vừa phải (1 tuần - 6 tháng) | 130.90 | 1 |
| Resort Hotel | 137 | Đặt trước vừa phải (1 tuần - 6 tháng) | 8.00 | 1 |
Giải thích kỹ thuật:
– (2): Tạo ra một tập dữ liệu con chỉ chứa các quan sát của khách hàng quay lại. Kết quả này không phải là một bảng tóm tắt mà là một bộ dữ liệu thô đã được lọc.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị dữ liệu để vẽ biểu đồ phân phối. Biểu đồ này sẽ cho thấy không chỉ giá trị trung bình mà cả hình dạng phân phối, độ lệch và sự hiện diện của các giá trị ngoại lai trong nhóm khách hàng này.
– Kinh tế: Thay vì phân tích trên toàn bộ dữ liệu hỗn tạp, thao tác này cho phép chúng ta tập trung hoàn toàn vào hành vi của nhóm khách hàng trung thành. Việc hiểu rõ nhóm này là cực kỳ quan trọng vì chi phí để giữ chân họ thấp hơn nhiều so với chi phí tìm kiếm khách mới.
adr_distribution_repeated <- hotels_processed %>%
filter(is_repeated_guest == 1)
display_table2 <- adr_distribution_repeated %>%
head(6) %>%
select(hotel, adr, price_tier, lead_time, is_canceled)
knitr::kable(display_table2,booktabs = TRUE) %>%
kable_styling(latex_options = "hold_position", font_size = 9)
| hotel | adr | price_tier | lead_time | is_canceled |
|---|---|---|---|---|
| Resort Hotel | 0.00 | Giá thấp (<75) | 6 | 0 |
| Resort Hotel | 90.95 | Giá trung bình (75-150) | 202 | 1 |
| Resort Hotel | 66.00 | Giá thấp (<75) | 187 | 1 |
| Resort Hotel | 55.68 | Giá thấp (<75) | 202 | 1 |
| Resort Hotel | 130.90 | Giá trung bình (75-150) | 173 | 1 |
| Resort Hotel | 8.00 | Giá thấp (<75) | 137 | 1 |
Giải thích kỹ thuật:
– (2): Tạo ra một tập dữ liệu con chỉ chứa các quan sát của khách hàng quay lại. Kết quả này không phải là một bảng tóm tắt mà là một bộ dữ liệu thô đã được lọc.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị dữ liệu để vẽ biểu đồ phân phối. Biểu đồ này sẽ cho thấy không chỉ giá trị trung bình mà cả hình dạng phân phối, độ lệch và sự hiện diện của các giá trị ngoại lai trong nhóm khách hàng này.
– Kinh tế: Thao tác này cho phép chúng ta tách biệt và chỉ tập trung vào mức giá mà nhóm khách hàng trung thành chi trả. Việc hiểu rõ mức chi tiêu của họ là rất quan trọng để xây dựng các chương trình ưu đãi và định giá phù hợp.
adr_by_profile <- hotels_processed %>%
group_by(guest_profile) %>%
summarise(adr_trung_binh = mean(adr)) %>%
arrange(desc(adr_trung_binh))
kable(adr_by_profile)
| guest_profile | adr_trung_binh |
|---|---|
| Khách mới @ City Hotel | 106.31562 |
| Khách mới @ Resort Hotel | 96.35861 |
| Khách quay lại @ Resort Hotel | 64.72737 |
| Khách quay lại @ City Hotel | 64.23479 |
Giải thích kỹ thuật:
– (2): Nhóm theo biến kết hợp đã tạo (ví dụ: “Khách mới @ City Hotel”).
– (3): Tính giá trung bình cho mỗi loại khách hàng.
– (4): Sắp xếp để xem hồ sơ nào có mức chi trả cao nhất.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh giá trị trung bình giữa nhiều nhóm con chi tiết.
– Kinh tế: Nhóm khách mới ở City Hotel có mức adr_trung_binh cao nhất (106.3). Đây là phân khúc mang lại doanh thu danh nghĩa cao nhất trên mỗi lượt đặt. Cả hai nhóm khách quay lại có mức adr_trung_binh tương đương nhau và thấp hơn đáng kể khoảng 64. Mặc dù mang lại doanh thu trên mỗi lượt đặt thấp hơn nhưng nhóm này có rủi ro hủy phòng rất thấp. Do đó họ là nguồn doanh thu ổn định và dễ dự đoán nhất. Mức giá thấp hơn có thể là do họ được hưởng các chương trình ưu đãi dành cho khách hàng thân thiết.
adr_distribution_city <- hotels_processed %>%
filter(hotel == "City Hotel")
display_table3 <- adr_distribution_city %>%
head(6) %>%
select(is_canceled, lead_time, adr, price_tier, is_repeated_guest)
kable(display_table3, booktabs = TRUE) %>%
kable_styling(latex_options = "hold_position", font_size = 9)
| is_canceled | lead_time | adr | price_tier | is_repeated_guest |
|---|---|---|---|---|
| 0 | 6 | 0.0 | Giá thấp (<75) | 0 |
| 1 | 88 | 76.5 | Giá trung bình (75-150) | 0 |
| 1 | 65 | 68.0 | Giá thấp (<75) | 0 |
| 1 | 92 | 76.5 | Giá trung bình (75-150) | 0 |
| 1 | 100 | 76.5 | Giá trung bình (75-150) | 0 |
| 1 | 79 | 76.5 | Giá trung bình (75-150) | 0 |
Giải thích kỹ thuật:
– (2): Tạo ra tập dữ liệu con cho City Hotel, chứa toàn bộ các giá trị adr của chúng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị dữ liệu để vẽ và so sánh với biểu đồ phân phối của Resort Hotel.
– Kinh tế: City Hotel và Resort Hotel có đối tượng khách hàng và mô hình kinh doanh khác nhau. Việc tách riêng dữ liệu của City Hotel cho phép chúng ta phân tích các đặc điểm của nó một cách chính xác mà không bị ảnh hưởng bởi dữ liệu của Resort Hotel.
adr_distribution_resort <- hotels_processed %>%
filter(hotel == "Resort Hotel")
display_table4 <- adr_distribution_resort %>%
head(6) %>%
select(is_canceled, lead_time, adr, price_tier, is_repeated_guest)
kable(display_table4, booktabs = TRUE) %>%
kable_styling(latex_options = "hold_position", font_size = 9)
| is_canceled | lead_time | adr | price_tier | is_repeated_guest |
|---|---|---|---|---|
| 0 | 342 | 0 | Giá thấp (<75) | 0 |
| 0 | 737 | 0 | Giá thấp (<75) | 0 |
| 0 | 7 | 75 | Giá trung bình (75-150) | 0 |
| 0 | 13 | 75 | Giá trung bình (75-150) | 0 |
| 0 | 14 | 98 | Giá trung bình (75-150) | 0 |
| 0 | 14 | 98 | Giá trung bình (75-150) | 0 |
Giải thích kỹ thuật:
– (2): Tạo ra tập dữ liệu con cho Resort Hotel, chứa toàn bộ các giá trị adr của chúng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị dữ liệu để vẽ và so sánh với biểu đồ phân phối của Cỉty Hotel.
– Kinh tế: City Hotel và Resort Hotel có đối tượng khách hàng và mô hình kinh doanh khác nhau. Việc tách riêng dữ liệu của Resort Hotel cho phép chúng ta phân tích các đặc điểm của nó một cách chính xác mà không bị ảnh hưởng bởi dữ liệu của City Hotel.
lead_time_vs_adr_sample <- hotels_processed %>%
sample_n(2000)
display_table5 <- lead_time_vs_adr_sample %>%
head(6) %>%
select(hotel, lead_time, adr, is_canceled, is_repeated_guest)
kable(display_table5, booktabs = TRUE) %>%
kable_styling(latex_options = "hold_position", font_size = 9)
| hotel | lead_time | adr | is_canceled | is_repeated_guest |
|---|---|---|---|---|
| City Hotel | 2 | 138.67 | 0 | 0 |
| City Hotel | 100 | 62.00 | 1 | 0 |
| City Hotel | 11 | 139.00 | 0 | 0 |
| City Hotel | 225 | 107.10 | 1 | 0 |
| City Hotel | 268 | 80.75 | 0 | 0 |
| City Hotel | 394 | 90.00 | 1 | 0 |
Giải thích kỹ thuật:
– (2): Lấy ra một mẫu ngẫu nhiên gồm 2000 dòng từ bộ dữ liệu. Thao tác này rất quan trọng về mặt kỹ thuật khi chuẩn bị dữ liệu cho biểu đồ phân tán với số lượng điểm dữ liệu lớn. Việc vẽ hàng chục nghìn điểm sẽ làm biểu đồ rất chậm và khó nhìn. Lấy mẫu giúp biểu đồ rõ ràng hơn.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị dữ liệu để vẽ biểu đồ phân tán nhằm tìm kiếm mối quan hệ tương quan giữa hai biến số liên tục.
– Kinh tế: Thay vì chỉ xem xét các con số trung bình đã được tổng hợp, việc giữ lại các dòng dữ liệu riêng lẻ cho phép chúng ta phân tích ở cấp độ từng giao dịch. Điều này giúp phát hiện ra những quy luật ngầm mà các con số trung bình có thể che giấu. Ví dụ chúng ta có thể khám phá xem liệu mối quan hệ giữa lead_time và adr có khác nhau ở City Hotel và Resort Hotel hay không ngay trên cùng một bộ dữ liệu mẫu.
adr_summary_detailed <- hotels_processed %>%
group_by(hotel, price_tier) %>%
summarise(adr_trung_binh = mean(adr), .groups = "drop")
kable(adr_summary_detailed)
| hotel | price_tier | adr_trung_binh |
|---|---|---|
| City Hotel | Giá thấp (<75) | 58.17681 |
| City Hotel | Giá trung bình (75-150) | 105.17558 |
| City Hotel | Giá cao (>150) | 180.17178 |
| Resort Hotel | Giá thấp (<75) | 49.25527 |
| Resort Hotel | Giá trung bình (75-150) | 103.54545 |
| Resort Hotel | Giá cao (>150) | 202.18505 |
Giải thích kỹ thuật:
– (2) và (3): Đây là một phép tổng hợp đa chiều, tạo ra một bảng tóm tắt chi tiết.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán trung bình có điều kiện trên hai biến phân loại.
– Kinh tế: Ở cả hai cấp giá thấp và trung bình, adr_trung_binh của City Hotel luôn cao hơn so với Resort Hotel. Điều này cho thấy ở thị trường đại chúng thì City Hotel có khả năng định giá cao hơn. Lý do có thể là vị trí trung tâm thuận tiện là một lợi thế cạnh tranh mạnh, cho phép họ đặt giá cao hơn cho các phòng tiêu chuẩn. Ở cấp giá cao, adr_trung_binh của Resort Hotel (202.18) lại cao hơn đáng kể so với City Hotel (180.17). Đây là một thông tin rất quan trọng vì nó cho thấy ở phân khúc cao cấp, khách hàng sẵn sàng chi trả nhiều tiền hơn cho trải nghiệm nghỉ dưỡng độc đáo tại Resort Hotel.
lead_time_by_price_tier <- hotels_processed %>%
group_by(price_tier) %>%
summarise(lead_time_trung_binh = mean(lead_time))
kable(lead_time_by_price_tier)
| price_tier | lead_time_trung_binh |
|---|---|
| Giá thấp (<75) | 112.92142 |
| Giá trung bình (75-150) | 105.82862 |
| Giá cao (>150) | 78.35935 |
Giải thích kỹ thuật:
– (2): Chia bộ dữ liệu thành các cấp.
– (3): Tính giá trị trung bình của lead_time cho mỗi cấp.
Ý nghĩa thống kê & kinh tế:
– Thống kê: So sánh giá trị trung bình giữa các nhóm.
– Kinh tế: Có một xu hướng khá rõ ràng là lead_time_trung_binh giảm dần khi cấp giá tăng. Nhóm giá thấp đặt phòng sớm nhất (trung bình 112.9 ngày), trong khi nhóm giá cao đặt phòng muộn nhất (trung bình 78.3 ngày). Đây là một thông tin có phần nghịch lý. Nó cho thấy những khách hàng sẵn sàng chi trả cao nhất lại là những người có xu hướng lập kế hoạch muộn hơn.
hotel_vs_lead_time_crosstab <- hotels_processed %>%
count(hotel, lead_time_group) %>%
pivot_wider(names_from = lead_time_group, values_from = n)
kable(hotel_vs_lead_time_crosstab) %>%
kable_styling(latex_options = "scale_down")
| hotel | Đặt gần (<= 1 tuần) | Đặt rất sớm (> 6 tháng) | Đặt trước vừa phải (1 tuần - 6 tháng) |
|---|---|---|---|
| City Hotel | 10808 | 16948 | 51573 |
| Resort Hotel | 8938 | 7743 | 23378 |
Giải thích kỹ thuật:
– (2): Đếm số lượng quan sát cho tổ hợp.
– (3): Tái cấu trúc bảng kết quả từ dạng dài sang dạng rộng, tạo ra một bảng chéo dễ đọc với các cấp độ của một biến làm tên cột.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra các bảng tần suất chéo.
– Kinh tế: Ở cả hai nhóm đặt rất sớm và đặt trước vừa phải, số lượng đặt phòng của City Hotel đều cao hơn gấp đôi so với Resort Hotel. Điều này cho thấy những khách hàng có kế hoạch từ trước có xu hướng lựa chọn City Hotel nhiều hơn. Đây có thể là nhóm khách công tác đã có lịch trình cố định hoặc khách du lịch đã xác định rõ điểm đến là thành phố.
hotel_vs_price_tier_crosstab <- hotels_processed %>%
count(hotel, price_tier) %>%
pivot_wider(names_from = price_tier, values_from = n)
kable(hotel_vs_price_tier_crosstab)
| hotel | Giá thấp (<75) | Giá trung bình (75-150) | Giá cao (>150) |
|---|---|---|---|
| City Hotel | 15099 | 54702 | 9528 |
| Resort Hotel | 19707 | 12994 | 7358 |
Giải thích kỹ thuật:
– (2): Đếm số lượng quan sát cho tổ hợp.
– (3): Tái cấu trúc bảng kết quả từ dạng dài sang dạng rộng, tạo ra một bảng chéo dễ đọc với các cấp độ của một biến làm tên cột.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra các bảng tần suất chéo.
– Kinh tế: City Hotel có số lượng đặt phòng ở nhóm giá trung bình (54702) cao gấp 4 lần so với Resort Hotel (12994). Họ thu hút một lượng lớn khách hàng đại chúng có thể là khách công tác hoặc khách du lịch ngắn ngày, những người tìm kiếm sự cân bằng giữa giá cả và sự tiện lợi ở trung tâm thành phố. Resort Hotel có số lượng đặt phòng ở nhóm giá thấp (19707) cao hơn City Hotel (15099). Họ có thể đang sử dụng các chương trình khuyến mãi, các gói dịch vụ giá rẻ để thu hút khách du lịch có ngân sách eo hẹp hơn nhằm lấp đầy công suất phòng, đặc biệt là vào mùa thấp điểm.
profile_percentage <- hotels_processed %>%
count(guest_profile) %>%
mutate(ty_trong = n / sum(n))
kable(profile_percentage)
| guest_profile | n | ty_trong |
|---|---|---|
| Khách mới @ City Hotel | 77297 | 0.6474436 |
| Khách mới @ Resort Hotel | 38282 | 0.3206520 |
| Khách quay lại @ City Hotel | 2032 | 0.0170201 |
| Khách quay lại @ Resort Hotel | 1777 | 0.0148842 |
Giải thích kỹ thuật:
– (2): Đếm số lượng của mỗi loại khách hàng.
– (3): Tạo một cột mới ty_trong bằng cách lấy số lượng của mỗi nhóm (n) chia cho tổng số lượng (sum(n)).
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán tần suất tương đối.
– Kinh tế: Nhóm khách mới ở City Hotel chiếm tới 64.7% tổng số lượt đặt phòng. Đây là phân khúc quan trọng nhất và có ảnh hưởng lớn nhất đến kết quả kinh doanh chung. Mọi sự thay đổi trong hành vi của nhóm này sẽ tác động mạnh mẽ đến doanh thu tổng thể. Cả hai nhóm khách quay lại ở cả hai khách sạn cộng lại chỉ chiếm khoảng nhỏ. Điều này khẳng định lại một cách mạnh mẽ rằng mô hình kinh doanh hiện tại gần như hoàn toàn dựa vào việc thu hút khách mới. Tỷ lệ khách hàng trung thành là rất thấp, cho thấy một tiềm năng lớn chưa được khai thác trong việc xây dựng các chương trình giữ chân khách hàng.
final_summary_by_hotel <- hotels_processed %>%
group_by(hotel) %>%
summarise(
so_luong_dat = n(),
ty_le_huy = mean(is_canceled),
adr_trung_binh = mean(adr),
lead_time_trung_binh = mean(lead_time),
ty_le_khach_quay_lai = mean(is_repeated_guest)
)
kable(final_summary_by_hotel)
| hotel | so_luong_dat | ty_le_huy | adr_trung_binh | lead_time_trung_binh | ty_le_khach_quay_lai |
|---|---|---|---|---|---|
| City Hotel | 79329 | 0.4172623 | 105.23772 | 109.73667 | 0.0256148 |
| Resort Hotel | 40059 | 0.2776405 | 94.95546 | 92.67313 | 0.0443596 |
Giải thích kỹ thuật:
– (2) và (3): Tính toán nhiều chỉ số tổng hợp cùng một lúc cho mỗi loại khách sạn.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một bảng tóm tắt cuối cùng, so sánh các đặc điểm tổng thể của hai nhóm chính.
– Kinh tế: City Hotel là đầu tàu về quy mô kinh doanh và khả năng định giá. Nó thu hút được nhiều khách hàng hơn và bán được với giá cao hơn. Tuy nhiên đi kèm với đó là những rủi ro lớn khi ty_le_huy của City Hotel (41.7%) cao hơn rất nhiều và ty_le_khach_quay_lai (2.5%) lại thấp hơn đáng kể so với Resort Hotel. Resort Hotel tuy có quy mô và giá bán trung bình thấp hơn nhưng lại vượt trội về các chỉ số chất lượng như ty_le_huy thấp hơn (27.7%) và ty_le_khach_quay_lai cao hơn gần gấp đôi (4.4%). Resort Hotel có một tệp khách hàng chất lượng và trung thành hơn. Mặc dù không thu hút được nhiều khách bằng City Hotel nhưng những khách hàng họ có được lại đáng tin cậy hơn, ít hủy phòng và có xu hướng quay trở lại.
ggplot(cancellation_by_lead_time,
aes(x = reorder(lead_time_group, ty_le_huy), y = ty_le_huy)) +
geom_segment(
aes(xend = reorder(lead_time_group, ty_le_huy), yend = 0), color = "grey50") +
geom_point(aes(color = lead_time_group), size = 10, show.legend = FALSE) +
geom_text(aes(label = scales::percent(ty_le_huy, 1)), color = "white") +
scale_y_continuous(labels = scales::percent) +
coord_flip() +
labs(
title = "Rủi ro hủy phòng theo nhóm đặt",
x = "Nhóm đặt phòng", y = "Tỷ lệ hủy phòng"
)
Giải thích kỹ thuật:
– (2) và (4): Kỹ thuật này được sử dụng cho cả x và xend để tự động sắp xếp các nhóm (lead_time_group) trên trục Y sau khi xoay theo giá trị của ty_le_huy, giúp biểu đồ có thứ tự logic từ thấp đến cao.
– (3): Vẽ một đường thẳng ngang cho mỗi nhóm. yend = 0 chỉ định rằng đường thẳng này bắt đầu từ giá trị 0.
– (5): Vẽ một điểm tròn lớn ở cuối mỗi que tại đúng giá trị của ty_le_huy. Màu sắc được ánh xạ vào lead_time_group để tự động phân biệt các nhóm.
– (6): Thêm nhãn phần trăm vào giữa mỗi điểm tròn (color = “white”) giúp đọc số liệu chính xác.
– (7): Định dạng trục giá trị (trục X) để hiển thị dưới dạng phần trăm.
– (8): Xoay biểu đồ 90 độ, giúp các nhãn dài của nhóm thời gian đặt phòng được hiển thị rõ ràng trên trục Y.
– (9): Cung cấp tiêu đề và các nhãn trục để làm rõ nội dung của biểu đồ.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Lollipop là một phương pháp trực quan hóa hiệu quả để xếp hạng và so sánh các giá trị giữa các nhóm phân loại. Nó tập trung vào điểm cuối của mỗi thanh giúp so sánh giá trị một cách chính xác mà không bị nhiễu bởi diện tích của các thanh cột.
– Kinh tế: Biểu đồ này trực quan hóa một cách mạnh mẽ mối quan hệ giữa hành vi lập kế hoạch của khách hàng và rủi ro kinh doanh cho khách sạn. Các nhãn phần trăm cho thấy mức độ rủi ro một cách cụ thể: Nhóm đặt rất sớm có rủi ro hủy lên tới 57%, cao gần 6 lần so với nhóm đặt gần. Nhóm đặt gần là an toàn nhất với tỷ lệ hủy chỉ 10%.
adr_by_lead_time_diff <- adr_by_lead_time %>%
mutate(avg_adr_all = mean(gia_trung_binh), diff = gia_trung_binh - avg_adr_all)
ggplot(adr_by_lead_time_diff, aes(x = reorder(lead_time_group, gia_trung_binh),
y = diff, fill = diff > 0)) +
geom_col(show.legend = FALSE) +
geom_hline(yintercept = 0) +
geom_text(aes(label = dollar(gia_trung_binh, 1, prefix="€")),
vjust = ifelse(adr_by_lead_time_diff$diff > 0, -0.5, 1.5)) +
labs(
title = "Chiến lược giá động theo nhóm đặt",
x = "Nhóm đặt phòng", y = "Chênh lệch so với mức trung bình"
)
Giải thích kỹ thuật:
– (2): Tính toán giá trị trung bình chung (avg_adr_all), sau đó tạo ra biến diff là độ chênh lệch của giá trung bình mỗi nhóm so với mức trung bình chung đó.
– (3): Vẽ biểu đồ cột với chiều cao là độ chênh lệch (diff). Màu sắc của cột (fill) được quyết định bởi điều kiện logic diff > 0, tự động tạo ra hai màu khác nhau cho các cột dương và âm.
– (6): Vẽ một đường tham chiếu ngang tại y=0. Đường này bây giờ đại diện cho mức giá trung bình chung.
– (7): Thêm nhãn giá trị. Nhãn label = dollar(gia_trung_binh, …) hiển thị giá trị trung bình thực tế của nhóm đó chứ không phải độ chênh lệch.
– (8): Một kỹ thuật nâng cao để tự động điều chỉnh vị trí của nhãn nằm bên trên nếu cột dương và nằm bên dưới nếu cột âm.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ này là một biểu đồ độ lệch. Thay vì chỉ so sánh các giá trị trung bình thô, nó trực quan hóa sự chênh lệch của mỗi giá trị trung bình nhóm so với giá trị trung bình tổng thể. Đây là một kỹ thuật hiệu quả để chuẩn hóa dữ liệu và làm nổi bật các nhóm có hành vi khác biệt đáng kể so với chuẩn mực chung.
– Kinh tế: Cột của nhóm đặt trước vừa phải là cột dương duy nhất và cao nhất cho thấy mức giá €108 cao hơn đáng kể so với mức trung bình. Cả hai nhóm đặt gần và đặt rất sớm đều có cột âm cho thấy mức giá của họ thấp hơn mức trung bình. Điều này xác nhận một chiến lược giá linh hoạt là giá thấp cho đặt rất sớm (€93), có thể là ưu đãi để khuyến khích cam kết sớm. Giá thấp cho đặt gần (€90), có thể là giá phút chót để lấp đầy những phòng còn trống.
ggplot(lead_time_vs_adr_sample, aes(x = lead_time, y = adr)) +
geom_bin2d(bins = 20) +
scale_fill_viridis_c(name = "Số lượng\nđặt phòng") +
scale_x_continuous(limits = c(0, 400)) +
scale_y_continuous(limits = c(0, 400)) +
labs(
title = "Mật độ đặt phòng theo Lead Time và ADR",
x = "Số ngày đặt trước", y = "Giá phòng"
)
Giải thích kỹ thuật:
– (1): Sử dụng một mẫu dữ liệu ngẫu nhiên để tránh tình trạng quá nhiều điểm chồng chéo lên nhau.
– (2): Đây là layer hình học chính. Nó hoạt động như sau:
Chia toàn bộ không gian của biểu đồ (trục X và Y) thành một lưới các ô hình chữ nhật (bins = 20 tạo ra một lưới 20x20).
Đếm số lượng điểm dữ liệu rơi vào mỗi ô.
Tô màu cho mỗi ô dựa trên số lượng điểm mà nó chứa.
– (3): Áp dụng một dải màu gradient liên tục của viridis. Các ô có ít điểm sẽ có màu tím đậm và các ô có nhiều điểm sẽ có màu vàng sáng.
– (4) và (5): Giới hạn trục X và Y để phóng to vào vùng dữ liệu chính, nơi có mật độ đặt phòng cao nhất.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ này là một heatmap hoặc biểu đồ mật độ 2 chiều. Nó là một công cụ trực quan hóa mạnh mẽ để khám phá sự phân bố của một lượng lớn các điểm dữ liệu phân tán giúp nhận diện các cụm hoặc các vùng có mật độ cao.
– Kinh tế: Vùng có màu vàng sáng nhất và xanh lá cây tập trung ở góc dưới trái của biểu đồ. Điều này cho thấy phần lớn áp đảo các lượt đặt phòng có các đặc điểm như số ngày đặt trước thấp chủ yếu dưới 100 ngày và giá phòng ở mức trung bình chủ yếu từ 50 đến 150. Các vùng có số ngày đặt trước cao và giá phòng cao đều có màu tím đậm, cho thấy có rất ít lượt đặt phòng ở đó. Rất ít khách hàng sẵn sàng vừa đặt phòng từ rất sớm, vừa chấp nhận một mức giá rất cao.
ggplot(hotels_processed, aes(x = lead_time, y = price_tier, fill = price_tier)) +
geom_density_ridges(alpha = 0.8, show.legend = FALSE) +
stat_density_ridges(quantile_lines = TRUE, quantiles = 0.5, linetype = "dashed") +
scale_fill_brewer(palette = "Set2") +
coord_cartesian(xlim = c(0, 400)) +
labs(
title = "Hành vi đặt phòng theo cấp giá",
x = "Số ngày đặt trước",
y = "Cấp giá"
) +
theme_ridges(font_family = "Roboto")
Giải thích kỹ thuật:
– (2): Đây là layer hình học chính.
– (3): Đây là một layer thống kê đi kèm. quantile_lines = TRUE và quantiles = 0.5 ra lệnh cho ggridges tự động vẽ một đường thẳng đứng tại trung vị của mỗi phân phối.
– (5): Phóng to vào vùng dữ liệu chính (0-400 ngày) để biểu đồ dễ đọc hơn.
– (11): Áp dụng một theme được thiết kế đặc biệt cho loại biểu đồ này giúp giao diện trông sạch sẽ và chuyên nghiệp.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Ridgeline là một công cụ trực quan hóa rất hiệu quả để so sánh hình dạng phân phối của một biến số liên tục qua nhiều nhóm khác nhau. Nó tốt hơn nhiều so với việc vẽ nhiều biểu đồ mật độ riêng lẻ vì nó cho phép so sánh trực tiếp trên cùng một trục.
– Kinh tế: Đường cong của nhóm giá thấp và giá cao có đỉnh nhọn và cao nhất ở gần 0. Đường cong của nhóm giá trung bình có đỉnh thấp hơn nhưng trải rộng hơn. Điều này cho thấy ở giá thấp & cao thì khách hàng ở hai phân khúc này có hành vi khá giống nhau, chủ yếu tập trung vào việc đặt phòng rất gần ngày đi. Còn giá trung bình thì đây là nhóm có hành vi đa dạng nhất. Mặc dù nhiều người vẫn đặt gần ngày nhưng cũng có một tỷ lệ đáng kể khách hàng trong nhóm này lên kế hoạch và đặt phòng từ rất sớm.
set.seed(123)
adr_lead_time_sample <- hotels_processed %>% sample_n(10000)
ggplot(adr_lead_time_sample, aes(x = lead_time, y = adr)) +
geom_density_2d_filled(alpha = 0.7, contour_var = "ndensity") +
geom_point(alpha = 0.1, size = 0.5) +
coord_cartesian(xlim = c(0, 400), ylim = c(0, 400)) +
scale_fill_viridis_d(name = "Mật độ") +
labs(
title = "Bản đồ mật độ đặt phòng",
x = "Số ngày đặt trước",
y = "Giá phòng trung bình"
) +
theme_bw(base_family = "Roboto")
Giải thích kỹ thuật:
– (1) và (2): sample_n(10000) lấy ra một mẫu ngẫu nhiên lớn để trực quan hóa, giúp giảm thời gian tính toán và tránh biểu đồ quá dày đặc. Có set.seed(123) đảm bảo rằng mẫu ngẫu nhiên này luôn giống nhau mỗi khi bạn chạy lại code.
– (4): Đây là layer hình học chính. Nó tính toán và vẽ một biểu đồ mật độ hai chiều. Nó hoạt động bằng cách ước tính mật độ của các điểm dữ liệu trên một lưới 2D và vẽ các vùng đường đồng mức thể hiện các mức mật độ khác nhau. Có contour_var = “ndensity” chuẩn hóa mật độ về thang đo từ 0 đến 1.
– (5): Vẽ thêm một lớp các điểm dữ liệu thực tế rất trong suốt lên trên giúp người xem hình dung được sự phân tán gốc của dữ liệu.
– (6): Phóng to vào vùng dữ liệu chính (0-400 cho cả hai trục), loại bỏ các giá trị ngoại lai quá xa làm cho biểu đồ khó đọc.
– (7): Áp dụng một bảng màu viridis cho các vùng mật độ. Theo mặc định, các vùng có mật độ cao nhất sẽ có màu vàng sáng và mật độ giảm dần về màu tím đậm.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ mật độ 2D là một công cụ trực quan hóa mạnh mẽ để khám phá sự phân bố đồng thời của hai biến số liên tục. Nó giải quyết được vấn đề quá nhiều điểm chồng chéo của biểu đồ phân tán thông thường giúp nhận diện các cụm hoặc các vùng có mật độ cao một cách rõ ràng.
– Kinh tế: Vùng có màu vàng sáng nhất và xanh lá cây tập trung dày đặc ở góc dưới trái của biểu đồ. Điều này cho thấy phần lớn áp đảo các lượt đặt phòng có các đặc điểm số ngày đặt trước rất thấp khi hầu hết tập trung dưới 100 ngày, đặc biệt dày đặc ở khoảng dưới 50 ngày. Và giá phòng ở mức trung bình thấp khi hầu hết tập trung trong khoảng từ 50 đến 150. Các vùng có lead_time cao hoặc adr cao đều có màu tím đậm và rất ít điểm dữ liệu. Rất ít khách hàng đặt phòng từ rất sớm và cũng rất ít khách hàng chấp nhận một mức giá rất cao.
cancellation_by_profile_heatmap <- cancellation_by_profile %>%
separate(guest_profile, into = c("LoaiKhach", "KhachSan"), sep = " @ ")
ggplot(cancellation_by_profile_heatmap, aes(x = KhachSan,
y = LoaiKhach, fill = ty_le_huy)) +
geom_tile(color = "white", linewidth = 2) +
geom_text(aes(label = scales::percent(ty_le_huy, 1)), color = "white",
fontface = "bold") +
scale_fill_viridis_c(labels = scales::percent) +
labs(
title = "Heatmap rủi ro hủy phòng",
x = "Loại khách sạn", y = "Loại khách", fill = "Tỷ lệ hủy"
)
Giải thích kỹ thuật:
– (2): Là một hàm từ tidyr dùng để tách một cột thành nhiều cột. Ở đây nó tách cột guest_profile thành hai cột mới là loại khách và loại khách sạn.
– (5): Vẽ biểu đồ dạng ô (heatmap). Mỗi ô đại diện cho một tổ hợp của loại khách sạn (trục X) và loại khách (trục Y).
– (6): Thêm nhãn phần trăm vào giữa mỗi ô giúp đọc số liệu chính xác.
– (8): Áp dụng một dải màu gradient liên tục của viridis. Các giá trị thấp sẽ có màu tím đậm, các giá trị cao sẽ có màu vàng sáng giúp làm nổi bật các điểm rủi ro.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Heatmap là một phương pháp trực quan hóa ma trận dữ liệu, trong đó các giá trị được biểu diễn bằng màu sắc. Nó rất hiệu quả trong việc giúp nhanh chóng xác định các mẫu hình, các điểm dị thường và mối quan hệ tương tác giữa hai biến phân loại.
– Kinh tế: Ô ở góc dưới trái (“Khách mới” - “City Hotel”) có màu vàng sáng nhất và giá trị cao nhất (42%). Sự kết hợp giữa một khách hàng mới vốn đã có rủi ro cao và một khách sạn thành phố cũng có tỷ lệ hủy cao đã tạo ra một điểm cần được quản lý chặt chẽ nhất. Ô ở góc trên phải (“Khách quay lại” - “Resort Hotel”) có màu tím đậm nhất và giá trị thấp nhất (6%). Đây là phân khúc vàng của khách sạn. Khách hàng trung thành tại một khách sạn nghỉ dưỡng là những người đáng tin cậy nhất, gần như chắc chắn sẽ đến.
risk_counts <- count(hotels_processed, cancellation_risk)
ggplot(risk_counts, aes(area = n, fill = cancellation_risk,
label = paste(cancellation_risk, scales::comma(n), sep = "\n"))) +
geom_treemap() +
geom_treemap_text(color = "white", place = "centre", grow = TRUE) +
labs(
title = "Phân bổ các nhóm rủi ro hủy phòng",
fill = "Mức độ rủi ro"
) +
theme(legend.position = "bottom")
Giải thích kỹ thuật:
– (1): count() được dùng để tạo một bảng tần suất đơn giản, đếm số lượng lượt đặt phòng (n) cho mỗi nhóm cancellation_risk.
– (4): Đây là layer hình học chính. Nó nhận dữ liệu và ánh xạ.
– (5): Layer này được thiết kế đặc biệt để thêm nhãn văn bản vào giữa các ô của treemap.
place = “centre”: Đặt nhãn ở giữa ô.
grow = TRUE: Cho phép văn bản tự động co giãn để vừa với ô.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Treemap là một phương pháp trực quan hóa dữ liệu phân cấp hoặc cơ cấu tỷ trọng. Nó rất hiệu quả trong việc thể hiện các phần của một tổng thể, trong đó diện tích của mỗi phần đại diện cho giá trị của nó. So với biểu đồ tròn, treemap có thể hiển thị nhiều cấp độ hơn và tận dụng không gian tốt hơn.
– Kinh tế: Hình chữ nhật màu xanh dương chiếm diện tích lớn nhất một cách áp đảo. Điều này cho thấy phần lớn khách hàng của khách sạn thuộc nhóm phổ thông, có hành vi và rủi ro ở mức độ có thể dự đoán được. Hai hình chữ nhật màu đỏ và màu xanh lá có diện tích gần bằng nhau. Điều này cho thấy trong danh mục khách hàng, có một sự cân bằng giữa hai nhóm cực đoan tức nhóm khách hàng rất đáng tin cậy đặt gần ngày và nhóm khách hàng rất không chắc chắn đặt rất sớm thì mỗi nhóm chiếm khoảng 1/5 tổng số lượt đặt.
ggplot(repeat_rate_by_hotel, aes(x = hotel, y = ty_le_quay_lai, group = 1)) +
geom_line(color = "grey", linetype = "dashed") +
geom_point(aes(color = hotel), size = 8, show.legend = FALSE) +
geom_text(aes(label = scales::percent(ty_le_quay_lai, 0.1)), vjust = 0.5) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "Tỷ lệ khách quay lại giữa 2 loại khách sạn",
x = "Loại khách sạn", y = "Tỷ lệ khách quay lại"
)
Giải thích kỹ thuật:
– (2): Vẽ một đường thẳng gạch nối giữa hai điểm dữ liệu. Độ dốc của đường này trực quan hóa mức độ khác biệt giữa hai khách sạn.
– (3): Vẽ hai điểm tròn lớn, mỗi điểm đại diện cho một khách sạn. Có aes(color = hotel) gán màu sắc khác nhau cho mỗi điểm để dễ phân biệt.
– (4): Thêm nhãn phần trăm vào bên trong hoặc ngay cạnh mỗi điểm giúp có được con số chính xác.
– (5): Định dạng trục Y để hiển thị dưới dạng phần trăm.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ đường dốc là một biến thể của biểu đồ đường, rất hiệu quả trong việc so sánh giá trị của các danh mục khác nhau tại một điểm thời gian duy nhất hoặc trong trường hợp này là giá trị trung bình tổng thể. Nó tập trung vào việc làm nổi bật độ dốc và khoảng cách giữa các điểm.
– Kinh tế: Điểm của Resort Hotel (4.4%) nằm ở vị trí cao hơn đáng kể so với điểm của City Hotel (2.6%). Độ dốc đi lên từ trái sang phải rất rõ ràng. Tỷ lệ quay lại của Resort Hotel cao gần gấp đôi so với City Hotel. Điều này cho thấy trải nghiệm tại Resort Hotel có khả năng tạo ra sự gắn kết và lòng trung thành cao hơn. Lý do có thể là khách nghỉ dưỡng thường có những trải nghiệm sâu sắc và đáng nhớ hơn tạo ra mong muốn quay trở lại. Trong khi đó City Hotel với nhiều khách công tác và phải đối mặt với sự cạnh tranh lớn hơn.
loyalty_sample <- hotels_processed %>% sample_n(3000)
ggplot(loyalty_sample, aes(x = lead_time, y = adr,
color = as.factor(is_repeated_guest))) +
geom_point(alpha = 0.3) +
geom_smooth(se = FALSE) +
scale_y_continuous(limits = c(0, 500)) +
scale_x_continuous(limits = c(0, 500)) +
labs(
title = "Hành vi đặt phòng: Khách mới và Khách quay lại",
x = "Số ngày đặt trước", y = "Giá phòng",
color = "Loại khách (1 = Quay lại)"
)
Giải thích kỹ thuật:
– (1): sample_n(3000) được dùng để lấy ra một mẫu ngẫu nhiên gồm 3000 lượt đặt phòng. Kỹ thuật này rất quan trọng khi vẽ biểu đồ phân tán với dữ liệu lớn giúp biểu đồ không bị quá dày đặc và khó nhìn.
– (3): Ánh xạ màu sắc của các điểm vào biến is_repeated_guest được chuyển thành factor để ggplot hiểu là biến phân loại.
– (4): Vẽ biểu đồ phân tán, mỗi điểm là một lượt đặt phòng. alpha = 0.3 làm cho các điểm trở nên trong suốt giúp chúng ta thấy được những vùng có mật độ điểm cao hơn.
– (5): Vẽ thêm hai đường cong xu hướng cho mỗi nhóm màu. Có se = FALSE để ẩn đi khoảng tin cậy giúp biểu đồ gọn hơn.
– (6) và (7): Giới hạn trục X và Y để phóng to vào vùng dữ liệu chính, loại bỏ các giá trị ngoại lai quá xa làm cho biểu đồ khó đọc.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ phân tán có phân nhóm màu và đường xu hướng là một công cụ cực kỳ mạnh mẽ để khám phá mối quan hệ giữa hai biến số liên tục lead_time, adr và xem xét liệu mối quan hệ đó có khác nhau giữa các nhóm phân loại hay không.
– Kinh tế: Các điểm màu đỏ phân tán trên một khu vực rất rộng. Đường xu hướng màu đỏ cho thấy giá phòng có xu hướng cao nhất khi lead_time khoảng 100-200 ngày, sau đó giảm dần. Đường xu hướng cho thấy họ thường trả giá cao nhất khi đặt phòng trong vài tháng trước chuyến đi và có thể nhận được giá tốt hơn khi đặt quá sớm hoặc quá muộn. Các điểm màu xanh tập trung chủ yếu ở vùng lead_time thấp. Đường xu hướng màu xanh cho thấy giá phòng có xu hướng tăng lên khi lead_time tăng nhưng ở mức độ vừa phải. Đường xu hướng của họ cho thấy họ không có xu hướng săn giá rẻ bằng cách đặt quá sớm và mức giá họ trả tương đối ổn định.
p1 <- ggplot(lead_time_distribution_repeated, aes(x = lead_time)) +
geom_density(fill = "cyan", alpha = 0.6) +
geom_vline(xintercept = 30.7, linetype = "dashed") +
scale_x_continuous(limits = c(0, 400)) +
labs(title = "Phân phối số ngày đặt trước", x = "lead time")
p2 <- ggplot(adr_distribution_repeated, aes(x = adr)) +
geom_density(fill = "purple", alpha = 0.6) +
geom_vline(xintercept = 64.4, linetype = "dashed") +
scale_x_continuous(limits = c(0, 300)) +
labs(title = "Phân phối giá phòng", x = "ADR")
p1 + p2
Giải thích kỹ thuật:
– (1) và (6): Tạo ra hai tập dữ liệu con (lead_time_distribution_repeated và adr_distribution_repeated) chỉ chứa các quan sát của khách hàng quay lại.
– (2) và (7): Đây là layer hình học chính, vẽ biểu đồ mật độ. Chiều cao của đường cong tại một điểm trên trục X thể hiện mật độ của các quan sát tại điểm đó. Vùng diện tích dưới đường cong được tô màu (fill) để dễ nhìn hơn.
– (3) và (8): Vẽ một đường thẳng đứng tại giá trị trung bình giúp so sánh vị trí của giá trị trung bình so với hình dạng phân phối chung.
– (4) và (9): Giới hạn trục X để phóng to vào vùng dữ liệu chính và loại bỏ các giá trị ngoại lai quá xa.
– (11): Đây là một kỹ thuật từ gói patchwork. Toán tử + khi dùng giữa hai đối tượng ggplot sẽ tự động đặt chúng cạnh nhau thành một bố cục duy nhất.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ mật độ là một công cụ trực quan hóa mạnh mẽ để khám phá hình dạng phân phối của một biến số liên tục. Nó cho thấy dữ liệu tập trung ở đâu, mức độ phân tán và có bị lệch hay không.
– Kinh tế: Phân phối số ngày đặt trước lệch phải rất mạnh. Đường cong có một đỉnh rất cao và nhọn ở gần 0, sau đó có một cái đuôi dài về phía bên phải. Đường trung bình nằm xa về phía phải so với đỉnh. Điều này cho thấy phần lớn áp đảo khách hàng quay lại có xu hướng đặt phòng rất gần ngày đi. Phân phối giá phòng đa đỉnh. Đường cong có nhiều đỉnh. Một đỉnh cao và nhọn ở khoảng 60-70 và một đỉnh thấp hơn ở khoảng 40-50. Sự xuất hiện của nhiều đỉnh cho thấy nhóm khách hàng quay lại này không đồng nhất về mức chi tiêu.
comparison_summary <- hotels_processed %>%
group_by(hotel) %>%
summarise(
`Tỷ lệ hủy` = mean(is_canceled),
`Tỷ lệ khách quay lại` = mean(is_repeated_guest)
) %>%
pivot_longer(-hotel, names_to = "ChiSo", values_to = "TyLe")
ggplot(comparison_summary, aes(x = hotel, y = TyLe, fill = hotel)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ ChiSo, scales = "free_y") +
geom_text(aes(label = scales::percent(TyLe, accuracy = 0.1)), vjust = -0.2) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_brewer(palette = "Set1") +
labs(
title = "Phân tích hiệu suất khách hàng theo loại khách sạn",
x = "Loại khách sạn",
y = "Tỷ lệ"
) +
theme_bw(base_family = "Roboto") +
theme(strip.text = element_text(face = "bold", size = 12))
Giải thích kỹ thuật:
– (2) và (3): Tính toán đồng thời hai chỉ số tỷ lệ hủy và tỷ lệ khách quay lại cho mỗi khách sạn.
– (7): Tái cấu trúc bảng kết quả sang dạng dài để ggplot có thể sử dụng facet_wrap.
– (9): Vẽ các cột thể hiện giá trị của các tỷ lệ.
– (10): Nó chia biểu đồ thành hai ô riêng biệt, một cho “Tỷ lệ hủy” và một cho “Tỷ lệ khách quay lại”. Có scales = “free_y”: Một tùy chọn cực kỳ quan trọng cho phép mỗi biểu đồ con có trục y riêng, phù hợp với thang đo của chính nó. Nếu không có, biểu đồ “Tỷ lệ quay lại” với giá trị rất nhỏ sẽ bị khó đọc.
– (11): Thêm nhãn phần trăm lên trên mỗi cột.
– (12): Định dạng trục Y.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Kỹ thuật sử dụng facet_wrap với scales = “free_y” là một phương pháp rất mạnh mẽ để so sánh các biến số có thang đo khác nhau trên cùng một không gian trực quan. Nó cho phép chúng ta đánh giá các mẫu hình một cách độc lập cho từng chỉ số.
– Kinh tế: City Hotel đều có kết quả kém hơn khi tỷ lệ hủy cao hơn (41.7%) và tỷ lệ quay lại thấp hơn (2.6%). City Hotel có một tệp khách hàng kém chất lượng hơn. Họ thu hút được nhiều khách nhưng đó là những khách hàng có rủi ro hủy cao và ít có khả năng trở thành khách hàng trung thành. Ngược lại, Resort Hotel có tỷ lệ hủy thấp hơn (27.8%) và tỷ lệ quay lại cao hơn (4.4%). Mặc dù có thể có ít khách hơn nhưng Resort Hotel lại sở hữu một tệp khách hàng chất lượng cao hơn. Khách hàng của họ đáng tin cậy hơn và có sự gắn kết tốt hơn với thương hiệu.
adr_loyalty_dist <- hotels_processed %>%
mutate(LoaiKhach = ifelse(is_repeated_guest == 1, "Khách quay lại", "Khách mới"))
ggplot(adr_loyalty_dist, aes(x = adr, y = LoaiKhach, fill = LoaiKhach)) +
geom_density_ridges(
alpha = 0.8,
show.legend = FALSE,
quantile_lines = TRUE,
quantiles = c(0.25, 0.5, 0.75)
) +
scale_fill_manual(values = c("Khách mới" = "skyblue", "Khách quay lại" = "salmon")) +
scale_x_continuous(labels = dollar_format(prefix = "€")) +
coord_cartesian(xlim = c(0, 300)) +
annotate("text", x = 200, y = 2.3, label = "Đường nét đứt là trung vị",
size = 3, color = "grey30") +
labs(
title = "Khách mới có xu hướng chi trả cao hơn khách quay lại",
x = "Giá phòng trung bình mỗi ngày",
y = ""
) +
theme_ridges(font_family = "Roboto", grid = TRUE)
Giải thích kỹ thuật:
– (4): Layer chính vẽ hai đường cong mật độ. Hình dạng của mỗi đường cong cho thấy các mức giá nào là phổ biến nhất trong mỗi nhóm.
– (7): Một tính năng rất mạnh của ggridges. Nó tự động vẽ các đường thẳng đứng bên trong mỗi đường cong mật độ tại các điểm phân vị, giúp chúng ta so sánh chính xác các giá trị thống kê:
Đường ở giữa là trung vị (median).
Hai đường hai bên là phân vị thứ 25 và 75.
– (13): Thêm một lớp văn bản tĩnh để giải thích ý nghĩa của các đường nét đứt.
Giải thích ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Ridgeline là một công cụ mạnh mẽ để so sánh trực quan các hàm mật độ xác suất của nhiều nhóm. Nó cho phép chúng ta so sánh không chỉ các giá trị trung tâm mà còn cả hình dạng, độ lệch, và độ phân tán của các phân phối.
– Kinh tế: Đường trung vị của khách mới nằm ở bên phải cho thấy khách hàng lần đầu có xu hướng trả giá cao hơn. Hình dạng phân phối trải rộng của họ cho thấy họ có hành vi chi tiêu rất đa dạng từ các mức giá rất thấp đến rất cao. Đường cong của khách quay lại hẹp và có đỉnh nhọn, tập trung ở vùng giá thấp hơn. Điều này cho thấy khách hàng trung thành có hành vi chi tiêu đồng nhất hơn và tập trung vào phân khúc giá phải chăng.
ggplot(adr_by_hotel) +
geom_segment(
aes(x = 94, xend = 105, y = "ADR", yend = "ADR"), color = "grey", size = 2) +
geom_point(
aes(x = gia_trung_binh, y = "ADR", color = hotel), size = 8) +
geom_text(aes(x = gia_trung_binh, y = "ADR",
label = dollar(gia_trung_binh, 1, prefix="€")), color = "white") +
scale_color_brewer(palette = "Set1") +
labs(title = "Giá trung bình giữa hai khách sạn",
x = "Giá phòng trung bình (ADR)", y = "")
Giải thích kỹ thuật:
– (1): Dữ liệu đầu vào (adr_by_hotel) là một bảng đã được tính toán chứa giá trị trung bình của adr cho mỗi hotel.
– (2): Vẽ một đoạn thẳng duy nhất nối giữa hai giá trị trung bình (95 và 105).
– (3): Chỉ định tọa độ bắt đầu và kết thúc của đường thẳng. Chiều dài của đoạn thẳng này trực quan hóa mức độ chênh lệch giá.
– (4): Vẽ hai điểm tròn lớn.
– (5): Đặt mỗi điểm tại đúng giá trị trung bình của nó và gán màu sắc khác nhau cho City Hotel và Resort Hotel.
– (6) và (7): Thêm nhãn giá trị (dollar(…)) vào giữa mỗi điểm tròn.
– (8): Sử dụng một bảng màu được thiết kế sẵn để làm cho hai điểm nổi bật.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Dumbbell là một phương pháp trực quan hóa rất hiệu quả để so sánh hai giá trị điểm, trong trường hợp này là hai giá trị trung bình. Nó tập trung hoàn toàn vào việc làm nổi bật sự khác biệt và khoảng cách giữa hai nhóm.
– Kinh tế: Điểm của City Hotel (màu đỏ) nằm ở bên phải và có giá trị €105, trong khi điểm của Resort Hotel (màu xanh) nằm ở bên trái với giá trị €95. Điều này cho thấy City Hotel có định vị giá cao hơn so với Resort Hotel.
ggplot(cancellation_by_tier_city, aes(x = price_tier, y = ty_le_huy, group = 1)) +
geom_area(fill = "tomato", alpha = 0.5) +
geom_line(color = "red", linewidth = 1) +
geom_point(color = "red", size = 4) +
geom_text(aes(label = scales::percent(ty_le_huy, 1)), vjust = -0.7) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "Tỷ lệ hủy phòng theo cấp giá tại City Hotel",
x = "Cấp giá", y = "Tỷ lệ hủy"
)
Giải thích kỹ thuật:
– (1): Dữ liệu đã được lọc để chỉ chứa các quan sát của City Hotel và sau đó được nhóm theo price_tier để tính tỷ lệ hủy trung bình.
– (2): Vẽ biểu đồ diện tích, tô màu vùng diện tích dưới đường biểu diễn. Có alpha = 0.5 làm cho màu hơi trong suốt. Layer này giúp nhấn mạnh khối lượng hoặc quy mô của tỷ lệ hủy.
– (3): Vẽ một đường xu hướng đậm lên trên vùng diện tích giúp làm rõ hướng đi của dữ liệu.
– (4): Thêm các điểm tròn lớn tại mỗi cấp giá, giúp xác định chính xác vị trí và giá trị của dữ liệu.
– (5): Thêm nhãn phần trăm lên phía trên mỗi điểm (vjust = -0.7), giúp có được con số chính xác.
– (6): Định dạng trục Y để hiển thị dưới dạng phần trăm.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ diện tích kết hợp với đường là một phương pháp trực quan hóa mạnh mẽ, vừa thể hiện xu hướng vừa nhấn mạnh quy mô của một chuỗi dữ liệu có thứ tự.
– Kinh tế: Biểu đồ này thể hiện chi tiết hành vi hủy phòng bên trong City Hotel cho thấy một mối quan hệ nghịch đảo giữa giá và rủi ro hủy. Đường biểu diễn có xu hướng dốc xuống từ trái sang phải. Tỷ lệ hủy cao nhất ở nhóm giá thấp (46%) và giảm dần khi giá tăng lên, thấp nhất ở nhóm giá cao (39%). Đây là một thông tin rất quan trọng và có phần phản trực giác. Nó cho thấy rằng tại City Hotel, những khách hàng nhạy cảm về giá nhất lại là những người ít chắc chắn nhất về kế hoạch của họ.
ggplot(hotels_clean, aes(x = hotel, y = adr, fill = hotel)) +
geom_violin(trim = FALSE, show.legend = FALSE) +
geom_boxplot(width = 0.1, fill = "white") +
scale_y_log10(labels = dollar_format(prefix="€")) +
labs(
title = "So sánh phân phối giá phòng giữa hai Khách sạn",
x = "Loại khách sạn", y = "ADR (thang log)"
)
Giải thích kỹ thuật:
– (2): Vẽ hai biểu đồ Violin. Hình dạng chiều rộng của mỗi violin tại một mức giá nhất định thể hiện mật độ số lượng các lượt đặt phòng tại mức giá đó. Có trim = FALSE để violin hiển thị đầy đủ dải giá trị.
– (3): Vẽ một biểu đồ hộp nhỏ và hẹp (width = 0.1) chồng lên trên mỗi violin. Biểu đồ hộp này cung cấp các thông tin thống kê chính xác bao gồm trung vị (vạch giữa), khoảng tứ phân vị (hộp) và các giá trị ngoại lai.
– (4): Biến đổi trục Y sang thang đo logarit. Điều này rất hữu ích khi dữ liệu có phân phối lệch và nhiều giá trị ngoại lai, giúp nén các giá trị rất cao lại và kéo dãn các giá trị thấp, làm cho hình dạng phân phối tổng thể trở nên rõ ràng hơn.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Violin kết hợp Boxplot là một phương pháp trực quan hóa cực kỳ mạnh mẽ. Nó không chỉ so sánh các giá trị trung tâm như biểu đồ cột mà còn cho phép so sánh toàn bộ hình dạng phân phối của dữ liệu giữa các nhóm.
– Kinh tế: Violin của City Hotel phình to nhất và hộp boxplot nằm ở khoảng €100. Điều này cho thấy phần lớn lượt đặt phòng của City Hotel tập trung dày đặc ở mức giá trung cấp. Phân phối hai đỉnh Violin của Resort Hotel có hình dạng phức tạp hơn với hai phần phình to rõ rệt bao gồm một ở mức giá thấp hơn (khoảng €50-€70) và một ở mức giá cao hơn (khoảng €120-€150). Điều này cho thấy Resort Hotel đang phục vụ hai phân khúc khách hàng chính rất khác biệt gồm một nhóm lớn khách hàng nhạy cảm về giá, tìm kiếm các gói nghỉ dưỡng giá rẻ.
ggplot(adr_by_profile,
aes(x = reorder(guest_profile, adr_trung_binh), y = adr_trung_binh)) +
geom_col(aes(fill = adr_trung_binh), show.legend = FALSE) +
coord_flip() +
geom_text(aes(label = dollar(adr_trung_binh, 1, prefix="€")), hjust = 1.1,
color = "white") +
scale_fill_viridis_c() +
labs(
title = "Doanh thu trung bình theo phân khúc Khách hàng",
x = "Hồ sơ Khách hàng", y = "Giá phòng trung bình"
)
Giải thích kỹ thuật:
– (1): Dữ liệu đã được nhóm theo guest_profile và tính toán giá phòng trung bình (adr_trung_binh).
– (2): reorder() tự động sắp xếp các khách hàng trên trục x (trước khi xoay) dựa trên giá trị của adr_trung_binh từ thấp đến cao.
– (3): Vẽ biểu đồ cột với màu sắc được ánh xạ liên tục theo giá trị của adr_trung_binh.
– (4): Xoay biểu đồ 90 độ thành dạng cột ngang giúp các nhãn dài của hồ sơ khách hàng được hiển thị đầy đủ.
– (5): Thêm nhãn giá trị (dollar(…)) vào bên trong mỗi thanh cột. Có hjust = 1.1 đẩy nhãn về phía bên trái một chút để dễ đọc.
– (7): Áp dụng một dải màu gradient liên tục của viridis. Các giá trị thấp sẽ có màu tím đậm, các giá trị cao sẽ có màu vàng sáng giúp làm nổi bật các phân khúc có giá trị cao.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ cột ngang đã được sắp xếp và tô màu theo gradient là một phương pháp trực quan hóa rất hiệu quả để xếp hạng và so sánh các giá trị trung bình giữa nhiều nhóm phân loại. Màu sắc hoạt động như một kênh thông tin bổ sung để nhấn mạnh sự khác biệt.
– Kinh tế: Hai thanh dài nhất và có màu sáng nhất (vàng, xanh lá) đều thuộc về nhóm khách mới. Điều này cho thấy khách hàng lần đầu có xu hướng trả giá phòng cao hơn đáng kể so với khách quay lại. Phân khúc khách mới ở City Hotel là trọng tâm về mặt doanh thu với mức giá trung bình cao nhất là €106. Hai thanh ngắn nhất và có màu tối nhất đều thuộc về nhóm khách quay lại với mức giá trung bình chỉ khoảng €64-€65. Mặc dù khách quay lại rất đáng tin cậy (ít hủy phòng) nhưng họ lại có mức chi tiêu trên mỗi lượt đặt thấp hơn nhiều.
adr_summary_wide <- adr_summary_detailed %>%
pivot_wider(names_from = hotel, values_from = adr_trung_binh)
ggplot(adr_summary_wide, aes(y = price_tier)) +
geom_segment(aes(x = `City Hotel`, xend = `Resort Hotel`, yend = price_tier),
color = "grey", size = 1.5) +
geom_point(aes(x = `City Hotel`, color = "City Hotel"), size = 6) +
geom_point(aes(x = `Resort Hotel`, color = "Resort Hotel"), size = 6) +
scale_color_manual(name = "", values = c(
"City Hotel" = "#0072B2", "Resort Hotel" = "#D55E00")) +
labs(
title = "So sánh chiến lược giá theo từng phân khúc",
x = "Giá phòng trung bình", y = "Cấp giá"
)
Giải thích kỹ thuật:
– (1) và (2): Dữ liệu được tái cấu trúc sang dạng rộng bằng pivot_wider. Kết quả là một bảng mà mỗi hàng là một cấp giá và có các cột riêng cho City Hotel và Resort Hotel, chứa giá trung bình tương ứng. Đây là cấu trúc dữ liệu lý tưởng để vẽ biểu đồ dumbbell.
– (4): Vẽ một đoạn thẳng ngang cho mỗi cấp giá, nối giá trị của City Hotel với Resort Hotel. Chiều dài của đoạn thẳng này trực quan hóa mức độ chênh lệch giá trong từng phân khúc.
– (6) và (7): Vẽ hai lớp điểm riêng biệt, một cho City Hotel và một cho Resort Hotel, đặt chúng ở hai đầu của mỗi đoạn thẳng.
– (8): Tự định nghĩa màu sắc cho mỗi khách sạn để dễ phân biệt.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ Dumbbell này cho phép so sánh có điều kiện. Thay vì chỉ so sánh giá trung bình chung, chúng ta so sánh giá trung bình của hai khách sạn bên trong mỗi cấp giá. Đây là một phân tích sâu hơn về mối quan hệ tương tác giữa hotel và price_tier.
– Kinh tế: Ở hai cấp giá dưới, điểm màu xanh luôn nằm bên phải điểm màu cam. Ở thị trường đại chúng, City Hotel có khả năng định giá cao hơn. Ở cấp giá cao có một sự đảo ngược là điểm màu cam nằm xa về phía bên phải so với điểm màu xanh. Khoảng cách giữa chúng cũng là lớn nhất. Ở phân khúc cao cấp, Resort Hotel lại có khả năng định giá cao hơn đáng kể. Điều này cho thấy khách hàng sẵn sàng chi trả rất cao cho các trải nghiệm nghỉ dưỡng độc đáo mà Resort Hotel cung cấp, một lợi thế mà City Hotel không có.
p_lead_time <- ggplot(hotel_vs_lead_time_crosstab %>% pivot_longer
(-hotel, names_to="group", values_to="n"),
aes(x = hotel, y = n, fill = group)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = n),
position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
scale_y_continuous(labels = scales::comma_format()) +
labs(title = "Theo thời gian đặt", x = NULL, y = "Số lượng", fill = "Nhóm Lead Time") +
guides(fill = guide_legend(ncol = 1))
p_price_tier <- ggplot(hotel_vs_price_tier_crosstab %>% pivot_longer
(-hotel, names_to="group", values_to="n"),
aes(x = hotel, y = n, fill = group)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = n),
position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
scale_y_continuous(labels = scales::comma_format()) +
labs(title = "Theo cấp giá", x = NULL, y = NULL, fill = "Cấp giá") +
guides(fill = guide_legend(ncol = 1))
p_lead_time + p_price_tier +
plot_layout(guides = "collect") &
theme(legend.position = "bottom")
Giải thích kỹ thuật:
– (1) và (10): Tạo ra hai bảng tần suất chéo (hotel_vs_lead_time_crosstab và hotel_vs_price_tier_crosstab), sau đó dùng pivot_longer() để chuyển chúng sang dạng dài phù hợp cho việc vẽ.
– (4), (5) và (7): Một biểu đồ cột nhóm so sánh số lượng khách theo lead_time_group tại mỗi khách sạn.
– (13), (14) và (16): Một biểu đồ cột nhóm so sánh số lượng khách hàng theo price_tier tại mỗi khách sạn.
– (19): Toán tử + từ gói patchwork được dùng để đặt hai biểu đồ con cạnh nhau.
– (20): Một tùy chọn quan trọng của patchwork. Nó thu thập tất cả các chú giải từ các biểu đồ con và gộp chúng lại thành một chú giải chung duy nhất.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Kỹ thuật sử dụng patchwork để kết hợp nhiều biểu đồ là một phương pháp rất hiệu quả để trình bày các phân tích đa chiều trên cùng một không gian. Nó cho phép người xem so sánh các mẫu hình trên các khía cạnh khác nhau của dữ liệu.
– Kinh tế: Biểu đồ trái cho thấy ở cả hai khách sạn, nhóm đặt trước vừa phải luôn là nhóm đông nhất. Tuy nhiên, City Hotel có số lượng ở nhóm này vượt trội hơn hẳn. Resort Hotel có sự phân bổ cân bằng hơn giữa ba nhóm. Biểu đồ phải cho thấy City Hotel có một đỉnh rất cao ở nhóm giá trung bình, trong khi Resort Hotel lại có số lượng lớn nhất ở nhóm giá thấp. Điều này cho thấy hai khách sạn đang nhắm đến hai phân khúc giá cốt lõi khác nhau: City Hotel mạnh nhất ở thị trường đại chúng giá trung bình còn Resort Hotel lại có sức cạnh tranh tốt nhất ở thị trường nhạy cảm về giá.
profile_percentage_donut <- profile_percentage %>%
arrange(desc(guest_profile)) %>%
mutate(y_pos = cumsum(ty_trong) - 0.5*ty_trong)
ggplot(profile_percentage_donut, aes(x = 2, y = ty_trong, fill = guest_profile)) +
geom_col(width = 1, show.legend = TRUE) +
coord_polar(theta = "y") +
geom_text(aes(y = y_pos, label = percent(ty_trong, 1)), color = "white") +
xlim(0.5, 2.5) +
theme_void(base_family = "Roboto") +
labs(title = "Tỷ trọng các loại khách hàng ")
Giải thích kỹ thuật:
– (3): Tạo ra một cột y_pos để tính toán vị trí đặt nhãn văn bản. Công thức cumsum(ty_trong) - 0.5*ty_trong là một kỹ thuật chuẩn để đặt nhãn vào chính giữa của mỗi phần trong biểu đồ tròn.
– (5): Vẽ một biểu đồ cột chồng duy nhất, với x được cố định là 2 và y là tỷ trọng.
– (6): Đây là layer uốn cong biểu đồ cột chồng thành một biểu đồ tròn. Có theta = “y” nghĩa là giá trị trên trục y (ty_trong) sẽ được chuyển thành góc của mỗi phần.
– (7): Thêm nhãn phần trăm vào biểu đồ, sử dụng vị trí y_pos đã tính toán trước đó.
– (8): Đây là kỹ thuật để tạo ra lỗ ở giữa, biến biểu đồ tròn thành biểu đồ vòng. Nó giới hạn bán kính của biểu đồ, tạo ra một khoảng trống ở tâm.
– (9): Loại bỏ tất cả các yếu tố không cần thiết như trục, lưới, nền, làm cho biểu đồ trông sạch sẽ.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ vòng là một biến thể của biểu đồ tròn dùng để trực quan hóa cơ cấu tỷ trọng của một tổng thể. Nó cho thấy mỗi phần chiếm bao nhiêu phần trăm trong tổng số 100%.
– Kinh tế: Phần màu đỏ chiếm diện tích lớn nhất một cách áp đảo với 65%. Điều này cho thấy gần hai phần ba tổng số lượt đặt phòng đến từ một phân khúc duy nhất. Đây vừa là cốt lõi của hoạt động kinh doanh vừa là điểm rủi ro tập trung. Bất kỳ sự sụt giảm nào trong phân khúc này đều sẽ ảnh hưởng nghiêm trọng đến tổng thể. Thị trường của khách quay lại là rất nhỏ, chỉ chiếm tổng cộng 3%. Cho thấy lòng trung thành của khách hàng là một thị trường chưa được khai thác hiệu quả
final_summary_long <- final_summary_by_hotel %>%
mutate(across(where(is.numeric), ~round(., 2))) %>%
pivot_longer(-hotel, names_to = "ChiSo", values_to = "GiaTri")
ggplot(final_summary_long, aes(x = ChiSo, y = hotel, label = GiaTri)) +
geom_tile(aes(fill = hotel), alpha = 0.2) +
geom_text(size = 4, fontface = "bold") +
scale_fill_manual(values = c("lightblue", "lightgreen"), guide = "none") +
theme_minimal(base_family = "Roboto") +
theme(panel.grid = element_blank(), axis.text.x = element_text(angle=30, hjust=1)) +
labs(title = "Bảng điểm so sánh hiệu suất toàn diện", x = "Chỉ số", y = "")
Giải thích kỹ thuật:
– (2): Làm tròn tất cả các cột số đến 2 chữ số thập phân.
– (3): Tái cấu trúc bảng tóm tắt sang dạng dài, tạo ra các cột tên chỉ số và giá trị tương ứng. Đây là bước chuẩn bị quan trọng để ggplot có thể vẽ.
– (5): Đây là kỹ thuật chính. geom_tile vẽ một ô hình chữ nhật cho mỗi ô trong bảng dữ liệu. Chúng ta tô màu (fill) cho các ô này dựa trên hotel, tạo ra hai hàng có màu nền khác nhau, giúp phân biệt rõ ràng.
– (6): Thêm văn bản (giá trị của các chỉ số) vào chính giữa mỗi ô.
– (7): Tự định nghĩa màu nền cho hai khách sạn. Có guide = “none” để ẩn chú giải màu sắc.
– (8): Tạo một giao diện sạch sẽ.
– (9): Loại bỏ toàn bộ các đường lưới, làm cho biểu đồ trông giống một cái bảng thực sự và xoay nhãn của các chỉ số trên trục X để tránh bị chồng chéo.
Về mặt ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ này là một cách sáng tạo để trực quan hóa một bảng dữ liệu. Thay vì chỉ in ra một bảng kable tĩnh, phương pháp này sử dụng hệ thống đồ họa của ggplot để tạo ra một bảng điểm có tính thẩm mỹ cao hơn, có thể tùy chỉnh màu sắc, font chữ và các yếu tố khác một cách linh hoạt.
– Kinh tế: City Hotel có các chỉ số so_luong_dat, adr_trung_binh và lead_time_trung_binh cao hơn. Cho thấy City Hotel vượt trội về khả năng thu hút khách hàng, định giá cao hơn và thu hút được nhóm khách có kế hoạch sớm hơn. Đây là đầu tàu về mặt quy mô và doanh thu. Ngược lại, Resort Hotel có ty_le_huy thấp hơn và ty_le_khach_quay_lai cao hơn. Cho thấy Resort Hotel vượt trội về các chỉ số chất lượng. Khách hàng của họ đáng tin cậy hơn (ít hủy) và trung thành hơn (quay lại nhiều hơn).
– Thay vì một chính sách chung, cần áp dụng các chính sách đặt cọc và hủy phòng linh hoạt theo từng phân khúc. Cần có biện pháp chặt chẽ hơn cho các lượt đặt có rủi ro cao và nới lỏng hơn cho các nhóm an toàn.
– Tỷ lệ khách quay lại hiện tại rất thấp, cho thấy một tiềm năng lớn chưa được khai thác. Cần xây dựng các chương trình thành viên, ưu đãi cho lần đặt sau và các chiến dịch email marketing để biến khách hàng mới thành khách hàng trung thành, đặc biệt là nhóm khách đã có trải nghiệm tốt tại Resort Hotel.
– Phần phân tích này sử dụng bộ dữ liệu tài chính của một doanh nghiệp trong giai đoạn 10 năm (2015-2024). Để tập trung vào việc đánh giá cấu trúc tài sản và nợ, chọn ra một bộ 12 chỉ tiêu cốt lõi từ bảng cân đối kế toán. Bộ dữ liệu này cho phép chúng ta phân tích sự thay đổi trong cơ cấu tài sản, nguồn vốn và mức độ đòn bẩy tài chính của công ty qua các năm, từ đó hiểu rõ hơn về nền tảng và rủi ro trong cấu trúc vốn của doanh nghiệp.
mwg_raw <- read.csv2("D:/R/Dữ liệu ck.csv", header = TRUE, check.names = FALSE)
selected_cols_mwg_1 <- c(
"Năm",
"TÀI SẢN NGẮN HẠN",
"Hàng tồn kho 1",
"TÀI SẢN DÀI HẠN",
"Tài sản cố định",
"TỔNG CỘNG TÀI SẢN",
"NỢ PHẢI TRẢ",
"Nợ ngắn hạn",
"Vay ngắn hạn",
"Nợ dài hạn",
"Vay dài hạn",
"VỐN CHỦ SỞ HỮU"
)
mwg_focused_1 <- mwg_raw %>% select(all_of(selected_cols_mwg_1))
dim(mwg_focused_1)
## [1] 10 12
Giải thích kỹ thuật:
– (1): Trả về một vector số nguyên gồm hai phần tử: [số dòng, số cột] của một data frame.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Xác định tập dữ liệu có 10 quan sát và 12 biến, là một cấu trúc dữ liệu phù hợp để phân tích chuỗi thời gian.
– Kinh tế: Cho thấy chúng ta đang phân tích 12 chỉ tiêu chính về cấu trúc tài sản và nợ trong suốt một thập kỷ.
names(mwg_focused_1)
## [1] "Năm" "TÀI SẢN NGẮN HẠN" "Hàng tồn kho 1"
## [4] "TÀI SẢN DÀI HẠN" "Tài sản cố định" "TỔNG CỘNG TÀI SẢN"
## [7] "NỢ PHẢI TRẢ" "Nợ ngắn hạn" "Vay ngắn hạn"
## [10] "Nợ dài hạn" "Vay dài hạn" "VỐN CHỦ SỞ HỮU"
Giải thích kỹ thuật:
– (1): Trả về một vector chuỗi ký tự, chứa tên của tất cả các cột trong data frame.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một bước kiểm tra kỹ thuật để xác nhận rằng thao tác select() đã chọn đúng và đủ 12 biến cần thiết.
– Kinh tế: Cung cấp bảng mục lục các chỉ tiêu sẽ được phân tích, bao gồm các thành phần chính của tài sản, nợ phải trả và vốn chủ sở hữu.
glimpse(mwg_focused_1)
## Rows: 10
## Columns: 12
## $ Năm <int> 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 20…
## $ `TÀI SẢN NGẮN HẠN` <dbl> 65836422620040, 51950337976047, 44577607228189, 51…
## $ `Hàng tồn kho 1` <dbl> 22244676326705, 21824235626176, 25696077735282, 29…
## $ `TÀI SẢN DÀI HẠN` <dbl> 4601353101564, 8160899236677, 11256488385860, 1101…
## $ `Tài sản cố định` <dbl> 3586628664045, 6500135608914, 9727502911440, 96471…
## $ `TỔNG CỘNG TÀI SẢN` <dbl> 70437775721604, 60111237212724, 55834095614049, 62…
## $ `NỢ PHẢI TRẢ` <dbl> 42316198897749, 36751679245386, 31901514096473, 42…
## $ `Nợ ngắn hạn` <dbl> 42316198897749, 30765260553972, 26000264096473, 42…
## $ `Vay ngắn hạn` <dbl> 27300246721779, 19128541817781, 10688138631456, 24…
## $ `Nợ dài hạn` <dbl> NA, 5986418691414, NA, NA, 1126676666653, 11221366…
## $ `Vay dài hạn` <dbl> NA, 5985250000000, 5901250000000, NA, 112667666665…
## $ `VỐN CHỦ SỞ HỮU` <dbl> 28121576823855, 23359557967338, 23932581517576, 20…
Giải thích kỹ thuật:
– (1): Cung cấp một bản tóm tắt theo chiều dọc của data frame, hiển thị tên, kiểu dữ liệu và một vài giá trị mẫu của từng cột.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chẩn đoán kiểu dữ liệu của các biến. Nó cho thấy tất cả
các cột tài chính đều là biến số (
– Kinh tế: Xác nhận rằng dữ liệu đã sẵn sàng để thực hiện các phân tích tài chính định lượng như tính toán các tỷ số cấu trúc.
mwg_focused_1 %>% filter(grepl("2024", Năm))
## Năm TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Tài sản cố định
## 1 2024 65836422620040 22244676326705 4601353101564 3586628664045
## TỔNG CỘNG TÀI SẢN NỢ PHẢI TRẢ Nợ ngắn hạn Vay ngắn hạn Nợ dài hạn
## 1 70437775721604 42316198897749 42316198897749 27300246721779 NA
## Vay dài hạn VỐN CHỦ SỞ HỮU
## 1 NA 28121576823855
Giải thích kỹ thuật:
– (1): Lọc ra dòng có cột năm chứa chuỗi “2024”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Trích xuất một quan sát cụ thể để kiểm tra trực quan dữ liệu.
– Kinh tế: Cung cấp một bức ảnh chụp nhanh về tình hình tài sản và nợ của công ty tại thời điểm gần nhất.
mwg_focused_1 %>% tail(1)
## Năm TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Tài sản cố định
## 10 2015 6176432326364 4932684842299 1089329907510 849146989686
## TỔNG CỘNG TÀI SẢN NỢ PHẢI TRẢ Nợ ngắn hạn Vay ngắn hạn Nợ dài hạn
## 10 7265762233874 4782209545548 4782209545548 2052945972681 NA
## Vay dài hạn VỐN CHỦ SỞ HỮU
## 10 NA 2483552688326
Giải thích kỹ thuật:
– (1): Dùng để trích xuất dòng cuối cùng của một bảng dữ liệu.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tương tự head(), tail() là một công cụ để kiểm tra nhanh điểm cuối của tập dữ liệu.
– Kinh tế: Cung cấp thông tin về cấu trúc tài chính tại điểm khởi đầu của giai đoạn phân tích, tạo cơ sở để so sánh sự tăng trưởng và thay đổi sau một thập kỷ.
mwg_focused_1 %>%
select(Năm, `TỔNG CỘNG TÀI SẢN`) %>%
format_table1()
| Năm | TỔNG CỘNG TÀI SẢN |
|---|---|
| 2024 | 70.437.775.721.604 |
| 2023 | 60.111.237.212.724 |
| 2022 | 55.834.095.614.049 |
| 2021 | 62.971.404.814.942 |
| 2020 | 46.030.879.952.454 |
| 2019 | 41.708.095.544.883 |
| 2018 | 28.122.531.486.856 |
| 2017 | 22.822.664.215.220 |
| 2016 | 14.854.263.232.991 |
| 2015 | 7.265.762.233.874 |
Giải thích kỹ thuật:
– (1): Dùng để chọn ra hai cột cụ thể: Năm và TỔNG CỘNG TÀI SẢN.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một chuỗi thời gian đơn biến, là đầu vào tiêu chuẩn cho các phân tích xu hướng.
– Kinh tế: Tách riêng chỉ số quan trọng nhất về quy mô của công ty giúp tập trung phân tích vào tốc độ tăng trưởng tổng tài sản qua các năm.
mwg_cleaned_temp_1 <- mwg_focused_1 %>%
mutate(across(-Năm, ~as.numeric(gsub("\\.", "", ., fixed = TRUE))))
summary(mwg_cleaned_temp_1 %>% select(`TỔNG CỘNG TÀI SẢN`, `NỢ PHẢI TRẢ`, `VỐN CHỦ SỞ HỮU`))
## TỔNG CỘNG TÀI SẢN NỢ PHẢI TRẢ VỐN CHỦ SỞ HỮU
## Min. : 7265762233870 Min. : 4782209545550 Min. : 2483552688330
## 1st Qu.:24147631033100 1st Qu.:17470184948900 1st Qu.: 6677446084250
## Median :43869487748700 Median :30056870228300 Median :13812641020400
## Mean :41015871003000 Mean :26552465059900 Mean :14463410643100
## 3rd Qu.:59041951813100 3rd Qu.:35539137958200 3rd Qu.:22614229975500
## Max. :70437775721600 Max. :42593158815100 Max. :28121576823900
Giải thích kỹ thuật:
– (2): Chuyển đổi tất cả các cột (trừ năm) sang dạng số để summary() có thể tính toán.
– (3): Chọn ra 3 cột chính và summary() tính toán các đại lượng thống kê mô tả.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Cung cấp các thống kê mô tả để hiểu về khuynh hướng trung tâm và độ phân tán của các biến cốt lõi.
– Kinh tế: Tài sản tối thiểu chỉ là ~7,265 nghìn tỷ, trong khi tối đa lên tới ~70,437 nghìn tỷ. Trung bình thấp hơn trung vị, cho thấy quá trình tăng trưởng đã tăng tốc mạnh mẽ trong những năm gần đây. Nợ phải trả cũng tăng trưởng với quy mô rất lớn, từ ~4,782 nghìn tỷ lên đến ~42,593 nghìn tỷ. Điều này cho thấy chiến lược tăng trưởng của công ty được tài trợ chủ yếu bằng nợ. Vốn chủ sở hữu cũng cho thấy sự tăng trưởng mạnh mẽ qua 10 năm, tăng hơn 11 lần từ mức thấp nhất đến mức cao nhất. Điều này cho thấy công ty không chỉ đi vay mà còn có khả năng tích lũy lợi nhuận và có thể đã huy động thêm vốn từ cổ đông, tạo ra một nền tảng vốn ngày càng vững chắc.
mwg_cleaned_temp_1 %>%
arrange(desc(`TỔNG CỘNG TÀI SẢN`)) %>%
select(Năm, `TỔNG CỘNG TÀI SẢN`) %>%
head(1) %>%
format_table1()
| Năm | TỔNG CỘNG TÀI SẢN |
|---|---|
| 2024 | 70.437.775.721.604 |
Giải thích kỹ thuật:
– (2): Sắp xếp data frame theo cột TỔNG CỘNG TÀI SẢN với thứ tự giảm dần.
– (4): Lấy ra dòng đầu tiên sau khi đã sắp xếp, tức là dòng có giá trị lớn nhất.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Xác định giá trị lớn nhất và quan sát tương ứng trong tập dữ liệu.
– Kinh tế: Tìm ra năm mà công ty đạt quy mô lớn nhất là 2024, thể hiện đỉnh cao của quá trình tăng trưởng tài sản.
mwg_cleaned_temp_1 %>%
arrange(`VỐN CHỦ SỞ HỮU`) %>%
select(Năm, `VỐN CHỦ SỞ HỮU`) %>%
head(1) %>%
format_table1()
| Năm | VỐN CHỦ SỞ HỮU |
|---|---|
| 2015 | 2.483.552.688.326 |
Giải thích kỹ thuật:
– (2): Sắp xếp data frame theo cột VỐN CHỦ SỞ HỮU với thứ tự tăng dần.
– (4): Lấy ra dòng đầu tiên, tức là dòng có giá trị nhỏ nhất.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Xác định giá trị nhỏ nhất và quan sát tương ứng.
– Kinh tế: Tìm ra năm công ty có nền tảng vốn yếu nhất là 2015, tạo bối cảnh để phân tích sự tăng trưởng và tích lũy vốn chủ sở hữu sau đó.
colSums(is.na(mwg_focused_1))
## Năm TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN
## 0 0 0 0
## Tài sản cố định TỔNG CỘNG TÀI SẢN NỢ PHẢI TRẢ Nợ ngắn hạn
## 0 0 0 0
## Vay ngắn hạn Nợ dài hạn Vay dài hạn VỐN CHỦ SỞ HỮU
## 0 5 4 0
Giải thích kỹ thuật:
– (1): Tạo ra một ma trận logic (TRUE/FALSE) để đánh dấu các ô bị thiếu giá trị và tính tổng số lượng TRUE theo từng cột.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Kiểm tra tính toàn vẹn dữ liệu của tập dữ liệu đã chọn.
– Kinh tế: Có một vài chỉ tiêu có giá trị NA như nợ dài hạn (5 năm) và vay dài hạn (4 năm). Trong báo cáo tài chính, một ô trống thường có nghĩa là hoạt động đó không phát sinh trong năm đó thay vì giá trị bằng 0. Việc nợ dài hạn bị thiếu dữ liệu trong 5 năm có thể hiểu là trong 5 năm đó công ty không có bất kỳ khoản nợ dài hạn nào. Cho thấy công ty có thể đã có giai đoạn chỉ sử dụng nợ ngắn hạn để tài trợ.
data_cleaned_assets <- mwg_focused_1 %>%
mutate(Nam = as.integer(str_extract(Năm, "\\d{4}")))
table1 <- data_cleaned_assets %>%
select(1, 2, 3, 4, 13)
print(head(table1, 6))
## Năm TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Nam
## 1 2024 65836422620040 22244676326705 4601353101564 2024
## 2 2023 51950337976047 21824235626176 8160899236677 2023
## 3 2022 44577607228189 25696077735282 11256488385860 2022
## 4 2021 51955257770657 29167232293922 11016147044285 2021
## 5 2020 37317233970267 19422177452674 8713645982187 2020
## 6 2019 35011896908246 25745428436580 6696198636637 2019
Giải thích kỹ thuật:
– (2): Tạo một cột mới tên là Nam, chuyển đổi chuỗi ký tự vừa trích xuất thành dạng số nguyên và dùng biểu thức chính quy \d{4} (4 chữ số) để trích xuất chuỗi “2024” từ chuỗi “năm 2024” trong cột năm.
– (4): Trích xuất các cột cần thể hiện vào bài.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuyển đổi một biến định danh dạng chữ thành một biến số, là điều kiện bắt buộc để R hiểu đây là một trục thời gian cho việc sắp xếp và vẽ biểu đồ.
– Kinh tế: Chuẩn hóa biến thời gian, cho phép phân tích xu hướng và tăng trưởng một cách chính xác.
data_cleaned_assets <- data_cleaned_assets %>%
mutate(across(.cols = -c(Năm, Nam), ~ as.numeric(gsub("\\.", "", ., fixed = TRUE))))
table2 <- data_cleaned_assets %>%
select(1, 2, 3, 4, 13)
print(head(table2, 6))
## Năm TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Nam
## 1 2024 65836422620040 22244676326705 4601353101564 2024
## 2 2023 51950337976047 21824235626176 8160899236677 2023
## 3 2022 44577607228189 25696077735282 11256488385860 2022
## 4 2021 51955257770657 29167232293922 11016147044285 2021
## 5 2020 37317233970267 19422177452674 8713645982187 2020
## 6 2019 35011896908246 25745428436580 6696198636637 2019
Giải thích kỹ thuật:
– (2): Áp dụng một hàm lên nhiều cột cùng lúc trừ cột năm và cột Nam. Một hàm ẩn danh (~). Đầu tiên, gsub() loại bỏ tất cả các dấu chấm (.) ngăn cách hàng nghìn. Sau đó, as.numeric() chuyển chuỗi đã làm sạch thành số.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Đây là bước chuyển đổi kiểu dữ liệu quan trọng nhất, đảm bảo rằng đã biến các cột character thành các biến số numeric, mở khóa khả năng thực hiện mọi phép toán thống kê.
– Kinh tế: Kích hoạt toàn bộ dữ liệu tài chính, biến chúng từ chuỗi ký tự thành những con số có thể dùng để tính toán các tỷ số cấu trúc.
data_cleaned_assets <- data_cleaned_assets %>%
mutate(across(where(is.numeric), ~replace_na(., 0)))
table3 <- data_cleaned_assets %>%
select(1, 10, 11, 13)
print(table3)
## Năm Nợ dài hạn Vay dài hạn Nam
## 1 2024 0 0 2024
## 2 2023 5986418691414 5985250000000 2023
## 3 2022 0 5901250000000 2022
## 4 2021 0 0 2021
## 5 2020 1126676666653 1126676666653 2020
## 6 2019 1122136666657 1122136666657 2019
## 7 2018 1210063151888 1208167140389 2018
## 8 2017 1199932994830 1199932994830 2017
## 9 2016 0 0 2016
## 10 2015 0 0 2015
Giải thích kỹ thuật:
– (2): Áp dụng một hàm lên tất cả các cột có kiểu dữ liệu là số. Một hàm ẩn danh, thay thế tất cả các giá trị NA trong cột đang được xử lý (.) bằng số 0.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một kỹ thuật xử lý dữ liệu bị thiếu, đảm bảo các phép tính sau này không bị lỗi NA.
– Kinh tế: Dựa trên giả định rằng một ô trống trong báo cáo tài chính có nghĩa là hoạt động đó không phát sinh (giá trị bằng 0), giúp dữ liệu trở nên hoàn chỉnh.
data_cleaned_assets <- data_cleaned_assets %>%
select(-Năm)
table4 <- data_cleaned_assets %>%
select(1, 2, 3, 4, 12)
print(head(table4, 6))
## TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Tài sản cố định Nam
## 1 65836422620040 22244676326705 4601353101564 3586628664045 2024
## 2 51950337976047 21824235626176 8160899236677 6500135608914 2023
## 3 44577607228189 25696077735282 11256488385860 9727502911440 2022
## 4 51955257770657 29167232293922 11016147044285 9647168873232 2021
## 5 37317233970267 19422177452674 8713645982187 7294961666136 2020
## 6 35011896908246 25745428436580 6696198636637 5403776988921 2019
Giải thích kỹ thuật:
– (2): Hàm select với dấu - phía trước tên cột dùng để loại bỏ cột đó ra khỏi data frame.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một bước dọn dẹp, loại bỏ cột thông tin thừa và trùng lặp.
– Kinh tế: Giúp bảng dữ liệu phân tích trở nên chuyên nghiệp và rõ ràng, chỉ giữ lại cột Nam (số) làm định danh thời gian.
data_cleaned_assets <- data_cleaned_assets %>%
arrange(Nam)
table5 <- data_cleaned_assets %>%
select(1, 2, 3, 4, 12)
print(table5)
## TÀI SẢN NGẮN HẠN Hàng tồn kho 1 TÀI SẢN DÀI HẠN Tài sản cố định Nam
## 1 6176432326364 4932684842299 1089329907510 849146989686 2015
## 2 12288142407269 9370731749778 2566120825722 2096423249031 2016
## 3 18862861306281 12050162650982 3959802908939 3463657994935 2017
## 4 23371994756394 17446005298981 4750536730462 3333147659602 2018
## 5 35011896908246 25745428436580 6696198636637 5403776988921 2019
## 6 37317233970267 19422177452674 8713645982187 7294961666136 2020
## 7 51955257770657 29167232293922 11016147044285 9647168873232 2021
## 8 44577607228189 25696077735282 11256488385860 9727502911440 2022
## 9 51950337976047 21824235626176 8160899236677 6500135608914 2023
## 10 65836422620040 22244676326705 4601353101564 3586628664045 2024
Giải thích kỹ thuật:
– (2): Sắp xếp lại toàn bộ các dòng của data frame dựa trên giá trị của cột Nam theo thứ tự tăng dần.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Thiết lập một trật tự thời gian chính xác cho các quan sát.
– Kinh tế: Đảm bảo câu chuyện tài chính của công ty được phân tích và trình bày theo đúng trình tự thời gian.
analytical_df_assets <- data_cleaned_assets %>%
mutate(TyLeNo_Tren_TaiSan = `NỢ PHẢI TRẢ` / `TỔNG CỘNG TÀI SẢN`)
kable(analytical_df_assets %>% select(Nam, TyLeNo_Tren_TaiSan))
| Nam | TyLeNo_Tren_TaiSan |
|---|---|
| 2015 | 0.6581842 |
| 2016 | 0.7413970 |
| 2017 | 0.7410944 |
| 2018 | 0.6805752 |
| 2019 | 0.7088444 |
| 2020 | 0.6636673 |
| 2021 | 0.6763889 |
| 2022 | 0.5713626 |
| 2023 | 0.6113945 |
| 2024 | 0.6007600 |
Giải thích kỹ thuật:
– (2): Tạo một cột mới bằng cách thực hiện phép chia giữa hai cột có sẵn. Dấu `` (backticks) là cần thiết để bao quanh các tên cột có chứa khoảng trắng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một biến tỷ lệ mới là một dạng chuẩn hóa dữ liệu, giúp so sánh mức độ nợ qua các năm một cách công bằng.
– Kinh tế: Trong suốt 10 năm, tỷ lệ này luôn ở mức rất cao, dao động từ 57% đến 74%. Điều này cho thấy công ty sử dụng một lượng nợ vay rất lớn để tài trợ cho hoạt động và tăng trưởng. Tỷ lệ này có xu hướng giảm dần từ đỉnh điểm ~74% năm 2016-2017 xuống còn 60% vào năm 2024, đặc biệt là có sự sụt giảm mạnh vào năm 2022. Đây là một tín hiệu tích cực, cho thấy công ty đang dần trưởng thành hơn về mặt tài chính. Ban lãnh đạo có thể đang chủ động giảm bớt sự phụ thuộc vào nợ vay để củng cố bảng cân đối kế toán và giảm rủi ro tài chính.
analytical_df_assets <- analytical_df_assets %>%
mutate(TyLeTonKho_Tren_TSNH = `Hàng tồn kho 1` / `TÀI SẢN NGẮN HẠN`)
kable(analytical_df_assets %>% select(Nam, TyLeTonKho_Tren_TSNH))
| Nam | TyLeTonKho_Tren_TSNH |
|---|---|
| 2015 | 0.7986301 |
| 2016 | 0.7625833 |
| 2017 | 0.6388301 |
| 2018 | 0.7464491 |
| 2019 | 0.7353337 |
| 2020 | 0.5204613 |
| 2021 | 0.5613913 |
| 2022 | 0.5764347 |
| 2023 | 0.4200980 |
| 2024 | 0.3378780 |
Giải thích kỹ thuật:
– (2): Tạo một cột mới bằng cách thực hiện phép chia giữa hai cột có sẵn. Dấu `` (backticks) là cần thiết để bao quanh các tên cột có chứa khoảng trắng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một biến tỷ lệ để phân tích cơ cấu.
– Kinh tế: Tỷ lệ này luôn ở mức rất cao, cho thấy hàng tồn kho chiếm một phần rất lớn trong tổng tài sản ngắn hạn. Phần lớn vốn lưu động của công ty bị giam trong hàng hóa dự trữ để bán, tiềm ẩn rủi ro về thanh khoản và lỗi thời. Có một xu hướng giảm rất mạnh và rõ rệt của tỷ lệ này, từ gần 80% vào năm 2015 xuống chỉ còn khoảng 34% vào năm 2024. Đây là một tín hiệu cực kỳ tích cực về hiệu quả quản lý. Nó cho thấy công ty đã cải thiện đáng kể việc quản lý hàng tồn kho và vòng quay vốn.
analytical_df_assets <- analytical_df_assets %>%
mutate(TongVay = `Vay ngắn hạn` + `Vay dài hạn`) %>%
mutate(TyLeVay_Tren_TongNo = TongVay / `NỢ PHẢI TRẢ`)
kable(analytical_df_assets %>% select(Nam, TyLeVay_Tren_TongNo))
| Nam | TyLeVay_Tren_TongNo |
|---|---|
| 2015 | 0.4292882 |
| 2016 | 0.4348527 |
| 2017 | 0.4022431 |
| 2018 | 0.3680673 |
| 2019 | 0.4787204 |
| 2020 | 0.5483568 |
| 2021 | 0.5786721 |
| 2022 | 0.5200188 |
| 2023 | 0.6833373 |
| 2024 | 0.6451488 |
Giải thích kỹ thuật:
– (2) và (3): Lệnh đầu tiên tạo ra cột tổng hợp TongVay, lệnh thứ hai sử dụng cột mới này để tính toán tỷ lệ.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Là một ví dụ về việc tạo biến phái sinh qua nhiều bước.
– Kinh tế: Có một xu hướng tăng rõ rệt của tỷ lệ này, từ ~36-43% trong giai đoạn đầu lên đến ~64-68% trong hai năm gần nhất. Điều này cho thấy cơ cấu nợ của công ty đang thay đổi. Tỷ trọng của các khoản vay có tính lãi ngày càng tăng lên, trong khi tỷ trọng của các khoản chiếm dụng vốn có thể đang giảm xuống.
data_long_assets <- analytical_df_assets %>%
pivot_longer(
cols = -Nam,
names_to = "ChiTieu",
values_to = "GiaTri"
)
kable(head(data_long_assets, 6))
| Nam | ChiTieu | GiaTri |
|---|---|---|
| 2015 | TÀI SẢN NGẮN HẠN | 6176432326364 |
| 2015 | Hàng tồn kho 1 | 4932684842299 |
| 2015 | TÀI SẢN DÀI HẠN | 1089329907510 |
| 2015 | Tài sản cố định | 849146989686 |
| 2015 | TỔNG CỘNG TÀI SẢN | 7265762233874 |
| 2015 | NỢ PHẢI TRẢ | 4782209545548 |
Giải thích kỹ thuật:
– (2): Xoay data frame từ dạng rộng sang dạng dài chỉ có cột ChiTieu và GiaTri.
– (3): Áp dụng cho tất cả các cột trừ cột Nam.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuyển đổi dữ liệu sang định dạng dữ liệu nhỏ, là cấu trúc chuẩn tối ưu cho việc nhóm, tổng hợp và vẽ biểu đồ.
– Kinh tế: Cấu trúc này cho phép trả lời các câu hỏi phân tích một cách linh hoạt, đặc biệt là khi vẽ các biểu đồ so sánh.
data_long_assets %>%
filter(ChiTieu %in% c("NỢ PHẢI TRẢ", "VỐN CHỦ SỞ HỮU")) %>%
format_table()
| Nam | ChiTieu | GiaTri |
|---|---|---|
| 2015 | NỢ PHẢI TRẢ | 4.782.209.545.548 |
| 2015 | VỐN CHỦ SỞ HỮU | 2.483.552.688.326 |
| 2016 | NỢ PHẢI TRẢ | 11.012.905.506.628 |
| 2016 | VỐN CHỦ SỞ HỮU | 3.841.357.726.363 |
| 2017 | NỢ PHẢI TRẢ | 16.913.747.880.005 |
| 2017 | VỐN CHỦ SỞ HỮU | 5.908.916.335.215 |
| 2018 | NỢ PHẢI TRẢ | 19.139.496.155.514 |
| 2018 | VỐN CHỦ SỞ HỮU | 8.983.035.331.342 |
| 2019 | NỢ PHẢI TRẢ | 29.564.550.350.530 |
| 2019 | VỐN CHỦ SỞ HỮU | 12.143.592.194.353 |
| 2020 | NỢ PHẢI TRẢ | 30.549.190.106.022 |
| 2020 | VỐN CHỦ SỞ HỮU | 15.481.689.846.432 |
| 2021 | NỢ PHẢI TRẢ | 42.593.158.815.096 |
| 2021 | VỐN CHỦ SỞ HỮU | 20.378.245.999.846 |
| 2022 | NỢ PHẢI TRẢ | 31.901.514.096.473 |
| 2022 | VỐN CHỦ SỞ HỮU | 23.932.581.517.576 |
| 2023 | NỢ PHẢI TRẢ | 36.751.679.245.386 |
| 2023 | VỐN CHỦ SỞ HỮU | 23.359.557.967.338 |
| 2024 | NỢ PHẢI TRẢ | 42.316.198.897.749 |
| 2024 | VỐN CHỦ SỞ HỮU | 28.121.576.823.855 |
Giải thích kỹ thuật:
– (2): Lọc và chỉ giữ lại các hàng có ChiTieu là “NỢ PHẢI TRẢ” hoặc “VỐN CHỦ SỞ HỮU” từ bảng data_long_assets.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Trích xuất một tập dữ liệu con để chuẩn bị cho một phân tích hoặc trực quan hóa cụ thể.
– Kinh tế: Chuẩn bị dữ liệu để trực quan hóa hai thành phần chính của nguồn vốn. Dữ liệu này sẵn sàng để vẽ biểu đồ, minh họa cách công ty tài trợ cho tài sản của mình bằng nợ hay vốn chủ sở hữu qua các năm.
desc_stats_balance_sheet <- analytical_df_assets %>%
select(
`TỔNG CỘNG TÀI SẢN`,
`NỢ PHẢI TRẢ`,
`VỐN CHỦ SỞ HỮU`
) %>%
summary()
kable(desc_stats_balance_sheet)
| TỔNG CỘNG TÀI SẢN | NỢ PHẢI TRẢ | VỐN CHỦ SỞ HỮU | |
|---|---|---|---|
| Min. : 7265762233870 | Min. : 4782209545550 | Min. : 2483552688330 | |
| 1st Qu.:24147631033100 | 1st Qu.:17470184948900 | 1st Qu.: 6677446084250 | |
| Median :43869487748700 | Median :30056870228300 | Median :13812641020400 | |
| Mean :41015871003000 | Mean :26552465059900 | Mean :14463410643100 | |
| 3rd Qu.:59041951813100 | 3rd Qu.:35539137958200 | 3rd Qu.:22614229975500 | |
| Max. :70437775721600 | Max. :42593158815100 | Max. :28121576823900 |
Giải thích kỹ thuật:
– (2): Chọn ra 3 cột số quan trọng (TỔNG CỘNG TÀI SẢN, NỢ PHẢI TRẢ, VỐN CHỦ SỞ HỮU) từ bảng analytical_df_assets.
– (7): Áp dụng lên data frame đã chọn, hàm này sẽ tự động tính toán 6 đại lượng thống kê mô tả cho mỗi cột.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Cung cấp cái nhìn tổng quan về khuynh hướng trung tâm và độ phân tán của các biến chính, là bước đầu tiên của phân tích dữ liệu.
– Kinh tế: Tài sản tối thiểu chỉ là ~72,657 nghìn tỷ, trong khi tối đa lên tới ~704,377 nghìn tỷ cho thấy quá trình tăng trưởng đã tăng tốc mạnh mẽ trong những năm gần đây. Nợ phải trả cũng tăng trưởng với quy mô rất lớn, từ ~47,822 nghìn tỷ lên đến ~425,931 nghìn tỷ. Điều này cho thấy chiến lược tăng trưởng của công ty được tài trợ chủ yếu bằng nợ. Vốn chủ sở hữu cũng cho thấy sự tăng trưởng mạnh mẽ qua 10 năm, tăng hơn 11 lần từ mức thấp nhất đến mức cao nhất. Điều này cho thấy công ty không chỉ đi vay mà còn có khả năng tích lũy lợi nhuận và có thể đã huy động thêm vốn từ cổ đông.
total_assets_growth <- analytical_df_assets %>%
mutate(TangTruong_TaiSan_Pct = (`TỔNG CỘNG TÀI SẢN` / lag(`TỔNG CỘNG TÀI SẢN`) - 1) * 100) %>%
select(Nam, TangTruong_TaiSan_Pct)
kable(total_assets_growth)
| Nam | TangTruong_TaiSan_Pct |
|---|---|
| 2015 | NA |
| 2016 | 104.441912 |
| 2017 | 53.643865 |
| 2018 | 23.221948 |
| 2019 | 48.308468 |
| 2020 | 10.364377 |
| 2021 | 36.802522 |
| 2022 | -11.334207 |
| 2023 | 7.660448 |
| 2024 | 17.179048 |
Giải thích kỹ thuật:
– (2): Tạo một cột mới là TangTruong_TaiSan_Pct. Có lag là giá trị của tổng cộng tài sản từ dòng trước đó. Phép tính (Giá trị hiện tại / lag(Giá trị) - 1) * 100 là công thức tính phần trăm tăng trưởng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một chuỗi thời gian mới về tốc độ thay đổi của một biến số, giúp phân tích xu hướng tăng trưởng thay vì chỉ xem xét giá trị tuyệt đối.
– Kinh tế: Công ty ghi nhận tốc độ tăng trưởng tài sản cực kỳ cao từ 104% năm 2016 và duy trì ở mức rất cao trong các năm sau đó (53%, 23%, 48%). Tốc độ tăng trưởng chậm lại đáng kể và lần đầu tiên ghi nhận mức tăng trưởng âm (-11.3%) vào năm 2022. Cho thấy công ty đã bắt đầu giảm tốc. Đặc biệt năm 2022 công ty đã thu hẹp quy mô tài sản của mình. Tốc độ tăng trưởng quay trở lại mức dương nhưng ở mức độ khiêm tốn và bền vững hơn (7.6% và 17.1%). Sau giai đoạn tái cơ cấu, công ty đã quay lại quỹ đạo tăng trưởng nhưng với một tốc độ chậm rãi và có kiểm soát hơn.
equity_growth <- analytical_df_assets %>%
mutate(TangTruong_VCSH_Pct = (`VỐN CHỦ SỞ HỮU` / lag(`VỐN CHỦ SỞ HỮU`) - 1) * 100) %>%
select(Nam, TangTruong_VCSH_Pct)
kable(equity_growth)
| Nam | TangTruong_VCSH_Pct |
|---|---|
| 2015 | NA |
| 2016 | 54.671884 |
| 2017 | 53.823641 |
| 2018 | 52.025089 |
| 2019 | 35.183618 |
| 2020 | 27.488552 |
| 2021 | 31.628047 |
| 2022 | 17.441813 |
| 2023 | -2.394324 |
| 2024 | 20.385740 |
Giải thích kỹ thuật:
– (2): Tạo một cột mới là TangTruong_VCSH_Pct. Có lag là giá trị của vốn chủ sở hữu từ dòng trước đó. Phép tính (Giá trị hiện tại / lag(Giá trị) - 1) * 100 là công thức tính phần trăm tăng trưởng.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo một chuỗi thời gian khác về tốc độ thay đổi để so sánh.
– Kinh tế: Tốc độ tăng trưởng vốn chủ sở hữu (VCSH) đạt mức cực kỳ cao và ổn định, luôn trên 50% mỗi năm. Từ năm 2019 trở đi, tốc độ tăng trưởng VCSH có xu hướng chậm lại đáng kể so với giai đoạn đầu. Khi quy mô công ty ngày càng lớn, việc duy trì tốc độ tăng trưởng cao trở nên khó khăn hơn. Năm 2023 là năm duy nhất ghi nhận tăng trưởng VCSH âm (-2.3%). Đây là một dấu hiệu không tốt cho thấy trong năm đó, công ty có thể đã kinh doanh không có lãi hoặc đã chi trả cổ tức/mua lại cổ phiếu với số tiền lớn hơn cả lợi nhuận tạo ra.
analytical_df_assets %>%
select(Nam, `TÀI SẢN NGẮN HẠN`, `TÀI SẢN DÀI HẠN`) %>%
format_table()
| Nam | TÀI SẢN NGẮN HẠN | TÀI SẢN DÀI HẠN |
|---|---|---|
| 2015 | 6.176.432.326.364 | 1.089.329.907.510 |
| 2016 | 12.288.142.407.269 | 2.566.120.825.722 |
| 2017 | 18.862.861.306.281 | 3.959.802.908.939 |
| 2018 | 23.371.994.756.394 | 4.750.536.730.462 |
| 2019 | 35.011.896.908.246 | 6.696.198.636.637 |
| 2020 | 37.317.233.970.267 | 8.713.645.982.187 |
| 2021 | 51.955.257.770.657 | 11.016.147.044.285 |
| 2022 | 44.577.607.228.189 | 11.256.488.385.860 |
| 2023 | 51.950.337.976.047 | 8.160.899.236.677 |
| 2024 | 65.836.422.620.040 | 4.601.353.101.564 |
Giải thích kỹ thuật:
– (2): Chọn ra 3 cột là “Nam”, “TÀI SẢN NGẮN HẠN”, “TÀI SẢN DÀI HẠN” để tạo một bảng dữ liệu con, tập trung vào việc so sánh hai thành phần của tài sản.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị một tập dữ liệu con sạch sẽ, chỉ chứa hai chuỗi thời gian cần so sánh trực tiếp, là đầu vào lý tưởng cho biểu đồ đường kép hoặc biểu đồ cột nhóm.
– Kinh tế: Trong tất cả 10 năm, giá trị của tài sản ngắn hạn luôn lớn hơn nhiều lần so với tài sản dài hạn. Điều này cho thấy mô hình kinh doanh của công ty có tính thâm dụng vốn lưu động rất cao. Phần lớn tài sản của công ty là các khoản mục ngắn hạn như tiền, hàng tồn kho và các khoản phải thu. Đây là đặc điểm điển hình của các doanh nghiệp bán lẻ hoặc thương mại.
analytical_df_assets %>%
select(Nam, `Nợ ngắn hạn`, `Nợ dài hạn`) %>%
format_table()
| Nam | Nợ ngắn hạn | Nợ dài hạn |
|---|---|---|
| 2015 | 4.782.209.545.548 | 0 |
| 2016 | 11.012.905.506.628 | 0 |
| 2017 | 15.713.814.885.175 | 1.199.932.994.830 |
| 2018 | 17.929.433.003.626 | 1.210.063.151.888 |
| 2019 | 28.442.396.683.873 | 1.122.136.666.657 |
| 2020 | 29.422.513.439.369 | 1.126.676.666.653 |
| 2021 | 42.593.158.815.096 | 0 |
| 2022 | 26.000.264.096.473 | 0 |
| 2023 | 30.765.260.553.972 | 5.986.418.691.414 |
| 2024 | 42.316.198.897.749 | 0 |
Giải thích kỹ thuật:
– (2): Chọn ra 3 cột là “Nam”, “Nợ ngắn hạn”, “Nợ dài hạn” để tạo một bảng dữ liệu con, tập trung vào việc so sánh hai thành phần của tài sản.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị một tập dữ liệu con khác để so sánh hai chuỗi thời gian.
– Kinh tế: Trong tất cả 10 năm, giá trị của nợ ngắn hạn lớn hơn rất nhiều so với nợ dài hạn. Trong nhiều năm (2015, 2016, 2021, 2022, 2024), nợ dài hạn thậm chí còn bằng 0. Có một giai đoạn 4 năm công ty đã sử dụng một lượng nợ dài hạn đáng kể (2017-2020). Đây có thể là giai đoạn công ty thực hiện các dự án đầu tư lớn, cần nguồn vốn ổn định hơn. Tuy nhiên, việc nợ dài hạn biến mất trong những năm gần đây cho thấy công ty đã quay trở lại với chiến lược sử dụng nợ ngắn hạn là chủ yếu.
data_long_assets %>%
filter(ChiTieu %in% c("TÀI SẢN NGẮN HẠN", "TÀI SẢN DÀI HẠN")) %>%
format_table()
| Nam | ChiTieu | GiaTri |
|---|---|---|
| 2015 | TÀI SẢN NGẮN HẠN | 6.176.432.326.364 |
| 2015 | TÀI SẢN DÀI HẠN | 1.089.329.907.510 |
| 2016 | TÀI SẢN NGẮN HẠN | 12.288.142.407.269 |
| 2016 | TÀI SẢN DÀI HẠN | 2.566.120.825.722 |
| 2017 | TÀI SẢN NGẮN HẠN | 18.862.861.306.281 |
| 2017 | TÀI SẢN DÀI HẠN | 3.959.802.908.939 |
| 2018 | TÀI SẢN NGẮN HẠN | 23.371.994.756.394 |
| 2018 | TÀI SẢN DÀI HẠN | 4.750.536.730.462 |
| 2019 | TÀI SẢN NGẮN HẠN | 35.011.896.908.246 |
| 2019 | TÀI SẢN DÀI HẠN | 6.696.198.636.637 |
| 2020 | TÀI SẢN NGẮN HẠN | 37.317.233.970.267 |
| 2020 | TÀI SẢN DÀI HẠN | 8.713.645.982.187 |
| 2021 | TÀI SẢN NGẮN HẠN | 51.955.257.770.657 |
| 2021 | TÀI SẢN DÀI HẠN | 11.016.147.044.285 |
| 2022 | TÀI SẢN NGẮN HẠN | 44.577.607.228.189 |
| 2022 | TÀI SẢN DÀI HẠN | 11.256.488.385.860 |
| 2023 | TÀI SẢN NGẮN HẠN | 51.950.337.976.047 |
| 2023 | TÀI SẢN DÀI HẠN | 8.160.899.236.677 |
| 2024 | TÀI SẢN NGẮN HẠN | 65.836.422.620.040 |
| 2024 | TÀI SẢN DÀI HẠN | 4.601.353.101.564 |
Giải thích kỹ thuật:
– (2): Lọc từ bảng data_long_assets (dữ liệu dạng dài) để chỉ giữ lại các hàng có ChiTieu là “TÀI SẢN NGẮN HẠN” hoặc “TÀI SẢN DÀI HẠN”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Trích xuất một tập dữ liệu con ở định dạng dài. Đây là cấu trúc dữ liệu lý tưởng để vẽ biểu đồ diện tích chồng hoặc biểu đồ cột chồng, những loại biểu đồ chuyên dùng để phân tích cơ cấu.
– Kinh tế: Trong tất cả 10 năm, giá trị của tài sản ngắn hạn luôn lớn hơn nhiều lần so với tài sản dài hạn. Điều này cho thấy mô hình kinh doanh của công ty có tính thâm dụng vốn lưu động rất cao. Phần lớn tài sản của công ty là các khoản mục ngắn hạn như tiền, hàng tồn kho và Các khoản phải thu. Đây là đặc điểm điển hình của các doanh nghiệp bán lẻ hoặc thương mại.
inventory_to_total_assets_ratio <- analytical_df_assets %>%
mutate(TyLe_HTK_Tren_TTS = `Hàng tồn kho 1` / `TỔNG CỘNG TÀI SẢN`) %>%
select(Nam, TyLe_HTK_Tren_TTS)
kable(inventory_to_total_assets_ratio)
| Nam | TyLe_HTK_Tren_TTS |
|---|---|
| 2015 | 0.6788943 |
| 2016 | 0.6308446 |
| 2017 | 0.5279911 |
| 2018 | 0.6203569 |
| 2019 | 0.6172765 |
| 2020 | 0.4219380 |
| 2021 | 0.4631822 |
| 2022 | 0.4602220 |
| 2023 | 0.3630642 |
| 2024 | 0.3158061 |
Giải thích kỹ thuật:
– (2): Tạo một cột tỷ lệ mới (TyLe_HTK_Tren_TTS) bằng cách lấy cột” Hàng tồn kho 1” chia cho cột “TỔNG CỘNG TÀI SẢN”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một biến tỷ lệ đã được chuẩn hóa. Việc chuẩn hóa bằng cách chia cho tổng tài sản giúp đánh giá tầm quan trọng tương đối của hàng tồn kho một cách công bằng qua các năm, bất kể quy mô công ty thay đổi.
– Kinh tế: Tỷ lệ này luôn ở mức rất cao, cho thấy hàng tồn kho chiếm một phần rất lớn từ 31% đến 67% trong tổng tài sản. Điều này phản ánh bản chất của một doanh nghiệp bán lẻ. Phần lớn tài sản của công ty bị giam trong hàng hóa dự trữ để bán. Có một xu hướng giảm rất mạnh và rõ rệt của tỷ lệ này, từ 67.8% vào năm 2015 xuống chỉ còn 31.5% vào năm 2024, tức là đã giảm hơn một nửa. Đây là một tín hiệu cực kỳ tích cực về hiệu quả quản lý. Nó cho thấy công ty đã cải thiện đáng kể việc quản lý hàng tồn kho và vòng quay vốn.
fixed_assets_to_total_assets_ratio <- analytical_df_assets %>%
mutate(TyLe_TSCD_Tren_TTS = `Tài sản cố định` / `TỔNG CỘNG TÀI SẢN`) %>%
select(Nam, TyLe_TSCD_Tren_TTS)
kable(fixed_assets_to_total_assets_ratio)
| Nam | TyLe_TSCD_Tren_TTS |
|---|---|
| 2015 | 0.1168696 |
| 2016 | 0.1411328 |
| 2017 | 0.1517640 |
| 2018 | 0.1185223 |
| 2019 | 0.1295618 |
| 2020 | 0.1584797 |
| 2021 | 0.1531992 |
| 2022 | 0.1742216 |
| 2023 | 0.1081351 |
| 2024 | 0.0509191 |
Giải thích kỹ thuật:
– (2): Tạo một cột tỷ lệ mới (TyLe_TSCD_Tren_TTS) bằng cách lấy cột “Tài sản cố định” chia cho cột “TỔNG CỘNG TÀI SẢN”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo một biến tỷ lệ khác để phân tích cơ cấu tài sản.
– Kinh tế: Tỷ lệ này có xu hướng tăng lên từ năm 2016 và đạt đỉnh vào năm 2022 (17.4%). Giai đoạn này tương ứng với quá trình mở rộng mạng lưới cửa hàng và đầu tư vào cơ sở hạ tầng. Công ty đã tích cực tăng cường năng lực sản xuất kinh doanh dài hạn của mình. Tỷ lệ này sụt giảm mạnh trong hai năm gần nhất, xuống chỉ còn 5% vào năm 2024. Công ty đã dừng lại hoặc giảm tốc đáng kể việc đầu tư vào tài sản cố định. Tỷ trọng của TSCĐ trong tổng tài sản đang giảm đi, cho thấy sự chuyển dịch sang một mô hình kinh doanh còn nhẹ hơn nữa về tài sản cố định.
correlation_inventory_tsnh <- analytical_df_assets %>%
summarise(Correlation = cor(`Hàng tồn kho 1`, `TÀI SẢN NGẮN HẠN`))
kable(correlation_inventory_tsnh)
| Correlation |
|---|
| 0.8350861 |
Giải thích kỹ thuật:
– (2): Sử dụng hàm cor() để tính toán hệ số tương quan Pearson giữa hai biến số. Hệ số này là một giá trị duy nhất dao động từ -1 đến 1.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Cung cấp một con số duy nhất để đo lường mức độ và chiều hướng của mối quan hệ tuyến tính giữa hai biến. Giá trị gần 1 cho thấy mối quan hệ đồng biến mạnh.
– Kinh tế: Hệ số tương quan là 0.835, một giá trị rất cao và gần với 1. Điều này cho thấy có một mối quan hệ đồng biến và rất chặt chẽ giữa hàng tồn kho và tài sản ngắn hạn. Nói một cách đơn giản khi tài sản ngắn hạn của công ty tăng lên, nguyên nhân chính là do hàng tồn kho tăng lên và ngược lại.
data_long_assets %>%
filter(ChiTieu %in% c("Hàng tồn kho 1", "Tài sản cố định")) %>%
format_table()
| Nam | ChiTieu | GiaTri |
|---|---|---|
| 2015 | Hàng tồn kho 1 | 4.932.684.842.299 |
| 2015 | Tài sản cố định | 849.146.989.686 |
| 2016 | Hàng tồn kho 1 | 9.370.731.749.778 |
| 2016 | Tài sản cố định | 2.096.423.249.031 |
| 2017 | Hàng tồn kho 1 | 12.050.162.650.982 |
| 2017 | Tài sản cố định | 3.463.657.994.935 |
| 2018 | Hàng tồn kho 1 | 17.446.005.298.981 |
| 2018 | Tài sản cố định | 3.333.147.659.602 |
| 2019 | Hàng tồn kho 1 | 25.745.428.436.580 |
| 2019 | Tài sản cố định | 5.403.776.988.921 |
| 2020 | Hàng tồn kho 1 | 19.422.177.452.674 |
| 2020 | Tài sản cố định | 7.294.961.666.136 |
| 2021 | Hàng tồn kho 1 | 29.167.232.293.922 |
| 2021 | Tài sản cố định | 9.647.168.873.232 |
| 2022 | Hàng tồn kho 1 | 25.696.077.735.282 |
| 2022 | Tài sản cố định | 9.727.502.911.440 |
| 2023 | Hàng tồn kho 1 | 21.824.235.626.176 |
| 2023 | Tài sản cố định | 6.500.135.608.914 |
| 2024 | Hàng tồn kho 1 | 22.244.676.326.705 |
| 2024 | Tài sản cố định | 3.586.628.664.045 |
Giải thích kỹ thuật:
– (2): Lọc từ bảng data_long_assets để chỉ giữ lại các hàng của hai chỉ tiêu chi tiết “Hàng tồn kho 1” và “Tài sản cố định”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Trích xuất một tập dữ liệu con ở dạng dài để so sánh hai thành phần quan trọng.
– Kinh tế: Hàng tồn kho luôn có giá trị lớn hơn rất nhiều so với tài sản cố định trong mọi năm. Điều này khẳng định mạnh mẽ rằng mô hình kinh doanh của công ty có tính thâm dụng vốn lưu động cao. Việc đầu tư vào hàng hóa để bán là hoạt động sử dụng vốn quan trọng nhất, vượt xa cả việc đầu tư vào nhà xưởng, máy móc.
data_long_assets %>%
filter(ChiTieu %in% c("NỢ PHẢI TRẢ", "VỐN CHỦ SỞ HỮU")) %>%
format_table()
| Nam | ChiTieu | GiaTri |
|---|---|---|
| 2015 | NỢ PHẢI TRẢ | 4.782.209.545.548 |
| 2015 | VỐN CHỦ SỞ HỮU | 2.483.552.688.326 |
| 2016 | NỢ PHẢI TRẢ | 11.012.905.506.628 |
| 2016 | VỐN CHỦ SỞ HỮU | 3.841.357.726.363 |
| 2017 | NỢ PHẢI TRẢ | 16.913.747.880.005 |
| 2017 | VỐN CHỦ SỞ HỮU | 5.908.916.335.215 |
| 2018 | NỢ PHẢI TRẢ | 19.139.496.155.514 |
| 2018 | VỐN CHỦ SỞ HỮU | 8.983.035.331.342 |
| 2019 | NỢ PHẢI TRẢ | 29.564.550.350.530 |
| 2019 | VỐN CHỦ SỞ HỮU | 12.143.592.194.353 |
| 2020 | NỢ PHẢI TRẢ | 30.549.190.106.022 |
| 2020 | VỐN CHỦ SỞ HỮU | 15.481.689.846.432 |
| 2021 | NỢ PHẢI TRẢ | 42.593.158.815.096 |
| 2021 | VỐN CHỦ SỞ HỮU | 20.378.245.999.846 |
| 2022 | NỢ PHẢI TRẢ | 31.901.514.096.473 |
| 2022 | VỐN CHỦ SỞ HỮU | 23.932.581.517.576 |
| 2023 | NỢ PHẢI TRẢ | 36.751.679.245.386 |
| 2023 | VỐN CHỦ SỞ HỮU | 23.359.557.967.338 |
| 2024 | NỢ PHẢI TRẢ | 42.316.198.897.749 |
| 2024 | VỐN CHỦ SỞ HỮU | 28.121.576.823.855 |
Giải thích kỹ thuật:
– (2): Lọc từ bảng data_long_assets để giữ lại hai chỉ tiêu “NỢ PHẢI TRẢ” và “VỐN CHỦ SỞ HỮU”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Trích xuất một tập dữ liệu con ở dạng dài để so sánh hai thành phần quan trọng.
– Kinh tế: Trong tất cả 10 năm, giá trị của nợ phải trả luôn lớn hơn đáng kể so với vốn chủ sở hữu. Điều này khẳng định mạnh mẽ rằng chiến lược tài chính của công ty dựa chủ yếu vào đòn bẩy nợ. Phần lớn tài sản của công ty được tài trợ bằng các nguồn vốn bên ngoài thay vì vốn tự có của chủ sở hữu.
debt_to_equity_ratio <- analytical_df_assets %>%
mutate(TyLe_No_Tren_VCSH = `NỢ PHẢI TRẢ` / `VỐN CHỦ SỞ HỮU`) %>%
select(Nam, TyLe_No_Tren_VCSH)
kable(debt_to_equity_ratio)
| Nam | TyLe_No_Tren_VCSH |
|---|---|
| 2015 | 1.925552 |
| 2016 | 2.866931 |
| 2017 | 2.862411 |
| 2018 | 2.130627 |
| 2019 | 2.434580 |
| 2020 | 1.973246 |
| 2021 | 2.090129 |
| 2022 | 1.332974 |
| 2023 | 1.573304 |
| 2024 | 1.504759 |
Giải thích kỹ thuật:
– (2): Tạo cột tỷ lệ mới bằng cách lấy “NỢ PHẢI TRẢ” chia cho “VỐN CHỦ SỞ HỮU”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo một biến tỷ lệ chuẩn, là một trong những chỉ số được sử dụng rộng rãi nhất để đo lường đòn bẩy tài chính.
– Kinh tế: Tỷ lệ này luôn luôn lớn hơn 1.0, và có thời điểm lên tới 2.86. Một tỷ lệ là 2.86 (năm 2016, 2017) có nghĩa là cứ mỗi 1 đồng vốn chủ sở hữu, công ty đang gánh tới 2.86 đồng nợ. Tỷ lệ này có xu hướng giảm rõ rệt trong những năm gần đây, từ đỉnh điểm 2.86 xuống còn 1.5 vào năm 2024, đặc biệt là có sự sụt giảm mạnh vào năm 2022. Nó cho thấy công ty đang chủ động giảm bớt sự phụ thuộc vào nợ vay và củng cố nền tảng vốn chủ sở hữu.
short_term_loan_ratio <- analytical_df_assets %>%
mutate(TyLe_VayNH_Tren_TongNo = `Vay ngắn hạn` / `NỢ PHẢI TRẢ`) %>%
select(Nam, TyLe_VayNH_Tren_TongNo)
kable(short_term_loan_ratio)
| Nam | TyLe_VayNH_Tren_TongNo |
|---|---|
| 2015 | 0.4292882 |
| 2016 | 0.4348527 |
| 2017 | 0.3312989 |
| 2018 | 0.3049430 |
| 2019 | 0.4407649 |
| 2020 | 0.5114761 |
| 2021 | 0.5786721 |
| 2022 | 0.3350355 |
| 2023 | 0.5204808 |
| 2024 | 0.6451488 |
Giải thích kỹ thuật:
– (2): Tạo cột tỷ lệ mới bằng cách lấy “Vay ngắn hạn” chia cho “NỢ PHẢI TRẢ”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo một biến tỷ lệ để phân tích cơ cấu nợ, tập trung vào thành phần ngắn hạn.
– Kinh tế: Tỷ lệ này luôn ở mức đáng kể, dao động từ 30% đến 64%. Điều này cho thấy vay ngắn hạn là một công cụ tài trợ rất quan trọng của công ty, chiếm một phần lớn trong tổng cơ cấu nợ. Có một xu hướng tăng rõ rệt của tỷ lệ này, đặc biệt từ năm 2018. Tỷ lệ đã tăng từ mức thấp nhất 30% lên mức cao nhất 64.5% vào năm 2024. Điều này cho thấy công ty đang ngày càng phụ thuộc nhiều hơn vào các khoản vay ngân hàng ngắn hạn để tài trợ cho hoạt động của mình thay vì chỉ dựa vào việc chiếm dụng vốn từ nhà cung cấp.
long_term_loan_ratio <- analytical_df_assets %>%
mutate(TyLe_VayDH_Tren_TongNo = `Vay dài hạn` / `NỢ PHẢI TRẢ`) %>%
select(Nam, TyLe_VayDH_Tren_TongNo)
kable(long_term_loan_ratio)
| Nam | TyLe_VayDH_Tren_TongNo |
|---|---|
| 2015 | 0.0000000 |
| 2016 | 0.0000000 |
| 2017 | 0.0709442 |
| 2018 | 0.0631243 |
| 2019 | 0.0379555 |
| 2020 | 0.0368807 |
| 2021 | 0.0000000 |
| 2022 | 0.1849834 |
| 2023 | 0.1628565 |
| 2024 | 0.0000000 |
Giải thích kỹ thuật:
– (2): Tạo cột tỷ lệ mới bằng cách lấy “Vay dài hạn” chia cho “NỢ PHẢI TRẢ”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo một biến tỷ lệ khác để phân tích cơ cấu nợ, tập trung vào thành phần dài hạn.
– Kinh tế: Tỷ lệ này nhìn chung rất thấp, cao nhất cũng chỉ đạt 18.5% (năm 2022). Trong nhiều năm, tỷ lệ này bằng 0. Điều này khẳng định mạnh mẽ rằng công ty không ưu tiên sử dụng nợ vay dài hạn làm công cụ tài trợ chính. Chiến lược tài chính của họ tập trung chủ yếu vào các nguồn vốn ngắn hạn.
debt_ratio_extremes <- analytical_df_assets %>%
filter(TyLeNo_Tren_TaiSan == max(TyLeNo_Tren_TaiSan) |
TyLeNo_Tren_TaiSan == min(TyLeNo_Tren_TaiSan)) %>%
select(Nam, TyLeNo_Tren_TaiSan)
kable(debt_ratio_extremes)
| Nam | TyLeNo_Tren_TaiSan |
|---|---|
| 2016 | 0.7413970 |
| 2022 | 0.5713626 |
Giải thích kỹ thuật:
– (2): Sử dụng điều kiện logic kết hợp với các hàm tóm tắt max() và min() để tìm ra các dòng có giá trị cực trị. Dấu | có nghĩa là “hoặc”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Xác định các điểm dữ liệu ngoại lai hoặc các điểm ngoặt trong một chuỗi thời gian, giúp tập trung sự chú ý vào những quan sát quan trọng nhất.
– Kinh tế: Năm 2016 là năm có tỷ lệ nợ trên tài sản cao nhất, đạt 74.1%. Đây là thời điểm công ty sử dụng đòn bẩy tài chính một cách quyết liệt nhất. Năm 2022 là năm có tỷ lệ nợ trên tài sản thấp nhất, chỉ còn 57.1%. Đây là một sự kiện rất quan trọng. Nó đánh dấu một sự thay đổi rõ rệt trong chiến lược, khi công ty đã chủ động giảm bớt đòn bẩy tài chính một cách đáng kể. Điều này hoàn toàn khớp với các phân tích trước đó về việc công ty trả nợ ròng và bán bớt tài sản trong năm 2022.
top_3_assets <- data_long_assets %>%
filter(ChiTieu %in% c("TÀI SẢN NGẮN HẠN", "TÀI SẢN DÀI HẠN",
"Hàng tồn kho 1", "Tài sản cố định")) %>%
group_by(ChiTieu) %>%
summarise(GiaTriTrungBinh = mean(GiaTri)) %>%
arrange(desc(GiaTriTrungBinh)) %>%
head(3)
kable(top_3_assets)
| ChiTieu | GiaTriTrungBinh |
|---|---|
| TÀI SẢN NGẮN HẠN | 34734818726975 |
| Hàng tồn kho 1 | 18789941241338 |
| TÀI SẢN DÀI HẠN | 6281052275984 |
Giải thích kỹ thuật:
– (2): Để chọn các chỉ tiêu tài sản.
– (4): Để nhóm.
– (5): Để tính trung bình.
– (6): Để sắp xếp.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán giá trị trung bình có điều kiện và thực hiện xếp hạng để xác định các thành phần có giá trị lớn nhất về mặt trung bình.
– Kinh tế: Tài sản ngắn hạn có giá trị trung bình lớn nhất, vượt xa các khoản mục khác. Hoạt động chính của công ty xoay quanh việc quản lý các tài sản ngắn hạn. Hàng tồn kho là khoản mục chi tiết lớn thứ hai. Điều này chỉ ra rằng hàng tồn kho là thành phần quan trọng nhất trong tài sản ngắn hạn. Tài sản dài hạn có giá trị trung bình thấp nhất trong ba khoản mục. Điều này cho thấy công ty không phải là một doanh nghiệp sản xuất nặng.
top_3_liabilities <- data_long_assets %>%
filter(ChiTieu %in% c("Nợ ngắn hạn", "Nợ dài hạn", "Vay ngắn hạn", "Vay dài hạn")) %>%
group_by(ChiTieu) %>%
summarise(GiaTriTrungBinh = mean(GiaTri)) %>%
arrange(desc(GiaTriTrungBinh)) %>%
head(3)
kable(top_3_liabilities)
| ChiTieu | GiaTriTrungBinh |
|---|---|
| Nợ ngắn hạn | 24897815542751 |
| Vay ngắn hạn | 12870249573897 |
| Vay dài hạn | 1654341346853 |
Giải thích kỹ thuật:
– (2): Để chọn các chỉ tiêu nợ.
– (3): Để nhóm.
– (4): Để tính trung bình.
– (5): Để sắp xếp.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tính toán giá trị trung bình có điều kiện và thực hiện xếp hạng để xác định các thành phần có giá trị lớn nhất về mặt trung bình.
– Kinh tế: Nợ ngắn hạn có giá trị trung bình lớn nhất, gần gấp đôi vay ngắn hạn. Điều này cho thấy nguồn tài trợ chính của công ty đến từ các nghĩa vụ phải trả trong vòng một năm. Vay dài hạn có giá trị trung bình rất nhỏ so với các khoản nợ ngắn hạn. Điều này một lần nữa khẳng định rằng công ty không ưu tiên sử dụng nợ dài hạn. Chiến lược tài chính của họ tập trung hoàn toàn vào việc quản lý và xoay vòng các nguồn vốn ngắn hạn.
ratios_volatility <- analytical_df_assets %>%
summarise(
SD_TyLeNo = sd(TyLeNo_Tren_TaiSan),
SD_TyLeTonKho = sd(TyLeTonKho_Tren_TSNH),
SD_TyLeVay = sd(TyLeVay_Tren_TongNo)
)
kable(ratios_volatility)
| SD_TyLeNo | SD_TyLeTonKho | SD_TyLeVay |
|---|---|---|
| 0.0574811 | 0.1547903 | 0.105136 |
Giải thích kỹ thuật:
– (2): Sử dụng hàm sd() là độ lệch chuẩn để tính toán độ biến động cho mỗi cột tỷ số đã được tính toán trước đó trong bảng analytical_df_assets.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Độ lệch chuẩn là một thước đo thống kê cơ bản về mức độ phân tán của dữ liệu quanh giá trị trung bình.
– Kinh tế: SD_TyLeNo (0.057) có giá trị thấp nhất. Điều này cho thấy ban lãnh đạo có một chiến lược tài chính rõ ràng và kiên định về việc sử dụng nợ. SD_TyLeTonKho (0.154) có giá trị cao nhất. Đây có thể là một điểm yếu, phản ánh sự khó khăn trong việc dự báo nhu cầu hoặc quản lý chuỗi cung ứng. SD_TyLeVay (0.105) có giá trị ở mức trung bình. Cho thấy tỷ trọng của các khoản vay có lãi trong tổng nợ không hoàn toàn ổn định mà có sự điều chỉnh qua các năm, phù hợp với các nhu cầu vốn thay đổi của công ty.
growth_comparison <- total_assets_growth %>%
left_join(equity_growth, by = "Nam")
kable(growth_comparison)
| Nam | TangTruong_TaiSan_Pct | TangTruong_VCSH_Pct |
|---|---|---|
| 2015 | NA | NA |
| 2016 | 104.441912 | 54.671884 |
| 2017 | 53.643865 | 53.823641 |
| 2018 | 23.221948 | 52.025089 |
| 2019 | 48.308468 | 35.183618 |
| 2020 | 10.364377 | 27.488552 |
| 2021 | 36.802522 | 31.628047 |
| 2022 | -11.334207 | 17.441813 |
| 2023 | 7.660448 | -2.394324 |
| 2024 | 17.179048 | 20.385740 |
Giải thích kỹ thuật:
– (2): Ghép hai bảng dữ liệu về tăng trưởng đã được tính từ trước, dựa trên cột chung là “Nam”.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Chuẩn bị một tập dữ liệu con để so sánh trực tiếp hai chuỗi thời gian, sẵn sàng cho việc vẽ biểu đồ.
– Kinh tế: Giai đoạn tăng trưởng nóng (2016, 2019), tăng trưởng tài sản lớn hơn đáng kể so với tăng trưởng vốn chủ sở hữu. Năm 2018 tăng trưởng VCSH (52%) lớn hơn nhiều so với tăng trưởng tài sản (23%), năm 2022 tài sản giảm (-11.3%) trong khi VCSH vẫn tăng (17.4%). Họ đã tăng vốn chủ sở hữu nhanh hơn tốc độ tăng tài sản hoặc thậm chí giảm tài sản trong khi vẫn tích lũy được lợi nhuận. Đây là những dấu hiệu của việc quản trị tài chính chủ động để giảm rủi ro.
structure_kpi_summary <- analytical_df_assets %>%
select(Nam,
TyLeNo_Tren_TaiSan,
TyLeTonKho_Tren_TSNH,
TyLeVay_Tren_TongNo)
kable(structure_kpi_summary)
| Nam | TyLeNo_Tren_TaiSan | TyLeTonKho_Tren_TSNH | TyLeVay_Tren_TongNo |
|---|---|---|---|
| 2015 | 0.6581842 | 0.7986301 | 0.4292882 |
| 2016 | 0.7413970 | 0.7625833 | 0.4348527 |
| 2017 | 0.7410944 | 0.6388301 | 0.4022431 |
| 2018 | 0.6805752 | 0.7464491 | 0.3680673 |
| 2019 | 0.7088444 | 0.7353337 | 0.4787204 |
| 2020 | 0.6636673 | 0.5204613 | 0.5483568 |
| 2021 | 0.6763889 | 0.5613913 | 0.5786721 |
| 2022 | 0.5713626 | 0.5764347 | 0.5200188 |
| 2023 | 0.6113945 | 0.4200980 | 0.6833373 |
| 2024 | 0.6007600 | 0.3378780 | 0.6451488 |
Giải thích kỹ thuật:
– (2): Chọn ra các cột tỷ số quan trọng đã được tính toán ở các bước trước và gom chúng vào một bảng duy nhất.
Ý nghĩa thống kê & kinh tế:
– Thống kê: Tạo ra một bảng dữ liệu phân tích tổng hợp, là sản phẩm cuối cùng của giai đoạn xử lý, sẵn sàng cho các bước trực quan hóa hoặc mô hình hóa tiếp theo.
– Kinh tế: Khi tỷ lệ tồn kho giảm mạnh cho thấy hiệu quả quản lý tăng lên như vào năm 2020, 2023, 2024 thì tỷ lệ vay lại có xu hướng tăng lên. Nhìn vào xu hướng chung, đòn bẩy tổng thể và hiệu quả tồn kho đều có xu hướng cải thiện trong dài hạn. Công ty đang dần trở nên an toàn hơn và hoạt động hiệu quả hơn. Ngược lại với hai xu hướng trên, tỷ lệ vay trên tổng nợ lại có xu hướng tăng lên. Điều này cho thấy mặc dù tổng đòn bẩy giảm, công ty đang ngày càng dựa nhiều hơn vào các khoản vay có tính lãi thay vì chiếm dụng vốn thương mại.
desc_stats_long <- analytical_df_assets %>%
select(`TỔNG CỘNG TÀI SẢN`, `NỢ PHẢI TRẢ`, `VỐN CHỦ SỞ HỮU`) %>%
pivot_longer(everything(), names_to = "ChiTieu", values_to = "GiaTri")
ggplot(desc_stats_long, aes(x = ChiTieu, y = GiaTri, fill = ChiTieu)) +
geom_boxplot(alpha = 0.8, show.legend = FALSE) +
geom_jitter(width = 0.1, alpha = 0.5) +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
coord_flip() +
labs(
title = "Phân phối của tài sản, nợ và vốn chủ sở hữu (2015-2024)",
x = "", y = "Giá trị (nghìn tỷ đồng)"
)
Giải thích kỹ thuật:
– (3): Tái cấu trúc dữ liệu từ dạng rộng (3 cột TỔNG CỘNG TÀI SẢN, NỢ PHẢI TRẢ, VỐN CHỦ SỞ HỮU) sang dạng dài để ggplot2 có thể dễ dàng so sánh các nhóm.
– (5): Vẽ biểu đồ hộp, tóm tắt sự phân bố của dữ liệu trong 10 năm cho mỗi chỉ tiêu. Hộp hiển thị khoảng tứ phân vị, vạch giữa là trung vị.
– (6): Thêm các điểm dữ liệu thực tế lên trên, giúp thấy được số lượng và sự phân bố của các quan sát (năm).
– (8): Xoay biểu đồ 90 độ để các nhãn dài của chỉ tiêu có thể đọc được dễ dàng trên trục y.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ hộp là công cụ mạnh mẽ để so sánh sự phân bố của nhiều nhóm. Nó trực quan hóa khuynh hướng trung tâm (trung vị) và độ phân tán (chiều cao hộp, độ dài râu).
– Kinh tế: Cả ba hộp đều trải dài trên một khoảng giá trị rất rộng. Hộp của tổng cộng tài sản có độ dài lớn nhất, cho thấy sự tăng trưởng mạnh mẽ nhất. Độ rộng của các hộp và khoảng cách giữa các điểm dữ liệu cho thấy một sự tăng trưởng bùng nổ về quy mô của công ty. Công ty đã đi từ một quy mô nhỏ lên một quy mô lớn hơn nhiều chỉ trong 10 năm.
ggplot(total_assets_growth, aes(x = Nam, y = TangTruong_TaiSan_Pct)) +
geom_col(aes(fill = TangTruong_TaiSan_Pct), show.legend = FALSE) +
geom_line(aes(group = 1), color = "black") +
geom_point(size = 3, color = "black") +
geom_text(aes(label = paste0(round(TangTruong_TaiSan_Pct), "%")), vjust = -0.7) +
scale_fill_gradient2(low = "red", mid = "yellow", high = "green", midpoint = 0) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Tốc độ tăng trưởng tổng tài sản qua các năm",
x = "Năm", y = "Tăng trưởng (%)"
)
Giải thích kỹ thuật:
– (2): Vẽ các cột thể hiện tốc độ tăng trưởng. Màu sắc của cột (fill) được ánh xạ theo giá trị, giúp phân biệt năm tăng trưởng âm và dương.
– (3) và (4): Vẽ thêm một đường nối các đỉnh cột để làm nổi bật xu hướng thay đổi qua các năm.
– (6): Tạo một dải màu phân kỳ. Các giá trị dương sẽ có màu xanh, giá trị âm có màu đỏ, và giá trị gần 0 có màu vàng. Có midpoint = 0 đặt điểm chuyển màu.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Kết hợp nhiều geom để truyền tải nhiều lớp thông tin: giá trị tuyệt đối (chiều cao cột), dấu (màu sắc), và xu hướng (đường).
– Kinh tế: Năm 2016 với mức tăng trưởng 104%. Đây là giai đoạn công ty mở rộng quy mô một cách quyết liệt nhất. Tốc độ tăng trưởng chậm lại đáng kể và lần đầu tiên ghi nhận cột màu vàng cam giai đoạn 2020 - 2022, thể hiện mức tăng trưởng âm (-11%) vào năm 2022. Cho thấy công ty đã bắt đầu giảm tốc. Đặc biệt năm 2022 công ty đã thu hẹp quy mô tài sản, một hành động tái cơ cấu rõ rệt. Tốc độ tăng trưởng quay trở lại mức dương ở hai năm gần đây nhưng ở mức độ khiêm tốn hơn (8% và 17%).
growth_comparison_long <- growth_comparison %>%
pivot_longer(-Nam, names_to = "LoaiTangTruong", values_to = "TyLe")
ggplot(growth_comparison_long, aes(x = Nam, y = TyLe, color = LoaiTangTruong)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
geom_hline(yintercept = 0, linetype = "dashed") +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Tốc độ tăng trưởng: Tài sản và vốn chủ sở hữu",
x = "Năm", y = "Tăng trưởng (%)", color = "Loại tăng trưởng"
)
Giải thích kỹ thuật:
– (2): Tái cấu trúc dữ liệu để có một cột LoaiTangTruong (chứa “Tăng trưởng tài sản” và “Tăng trưởng VCSH”) và một cột TyLe giúp ggplot2 vẽ hai đường bằng cách ánh xạ color vào LoaiTangTruong.
– (4) và (5): Vẽ hai đường biểu diễn riêng biệt.
– (6): Thêm đường tham chiếu y=0 để phân biệt tăng trưởng dương và âm.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ đường kép là phương pháp tiêu chuẩn để so sánh trực tiếp xu hướng của hai chuỗi thời gian.
– Kinh tế: Giai đoạn tăng trưởng nóng (2016, 2017, 2019, 2021), đường màu đỏ cao hơn đáng kể so với đường màu xanh. Khoảng cách giữa hai đường cho thấy phần lớn sự tăng trưởng về quy mô tài sản của công ty đến từ việc gia tăng nợ vay. Trong các năm 2018 và 2022, đường màu xanh vượt lên trên đường màu đỏ. Họ đã tăng vốn chủ sở hữu nhanh hơn tốc độ tăng tài sản hoặc thậm chí giảm tài sản tức là giảm nợ trong khi vẫn tích lũy được lợi nhuận. Đây là những dấu hiệu của việc quản trị tài chính chủ động để giảm rủi ro.
asset_type_comparison <- analytical_df_assets %>%
select(Nam, `TÀI SẢN NGẮN HẠN`, `TÀI SẢN DÀI HẠN`)
ggplot(asset_type_comparison, aes(x = Nam)) +
geom_area(aes(y = `TÀI SẢN NGẮN HẠN`, fill = "Tài sản Ngắn hạn"), alpha = 0.7) +
geom_area(aes(y = `TÀI SẢN DÀI HẠN`, fill = "Tài sản Dài hạn"), alpha = 0.7) +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
scale_fill_manual(values = c("Tài sản Ngắn hạn" = "cornflowerblue",
"Tài sản Dài hạn" = "darkgreen")) +
labs(
title = "Quy mô tài sản ngắn hạn và dài hạn",
x = "Năm", y = "Giá trị (nghìn tỷ đồng)", fill = "Loại tài sản"
)
Giải thích kỹ thuật:
– (2) và (3): Vẽ biểu đồ diện tích. Khi vẽ hai geom_area riêng biệt như thế này, chúng sẽ được vẽ chồng lên nhau (mặc định). Có alpha = 0.7 làm cho chúng hơi trong suốt để có thể thấy được cả hai lớp.
– (6): Tự định nghĩa màu sắc cho từng loại tài sản để dễ phân biệt.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ diện tích nhấn mạnh sự thay đổi về mặt “khối lượng” hoặc “quy mô” của một biến số theo thời gian.
– Kinh tế: Vùng diện tích màu xanh dương luôn lớn hơn rất nhiều và bao phủ gần như toàn bộ biểu đồ so với vùng màu xanh lá. Điều này cho thấy mô hình kinh doanh của công ty có tính thâm dụng vốn lưu động rất cao. Phần lớn tài sản của công ty là các khoản mục ngắn hạn như tiền, hàng tồn kho, các khoản phải thu. Đây là đặc điểm điển hình của các doanh nghiệp bán lẻ hoặc thương mại.
debt_type_comparison <- analytical_df_assets %>%
select(Nam, `Nợ ngắn hạn`, `Nợ dài hạn`)
debt_type_long <- debt_type_comparison %>%
pivot_longer(-Nam, names_to = "LoaiNo", values_to = "GiaTri")
ggplot(debt_type_long, aes(x = Nam, y = GiaTri, fill = LoaiNo)) +
geom_col(position = "dodge") +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Cơ cấu nợ ngắn hạn và dài hạn",
x = "Năm", y = "Giá trị (nghìn tỷ đồng)", fill = "Loại nợ"
)
Giải thích kỹ thuật:
– (2): Chuyển dữ liệu sang dạng dài để vẽ biểu đồ cột nhóm.
– (4): Vẽ biểu đồ cột nhóm, đặt cột “Nợ ngắn hạn” và “Nợ dài hạn” cạnh nhau trong mỗi năm để so sánh trực tiếp.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ cột nhóm là phương pháp trực quan tiêu chuẩn để so sánh giá trị của các danh mục khác nhau qua từng điểm thời gian.
– Kinh tế: Trong tất cả 10 năm, cột màu xanh cao hơn một cách áp đảo so với cột màu đỏ. Trong nhiều năm, cột màu đỏ thậm chí còn không xuất hiện (giá trị bằng 0). Điều này cho thấy một chiến lược tài trợ cực kỳ rõ ràng là công ty gần như hoàn toàn phụ thuộc vào các nguồn vốn ngắn hạn.
asset_structure_precalc <- data_long_assets %>%
filter(ChiTieu %in% c("TÀI SẢN NGẮN HẠN", "TÀI SẢN DÀI HẠN")) %>%
group_by(Nam) %>%
mutate(
TongTaiSan = sum(GiaTri),
TyTrong = GiaTri / TongTaiSan
) %>%
ungroup() %>%
arrange(Nam, desc(ChiTieu)) %>%
group_by(Nam) %>%
mutate(
ViTriNhan = cumsum(TyTrong) - 0.5 * TyTrong
)
ggplot(asset_structure_precalc, aes(x = Nam, y = TyTrong, fill = ChiTieu)) +
geom_col() +
geom_text(
aes(y = ViTriNhan, label = scales::percent(TyTrong, accuracy = 1)),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Sự thay đổi trong cơ cấu tài sản",
x = "Năm",
y = "Tỷ trọng",
fill = "Loại tài sản"
)
Giải thích kỹ thuật:
– (2) đến (12): Chuẩn bị lại dữ liệu về tài sản để thực hiện vẽ biểu đồ.
– (15): Vẽ biểu đồ cột chồng được chuẩn hóa 100%. Chiều cao của mỗi cột luôn bằng nhau, tập trung vào việc thể hiện sự thay đổi về tỷ trọng của các thành phần bên trong.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Trực quan hóa sự thay đổi trong cơ cấu tỷ trọng của một tổng thể qua thời gian.
– Kinh tế: Tỷ trọng của tài sản dài hạn tăng lên đáng kể trong giai đoạn 2017-2022, đạt đỉnh 20% vào năm 2022. Giai đoạn này tương ứng với quá trình công ty đầu tư mạnh mẽ vào tài sản cố định để mở rộng quy mô. Tỷ trọng của tài sản dài hạn sụt giảm mạnh trong hai năm gần nhất, chỉ còn 7% vào năm 2024. Tương ứng tỷ trọng của tài sản ngắn hạn tăng vọt lên 93%. Đây là một sự thay đổi chiến lược rõ ràng. Công ty đã cắt giảm mạnh đầu tư dài hạn và quay trở lại tập trung vào các hoạt động kinh doanh cốt lõi dựa trên vốn lưu động.
ggplot(inventory_to_total_assets_ratio, aes(x = Nam, y = TyLe_HTK_Tren_TTS)) +
geom_line(color = "darkorange", linewidth = 1.5) +
geom_point(color = "darkorange", size = 4) +
geom_text(aes(label = scales::percent(TyLe_HTK_Tren_TTS, 1)), vjust = -1) +
scale_y_continuous(labels = scales::percent, limits = c(0, 0.7)) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Xu hướng tỷ lệ hàng tồn kho trên tổng tài sản",
x = "Năm", y = "Tỷ lệ"
)
Giải thích kỹ thuật:
– (2) và (3): Vẽ biểu đồ đường thể hiện xu hướng của một tỷ lệ qua thời gian.
– (4): Thêm nhãn giá trị tại mỗi điểm để dễ đọc.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Trực quan hóa một chuỗi thời gian của một biến tỷ lệ.
– Kinh tế: Đường biểu diễn có một xu hướng giảm rất mạnh và rõ rệt trong dài hạn, từ mức đỉnh 68% vào năm 2015 xuống chỉ còn 32% vào năm 2024. Đây là một tín hiệu cực kỳ tích cực về hiệu quả quản lý. Nó cho thấy công ty đã cải thiện đáng kể việc quản lý hàng tồn kho và vòng quay vốn. Tỷ trọng của hàng tồn kho trong tổng tài sản đã giảm hơn một nửa.
ggplot(fixed_assets_to_total_assets_ratio, aes(x = Nam, y = TyLe_TSCD_Tren_TTS)) +
geom_line(color = "pink", linewidth = 1.5) +
geom_point(color = "pink", size = 4) +
geom_text(aes(label = scales::percent(TyLe_TSCD_Tren_TTS, 1)), vjust = -0.5) +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Xu hướng tỷ lệ tài sản cố định trên tổng tài sản",
x = "Năm", y = "Tỷ lệ"
)
Giải thích kỹ thuật:
– (2) và (3): Vẽ biểu đồ đường thể hiện xu hướng của một tỷ lệ qua thời gian.
– (4): Thêm nhãn giá trị tại mỗi điểm để dễ đọc.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Trực quan hóa một chuỗi thời gian khác của một biến tỷ lệ.
– Kinh tế: Đường biểu diễn có xu hướng tăng lên trong giai đoạn 2016-2022 và đạt đỉnh vào năm 2022 (17%). Công ty đã tích cực tăng cường năng lực kinh doanh dài hạn của mình. Tỷ lệ này sụt giảm mạnh trong hai năm gần nhất, xuống chỉ còn 5% vào năm 2024. Công ty đã dừng lại hoặc giảm tốc đáng kể việc đầu tư vào tài sản cố định. Tỷ trọng của TSCĐ trong tổng tài sản đang giảm đi, cho thấy sự chuyển dịch sang một mô hình kinh doanh còn nhẹ hơn nữa về tài sản cố định.
ggplot(analytical_df_assets, aes(x = `TÀI SẢN NGẮN HẠN`, y = `Hàng tồn kho 1`)) +
geom_point(color = "purple", size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
scale_x_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
labs(
title = "Mối tương quan giữa hàng tồn kho và tài sản ngắn hạn",
subtitle = paste0("Hệ số tương quan: ", round(correlation_inventory_tsnh$Correlation, 2)),
x = "Tài sản ngắn hạn", y = "Hàng tồn kho"
)
Giải thích kỹ thuật:
– (2): Vẽ biểu đồ phân tán, mỗi điểm là một năm với tọa độ x là “Tài sản ngắn hạn” và y là “Hàng tồn kho”.
– (3): Thêm một đường hồi quy tuyến tính để thể hiện xu hướng chung của mối quan hệ.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ phân tán là công cụ tiêu chuẩn để trực quan hóa mối quan hệ giữa hai biến số liên tục. Hệ số tương quan cao (0.84) khẳng định một mối quan hệ tuyến tính mạnh.
– Kinh tế: Các điểm dữ liệu là các năm nằm khá gần nhau và bám theo một đường thẳng dốc lên. Hệ số tương quan là 0.84, một giá trị rất cao. Điều này cho thấy có một mối quan hệ đồng biến và rất chặt chẽ giữa hàng tồn kho và tài sản ngắn hạn. Khi một giá trị tăng, giá trị kia cũng có xu hướng tăng mạnh theo.
detailed_asset_structure <- data_long_assets %>%
filter(ChiTieu %in% c("Hàng tồn kho 1", "Tài sản cố định"))
detailed_asset_structure_long <- detailed_asset_structure %>%
pivot_wider(names_from = ChiTieu, values_from = GiaTri)
ggplot(detailed_asset_structure_long, aes(x = Nam)) +
geom_line(aes(y = `Hàng tồn kho 1`, color = "Hàng tồn kho"), linewidth = 1.2) +
geom_line(aes(y = `Tài sản cố định`, color = "Tài sản cố định"), linewidth = 1.2) +
scale_y_log10(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
scale_color_manual(name = "Loại Tài sản", values = c("Hàng tồn kho" = "brown", "Tài sản cố định" = "grey")) +
labs(
title = "So sánh quy mô hàng tồn kho và tài sản cố định",
x = "Năm", y = "Giá trị (nghìn tỷ đồng, thang log)"
)
Giải thích kỹ thuật:
– (4) và (5): Vẽ hai lớp geom_line() riêng biệt cho hai biến.
– (6): Sử dụng thang đo logarit cho trục y. Đây là một kỹ thuật cực kỳ quan trọng khi so sánh hai biến có sự chênh lệch lớn về quy mô. Nó giúp cho sự thay đổi của biến nhỏ hơn (tài sản cố định) vẫn có thể được nhìn thấy rõ ràng thay vì bị dìm xuống.
Ý nghĩa thống kê và kinh tế:
– Thống kê: So sánh xu hướng của hai chuỗi thời gian có quy mô khác nhau.
– Kinh tế: Giai đoạn 2015-2022 cả hai đường đều có xu hướng dốc lên, cho thấy cả hai loại tài sản đều tăng trưởng. Giai đoạn 2022-2024 đường màu xám có độ dốc đi xuống rõ rệt. Biểu đồ cho thấy công ty đã có một giai đoạn tăng trưởng song song ở cả hai mặt trận. Tuy nhiên, trong 2 năm gần đây đã có sự thay đổi chiến lược đó là công ty cắt giảm đầu tư vào tài sản cố định trong khi vẫn duy trì quy mô hàng tồn kho lớn.
capital_structure <- data_long_assets %>%
filter(ChiTieu %in% c("NỢ PHẢI TRẢ", "VỐN CHỦ SỞ HỮU"))
ggplot(capital_structure, aes(x = Nam, y = GiaTri, fill = ChiTieu)) +
geom_area(position = "fill") +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
scale_fill_manual(values = c("NỢ PHẢI TRẢ" = "firebrick", "VỐN CHỦ SỞ HỮU" = "steelblue")) +
labs(
title = "Cơ cấu nguồn vốn: Nợ phải trả và vốn chủ sở hữu",
x = "Năm", y = "Tỷ trọng", fill = "Nguồn vốn"
)
Giải thích kỹ thuật:
– (2): Vẽ biểu đồ diện tích chồng. position = “fill” là một kỹ thuật chuẩn hóa, nó tự động tính toán tỷ trọng của mỗi nhóm (fill = ChiTieu) trong tổng thể tại mỗi điểm trên trục x, và đảm bảo tổng chiều cao luôn là 100%.
– (3): Định dạng trục y để hiển thị dưới dạng phần trăm, giúp việc đọc tỷ trọng trở nên trực quan.
– (5): Tự định nghĩa màu sắc cho từng thành phần (nợ và vốn chủ sở hữu) để tăng tính thẩm mỹ và rõ ràng.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ diện tích 100% là công cụ trực quan hóa lý tưởng để thể hiện sự thay đổi trong cơ cấu tỷ trọng của một tổng thể theo thời gian. Nó tập trung vào sự thay đổi tương đối, không phải giá trị tuyệt đối.
– Kinh tế: Vùng diện tích màu đỏ luôn chiếm phần lớn của biểu đồ (thường trên 60%). Điều này khẳng định mạnh mẽ rằng công ty sử dụng đòn bẩy nợ làm nguồn vốn chính để tài trợ cho tài sản và hoạt động tăng trưởng. Có một xu hướng rõ rệt là vùng diện tích màu xanh dương ngày càng mở rộng ra, đặc biệt là từ sau năm 2017. Đây là một tín hiệu rất tích cực về quản trị tài chính. Nó cho thấy công ty đang chủ động giảm bớt sự phụ thuộc vào nợ vay và củng cố nền tảng vốn tự có thông qua tích lũy lợi nhuận.
ggplot(debt_to_equity_ratio, aes(x = Nam, y = TyLe_No_Tren_VCSH)) +
geom_line(color = "darkred", linewidth = 1.2) +
geom_point(color = "darkred", size = 3) +
geom_hline(yintercept = 1, linetype = "dashed", color = "blue") +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
annotate("text", x = 2016, y = 1.1, label = "Ngưỡng an toàn", color = "blue") +
labs(
title = "Xu hướng tỷ lệ nợ trên vốn chủ sở hữu",
x = "Năm", y = "Tỷ lệ (lần)"
)
Giải thích kỹ thuật:
– (2) và (3): Kết hợp đường và điểm để vừa thể hiện xu hướng liên tục vừa nhấn mạnh giá trị tại từng năm.
– (4): Thêm một đường tham chiếu ngang tại mốc 1.0.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ đường là phương pháp tiêu chuẩn để trực quan hóa sự thay đổi của một biến tỷ lệ qua thời gian.
– Kinh tế: Đường biểu diễn luôn luôn nằm cao hơn đáng kể so với ngưỡng an toàn 1.0. Tỷ lệ này đạt đỉnh điểm gần 3.0 vào giai đoạn 2016-2017. Một tỷ lệ gần bằng 3 có nghĩa là cứ mỗi 1 đồng vốn chủ sở hữu, công ty đang gánh tới gần 3 đồng nợ. Đây là một mức đòn bẩy rất cao, cho thấy một chiến lược tăng trưởng quyết liệt nhưng cũng tiềm ẩn rủi ro tài chính lớn.
ggplot(short_term_loan_ratio, aes(x = Nam, y = TyLe_VayNH_Tren_TongNo)) +
geom_area(fill = "cornflowerblue", alpha = 0.5) +
geom_line(color = "cornflowerblue", linewidth = 1.2) +
geom_point(color = "darkblue", size = 3) +
geom_text(aes(label = scales::percent(TyLe_VayNH_Tren_TongNo, 1)), vjust = -0.5) +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Tỷ trọng vay ngắn hạn trong tổng nợ",
x = "Năm", y = "Tỷ lệ"
)
Giải thích kỹ thuật:
– (2): Vẽ biểu đồ diện tích, tô màu vùng diện tích dưới đường biểu diễn. Có alpha = 0.5 làm cho màu hơi trong suốt. Layer này giúp nhấn mạnh khối lượng hoặc quy mô của tỷ lệ qua thời gian.
– (3): Vẽ một đường xu hướng đậm lên trên vùng diện tích giúp làm rõ hướng đi của dữ liệu.
– (4): Thêm các điểm dữ liệu tại mỗi năm giúp xác định chính xác giá trị tại từng thời điểm.
– (5): Thêm nhãn phần trăm lên trên mỗi điểm dữ liệu giúp có thể nắm bắt con số chính xác mà không cần phải dóng trục y.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ diện tích kết hợp với đường là một phương pháp trực quan hóa mạnh mẽ, vừa thể hiện xu hướng vừa nhấn mạnh quy mô của một chuỗi thời gian.
– Kinh tế: Đường biểu diễn có một xu hướng tăng rõ rệt trong dài hạn, từ 43% năm 2015 lên đến 65% vào năm 2024. Điều này cho thấy công ty đang ngày càng phụ thuộc nhiều hơn vào các khoản vay ngân hàng ngắn hạn để tài trợ cho hoạt động. Tỷ trọng của các khoản chiếm dụng vốn có thể đang giảm xuống. Tỷ lệ này giảm mạnh vào năm 2022. Điều này khớp với các phân tích trước đó, cho thấy năm 2022 là một năm công ty chủ động giảm bớt các khoản vay ngắn hạn để tái cơ cấu và giảm rủi ro.
ggplot(long_term_loan_ratio, aes(x = Nam, y = TyLe_VayDH_Tren_TongNo)) +
geom_col(aes(fill = TyLe_VayDH_Tren_TongNo > 0), show.legend = FALSE) +
geom_text(aes(label = scales::percent(TyLe_VayDH_Tren_TongNo, 1)), vjust = -0.5) +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
scale_fill_manual(values = c("TRUE" = "darkgreen", "FALSE" = "grey")) +
labs(
title = "Tỷ trọng vay dài hạn trong tổng nợ",
x = "Năm", y = "Tỷ lệ"
)
Giải thích kỹ thuật:
– (2): Vẽ biểu đồ cột, với màu sắc (fill) được quyết định bởi một điều kiện logic. Các năm có tỷ lệ vay dài hạn lớn hơn 0 sẽ có một màu, và các năm bằng 0 sẽ có màu khác.
– (3): Thêm nhãn phần trăm lên trên mỗi cột.
– (6): Tự định nghĩa màu sắc cho hai trạng thái TRUE (có vay dài hạn) và FALSE (không vay dài hạn).
Ý nghĩa thống kê và kinh tế:
– Thống kê: Biểu đồ cột phân kỳ này rất hiệu quả trong việc làm nổi bật sự khác biệt giữa hai trạng thái (có và không có) và so sánh quy mô giữa các năm có.
– Kinh tế: Nợ dài hạn chỉ được sử dụng với tỷ trọng đáng kể trong hai giai đoạn chính: 2017-2020 và đặc biệt là 2022-2023. Cho thấy việc vay dài hạn chỉ được thực hiện khi có các nhu cầu vốn đặc biệt. Giai đoạn 2017-2020 có thể để tài trợ cho các dự án đầu tư vào tài sản cố định. Giai đoạn 2022-2023 tỷ trọng tăng vọt lên mức cao nhất, đặc biệt là năm 2022. Điều này củng cố mạnh mẽ giả thuyết về một cuộc tái cơ cấu nợ, khi công ty phát hành nợ dài hạn để trả bớt các khoản nợ ngắn hạn đến hạn giúp cấu trúc nợ trở nên an toàn hơn.
debt_ratio_highlight <- analytical_df_assets %>%
mutate(Highlight = ifelse(Nam %in% c(2016, 2022), "Điểm nhấn", "Bình thường"))
ggplot(debt_ratio_highlight, aes(x = Nam, y = TyLeNo_Tren_TaiSan, fill = Highlight)) +
geom_col() +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
scale_fill_manual(values = c("Điểm nhấn" = "gold", "Bình thường" = "grey")) +
geom_text(aes(label = scales::percent(TyLeNo_Tren_TaiSan, 1)), vjust = -0.5, size = 3) +
labs(
title = "Các năm có tỷ lệ nợ cao nhất và thấp nhất",
x = "Năm", y = "Tỷ lệ nợ trên tổng tài sản"
) +
theme(legend.position = "none")
Giải thích kỹ thuật:
– (2): Tạo một biến phân loại mới để đánh dấu các năm quan trọng (năm có tỷ lệ nợ cao nhất và thấp nhất).
– (4): Vẽ biểu đồ cột, với màu sắc được quyết định bởi biến Highlight.
– (7): Tự định nghĩa màu sắc cho các nhóm “điểm nhấn” và “bình thường”.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Đây là một kỹ thuật trực quan hóa hiệu quả để thu hút sự chú ý vào các điểm dữ liệu quan trọng nhất.
– Kinh tế: Cột năm 2016 được tô màu vàng và là cột cao nhất, đạt 74%. Biểu đồ làm nổi bật đây là đỉnh cao của giai đoạn tăng trưởng nóng và cũng là năm mà rủi ro tài chính của công ty ở mức cao nhất. Cột năm 2022 được tô màu vàng và là cột thấp nhất, chỉ còn 57%. Đây là một sự kiện rất quan trọng. Biểu đồ làm nổi bật sự thay đổi rõ rệt trong chiến lược, khi công ty đã chủ động giảm bớt đòn bẩy tài chính một cách đáng kể. Điều này hoàn toàn khớp với các phân tích trước đó về việc công ty trả nợ ròng và tái cơ cấu trong năm 2022.
ggplot(top_3_assets, aes(x = reorder(ChiTieu, GiaTriTrungBinh), y = GiaTriTrungBinh)) +
geom_segment(aes(xend = reorder(ChiTieu, GiaTriTrungBinh), yend = 0), color = "skyblue") +
geom_point(color = "blue", size = 10, alpha = 0.8) +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
coord_flip() +
labs(
title = "Top 3 khoản mục tài sản lớn nhất (Trung bình 10 năm)",
x = "", y = "Giá trị trung bình"
) +
theme(panel.grid.major.y = element_blank())
Giải thích kỹ thuật:
– (2) và (3): Kết hợp hai geom này để tạo ra biểu đồ kẹo mút (lollipop chart). Đây là một giải pháp thay thế tinh tế cho biểu đồ cột ngang.
– (5): Xoay biểu đồ để các nhãn dài có thể đọc được.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Là một cách xếp hạng trực quan, tập trung vào điểm cuối giá trị của mỗi thanh.
– Kinh tế: Điểm của tài sản ngắn hạn nằm ở vị trí xa nhất bên phải, cho thấy giá trị trung bình của nó lớn nhất. Hoạt động chính xoay quanh việc quản lý các tài sản ngắn hạn. Điểm của hàng tồn kho đứng thứ hai. Cho thấy hàng tồn kho là thành phần quan trọng nhất trong tài sản ngắn hạn. Hoạt động kinh doanh phụ thuộc rất lớn vào việc mua và bán hàng hóa. Điểm của tài sản dài hạn có giá trị trung bình thấp nhất trong ba khoản mục. Cho thấy công ty không phải là một doanh nghiệp sản xuất nặng.
ggplot(top_3_liabilities, aes(x = reorder(ChiTieu, GiaTriTrungBinh), y = GiaTriTrungBinh)) +
geom_segment(aes(xend = reorder(ChiTieu, GiaTriTrungBinh), yend = 0), color = "salmon") +
geom_point(color = "red", size = 10, alpha = 0.8) +
scale_y_continuous(labels = label_number(suffix = " tỷ", scale = 1e-9)) +
coord_flip() +
labs(
title = "Top 3 khoản mục nợ lớn nhất (Trung bình 10 năm)",
x = "", y = "Giá trị trung bình"
) +
theme(panel.grid.major.y = element_blank())
Giải thích kỹ thuật:
– (2) và (3): Kết hợp hai geom này để tạo ra biểu đồ kẹo mút (lollipop chart). Đây là một giải pháp thay thế tinh tế cho biểu đồ cột ngang.
– (5): Xoay biểu đồ để các nhãn dài có thể đọc được.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Là một cách xếp hạng trực quan, tập trung vào điểm cuối giá trị của mỗi thanh.
– Kinh tế: Điểm của nợ ngắn hạn nằm ở vị trí xa nhất bên phải, cho thấy giá trị trung bình của nó lớn nhất. Điều này khẳng định rằng nguồn tài trợ chính của công ty đến từ các nghĩa vụ phải trả trong vòng một năm. Điểm của vay ngắn hạn đứng thứ hai, chiếm khoảng một nửa giá trị của nợ ngắn hạn tổng thể. Điều này có nghĩa là cấu trúc nợ ngắn hạn của công ty được cân bằng giữa hai nguồn chính: Vay ngắn hạn và phần còn lại chủ yếu là nợ chiếm dụng. Điểm của vay dài hạn có giá trị trung bình rất nhỏ so với các khoản nợ ngắn hạn. Điều này một lần nữa khẳng định rằng công ty không ưu tiên sử dụng nợ dài hạn.
ratios_volatility_long <- ratios_volatility %>%
pivot_longer(everything(), names_to = "TySo", values_to = "DoLechChuan")
ggplot(ratios_volatility_long, aes(x = TySo, y = DoLechChuan, fill = TySo)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = round(DoLechChuan, 3)), vjust = -0.5) +
labs(
title = "Độ biến động của các tỷ số cấu trúc chính",
x = "Tỷ số", y = "Độ lệch chuẩn"
)
Giải thích kỹ thuật:
– (4): Vẽ một biểu đồ cột đơn giản để so sánh 3 giá trị độ lệch chuẩn đã được tính toán.
Ý nghĩa thống kê và kinh tế:
– Thống kê: Trực quan hóa một đại lượng thống kê về độ phân tán (độ lệch chuẩn), giúp so sánh mức độ biến động giữa các nhóm.
– Kinh tế: Cột màu đỏ có chiều cao thấp nhất. Mặc dù công ty sử dụng đòn bẩy cao nhưng mức độ đòn bẩy này được duy trì một cách rất nhất quán qua các năm. Bên cạnh đó cột màu xanh lá có chiều cao cao nhất. Điều này cho thấy việc quản lý hàng tồn kho của công ty rất thất thường. Tỷ trọng hàng tồn kho trong tài sản ngắn hạn thay đổi mạnh mẽ qua các năm. Đây có thể là một điểm yếu, phản ánh sự khó khăn trong việc dự báo nhu cầu hoặc quản lý chuỗi cung ứng.
growth_comparison <- growth_comparison %>%
mutate(ChenhLech = TangTruong_TaiSan_Pct - TangTruong_VCSH_Pct)
ggplot(growth_comparison, aes(x = Nam, y = ChenhLech, fill = ChenhLech > 0)) +
geom_col(show.legend = FALSE) +
geom_hline(yintercept = 0) +
scale_x_continuous(breaks = seq(2015, 2024, 1)) +
labs(
title = "Chênh lệch tốc độ tăng trưởng: Tài sản và vốn chủ sở hữu",
x = "Năm", y = "Chênh lệch tốc độ tăng trưởng (%)"
)
Giải thích kỹ thuật:
– (2): Tạo ra một biến mới thể hiện sự khác biệt giữa hai tốc độ tăng trưởng.
– (4): Vẽ biểu đồ cột phân kỳ, tô màu khác nhau cho các năm có chênh lệch dương (tăng trưởng tài sản nhanh hơn -> tăng nợ) và chênh lệch âm (tăng trưởng VCSH nhanh hơn -> giảm nợ).
Ý nghĩa thống kê và kinh tế:
– Thống kê: Đây là một biểu đồ độ lệch, trực quan hóa sự khác biệt giữa hai chuỗi thời gian.
– Kinh tế: Các cột dương xuất hiện trong giai đoạn tăng trưởng nóng như 2016. Một cột dương có nghĩa là tốc độ tăng trưởng tài sản nhanh hơn tốc độ tăng trưởng vốn chủ sở hữu. Các cột âm xuất hiện trong những năm quan trọng như 2018 và 2022. Một cột âm có nghĩa là tốc độ tăng trưởng vốn chủ sở hữu nhanh hơn tốc độ tăng trưởng tài sản. Điều này cho thấy công ty đang trong giai đoạn củng cố nội lực, tích lũy lợi nhuận hiệu quả hơn hoặc chủ động giảm nợ, làm cho cấu trúc vốn trở nên lành mạnh và an toàn hơn.
structure_kpi_long <- structure_kpi_summary %>%
pivot_longer(-Nam, names_to = "ChiSo", values_to = "TyLe")
ggplot(structure_kpi_long, aes(x = Nam, y = ChiSo, fill = TyLe)) +
geom_tile(color = "white") +
geom_text(aes(label = scales::percent(TyLe, 1)), color = "black", size = 3) +
scale_x_continuous(breaks = seq(2015, 2024, 1), position = "top") +
scale_fill_gradient(low = "lightblue", high = "darkblue", labels = scales::percent) +
labs(
title = "Bảng điều khiển các chỉ số cấu trúc chính",
x = "Năm", y = "Chỉ số", fill = "Giá trị"
) +
theme_minimal(base_family = "Roboto") +
theme(legend.position = "bottom")
Giải thích kỹ thuật:
– (4): Vẽ biểu đồ dạng ô (heatmap). Mỗi ô đại diện cho một chỉ số trong một năm.
– (5): Thêm nhãn số liệu vào giữa mỗi ô.
– (7): Tạo một dải màu gradient, ví dụ từ nhạt (giá trị thấp) đến đậm (giá trị cao).
Ý nghĩa thống kê và kinh tế:
– Thống kê: Heatmap là công cụ mạnh mẽ để trực quan hóa một ma trận dữ liệu giúp nhận diện các mẫu hình và các điểm dị thường một cách nhanh chóng thông qua màu sắc.
– Kinh tế: Dòng TyLeTonKho_Tren_TSNH có xu hướng chuyển từ màu xanh đậm sang màu xanh nhạt qua các năm. Màu sắc nhạt dần cho thấy tỷ lệ tồn kho đang giảm mạnh. Trong khi đó dòng TyLeNo_Tren_TaiSan cũng có xu hướng nhạt màu dần, đặc biệt là từ sau năm 2017. Cho thấy công ty đang dần giảm mức độ đòn bẩy tài chính tổng thể. Ngược lại, dòng TyLeVay_Tren_TongNo có xu hướng đậm màu dần qua các năm. Cho thấy mặc dù tổng nợ giảm nhưng tỷ trọng của các khoản vay có tính lãi trong tổng nợ lại đang tăng lên.
– Bức tranh tổng thể là về một doanh nghiệp đã đi qua giai đoạn tăng trưởng nóng và đang trong quá trình tối ưu hóa mô hình hoạt động. Các chỉ số đều cho thấy một sự cải thiện về chất lượng: quản lý hàng tồn kho hiệu quả hơn, cấu trúc vốn an toàn hơn. Mặc dù vẫn duy trì một mức độ đòn bẩy đáng kể và phụ thuộc vào các nguồn vốn ngắn hạn nhưng những hành động tái cơ cấu gần đây cho thấy ban lãnh đạo đang có những bước đi chiến lược để hướng tới một mô hình tăng trưởng bền vững và ít rủi ro hơn trong tương lai.