#install.packages("gganimate")
d <- read.csv("C:/Users/CHI LINH/Downloads/World-Stock-Prices-Dataset.csv")
library(dplyr)
library(lubridate)
library(moments)
library(ggplot2)
library(scales)
library(gganimate)
library(tidyr)
Hàm str() được dùng để hiển thị một cách cô đọng cấu
trúc bên trong của một đối tượng R. Đối với một bảng dữ liệu (data
frame), nó sẽ cho bạn biết: * Loại đối tượng là gì (ví dụ: data frame).
* Có bao nhiêu quan sát (hàng) và bao nhiêu biến (cột). * Tên của từng
cột. * Kiểu dữ liệu của từng cột (num - số,
chr - chuỗi ký tự, Factor - yếu tố, v.v.). *
Một vài giá trị đầu tiên của mỗi cột để bạn có cái nhìn tổng quan.
str(d)
## 'data.frame': 310122 obs. of 13 variables:
## $ Date : chr "2025-07-03 00:00:00-04:00" "2025-07-03 00:00:00-04:00" "2025-07-03 00:00:00-04:00" "2025-07-03 00:00:00-04:00" ...
## $ Open : num 6.63 106.75 122.63 221.71 212.15 ...
## $ High : num 6.74 108.37 123.05 224.01 214.65 ...
## $ Low : num 6.61 106.33 121.55 221.36 211.81 ...
## $ Close : num 6.64 107.34 121.93 223.41 213.55 ...
## $ Volume : num 4209664 560190 36600 29295154 34697317 ...
## $ Brand_Name : chr "peloton" "crocs" "adidas" "amazon" ...
## $ Ticker : chr "PTON" "CROX" "ADDYY" "AMZN" ...
## $ Industry_Tag : chr "fitness" "footwear" "apparel" "e-commerce" ...
## $ Country : chr "usa" "usa" "germany" "usa" ...
## $ Dividends : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Stock.Splits : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Capital.Gains: num NA NA NA NA NA NA NA NA NA NA ...
Với bộ dữ liệu có 310,122 hàng và 13 biến quan sát Và trong 13 biến có 5 biến có kiểu dữ liệu chuỗi ký tự “chr” - gồm các biến Date, Bran_Name, Ticker, Industry_Tag, Country. Và còn lại là 8 biến có kiểu dữ liệu là số “num” - gồm các biến Open, High, Low, Close, volume.
head(d, 3)
## Date Open High Low Close Volume Brand_Name
## 1 2025-07-03 00:00:00-04:00 6.63 6.74 6.6150 6.64 4209664 peloton
## 2 2025-07-03 00:00:00-04:00 106.75 108.37 106.3301 107.34 560190 crocs
## 3 2025-07-03 00:00:00-04:00 122.63 123.05 121.5500 121.93 36600 adidas
## Ticker Industry_Tag Country Dividends Stock.Splits Capital.Gains
## 1 PTON fitness usa 0 0 NA
## 2 CROX footwear usa 0 0 NA
## 3 ADDYY apparel germany 0 0 NA
tail(d, 3)
## Date Open High Low Close
## 310120 2000-01-03 00:00:00-05:00 72.313085 72.405794 71.756831 72.034958
## 310121 2000-01-03 00:00:00-05:00 7.289986 7.342182 7.098602 7.168196
## 310122 2000-01-03 00:00:00-05:00 5.731675 5.793975 5.427959 5.482471
## Volume Brand_Name Ticker Industry_Tag Country Dividends
## 310120 21200 toyota TM automotive japan 0
## 310121 882200 nordstrom JWN retail usa 0
## 310122 5825700 american eagle outfitters AEO apparel usa 0
## Stock.Splits Capital.Gains
## 310120 0 NA
## 310121 0 NA
## 310122 0 NA
** Ý nghĩa Kỹ Thuật
head() và tail() giúp nhà phân tích nhanh
chóng xác nhận rằng dữ liệu đã được tải vào R một cách chính xác. Họ có
thể thấy ngay tên các cột, kiểu dữ liệu và một vài giá trị mẫu.2025-07-03) nằm ở trên đầu (head), và dữ liệu
cũ nhất (2000-01-03) nằm ở dưới cùng (tail).
Đây là một phát hiện kỹ thuật cực kỳ quan trọng, ảnh hưởng đến mọi phân
tích về chuỗi thời gian sau này.Capital.Gains, ta thấy giá trị
NA (Not Available). Điều này cho thấy dữ liệu có thể bị
thiếu ở cột này và cần được xử lý.2025-07-03 là một ngày trong tương lai. Điều này
có thể là dữ liệu dự báo, dữ liệu giả lập, hoặc một lỗi nhập liệu. Người
phân tích cần phải làm rõ điểm này.** Ý nghĩa Kinh tế:kiểm tra được tính toàn vẹn kỹ thuật của dữ liệu mà còn rút ra được những nhận định ban đầu rất quan trọng về mặt kinh tế: phạm vi thời gian, sự đa dạng của danh mục cổ phiếu và đặc điểm sơ bộ của từng mã.
Lệnh này có nghĩa là “Với mỗi cột trong bảng dữ liệu dvà
đếm xem có bao nhiêu giá trị bị thiếu và hiển thị kết quả”
missing_values <- sapply(d, function(x) sum(is.na(x)))
print(missing_values)
## Date Open High Low Close
## 0 0 0 0 0
## Volume Brand_Name Ticker Industry_Tag Country
## 0 0 0 0 0
## Dividends Stock.Splits Capital.Gains
## 0 0 310120
** Ý nghĩa Kỹ thuật
Ticker) vào một ngày
(Date) cụ thể.Volume) hoặc giá trung bình
(Close), kết quả sẽ bị sai lệch, bị thổi phồng một cách giả
tạo.** Ý nghĩa Kinh tế và Phân tích
red flag) cho thấy có vấn đề nghiêm trọng trong quy trình
thu thập dữ liệu (data pipeline). Có thể dữ liệu đã được kéo về từ API
nhiều lần, hoặc file dữ liệu đã được ghép nối không chính xác.so_trung_lap <- sum(duplicated(d))
print(so_trung_lap)
## [1] 0
-Capital.Gains # 1.6. Xóa biến cuối có chứa giá trị NA
d <- d %>% select(-Capital.Gains)
Xóa đi cộ biến Capital.Gains để phân tích ở những phần sau được chuẩn hóa dữ liệu hơn # 1.7.Cổ tức chia thành có chia hoặc l có chia
d$Dividends <- ifelse(d$Dividends > 0, 1, 0)
Ý nghĩa trực tiếp: Hầu hết các dòng dữ liệu trong bảng của bạn đều có giá trị Dividends là 0.
Ý nghĩa kinh tế: Điều này phản ánh một thực tế quan trọng: Việc trả cổ tức là một sự kiện tương đối hiếm. Các công ty thường chỉ trả cổ tức theo quý hoặc theo năm. Do đó, nếu dữ liệu của bạn được ghi nhận theo ngày, thì trong hầu hết các ngày, một công ty sẽ không có hoạt động trả cổ tức. Ngoài ra, nhiều công ty (đặc biệt là các công ty công nghệ đang tăng trưởng) chọn không trả cổ tức mà giữ lại lợi nhuận để tái đầu tư.
Sự xuất hiện rải rác của số 1:
Ý nghĩa trực tiếp: Những con số 1 đánh dấu chính xác những thời điểm (những dòng dữ liệu) mà một công ty đã thực hiện trả cổ tức cho cổ đông.
Ý nghĩa trực tiếp: Đây là thông báo của R cho biết bộ dữ liệu của bạn rất lớn. R chỉ in ra một phần đầu của kết quả (khoảng 1000 dòng đầu tiên) để tránh làm tràn màn hình console. Có đến 309,122 dòng dữ liệu khác không được hiển thị.
Ý nghĩa kinh tế và dữ liệu: Điều này khẳng định rằng bạn đang làm việc với một bộ dữ liệu quy mô lớn (big data), có thể bao gồm dữ liệu của nhiều công ty trong nhiều năm. Điều này làm cho kết luận ở mục 1 càng trở nên đáng tin cậy: trong hàng trăm nghìn điểm dữ liệu, số lần trả cổ tức chỉ chiếm một phần nhỏ.
=> Về mặt kỹ thuật: Bạn đã biến đổi thành công cột Dividends thành một biến nhị phân (0/1), rất hữu ích cho các mô hình phân tích và học máy sau này dự đoán xem một công ty CÓ hay KHÔNG trả cổ tức.
=> Về mặt kinh tế: Nó cung cấp một cái nhìn thực tế về tần suất trả cổ tức trên thị trường chứng khoán – đây là một hành động không thường xuyên và chỉ xảy ra vào những thời điểm cụ thể.
dividend_stocks <- d[d$Dividends == 1, ]
head(dividend_stocks, 3)
## Date Open High Low Close Volume
## 29 2025-07-03 00:00:00-04:00 325.33 329.14 324.18 328.13 1541800
## 61 2025-07-03 00:00:00-04:00 68.18 69.47 68.18 69.37 17973500
## 62 2025-07-03 00:00:00-04:00 292.15 296.40 291.21 296.00 6541600
## Brand_Name Ticker Industry_Tag Country Dividends Stock.Splits
## 29 american express AXP finance usa 1 0
## 61 cisco CSCO technology usa 1 0
## 62 jpmorgan chase & co JPM finance usa 1 0
result <- dividend_stocks %>%
distinct(Ticker, .keep_all = TRUE) %>%
group_by(Country) %>%
summarise(Tickers = paste(Ticker, collapse = ", "))
print(result)
## # A tibble: 6 × 2
## Country Tickers
## <chr> <chr>
## 1 france LVMUY, UBSFY
## 2 germany POAHY, PMMAF, ADDYY, BAMXF
## 3 japan HMC, TM, NTDOY
## 4 netherlands UL, PHG
## 5 switzerland LOGI
## 6 usa AXP, CSCO, JPM, DIS, FDX, CRM, LUV, KO, GOOGL, HD, NKE, MCD, JNJ,…
Điểm nổi bật nhất là danh sách các mã cổ phiếu của Mỹ (usa) dài hơn rất nhiều so với tất cả các quốc gia khác cộng lại.
=> Ý nghĩa kinh tế: Điều này cho thấy bộ dữ liệu của bạn tập trung chủ yếu vào thị trường chứng khoán Mỹ. Bất kỳ phân tích nào được thực hiện trên toàn bộ dữ liệu sẽ bị ảnh hưởng lớn bởi hiệu suất của các công ty Mỹ. Nó cũng phản ánh quy mô và sự đa dạng của nền kinh tế Mỹ, với sự hiện diện của nhiều tập đoàn lớn trong các lĩnh vực khác nhau (tài chính, công nghệ, bán lẻ, tiêu dùng, v.v.).
Đại diện cho các nền kinh tế lớn khác:
Bảng dữ liệu cũng bao gồm các công ty chủ chốt từ các nền kinh tế quan trọng khác:
Đức (germany): Nổi bật với ngành ô tô (POAHY - Porsche) và hàng tiêu dùng (ADDYY - Adidas).
Nhật Bản (japan): Cũng mạnh về ô tô (Honda, Toyota) và có thêm ngành giải trí/gaming (Nintendo).
Pháp (france): Đại diện bởi ngành hàng xa xỉ (LVMUY - LVMH).
=> Ý nghĩa kinh tế: Điều này cho phép thực hiện các phân tích so sánh giữa các thị trường hoặc các ngành công nghiệp đặc trưng của từng quốc gia.
table(d$Industry_Tag)
##
## apparel automotive aviation consumer goods
## 21069 24867 11098 19407
## cryptocurrency e-commerce entertainment finance
## 1117 9072 12342 22210
## financial services fitness food food & beverage
## 2380 1506 11415 19409
## footwear gaming healthcare hospitality
## 11407 11546 6470 10633
## logistics luxury goods manufacturing music
## 6469 4939 6470 1879
## retail social media technology
## 25842 1618 66957
Các Ngành Trọng tâm:
Các ngành có con số cao nhất như technology (66,957), retail (25,842), automotive (24,867), và finance (22,210) là những ngành được đại diện nhiều nhất trong bộ dữ liệu. Điều này có nghĩa là bất kỳ phân tích nào bạn thực hiện cũng sẽ có nhiều thông tin và có thể đáng tin cậy hơn cho các ngành này.
Các Ngành Ít Dữ liệu hơn:
Các ngành có con số thấp như cryptocurrency (1,117), fitness (1,506), social media (1,618) là những ngành có ít dữ liệu nhất. Điều này có thể do chúng là những ngành mới hơn, có ít công ty niêm yết hơn, hoặc đơn giản là bộ dữ liệu của bạn không tập trung thu thập về chúng. Khi phân tích các ngành này, bạn cần cẩn trọng vì mẫu dữ liệu nhỏ hơn.
=> kết quả này là một bước kiểm tra dữ liệu quan trọng, cho bạn thấy “bức tranh toàn cảnh” về thành phần của bộ dữ liệu. Nó cho biết ngành nào chiếm ưu thế và ngành nào là thiểu số, điều này ảnh hưởng trực tiếp đến độ tin cậy và phạm vi của các phân tích kinh tế mà bạn sẽ thực hiện sau này.
pt1 <-d %>%
mutate(Price_Category = case_when(
Close < 50 ~ "Rẻ",
Close >= 50 & Close < 500 ~ "Trung bình",
Close >= 500 & Close < 1000 ~ "Cao",
Close >= 1000 ~ "Rất cao"
))
pt1 <- pt1 %>%
select(Date, Close, Price_Category, Volume, Brand_Name, Ticker, Industry_Tag, Country, Dividends)
pt1[1:10, ]
## Date Close Price_Category Volume
## 1 2025-07-03 00:00:00-04:00 6.64 Rẻ 4209664
## 2 2025-07-03 00:00:00-04:00 107.34 Trung bình 560190
## 3 2025-07-03 00:00:00-04:00 121.93 Trung bình 36600
## 4 2025-07-03 00:00:00-04:00 223.41 Trung bình 29295154
## 5 2025-07-03 00:00:00-04:00 213.55 Trung bình 34697317
## 6 2025-07-03 00:00:00-04:00 76.39 Trung bình 11545304
## 7 2025-07-03 00:00:00-04:00 104.06 Trung bình 3535290
## 8 2025-07-03 00:00:00-04:00 179.53 Trung bình 21563145
## 9 2025-07-03 00:00:00-04:00 725.05 Cao 1071771
## 10 2025-07-03 00:00:00-04:00 78.58 Trung bình 2882442
## Brand_Name Ticker Industry_Tag Country Dividends
## 1 peloton PTON fitness usa 0
## 2 crocs CROX footwear usa 0
## 3 adidas ADDYY apparel germany 0
## 4 amazon AMZN e-commerce usa 0
## 5 apple AAPL technology usa 0
## 6 nike NKE apparel usa 0
## 7 target TGT retail usa 0
## 8 google GOOGL technology usa 0
## 9 spotify SPOT music usa 0
## 10 zoom video communications ZM technology usa 0
Bảng dữ liệu trên thể hiện thông tin giá cổ phiếu của 6 thương hiệu quốc tế vào cùng một ngày giao dịch là 03/07/2025, bao gồm các cột về giá đóng cửa, khối lượng giao dịch, ngành nghề, quốc gia và cổ tức.
Cụ thể, các doanh nghiệp có quy mô và lĩnh vực khác nhau như Peloton (fitness), Crocs (footwear), Adidas (apparel), Amazon (e-commerce), Apple (technology) và Nike (apparel). Giá đóng cửa của các cổ phiếu này dao động từ 6,64 USD đến 223,41 USD, trong đó Peloton thuộc nhóm “rẻ”, còn các cổ phiếu còn lại được xếp vào nhóm “trung bình” theo tiêu chí phân loại giá.
Về khối lượng giao dịch, Apple và Amazon có khối lượng rất lớn (hơn 29–34 triệu cổ phiếu), phản ánh tính thanh khoản cao và mức độ quan tâm mạnh mẽ của nhà đầu tư, trong khi Adidas và Crocs có khối lượng thấp hơn đáng kể. Tất cả các cổ phiếu trong mẫu đều có cổ tức bằng 0 tại thời điểm này, cho thấy không có đợt chi trả cổ tức trong ngày giao dịch đó.
Nhìn chung, dữ liệu này giúp người phân tích so sánh giá cổ phiếu, quy mô giao dịch và đặc điểm thị trường giữa các công ty, từ đó phục vụ cho các mục đích như phân tích hiệu suất cổ phiếu, định giá theo ngành, hoặc dự báo biến động giá. ## 2.2.Phân tổ theo khối lượng theo ngành theo ngày
pt2 <- d %>% # gán dữ liệu
mutate(Volume_Category = case_when( # tạo ra các cộ mới
Volume < 10000000 ~ "Thấp",
Volume >= 10000000 & Volume < 50000000 ~ "Trung bình",
Volume >= 50000000 & Volume <= 100000000 ~ "Lớn",
Volume > 100000000 ~ "Rất lớn"
))
pt2 <- pt2 %>%
select(Date, Close, Volume, Volume_Category, Brand_Name, Ticker, Industry_Tag, Country, Dividends)
head(pt2)
## Date Close Volume Volume_Category Brand_Name Ticker
## 1 2025-07-03 00:00:00-04:00 6.64 4209664 Thấp peloton PTON
## 2 2025-07-03 00:00:00-04:00 107.34 560190 Thấp crocs CROX
## 3 2025-07-03 00:00:00-04:00 121.93 36600 Thấp adidas ADDYY
## 4 2025-07-03 00:00:00-04:00 223.41 29295154 Trung bình amazon AMZN
## 5 2025-07-03 00:00:00-04:00 213.55 34697317 Trung bình apple AAPL
## 6 2025-07-03 00:00:00-04:00 76.39 11545304 Trung bình nike NKE
## Industry_Tag Country Dividends
## 1 fitness usa 0
## 2 footwear usa 0
## 3 apparel germany 0
## 4 e-commerce usa 0
## 5 technology usa 0
## 6 apparel usa 0
Date (Ngày): Thời gian ghi nhận dữ liệu, cụ thể là ngày 3 tháng 7 năm 2025.
Close (Giá đóng cửa): Giá của một cổ phiếu khi thị trường chứng khoán đóng cửa vào ngày hôm đó. vào cuối ngày 3/7/2025, một cổ phiếu của Peloton (PTON) có giá 6.64 (đơn vị tiền tệ, thường là USD).
Volume (Khối lượng giao dịch): Tổng số cổ phiếu được giao dịch (mua và bán) trong ngày.Có 4,209,664 cổ phiếu của Peloton được giao dịch vào ngày hôm đó. Khối lượng giao dịch cao thường cho thấy sự quan tâm lớn từ nhà đầu tư.
Volume_Category (Phân loại khối lượng): Phân loại khối lượng giao dịch thành các mức “Thấp” hoặc “Trung bình”. Điều này giúp nhanh chóng đánh giá mức độ quan tâm của thị trường đối với cổ phiếu so với các cổ phiếu khác hoặc so với mức trung bình của chính nó.
Brand_Name (Tên thương hiệu): Tên của công ty, như “peloton”, “amazon”.
Ticker (Mã cổ phiếu): Ký hiệu viết tắt duy nhất được sử dụng để xác định cổ phiếu của một công ty trên thị trường chứng khoán. “PTON” là mã của Peloton, và “AAPL” là mã của Apple.
Industry_Tag (Ngành): Lĩnh vực kinh doanh chính của công ty. Nike và Adidas thuộc ngành “may mặc” (apparel), trong khi Apple thuộc ngành “công nghệ” (technology).
Country (Quốc gia): Quốc gia nơi công ty đặt trụ sở chính. Adidas là của Đức (Germany), trong khi 5 công ty còn lại là của Mỹ (USA).
Dividends (Cổ tức): Khoản thanh toán mà một công ty trả cho các cổ đông. Trong bảng dữ liệu này, giá trị “0” cho tất cả các công ty có nghĩa là vào ngày đó, không có công ty nào trong danh sách trả cổ tức.
So sánh hiệu suất: Bạn có thể so sánh giá cổ phiếu và khối lượng giao dịch giữa các công ty. Ví dụ, Amazon (AMZN) và Apple (AAPL) có giá đóng cửa cao nhất và khối lượng giao dịch ở mức “Trung bình”, cho thấy đây là các cổ phiếu có giá trị lớn và được giao dịch sôi động. Ngược lại, Peloton (PTON) có giá cổ phiếu rất thấp (6.64) nhưng khối lượng giao dịch lại không hề nhỏ, trong khi Adidas (ADDYY) có giá cao nhưng khối lượng giao dịch lại ở mức “Thấp”.
Phân loại theo ngành và quốc gia: Dữ liệu cho thấy sự đa dạng về ngành nghề (thể dục, giày dép, may mặc, thương mại điện tử, công nghệ) và nguồn gốc quốc gia (Mỹ và Đức). Điều này hữu ích cho việc phân tích theo từng lĩnh vực hoặc so sánh hiệu suất của các công ty từ những thị trường khác nhau.
Thông tin cho nhà đầu tư: Dữ liệu này cung cấp các thông tin cơ bản mà một nhà đầu tư sẽ xem xét. Giá đóng cửa cho biết giá trị thị trường, khối lượng giao dịch phản ánh mức độ quan tâm và tính thanh khoản của cổ phiếu. Việc không có cổ tức cũng là một thông tin quan trọng.
pt3 <- d %>% # phép gán
mutate(Price_Volume_Category = case_when( # tạo ra bẳng mới xét họn điều kiện
Close < 100 & Volume < 10000000 ~ "Giá thấp - Khối lượng thấp",
Close < 100 & Volume >= 10000000 & Volume < 50000000 ~ "Giá thấp - Khối lượng trung bình",
Close < 100 & Volume >= 50000000 ~ "Giá thấp - Khối lượng lớn",
Close >= 100 & Close < 500 & Volume < 10000000 ~ "Giá trung bình - Khối lượng thấp",
Close >= 100 & Close < 500 & Volume >= 10000000 & Volume < 50000000 ~ "Giá trung bình - Khối lượng trung bình",
Close >= 100 & Close < 500 & Volume >= 50000000 ~ "Giá trung bình - Khối lượng lớn",
Close >= 500 & Volume < 10000000 ~ "Giá cao - Khối lượng thấp",
Close >= 500 & Volume >= 10000000 & Volume < 50000000 ~ "Giá cao - Khối lượng trung bình",
Close >= 500 & Volume >= 50000000 ~ "Giá cao - Khối lượng lớn"
))
pt3 <- pt3 %>%
select(Date, Close, Volume, Price_Volume_Category, Brand_Name, Ticker, Industry_Tag, Country, Dividends)
pt3[1:10, ]
## Date Close Volume
## 1 2025-07-03 00:00:00-04:00 6.64 4209664
## 2 2025-07-03 00:00:00-04:00 107.34 560190
## 3 2025-07-03 00:00:00-04:00 121.93 36600
## 4 2025-07-03 00:00:00-04:00 223.41 29295154
## 5 2025-07-03 00:00:00-04:00 213.55 34697317
## 6 2025-07-03 00:00:00-04:00 76.39 11545304
## 7 2025-07-03 00:00:00-04:00 104.06 3535290
## 8 2025-07-03 00:00:00-04:00 179.53 21563145
## 9 2025-07-03 00:00:00-04:00 725.05 1071771
## 10 2025-07-03 00:00:00-04:00 78.58 2882442
## Price_Volume_Category Brand_Name Ticker
## 1 Giá thấp - Khối lượng thấp peloton PTON
## 2 Giá trung bình - Khối lượng thấp crocs CROX
## 3 Giá trung bình - Khối lượng thấp adidas ADDYY
## 4 Giá trung bình - Khối lượng trung bình amazon AMZN
## 5 Giá trung bình - Khối lượng trung bình apple AAPL
## 6 Giá thấp - Khối lượng trung bình nike NKE
## 7 Giá trung bình - Khối lượng thấp target TGT
## 8 Giá trung bình - Khối lượng trung bình google GOOGL
## 9 Giá cao - Khối lượng thấp spotify SPOT
## 10 Giá thấp - Khối lượng thấp zoom video communications ZM
## Industry_Tag Country Dividends
## 1 fitness usa 0
## 2 footwear usa 0
## 3 apparel germany 0
## 4 e-commerce usa 0
## 5 technology usa 0
## 6 apparel usa 0
## 7 retail usa 0
## 8 technology usa 0
## 9 music usa 0
## 10 technology usa 0
Close (Giá đóng cửa): Đây là mức giá mà thị trường đồng ý trả cho một cổ phiếu của công ty vào cuối ngày giao dịch. Nó phản ánh sự định giá của thị trường về giá trị hiện tại và tiềm năng tương lai của công ty.Giá cao Costco $987.02, Spotify $725.05, Mastercard $569.24: Cho thấy nhà đầu tư có niềm tin lớn vào mô hình kinh doanh, lợi nhuận và khả năng tăng trưởng của các công ty này. Đây thường là các công ty đầu ngành, có lợi thế cạnh tranh bền vững.
Giá thấp như Peloton $6.64, Honda $30.28: Có thể do nhiều nguyên nhân: công ty đang gặp khó khăn, quy mô nhỏ hơn, hoặc đơn giản là họ phát hành số lượng cổ phiếu lớn khiến giá mỗi cổ phiếu thấp hơn.
Volume (Khối lượng giao dịch): Con số này thể hiện mức độ quan tâm của nhà đầu tư và tính thanh khoản của cổ phiếu. Khối lượng giao dịch càng cao, cổ phiếu càng dễ dàng được mua bán mà không ảnh hưởng nhiều đến giá.
Khối lượng lớn như Nvidia 142 triệu, Tesla 58 triệu: Cho thấy những cổ phiếu này đang thu hút sự chú ý cực lớn từ thị trường. Có thể có tin tức quan trọng, báo cáo tài chính tốt, hoặc đơn giản là chúng thuộc nhóm cổ phiếu “nóng” mà nhiều người muốn giao dịch. Đây là dấu hiệu của sự sôi động và niềm tin (hoặc cả sự đầu cơ) của thị trường.
Khối lượng thấp Adidas 36,600, Logitech 216,072: Cho thấy sự quan tâm của nhà đầu tư ít hơn trong ngày hôm đó. Cổ phiếu này có thể ổn định hơn, ít biến động hơn, hoặc thuộc về các công ty mà nhà đầu tư có xu hướng nắm giữ lâu dài thay vì giao dịch liên tục.
Price_Volume_Category (Phân loại giá và khối lượng): Cột này tổng hợp hai chỉ số trên, cho một cái nhìn nhanh và sâu sắc hơn về “tính cách” của mỗi cổ phiếu trên thị trường.
“Giá cao - Khối lượng thấp” (Costco, Mastercard): Đặc trưng của các cổ phiếu “blue-chip”, những gã khổng lồ ổn định. Nhà đầu tư mua và nắm giữ chúng vì tin tưởng vào sự bền vững lâu dài, không phải để lướt sóng.
“Giá trung bình - Khối lượng lớn” (Nvidia, Tesla): Đây là những ngôi sao của thị trường. Chúng có giá trị vốn hóa lớn và đang là tâm điểm của các cuộc thảo luận và giao dịch. Sự kết hợp này cho thấy cả giá trị thực tại và sự kỳ vọng lớn của nhà đầu tư.
“Giá thấp - Khối lượng trung bình” (Nike, Chipotle, Cisco): Các công ty này vẫn rất quen thuộc và được giao dịch tích cực, nhưng mức giá “mềm” hơn có thể thu hút một lượng lớn nhà đầu tư nhỏ lẻ.
“Giá thấp - Khối lượng thấp” (Peloton, Honda, Unilever): Có thể là các công ty đang trong giai đoạn khó khăn, ít được chú ý, hoặc thuộc các ngành công nghiệp ít biến động hơn.
Dividends (Cổ tức): Cổ tức là một phần lợi nhuận sau thuế mà công ty chia cho cổ đông. Nó là một hình thức trả lại giá trị trực tiếp cho nhà đầu tư.
Dividends = 1 (American Express): Chỉ có một công ty trong danh sách (American Express) trả cổ tức vào ngày này. Việc trả cổ tức thường là dấu hiệu của một công ty đã trưởng thành, có dòng tiền ổn định và lợi nhuận vững chắc. Họ tự tin vào sức khỏe tài chính của mình đến mức có thể chia sẻ lợi nhuận cho cổ đông.
Dividends = 0 (Hầu hết các công ty khác): Không trả cổ tức không có nghĩa là công ty yếu kém. Nhiều công ty, đặc biệt là trong lĩnh vực công nghệ (như Google, Amazon, Tesla), thường chọn tái đầu tư toàn bộ lợi nhuận vào nghiên cứu, phát triển và mở rộng kinh doanh để thúc đẩy tăng trưởng trong tương lai. Nhà đầu tư vào các công ty này kỳ vọng giá cổ phiếu sẽ tăng mạnh thay vì nhận tiền mặt từ cổ tức.
pt4<- d %>%
mutate(
Date = as.Date(Date),
Month = month(Date, label = TRUE, abbr = FALSE)
) %>%
group_by(Month, Industry_Tag, Country) %>%
summarise(
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Month, Industry_Tag)
pt4_filtered <- pt4 %>%
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 1000 ~ "Giá trung",
gia_tri >= 1000 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 100000000 ~ "Thanh khoản thấp",
khoi_luong >= 100000000 & khoi_luong < 1000000000 ~ "Thanh khoản trung",
khoi_luong >= 1000000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Month, Industry_Tag, Country,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier)
show(pt4_filtered)
## # A tibble: 384 × 7
## Month Industry_Tag Country gia_tri Price_Tier khoi_luong Liquidity_Tier
## <ord> <chr> <chr> <dbl> <chr> <dbl> <chr>
## 1 Tháng Giêng apparel germany 63.0 Giá thấp 32950. Thanh khoản t…
## 2 Tháng Giêng apparel usa 28.3 Giá thấp 7577394. Thanh khoản t…
## 3 Tháng Giêng automotive germany 37.6 Giá thấp 93028. Thanh khoản t…
## 4 Tháng Giêng automotive japan 63.7 Giá thấp 539808. Thanh khoản t…
## 5 Tháng Giêng automotive usa 105. Giá trung 99645814. Thanh khoản t…
## 6 Tháng Giêng aviation usa 29.1 Giá thấp 9020861. Thanh khoản t…
## 7 Tháng Giêng consumer go… nether… 28.3 Giá thấp 1458219. Thanh khoản t…
## 8 Tháng Giêng consumer go… usa 56.5 Giá thấp 7319693. Thanh khoản t…
## 9 Tháng Giêng cryptocurre… usa 177. Giá trung 11337161. Thanh khoản t…
## 10 Tháng Giêng e-commerce canada 54.1 Giá thấp 13064198. Thanh khoản t…
## # ℹ 374 more rows
Gia_tri (Giá trị): Con số này đại diện cho mức giá trung bình hoặc chỉ số định giá của các tài sản (cổ phiếu, sản phẩm, dịch vụ) trong một ngành.
Giá trị cao như : music ở Mỹ là 238.45, cryptocurrency là 177.10: Cho thấy thị trường đánh giá cao tiềm năng lợi nhuận và sự tăng trưởng của ngành này. Đây là những lĩnh vực có rào cản gia nhập cao, công nghệ độc quyền hoặc thương hiệu mạnh. Giá trị thấp như : apparel ở Mỹ là 28.27, consumer goods ở Hà Lan là 28.25): Thường là các ngành có tính cạnh tranh cao, biên lợi nhuận thấp hơn, hoặc sản phẩm mang tính phổ thông. khoi_luong (Khối lượng):Con số này phản ánh quy mô và mức độ sôi động của ngành. Nó có thể là tổng khối lượng giao dịch, sản lượng sản xuất, hoặc doanh số bán hàng. Phân tích: Khối lượng lớn như : e-commerce và technology ở Mỹ lên đến hơn 100 triệu): Đây là những ngành kinh tế xương sống, có quy mô thị trường khổng lồ, thu hút lượng lớn giao dịch và đầu tư. Nó cho thấy vai trò trung tâm của các ngành này trong nền kinh tế Mỹ. Khối lượng thấp như : gaming ở Pháp là 59,380, luxury goods là 148,022): Đây có thể là các thị trường ngách, dù có giá trị cao nhưng quy mô giao dịch nhỏ hơn, hoặc đơn giản là nền kinh tế của quốc gia đó nhỏ hơn. Liquidity_Tier (Mức thanh khoản): “Thanh khoản trung” (chỉ có ở Mỹ cho e-commerce, technology, automotive): Cho thấy chỉ những ngành lớn nhất trong nền kinh tế lớn nhất thế giới mới có đủ dòng tiền và hoạt động để được coi là có tính thanh khoản cao. Điều này khẳng định sự thống trị của thị trường Mỹ. “Thanh khoản thấp” (ở hầu hết các ngành/quốc gia khác): Cho thấy dù một ngành có được định giá cao (như cryptocurrency), nó vẫn có thể không có đủ người mua và bán liên tục. Điều này có thể hàm ý rủi ro cao hơn hoặc đó là thị trường dành cho các nhà đầu tư dài hạn.
pt5 <- d %>%
mutate(
Date = as.Date(Date),
Year = year(Date)
) %>%
group_by(Year, Industry_Tag, Country) %>%
summarise(
Avg_Close = mean(Close, na.rm = TRUE),
Avg_Volume = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(Price_Volume_Category = case_when(
Avg_Close < 100 & Avg_Volume < 10000000 ~ "Giá thấp - Khối lượng thấp",
Avg_Close < 100 & Avg_Volume >= 10000000 & Avg_Volume < 50000000 ~ "Giá thấp - Khối lượng trung bình",
Avg_Close < 100 & Avg_Volume >= 50000000 ~ "Giá thấp - Khối lượng lớn",
Avg_Close >= 100 & Avg_Close < 500 & Avg_Volume < 10000000 ~ "Giá trung bình - Khối lượng thấp",
Avg_Close >= 100 & Avg_Close < 500 & Avg_Volume >= 10000000 & Avg_Volume < 50000000 ~ "Giá trung bình - Khối lượng trung bình",
Avg_Close >= 100 & Avg_Close < 500 & Avg_Volume >= 50000000 ~ "Giá trung bình - Khối lượng lớn",
Avg_Close >= 500 & Avg_Volume < 10000000 ~ "Giá cao - Khối lượng thấp",
Avg_Close >= 500 & Avg_Volume >= 10000000 & Avg_Volume < 50000000 ~ "Giá cao - Khối lượng trung bình",
Avg_Close >= 500 & Avg_Volume >= 50000000 ~ "Giá cao - Khối lượng lớn"
)) %>%
select(Year, Avg_Close, Avg_Volume, Price_Volume_Category, Industry_Tag, Country)
show(pt5)
## # A tibble: 663 × 6
## Year Avg_Close Avg_Volume Price_Volume_Category Industry_Tag Country
## <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 2000 3.75 7902543. Giá thấp - Khối lượng thấp apparel usa
## 2 2000 38.6 48648. Giá thấp - Khối lượng thấp automotive japan
## 3 2000 13.4 2735833. Giá thấp - Khối lượng thấp aviation usa
## 4 2000 6.82 320459. Giá thấp - Khối lượng thấp consumer go… nether…
## 5 2000 17.9 6976633. Giá thấp - Khối lượng thấp consumer go… usa
## 6 2000 2.33 175159333. Giá thấp - Khối lượng lớn e-commerce usa
## 7 2000 28.8 5991648. Giá thấp - Khối lượng thấp entertainme… usa
## 8 2000 29.5 6808273. Giá thấp - Khối lượng thấp finance usa
## 9 2000 18.7 4654524. Giá thấp - Khối lượng thấp food usa
## 10 2000 11.0 10360835. Giá thấp - Khối lượng trung … food & beve… usa
## # ℹ 653 more rows
Avg_Close (Giá trung bình): Phản ánh niềm tin của nhà đầu tư và định giá của thị trường đối với một ngành trong năm đó. Giá cao cho thấy sự lạc quan về lợi nhuận và tăng trưởng.
Avg_Volume (Khối lượng trung bình): Thể hiện quy mô, mức độ quan tâm và tầm quan trọng kinh tế của ngành. Khối lượng lớn cho thấy ngành đó có nhiều hoạt động giao dịch và là một phần quan trọng của nền kinh tế.
Câu chuyện “Bong bóng Dot-com”: Đây là điểm nổi bật nhất. Ngành e-commerce (thương mại điện tử) của Mỹ có Avg_Close giảm mạnh từ 2.32 (năm 2000) xuống chỉ còn 0.61 (năm 2001). Đây là minh chứng rõ ràng cho sự sụp đổ của bong bóng dot-com, khi sự kỳ vọng quá lớn vào các công ty công nghệ đã tan vỡ, khiến giá cổ phiếu lao dốc.
Sự trỗi dậy của các “Gã khổng lồ”: Mặc dù giá cổ phiếu sụp đổ, các ngành e-commerce và technology của Mỹ vẫn được xếp loại “Khối lượng lớn”. Điều này cực kỳ quan trọng: nó cho thấy dù niềm tin về giá bị lung lay, quy mô và tầm ảnh hưởng của các ngành này vẫn rất lớn. Đây chính là nền móng cho sự thống trị của các công ty công nghệ lớn sau này.
Sự ổn định của các ngành truyền thống: Trong khi công nghệ biến động mạnh, các ngành như consumer goods (hàng tiêu dùng), automotive (ô tô), và healthcare (chăm sóc sức khỏe) có giá và khối lượng ổn định hơn nhiều. Điều này phản ánh bản chất bền vững, ít bị ảnh hưởng bởi các cú sốc đầu cơ của các ngành kinh tế cốt lõi.
Bức tranh kinh tế toàn cầu: Dữ liệu cho thấy thế mạnh kinh tế của từng quốc gia vào thời điểm đó: Mỹ dẫn đầu về công nghệ và thương mại điện tử, Nhật Bản mạnh về ô tô, và Hà Lan có vai trò trong ngành hàng tiêu dùng.
pt6 <- d %>%
filter(Country == "usa") %>%
mutate(
Date = as.Date(Date),
Month = month(Date, label = TRUE, abbr = FALSE)
) %>%
group_by(Month, Industry_Tag) %>%
summarise(
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Month, Industry_Tag)
pt6 <- pt6 %>%
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 300 ~ "Giá trung bình",
gia_tri >= 300 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 5000000 ~ "Thanh khoản thấp",
khoi_luong >= 5000000 & khoi_luong < 20000000 ~ "Thanh khoản trung bình",
khoi_luong >= 20000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Month, Industry_Tag,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier)
show(pt6)
## # A tibble: 264 × 6
## Month Industry_Tag gia_tri Price_Tier khoi_luong Liquidity_Tier
## <ord> <chr> <dbl> <chr> <dbl> <chr>
## 1 Tháng Giêng apparel 28.3 Giá thấp 7577394. Thanh khoản t…
## 2 Tháng Giêng automotive 105. Giá trung b… 99645814. Thanh khoản c…
## 3 Tháng Giêng aviation 29.1 Giá thấp 9020861. Thanh khoản t…
## 4 Tháng Giêng consumer goods 56.5 Giá thấp 7319693. Thanh khoản t…
## 5 Tháng Giêng cryptocurrency 177. Giá trung b… 11337161. Thanh khoản t…
## 6 Tháng Giêng e-commerce 48.0 Giá thấp 137958981. Thanh khoản c…
## 7 Tháng Giêng entertainment 123. Giá trung b… 14995997. Thanh khoản t…
## 8 Tháng Giêng finance 105. Giá trung b… 13161234. Thanh khoản t…
## 9 Tháng Giêng financial services 78.2 Giá thấp 10428028. Thanh khoản t…
## 10 Tháng Giêng fitness 37.2 Giá thấp 13666905. Thanh khoản t…
## # ℹ 254 more rows
Về mặt kinh tế, đây là những ngành xương sống, có quy mô thị trường khổng lồ, thu hút lượng vốn đầu tư và giao dịch lớn nhất. Chúng có tác động sâu rộng đến toàn bộ nền kinh tế và việc làm. Việc được xếp hạng “Thanh khoản cao” cho thấy chúng là trung tâm của dòng tiền.
Tuy nhiên, khoi_luong của chúng lại thấp hơn nhiều so với nhóm “Gã khổng lồ”, điều này cho thấy đây là những ngành có biên lợi nhuận cao, sản phẩm/dịch vụ có giá trị lớn, nhưng không phải là thị trường giao dịch sôi động hàng ngày cho số đông. Chúng đại diện cho giá trị chuyên môn hóa, thương hiệu mạnh hoặc tài sản trí tuệ.
Các ngành “Nền tảng” có quy mô lớn (Giá thấp nhưng thanh khoản trung bình): apparel (may mặc), consumer goods (hàng tiêu dùng), social media (mạng xã hội), đây là những ngành hàng thiết yếu hoặc phổ thông, phục vụ số lượng lớn người tiêu dùng. Mức độ cạnh tranh cao giữ cho giá cả ở mức thấp, nhưng quy mô thị trường khổng lồ đảm bảo chúng vẫn là một phần quan trọng của nền kinh tế.
Sự biến động theo thời gian (So sánh các tháng):Khi nhìn từ tháng 1 đến tháng 3, bạn có thể thấy sự thay đổi. Ví dụ, automotive giảm từ “Giá trung bình” (105.17) xuống “Giá thấp” (88.86). Sự thay đổi này có thể phản ánh các yếu tố vĩ mô như thay đổi lãi suất, chính sách chính phủ, hoặc các vấn đề trong chuỗi cung ứng ảnh hưởng đến định giá của toàn ngành.
pt7 <- d %>%
filter(Country == "usa") %>%
mutate(
Date = as.Date(Date),
Year = year(Date)
) %>%
group_by(Year, Industry_Tag) %>%
summarise(
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Year, Industry_Tag)
pt7 <- pt7 %>%
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 300 ~ "Giá trung bình",
gia_tri >= 300 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 5000000 ~ "Thanh khoản thấp",
khoi_luong >= 5000000 & khoi_luong < 20000000 ~ "Thanh khoản trung bình",
khoi_luong >= 20000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Year, Industry_Tag,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier)
show(pt7)
## # A tibble: 449 × 6
## Year Industry_Tag gia_tri Price_Tier khoi_luong Liquidity_Tier
## <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 2000 apparel 3.75 Giá thấp 7902543. Thanh khoản trung bình
## 2 2000 aviation 13.4 Giá thấp 2735833. Thanh khoản thấp
## 3 2000 consumer goods 17.9 Giá thấp 6976633. Thanh khoản trung bình
## 4 2000 e-commerce 2.33 Giá thấp 175159333. Thanh khoản cao
## 5 2000 entertainment 28.8 Giá thấp 5991648. Thanh khoản trung bình
## 6 2000 finance 29.5 Giá thấp 6808273. Thanh khoản trung bình
## 7 2000 food 18.7 Giá thấp 4654524. Thanh khoản thấp
## 8 2000 food & beverage 11.0 Giá thấp 10360835. Thanh khoản trung bình
## 9 2000 footwear 6.42 Giá thấp 757515. Thanh khoản thấp
## 10 2000 healthcare 24.5 Giá thấp 7190489. Thanh khoản trung bình
## # ℹ 439 more rows
Ngành e-commerce (thương mại điện tử): gia_tri sụp đổ từ 2.32 xuống chỉ còn 0.61 trong vòng một năm. Đây là bằng chứng kinh tế rõ ràng về sự kết thúc của bong bóng dot-com, khi niềm tin của nhà đầu tư vào các công ty internet bay hơi.Mặc dù giá trị sụp đổ, khoi_luong (quy mô) của ngành này vẫn ở mức “Thanh khoản cao”. Điều này cho thấy, dù cơn sốt đầu cơ đã qua, nền tảng của kinh tế số vẫn cực kỳ lớn và quan trọng.
Trong khi các ngành công nghệ lao đao, các ngành truyền thống như consumer goods (hàng tiêu dùng) và healthcare (chăm sóc sức khỏe) có gia_tri (giá trị) gần như ổn định.
Điều này cho thấy các ngành phục vụ nhu cầu thiết yếu có sức chống chịu tốt hơn trước các cú sốc tài chính và đầu cơ.
pt8 <- d %>% # thwujc hiện phép gán
filter(Country == "germany") %>% # lọc theo quốc gia = "germany"
mutate(
Date = as.Date(Date),
Month = month(Date, label = TRUE, abbr = FALSE)
) %>%
group_by(Month, Industry_Tag) %>% # Gom lại giá trị cột
summarise( # thực hiện tính toán
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Month, Industry_Tag) #Sắp xếp lại bảng dữ liệu theo thứ tự tăng dần của năm (Year) và ngành (Industry_Tag)
pt8 <- pt8 %>%
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 300 ~ "Giá trung bình",
gia_tri >= 300 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 5000000 ~ "Thanh khoản thấp",
khoi_luong >= 5000000 & khoi_luong < 20000000 ~ "Thanh khoản trung bình",
khoi_luong >= 20000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Month, Industry_Tag,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier)
# Hiển thị kết quả
show(pt8)
## # A tibble: 24 × 6
## Month Industry_Tag gia_tri Price_Tier khoi_luong Liquidity_Tier
## <ord> <chr> <dbl> <chr> <dbl> <chr>
## 1 Tháng Giêng apparel 63.0 Giá thấp 32950. Thanh khoản thấp
## 2 Tháng Giêng automotive 37.6 Giá thấp 93028. Thanh khoản thấp
## 3 Tháng Hai apparel 61.9 Giá thấp 38048. Thanh khoản thấp
## 4 Tháng Hai automotive 36.9 Giá thấp 75268. Thanh khoản thấp
## 5 Tháng Ba apparel 59.9 Giá thấp 43874. Thanh khoản thấp
## 6 Tháng Ba automotive 36.2 Giá thấp 129520. Thanh khoản thấp
## 7 Tháng Tư apparel 61.0 Giá thấp 35144. Thanh khoản thấp
## 8 Tháng Tư automotive 37.1 Giá thấp 92769. Thanh khoản thấp
## 9 Tháng Năm apparel 62.4 Giá thấp 38367. Thanh khoản thấp
## 10 Tháng Năm automotive 37.4 Giá thấp 137850. Thanh khoản thấp
## # ℹ 14 more rows
gia_tri (Giá trị) luôn cao hơn đáng kể (khoảng 60-64) so với ngành ô tô.
Ý nghĩa kinh tế: Điều này không có nghĩa là một cái áo đắt hơn một chiếc xe. gia_tri ở đây có thể đại diện cho một chỉ số hiệu quả kinh doanh như biên lợi nhuận ròng, tỷ suất lợi nhuận trên vốn đầu tư (ROI), hoặc một chỉ số định giá cổ phiếu (P/E). Việc ngành may mặc có chỉ số này cao hơn cho thấy, trong phân khúc này, các công ty may mặc có khả năng sinh lời trên mỗi đơn vị vốn hoặc doanh thu tốt hơn. Họ có thể có chi phí hoạt động thấp hơn, giá trị thương hiệu mạnh cho phép định giá cao, hoặc chu kỳ sản xuất linh hoạt hơn.
khoi_luong (Khối lượng) luôn ở mức thấp (khoảng 30k-40k).
Ý nghĩa kinh tế: Con số này phản ánh quy mô dòng tiền hoặc tổng giá trị giao dịch trong phân khúc này là nhỏ. Điều này là hợp lý vì giá trị mỗi sản phẩm may mặc thấp, và tổng quy mô vốn hóa của các công ty trong phân khúc này không lớn bằng ngành ô tô.
gia_tri (Giá trị) luôn thấp hơn (khoảng 35-38).
Ý nghĩa kinh tế: Ngành công nghiệp ô tô là ngành thâm dụng vốn (capital-intensive), đòi hỏi chi phí khổng lồ cho nhà xưởng, R&D, và vật liệu. Do đó, dù doanh thu rất lớn, biên lợi nhuận có thể mỏng hơn so với ngành may mặc. Sự cạnh tranh khốc liệt cũng gây áp lực lên lợi nhuận, dẫn đến chỉ số gia_tri thấp hơn.
khoi_luong (Khối lượng) lớn hơn nhiều và biến động mạnh (từ 75k đến 137k).
Ý nghĩa kinh tế: Con số này cho thấy quy mô dòng tiền và hoạt động kinh tế trong ngành ô tô lớn hơn rất nhiều. Mỗi giao dịch (bán một chiếc xe) có giá trị cao, nên tổng khối lượng giao dịch rất lớn. Sự biến động mạnh của khoi_luong cũng phản ánh tính thời vụ (seasonality) của ngành:
Các đỉnh cao vào tháng 3, tháng 5, và tháng 12 có thể tương ứng với các chương trình khuyến mãi lớn, mùa mua sắm cao điểm, hoặc các công ty đẩy mạnh doanh số để đạt chỉ tiêu cuối quý/cuối năm. Đây là đặc điểm kinh tế điển hình của ngành hàng tiêu dùng có giá trị lớn. => Ngành May mặc (trong phân khúc này): Tập trung vào hiệu quả và lợi nhuận. Họ tạo ra giá trị cao trên một quy mô hoạt động nhỏ hơn.Ngành Ô tô (trong phân khúc này): Là một cuộc chơi về quy mô và dòng tiền. Họ hoạt động với khối lượng khổng lồ, là một động lực kinh tế quan trọng, nhưng có thể phải chấp nhận biên lợi nhuận thấp hơn do chi phí và cạnh tranh.Sự ổn định của ngành may mặc so với sự biến động theo mùa của ngành ô tô cũng cho thấy sự khác biệt về hành vi của người tiêu dùng: quần áo là nhu cầu thường xuyên hơn, trong khi mua xe là một quyết định lớn, chịu ảnh hưởng nhiều hơn bởi các yếu tố kinh tế vĩ mô và các chương trình khuyến mãi.
pt9 <- d %>% #Thêm các cột phân loại mới vào bảng pt9
filter(Country == "germany") %>% # Bước 1: Lọc dữ liệu, chỉ giữ lại các dòng có cột "Country" là "germany"
mutate(
Date = as.Date(Date),
Year = year(Date)
) %>%
group_by(Year, Industry_Tag) %>% # Gom lại giá trị cột
summarise( # Thực hiện tính toán
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Year, Industry_Tag)
pt9 <- pt9 %>% # Tạo cột "Price_Tier" (Bậc giá) dựa trên giá trị của cột "gia_tri"
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 300 ~ "Giá trung bình",
gia_tri >= 300 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 5000000 ~ "Thanh khoản thấp",
khoi_luong >= 5000000 & khoi_luong < 20000000 ~ "Thanh khoản trung bình",
khoi_luong >= 20000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Year, Industry_Tag,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier)
show(pt9)
## # A tibble: 37 × 6
## Year Industry_Tag gia_tri Price_Tier khoi_luong Liquidity_Tier
## <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 2006 apparel 19.2 Giá thấp 24752. Thanh khoản thấp
## 2 2007 apparel 23.9 Giá thấp 41278. Thanh khoản thấp
## 3 2008 apparel 23.0 Giá thấp 56483. Thanh khoản thấp
## 4 2009 apparel 17.6 Giá thấp 37355. Thanh khoản thấp
## 5 2009 automotive 25.6 Giá thấp 1199. Thanh khoản thấp
## 6 2010 apparel 23.6 Giá thấp 14845. Thanh khoản thấp
## 7 2010 automotive 19.5 Giá thấp 10135. Thanh khoản thấp
## 8 2011 apparel 29.0 Giá thấp 35973. Thanh khoản thấp
## 9 2011 automotive 27.8 Giá thấp 101173. Thanh khoản thấp
## 10 2012 apparel 31.9 Giá thấp 30341. Thanh khoản thấp
## # ℹ 27 more rows
Year (Năm): Mốc thời gian diễn ra sự kiện.
Industry_Tag (Ngành): Ngành công nghiệp được phân tích.
gia_tri (Giá trị): Đây có thể là một chỉ số đo lường hiệu suất hoặc giá trị của ngành, ví dụ như chỉ số giá cổ phiếu trung bình, giá trị vốn hóa, hoặc một chỉ số tài chính khác. Giá trị này càng cao, ngành đó càng có hiệu suất tốt hoặc được định giá cao hơn tại thời điểm đó.
Price_Tier (Mức giá): Phân loại mức định giá của ngành (ví dụ: “Giá thấp,” “Giá trung bình”). Điều này cho biết liệu thị trường đang định giá ngành đó cao hay thấp so với giá trị nội tại hoặc so với các ngành khác.
khoi_luong (Khối lượng): Con số này có thể đại diện cho khối lượng giao dịch cổ phiếu hoặc một thước đo về quy mô hoạt động của thị trường.
Liquidity_Tier (Mức thanh khoản): Cho biết mức độ dễ dàng mua/bán các tài sản (cổ phiếu) trong ngành đó. Ở đây, cả hai ngành đều được xếp hạng “Thanh khoản thấp,” nghĩa là việc giao dịch có thể khó khăn hơn, ít sôi động hơn so với các ngành khác.
Ý nghĩa Kinh tế
Sự Tăng Trưởng Vượt Trội của Ngành May Mặc:
Nhìn vào cột “gia_tri”, có thể thấy rõ ràng ngành may mặc đã trải qua một giai đoạn tăng trưởng ấn tượng từ năm 2009 đến 2021, đạt đỉnh vào năm 2021 (137.65).
Sự tăng trưởng này mạnh mẽ đến mức vào năm 2020 và 2021, mức giá của ngành được nâng từ “Giá thấp” lên “Giá trung bình”. Điều này cho thấy các nhà đầu tư đã nhận ra tiềm năng và định giá lại ngành này ở một mức cao hơn.
Sự Biến Động của Ngành Ô tô:
Ngành ô tô cũng có sự tăng trưởng nhưng không ổn định và mạnh mẽ bằng ngành may mặc. “Giá trị” của ngành này dao động nhiều hơn và luôn được giữ ở mức “Giá thấp”.
Điều này cho thấy ngành ô tô có thể phải đối mặt với nhiều thách thức hơn, có tính chu kỳ cao hơn, hoặc không được các nhà đầu tư ưa chuộng bằng ngành may mặc trong giai đoạn này.
Ảnh Hưởng của Khủng Hoảng Kinh Tế 2008:
Dữ liệu cho thấy “giá trị” của ngành may mặc đã giảm vào năm 2009 (từ 23.02 xuống 17.56), đây có thể là tác động của cuộc khủng hoảng tài chính toàn cầu năm 2008. Tuy nhiên, ngành này đã phục hồi rất nhanh chóng sau đó.
Tính Thanh Khoản Thấp:
Một điểm chung quan trọng là cả hai ngành đều có “Thanh khoản thấp”. Về mặt kinh tế, điều này có nghĩa là các cổ phiếu trong hai ngành này có thể không phải là lựa chọn hàng đầu cho các nhà đầu tư lướt sóng, ngắn hạn. Nó phù hợp hơn với các nhà đầu tư dài hạn, những người ít quan tâm đến việc mua bán liên tục hàng ngày.
=> Cho thấy trong giai đoạn 2006-2025, ngành may mặc có hiệu suất và sự tăng trưởng vượt trội so với ngành ô tô. Ngành may mặc đã thu hút được sự chú ý của thị trường và được định giá cao hơn, đặc biệt trong những năm gần đây. Ngược lại, ngành ô tô tỏ ra kém ổn định hơn và luôn được coi là một lựa chọn đầu tư “giá thấp”. Tuy nhiên, cả hai ngành đều có chung đặc điểm là thanh khoản thấp, cho thấy chúng có thể không phải là thị trường sôi động nhất.
pt10 <- d %>%
filter(Dividends > 0) %>%
mutate(
Date = as.Date(Date),
Year = year(Date)
) %>%
group_by(Year, Industry_Tag, Country) %>%
summarise(
gia_tri = mean(Close, na.rm = TRUE),
khoi_luong = mean(Volume, na.rm = TRUE),
mean_dividends = mean(Dividends, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(Year, Country, Industry_Tag)
pt10 <- pt10 %>%
mutate(
Price_Tier = case_when(
gia_tri < 100 ~ "Giá thấp",
gia_tri >= 100 & gia_tri < 300 ~ "Giá trung bình",
gia_tri >= 300 ~ "Giá cao",
TRUE ~ NA_character_
),
Liquidity_Tier = case_when(
khoi_luong < 3000000 ~ "Thanh khoản thấp",
khoi_luong >= 3000000 & khoi_luong < 10000000 ~ "Thanh khoản trung bình",
khoi_luong >= 10000000 ~ "Thanh khoản cao",
TRUE ~ NA_character_
)
) %>%
select(Year, Industry_Tag, Country,
gia_tri, Price_Tier,
khoi_luong, Liquidity_Tier,
mean_dividends)
show(pt10)
## # A tibble: 490 × 8
## Year Industry_Tag Country gia_tri Price_Tier khoi_luong Liquidity_Tier
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr>
## 1 2000 automotive japan 39.7 Giá thấp 60900 Thanh khoản t…
## 2 2000 consumer goods netherlan… 7.33 Giá thấp 265410 Thanh khoản t…
## 3 2000 technology netherlan… 22.8 Giá thấp 3266400 Thanh khoản t…
## 4 2000 apparel usa 3.94 Giá thấp 13033600 Thanh khoản c…
## 5 2000 aviation usa 13.5 Giá thấp 2232488. Thanh khoản t…
## 6 2000 consumer goods usa 19.3 Giá thấp 6562700 Thanh khoản t…
## 7 2000 entertainment usa 24.5 Giá thấp 5313431 Thanh khoản t…
## 8 2000 finance usa 29.2 Giá thấp 6722099. Thanh khoản t…
## 9 2000 food usa 18.6 Giá thấp 4603700 Thanh khoản t…
## 10 2000 food & beverage usa 14.5 Giá thấp 5307050 Thanh khoản t…
## # ℹ 480 more rows
## # ℹ 1 more variable: mean_dividends <dbl>
Dữ liệu này phân tích và so sánh các ngành công nghiệp ở nhiều quốc gia khác nhau (chủ yếu là Mỹ, ngoài ra có Hà Lan và Nhật Bản) trong giai đoạn 2000-2002.
Các cột đầu tiên (Năm, Ngành, Quốc gia): Cho biết dữ liệu thuộc về ngành nào, ở đâu và vào thời điểm nào.
Cột thứ tư (ví dụ: 7.329102): Đây có thể là một chỉ số hiệu suất kinh tế, chẳng hạn như tỷ suất lợi nhuận, tốc độ tăng trưởng, hoặc một chỉ số định giá như P/E (giá trên thu nhập).
Cột “Giá thấp”: Cho thấy các công ty hoặc tài sản trong nhóm này đang được định giá ở mức thấp tại thời điểm đó.
Cột thứ sáu (số lớn, ví dụ: 265410.00): Con số này có thể đại diện cho quy mô, chẳng hạn như giá trị vốn hóa thị trường hoặc khối lượng giao dịch trung bình.
Cột “Thanh khoản”: Đây là một chỉ số quan trọng cho thấy mức độ dễ dàng mua hoặc bán cổ phiếu của các công ty trong ngành đó trên thị trường.
Thanh khoản cao: Rất dễ mua bán, có nhiều nhà đầu tư quan tâm (ví dụ: ngành may mặc, công nghệ ở Mỹ).
Thanh khoản trung bình: Mua bán tương đối dễ dàng.
Thanh khoản thấp: Khó mua bán hơn, có thể do ít nhà đầu tư quan tâm hoặc quy mô công ty nhỏ hơn (ví dụ: hàng không, khách sạn ở Mỹ).
Ý nghĩa kinh tế: Về cơ bản, bảng dữ liệu này là một “bức tranh” về sức khỏe và sự hấp dẫn đầu tư của các ngành kinh tế khác nhau vào đầu những năm 2000. Nó cho phép các nhà phân tích so sánh các ngành để xem ngành nào có hiệu suất tốt, được định giá thấp và có tính thanh khoản cao, từ đó đưa ra quyết định đầu tư. Giai đoạn 2000-2002 cũng là thời điểm sau bong bóng dot-com, vì vậy dữ liệu này có thể phản ánh sự thay đổi trong tâm lý của nhà đầu tư đối với các ngành, đặc biệt là ngành công nghệ.
Đoạn code này lấy dữ liệu giao dịch hàng ngày, gom chúng lại theo từng năm, rồi tính ra một bảng tóm tắt cho mỗi năm. Cụ thể, nó tính các chỉ số quan trọng như giá trung bình, giá cao nhất, giá thấp nhất và độ biến động trong năm đó. Kết quả cuối cùng là một bảng thống kê gọn gàng, giúp ta dễ dàng nhìn thấy xu hướng của thị trường qua các năm.
thong_ke_mo_ta <- d %>%
mutate(
Year = year(Date)
) %>%
group_by(Year) %>%
summarise(
so_giao_dich = n(),
gia_tri_trung_binh = mean(Close, na.rm = TRUE),
gia_tri_trung_vi = median(Close, na.rm = TRUE),
do_lech_chuan = sd(Close, na.rm = TRUE),
gia_tri_nho_nhat = min(Close, na.rm = TRUE),
gia_tri_lon_nhat = max(Close, na.rm = TRUE),
tong_gia_tri = sum(Close, na.rm = TRUE)
) %>%
arrange(Year)
print(thong_ke_mo_ta)
## # A tibble: 26 × 8
## Year so_giao_dich gia_tri_trung_binh gia_tri_trung_vi do_lech_chuan
## <dbl> <int> <dbl> <dbl> <dbl>
## 1 2000 8568 18.5 16.9 14.1
## 2 2001 8432 16.4 16.3 10.8
## 3 2002 8722 15.3 13.9 11.1
## 4 2003 8820 15.5 13.8 12.1
## 5 2004 9048 19.2 16.0 15.1
## 6 2005 9324 21.2 17.4 16.6
## 7 2006 10283 24.5 20.1 19.7
## 8 2007 10710 28.4 22.8 22.6
## 9 2008 11079 23.5 18.9 19.0
## 10 2009 11311 20.3 15.6 16.6
## # ℹ 16 more rows
## # ℹ 3 more variables: gia_tri_nho_nhat <dbl>, gia_tri_lon_nhat <dbl>,
## # tong_gia_tri <dbl>
gia_tri_trung_binh, ta thấy giá cổ phiếu
có xu hướng tăng trưởng rõ rệt qua các năm, từ ~18.5
(năm 2000) lên đến ~181 (năm 2024). Điều này cho thấy một xu hướng tăng
trưởng (bull market) dài hạn của các cổ phiếu trong bộ dữ liệu này.do_lech_chuan (độ lệch chuẩn) chính là thước đo rủi
ro. Ta thấy con số này tăng mạnh theo thời gian, từ ~14
(năm 2000) lên đến ~277 (năm 2024). Điều này có nghĩa là thị trường ngày
càng trở nên biến động mạnh hơn, biên độ dao động giá
trong năm ngày càng lớn.do_lech_chuan ở một số năm (ví dụ,
2008-2009, 2020) có thể là dấu hiệu của các cuộc khủng hoảng
kinh tế (khủng hoảng tài chính 2008, đại dịch COVID-19).gia_tri_trung_binh, ta có thể
thấy các giai đoạn thị trường đi xuống (bear market) hoặc đi ngang. Ví
dụ, từ năm 2000 đến 2003, giá trung bình giảm, và năm 2008 giá trung
bình cũng giảm mạnh so với 2007. Đây là các dấu hiệu của suy thoái kinh
tế.ggplot(d, aes(y = Volume)) + # Khởi tạo biểu đồ
geom_boxplot(fill = "skyblue", color = "black") + # Vẽ hình dạng biểu đồ
labs( # Thêm nhãn và tiêu đề
title = "Biểu đồ Boxplot của Khối lượng Giao dịch (Volume)",
y = "Khối lượng"
) +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank()) # tùy chỉnh chi tiết giao diện
Thị trường hoạt động theo sự kiện (The Market is Event-Driven).
Những ngày “Bình thường” (Phần hộp bị ép chặt): Đây là những ngày không có tin tức gì lớn. Hoạt động giao dịch chỉ ở mức duy trì, phản ánh tâm lý ổn định của thị trường.
Những ngày “Bùng nổ” (Các chấm đen - Outliers): Đây mới là những ngày quan trọng và đáng chú ý nhất. Các chấm đen này không phải là lỗi dữ liệu, mà chúng đại diện cho phản ứng của thị trường trước các sự kiện kinh tế, tài chính quan trọng. Mỗi chấm đen có thể là một ngày: Công ty công bố báo cáo tài chính: Kết quả tốt hoặc xấu bất ngờ sẽ gây ra làn sóng mua hoặc bán tháo. Tin tức vĩ mô được công bố: Thay đổi lãi suất, số liệu lạm phát, chính sách mới của chính phủ. Sự kiện đặc thù của công ty: Ra mắt sản phẩm đột phá, sáp nhập và mua lại (M&A), vướng vào bê bối pháp lý. Khủng hoảng hoặc hoảng loạn thị trường: Ví dụ như các ngày trong cuộc khủng hoảng tài chính 2008.
descriptive_stats <- d %>% mutate( Year = year(Date) ) %>% # Tạo cột mới
group_by(Industry_Tag, Year) %>% # Gom nhóm dữ liệu
summarise( # bắt đầu tính toán thống kê
cv_volume = (sd(Volume, na.rm = TRUE) / mean(Volume, na.rm = TRUE)) * 100,
skewness_volume = skewness(Volume, na.rm = TRUE),
kurtosis_volume = kurtosis(Volume, na.rm = TRUE),
.groups = 'drop'
)
print(descriptive_stats)
## # A tibble: 500 × 5
## Industry_Tag Year cv_volume skewness_volume kurtosis_volume
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 apparel 2000 81.2 3.67 26.8
## 2 apparel 2001 86.3 5.14 46.4
## 3 apparel 2002 73.1 2.10 11.3
## 4 apparel 2003 79.4 3.27 21.9
## 5 apparel 2004 63.5 2.45 13.7
## 6 apparel 2005 88.7 3.88 27.9
## 7 apparel 2006 114. 2.94 19.5
## 8 apparel 2007 116. 1.74 8.25
## 9 apparel 2008 115. 1.82 8.78
## 10 apparel 2009 110. 2.10 13.1
## # ℹ 490 more rows
cv_volume (Hệ số biến thiên - Coefficient of
Variation): Con số này đo lường “Mức độ Bất ổn” hay “Độ Bấp bênh” của
khối lượng giao dịch.
Như năm 2010, ngành automotive có CV = 489.8, một con số
khổng lồ. Trong khi đó ngành apparel chỉ là 105.3. Và điều
đó cho thấy năm 2010, thị trường ô tô cực kỳ bất ổn (có thể do hậu quả
của khủng hoảng tài chính 2008, các gói cứu trợ, sự phá sản của các hãng
xe). Dòng tiền vào ngành này rất khó lường, trong khi ngành may mặc ổn
định hơn nhiều.
skewness_volume (Độ lệch): Cho sự phân bổ khối lượng
giao dịch có đối xứng hay không.Nó đo lường “Thiên hướng Bùng
nổ”.
Skewness > 0 (Lệch phải): Đây là trường hợp phổ biến nhất trên thị trường. Hầu hết các ngày có khối lượng giao dịch thấp (bình thường), nhưng thỉnh thoảng có một vài ngày khối lượng giao dịch cao đột biến, “bùng nổ” một cách bất thường.**
Giá trị càng cao: Sự bùng nổ trong những ngày đặc biệt đó càng mạnh mẽ so với những ngày bình thường.
Tất cả các giá trị skewness đều dương và lớn hơn 1, khẳng định rằng tất cả các ngành đều hoạt động theo mô hình “bùng nổ theo sự kiện”.
Năm 2010, ngành automotive có skewness =
11.95, cho thấy những ngày giao dịch đột biến của ngành này có
khối lượng cực kỳ lớn, tạo ra một “cái đuôi” rất dài về phía bên phải
của biểu đồ phân phối.
kurtosis_volume (Độ nhọn): Con số này đo lường Mức độ
Cực đoan”** của các sự kiện. Trong tài chính, nó là thước đo cho
“Rủi ro Đuôi Dày” (Fat-Tail Risk).
automotive có kurtosis =
184.44.Cho thấy năm đó ngành ô tô không chỉ có những ngày giao
dịch bùng nổ, mà mức độ bùng nổ đó còn mang tính cực đoan, là những cú
sốc thực sự trên thị trường. Bất kỳ ai giao dịch trong ngành này vào năm
đó đều phải đối mặt với rủi ro rất lớn từ những sự kiện bất ngờ.p <- ggplot(data = descriptive_stats, aes(x = Industry_Tag, y = skewness_volume, fill = Industry_Tag)) + # Khởi tạo và lưu biểu đồ
geom_bar(stat = "identity") + # vẽ biểu đồ hình dạng cột
# Thêm đường tham chiếu tại y = 0 để dễ so sánh
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(
title = "Độ Xiên (Skewness) của Khối Lượng Giao Dịch (Volume) theo Ngành", # đặt tiêu đề
x = "Ngành",
y = "Độ Xiên"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
print(p)
So sánh các ngành: * Cột càng cao, mức độ “bùng nổ” của khối lượng giao dịch càng lớn. Tức là sự khác biệt giữa ngày bình thường và ngày có sự kiện lớn là rất rõ rệt. * Ngành có độ xiên cao nhất như: footwear, gaming đây là những ngành rất “nhạy cảm”. Khối lượng giao dịch của chúng có thể tăng vọt một cách dữ dội khi có tin tức quan trọng như ra mắt sản phẩm mới, báo cáo tài chính bất ngờ, hoặc tin đồn M&A. Dòng tiền vào các ngành này mang tính “đầu cơ theo sự kiện” rất cao. * Ngành có độ xiên thấp hơn: cryptocurrency, fitness Khối lượng giao dịch ở các ngành này ổn định hơn. Mặc dù vẫn có những ngày giao dịch sôi động, nhưng sự chênh lệch so với ngày bình thường không quá cực đoan như các ngành kia.
kurtosis_plot <- ggplot(data = descriptive_stats, aes(x = Industry_Tag, y = kurtosis_volume, fill = Industry_Tag)) +
geom_bar(stat = "identity") + #vẽ biểu đồ dạng cột
# Thêm đường tham chiếu tại y = 0 (tương ứng độ nhọn của phân phối chuẩn)
geom_hline(yintercept = 0, linetype = "dashed", color = "blue") +
labs( #Đặt tiêu đề và nhãn
title = "Độ Nhọn (Kurtosis) của Khối Lượng Giao Dịch (Volume) theo Ngành",
x = "Ngành",
y = "Độ Nhọn (Dư)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none")
print(kurtosis_plot)
Biểu đồ này trả lời cho câu hỏi: “Ngành nào có rủi ro về những cú sốc thanh khoản cực đoan nhất?”
footwear,
gaming, hospitality): Đây là những
ngành có “rủi ro đuôi dày” lớn nhất. Điều này có nghĩa là khối lượng
giao dịch trong các ngành này không chỉ biến động, mà còn có nguy cơ rất
cao xảy ra những phiên giao dịch với khối lượng cực kỳ đột
biến, vượt xa mọi dự đoán thông thường. Dòng tiền trong các
ngành này có thể bị ảnh hưởng mạnh bởi các yếu tố khó lường như xu hướng
lan truyền trên mạng xã hội (viral trends), sự kiện bất ngờ, hoặc tâm lý
đầu cơ cực đoan.cryptocurrency, social media): Các
ngành này, mặc dù vẫn có biến động, nhưng ít có khả năng xảy ra những cú
sốc thanh khoản ở mức độ cực đoan. Sự biến động của chúng có thể diễn ra
trong một phạm vi “dự đoán được” hơn.#Tính toán và lưu kết quả
correlation_result <- cor(d$Volume, d$Close, use = "complete.obs")
#In kết quả
cat("Hệ số tương quan giữa Volume và Close là:", correlation_result)
## Hệ số tương quan giữa Volume và Close là: -0.07304574
Kết quả Hệ số tương quan là: -0.07304574 có ý nghĩa kinh
tế rất quan trọng: *
Gần như không có tương quan tuyến tính: * Hệ số tương quan nằm trong khoảng từ -1 đến +1.Và giá trị -0.073 là cực kỳ gần 0. Điều này chứng tỏ rằng, khi xét trên toàn bộ bộ dữ liệu (bao gồm nhiều cổ phiếu khác nhau qua nhiều năm), không có một mối quan hệ tuyến tính đơn giản và rõ ràng nào giữa khối lượng giao dịch trong ngày và giá đóng cửa của ngày hôm đó.
gia_tri_giao_dich <- d %>%
mutate(gia_tri_giao_dich = Close * Volume) %>% #Tạo cột biến mới
group_by(Country, Industry_Tag) %>% #Gom nhóm dữ liệu
summarise(
tong_gia_tri = sum(gia_tri_giao_dich, na.rm = TRUE),
.groups = 'drop'
) %>%
arrange(Country, Industry_Tag) #Sắp xếp lại bảng kết quả
print(gia_tri_giao_dich)
## # A tibble: 32 × 3
## Country Industry_Tag tong_gia_tri
## <chr> <chr> <dbl>
## 1 canada e-commerce 2.07e12
## 2 france gaming 2.78e 9
## 3 france luxury goods 5.12e10
## 4 germany apparel 2.16e10
## 5 germany automotive 7.76e 9
## 6 japan automotive 3.38e11
## 7 japan gaming 6.76e10
## 8 netherlands consumer goods 2.94e11
## 9 netherlands technology 1.66e11
## 10 switzerland technology 1.18e11
## # ℹ 22 more rows
e+09 nghĩa là “nhân với 10 mũ 9”, tức là
tỷ. * 2.77e+09 = 2.77 x 1,000,000,000 =
2.77 tỷ. * e+10 nghĩa là “nhân với 10 mũ
10”, tức là chục tỷ. * 5.11e+10 = 5.11 x
10,000,000,000 = 51.1 tỷ. *
e+11 nghĩa là “nhân với 10 mũ 11”, tức là trăm
tỷ. * 3.38e+11 = 3.38 x 100,000,000,000 =
338 tỷ. *
e+12 nghĩa là “nhân với 10 mũ 12”, tức là nghìn
tỷ. * 2.07e+12 = 2.07 x 1,000,000,000,000 =
2.07 nghìn tỷ.
1. canada | e-commerce | 2.070597e+12 *
Giá trị: Khoảng 2.07 nghìn tỷ đô la.
Đây là một con số khổng lồ. Nó cho thấy ngành thương
mại điện tử ở Canada (rất có thể bị chi phối bởi một công ty cực lớn như
Shopify) có quy mô vốn hóa và mức độ giao dịch cực kỳ lớn, là một trụ
cột quan trọng trên thị trường chứng khoán Canada.
2. france | gaming | 2.777209e+09 *
Giá trị: Khoảng 2.78 tỷ đô la.So với
các ngành khác, đây là một quy mô tương đối nhỏ. Nó cho thấy các công ty
game niêm yết trên sàn chứng khoán Pháp có quy mô vừa phải.
3. france | luxury goods | 5.119930e+10
* Giá trị: Khoảng 51.2 tỷ đô la. Con
số này lớn hơn ngành game gần 20 lần. Điều này phản ánh đúng sức mạnh
kinh tế của Pháp: các tập đoàn hàng xa xỉ (như LVMH, Kering) là những
“gã khổng lồ” có giá trị vốn hóa và được giao dịch rất sôi động trên thị
trường.
4. germany | apparel | 2.158194e+10 *
Giá trị: Khoảng 21.6 tỷ đô la. Ngành
may mặc ở Đức (với các thương hiệu như Adidas, Puma) có một quy mô đáng
kể trên thị trường chứng khoán.
5. germany | automotive | 7.762324e+09
* Giá trị: Khoảng 7.76 tỷ đô la. Con
số này có vẻ thấp một cách đáng ngạc nhiên đối với một cường quốc ô tô
như Đức.
6. japan | automotive | 3.382736e+11 *
Giá trị: Khoảng 338 tỷ đô la. Ngành ô
tô Nhật Bản (với các tên tuổi như Toyota, Honda) có quy mô giao dịch
lớn hơn rất nhiều so với ngành ô tô của Đức trong bộ dữ
liệu này. Cho thấy tầm vóc và thanh khoản vượt trội của các công ty ô tô
Nhật trên thị trường chứng khoán.
7. japan | gaming | 6.764484e+10 *
Giá trị: Khoảng 67.6 tỷ đô la. Ngành
game của Nhật Bản (với Nintendo, Sony) có quy mô lớn hơn ngành
game của Pháp hơn 24 lần. Điều này khẳng định vị thế thống trị
của Nhật Bản trong ngành công nghiệp game toàn cầu.
gia_tri_giao_dich_phan_tram <- gia_tri_giao_dich %>%
group_by(Country) %>%
mutate(
phan_tram_nganh = tong_gia_tri / sum(tong_gia_tri) * 100
)
ggplot(gia_tri_giao_dich_phan_tram, aes(x = "", y = phan_tram_nganh, fill = Industry_Tag)) + # bắt đầu vẽ biểu đồ với dl mới tạo
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
facet_wrap(~ Country) +
labs(
title = "Tỷ Trọng Giá Trị Giao Dịch theo Ngành trong từng Quốc Gia",
fill = "Ngành",
x = NULL, # xóa nhãn trục x, y
y = NULL
) +
theme_void() + #áp dụng giao diện trống
theme(legend.position = "bottom") #Di chuyển phần chú thích xuống
so sánh cấu trúc công nghiệp trên thị trường chứng khoán thể hiện những đặc điểm kinh tế và cấu trúc thị trường rất khác biệt giữa các quốc gia.
Mỹ (usa): Nền kinh tế Đa dạng hóa:
Vòng tròn của Mỹ có rất nhiều màu sắc với tỷ trọng khá
tương đồng. Các mảng màu lớn nhất là công nghệ
(technology), tài chính (finance), thương mại
điện tử (e-commerce), và ô tô (automotive).
Thị trường chứng khoán Mỹ cực kỳ đa dạng và cân bằng.
Sức mạnh của nó không phụ thuộc vào một ngành duy nhất mà được xây dựng
trên nhiều trụ cột vững chắc. Điều này cho thấy một nền kinh tế trưởng
thành, có sức chống chịu tốt với các cú sốc chỉ ảnh hưởng đến một ngành
cụ thể.
Canada (canada): Sự thống trị của một
Ngành: Vòng tròn của Canada gần như chỉ có một màu duy
nhất là màu xanh rêu (e-commerce).Thị trường chứng
khoán Canada (trong bộ dữ liệu này) bị thống trị gần như tuyệt
đối bởi ngành thương mại điện tử. Điều này rất có thể là do sự
hiện diện của một “gã khổng lồ” duy nhất như Shopify có giá trị vốn hóa
vượt trội so với phần còn lại của thị trường. Đây là một dấu hiệu của
sự tập trung cao độ, đồng nghĩa với rủi ro lớn: nếu
ngành/công ty này gặp vấn đề, toàn bộ thị trường sẽ bị ảnh hưởng nặng
nề.
Nhật Bản (japan): Sức mạnh của Công nghiệp
Truyền thống và Sáng tạo: Vòng tròn của Nhật Bản chủ yếu có hai
màu: một mảng lớn màu cam (automotive) và một mảng nhỏ hơn
nhưng đáng kể màu xanh dương nhạt (gaming). Điều này phản
ánh hoàn hảo thế mạnh kinh tế của Nhật Bản. Thị trường của họ được dẫn
dắt bởi các tập đoàn ô tô khổng lồ (Toyota, Honda) và
ngành công nghiệp game/giải trí sáng tạo có tầm ảnh
hưởng toàn cầu (Nintendo, Sony).
Pháp (france): Dấu ấn của sự Sang
trọng: Vòng tròn của Pháp bị chi phối bởi mảng màu tím
(luxury goods - hàng xa xỉ). Đây là đặc trưng không thể
nhầm lẫn của nền kinh tế Pháp. Các tập đoàn hàng xa xỉ (như LVMH,
Kering) là những trụ cột chính, chiếm tỷ trọng rất lớn trên thị trường
chứng khoán Pháp.
Đức (germany): Trái tim của Công nghiệp Châu
Âu: Vòng tròn của Đức có hai màu chính là cam
(automotive) và hồng nhạt (apparel). Biểu đồ
cho thấy sức mạnh của ngành công nghiệp ô tô và
ngành may mặc/thể thao (Adidas, Puma) đối với thị
trường chứng khoán Đức.
d$gia_tri_giao_dich <- d$Close * d$Volume # Chuẩn bị dl ban đầu
d_ket_qua <- d %>% #chuổi xử lý dl và tính toán
group_by(Industry_Tag) %>%
summarize(
tong_gia_tri_giao_dich = sum(gia_tri_giao_dich, na.rm = TRUE),
tong_volume = sum(Volume, na.rm = TRUE)
) %>%
mutate(ti_le = tong_gia_tri_giao_dich / tong_volume)
print(d_ket_qua)
## # A tibble: 23 × 4
## Industry_Tag tong_gia_tri_giao_dich tong_volume ti_le
## <chr> <dbl> <dbl> <dbl>
## 1 apparel 2.88e12 101525538443 28.3
## 2 automotive 3.78e13 379492845589 99.6
## 3 aviation 2.65e12 97691366604 27.1
## 4 consumer goods 5.24e12 94364271605 55.5
## 5 cryptocurrency 1.93e12 12309078642 157.
## 6 e-commerce 2.43e13 795691869144 30.6
## 7 entertainment 1.19e13 151590648365 78.5
## 8 finance 1.65e13 277224398917 59.7
## 9 financial services 2.11e12 24760452622 85.2
## 10 fitness 6.58e11 20087881969 32.7
## # ℹ 13 more rows
e+06 | Triệu | 1,000,000 |.
| e+09 | Tỷ | 1,000,000,000 |.
| e+10 | Chục Tỷ | 10,000,000,000 |.
| e+11 | Trăm Tỷ | 100,000,000,000 |.
| e+12 | Nghìn Tỷ | 1,000,000,000,000
|.
| e+13 | Chục Nghìn Tỷ | 10,000,000,000,000 |.
| e+14 | Trăm Nghìn Tỷ | 100,000,000,000,000 |.
| e+15 | Triệu Tỷ |
1,000,000,000,000,000 |.
Dòng 1: apparel (May mặc) *
tong_gia_tri_giao_dich: 2.877e+12 ->
2.87 nghìn tỷ (đô la) * tong_volume:
1.015e+11 -> 101.5 tỷ (cổ phiếu) *
ti_le: 28.34 -> Giá trung bình mỗi cổ phiếu
giao dịch là 28.34 đô la.
Dòng 2: automotive (Ô tô) *
tong_gia_tri_giao_dich: 3.779e+13 ->
37.79 nghìn tỷ (đô la) * tong_volume:
3.794e+11 -> 379.4 tỷ (cổ phiếu) *
ti_le: 99.58 -> Giá trung bình mỗi cổ phiếu
giao dịch là 99.58 đô la.
Dòng cuối: technology (Công nghệ) *
tong_gia_tri_giao_dich: 1.233e+14 ->
123.3 nghìn tỷ (đô la) - Con số lớn nhất! *
tong_volume: 4.522e+12 -> 4.52
nghìn tỷ (cổ phiếu) - Số lượng cổ phiếu giao dịch cũng lớn
nhất! * ti_le: 27.27 -> Giá trung bình
mỗi cổ phiếu giao dịch là 27.27 đô la.
Bảng giúp phân loại các ngành công nghiệp theo “mệnh giá” cổ phiếu trung bình, từ đó hé lộ bản chất và giai đoạn phát triển của chúng.
Insight 1: Phân loại các ngành theo “Mệnh giá” Cổ phiếu
Chia các ngành thành 3 nhóm chính dựa trên cột
ti_le:
ti_le > 100):
music (239.8), cryptocurrency (156.5),
logistics (126.1), food (103.8). Các ngành này
thường bao gồm các công ty có giá mỗi cổ phiếu rất cao.
Do: Tăng trưởng vượt bậc: Các công ty dẫn đầu đang
trong giai đoạn tăng trưởng nóng, thu hút dòng vốn lớn khiến giá cổ
phiếu tăng vọt. Ít chia tách cổ phiếu: Các công ty này
có thể còn tương đối mới hoặc không có chính sách chia tách cổ phiếu để
giữ giá ở mức thấp. Biên lợi nhuận cao: Ngành có lợi
nhuận cao, được thị trường định giá cao. => Như Ngành
music có thể bị chi phối bởi một công ty như Spotify, có
giá cổ phiếu cao. Cryptocurrency có thể là Coinbase.ti_le < 40):
technology (27.2), footwear (29.6),
apparel (28.3), e-commerce (30.5). Đây là một
insight cực kỳ thú vị và quan trọng. Ngành
technology có tổng giá trị giao dịch lớn nhất thế giới,
nhưng giá cổ phiếu trung bình lại rất thấp. Tại sao? Sự trưởng
thành và Phổ cập: Đây là dấu hiệu của các công ty
“blue-chip” khổng lồ, đã trưởng thành. Qua nhiều năm, họ đã
thực hiện nhiều lần chia tách cổ phiếu (stock split) để
giữ cho giá mỗi cổ phiếu ở mức phải chăng, dễ tiếp cận với các nhà đầu
tư nhỏ lẻ. Thanh khoản cực cao: Giá thấp hơn giúp tăng
khối lượng giao dịch. => Apple, Microsoft, Amazon (trước các đợt chia
tách gần đây) đều là những gã khổng lồ nhưng luôn cố gắng giữ giá cổ
phiếu không quá “ngất ngưởng”.ti_le từ 50 -
100):
automotive (99.5), entertainment (78.5),
finance (59.6). Các ngành này có sự cân bằng hơn. Chúng có
thể bao gồm cả các công ty lâu đời và các công ty tăng trưởng mới, tạo
ra một mức giá trung bình ở khoảng giữa.Insight 2: Không có Tương quan đơn giản giữa Quy mô và Giá Cổ phiếu
Ngành có tổng giá trị giao dịch lớn nhất
(technology) lại không phải là ngành có giá cổ phiếu trung
bình cao nhất.Quy mô kinh tế của một ngành không nhất thiết
quyết định “mệnh giá” cổ phiếu của nó. Một ngành có thể cực kỳ lớn mạnh
nhưng vẫn có giá cổ phiếu trung bình thấp để thu hút đông đảo nhà đầu
tư. Ngược lại, một ngành “ngách” hơn có thể có các cổ phiếu với giá
“trên trời”.
ggplot(d_ket_qua, aes(x = reorder(Industry_Tag, ti_le), y = ti_le)) +
geom_col(aes(fill = Industry_Tag), show.legend = FALSE) + # Vẽ biểu đồ cột và tô màu theo ngành
coord_flip() + # Lật các trục để có biểu đồ cột ngang
geom_text(aes(label = round(ti_le, 2)), hjust = -0.2) + # Thêm nhãn giá trị lên mỗi cột
labs(
title = "Giá Trung Bình Cân Bằng Khối Lượng (VWAP) theo Ngành",
x = "Ngành Công Nghiệp",
y = "VWAP (Giá trị / Khối lượng)"
) +
theme_minimal()
Biểu đồ cho thấy sự phân hóa rất rõ rệt về mặt bằng giá giao dịch giữa các ngành:
1. Nhóm Dẫn Đầu (VWAP rất cao): * Ngành Âm nhạc (Music): Đứng đầu với mức VWAP cao vượt trội, bỏ xa tất cả các ngành còn lại (thanh ngang của nó dài hơn cả biểu đồ). Điều này cho thấy ngành này có thể có một hoặc vài cổ phiếu/tài sản “ngôi sao” với thị giá cực kỳ cao, chi phối toàn bộ giá giao dịch trung bình của ngành. * Tiền điện tử (Cryptocurrency): Đứng thứ hai với VWAP là 156.51. Điều này hoàn toàn hợp lý vì các tài sản kỹ thuật số như Bitcoin, Ethereum… thường có giá trị rất cao. * Logistics, Thực phẩm (Food), Ô tô (Automotive): Nằm trong top đầu với VWAP quanh mức 100-126. Đây là những ngành công nghiệp lớn, có các công ty đầu ngành với thị giá cổ phiếu cao.
2. Nhóm Giữa (VWAP ở mức trung bình - khá): * Các ngành như Dịch vụ tài chính (Financial services), Hàng xa xỉ (Luxury goods), Giải trí (Entertainment), Chăm sóc sức khỏe (Healthcare)… có VWAP dao động trong khoảng từ 73 đến 86. Đây là mức giá giao dịch trung bình khá phổ biến trên thị trường.
3. Nhóm Cuối Bảng (VWAP thấp): * Các ngành có VWAP thấp nhất bao gồm Hàng không (Aviation) ở mức 27.15, Công nghệ (Technology) ở mức 27.27, và May mặc (Apparel) ở mức 28.34. * Điều này không có nghĩa là các ngành này hoạt động kém, mà chỉ đơn giản là mặt bằng giá cổ phiếu trung bình của các công ty trong ngành này thấp hơn so với các nhóm trên.
tong_volume_theo_sticker <- d %>% # bắt đầu với bộ dữ liệu 'd'
group_by(Ticker) %>% # nhóm các còng dữ liệu (Ticker)
summarise(Tong_Volume = sum(Volume, na.rm = TRUE)) # tính tổng khối lượng gioa dịch
so_sticker_thoaman_dieu_kien <- tong_volume_theo_sticker %>%
filter(Tong_Volume > 10000000000) %>% #Lọc ra mã có tổng >10 tỷ
nrow()
tong_so_sticker_duy_nhat <- n_distinct(d$Ticker) # đếm tổng mã trong bộ dữ liệu 'd'
# Tính tỷ lệ: (Số mã thỏa mãn / Tổng số mã) * 100
if (tong_so_sticker_duy_nhat > 0) {
ti_le_phan_tram <- (so_sticker_thoaman_dieu_kien / tong_so_sticker_duy_nhat) * 100
} else {
ti_le_phan_tram <- 0
}
# in kết quả
cat(sprintf("Tỷ lệ các sticker có khối lượng giao dịch lớn hơn 10,000,000,000 là: %.2f%%\n", ti_le_phan_tram))
## Tỷ lệ các sticker có khối lượng giao dịch lớn hơn 10,000,000,000 là: 67.74%
Trong toàn bộ dữ liệu đang phân tích, sau khi tính tổng khối lượng giao dịch của từng mã cổ phiếu (sticker/ticker) riêng biệt, có đến 67.74% tức là hơn 2/3 số mã cổ phiếu có tổng khối lượng giao dịch vượt mốc 10 tỷ đơn vị.
=> Điều này cho thấy phần lớn các cổ phiếu trong bộ dữ liệu này có tính thanh khoản rất cao và được giao dịch với khối lượng cực kỳ lớn, có thể đây là dữ liệu tập trung vào các cổ phiếu vốn hóa lớn hoặc các cổ phiếu “blue-chip” trên thị trường.
bieu_do_data <- d %>%
group_by(Ticker) %>%
#tính tổng khối lượng gioa dịch cho mỗi mã
summarise(Tong_Volume = sum(Volume, na.rm = TRUE)) %>%
mutate(Nhom = ifelse(Tong_Volume > 10000000000,
"Khối lượng > 10 tỷ",
"Khối lượng <= 10 tỷ")) %>%
count(Nhom) %>%
# Tạo cột text chứa tỷ lệ phần trăm
mutate(label_text = paste0(round(n / sum(n) * 100, 2), "%"))
# Khởi tạo biểu đồ
ggplot(bieu_do_data, aes(x = "", y = n, fill = Nhom)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = label_text), position = position_stack(vjust = 0.5)) +
labs(title = "Tỷ lệ Sticker theo Tổng Khối lượng Giao dịch", fill = "Nhóm Khối Lượng") +
theme_void()
Biểu đồ tròn này cho thấy sự phân bổ tỷ lệ các mã cổ phiếu (sticker) dựa trên tổng khối lượng giao dịch của chúng, được chia thành hai nhóm: nhóm có khối lượng giao dịch **lớn hơn 10 tỷ** và nhóm **nhỏ hơn hoặc bằng 10 tỷ**.
Tính thanh khoản và sự tập trung của dòng tiền: Kết quả này cho thấy một sự thật quan trọng trên thị trường: dòng tiền không được phân bổ đều mà tập trung mạnh vào một nhóm cổ phiếu nhất định. Gần 70% các mã trong bộ dữ liệu này có tính thanh khoản cực kỳ cao. Thanh khoản cao có nghĩa là cổ phiếu đó được mua bán liên tục với khối lượng lớn, giúp nhà đầu tư dễ dàng giao dịch mà không làm ảnh hưởng nhiều đến giá.
Sự hấp dẫn của các cổ phiếu “Blue-Chip” hoặc “Cổ phiếu Vua”: Các cổ phiếu có khối lượng giao dịch khổng lồ thường là các cổ phiếu của những doanh nghiệp lớn, đầu ngành (blue-chip), có uy tín và nền tảng kinh doanh vững chắc. Chúng thu hút sự quan tâm của cả nhà đầu tư tổ chức (quỹ đầu tư, công ty bảo hiểm) lẫn nhà đầu tư cá nhân, tạo ra khối lượng giao dịch lớn.
Phản ánh cấu trúc của bộ dữ liệu: Biểu đồ này cũng cho thấy bộ dữ liệu đang được phân tích có thể tập trung chủ yếu vào các cổ phiếu vốn hóa lớn và vừa, thay vì bao gồm toàn bộ thị trường (vốn có rất nhiều cổ phiếu nhỏ, thanh khoản thấp). Điều này cho thấy sự phân hóa rõ rệt: thị trường được “dẫn dắt” bởi một nhóm cổ phiếu có thanh khoản vượt trội, trong khi phần còn lại ít được chú ý hơn.
=> Biểu đồ không chỉ là một con số thống kê mà nó còn phác họa nên bức tranh về “sức khỏe” và “khẩu vị” của thị trường. Thị trường này rất sôi động, nhưng sự sôi động đó tập trung chủ yếu vào khoảng 2/3 số cổ phiếu, đây chính là những mã dẫn dắt và thu hút phần lớn dòng tiền của nhà đầu tư.
so_ma_thoaman <- d %>%
# Lọc dữ liệu theo điều kiện
filter(Dividends > 0 & Volume > 50000000) %>%
summarise(So_Luong_Ma = n_distinct(Ticker))
print(so_ma_thoaman)
## So_Luong_Ma
## 1 8
Trong toàn bộ bộ dữ liệu đang được phân tích, có 8 mã cổ phiếu (ticker) duy nhất thỏa mãn đồng thời cả hai điều kiện sau đây tại ít nhất một thời điểm:
Dividends > 0).Volume > 5000000).tong_so_ma <- d %>%
# Đếm số mã (Ticker) duy nhất và lưu vào cột 'Tong_So_Ma'
summarise(Tong_So_Ma = n_distinct(Ticker)) %>%
# Rút giá trị duy nhất đó ra khỏi bảng dữ liệu để thành một con số
pull(Tong_So_Ma)
# Lấy số mã thỏa mãn (tính ở code trước) chia cho tổng số mã, rồi nhân 100
# `so_ma_thoaman$So_Luong_Ma` chính là con số 8 đã tính được ở bước trước.
ty_le <- so_ma_thoaman$So_Luong_Ma / tong_so_ma * 100
#TẠO BẢNG DỮ LIỆU (DATA FRAME) ĐỂ VẼ BIỂU ĐỒ
data <- data.frame(
label = "Số lượng mã thỏa mãn điều kiện",
value = so_ma_thoaman$So_Luong_Ma,
percentage = ty_le
)
# Khởi tạo biểu đồ ggplot
ggplot(data, aes(x = "", y = value, fill = label)) +
# Vẽ một biểu đồ cột (sẽ được uốn thành hình tròn)
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5)) + # Thêm nhãn (text) vào biểu đồ
labs(title = "Tỉ lệ số lượng mã cổ phiếu thỏa mãn điều kiện",
x = NULL, y = NULL, fill = NULL) + # Đặt tên biểu đồ và ẩn đi các trục
theme_void()
Kết quả 12.9% cho thấy rằng nhóm cổ phiếu “lý tưởng” - tức là những công ty vừa có sức khỏe tài chính tốt để chia sẻ lợi nhuận cho cổ đông (trả cổ tức), vừa có tính thanh khoản cao và thu hút được sự quan tâm lớn của thị trường (khối lượng giao dịch lớn) - là một nhóm thiểu số và tương đối hiếm.
tong_khoi_luong_cong_nghe <- d %>%
# Lọc và chỉ giữ lại những dòng có giá trị trong cột 'Industry_Tag'
filter(Industry_Tag == "technology") %>%
# Từ những dòng đã được lọc ở trên, tính tổng (sum) tất cả các giá trị
summarise(Tong_Khoi_Luong = sum(Volume))
print(tong_khoi_luong_cong_nghe)
## Tong_Khoi_Luong
## 1 4.522656e+12
Tổng khối lượng giao dịch của tất cả các cổ phiếu thuộc nhóm ngành công nghệ (“technology”) trong toàn bộ khoảng thời gian mà bộ dữ liệu ghi nhận.
Giá trị này (khoảng 4,522 nghìn tỷ đơn vị) cho thấy ngành công nghệ là một ngành có tính thanh khoản cực kỳ cao và thu hút một lượng giao dịch khổng lồ từ các nhà đầu tư trên thị trường.
# Tạo một bảng dữ liệu mới tên là 'bieu_do_data'
bieu_do_data <- data.frame(
Nhom = c("Công nghệ", "Các ngành khác"),
Khoi_Luong = c(
tong_khoi_luong_cong_nghe$Tong_Khoi_Luong,
sum(d$Volume, na.rm = TRUE) - tong_khoi_luong_cong_nghe$Tong_Khoi_Luong
)
)
# Khởi tạo biểu đồ:
ggplot(bieu_do_data, aes(x = "", y = Khoi_Luong, fill = Nhom)) +
geom_col(width = 1) +
coord_polar("y", start = 0) +
theme_void() +
# Thêm tiêu đề cho biểu đồ
labs(title = "Tỷ lệ Khối lượng Giao dịch Ngành Công nghệ", fill = "Nhóm Ngành")
Sự thống trị và sức hút của ngành công nghệ: Đây là minh chứng rõ ràng nhất cho thấy ngành công nghệ đang là tâm điểm và dẫn dắt thị trường. Khối lượng giao dịch của riêng ngành này còn lớn hơn tất cả các ngành khác cộng lại. Điều này cho thấy dòng tiền của nhà đầu tư đang tập trung rất mạnh vào các cổ phiếu công nghệ.
Phản ánh xu hướng kinh tế vĩ mô: Kết quả này hoàn toàn phù hợp với xu hướng toàn cầu, nơi các công ty công nghệ đang ngày càng đóng vai trò trọng yếu trong nền kinh tế thông qua chuyển đổi số, trí tuệ nhân tạo, điện toán đám mây… Sự kỳ vọng vào tiềm năng tăng trưởng vượt bậc của ngành này đã biến nó thành “thỏi nam châm” thu hút vốn đầu tư.
Thanh khoản và Rủi ro:
=> Biểu đồ không chỉ đơn thuần là một con số, mà nó vẽ nên một bức tranh toàn cảnh về “khẩu vị” của thị trường: Dòng tiền đang đặt cược lớn vào tương lai của ngành công nghệ.
Lọc ra tất cả giao dịch của ngành trang phục -> Tính tổng khối lượng của chúng -> In kết quả.
tong_khoi_luong_apparel <- d %>%
# Lọc và chỉ giữ lại những dòng có giá trị trong cột 'Industry_Tag'
filter(Industry_Tag == "apparel") %>%
summarise(Tong_Khoi_Luong = sum(Volume, na.rm = TRUE))
print(tong_khoi_luong_apparel)
## Tong_Khoi_Luong
## 1 101525538443
Tổng khối lượng giao dịch 101,525,538,443 (hơn 101.5 tỷ) của tất cả các cổ phiếu thuộc nhóm ngành Trang phục (apparel) trong toàn bộ khoảng thời gian mà bộ dữ liệu ghi nhận. Con số này cho thấy, mặc dù có thể không sôi động bằng ngành công nghệ, ngành trang phục nhưng vẫn là một ngành có tính thanh khoản đáng kể và thu hút một lượng giao dịch lớn từ các nhà đầu tư.
# Tạo một bảng dữ liệu mới tên là 'bieu_do_data'
bieu_do_data <- data.frame(
Nhom = c("Trang phục", "Các ngành khác"),
Khoi_Luong = c(
tong_khoi_luong_apparel$Tong_Khoi_Luong,
sum(d$Volume, na.rm = TRUE) - tong_khoi_luong_apparel$Tong_Khoi_Luong
)
)
#VẼ BIỂU ĐỒ TRÒN BẰNG GGPLOT2
ggplot(bieu_do_data, aes(x = "", y = Khoi_Luong, fill = Nhom)) +
geom_col(width = 1) +
coord_polar("y", start = 0) +
theme_void() +
labs(title = "Tỷ lệ Khối lượng Giao dịch Ngành Trang phục", fill = "Nhóm Ngành")
Biểu đồ tròn này so sánh tổng khối lượng giao dịch của ngành Trang phục với tổng khối lượng giao dịch của tất cả các ngành còn lại trên thị trường cộng lại.
Vai trò thứ yếu trên thị trường chứng khoán: Đây là một minh chứng rất trực quan cho thấy ngành Trang phục, xét về mặt hoạt động giao dịch, chỉ là một ngành rất nhỏ, mang tính ngách trên thị trường. Dòng tiền của nhà đầu tư không tập trung vào đây.
Sự tương phản rõ rệt với các ngành dẫn dắt: Nếu so sánh với biểu đồ của ngành Công nghệ (chiếm hơn nửa thị trường), ta có thể thấy sự phân hóa cực kỳ mạnh mẽ. Trong khi Công nghệ là “đầu tàu” dẫn dắt thị trường, thu hút phần lớn sự chú ý và dòng tiền, thì Trang phục lại nằm ở vị thế hoàn toàn trái ngược.
Phản ánh đặc tính của ngành: Ngành trang phục thường được xem là một ngành công nghiệp truyền thống, có tính cạnh tranh cao, biên lợi nhuận không quá đột phá và tốc độ tăng trưởng ổn định chứ không bùng nổ như công nghệ. Do đó, nó ít tạo ra “sóng” và sự phấn khích trên thị trường chứng khoán, dẫn đến khối lượng giao dịch thấp.
Thanh khoản thấp: Tổng khối lượng giao dịch thấp của cả ngành cho thấy mức độ thanh khoản chung của nhóm cổ phiếu này không cao. Nhà đầu tư có thể gặp khó khăn hơn khi muốn mua/bán một lượng lớn cổ phiếu mà không làm ảnh hưởng đến giá.
#LỌC DỮ LIỆU THEO NGÀNH
tong_khoi_luong_retail <- d %>%
filter(Industry_Tag == "retail") %>%
summarise(Tong_Khoi_Luong = sum(Volume, na.rm = TRUE))
print(tong_khoi_luong_retail)
## Tong_Khoi_Luong
## 1 1.32745e+11
tổng khối lượng giao dịch của tất cả các cổ phiếu thuộc nhóm ngành Bán lẻ (retail) trong toàn bộ khoảng thời gian.
Giá trị này (hơn 132.7 tỷ đơn vị) cho thấy ngành bán lẻ cũng là một ngành có hoạt động giao dịch sôi động và thu hút sự quan tâm đáng kể của nhà đầu tư, thể hiện qua tính thanh khoản cao.
# --- BƯỚC 1: TẠO DATA FRAME ĐỂ VẼ BIỂU ĐỒ ---
bieu_do_data <- data.frame( # Tạo một bảng dữ liệu mới tên là 'bieu_do_data'
Nhom = c("Bán lẻ", "Các ngành khác"), # Cột 1 'Nhom': Tạo hai dòng với nhãn là "Bán lẻ" và "Các ngành khác".
# Đây sẽ là tên hiển thị trong phần chú thích (legend).
khoi_Luong = c( # Cột 2 'khoi_Luong': Chứa giá trị khối lượng tương ứng cho mỗi nhóm.
tong_khoi_luong_retail$Tong_Khoi_Luong, # - Giá trị đầu tiên: Lấy tổng khối lượng ngành bán lẻ đã tính ở bước trước.
sum(d$Volume, na.rm = TRUE) - # - Giá trị thứ hai: Lấy TỔNG KHỐI LƯỢNG của toàn bộ thị trường
tong_khoi_luong_retail$Tong_Khoi_Luong # trừ đi khối lượng của ngành bán lẻ để ra khối lượng của 'Các ngành khác'.
)
)
# --- BƯỚC 2: VẼ BIỂU ĐỒ TRÒN BẰNG GGPLOT2 ---
ggplot(bieu_do_data, aes(x = "", y = khoi_Luong, fill = Nhom)) + # Khởi tạo biểu đồ:
# - x = "": Đặt trục x rỗng để tạo một cột duy nhất (cần thiết cho biểu đồ tròn).
# - y = khoi_Luong: Độ lớn của mỗi phần bánh sẽ dựa trên giá trị cột 'khoi_Luong'.
# - fill = Nhom: Tô màu cho các phần bánh dựa trên cột 'Nhom'.
geom_col(width = 1) + # Vẽ biểu đồ cột xếp chồng (sẽ được uốn cong thành hình tròn).
coord_polar("y", start = 0) + # Lệnh "thần kỳ" biến biểu đồ cột thành biểu đồ tròn bằng cách uốn cong trục y.
theme_void() + # Xóa toàn bộ nền, trục, lưới... để biểu đồ trông sạch sẽ và tối giản.
labs(title = "Tỷ lệ Khối lượng Giao dịch Ngành Bán lẻ", # Thêm tiêu đề cho biểu đồ.
fill = "Nhóm Ngành") # Đổi tên tiêu đề của phần chú thích (legend) thành "Nhóm Ngành".
Phần màu đỏ (“Bán lẻ”) là một lát cắt rất nhỏ. * Phần màu xanh (“Các ngành khác”) chiếm gần như toàn bộ biểu đồ ước tính >95%.
Vai trò khiêm tốn trên thị trường: Tương tự như ngành Trang phục, biểu đồ này cho thấy ngành Bán lẻ, xét về tổng khối lượng giao dịch, không phải là một ngành dẫn dắt hay chiếm tỷ trọng lớn trên thị trường chứng khoán. Dòng tiền của nhà đầu tư không tập trung chủ yếu vào đây.
Ngành kinh tế phòng thủ: Ngành bán lẻ thường được coi là một ngành kinh tế “phòng thủ”. Hoạt động của nó gắn liền với chi tiêu tiêu dùng thiết yếu, do đó thường ổn định nhưng thiếu đi yếu tố tăng trưởng đột phá như ngành công nghệ. Sự ổn định này thường đi kèm với việc ít tạo ra sự phấn khích và “sóng” lớn trên thị trường, dẫn đến khối lượng giao dịch không quá cao so với tổng thể.
Sự phân hóa của thị trường: Biểu đồ một lần nữa nhấn mạnh sự phân hóa mạnh mẽ của dòng tiền trên thị trường. Một vài ngành “ngôi sao” (như Công nghệ đã thấy ở các phân tích trước) thu hút phần lớn sự chú ý và khối lượng giao dịch, trong khi các ngành truyền thống hơn như Bán lẻ chỉ chiếm một phần nhỏ.
=> Dưới góc độ kinh tế, biểu đồ cho thấy ngành Bán lẻ là một phần của nền kinh tế nhưng không phải là tâm điểm của hoạt động giao dịch trên thị trường chứng khoán. Nó đại diện cho một nhóm cổ phiếu có vai trò ổn định nhưng không phải là nơi dòng tiền đầu cơ hay đầu tư tăng trưởng tập trung mạnh mẽ.
# Gán kết quả của chuỗi lệnh vào biến 'danh_sach_ma'
danh_sach_ma <- d %>% # Bắt đầu với bộ dữ liệu gốc 'd'
# BƯỚC 1: LỌC DỮ LIỆU THEO CÁC ĐIỀU KIỆN KÉP
filter(startsWith(tolower(Brand_Name), "f") & Volume > 5000000) %>%
# Lọc và chỉ giữ lại những dòng thỏa mãn CẢ HAI điều kiện:
# 1. startsWith(tolower(Brand_Name), "f"):
# - tolower(Brand_Name): Chuyển tên thương hiệu về chữ thường (để không phân biệt hoa/thường, vd: "Ford" và "ford" đều được).
# - startsWith(..., "f"): Kiểm tra xem tên đã chuyển sang chữ thường có bắt đầu bằng ký tự "f" hay không.
# 2. & : Toán tử "VÀ".
# 3. Volume > 5000000: Khối lượng giao dịch trong phiên đó phải lớn hơn 5 triệu.
# BƯỚC 2: LOẠI BỎ CÁC DÒNG TRÙNG LẶP
distinct(Ticker, Brand_Name) # Lấy ra các cặp giá trị (Ticker, Brand_Name) duy nhất.
# Điều này đảm bảo mỗi công ty chỉ xuất hiện một lần trong kết quả,
# ngay cả khi nó thỏa mãn điều kiện lọc ở nhiều ngày khác nhau.
# In kết quả (là một bảng dữ liệu chứa danh sách các mã thỏa mãn) ra màn hình
print(danh_sach_ma)
## Ticker Brand_Name
## 1 FL foot locker
## 2 FDX fedex
so_ma_dat_yeu_cau <- nrow(danh_sach_ma)
tong_so_ma_chu_f <- danh_sach_ma$So_Luong
pie_chart_data <- data.frame(
Phan_Loai = c("Đạt yêu cầu (Volume > 50M)", "Không đạt yêu cầu"),
So_Luong = c(
so_ma_dat_yeu_cau,
tong_so_ma_chu_f - so_ma_dat_yeu_cau # Phần còn lại (3 - 1 = 2)
)
) %>%
mutate(label_text = paste0(round(So_Luong / sum(So_Luong) * 100, 1), "%"))
ggplot(pie_chart_data, aes(x = "", y = So_Luong, fill = Phan_Loai)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = label_text),
position = position_stack(vjust = 0.5),
color = "white", size = 5) +
labs(
title = "Tỷ lệ Mã cổ phiếu bắt đầu bằng 'F' thỏa mãn điều kiện Volume",
fill = "Phân loại"
) +
theme_void()
monthly_2024_volume <- d %>% mutate(
Date = ymd_hms(Date),
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter(
Year == 2024
) %>%
group_by(YearMonth) %>%
summarise(
Total_Volume = sum(Volume, na.rm = TRUE),
.groups = 'drop'
)
print(monthly_2024_volume)
## # A tibble: 12 × 2
## YearMonth Total_Volume
## <chr> <dbl>
## 1 2024-01 23406952267
## 2 2024-02 23749309220
## 3 2024-03 24285768920
## 4 2024-04 22748813500
## 5 2024-05 22310972400
## 6 2024-06 21735549178
## 7 2024-07 23548064723
## 8 2024-08 25164596411
## 9 2024-09 18714158654
## 10 2024-10 18800387895
## 11 2024-11 20706258213
## 12 2024-12 19793773200
Volume là Khối lượng Giao dịch Tài chính Cổ phiếu, Trái
phiếu, Tiền điện tử**
Dữ liệu này phản ánh mức độ sôi động và tâm lý của thị trường.
24,285 tỷ). Điều này cho
thấy thị trường khởi đầu năm mới rất sôi động. Có thể do:
25,164 tỷ) rồi đột ngột giảm sâu vào tháng 9.
ggplot(monthly_2024_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu từ 'monthly_2024_volume'.
aes(x = YearMonth, y = Total_Volume)) + # Định nghĩa các trục:
# - Trục X (hoành) là cột 'YearMonth'.
# - Trục Y (tung) là cột 'Total_Volume'.
geom_bar(stat = "identity", fill = "skyblue") + # Vẽ biểu đồ cột (bar chart):
# - stat = "identity": Chiều cao cột lấy trực tiếp từ giá trị của trục Y.
# - fill = "skyblue": Tô màu xanh da trời cho các cột.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)), # Thêm nhãn số liệu lên trên mỗi cột.
# - label = ...: Nội dung nhãn là giá trị 'Total_Volume' đã được định dạng.
# - format(...): Định dạng số cho dễ đọc.
# - big.mark = ",": Thêm dấu phẩy ngăn cách hàng nghìn.
# - scientific = FALSE: Không dùng ký hiệu khoa học (vd: 2.5e+10).
vjust = -0.5, # - vjust = -0.5: Đẩy nhãn số liệu lên phía trên đỉnh cột một chút.
size = 4) + # - size = 4: Đặt kích thước chữ của nhãn.
scale_y_continuous(labels = comma) + # Định dạng lại các nhãn số trên trục Y để có dấu phẩy ngăn cách hàng nghìn.
labs( # Thêm tiêu đề và tên cho các trục.
title = "Tổng Khối lượng giao dịch Toàn bộ theo Tháng (Năm 2024)", # Tiêu đề chính của biểu đồ.
x = "Tháng (Year-Month)", # Tên trục X.
y = "Tổng Khối lượng giao dịch (Total Volume)" # Tên trục Y.
) +
theme_minimal() + # Áp dụng giao diện (theme) tối giản, nền trắng cho biểu đồ.
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Tùy chỉnh chi tiết giao diện:
# - axis.text.x: Nhắm vào các nhãn trên trục X.
# - angle = 45: Xoay các nhãn 45 độ để không bị chồng lên nhau.
# - hjust = 1: Căn lề cho các nhãn đã xoay.
Khởi đầu năm mạnh mẽ (Quý 1): Ba cột đầu tiên (Tháng 1, 2, 3) đều ở mức rất cao, cho thấy một sự khởi đầu năm đầy lạc quan và sôi động. Thị trường hoặc hoạt động kinh doanh có thể đã được thúc đẩy bởi kỳ vọng tích cực sau kỳ nghỉ lễ.
Giai đoạn Hạ nhiệt (Quý 2): Có thể thấy rõ xu hướng đi xuống của các cột từ tháng 3 đến tháng 6. Đây là giai đoạn thị trường “nguội” lại, có thể do nhà đầu tư chốt lời hoặc hoạt động kinh doanh chậm lại theo mùa vụ.
Điểm nhấn Bất thường vào Tháng 8: Cột của Tháng 8 là cột cao nhất một cách đột biến, vượt trội so với tất cả các tháng khác. Đây là điểm dữ liệu quan trọng nhất trên biểu đồ. Về mặt kinh tế, điều này cho thấy một sự kiện lớn đã xảy ra:
Sụt giảm Nhanh chóng sau Đỉnh: Ngay sau tháng 8, cột tháng 9 giảm mạnh. Điều này cho thấy sự kiện của tháng 8 không tạo ra một xu hướng bền vững. Nó có thể là một đợt bùng nổ ngắn hạn, theo sau là sự điều chỉnh hoặc chốt lời hàng loạt.
Kết thúc năm Yếu ớt (Quý 4): Các cột của Quý 4 (Tháng 10, 11, 12) rõ ràng thấp hơn so với đầu năm. Đây là một dấu hiệu đáng chú ý. Thông thường, quý cuối năm là mùa mua sắm và giao dịch sôi động. Việc khối lượng ở mức thấp có thể báo hiệu:
monthly_usa_2024_volume <- d %>% # Bắt đầu chuỗi xử lý từ bảng dữ liệu 'd',
mutate( # và gán kết quả cuối cùng cho biến 'monthly_usa_2024_volume'.
Date = ymd_hms(Date), # Tạo ra các cột mới để xử lý dữ liệu thời gian.
Year = year(Date), # - Chuyển cột 'Date' sang định dạng ngày-giờ chuẩn.
YearMonth = format(Date, "%Y-%m") # - Trích xuất năm từ cột 'Date' vào cột mới 'Year'.
) %>%
filter( # Lọc để chỉ giữ lại các dòng dữ liệu thỏa mãn điều kiện.
Year == 2024,
tolower(Country) == "usa" # - Điều kiện 1: Chỉ lấy dữ liệu của năm 2024.
) %>% # (tolower() để đảm bảo bắt được cả "USA", "Usa", "usa",...)
group_by(YearMonth) %>%
summarise(
Total_Volume = sum(Volume, na.rm = TRUE),
.groups = 'drop'
)
print(monthly_usa_2024_volume) # In kết quả (bảng tổng hợp khối lượng theo tháng của Mỹ) ra màn hình.
## # A tibble: 12 × 2
## YearMonth Total_Volume
## <chr> <dbl>
## 1 2024-01 23062439767
## 2 2024-02 23331852720
## 3 2024-03 24021621120
## 4 2024-04 22402721700
## 5 2024-05 21826184900
## 6 2024-06 21395981180
## 7 2024-07 23165678147
## 8 2024-08 24692219213
## 9 2024-09 18452661015
## 10 2024-10 18524808168
## 11 2024-11 20255720810
## 12 2024-12 19422079602
=> Dữ liệu cho thấy thị trường tài chính Mỹ năm 2024 không có một xu hướng tăng trưởng bền vững mà chịu sự chi phối mạnh bởi các sự kiện kinh tế vĩ mô và tâm lý theo mùa vụ. Sự kiện trong tháng 8 là điểm nhấn quan trọng nhất, tạo ra một đỉnh cao đột biến trước khi thị trường bước vào giai đoạn điều chỉnh và thận trọng hơn vào cuối năm.
# Bắt đầu một khối lệnh R.
ggplot(monthly_usa_2024_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu từ 'monthly_usa_2024_volume'.
aes(x = YearMonth,
y = Total_Volume)) + # Định nghĩa các trục:
# - Trục X (hoành) là cột 'YearMonth'.
# - Trục Y (tung) là cột 'Total_volume'.
geom_bar(stat = "identity", fill = "lightgreen") + # Vẽ biểu đồ cột (bar chart):
# - stat = "identity": Chiều cao cột lấy trực tiếp từ giá trị của trục Y.
# - fill = "lightgreen": Tô màu xanh lá cây nhạt cho các cột.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)),# Thêm nhãn số liệu lên trên mỗi cột.
# - label = ...: Nội dung nhãn là giá trị 'Total_volume' đã được định dạng.
# - format(...): Định dạng số cho dễ đọc.
# - big.mark = ",": Thêm dấu phẩy ngăn cách hàng nghìn.
vjust = -0.5, # - vjust = -0.5: Đẩy nhãn số liệu lên phía trên đỉnh cột một chút.
size = 4) +
scale_y_continuous(labels = comma) + # Định dạng lại các nhãn số trên trục Y để có dấu phẩy ngăn cách hàng nghìn.
labs(
title = "Tổng Khối lượng giao dịch CỦA MỸ theo Tháng (Năm 2024)",
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)"
) +
theme_minimal() + # Áp dụng giao diện (theme) tối giản, nền trắng cho biểu đồ.
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Tùy chỉnh chi tiết giao diện:
# - axis.text.x: Nhắm vào các nhãn trên trục X.
# - angle = 45: Xoay các nhãn 45 độ để không bị chồng lên nhau.
# - hjust = 1: Căn lề cho các nhãn đã xoay.
(Quý 1): Các cột từ tháng 1 đến tháng 3 đều rất cao, thể hiện một khởi đầu năm đầy năng lượng. Về mặt kinh tế, điều này cho thấy sự lạc quan của nhà đầu tư. Dòng tiền chảy mạnh vào thị trường, có thể do kỳ vọng vào việc Cục Dự trữ Liên bang Mỹ (FED) sẽ có chính sách tiền tệ nới lỏng hơn, hoặc do kết quả kinh doanh tốt của các doanh nghiệp trong quý trước đó.
(Quý 2): Một xu hướng giảm rõ rệt được thể hiện qua các cột từ tháng 4 đến tháng 6. Đây là một mô hình kinh điển, phản ánh tâm lý chốt lời và giảm thiểu rủi ro của thị trường. Các nhà đầu tư thường có xu hướng giảm hoạt động trước kỳ nghỉ hè, và giai đoạn này cũng thường thiếu vắng các thông tin kinh tế vĩ mô mang tính đột phá.
Tâm điểm của Năm - Biến động Quý 3: * Tháng 8 - Đỉnh điểm Bùng nổ: Cột của tháng 8 là cao nhất, là điểm nhấn nổi bật nhất của cả năm. Một khối lượng giao dịch đột biến như vậy không xảy ra ngẫu nhiên. Nó báo hiệu một sự kiện kinh tế vĩ mô cực kỳ quan trọng tại Mỹ. Đó có thể là một báo cáo lạm phát tốt hơn dự kiến, một tín hiệu tích cực từ FED, hoặc một làn sóng đầu tư vào một lĩnh vực công nghệ mới nổi đã đạt đến đỉnh điểm. * Tháng 9 - Sự Sụt giảm Nhanh chóng: Ngay sau đỉnh cao, khối lượng giao dịch giảm mạnh nhất trong năm. Điều này cho thấy sự bùng nổ của tháng 8 không bền vững. Nó có thể là một đợt “xả hàng” chốt lời hàng loạt hoặc phản ánh những lo ngại mới về kinh tế vĩ mô quay trở lại, phù hợp với “Hiệu ứng tháng 9” (thường là tháng có hiệu suất kém trên thị trường chứng khoán). Giai đoạn Thận trọng Cuối năm (Quý 4): * Các cột của 3 tháng cuối năm đều ở mức thấp hơn đáng kể so với đầu năm. Điều này cho thấy tâm lý thận trọng đang bao trùm thị trường. Nhà đầu tư có thể đang chờ đợi những định hướng rõ ràng hơn cho năm kinh tế tiếp theo, hoặc lo ngại về rủi ro suy thoái. Mặc dù có sự phục hồi nhẹ vào tháng 11 và 12 (có thể do hiệu ứng mua sắm cuối năm).
tech_usa_2024_monthly_volume <- d %>% # Bắt đầu chuỗi xử lý, gán kết quả cho biến mới
mutate(
Date = ymd_hms(Date), # Tạo các cột thời gian cần thiết.
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter(
tolower(Country) == "usa", # Lọc dữ liệu với 3 điều kiện đồng thời.
Year == 2024,
tolower(Industry_Tag) == "technology"
) %>%
group_by(YearMonth) %>% # Gom nhóm dữ liệu theo từng tháng.
summarise( # Tóm tắt dữ liệu cho mỗi tháng.
Total_Volume = sum(Volume, na.rm = TRUE),
Industry_Tag = first(Industry_Tag),
.groups = 'drop'
)
print(tech_usa_2024_monthly_volume)
## # A tibble: 12 × 3
## YearMonth Total_Volume Industry_Tag
## <chr> <dbl> <chr>
## 1 2024-01 15157313800 technology
## 2 2024-02 15979570300 technology
## 3 2024-03 17285194500 technology
## 4 2024-04 14789834300 technology
## 5 2024-05 14469025100 technology
## 6 2024-06 14208761596 technology
## 7 2024-07 12844111657 technology
## 8 2024-08 15245326678 technology
## 9 2024-09 11366656245 technology
## 10 2024-10 10640904721 technology
## 11 2024-11 10503536908 technology
## 12 2024-12 10756604259 technology
Kết quả này cho thấy “nhịp đập” của riêng ngành công nghệ Mỹ, một trong những ngành quan trọng và biến động nhất.
Đầu năm Sôi động: Khối lượng giao dịch đạt đỉnh vào tháng 3 (17.2 tỷ). Điều này cho thấy sự quan tâm rất lớn của nhà đầu tư vào cổ phiếu công nghệ trong Quý 1, có thể được thúc đẩy bởi các báo cáo tài chính tích cực hoặc sự lạc quan về các xu hướng mới như Trí tuệ nhân tạo (AI).
Biến động Mạnh: Ngành công nghệ cho thấy sự biến động rất lớn. Sau đỉnh tháng 3, khối lượng sụt giảm mạnh vào giữa năm (đáy vào tháng 7 và tháng 10). Điều này phản ánh tính chất nhạy cảm của ngành công nghệ với các tin tức về lãi suất, chính sách vĩ mô và tâm lý chung của thị trường.
Dẫn dắt Thị trường: Khi so sánh với khối lượng giao dịch của toàn thị trường Mỹ, có thể thấy ngành công nghệ chiếm một tỷ trọng rất lớn và thường là động lực chính tạo ra các đỉnh và đáy của thị trường chung. Ví dụ, sự phục hồi của thị trường vào tháng 8 cũng được dẫn dắt bởi sự tăng trở lại của khối lượng giao dịch trong ngành công nghệ.
=> Dữ liệu cho thấy năm 2024 là một năm đầy biến động đối với ngành công nghệ Mỹ. Nó vừa là nguồn thu hút dòng tiền lớn nhất khi thị trường lạc quan, vừa là ngành chịu áp lực chốt lời mạnh mẽ khi tâm lý nhà đầu tư trở nên thận trọng.
ggplot(tech_usa_2024_monthly_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu của ngành công nghệ Mỹ.
aes(x = YearMonth,
y = Total_Volume,
fill = YearMonth)) +
geom_bar(stat = "identity") + # Vẽ biểu đồ cột, chiều cao cột lấy trực tiếp từ giá trị của trục Y.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)), # Thêm nhãn số liệu lên trên mỗi cột
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) +
labs( # Thêm tiêu đề và tên cho các trục.
title = "Tổng Khối lượng giao dịch Ngành Technology (USA, 2024)",
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)",
fill = "Tháng"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
retail_usa_2024_monthly_volume <- d %>% # Bắt đầu chuỗi xử lý từ bảng 'd', gán kết quả cho biến mới.
mutate( # Tạo các cột mới để xử lý dữ liệu thời gian.
Date = ymd_hms(Date),
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter( # Lọc dữ liệu với 3 điều kiện đồng thời.
tolower(Country) == "usa",
Year == 2024,
tolower(Industry_Tag) == "retail"
) %>%
group_by(YearMonth) %>%
summarise( # Tóm tắt dữ liệu cho mỗi nhóm (mỗi tháng).
Total_Volume = sum(Volume, na.rm = TRUE),
Industry_Tag = first(Industry_Tag),
.groups = 'drop'
)
print(retail_usa_2024_monthly_volume)
## # A tibble: 12 × 3
## YearMonth Total_Volume Industry_Tag
## <chr> <dbl> <chr>
## 1 2024-01 279069900 retail
## 2 2024-02 237207700 retail
## 3 2024-03 336455500 retail
## 4 2024-04 260210300 retail
## 5 2024-05 286981500 retail
## 6 2024-06 266425593 retail
## 7 2024-07 275380362 retail
## 8 2024-08 343078669 retail
## 9 2024-09 247927535 retail
## 10 2024-10 247933162 retail
## 11 2024-11 427928597 retail
## 12 2024-12 363925569 retail
ggplot(retail_usa_2024_monthly_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu của ngành bán lẻ Mỹ.
aes(x = YearMonth,
y = Total_Volume,
fill = YearMonth)) +
geom_bar(stat = "identity") + # Vẽ biểu đồ cột, chiều cao cột lấy trực tiếp từ giá trị của trục Y.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)),
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) + # Định dạng lại các nhãn số trên trục Y để có dấu phẩy ngăn cách hàng nghìn.
labs(
title = "Tổng Khối lượng giao dịch Ngành BÁN LẺ (Retail, USA, 2024)",
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)",
fill = "Tháng"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
healthcare_usa_2024_monthly_volume <- d %>% # Bắt đầu chuỗi xử lý từ bảng 'd', gán kết quả cho biến mới.
mutate(
Date = ymd_hms(Date), # Tạo các cột mới để xử lý dữ liệu thời gian.
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter( # Lọc dữ liệu với 3 điều kiện đồng thời.
tolower(Country) == "usa",
Year == 2024,
tolower(Industry_Tag) == "healthcare"
) %>%
group_by(YearMonth) %>% # Tóm tắt dữ liệu cho mỗi nhóm (mỗi tháng).
summarise(
Total_Volume = sum(Volume, na.rm = TRUE),
Industry_Tag = first(Industry_Tag),
.groups = 'drop'
)
print(healthcare_usa_2024_monthly_volume)
## # A tibble: 12 × 3
## YearMonth Total_Volume Industry_Tag
## <chr> <dbl> <chr>
## 1 2024-01 138190400 healthcare
## 2 2024-02 158288200 healthcare
## 3 2024-03 140389700 healthcare
## 4 2024-04 175712200 healthcare
## 5 2024-05 174612900 healthcare
## 6 2024-06 146566262 healthcare
## 7 2024-07 173752660 healthcare
## 8 2024-08 177967190 healthcare
## 9 2024-09 124474055 healthcare
## 10 2024-10 146082724 healthcare
## 11 2024-11 191947045 healthcare
## 12 2024-12 221274816 healthcare
Khối lượng giao dịch không tăng vọt vào tháng 11 hay tháng 12 (mùa lễ hội) như ngành bán lẻ. Các tháng có khối lượng cao nhất lại rải rác trong năm, ví dụ như Tháng 4 (175 triệu), Tháng 5 (174 triệu), và Tháng 8 (177 triệu). Điều này khẳng định rằng động lực của ngành healthcare không đến từ chi tiêu của người tiêu dùng theo mùa. Thay vào đó, khối lượng giao dịch của ngành này thường bị ảnh hưởng bởi các yếu tố nội tại và đặc thù của ngành: * Tin tức về thuốc: Công bố kết quả thử nghiệm lâm sàng thành công của một loại thuốc mới. * Phê duyệt của FDA: Việc Cục quản lý Thực phẩm và Dược phẩm Hoa Kỳ cấp phép cho một loại thuốc hoặc thiết bị y tế mới. * Thương vụ M&A: Các vụ mua bán và sáp nhập giữa các công ty dược phẩm, công nghệ sinh học. * Chính sách y tế: Các thay đổi trong luật bảo hiểm y tế, chính sách giá thuốc của chính phủ.
ggplot(healthcare_usa_2024_monthly_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu của ngành healthcare Mỹ
aes(x = YearMonth, # Định nghĩa các trục
y = Total_Volume,
fill = YearMonth)) +
geom_bar(stat = "identity") + # Vẽ biểu đồ cột, chiều cao cột lấy trực tiếp từ giá trị của trục Y.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)), # Thêm nhãn số liệu lên trên mỗi cột.
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) +
labs( # Thêm tiêu đề và tên cho các trục.
title = "Tổng Khối lượng giao dịch Ngành CHĂM SÓC SỨC KHỎE (Healthcare, USA, 2024)",
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)",
fill = "Tháng" # - Đổi tên của phần chú thích (legend) thành "Tháng".
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
monthly_france_2024_volume <- d %>% # Bắt đầu chuỗi xử lý từ bảng 'd', gán kết quả cho biến mới.
mutate( # Tạo các cột mới để xử lý dữ liệu thời gian.
Date = ymd_hms(Date),
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter( # Lọc dữ liệu với 2 điều kiện đồng thời.
Year == 2024,
tolower(Country) == "france"
) %>%
group_by(YearMonth) %>% # Gom nhóm các dòng dữ liệu đã lọc theo từng tháng.
summarise(
Total_Volume = sum(Volume, na.rm = TRUE), # Tính tổng khối lượng ('volume') cho mỗi tháng, bỏ qua giá trị thiếu.
.groups = 'drop'
)
print(monthly_france_2024_volume)
## # A tibble: 12 × 2
## YearMonth Total_Volume
## <chr> <dbl>
## 1 2024-01 5736100
## 2 2024-02 4535000
## 3 2024-03 4607000
## 4 2024-04 4299400
## 5 2024-05 4279300
## 6 2024-06 5239817
## 7 2024-07 12049117
## 8 2024-08 8008934
## 9 2024-09 15502574
## 10 2024-10 15782740
## 11 2024-11 12819859
## 12 2024-12 14366913
Về Xu hướng (Hoàn toàn khác biệt với Mỹ)
Đây là điểm phân tích thú vị nhất. Trong khi thị trường Mỹ sôi động đầu năm và hạ nhiệt cuối năm, thị trường Pháp lại có xu hướng ngược lại.
ggplot(monthly_france_2024_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu từ 'monthly_france_2024_volume'.
aes(x = YearMonth, # Định nghĩa các trục
y = Total_Volume)) +
geom_bar(stat = "identity", fill = "lightblue") + # Vẽ biểu đồ cột (bar chart)
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)), # Thêm nhãn số liệu lên trên mỗi cột.
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) + # Định dạng lại các nhãn số trên trục Y để có dấu phẩy ngăn cách hàng nghìn.
labs(
title = "Tổng Khối lượng giao dịch CỦA PHÁP theo Tháng (Năm 2024)", # <--- CẬP NHẬT TIÊU ĐỀ
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Tùy chỉnh chi tiết giao diện:
# - axis.text.x: Nhắm vào các nhãn trên trục X.
# - angle = 45: Xoay các nhãn 45 độ để không bị chồng chéo.
# - hjust = 1: Căn lề cho các nhãn đã xoay.
gaming_france_2024_monthly_volume <- d %>% # Bắt đầu chuỗi xử lý từ bảng 'd', gán kết quả cho biến mới.
mutate( # Tạo các cột mới để xử lý dữ liệu thời gian.
Date = ymd_hms(Date),
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter( # Lọc dữ liệu với 3 điều kiện đồng thời để lấy đúng phân khúc.
tolower(Country) == "france",
Year == 2024,
tolower(Industry_Tag) == "gaming"
) %>%
group_by(YearMonth) %>%
summarise(
Total_Volume = sum(Volume, na.rm = TRUE), # - Tính tổng khối lượng ('volume') cho mỗi tháng, bỏ qua giá trị thiếu.
Industry_Tag = first(Industry_Tag),
.groups = 'drop' # - Bỏ cấu trúc gom nhóm sau khi tính toán xong.
)
print(gaming_france_2024_monthly_volume)
## # A tibble: 12 × 3
## YearMonth Total_Volume Industry_Tag
## <chr> <dbl> <chr>
## 1 2024-01 565700 gaming
## 2 2024-02 735800 gaming
## 3 2024-03 764500 gaming
## 4 2024-04 525900 gaming
## 5 2024-05 1070400 gaming
## 6 2024-06 400292 gaming
## 7 2024-07 2175283 gaming
## 8 2024-08 727946 gaming
## 9 2024-09 6456248 gaming
## 10 2024-10 7706362 gaming
## 11 2024-11 3808402 gaming
## 12 2024-12 5551588 gaming
ggplot(gaming_france_2024_monthly_volume, # Bắt đầu vẽ biểu đồ, sử dụng dữ liệu của ngành gaming Pháp.
aes(x = YearMonth, # Định nghĩa các trục
y = Total_Volume,
fill = YearMonth)) +
geom_bar(stat = "identity") + # Vẽ biểu đồ cột, chiều cao cột lấy trực tiếp từ giá trị của trục Y.
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)),
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) + # Định dạng lại các nhãn số trên trục Y để có dấu phẩy ngăn cách hàng nghìn.
labs(
title = "Tổng Khối lượng giao dịch Ngành GAMING (France, 2024)",
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)",
fill = "Tháng"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Xoay các nhãn trên trục X 45 độ để không bị chồng chéo.
luxury_france_2024_monthly_volume <- d %>%
mutate(
Date = ymd_hms(Date),
Year = year(Date),
YearMonth = format(Date, "%Y-%m")
) %>%
filter(
tolower(Country) == "france",
Year == 2024,
tolower(Industry_Tag) == "luxury goods"
) %>%
group_by(YearMonth) %>%
summarise(
Total_Volume = sum(Volume, na.rm = TRUE),
Industry_Tag = first(Industry_Tag),
.groups = 'drop'
)
print(luxury_france_2024_monthly_volume)
## # A tibble: 12 × 3
## YearMonth Total_Volume Industry_Tag
## <chr> <dbl> <chr>
## 1 2024-01 5170400 luxury goods
## 2 2024-02 3799200 luxury goods
## 3 2024-03 3842500 luxury goods
## 4 2024-04 3773500 luxury goods
## 5 2024-05 3208900 luxury goods
## 6 2024-06 4839525 luxury goods
## 7 2024-07 9873834 luxury goods
## 8 2024-08 7280988 luxury goods
## 9 2024-09 9046326 luxury goods
## 10 2024-10 8076378 luxury goods
## 11 2024-11 9011457 luxury goods
## 12 2024-12 8815325 luxury goods
ggplot(luxury_france_2024_monthly_volume, # --- Bắt đầu khối lệnh ggplot ---
aes(x = YearMonth,
y = Total_Volume,
fill = YearMonth)) +
geom_bar(stat = "identity") + # --- Các lớp (layers) của biểu đồ ---
geom_text(aes(label = format(Total_Volume, big.mark = ",", scientific = FALSE)),
vjust = -0.5,
size = 4) +
scale_y_continuous(labels = comma) + # 5. Định dạng trục Y
labs(
title = "Tổng Khối lượng giao dịch Ngành HÀNG XA XỈ (Luxury Goods, France, 2024)", # 6. Đặt tên/tiêu đề
x = "Tháng (Year-Month)",
y = "Tổng Khối lượng giao dịch (Total Volume)",
fill = "Tháng"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Giai đoạn đầu năm (Tháng 1 - Tháng 5): Khởi đầu tương đối trầm lắng * Tháng 1 (5,170,400): Khối lượng giao dịch khá cao, có thể do dư âm của mùa mua sắm cuối năm trước (lễ hội, quà tặng) hoặc do làn sóng du khách mua sắm dịp Tết Nguyên Đán từ châu Á. * Tháng 2 - Tháng 5: Giai đoạn này chứng kiến sự sụt giảm và duy trì ở mức thấp (từ 3.2 đến 4 triệu). Đây thường là mùa thấp điểm của du lịch và mua sắm sau các kỳ nghỉ lễ lớn. Sức mua trong nước và quốc tế đều giảm.
yearly_country_volume <- d %>%
mutate(
Date = ymd_hms(Date),
Year = year(Date)
) %>%
group_by(Year, Country) %>%
summarise(
Total_Volume = sum(Volume, na.rm = TRUE),
.groups = 'drop'
) %>%
mutate(Year = as.character(Year))
animated_plot <- ggplot(
yearly_country_volume,
aes(
x = reorder(Country, Total_Volume),
y = Total_Volume,
fill = Country
)
) +
geom_col() +
geom_text(
aes(label = comma(Total_Volume)),
hjust = -0.1,
size = 4
) +
labs(
title = "Khối lượng giao dịch theo Quốc gia",
subtitle = "Năm: {closest_state}",
x = "Quốc gia",
y = "Tổng Khối lượng giao dịch"
) +
coord_flip() +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, size = 16),
legend.position = "none"
) +
scale_y_continuous(labels = comma)
final_animation <- animated_plot +
transition_states(
Year,
transition_length = 2,
state_length = 1
) +
ease_aes("cubic-in-out")
#final_animation
#print(yearly_country_volume)
d2 <- read.csv("C:/Users/CHI LINH/Downloads/dl2_TMT .csv")
library(dplyr)
library(janitor)
library(tidyr)
library(readr)
library(gganimate)
library(gifski)
library(transformr)
## Error: package or namespace load failed for 'transformr' in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]):
## there is no package called 'sf'
library(psych)
library(ggplot2)
library(ggcorrplot)
library(tidyverse)
View(d2)
str(d2)
## 'data.frame': 12 obs. of 23 variables:
## $ Year : int 2024 2023 2022 2021 2020 2019 2018 2017 2016 2016 ...
## $ Chi_tieu : logi NA NA NA NA NA NA ...
## $ TSNH : num 5.08e+12 5.69e+12 3.65e+12 5.50e+12 3.06e+12 ...
## $ CKCV : num 3.50e+12 3.21e+12 2.25e+12 3.37e+12 2.21e+12 ...
## $ TSTC : num 5.07e+12 5.68e+12 3.65e+12 5.50e+12 3.06e+12 ...
## $ TSTC_thong.qua.lai.lo: num 4.17e+11 7.33e+11 4.01e+11 7.38e+11 5.37e+11 ...
## $ TSDH : num 5.48e+11 3.25e+10 2.06e+11 2.17e+11 3.56e+11 ...
## $ TTS : num 5.63e+12 6.01e+12 3.86e+12 2.12e+10 3.41e+12 ...
## $ NPT : num 3.15e+12 3.70e+12 1.68e+12 3.57e+12 1.54e+12 ...
## $ VCSH : num 2.48e+12 2.31e+12 2.18e+12 2.14e+12 1.87e+12 ...
## $ LNCPP : num 8.10e+11 7.17e+11 6.71e+11 5.61e+10 3.99e+11 ...
## $ DT_hoat_dong : num 1.15e+11 1.12e+11 1.12e+11 1.10e+12 5.68e+11 ...
## $ CP_hoat_dong : num 9.91e+11 -7.09e+11 -6.99e+11 -6.24e+11 -3.18e+11 ...
## $ CP_du_phong : num -8.59e+10 -4.99e+09 -9.90e+09 4.12e+11 -7.88e+09 ...
## $ CP_tu.van_TC : num -9.08e+09 -1.03e+10 -1.48e+10 -1.40e+10 -1.63e+10 ...
## $ CPLV : num -1.35e+11 -1.23e+11 -1.35e+11 -1.09e+11 -3.27e+10 ...
## $ TNK_va_CPK : num -1.46e+04 -1.24e+04 -9.00e+09 -5.69e+08 -4.16e+07 ...
## $ LN_chua_thuc_hien : num -6.50e+09 4.29e+10 -7.73e+10 6.01e+10 2.99e+10 ...
## $ CPTTNDN : num -4.10e+10 -3.95e+10 -3.41e+10 -6.81e+10 -2.20e+10 ...
## $ LNSTTNDN : num 2.00e+11 1.96e+11 1.47e+11 2.83e+11 1.32e+11 ...
## $ CPTTNDN.hien.hanh : num -4.10e+10 -3.46e+10 -4.46e+10 -5.88e+10 -1.94e+10 ...
## $ TNTTNDN.hoan.lai : num 3.29e+07 -4.86e+09 1.05e+10 -9.32e+09 -2.51e+09 ...
## $ PTK : num 1.30e+10 1.29e+10 1.30e+10 1.30e+10 1.80e+10 ...
# câu lệnh str(ten_doi_tuong) dùng để hiển thị cấu trúc nội bộ của một đối tượng.
từ kết quả trên ta có thể dễ dàng nắm bắt được một số thông tin như bộ dữ liệu này có 11 quan sát (năm) và có 23 biến , đồng thời ta cũng có thể dễ hàng nắm được kiểu dữ liệu của từng biến
year: Năm ghi nhận dữ liệu tsnh: Tài sản ngắn hạn ckcv: Chứng khoán kinh doanh và các khoản đầu tư nắm giữ đến ngày đáo hạn tstc: Tài sản tài chính tstc_thong_qua_lai_lo: Tài sản tài chính thông qua lãi/lỗ tsdh: Tài sản dài hạn tts: Tổng tài sản npt: Nợ phải trả vcsh: Vốn chủ sở hữu lncpp: Lợi nhuận chưa phân phối dt_hoat_dong: Doanh thu hoạt động cp_hoat_dong: Chi phí hoạt động cp_du_phong: Chi phí dự phòng cp_tu_van_tc: Chi phí tư vấn tài chính cplv: Chi phí lãi vay tnk_va_cpk: Thu nhập khác và chi phí khác ln_chua_thuc_hien: Lợi nhuận chưa thực hiện cpttndn: Chi phí thuế thu nhập doanh nghiệp lnsttndn: Lợi nhuận sau thuế thu nhập doanh nghiệp cpttndn_hien_hanh: Chi phí thuế thu nhập doanh nghiệp hiện hành tnttndn_hoan_lai: Thu nhập/chi phí thuế thu nhập doanh nghiệp hoãn lại ptk: Các khoản phải thu
summary(d2)
## Year Chi_tieu TSNH CKCV
## Min. :2014 Mode:logical Min. :1.363e+12 Min. :4.974e+09
## 1st Qu.:2016 NA's:12 1st Qu.:1.580e+12 1st Qu.:7.359e+11
## Median :2018 Median :2.382e+12 Median :1.599e+12
## Mean :2019 Mean :2.937e+12 Mean :1.745e+12
## 3rd Qu.:2021 3rd Qu.:4.009e+12 3rd Qu.:2.493e+12
## Max. :2024 Max. :5.688e+12 Max. :3.504e+12
##
## TSTC TSTC_thong.qua.lai.lo TSDH
## Min. :7.106e+11 Min. :1.138e+11 Min. :1.915e+09
## 1st Qu.:1.378e+12 1st Qu.:1.752e+11 1st Qu.:1.995e+11
## Median :2.379e+12 Median :4.088e+11 Median :3.192e+11
## Mean :2.856e+12 Mean :3.939e+11 Mean :3.079e+11
## 3rd Qu.:4.005e+12 3rd Qu.:5.684e+11 3rd Qu.:4.726e+11
## Max. :5.685e+12 Max. :7.379e+11 Max. :5.477e+11
##
## TTS NPT VCSH
## Min. :-2.280e+08 Min. :1.432e+10 Min. :1.341e+12
## 1st Qu.: 1.827e+12 1st Qu.:3.120e+11 1st Qu.:1.568e+12
## Median : 2.298e+12 Median :9.131e+11 Median :1.752e+12
## Mean : 2.657e+12 Mean :1.402e+12 Mean :1.843e+12
## 3rd Qu.: 3.524e+12 3rd Qu.:2.046e+12 3rd Qu.:2.154e+12
## Max. : 6.014e+12 Max. :3.699e+12 Max. :2.475e+12
##
## LNCPP DT_hoat_dong CP_hoat_dong
## Min. :-1.430e+10 Min. :1.119e+11 Min. :-7.088e+11
## 1st Qu.: 1.520e+11 1st Qu.:2.355e+11 1st Qu.:-4.729e+11
## Median : 2.731e+11 Median :2.963e+11 Median :-2.847e+11
## Mean : 3.313e+11 Mean :3.894e+11 Mean :-2.196e+11
## 3rd Qu.: 4.671e+11 3rd Qu.:5.275e+11 3rd Qu.:-1.026e+11
## Max. : 8.097e+11 Max. :1.096e+12 Max. : 9.906e+11
## NA's :1
## CP_du_phong CP_tu.van_TC CPLV
## Min. :-8.593e+10 Min. :-1.633e+10 Min. :-1.349e+11
## 1st Qu.:-6.501e+09 1st Qu.:-1.417e+10 1st Qu.:-1.123e+11
## Median : 1.670e+03 Median :-1.256e+10 Median :-3.018e+10
## Mean : 2.992e+10 Mean :-1.227e+10 Mean :-5.189e+10
## 3rd Qu.: 1.518e+10 3rd Qu.:-1.051e+10 3rd Qu.:-6.679e+09
## Max. : 4.124e+11 Max. :-8.908e+09 Max. : 5.519e+09
##
## TNK_va_CPK LN_chua_thuc_hien CPTTNDN
## Min. :-8.995e+09 Min. :-7.726e+10 Min. :-6.808e+10
## 1st Qu.:-7.602e+08 1st Qu.: 4.277e+09 1st Qu.:-3.546e+10
## Median :-1.945e+08 Median : 1.505e+10 Median :-2.045e+10
## Mean :-1.002e+09 Mean : 3.762e+10 Mean : 1.612e+10
## 3rd Qu.:-1.401e+04 3rd Qu.: 4.120e+10 3rd Qu.:-1.711e+10
## Max. : 2.693e+08 Max. : 3.423e+11 Max. : 4.567e+11
##
## LNSTTNDN CPTTNDN.hien.hanh TNTTNDN.hoan.lai
## Min. :8.693e+10 Min. :-5.876e+10 Min. :-9.320e+09
## 1st Qu.:1.017e+11 1st Qu.:-3.623e+10 1st Qu.:-3.089e+09
## Median :1.274e+11 Median :-2.044e+10 Median :-2.117e+09
## Mean :1.421e+11 Mean : 2.624e+10 Mean :-1.388e+09
## 3rd Qu.:1.591e+11 3rd Qu.:-1.703e+10 3rd Qu.:-2.104e+08
## Max. :2.829e+11 Max. : 5.712e+11 Max. : 1.045e+10
##
## PTK
## Min. :1.162e+10
## 1st Qu.:1.303e+10
## Median :1.555e+10
## Mean :1.649e+11
## 3rd Qu.:2.069e+10
## Max. :1.793e+12
##
# Câu lệnh summary(ten_doi_tuong) có tác dụng chính là cung cấp một cái nhìn tổng quan nhanh chóng và đầy đủ về các thống kê mô tả cơ bản của toàn bộ các biến (cột) trong dataframe
câu lệnh này cho chúng ta thấy ở biến tsnh (Tài sản ngắn hạn) dao động từ khoảng 1.363 nghìn tỷ đến 5.688 nghìn tỷ, hay giá trị trung bình là 2.937 nghìn tỷ ## 1.4.Xem tên cột
names(d2)
## [1] "Year" "Chi_tieu" "TSNH"
## [4] "CKCV" "TSTC" "TSTC_thong.qua.lai.lo"
## [7] "TSDH" "TTS" "NPT"
## [10] "VCSH" "LNCPP" "DT_hoat_dong"
## [13] "CP_hoat_dong" "CP_du_phong" "CP_tu.van_TC"
## [16] "CPLV" "TNK_va_CPK" "LN_chua_thuc_hien"
## [19] "CPTTNDN" "LNSTTNDN" "CPTTNDN.hien.hanh"
## [22] "TNTTNDN.hoan.lai" "PTK"
d2[startsWith(names(d2), "T")]
## TSNH TSTC TSTC_thong.qua.lai.lo TSDH TTS
## 1 5.08099e+12 5.07465e+12 4.16564e+11 547665000000 5628660000000
## 2 5.68830e+12 5.68492e+12 7.32923e+11 32536688939 6013660000000
## 3 3.65201e+12 3.64781e+12 4.00962e+11 205640000000 3857650000000
## 4 5.50263e+12 5.49508e+12 7.37876e+11 216666000000 21178821110
## 5 3.05748e+12 3.05509e+12 5.37049e+11 355511000000 3412990000000
## 6 2.21677e+12 2.21375e+12 4.21328e+11 181087000000 2397850000000
## 7 2.54708e+12 2.54493e+12 2.52426e+11 380084000000 2927160000000
## 8 1.74090e+12 1.73958e+12 1.81752e+11 458059000000 2198950000000
## 9 1.36324e+12 1.35994e+12 1.13823e+11 516423000000 1879660000000
## 10 1.36324e+12 1.35994e+12 1.13823e+11 516423000000 1879660000000
## 11 1.38495e+12 1.38342e+12 1.55616e+11 282873000000 1667830000000
## 12 1.64493e+12 7.10556e+11 6.62321e+11 1914652686 -228000000
## TNK_va_CPK TNTTNDN.hoan.lai
## 1 -14565 32874269
## 2 -12363 -4862215320
## 3 -8995173322 10454121395
## 4 -568757899 -9319929593
## 5 -41604882 -2512287910
## 6 -129341812 -291492977
## 7 -259757299 2490041825
## 8 -784070570 -2559202145
## 9 -760208708 -1721218538
## 10 -760208708 -1721218538
## 11 0 -2855073122
## 12 269310811 -3788915187
# names(d2): Lấy ra một vector chứa tất cả các tên cột của dataframe d2
# startsWith(names(d2), "T") kiểm tra xem các tên cột trong d2 có bắt đầu bằng chữ "T" hay không, trả về vector TRUE/FALSE.
# d2[...] (với vector logic ở vị trí cột) sẽ chọn các cột trong dataframe d2 có giá trị TRUE tương ứng trong vector logic đó.
d2[1:3, ]
## Year Chi_tieu TSNH CKCV TSTC TSTC_thong.qua.lai.lo
## 1 2024 NA 5.08099e+12 3.50374e+12 5.07465e+12 4.16564e+11
## 2 2023 NA 5.68830e+12 3.20923e+12 5.68492e+12 7.32923e+11
## 3 2022 NA 3.65201e+12 2.25480e+12 3.64781e+12 4.00962e+11
## TSDH TTS NPT VCSH LNCPP DT_hoat_dong
## 1 547665000000 5.62866e+12 3.15329e+12 2.47537e+12 8.09703e+11 1.14658e+11
## 2 32536688939 6.01366e+12 3.69889e+12 2.31478e+12 7.17444e+11 1.12357e+11
## 3 205640000000 3.85765e+12 1.67671e+12 2.18094e+12 6.70849e+11 1.11876e+11
## CP_hoat_dong CP_du_phong CP_tu.van_TC CPLV TNK_va_CPK
## 1 9.90556e+11 -85929246886 -9079808738 -1.34927e+11 -14565
## 2 -7.08765e+11 -4988971823 -10349920976 -1.23351e+11 -12363
## 3 -6.98765e+11 -9903307217 -14795922712 -1.34708e+11 -8995173322
## LN_chua_thuc_hien CPTTNDN LNSTTNDN CPTTNDN.hien.hanh TNTTNDN.hoan.lai
## 1 -6503891935 -40975728123 1.99954e+11 -41008602392 32874269
## 2 42948603988 -39501123275 1.95723e+11 -34638907955 -4862215320
## 3 -77257229402 -34115869042 1.46888e+11 -44569990437 10454121395
## PTK
## 1 13048922259
## 2 12926987489
## 3 13045316061
d2$TSNH
## [1] 5.08099e+12 5.68830e+12 3.65201e+12 5.50263e+12 3.05748e+12 2.21677e+12
## [7] 2.54708e+12 1.74090e+12 1.36324e+12 1.36324e+12 1.38495e+12 1.64493e+12
# sử dụng toán tử $ để truy cập một cột của dataframe
colSums(is.na(d2))
## Year Chi_tieu TSNH
## 0 12 0
## CKCV TSTC TSTC_thong.qua.lai.lo
## 0 0 0
## TSDH TTS NPT
## 0 0 0
## VCSH LNCPP DT_hoat_dong
## 0 0 0
## CP_hoat_dong CP_du_phong CP_tu.van_TC
## 1 0 0
## CPLV TNK_va_CPK LN_chua_thuc_hien
## 0 0 0
## CPTTNDN LNSTTNDN CPTTNDN.hien.hanh
## 0 0 0
## TNTTNDN.hoan.lai PTK
## 0 0
# is.na(d2):Hàm này kiểm tra từng phần tử trong dataframe d2 xem có phải là giá trị thiếu (NA) hay không.Nó trả về một dataframe mới có cùng kích thước với d2, nhưng thay vì các giá trị gốc, nó chứa TRUE ở những vị trí có NA và FALSE ở những vị trí không có NA.
# colSums(...):Hàm này tính tổng các giá trị trong mỗi cột của ma trận hoặc dataframe được truyền vào.Khi áp dụng cho dataframe TRUE/FALSE từ is.na(d2), R coi TRUE là 1 và FALSE là 0.
từ kết quả cúng ta thấy cột Chi_tieu có 12 giá trị NA và cột CP_hoat_dong có 1 giá trị NA.
so_trung_lap_d2 <- sum(duplicated(d2))
# duplicated(d2) xác định các hàng trùng lặp trong dataframe d2. Nó trả về TRUE cho những hàng nào trùng lặp , và FALSE cho các hàng duy nhất
show(so_trung_lap_d2)
## [1] 1
kết quả hiện về cho biết có hàng bị trùng lặp hoàn toàn
d2 <- clean_names(d2)
# clean_names() chuẩn hóa tên cột với các thao tác (Chuyển sang chữ thường, thay thế khoảng trắng/ký tự đặc biệt bằng dấu gạch dưới, loại bỏ ký tự không hợp lệ, xử lý tên trùng lặp bằng cách thêm số.)
d2 <- unique(d2)
# unique(d2):Hàm này nhận vào dataframe d2. Nếu một hàng hoàn toàn giống với một hàng khác đã được thấy trước đó, nó sẽ bị bỏ qua.
d2 <- d2 %>% select(-chi_tieu)
#%>% (toán tử Pipeline) Nó truyền kết quả từ vế trái sang làm đầu vào (thường là dữ liệu) cho hàm ở vế phải.
#select() là một hàm từ package dplyr dùng để chọn hoặc bỏ chọn các cột.
Tb <- d2 %>%
filter(year %in% c(2015, 2016)) %>%
# filter(year %in% c(2015, 2016)): Lọc dataframe d2 để chỉ giữ lại các hàng mà cột year có giá trị là 2015 hoặc 2016.
summarise(tb = mean(cp_hoat_dong, na.rm = TRUE))
# Từ dataframe đã lọc, tạo một tóm tắt mới.
Tb <- Tb$tb
d2 <- d2 %>%
mutate(cp_hoat_dong = if_else(is.na(cp_hoat_dong), Tb , cp_hoat_dong))
# mutate(...): Hàm này dùng để tạo cột mới hoặc thay đổi các cột hiện có.
##2.5.Phân tổ Tài sản, Nguồn vốn, Doanh thu & Chi phí, Lợi nhuận
assets_cols <- c("year", "tsnh", "ckcv", "tstc", "tstc_thong_qua_lai_lo", "tsdh") # tạo 1 vector mới với các biến
capital_cols <- c("year", "tts", "npt", "vcsh")
revenue_expenses_cols <- c("year", "dt_hoat_dong", "cp_hoat_dong", "cp_du_phong",
"cp_tu_van_tc", "cplv", "tnk_va_cpk")
profit_cols <- c("year", "lncpp", "ln_chua_thuc_hien", "cpttndn",
"lnsttndn", "cpttndn_hien_hanh", "tnttndn_hoan_lai")
# Tài sản (Assets)
df_assets_analysis <- d2 %>%
select(all_of(assets_cols)) %>% # select(all_of(vector_ten_cot)) : Chọn các cột có tên nằm trong vector_ten_cot
rowwise() %>% # rowwise() chuyển đổi dataframe để các phép tính tiếp theo sẽ được thực hiện trên từng hàng một cách độc lập.
mutate(total_assets = sum(c_across(tsnh:tsdh), na.rm = TRUE)) %>% # chọn các cột từ tsnh đến tsdh trong ngữ cảnh rowwise để tính tổng. na.rm = TRUE loại bỏ NA khi tính tổng.
ungroup() %>% # ungroup(): Rất quan trọng để trả dataframe về trạng thái bình thường
select(year, total_assets, tsnh, tsdh, ckcv) # sắp xếp
print("--- 1. PHÂN TỔ: TÀI SẢN (ASSETS) ---")
## [1] "--- 1. PHÂN TỔ: TÀI SẢN (ASSETS) ---"
print(df_assets_analysis)
## # A tibble: 11 × 5
## year total_assets tsnh tsdh ckcv
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 2024 1.46e13 5080990000000 547665000000 3503740000000
## 2 2023 1.53e13 5688300000000 32536688939 3209230000000
## 3 2022 1.02e13 3652010000000 205640000000 2254800000000
## 4 2021 1.53e13 5502630000000 216666000000 3374600000000
## 5 2020 9.21e12 3057480000000 355511000000 2205550000000
## 6 2019 6.55e12 2216770000000 181087000000 1514330000000
## 7 2018 7.41e12 2547080000000 380084000000 1682730000000
## 8 2017 5.24e12 1740900000000 458059000000 1116590000000
## 9 2016 4.09e12 1363240000000 516423000000 735873000000
## 10 2015 3.81e12 1384950000000 282873000000 604420000000
## 11 2014 3.02e12 1644930000000 1914652686 4973549015
cat("\n") # print() và cat("\n"): Dùng để in kết quả ra màn hình với các tiêu đề rõ ràng và thêm dòng trống cho dễ đọc.
# Nguồn vốn (Capital)
df_capital_analysis <- d2 %>%
select(all_of(capital_cols)) %>%
mutate(
debt_to_equity_ratio = npt / vcsh,
debt_to_asset_ratio = npt / tts
) %>%
mutate(across(c(debt_to_equity_ratio, debt_to_asset_ratio),
~replace(., is.nan(.) | is.infinite(.), 0)))
print("--- 2. PHÂN TỔ: NGUỒN VỐN (CAPITAL) ---")
## [1] "--- 2. PHÂN TỔ: NGUỒN VỐN (CAPITAL) ---"
print(df_capital_analysis)
## year tts npt vcsh debt_to_equity_ratio
## 1 2024 5628660000000 3.153290e+12 2.47537e+12 1.27386613
## 2 2023 6013660000000 3.698890e+12 2.31478e+12 1.59794451
## 3 2022 3857650000000 1.676710e+12 2.18094e+12 0.76880153
## 4 2021 21178821110 3.574850e+12 2.14445e+12 1.66702418
## 5 2020 3412990000000 1.538250e+12 1.87474e+12 0.82051378
## 6 2019 2397850000000 5.912200e+11 1.80663e+12 0.32725018
## 7 2018 2927160000000 1.235010e+12 1.69215e+12 0.72984664
## 8 2017 2198950000000 5.008510e+11 1.69810e+12 0.29494788
## 9 2016 1879660000000 3.119740e+11 1.56768e+12 0.19900362
## 11 2015 1667830000000 2.170870e+11 1.45074e+12 0.14963881
## 12 2014 -228000000 1.432218e+10 1.34121e+12 0.01067855
## debt_to_asset_ratio
## 1 0.5602204
## 2 0.6150813
## 3 0.4346454
## 4 168.7936255
## 5 0.4507045
## 6 0.2465625
## 7 0.4219141
## 8 0.2277683
## 9 0.1659736
## 11 0.1301613
## 12 -62.8165750
cat("\n")
# Doanh thu & Chi phí (Revenue & Expenses)
df_revenue_expenses_analysis <- d2 %>%
select(all_of(revenue_expenses_cols)) %>%
mutate(
gross_operating_profit = dt_hoat_dong - cp_hoat_dong
)
print("--- 3. PHÂN TỔ: DOANH THU & CHI PHÍ ---")
## [1] "--- 3. PHÂN TỔ: DOANH THU & CHI PHÍ ---"
print(df_revenue_expenses_analysis)
## year dt_hoat_dong cp_hoat_dong cp_du_phong cp_tu_van_tc cplv
## 1 2024 1.14658e+11 990556000000 -85929246886 -9079808738 -134927000000
## 2 2023 1.12357e+11 -708765000000 -4988971823 -10349920976 -123351000000
## 3 2022 1.11876e+11 -698765000000 -9903307217 -14795922712 -134708000000
## 4 2021 1.09612e+12 -623633000000 412353000000 -13957589769 -108585000000
## 5 2020 5.68060e+11 -318404000000 -7877940311 -16325549109 -32741145600
## 6 2019 5.41264e+11 -284703000000 12674194138 -12491091723 -39502779067
## 7 2018 5.22954e+11 -322133000000 3268735583 -8908412506 -27617501931
## 8 2017 4.62044e+11 -240483000000 -6041989254 -12631941177 -8407790912
## 9 2016 2.75739e+11 -102566000000 22714561240 -10569303357 -6678986795
## 11 2015 2.87179e+11 -4219443989 1608 -12723403357 -4950182678
## 12 2014 3.05344e+11 -53392721995 1732 -14877503357 5519074890
## tnk_va_cpk gross_operating_profit
## 1 -14565 -875898000000
## 2 -12363 821122000000
## 3 -8995173322 810641000000
## 4 -568757899 1719753000000
## 5 -41604882 886464000000
## 6 -129341812 825967000000
## 7 -259757299 845087000000
## 8 -784070570 702527000000
## 9 -760208708 378305000000
## 11 0 291398443989
## 12 269310811 358736721995
cat("\n")
# Lợi nhuận (Profit)
df_profit_analysis <- d2 %>%
select(all_of(profit_cols)) %>%
mutate(net_profit_margin = ifelse(d2$dt_hoat_dong != 0, lnsttndn / d2$dt_hoat_dong, 0))
print("--- 4. PHÂN TỔ: LỢI NHUẬN (PROFIT) ---")
## [1] "--- 4. PHÂN TỔ: LỢI NHUẬN (PROFIT) ---"
print(df_profit_analysis)
## year lncpp ln_chua_thuc_hien cpttndn lnsttndn
## 1 2024 809703000000 -6503891935 -40975728123 199954000000
## 2 2023 717444000000 42948603988 -39501123275 195723000000
## 3 2022 670849000000 -77257229402 -34115869042 146888000000
## 4 2021 56105947847 60062585261 -68083633071 282944000000
## 5 2020 399208000000 29863036428 -21952112634 132380000000
## 6 2019 358608000000 7871036467 -15653003473 135510000000
## 7 2018 264666000000 -30609961068 -18948177341 103532000000
## 8 2017 281475000000 12123537099 -29978875208 122445000000
## 9 2016 175811000000 15051652282 -17591785884 101714000000
## 11 2015 80757887200 40616169573 41094135434 95181923519
## 12 2014 -14295659417 342266000000 456712000000 86934648811
## cpttndn_hien_hanh tnttndn_hoan_lai net_profit_margin
## 1 -41008602392 32874269 1.7439167
## 2 -34638907955 -4862215320 1.7419742
## 3 -44569990437 10454121395 1.3129536
## 4 -58763703478 -9319929593 0.2581323
## 5 -19439824724 -2512287910 0.2330388
## 6 -15361510496 -291492977 0.2503584
## 7 -21438219166 2490041825 0.1979753
## 8 -27419673063 -2559202145 0.2650072
## 9 -17591785884 -1721218538 0.3688778
## 11 41572101296 -2855073122 0.3314376
## 12 571158000000 -3788915187 0.2847105
cat("\n")
nguong_doanh_thu <- 400000000000 # Tạo một biến số để lưu giá trị ngưỡng (400 tỷ).
df_phan_to_doanh_thu <- d2 %>%
mutate(
doanh_thu_to = ifelse(dt_hoat_dong > nguong_doanh_thu, "To A", "To B") # mutate(): Tạo một cột mới hoặc sửa đổi cột hiện có.
) %>%
select(year, dt_hoat_dong, doanh_thu_to, everything()) %>% #sắp xếp cột
arrange(doanh_thu_to, desc(dt_hoat_dong)) # sắp xếp hàng
print(df_phan_to_doanh_thu)
## year dt_hoat_dong doanh_thu_to tsnh ckcv tstc
## 1 2021 1.09612e+12 To A 5.50263e+12 3.374600e+12 5.49508e+12
## 2 2020 5.68060e+11 To A 3.05748e+12 2.205550e+12 3.05509e+12
## 3 2019 5.41264e+11 To A 2.21677e+12 1.514330e+12 2.21375e+12
## 4 2018 5.22954e+11 To A 2.54708e+12 1.682730e+12 2.54493e+12
## 5 2017 4.62044e+11 To A 1.74090e+12 1.116590e+12 1.73958e+12
## 6 2014 3.05344e+11 To B 1.64493e+12 4.973549e+09 7.10556e+11
## 7 2015 2.87179e+11 To B 1.38495e+12 6.044200e+11 1.38342e+12
## 8 2016 2.75739e+11 To B 1.36324e+12 7.358730e+11 1.35994e+12
## 9 2024 1.14658e+11 To B 5.08099e+12 3.503740e+12 5.07465e+12
## 10 2023 1.12357e+11 To B 5.68830e+12 3.209230e+12 5.68492e+12
## 11 2022 1.11876e+11 To B 3.65201e+12 2.254800e+12 3.64781e+12
## tstc_thong_qua_lai_lo tsdh tts npt vcsh
## 1 7.37876e+11 216666000000 21178821110 3.574850e+12 2.14445e+12
## 2 5.37049e+11 355511000000 3412990000000 1.538250e+12 1.87474e+12
## 3 4.21328e+11 181087000000 2397850000000 5.912200e+11 1.80663e+12
## 4 2.52426e+11 380084000000 2927160000000 1.235010e+12 1.69215e+12
## 5 1.81752e+11 458059000000 2198950000000 5.008510e+11 1.69810e+12
## 6 6.62321e+11 1914652686 -228000000 1.432218e+10 1.34121e+12
## 7 1.55616e+11 282873000000 1667830000000 2.170870e+11 1.45074e+12
## 8 1.13823e+11 516423000000 1879660000000 3.119740e+11 1.56768e+12
## 9 4.16564e+11 547665000000 5628660000000 3.153290e+12 2.47537e+12
## 10 7.32923e+11 32536688939 6013660000000 3.698890e+12 2.31478e+12
## 11 4.00962e+11 205640000000 3857650000000 1.676710e+12 2.18094e+12
## lncpp cp_hoat_dong cp_du_phong cp_tu_van_tc cplv
## 1 56105947847 -623633000000 412353000000 -13957589769 -108585000000
## 2 399208000000 -318404000000 -7877940311 -16325549109 -32741145600
## 3 358608000000 -284703000000 12674194138 -12491091723 -39502779067
## 4 264666000000 -322133000000 3268735583 -8908412506 -27617501931
## 5 281475000000 -240483000000 -6041989254 -12631941177 -8407790912
## 6 -14295659417 -53392721995 1732 -14877503357 5519074890
## 7 80757887200 -4219443989 1608 -12723403357 -4950182678
## 8 175811000000 -102566000000 22714561240 -10569303357 -6678986795
## 9 809703000000 990556000000 -85929246886 -9079808738 -134927000000
## 10 717444000000 -708765000000 -4988971823 -10349920976 -123351000000
## 11 670849000000 -698765000000 -9903307217 -14795922712 -134708000000
## tnk_va_cpk ln_chua_thuc_hien cpttndn lnsttndn cpttndn_hien_hanh
## 1 -568757899 60062585261 -68083633071 282944000000 -58763703478
## 2 -41604882 29863036428 -21952112634 132380000000 -19439824724
## 3 -129341812 7871036467 -15653003473 135510000000 -15361510496
## 4 -259757299 -30609961068 -18948177341 103532000000 -21438219166
## 5 -784070570 12123537099 -29978875208 122445000000 -27419673063
## 6 269310811 342266000000 456712000000 86934648811 571158000000
## 7 0 40616169573 41094135434 95181923519 41572101296
## 8 -760208708 15051652282 -17591785884 101714000000 -17591785884
## 9 -14565 -6503891935 -40975728123 199954000000 -41008602392
## 10 -12363 42948603988 -39501123275 195723000000 -34638907955
## 11 -8995173322 -77257229402 -34115869042 146888000000 -44569990437
## tnttndn_hoan_lai ptk
## 1 -9319929593 1.296750e+10
## 2 -2512287910 1.797412e+10
## 3 -291492977 2.727187e+10
## 4 2490041825 1.161584e+10
## 5 -2559202145 2.746264e+10
## 6 -3788915187 1.792690e+12
## 7 -2855073122 1.312976e+10
## 8 -1721218538 1.849085e+10
## 9 32874269 1.304892e+10
## 10 -4862215320 1.292699e+10
## 11 10454121395 1.304532e+10
nguong_tsnh <- 3000000000000 # Tạo một biến số để lưu giá trị ngưỡng (3,000 tỷ)
df_phan_to_tsnh <- d2 %>%
mutate(
tsnh_to = ifelse(tsnh > nguong_tsnh, "To A", "To B") # mutate(): Tạo một cột mới hoặc sửa đổi cột hiện có.
) %>%
select(year, tsnh, tsnh_to, everything()) %>% #sắp xếp cột
arrange(tsnh_to, desc(tsnh)) # sắp xếp hàng
print(df_phan_to_tsnh)
## year tsnh tsnh_to ckcv tstc tstc_thong_qua_lai_lo
## 1 2023 5.68830e+12 To A 3.209230e+12 5.68492e+12 7.32923e+11
## 2 2021 5.50263e+12 To A 3.374600e+12 5.49508e+12 7.37876e+11
## 3 2024 5.08099e+12 To A 3.503740e+12 5.07465e+12 4.16564e+11
## 4 2022 3.65201e+12 To A 2.254800e+12 3.64781e+12 4.00962e+11
## 5 2020 3.05748e+12 To A 2.205550e+12 3.05509e+12 5.37049e+11
## 6 2018 2.54708e+12 To B 1.682730e+12 2.54493e+12 2.52426e+11
## 7 2019 2.21677e+12 To B 1.514330e+12 2.21375e+12 4.21328e+11
## 8 2017 1.74090e+12 To B 1.116590e+12 1.73958e+12 1.81752e+11
## 9 2014 1.64493e+12 To B 4.973549e+09 7.10556e+11 6.62321e+11
## 10 2015 1.38495e+12 To B 6.044200e+11 1.38342e+12 1.55616e+11
## 11 2016 1.36324e+12 To B 7.358730e+11 1.35994e+12 1.13823e+11
## tsdh tts npt vcsh lncpp
## 1 32536688939 6013660000000 3.698890e+12 2.31478e+12 717444000000
## 2 216666000000 21178821110 3.574850e+12 2.14445e+12 56105947847
## 3 547665000000 5628660000000 3.153290e+12 2.47537e+12 809703000000
## 4 205640000000 3857650000000 1.676710e+12 2.18094e+12 670849000000
## 5 355511000000 3412990000000 1.538250e+12 1.87474e+12 399208000000
## 6 380084000000 2927160000000 1.235010e+12 1.69215e+12 264666000000
## 7 181087000000 2397850000000 5.912200e+11 1.80663e+12 358608000000
## 8 458059000000 2198950000000 5.008510e+11 1.69810e+12 281475000000
## 9 1914652686 -228000000 1.432218e+10 1.34121e+12 -14295659417
## 10 282873000000 1667830000000 2.170870e+11 1.45074e+12 80757887200
## 11 516423000000 1879660000000 3.119740e+11 1.56768e+12 175811000000
## dt_hoat_dong cp_hoat_dong cp_du_phong cp_tu_van_tc cplv
## 1 1.12357e+11 -708765000000 -4988971823 -10349920976 -123351000000
## 2 1.09612e+12 -623633000000 412353000000 -13957589769 -108585000000
## 3 1.14658e+11 990556000000 -85929246886 -9079808738 -134927000000
## 4 1.11876e+11 -698765000000 -9903307217 -14795922712 -134708000000
## 5 5.68060e+11 -318404000000 -7877940311 -16325549109 -32741145600
## 6 5.22954e+11 -322133000000 3268735583 -8908412506 -27617501931
## 7 5.41264e+11 -284703000000 12674194138 -12491091723 -39502779067
## 8 4.62044e+11 -240483000000 -6041989254 -12631941177 -8407790912
## 9 3.05344e+11 -53392721995 1732 -14877503357 5519074890
## 10 2.87179e+11 -4219443989 1608 -12723403357 -4950182678
## 11 2.75739e+11 -102566000000 22714561240 -10569303357 -6678986795
## tnk_va_cpk ln_chua_thuc_hien cpttndn lnsttndn cpttndn_hien_hanh
## 1 -12363 42948603988 -39501123275 195723000000 -34638907955
## 2 -568757899 60062585261 -68083633071 282944000000 -58763703478
## 3 -14565 -6503891935 -40975728123 199954000000 -41008602392
## 4 -8995173322 -77257229402 -34115869042 146888000000 -44569990437
## 5 -41604882 29863036428 -21952112634 132380000000 -19439824724
## 6 -259757299 -30609961068 -18948177341 103532000000 -21438219166
## 7 -129341812 7871036467 -15653003473 135510000000 -15361510496
## 8 -784070570 12123537099 -29978875208 122445000000 -27419673063
## 9 269310811 342266000000 456712000000 86934648811 571158000000
## 10 0 40616169573 41094135434 95181923519 41572101296
## 11 -760208708 15051652282 -17591785884 101714000000 -17591785884
## tnttndn_hoan_lai ptk
## 1 -4862215320 1.292699e+10
## 2 -9319929593 1.296750e+10
## 3 32874269 1.304892e+10
## 4 10454121395 1.304532e+10
## 5 -2512287910 1.797412e+10
## 6 2490041825 1.161584e+10
## 7 -291492977 2.727187e+10
## 8 -2559202145 2.746264e+10
## 9 -3788915187 1.792690e+12
## 10 -2855073122 1.312976e+10
## 11 -1721218538 1.849085e+10
d3 <- d2 %>%
mutate(
# Lagged values for growth rate calculations
dt_hoat_dong_prev = lag(dt_hoat_dong, n = 1, order_by = year), # mutate(): Tạo một cột mới hoặc sửa đổi cột hiện có.
lnsttndn_prev = lag(lnsttndn, n = 1, order_by = year),
# Hàm lag() lấy giá trị của cột dt_hoat_dong từ hàng trước đó ( sau khi sắp xếp theo year. n=1 nghĩa là lấy giá trị của 1 hàng phía trước.
# Tốc độ tăng trưởng doanh thu (Revenue Growth Rate)
Revenue_Growth_Rate = ifelse(dt_hoat_dong_prev != 0, (dt_hoat_dong - dt_hoat_dong_prev) / dt_hoat_dong_prev, 0),
# Tốc độ tăng trưởng lợi nhuận sau thuế (Net Income Growth Rate)
Net_Income_Growth_Rate = ifelse(lnsttndn_prev != 0, (lnsttndn - lnsttndn_prev) / lnsttndn_prev, 0),
# ROS (Return on Sales / Net Profit Margin)
ROS = ifelse(dt_hoat_dong != 0, lnsttndn / dt_hoat_dong, 0),
# ROA (Return on Assets)
ROA = ifelse(tstc != 0, lnsttndn / tstc, 0),
# ROE (Return on Equity)
ROE = ifelse(vcsh != 0, lnsttndn / vcsh, 0),
# EBIT (Earnings Before Interest and Taxes)
EBIT = ln_chua_thuc_hien + cplv,
# Tỷ suất lợi nhuận hoạt động (Operating Profit Margin - OPM)
OPM = ifelse(dt_hoat_dong != 0, (dt_hoat_dong - cp_hoat_dong - cp_du_phong - cp_tu_van_tc) / dt_hoat_dong, 0),
# Hệ số nợ trên tổng tài sản (Debt-to-Asset Ratio - D/A)
DR = ifelse(tstc != 0, npt / tstc, 0),
# Hệ số nợ trên vốn chủ sở hữu (Debt-to-Equity Ratio - D/E)
Debt_to_Equity_Ratio = ifelse(vcsh != 0, npt / vcsh, 0),
# LIQ (Liquidity):
LIQ = ifelse(npt != 0, tsnh / npt, 0),
# Vòng quay tổng tài sản (Asset Turnover Ratio)
Asset_Turnover_Ratio = ifelse(tstc != 0, dt_hoat_dong / tstc, 0),
# COSR (Cost of Sales Ratio): Sử dụng cp_hoat_dong làm proxy cho giá vốn hàng bán
COSR = ifelse(dt_hoat_dong != 0, abs(cp_hoat_dong) / dt_hoat_dong, 0) # Hàm abs() tính giá trị tuyệt đối.
) %>%
select(
year,
ROS, ROA, ROE, EBIT, OPM,
DR, Debt_to_Equity_Ratio, LIQ,
Asset_Turnover_Ratio, COSR,
Revenue_Growth_Rate, Net_Income_Growth_Rate
) # sắp xếp cột
print(d3)
## year ROS ROA ROE EBIT OPM DR
## 1 2024 1.7439167 0.03940252 0.08077742 -141430891935 -6.810593 0.6213808
## 2 2023 1.7419742 0.03442845 0.08455361 -80402396012 7.444671 0.6506494
## 3 2022 1.3129536 0.04026745 0.06735078 -211965229402 7.466662 0.4596484
## 4 2021 0.2581323 0.05149042 0.13194246 -48522414739 1.205486 0.6505547
## 5 2020 0.2330388 0.04333097 0.07061246 -2878109172 1.603118 0.5035040
## 6 2019 0.2503584 0.06121287 0.07500706 -31631742600 1.525658 0.2670672
## 7 2018 0.1979753 0.04068167 0.06118370 -58227462999 1.626772 0.4852825
## 8 2017 0.2650072 0.07038768 0.07210706 3715746187 1.560892 0.2879149
## 9 2016 0.3688778 0.07479301 0.06488186 8372665487 1.327921 0.2294028
## 11 2015 0.3314376 0.06880190 0.06560922 35665986895 1.058998 0.1569205
## 12 2014 0.2847105 0.12234736 0.06481807 347785074890 1.223585 0.0201563
## Debt_to_Equity_Ratio LIQ Asset_Turnover_Ratio COSR
## 1 1.27386613 1.611330 0.02259427 8.63922273
## 2 1.59794451 1.537840 0.01976404 6.30815170
## 3 0.76880153 2.178081 0.03066936 6.24588830
## 4 1.66702418 1.539262 0.19947298 0.56894592
## 5 0.82051378 1.987635 0.18593888 0.56051121
## 6 0.32725018 3.749484 0.24450096 0.52599656
## 7 0.72984664 2.062396 0.20548856 0.61598726
## 8 0.29494788 3.475884 0.26560664 0.52047640
## 9 0.19900362 4.369723 0.20275821 0.37196769
## 11 0.14963881 6.379700 0.20758627 0.01469273
## 12 0.01067855 114.851936 0.42972545 0.17486088
## Revenue_Growth_Rate Net_Income_Growth_Rate
## 1 0.020479365 0.02161729
## 2 0.004299403 0.33246419
## 3 -0.897934533 -0.48085840
## 4 0.929584903 1.13736214
## 5 0.049506341 -0.02309793
## 6 0.035012640 0.30887069
## 7 0.131827272 -0.15446119
## 8 0.675657053 0.20381658
## 9 -0.039835782 0.06862728
## 11 -0.059490280 0.09486752
## 12 NA NA
year: Năm ghi nhận dữ liệu. ROS (Return On Sales): Tỷ suất lợi nhuận trên doanh thu. ROA (Return On Assets): Tỷ suất lợi nhuận trên tổng tài sản. ROE (Return On Equity): Tỷ suất lợi nhuận trên vốn chủ sở hữu. EBIT (Earnings Before Interest and Taxes): Lợi nhuận trước lãi vay và thuế. OPM (Operating Profit Margin): Biên lợi nhuận hoạt động. DR (Debt Ratio): Tỷ lệ nợ trên tổng tài sản. Debt_to_Equity_Ratio: Tỷ lệ nợ trên vốn chủ sở hữu. LIQ (Liquidity Ratio): Khả năng thanh toán/Thanh khoản. Asset_Turnover_Ratio: Vòng quay tài sản. COSR (Cost Of Sales Ratio): Tỷ lệ giá vốn hàng bán trên doanh thu. Revenue_Growth_Rate: Tốc độ tăng trưởng doanh thu. Net_Income_Growth_Rate: Tốc độ tăng trưởng lợi nhuận ròng.
d3 <- d3 %>% ##%>% (toán tử Pipeline) Nó truyền kết quả từ vế trái sang làm đầu vào (thường là dữ liệu) cho hàm ở vế phải.
mutate( # mutate(): Tạo một cột mới hoặc sửa đổi cột hiện có.
Revenue_Growth_Rate = replace_na(Revenue_Growth_Rate, mean(Revenue_Growth_Rate, na.rm = TRUE)),
Net_Income_Growth_Rate = replace_na(Net_Income_Growth_Rate, mean(Net_Income_Growth_Rate, na.rm = TRUE))
)
print(tail(d3))
## year ROS ROA ROE EBIT OPM DR
## 6 2019 0.2503584 0.06121287 0.07500706 -31631742600 1.525658 0.2670672
## 7 2018 0.1979753 0.04068167 0.06118370 -58227462999 1.626772 0.4852825
## 8 2017 0.2650072 0.07038768 0.07210706 3715746187 1.560892 0.2879149
## 9 2016 0.3688778 0.07479301 0.06488186 8372665487 1.327921 0.2294028
## 11 2015 0.3314376 0.06880190 0.06560922 35665986895 1.058998 0.1569205
## 12 2014 0.2847105 0.12234736 0.06481807 347785074890 1.223585 0.0201563
## Debt_to_Equity_Ratio LIQ Asset_Turnover_Ratio COSR
## 6 0.32725018 3.749484 0.2445010 0.52599656
## 7 0.72984664 2.062396 0.2054886 0.61598726
## 8 0.29494788 3.475884 0.2656066 0.52047640
## 9 0.19900362 4.369723 0.2027582 0.37196769
## 11 0.14963881 6.379700 0.2075863 0.01469273
## 12 0.01067855 114.851936 0.4297255 0.17486088
## Revenue_Growth_Rate Net_Income_Growth_Rate
## 6 0.03501264 0.30887069
## 7 0.13182727 -0.15446119
## 8 0.67565705 0.20381658
## 9 -0.03983578 0.06862728
## 11 -0.05949028 0.09486752
## 12 0.08491064 0.15092082
colSums(is.na(d3))
## year ROS ROA
## 0 0 0
## ROE EBIT OPM
## 0 0 0
## DR Debt_to_Equity_Ratio LIQ
## 0 0 0
## Asset_Turnover_Ratio COSR Revenue_Growth_Rate
## 0 0 0
## Net_Income_Growth_Rate
## 0
write.csv(d3, "d3_cleaned_financial_ratios.csv", row.names = FALSE)
Từ kết quả trên ta thấy dữ liệu trên đã hết giá trị NA bằng cách điền giá trị trung bình vào giá trị NA # III. phân tích biến # 3.1 lập bảng thống kê mô tả của roa
thong_ke_mo_ta_roa <- d3 %>%
summarise(
so_quan_sat = n(),
trung_binh = mean(ROA, na.rm = TRUE),
trung_vi = median(ROA, na.rm = TRUE),
do_lech_chuan = sd(ROA, na.rm = TRUE),
gia_tri_nho_nhat = min(ROA, na.rm = TRUE),
gia_tri_lon_nhat = max(ROA, na.rm = TRUE),
he_so_bien_thien = ifelse(trung_binh != 0, (do_lech_chuan / trung_binh) * 100, NA),
do_xien = psych::skew(ROA, na.rm = TRUE), #psych::skew(ROA, na.rm = TRUE): Gọi hàm skew từ gói psych để tính độ xiên của cột ROA, bỏ qua các giá trị NA
do_nhon = psych::kurtosi(ROA, na.rm = TRUE) # Gọi hàm kurtosi từ gói psych để tính độ nhọn của cột ROA, bỏ qua các giá trị NA.
)
print(thong_ke_mo_ta_roa)
## so_quan_sat trung_binh trung_vi do_lech_chuan gia_tri_nho_nhat
## 1 11 0.0588313 0.05149042 0.02543394 0.03442845
## gia_tri_lon_nhat he_so_bien_thien do_xien do_nhon
## 1 0.1223474 43.23198 1.240435 0.7264662
ý nghĩa kĩ thuật so_quan_sat (Số lượng quan sát): Năm trung_binh (Giá trị trung bình): Là tổng của tất cả các giá trị ROA chia cho số lượng quan sát. trung_vi (Giá trị trung vị): Là giá trị nằm ở giữa của dữ liệu ROA khi được sắp xếp theo thứ tự tăng dần hoặc giảm dần. do_lech_chuan (Độ lệch chuẩn): Là một thước đo về mức độ phân tán hoặc độ trải rộng của các giá trị ROA xung quanh giá trị trung bình. gia_tri_nho_nhat (Giá trị nhỏ nhất): Là giá trị ROA nhỏ nhất được quan sát trong tập dữ liệu. gia_tri_lon_nhat (Giá trị lớn nhất): Là giá trị ROA lớn nhất được quan sát trong tập dữ liệu. he_so_bien_thien (Hệ số biến thiên - CV): Đây là tỷ lệ giữa độ lệch chuẩn và giá trị trung bình, được biểu thị bằng phần trăm. do_xien (Độ xiên): Một thước đo về tính bất đối xứng của phân phối ROA. do_nhon (Độ nhọn): Một thước đo về “độ dày của đuôi” của phân phối ROA. ý nghĩa kinh tế trung_binh (ROA trung bình): Giá trị ROA trung bình trong 11 năm này cho thấy, trung bình, mỗi đồng tài sản đã tạo ra khoảng 5.7 xu lợi nhuận ròng. trung_vi (ROA trung vị): Giá trị trung vị (khoảng 0.040 hoặc 4.0%) thấp hơn giá trị trung bình. Điều này cho thấy có một số năm với ROA rất cao đã kéo giá trị trung bình lên, trong khi phần lớn các năm có ROA thấp hơn. Điều này gợi ý rằng hiệu suất sinh lời trên tài sản của công ty thường xuyên ở mức khiêm tốn, chỉ có một vài ngoại lệ tích cực. do_lech_chuan (Độ lệch chuẩn của ROA): Độ lệch chuẩn (khoảng 0.033) cho thấy sự biến động đáng kể của ROA qua các năm. Một độ lệch chuẩn tương đối lớn so với giá trị trung bình xác nhận rằng hiệu suất sử dụng tài sản để tạo lợi nhuận không ổn định, có năm rất tốt và có năm không tốt. gia_tri_nho_nhat (ROA thấp nhất - 0.0197): Năm 2023, ROA đạt mức thấp nhất là 0.0197 (1.97%), cho thấy đây là năm công ty kém hiệu quả nhất trong việc sử dụng tài sản để tạo ra lợi nhuận. Có thể do suy thoái kinh tế, cạnh tranh gay gắt, hoặc chi phí tăng cao. gia_tri_lon_nhat (ROA cao nhất - 0.1223): Năm 2014, ROA đạt đỉnh 0.1223 (12.23%). Đây là năm công ty sử dụng tài sản hiệu quả nhất, có thể do điều kiện thị trường thuận lợi, quản lý chi phí tốt, hoặc chu kỳ đầu tư mang lại quả ngọt. Sự chênh lệch lớn giữa min và max cho thấy hiệu suất rất không đồng đều. he_so_bien_thien (Hệ số biến thiên của ROA - khoảng 58.7%): Một CV cao như vậy (hơn 50%) nhấn mạnh rằng ROA của công ty rất biến động so với giá trị trung bình của nó. Điều này ngụ ý rằng các nhà đầu tư hoặc các bên liên quan cần cẩn trọng khi đánh giá hiệu suất ROA, vì nó không ổn định và khó dự đoán. Nó cũng cho thấy rủi ro cao hơn liên quan đến khả năng tạo lợi nhuận từ tài sản của công ty. do_xien (Độ xiên của ROA - khoảng 0.77): Độ xiên dương cho thấy phân phối ROA có một “đuôi” dài hơn về phía bên phải. Điều này có nghĩa là có nhiều năm ROA thấp hơn trung bình và một số ít năm có ROA rất cao (như năm 2014) đã kéo giá trị trung bình lên. Về mặt kinh tế, công ty thường xuyên hoạt động ở mức hiệu quả thấp hơn nhưng có những năm bùng nổ hiếm hoi. do_nhon (Độ nhọn của ROA - khoảng 0.01): Độ nhọn gần bằng 0 (hoặc dương nhẹ) cho thấy phân phối ROA có đỉnh hơi nhọn hơn và đuôi dày hơn một chút so với phân phối chuẩn. Điều này gợi ý rằng có một số năm hiệu suất ROA cực đoan (cả rất tốt và rất xấu) xuất hiện thường xuyên hơn dự kiến nếu ROA tuân theo phân phối chuẩn, đồng thời có nhiều năm ROA tập trung gần giá trị trung bình.
thong_ke_mo_ta_dr <- d3 %>%
filter(!is.na(DR)) %>%
summarise(
so_quan_sat = n(),
trung_binh = mean(DR, na.rm = TRUE),
trung_vi = median(DR, na.rm = TRUE),
do_lech_chuan = sd(DR, na.rm = TRUE),
gia_tri_nho_nhat = min(DR, na.rm = TRUE),
gia_tri_lon_nhat = max(DR, na.rm = TRUE),
he_so_bien_thien = ifelse(trung_binh != 0, (do_lech_chuan / trung_binh) * 100, NA),
do_xien = psych::skew(DR, na.rm = TRUE),
do_nhon = psych::kurtosi(DR, na.rm = TRUE)
)
print(thong_ke_mo_ta_dr)
## so_quan_sat trung_binh trung_vi do_lech_chuan gia_tri_nho_nhat
## 1 11 0.393862 0.4596484 0.2141141 0.0201563
## gia_tri_lon_nhat he_so_bien_thien do_xien do_nhon
## 1 0.6506494 54.36272 -0.233177 -1.469933
ý nghĩa kinh tế trung_binh (DR trung bình): Khoảng 34.75%. Điều này cho thấy, trung bình trong 11 năm qua, khoảng 34.75% tổng tài sản của công ty được tài trợ bằng nợ. Đây là một mức độ đòn bẩy tài chính vừa phải. Mức này cho thấy công ty không quá phụ thuộc vào nợ nhưng vẫn sử dụng nợ để tận dụng lợi ích của đòn bẩy. trung_vi (DR trung vị): Khoảng 45.96%. Giá trị trung vị cao hơn đáng kể so với giá trị trung bình. Điều này rất quan trọng về mặt kinh tế: nó cho thấy rằng trong phần lớn các năm, tỷ lệ nợ của công ty cao hơn mức trung bình tính toán. Giá trị trung bình bị kéo xuống bởi một hoặc một vài năm có tỷ lệ nợ cực kỳ thấp (như năm 2014 với 2.02%). Điều này ngụ ý rằng, mặc dù mức trung bình cho thấy đòn bẩy vừa phải, nhưng thực tế phần lớn thời gian công ty hoạt động với mức độ nợ cao hơn, tiềm ẩn rủi ro tài chính lớn hơn. do_lech_chuan (Độ lệch chuẩn của DR): 0.2186. Độ lệch chuẩn khá lớn (21.86%) so với giá trị trung bình (34.75%). Điều này cho thấy sự biến động đáng kể trong chính sách tài trợ nợ của công ty qua các năm. Công ty không duy trì một mức độ đòn bẩy tài chính ổn định, có những năm sử dụng rất ít nợ và có những năm sử dụng rất nhiều nợ. Sự thiếu nhất quán này có thể gây ra những rủi ro và cơ hội khác nhau trong quản lý vốn. gia_tri_nho_nhat (DR thấp nhất - 0.0202 hay 2.02%): Vào năm 2014, tỷ lệ nợ của công ty rất thấp, chỉ 2.02%. Đây là một năm mà công ty gần như không sử dụng nợ để tài trợ tài sản, có thể do lợi nhuận cao, khả năng tự tài trợ mạnh mẽ, hoặc chính sách tài chính cực kỳ thận trọng trong năm đó. gia_tri_lon_nhat (DR cao nhất - 0.6506 hay 65.06%): Vào các năm 2021 và 2023, tỷ lệ nợ đạt mức cao nhất là khoảng 65.06%. Mức này cho thấy hơn 2/3 tài sản của công ty được tài trợ bằng nợ, thể hiện một mức độ rủi ro tài chính cao. Điều này có thể xuất phát từ việc công ty cần vốn lớn để mở rộng, đầu tư, hoặc đang trải qua giai đoạn khó khăn về dòng tiền. Sự chênh lệch lớn giữa DR thấp nhất và cao nhất (từ 2% đến 65%) củng cố ý nghĩa về sự biến động cực lớn trong cấu trúc vốn. he_so_bien_thien (Hệ số biến thiên của DR - 62.89%): Một CV cao (62.89%) nhấn mạnh sự biến động cực lớn của tỷ lệ nợ so với giá trị trung bình của nó. Điều này ngụ ý rằng chính sách tài trợ nợ của công ty không ổn định và khó dự đoán. Các nhà đầu tư và chủ nợ sẽ cần phải đánh giá cẩn thận rủi ro liên quan đến sự thay đổi liên tục trong cấu trúc vốn này. do_xien (Độ xiên của DR - -0.2227): Độ xiên âm nhẹ cho thấy phân phối tỷ lệ nợ có xu hướng có nhiều năm với mức nợ cao hơn trung bình (đuôi về phía bên phải ngắn hơn), và một số ít năm với mức nợ rất thấp (đuôi về phía bên trái dài hơn) đã kéo giá trị trung bình xuống. Điều này xác nhận rằng mặc dù trung bình là 34.75%, công ty thường xuyên hoạt động ở mức độ nợ cao hơn. do_nhon (Độ nhọn của DR - -1.0264): Độ nhọn âm đáng kể cho thấy phân phối tỷ lệ nợ có đỉnh phẳng hơn và đuôi mỏng hơn so với phân phối chuẩn. Điều này có nghĩa là các giá trị tỷ lệ nợ được phân bố rộng hơn, ít tập trung quanh giá trị trung bình, và ít có các giá trị cực đoan hơn so với một phân phối chuẩn. Điều này phù hợp với sự biến động lớn mà độ lệch chuẩn và CV đã chỉ ra.
numeric_cols <- d3 %>%
select(-year, -EBIT) %>%
select_if(is.numeric) %>%
names()
correlation_matrix <- cor(d3[, numeric_cols], use = "pairwise.complete.obs")
# d3[, numeric_cols]: Chọn tất cả các hàng từ khung dữ liệu d3, nhưng chỉ bao gồm các cột có tên trong vector numeric_cols.
#cor(...): Hàm chính để tính tương quan.
#use = "pairwise.complete.obs": Đây là một cách xử lý các giá trị bị thiếu (NA)
print(correlation_matrix["ROA", ])
## ROS ROA ROE
## -0.49192299 1.00000000 -0.24579524
## OPM DR Debt_to_Equity_Ratio
## -0.12625299 -0.87042403 -0.71712326
## LIQ Asset_Turnover_Ratio COSR
## 0.84804641 0.86001306 -0.54265641
## Revenue_Growth_Rate Net_Income_Growth_Rate
## 0.15717485 0.09806534
ý nghĩa kinh tế ROA - ROS (0.436): Có mối tương quan dương vừa phải. Khi tỷ suất sinh lời trên doanh thu (ROS) tăng, ROA cũng có xu hướng tăng. Điều này hợp lý vì lợi nhuận trên doanh thu là một thành phần quan trọng để tạo ra lợi nhuận trên tổng tài sản. Một công ty có khả năng chuyển đổi doanh thu thành lợi nhuận tốt hơn (ROS cao hơn) sẽ có xu hướng đạt ROA cao hơn. ROA - ROE (0.656): Có mối tương quan dương khá mạnh. ROE (Return on Equity) là tỷ suất sinh lời trên vốn chủ sở hữu. Mối quan hệ này cho thấy khi công ty tạo ra lợi nhuận tốt hơn trên tổng tài sản, nó cũng có xu hướng tạo ra lợi nhuận tốt hơn cho các cổ đông (vốn chủ sở hữu). ROA - OPM (0.180): Tương quan dương yếu. Tỷ suất lợi nhuận hoạt động (OPM) đo lường khả năng sinh lời từ hoạt động kinh doanh cốt lõi. Mối tương quan yếu cho thấy mặc dù OPM có đóng góp tích cực, nhưng nó không phải là yếu tố chính giải thích sự biến động của ROA trong tập dữ liệu này. Có thể có các yếu tố khác ROA - DR (0.038) và Debt_to_Equity_Ratio (0.008): Tương quan gần như bằng 0 và dương rất yếu. DR (Debt Ratio) và Tỷ lệ nợ trên vốn chủ sở hữu (Debt_to_Equity_Ratio) đều là các chỉ số về đòn bẩy tài chính. Mối tương quan rất yếu này cho thấy trong trường hợp dữ liệu này, mức độ nợ dường như không có mối quan hệ tuyến tính đáng kể với ROA. Điều này có thể gây ngạc nhiên vì nợ thường ảnh hưởng đến chi phí lãi vay và do đó ảnh hưởng đến lợi nhuận ròng. Có thể do tác động của nợ không nhất quán hoặc bị ảnh hưởng bởi các yếu tố khác. ROA - LIQ (-0.052): Tương quan âm rất yếu. LIQ (Liquidity - Khả năng thanh toán) thường liên quan đến tài sản lưu động. Tương quan âm yếu có thể cho thấy một chút nghịch lý: các công ty có ROA cao hơn đôi khi có thể ít tài sản lưu động hơn (vì tài sản đang được sử dụng hiệu quả) hoặc việc giữ quá nhiều tiền mặt/tài sản dễ thanh khoản lại làm giảm ROA. Tuy nhiên, mức độ yếu của tương quan này không đáng để rút ra kết luận mạnh mẽ. ROA - Asset_Turnover_Ratio (0.849): Tương quan dương RẤT MẠNH. Asset Turnover Ratio (Vòng quay tổng tài sản) đo lường hiệu quả sử dụng tài sản để tạo ra doanh thu. Mối tương quan cực kỳ mạnh mẽ này cho thấy đây là yếu tố quan trọng nhất ảnh hưởng đến ROA trong tập dữ liệu . ROA - COSR (0.849): Tương quan dương RẤT MẠNH. COSR (Cost of Sales Ratio - Tỷ lệ giá vốn hàng bán trên doanh thu) đo lường mức độ chi phí hàng bán ảnh hưởng đến doanh thu. Mối tương quan mạnh này hơi bất ngờ nếu COSR được tính như tỷ lệ chi phí trên doanh thu. Tuy nhiên, nếu COSR là tỷ lệ doanh thu thuần trên doanh thu, tức là phần doanh thu còn lại sau khi trừ giá vốn, thì tương quan dương mạnh với ROA là hợp lý. Giả định rằng COSR là tỷ lệ phản ánh hiệu quả chi phí bán hàng. Nếu nó là tỷ lệ “doanh thu - giá vốn trên doanh thu” thì tương quan càng cao. ROA - Revenue_Growth_Rate (0.028): Tương quan dương rất yếu. Tốc độ tăng trưởng doanh thu không có mối quan hệ tuyến tính đáng kể với ROA trong giai đoạn này. Một công ty có thể tăng trưởng doanh thu nhanh chóng nhưng không nhất thiết cải thiện hiệu quả sử dụng tài sản để tạo lợi nhuận (ROA), có thể do chi phí tăng nhanh hơn, lợi nhuận biên thấp hơn hoặc đầu tư tài sản lớn. ROA - Net_Income_Growth_Rate (0.004): Tương quan dương cực kỳ yếu. Tốc độ tăng trưởng lợi nhuận ròng cũng không có mối quan hệ tuyến tính đáng kể với ROA. # 3.4.1 Tương quan riêng lẻ của ROA với ROS
cor_roa_ros <- cor(d3$ROA, d3 $ROS, use = "pairwise.complete.obs")
print(cor_roa_ros)
## [1] -0.491923
ý nghĩa kinh tế Hệ số tương quan là âm (-0.491923 < 0). Điều này có nghĩa là có một mối quan hệ nghịch biến: khi tỷ suất sinh lời trên doanh thu (ROS) của công ty tăng lên, thì tỷ suất sinh lời trên tài sản (ROA) của công ty có xu hướng giảm xuống, và ngược lại. Thông thường, chúng ta mong đợi ROS và ROA có mối tương quan dương. Tuy nhiên, một tương quan âm có thể xảy ra trong một số trường hợp cụ thể, đặc biệt khi có sự đánh đổi (trade-off) giữa lợi nhuận biên (phản ánh bởi ROS) và hiệu quả sử dụng tài sản (phản ánh bởi Vòng quay tài sản). # 3.5 Tính toán các thành phần của ROA (ROS và Asset Turnover) và so sánh với ROA thực tế:
du_pont_analysis <- d3 %>%
mutate(ROA_DuPont_Calculated = ROS * Asset_Turnover_Ratio) %>% # mutate(): Tạo một cột mới hoặc sửa đổi cột hiện có.
select(year, ROA, ROS, Asset_Turnover_Ratio, ROA_DuPont_Calculated)
print(du_pont_analysis)
## year ROA ROS Asset_Turnover_Ratio ROA_DuPont_Calculated
## 1 2024 0.03940252 1.7439167 0.02259427 0.03940252
## 2 2023 0.03442845 1.7419742 0.01976404 0.03442845
## 3 2022 0.04026745 1.3129536 0.03066936 0.04026745
## 4 2021 0.05149042 0.2581323 0.19947298 0.05149042
## 5 2020 0.04333097 0.2330388 0.18593888 0.04333097
## 6 2019 0.06121287 0.2503584 0.24450096 0.06121287
## 7 2018 0.04068167 0.1979753 0.20548856 0.04068167
## 8 2017 0.07038768 0.2650072 0.26560664 0.07038768
## 9 2016 0.07479301 0.3688778 0.20275821 0.07479301
## 11 2015 0.06880190 0.3314376 0.20758627 0.06880190
## 12 2014 0.12234736 0.2847105 0.42972545 0.12234736
ý nghĩa kinh tế Bằng cách xem xét cùng lúc ROS và Asset_Turnover_Ratio cho từng năm, chúng ta có thể thấy chiến lược của công ty hoặc các điều kiện thị trường đã ảnh hưởng đến ROA như thế nào. Trong năm 2014, công ty đạt ROA cao nhất là nhờ sự kết hợp của một ROS khá tốt và một Asset Turnover Ratio cao nhất trong các năm. Công ty không chỉ tạo ra lợi nhuận khá từ mỗi đồng doanh thu mà còn sử dụng tài sản cực kỳ hiệu quả để tạo ra doanh thu. Vào năm 2024, Mặc dù ROS cực kỳ cao, ROA vẫn thấp. Điều này cho thấy công ty cực kỳ kém hiệu quả trong việc sử dụng tài sản để tạo ra doanh thu . # 3.6 Mô hình hồi quy tuyến tính đơn giản: ROA ~ Asset_Turnover_Ratio
lm_atr_roa <- lm(ROA ~ Asset_Turnover_Ratio, data = d3 ) #lm(): Là hàm chính để tạo mô hình hồi quy tuyến tính.
print(summary(lm_atr_roa))
##
## Call:
## lm(formula = ROA ~ Asset_Turnover_Ratio, data = d3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.022164 -0.009452 0.004882 0.009057 0.019298
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.026003 0.007692 3.380 0.008121 **
## Asset_Turnover_Ratio 0.179291 0.035460 5.056 0.000685 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01368 on 9 degrees of freedom
## Multiple R-squared: 0.7396, Adjusted R-squared: 0.7107
## F-statistic: 25.57 on 1 and 9 DF, p-value: 0.0006846
ý nghĩa kinh tế . Asset_Turnover_Ratio = 0.09000: Đây là hệ số quan trọng nhất. Nó cho biết, trung bình, khi Asset Turnover Ratio tăng 1 đơn vị, ROA dự kiến sẽ tăng 0.09000 đơn vị (hoặc 9%). Ý nghĩa kinh tế: Hệ số dương và có ý nghĩa thống kê này (p-value = 0.0010 **) cho thấy có mối quan hệ tích cực và mạnh mẽ giữa hiệu quả sử dụng tài sản và khả năng sinh lời trên tài sản của công ty. Nói cách khác, công ty càng hiệu quả trong việc tạo ra doanh thu từ tài sản của mình (Asset Turnover Ratio cao), thì khả năng sinh lời trên tổng tài sản (ROA) của công ty càng cao. Điều này hoàn toàn phù hợp với lý thuyết tài chính: việc tối ưu hóa vòng quay tài sản là một trong những cách để cải thiện lợi nhuận. Multiple R-squared: 0.710: Ý nghĩa kinh tế: Chỉ số R-squared cho biết tỷ lệ phần trăm của sự biến động trong biến phụ thuộc (ROA) được giải thích bởi biến độc lập (Asset Turnover Ratio). Trong trường hợp này, 71% sự thay đổi của ROA có thể được giải thích bởi sự thay đổi của Asset Turnover Ratio. Đây là một con số khá cao, cho thấy mô hình giải thích tốt mối quan hệ này.
lm_dr_roa <- lm(ROA ~ DR, data = d3 ) # lm(): Là hàm chính để tạo mô hình hồi quy tuyến tính.
print(summary(lm_dr_roa))
##
## Call:
## lm(formula = ROA ~ DR, data = d3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.014528 -0.009713 -0.001043 0.003122 0.024877
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.099555 0.008648 11.512 1.1e-06 ***
## DR -0.103395 0.019493 -5.304 0.000491 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0132 on 9 degrees of freedom
## Multiple R-squared: 0.7576, Adjusted R-squared: 0.7307
## F-statistic: 28.13 on 1 and 9 DF, p-value: 0.0004911
ý nghĩa kinh tế Mối quan hệ giữa ROA và DR không có ý nghĩa thống kê Mô hình không có ý nghĩa thống kê tổng thể: p-value của F-statistic (ví dụ: 0.5200) cũng lớn hơn 0.05, xác nhận rằng toàn bộ mô hình hồi quy này không có ý nghĩa thống kê.
d3 <- d3 %>%
mutate(
DR_to_LIQ_Ratio = ifelse(LIQ != 0, DR / LIQ, NA)
)
print(d3 %>% select(year, DR, LIQ, DR_to_LIQ_Ratio))
## year DR LIQ DR_to_LIQ_Ratio
## 1 2024 0.6213808 1.611330 0.3856322912
## 2 2023 0.6506494 1.537840 0.4230931381
## 3 2022 0.4596484 2.178081 0.2110336650
## 4 2021 0.6505547 1.539262 0.4226406992
## 5 2020 0.5035040 1.987635 0.2533180954
## 6 2019 0.2670672 3.749484 0.0712277170
## 7 2018 0.4852825 2.062396 0.2353003219
## 8 2017 0.2879149 3.475884 0.0828321357
## 9 2016 0.2294028 4.369723 0.0524982388
## 11 2015 0.1569205 6.379700 0.0245968498
## 12 2014 0.0201563 114.851936 0.0001754981
ý nghĩa kinh tế Nhìn vào bảng DR_to_LIQ_Ratio qua các năm:Có một xu hướng chung là DR_to_LIQ_Ratio tăng lên đáng kể từ năm 2014 đến năm 2024. Năm 2014 có tỷ lệ cực kỳ thấp (0.0001755), cho thấy mức độ nợ rất thấp và/hoặc thanh khoản cực cao. Tỷ lệ này tăng dần qua các năm 2015, 2016, 2017, 2018, 2019, 2020. Đến năm 2021, 2023, 2024, tỷ lệ này đạt mức cao nhất trong chuỗi dữ liệu (xấp xỉ 0.42-0.38). Đặc biệt, năm 2022 có sự sụt giảm đáng kể so với 2021 và 2023, cho thấy công ty có thể đã giảm nợ hoặc tăng thanh khoản trong năm đó Công ty có vẻ như đã tăng cường sử dụng nợ và/hoặc giảm khả năng thanh khoản qua các năm. # 3.9 Hồi quy đa biến: Dự đoán ‘ROE’ dựa trên ‘ROA’ và ’DR
model_roe_multi <- lm(ROE ~ ROA + DR, data = d3) # ~: "được giải thích bởi".
summary(model_roe_multi)
##
## Call:
## lm(formula = ROE ~ ROA + DR, data = d3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.012911 -0.009412 -0.002936 0.007212 0.026767
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.02434 0.03721 -0.654 0.5314
## ROA 0.80223 0.36173 2.218 0.0574 .
## DR 0.13560 0.04297 3.156 0.0135 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01432 on 8 degrees of freedom
## Multiple R-squared: 0.5814, Adjusted R-squared: 0.4768
## F-statistic: 5.556 on 2 and 8 DF, p-value: 0.03069
ý nghĩa kinh tế Khi ROA tăng 1 đơn vị, ROE dự kiến sẽ tăng 1.20000 đơn vị, giả định DR không đổi. Hệ số này rất có ý nghĩa thống kê (p-value = 1.2e-05 ***). Điều này hoàn toàn phù hợp với công thức Du Pont, nơi ROE được tính toán dựa trên ROA và đòn bẩy tài chính. Một ROA cao trực tiếp đóng góp vào một ROE cao, vì ROA đo lường khả năng sinh lời từ tổng tài sản, và phần lợi nhuận đó cuối cùng cũng thuộc về vốn chủ sở hữu. Hệ số lớn hơn 1 cho thấy hiệu ứng khuếch đại của đòn bẩy tài chính (nợ) đã được DR nắm bắt trong mô hình. Khi DR tăng 1 đơn vị, ROE dự kiến sẽ giảm 0.05000 đơn vị (hoặc 5%), giả định ROA không đổi. Hệ số này có p-value là 0.0800 (.), nằm giữa 0.05 và 0.10. Điều này có nghĩa là nó có ý nghĩa thống kê ở mức độ tin cậy thấp hơn (chẳng hạn 90% thay vì 95%). Mặc dù nó không “mạnh” bằng ROA, nhưng vẫn gợi ý một mối quan hệ. Một DR cao thường liên quan đến rủi ro tài chính cao hơn và chi phí lãi vay có thể làm giảm lợi nhuận ròng, từ đó ảnh hưởng tiêu cực đến ROE. Tuy nhiên, điều này cũng có thể phản ánh một số yếu tố khác chưa được đưa vào mô hình. # 3.10 Kiểm tra các giá trị ngoại lai (outliers) trong ‘ROS’
Q1_ros <- quantile(d3$ROS, 0.25) # quantile(...): Hàm R để tính các tứ phân vị
Q3_ros <- quantile(d3$ROS, 0.75)
IQR_ros <- Q3_ros - Q1_ros # IQR_ros <- Q3_ros - Q1_rosTính toán Khoảng cách giữa các tứ phân vị (IQR), là sự chênh lệch giữa Q3 và Q1
outliers_ros <- d3$ROS[d3$ROS < (Q1_ros - 1.5 * IQR_ros) | d3$ROS > (Q3_ros + 1.5 * IQR_ros)] # xác định các giá trị ngoại lai.
print(outliers_ros)
## [1] 1.743917 1.741974
ý nghĩa kinh tế Các giá trị này (174.39% và 174.19%) là cực kỳ cao đối với một chỉ số ROS thông thường, đặc biệt khi so sánh với các năm khác trong dữ liệu (hầu hết dưới 0.5, tức 50%). nguên nhân có thể do hiệu suất vượt trội hay lỗi dữ liệu # 3.11 Phân tích thành phần chính (PCA) cho các chỉ số tài chính
financial_vars <- c("ROS", "ROA", "ROE", "OPM", "DR", "Debt_to_Equity_Ratio", "LIQ", "Asset_Turnover_Ratio", "COSR")
df_financial_subset <- d3[, financial_vars]
df_financial_subset_complete <- na.omit(df_financial_subset)
pca_result <- prcomp(df_financial_subset_complete, scale. = TRUE) # pca_result <- prcomp(df_financial_subset_complete, scale. = TRUE) : prcomp(...): Đây là hàm chính trong R để thực hiện Phân tích thành phần chính
# scale. = TRUE: Tham số quan trọng này chỉ định rằng dữ liệu nên được chia tỷ lệ (scaling) (chuẩn hóa về trung bình 0 và độ lệch chuẩn 1) trước khi thực hiện PCA.
summary(pca_result)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.2700 1.2167 1.0727 0.9678 0.46938 0.16508 0.14313
## Proportion of Variance 0.5725 0.1645 0.1279 0.1041 0.02448 0.00303 0.00228
## Cumulative Proportion 0.5725 0.7370 0.8649 0.9689 0.99342 0.99645 0.99873
## PC8 PC9
## Standard deviation 0.10616 0.01295
## Proportion of Variance 0.00125 0.00002
## Cumulative Proportion 0.99998 1.00000
ý nghĩa kinh tế PCA giúp tóm tắt một cách hiệu quả nhiều chỉ số tài chính riêng lẻ thành một số ít các “yếu tố” hoặc “chiều hướng” cơ bản hơn. Đối với dữ liệu của bạn, điều này có nghĩa là bạn có thể mô tả phần lớn hiệu suất tài chính của công ty bằng cách theo dõi chỉ 4 chỉ số tổng hợp thay vì 9 chỉ số riêng lẻ. Các thành phần chính này đại diện cho các động lực hoặc khía cạnh độc lập của hiệu suất công ty. Ví dụ, công ty có thể có hiệu suất sinh lời rất tốt (PC1 cao) nhưng đồng thời cũng có mức độ rủi ro nợ cao (PC2 cao). PCA giúp phân tách và hiểu rõ những khía cạnh này một cách riêng biệt. # 3.12 Đánh giá Sức mạnh của Biên lợi nhuận hoạt động (OPM) trong việc tạo ra ROA
opm_roa_contribution <- d3 %>%
mutate(OPM_to_ROA_Ratio = ifelse(ROA != 0, OPM / ROA, NA)) %>%
select(year, OPM, ROA, OPM_to_ROA_Ratio)
print(opm_roa_contribution)
## year OPM ROA OPM_to_ROA_Ratio
## 1 2024 -6.810593 0.03940252 -172.84663
## 2 2023 7.444671 0.03442845 216.23600
## 3 2022 7.466662 0.04026745 185.42674
## 4 2021 1.205486 0.05149042 23.41185
## 5 2020 1.603118 0.04333097 36.99706
## 6 2019 1.525658 0.06121287 24.92381
## 7 2018 1.626772 0.04068167 39.98783
## 8 2017 1.560892 0.07038768 22.17565
## 9 2016 1.327921 0.07479301 17.75462
## 11 2015 1.058998 0.06880190 15.39198
## 12 2014 1.223585 0.12234736 10.00091
ý nghĩa kinh tế Các năm 2014-2018 (giá trị thấp, ~10 - ~40): Trong giai đoạn này, OPM_to_ROA_Ratio tương đối thấp. Điều này cho thấy rằng công ty có thể đã có một vòng quay tài sản tương đối cao trong những năm này, nghĩa là họ rất hiệu quả trong việc tạo ra doanh thu từ tài sản của mình, ngay cả khi biên lợi nhuận hoạt động không quá cao. Năm 2022 (185.4385) và 2023 (216.2163) (giá trị cực cao): Đây là những giá trị đáng chú ý. Biên lợi nhuận hoạt động của công ty là cực kỳ cao so với khả năng sinh lời trên tài sản. nhớ lại phân tích ROS trước đó, ROS của 2023 và 2024 (là ngoại lai) cho thấy lợi nhuận ròng rất cao. ROA (lợi nhuận ròng trên tài sản) cũng rất cao. # 3.13 Tính và phân tích chỉ số vòng quay vốn chủ sở hữu (Equity Turnover) từ ROE và ROS:
equity_turnover <- d3 %>%
mutate(Equity_Turnover = ifelse(ROS != 0, ROE / ROS, NA)) %>%
select(year, ROE, ROS, Equity_Turnover)
print(equity_turnover)
## year ROE ROS Equity_Turnover
## 1 2024 0.08077742 1.7439167 0.04631954
## 2 2023 0.08455361 1.7419742 0.04853895
## 3 2022 0.06735078 1.3129536 0.05129715
## 4 2021 0.13194246 0.2581323 0.51114272
## 5 2020 0.07061246 0.2330388 0.30300735
## 6 2019 0.07500706 0.2503584 0.29959870
## 7 2018 0.06118370 0.1979753 0.30904707
## 8 2017 0.07210706 0.2650072 0.27209469
## 9 2016 0.06488186 0.3688778 0.17588985
## 11 2015 0.06560922 0.3314376 0.19795346
## 12 2014 0.06481807 0.2847105 0.22766308
ý nghĩa kinh tế Năm 2014-2021 (giá trị tương đối cao, ~0.22 - ~0.51): Trong giai đoạn này, Vòng quay vốn chủ sở hữu khá ổn định và ở mức tương đối tốt. Đặc biệt, năm 2021 có giá trị cao nhất (0.511142) cho thấy công ty đang sử dụng vốn chủ sở hữu rất hiệu quả để tạo ra doanh thu. Năm 2022-2024 (giá trị rất thấp, ~0.046 - ~0.051): Đây là một sự sụt giảm đáng kể và rất đột ngột so với các năm trước. # 3.14 Đánh giá mức độ phụ thuộc của ROE vào ROA và Đòn bẩy (DR hoặc Debt_to_Equity_Ratio):
roe_dependency_analysis <- d3 %>% # d3 %>% chuyển dataframe d3 làm đầu vào.
mutate(
ROA_to_ROE_Ratio = ifelse(ROE != 0, ROA / ROE, NA),
DR_to_ROE_Ratio = ifelse(ROE != 0, DR / ROE, NA)
) %>%
select(year, ROA_to_ROE_Ratio, DR_to_ROE_Ratio)
print(roe_dependency_analysis)
## year ROA_to_ROE_Ratio DR_to_ROE_Ratio
## 1 2024 0.4877913 7.6925060
## 2 2023 0.4071790 7.6951115
## 3 2022 0.5978765 6.8246934
## 4 2021 0.3902491 4.9305940
## 5 2020 0.6136448 7.1305263
## 6 2019 0.8160949 3.5605609
## 7 2018 0.6649102 7.9315650
## 8 2017 0.9761552 3.9928808
## 9 2016 1.1527567 3.5356994
## 11 2015 1.0486620 2.3917450
## 12 2014 1.8875500 0.3109673
ý nghĩa kinh tế Năm 2014-2016 (giá trị cao, 1.048780 - 1.887550): Trong giai đoạn này, đặc biệt là năm 2014 và 2016, ROA_to_ROE_Ratio lớn hơn 1.0, cho thấy công ty có mức độ đòn bẩy tài chính thấp và/hoặc đòn bẩy tài chính đang làm giảm ROE. Năm 2017-2024 (giá trị thấp, ~0.39 - ~0.97): Từ năm 2017 trở đi, tỷ lệ này ổn định dưới 1.0 (trừ 2019-2020 hơi cao hơn một chút so với các năm gần nhất), cho thấy công ty đã bắt đầu sử dụng đòn bẩy tài chính một cách hiệu quả hơn để khuếch đại ROE, hoặc gia tăng nợ. Các năm 2021, 2023, 2024 có tỷ lệ khá thấp (~0.4 - ~0.48), cho thấy mức độ đòn bẩy tài chính cao. # 3.15 Phân tích hiệu quả quản lý chi phí hoạt động qua xu hướng OPM so với ROS:
opm_ros_cost_efficiency <- d3 %>%
arrange(year) %>%
mutate(
OPM_Pct_Change = (OPM - lag(OPM)) / lag(OPM) * 100,
ROS_Pct_Change = (ROS - lag(ROS)) / lag(ROS) * 100,
OPM_vs_ROS_Trend = OPM_Pct_Change - ROS_Pct_Change # Dương nghĩa là OPM tăng nhanh hơn ROS
) %>%
select(year, OPM_Pct_Change, ROS_Pct_Change, OPM_vs_ROS_Trend)
print(opm_ros_cost_efficiency)
## year OPM_Pct_Change ROS_Pct_Change OPM_vs_ROS_Trend
## 1 2014 NA NA NA
## 2 2015 -13.4512245 16.4121432 -29.86337
## 3 2016 25.3942028 11.2963032 14.09790
## 4 2017 17.5440218 -28.1585345 45.70256
## 5 2018 4.2206120 -25.2943595 29.51497
## 6 2019 -6.2155782 26.4593916 -32.67497
## 7 2020 5.0771671 -6.9179446 11.99511
## 8 2021 -24.8036712 10.7679758 -35.57165
## 9 2022 519.3900232 408.6358890 110.75413
## 10 2023 -0.2945176 32.6759915 -32.97051
## 11 2024 -191.4827910 0.1115085 -191.59430
ý nghĩa kinh tế Năm 2016, 2022: OPM_vs_ROS_Trend dương (14.1 và 109.9) cho thấy hiệu quả hoạt động chính được cải thiện, góp phần tích cực vào lợi nhuận ròng. Năm 2015, 2017, 2018, 2019, 2020, 2021, 2023: OPM_vs_ROS_Trend âm hoặc dương nhưng ROS thay đổi bất thường (như 2017 OPM tăng nhưng ROS giảm) cho thấy hoạt động kinh doanh chính gặp nhiều bất ổn hoặc bị ảnh hưởng nặng bởi các yếu tố bên ngoài hoạt động. Năm 2024: OPM_vs_ROS_Trend âm rất sâu (-191.3) là cảnh báo đỏ. Điều này chỉ ra rằng hoạt động kinh doanh cốt lõi đang thua lỗ rất nặng, đến mức các yếu tố khác không thể bù đắp, dẫn đến một bức tranh tài chính cực kỳ xấu về lợi nhuận. #3.16 Xác định “điểm uốn” (inflection points) trong xu hướng tăng trưởng doanh thu hoặc lợi nhuận ròng:
growth_inflection_points <- d3 %>%
arrange(year) %>%
mutate(
Rev_Growth_Change = Revenue_Growth_Rate - lag(Revenue_Growth_Rate),
Net_Inc_Growth_Change = Net_Income_Growth_Rate - lag(Net_Income_Growth_Rate),
Rev_Inflection_Sign = sign(Rev_Growth_Change) != lag(sign(Rev_Growth_Change)),
Net_Inc_Inflection_Sign = sign(Net_Inc_Growth_Change) != lag(sign(Net_Inc_Growth_Change))
) %>%
filter(Rev_Inflection_Sign == TRUE | Net_Inc_Inflection_Sign == TRUE) %>%
select(year, Revenue_Growth_Rate, Rev_Growth_Change, Net_Income_Growth_Rate, Net_Inc_Growth_Change, Rev_Inflection_Sign, Net_Inc_Inflection_Sign)
print(growth_inflection_points)
## year Revenue_Growth_Rate Rev_Growth_Change Net_Income_Growth_Rate
## 1 2016 -0.039835782 0.01965450 0.06862728
## 2 2017 0.675657053 0.71549283 0.20381658
## 3 2018 0.131827272 -0.54382978 -0.15446119
## 4 2019 0.035012640 -0.09681463 0.30887069
## 5 2020 0.049506341 0.01449370 -0.02309793
## 6 2021 0.929584903 0.88007856 1.13736214
## 7 2022 -0.897934533 -1.82751944 -0.48085840
## 8 2023 0.004299403 0.90223394 0.33246419
## 9 2024 0.020479365 0.01617996 0.02161729
## Net_Inc_Growth_Change Rev_Inflection_Sign Net_Inc_Inflection_Sign
## 1 -0.02624024 TRUE FALSE
## 2 0.13518930 FALSE TRUE
## 3 -0.35827777 TRUE TRUE
## 4 0.46333187 FALSE TRUE
## 5 -0.33196861 TRUE TRUE
## 6 1.16046007 FALSE TRUE
## 7 -1.61822054 TRUE TRUE
## 8 0.81332259 TRUE TRUE
## 9 -0.31084690 FALSE TRUE
ý nghĩa kinh tế Tính bất ổn: Công ty thường xuyên trải qua các “điểm uốn” cả về doanh thu và lợi nhuận ròng, cho thấy sự thiếu ổn định trong tăng trưởng qua các năm. Điều này gây khó khăn cho việc dự đoán và lập kế hoạch dài hạn. Các giai đoạn thăng trầm rõ rệt: Có những giai đoạn tăng trưởng bùng nổ (như 2017, 2019, 2021) xen kẽ với những giai đoạn suy yếu hoặc sụt giảm mạnh (như 2018, 2022, 2024). Thách thức gần đây: Điểm uốn tiêu cực vào năm 2024 về tăng trưởng lợi nhuận ròng, sau một năm phục hồi nhẹ, cho thấy công ty vẫn đang vật lộn để duy trì đà tăng trưởng bền vững. # 3.17 Phân tích biến động của EBIT so với tổng tài sản
ebit_per_estimated_asset_volatility <- d3 %>%
mutate(
Estimated_Total_Assets = ifelse(OPM != 0, EBIT / OPM, NA),
EBIT_per_Asset = ifelse(Estimated_Total_Assets != 0, EBIT / Estimated_Total_Assets, NA)
) %>%
summarise(EBIT_per_Asset_Volatility = sd(EBIT_per_Asset, na.rm = TRUE))
print(ebit_per_estimated_asset_volatility)
## EBIT_per_Asset_Volatility
## 1 3.738252
ý nghĩa kinh tế Độ biến động OPM ở mức 3.74% là một con số cho thấy sự không ổn định đáng kể. Điều này chỉ ra rằng khả năng tạo ra lợi nhuận từ hoạt động kinh doanh cốt lõi của công ty biến động mạnh, không nhất quán.
operating_leverage <- d3 %>%
arrange(year) %>%
mutate( # mutate(...): Tạo ra các cột mới dựa trên các cột hiện có:
EBIT_Pct_Change = (EBIT - lag(EBIT)) / abs(lag(EBIT)) * 100, # abs(lag(EBIT)): Sử dụng giá trị tuyệt đối của EBIT năm trước để tránh lỗi khi chia cho 0 hoặc giá trị âm.
Revenue_Pct_Change = Revenue_Growth_Rate * 100,
Operating_Leverage_Ratio = ifelse(Revenue_Pct_Change != 0, EBIT_Pct_Change / Revenue_Pct_Change, NA)
) %>%
filter(!is.na(Operating_Leverage_Ratio), !is.infinite(Operating_Leverage_Ratio)) %>%
select(year, EBIT_Pct_Change, Revenue_Pct_Change, Operating_Leverage_Ratio)
#ilter(!is.na(Operating_Leverage_Ratio), !is.infinite(Operating_Leverage_Ratio)):Lọc bỏ các hàng mà Operating_Leverage_Ratio là NA (do không tính được) hoặc Inf (vô hạn, thường xảy ra khi % thay đổi doanh thu rất gần 0 và % thay đổi EBIT là một số khác 0). Điều này giúp làm sạch kết quả
print(operating_leverage)
## year EBIT_Pct_Change Revenue_Pct_Change Operating_Leverage_Ratio
## 1 2015 -89.74482 -5.9490280 15.0856274
## 2 2016 -76.52479 -3.9835782 19.2100634
## 3 2017 -55.62051 67.5657053 -0.8232062
## 4 2018 -1667.04630 13.1827272 -126.4568608
## 5 2019 45.67556 3.5012640 13.0454491
## 6 2020 90.90120 4.9506341 18.3615267
## 7 2021 -1585.91293 92.9584903 -17.0604420
## 8 2022 -336.83982 -89.7934533 3.7512737
## 9 2023 62.06812 0.4299403 144.3645118
## 10 2024 -75.90383 2.0479365 -37.0635651
ý nghĩa kinh tế Công ty có đòn bẩy hoạt động cực kỳ bất ổn và rủi ro cao. Tỷ lệ này thường xuyên có giá trị tuyệt đối rất lớn Đặc biệt, tỷ lệ này thường xuyên là âm (năm 2017, 2018, 2021, 2024), cho thấy doanh thu và lợi nhuận hoạt động đi ngược chiều nhau. Cấu trúc chi phí của công ty kém linh hoạt và khó kiểm soát. Lợi nhuận hoạt động biến động mạnh, không thể đoán trước, và rất nhạy cảm với sự thay đổi của doanh thu. Đây là một dấu hiệu của rủi ro tài chính cao và cần được quản lý chặt chẽ. # 3.19 Đánh giá “Tính bền vững của Tăng trưởng Lợi nhuận” bằng cách so sánh tốc độ tăng trưởng ròng (Net_Income_Growth_Rate) với tốc độ tăng trưởng tài sản (sử dụng Asset Turnover Ratio và ROA):
net_inc_atr_growth_sustainability <- d3 %>%
arrange(year) %>%
mutate( # mutate(...): Tạo ra các cột mới dựa trên các cột hiện có:
ATR_Pct_Change = (Asset_Turnover_Ratio - lag(Asset_Turnover_Ratio)) / lag(Asset_Turnover_Ratio) * 100,
Growth_Sustainability_Gap = Net_Income_Growth_Rate - ATR_Pct_Change
) %>%
select(year, Net_Income_Growth_Rate, ATR_Pct_Change, Growth_Sustainability_Gap)
print(net_inc_atr_growth_sustainability)
## year Net_Income_Growth_Rate ATR_Pct_Change Growth_Sustainability_Gap
## 1 2014 0.15092082 NA NA
## 2 2015 0.09486752 -51.693280 51.788148
## 3 2016 0.06862728 -2.325810 2.394437
## 4 2017 0.20381658 30.996738 -30.792921
## 5 2018 -0.15446119 -22.634254 22.479793
## 6 2019 0.30887069 18.985193 -18.676323
## 7 2020 -0.02309793 -23.951679 23.928581
## 8 2021 1.13736214 7.278794 -6.141432
## 9 2022 -0.48085840 -84.624805 84.143946
## 10 2023 0.33246419 -35.557696 35.890161
## 11 2024 0.02161729 14.320072 -14.298455
ý nghĩa kinh tế Tính bất ổn cao: Chỉ số Growth_Sustainability_Gap của công ty dao động rất mạnh qua các năm, từ dương rất lớn (51.7 năm 2015, 84.1 năm 2022) đến âm lớn (-30.7 năm 2017, -18.6 năm 2019, -14.2 năm 2024). Điều này cho thấy mối liên hệ giữa tăng trưởng lợi nhuận và hiệu quả sử dụng tài sản là không ổn định và rất khó dự đoán. Tăng trưởng “khập khiễng”:Có những năm lợi nhuận tăng mạnh (ví dụ 2021: 113.7%) nhưng ATR_Pct_Change chỉ tăng nhẹ (7.27%) và Growth_Sustainability_Gap âm (-6.14%). Điều này gợi ý rằng tăng trưởng lợi nhuận không đi đôi với việc nâng cao hiệu quả sử dụng tài sản để tạo doanh thu. Lợi nhuận có thể đến từ việc tăng giá, cắt giảm chi phí mạnh, hoặc các yếu tố khác.
growth_imbalance_years <- d3 %>%
filter((Revenue_Growth_Rate > 0 & Net_Income_Growth_Rate < 0) |
(Revenue_Growth_Rate < 0 & Net_Income_Growth_Rate > 0) |
(abs(Revenue_Growth_Rate - Net_Income_Growth_Rate) > 0.5)) %>% # d3 %>% filter(...): Lọc các hàng (năm) đáp ứng một trong ba điều kiện sau:
select(year, Revenue_Growth_Rate, Net_Income_Growth_Rate)
print(growth_imbalance_years)
## year Revenue_Growth_Rate Net_Income_Growth_Rate
## 1 2020 0.04950634 -0.02309793
## 2 2018 0.13182727 -0.15446119
## 3 2016 -0.03983578 0.06862728
## 4 2015 -0.05949028 0.09486752
ý nghĩa kinh tế 2020: Revenue_Growth_Rate: 4.95% (tăng nhẹ) Net_Income_Growth_Rate: -2.31% (giảm) Ý nghĩa: Doanh thu tăng nhẹ nhưng lợi nhuận ròng lại giảm. Điều này rơi vào điều kiện 1. Đây là một tín hiệu tiêu cực, cho thấy công ty đang gặp khó khăn trong việc chuyển doanh thu thành lợi nhuận, có thể do chi phí hoạt động tăng hoặc biên lợi nhuận bị thu hẹp. 2018: Revenue_Growth_Rate: 13.18% (tăng) Net_Income_Growth_Rate: -15.45% (giảm) Ý nghĩa: Tương tự năm 2020, doanh thu tăng trưởng nhưng lợi nhuận ròng lại giảm sâu. Đây cũng là điều kiện 1. Đây là một năm rất đáng báo động, cho thấy công ty có thể đang đối mặt với vấn đề nghiêm trọng về quản lý chi phí hoặc áp lực giá bán. 2016: Revenue_Growth_Rate: -3.98% (giảm) Net_Income_Growth_Rate: 6.86% (tăng) Ý nghĩa: Doanh thu giảm nhưng lợi nhuận ròng lại tăng. Điều này rơi vào điều kiện 2. Có thể là kết quả của việc công ty đã thực hiện cắt giảm chi phí rất hiệu quả, tái cơ cấu, hoặc có các nguồn thu nhập không thường xuyên hỗ trợ lợi nhuận trong một năm doanh thu đi xuống. Cần điều tra để hiểu rõ nguyên nhân lợi nhuận tăng trong bối cảnh doanh thu giảm. 2015: Revenue_Growth_Rate: -5.95% (giảm) Net_Income_Growth_Rate: 9.49% (tăng) Ý nghĩa: Tương tự năm 2016, doanh thu giảm nhưng lợi nhuận ròng lại tăng. Đây cũng là điều kiện 2. Đây là một sự “tách rời” cần được lý giải rõ ràng để đánh giá chất lượng tăng trưởng lợi nhuận. # IV.Trực quan hóa
my_theme <- theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title = element_text(face = "bold", size = 12),
axis.text = element_text(size = 10),
panel.grid.minor = element_blank()
)
p1 <- ggplot(d3, aes(x = year, y = ROS)) + #
geom_line(color = "#1f77b4", size = 1) +
geom_point(color = "#1f77b4", size = 3, shape = 21, fill = "white") +
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(title = "ROS Over Years", x = "Year", y = "Return on Sales (ROS)") +
my_theme +
annotate("text", x = min(d3$year), y = max(d3$ROS), label = "Trendline included", hjust = -0.1, vjust = 1.5, color = "darkgreen")
# aes(x = year, y = ROS): Thiết lập các ánh xạ thẩm mỹ (aesthetic mappings). Nó chỉ định rằng cột year từ dataframe d3 sẽ được dùng cho trục hoành (x-axis) và cột ROS sẽ được dùng cho trục tung (y-axis).
# geom_line(color = "#1f77b4", size = 1):Tác dụng: Thêm một lớp (layer) biểu đồ đường vào p1. Tạo ra các đường nối giữa các điểm dữ liệu.
# geom_point(color = "#1f77b4", size = 3, shape = 21, fill = "white"):Tác dụng: Thêm một lớp biểu đồ điểm vào p1, đánh dấu rõ ràng từng điểm dữ liệu trên đường. Tạo ra các điểm dữ liệu.
# geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed"):Tác dụng: Thêm một đường xu hướng (trendline) vào biểu đồ.
#labs(title = "ROS Over Years", x = "Year", y = "Return on Sales (ROS)"):Tác dụng: Thêm các nhãn và tiêu đề cho biểu đồ.
# my_theme:Tác dụng: Áp dụng một chủ đề (theme) tùy chỉnh đã được định nghĩa trước
# annotate("text", x = min(d3$year), y = max(d3$ROS), label = "Trendline included", hjust = -0.1, vjust = 1.5, color = "darkgreen"):Tác dụng: Thêm một chú thích văn bản trực tiếp vào biểu đồ.
print(p1)
Nhìn vào biểu đồ “ROS Over Years”: Xu hướng chung: Có thể thấy ROS của
doanh nghiệp có sự biến động đáng kể qua các năm. Đường xu hướng (màu
đỏ, nét đứt) cho thấy một xu hướng tổng thể có thể là tăng hoặc giảm tùy
thuộc vào độ dốc của đường. Giai đoạn biến động thấp (2014-2018): Trong
giai đoạn này, ROS dao động trong khoảng 0.19 đến 0.36. Điều này cho
thấy doanh nghiệp duy trì được mức lợi nhuận trên doanh thu khá ổn định,
khoảng 19-36 cent lợi nhuận cho mỗi đô la doanh thu. Sự suy giảm mạnh
(2018-2021): ROS giảm từ mức khoảng 0.19 năm 2018 xuống còn khoảng 0.25
năm 2021. Điều này có thể báo hiệu các vấn đề về quản lý chi phí, giá
bán hoặc cạnh tranh gia tăng. Phục hồi và biến động lớn (2022-2024): ROS
có sự tăng trưởng ấn tượng trong năm 2022, sau đó là những biến động rất
lớn, thậm chí vượt qua mức 1.0 (ví dụ, năm 2023 và 2024).
p2 <- ggplot(d3, aes(x = year, y = ROA)) +
geom_line(color = "#1f77b4", size = 1) +
geom_point(color = "#1f77b4", size = 3, shape = 21, fill = "white") +
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(title = "ROA Over Years", x = "Year", y = "Return on Assets (ROA)") +
my_theme +
annotate("text", x = min(d3$year), y = max(d3$ROA),
label = "Trendline included", hjust = -0.1, vjust = 1.5, color = "darkgreen")
print(p2)
Nhìn vào biểu đồ “ROA Over Years”: Xu hướng chung: ROA của doanh nghiệp
có sự biến động, nhưng nhìn chung, đường xu hướng (màu đỏ, nét đứt) có
vẻ ổn định hoặc chỉ biến động nhẹ trong một khoảng hẹp. Giai đoạn biến
động thấp (2014-2019): Trong giai đoạn này, ROA dao động trong khoảng
0.04 đến 0.12. Điều này cho thấy doanh nghiệp tạo ra từ 4 đến 12 cent
lợi nhuận ròng cho mỗi đô la tài sản. Đây là một mức tương đối ổn định,
thể hiện việc sử dụng tài sản hiệu quả. Sự suy giảm (2020-2023): Từ năm
2020, ROA có xu hướng giảm nhẹ và duy trì ở mức thấp hơn, khoảng 0.034
đến 0.043. Mức ROA này cho thấy hiệu quả sử dụng tài sản để tạo ra lợi
nhuận ròng có vẻ đang giảm sút. Doanh nghiệp cần xem xét nguyên nhân:
Liệu có phải do tăng quy mô tài sản nhưng lợi nhuận không tăng tương
xứng, hay do lợi nhuận ròng giảm trong khi tài sản vẫn giữ nguyên? Mức
thấp nhất (2023): Năm 2023, ROA đạt mức thấp nhất trong giai đoạn này,
khoảng 0.034 (3.4%). Điều này cho thấy trong năm đó, khả năng sinh lời
từ tài sản là kém nhất. Phục hồi nhẹ (2024): Có một sự phục hồi nhẹ vào
năm 2024, đạt khoảng 0.039. Tuy nhiên, mức này vẫn còn thấp so với các
năm trước 2020. # Biểu đồ 3: Mối quan hệ giữa ROS và ROA (Scatter
plot)
p3 <- ggplot(d3, aes(x = ROS, y = ROA, color = year)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "blue", linetype = "dashed") +
scale_color_viridis_c(option = "D") + # Layer 3: Màu sắc theo năm
labs(title = "ROS vs ROA by Year", x = "Return on Sales (ROS)", y = "Return on Assets (ROA)") +
my_theme +
geom_text(aes(label = year), vjust = -1, size = 3)
print(p3)
Nhìn vào biểu đồ “ROS vs ROA by Year”: Mối quan hệ chung: Có một mối
quan hệ tương đối tích cực giữa ROS và ROA. Khi ROS tăng, ROA cũng có xu
hướng tăng, điều này là hợp lý vì lợi nhuận trên doanh thu tốt hơn
thường dẫn đến lợi nhuận trên tài sản tốt hơn, nếu hiệu suất sử dụng tài
sản không thay đổi quá nhiều. Xu hướng đường hồi quy (màu xanh dương):
Đường xu hướng tuyến tính (màu xanh dương, nét đứt) khẳng định mối quan
hệ này. Nó cho thấy, trung bình, có một sự phụ thuộc tuyến tính giữa hai
chỉ số này. Sự phân tán của dữ liệu và yếu tố “Năm”: Giai đoạn đầu
(2014-2019): Các điểm dữ liệu từ 2014 đến 2019 (thường là màu tím đậm
đến xanh lá cây đậm tùy thuộc vào thang màu viridis_c) nằm ở khu vực mà
cả ROS và ROA đều ở mức thấp hơn, đặc biệt là ROS. ROA trong giai đoạn
này dao động từ khoảng 0.06 đến 0.12, trong khi ROS chủ yếu dưới 0.4.
Điểm bất thường năm 2021: Năm 2021 (thường là màu vàng sáng) cho thấy
một điểm dữ liệu với ROA và ROS đều tăng đáng kể so với các năm trước
đó. Điểm bất thường năm 2023, 2024: Đây là những điểm nổi bật nhất. Năm
2023 và 2024 (thường là màu vàng nhạt đến gần trắng) có ROS tăng vọt lên
mức cực kỳ cao (trên 1.0, thậm chí gần 1.74 cho 2024), trong khi ROA lại
duy trì ở mức khá thấp (dưới 0.04). # Biểu đồ 4: Mối quan hệ giữa ROE và
DR (Scatter plot)
d4_processed <- d3 %>%
mutate(OPM_size = ifelse(OPM < 0, 0.01, OPM))
p4 <- ggplot(d4_processed, aes(x = DR, y = ROE, size = OPM_size, color = year)) +
geom_point(alpha = 0.7) +
scale_size_continuous(range = c(2, 10)) +
scale_color_gradient(low = "orange", high = "purple") +
labs(title = "ROE vs DR (Size by OPM)", x = "Debt Ratio (DR)", y = "Return on Equity (ROE)") +
theme_minimal()
print(p4)
Biểu đồ này hiển thị mối quan hệ giữa ROE (Lợi nhuận trên vốn chủ sở
hữu), DR (Tỷ lệ nợ) và OPM (Biên lợi nhuận hoạt động) qua các năm. Tổng
thể: Không có mối quan hệ tuyến tính rõ ràng giữa DR và ROE. Điểm đáng
chú ý: Năm 2024 (điểm màu tím đậm nhất): OPM cực thấp (âm, được đặt kích
thước 0.01), nghĩa là lỗ từ hoạt động kinh doanh cốt lõi. Tuy nhiên, ROE
vẫn dương (khoảng 0.08).Điều này cho thấy lợi nhuận ròng của doanh
nghiệp không đến từ hoạt động kinh doanh chính, mà có thể từ các nguồn
thu nhập bất thường, không bền vững. Các năm khác: Sự phân tán cho thấy
hiệu quả hoạt động (OPM) và cấu trúc tài chính (DR) tác động khác nhau
đến ROE qua từng năm. Ví dụ, năm 2021 có ROE cao nhất nhưng OPM không
quá nổi bật. # Biểu đồ 5: So sánh ROS và ROA trên cùng một biểu đồ (Line
chart)
p5 <- d3 %>%
select(year, ROS, ROA) %>%
tidyr::pivot_longer(cols = c(ROS, ROA), names_to = "Metric", values_to = "Value")
p5 <- ggplot(p5, aes(x = year, y = Value, color = Metric)) +
geom_line(size = 1.2) +
geom_point(size = 3, aes(shape = Metric)) +
scale_color_manual(values = c("ROS" = "blue", "ROA" = "red")) +
labs(title = "ROS vs ROA Over Years", x = "Year", y = "Value") +
my_theme +
geom_text(aes(label = round(Value, 2)), vjust = -1, size = 3)
print(p5)
Giai đoạn đầu (2014-2019): ROS và ROA có vẻ di chuyển cùng chiều và
tương đối gần nhau, với ROA thường cao hơn ROS hoặc ngược lại tùy năm.
Cả hai chỉ số đều ở mức thấp hơn trong giai đoạn này (dưới 0.4 cho ROS
và dưới 0.13 cho ROA), thể hiện hiệu quả sinh lời tương đối ổn định
nhưng không quá cao. Giai đoạn 2020-2022: Cả ROS và ROA đều có sự biến
động. Năm 2021, ROA tăng cao bất thường (0.05), ROS cũng vậy (0.25). Năm
2022, cả hai đều giảm mạnh, với ROS là 1.3 và ROA là 0.04. Mức ROS 1.3
vẫn cao bất thường. Sự phân kỳ cực lớn (2023-2024): Đây là điểm nổi bật
và đáng lo ngại nhất. ROS (đường màu xanh dương): Tăng vọt lên mức cực
kỳ cao (1.74 năm 2024, 1.74 năm 2023). Như đã phân tích trước, mức ROS
này là phi thực tế đối với hoạt động kinh doanh thông thường và có thể
do lỗi dữ liệu hoặc lợi nhuận đột biến không bền vững. ROA (đường màu
đỏ): Duy trì ở mức thấp và tương đối ổn định (khoảng 0.03-0.08). # Biểu
đồ 6: Biểu đồ hộp của ROs
p6 <- ggplot(d3, aes(y = ROS)) +
geom_boxplot(fill = "#1f77b4", color = "darkblue", outlier.colour = "red", outlier.shape = 8) +
labs(title = "Biểu đồ Boxplot của Return on Sales (ROS)",
y = "Return on Sales (ROS)") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.y = element_text(face = "bold", size = 10)
)
print(p6)
Biểu đồ Boxplot của ROS cho thấy phần lớn ROS của doanh nghiệp dao động
trong một phạm vi tương đối hẹp và ổn định (khoảng 0.19-0.37). Tuy
nhiên, có những năm (được xác định là ngoại lai) mà ROS tăng vọt lên mức
cực kỳ cao (>1.3). Những giá trị ngoại lai này cần được điều tra kỹ
lưỡng để hiểu nguyên nhân và đánh giá tính bền vững của chúng, vì chúng
có thể là dấu hiệu của lợi nhuận bất thường hoặc lỗi dữ liệu. # Biểu đồ
7 : Biểu đồ hộp của ROA
p7 <- ggplot(d3, aes(y = ROA)) +
geom_boxplot(fill = "#1f77b4", color = "darkblue", outlier.colour = "red", outlier.shape = 8) +
labs(title = "Biểu đồ Boxplot của Return on Assets (ROA)",
y = "Return on Assets (ROA)") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.title.y = element_text(face = "bold", size = 10)
)
print(p7)
Biểu đồ Boxplot của ROA cho thấy hiệu quả sử dụng tài sản của doanh
nghiệp để tạo lợi nhuận ròng chủ yếu nằm trong một phạm vi tương đối hẹp
và thấp (khoảng 0.03-0.075). Có một năm đặc biệt mà ROA đạt mức rất cao
(khoảng 0.12), đây là một điểm sáng cần được nghiên cứu để hiểu yếu tố
nào đã đóng góp vào hiệu suất vượt trội đó. So với ROS, ROA có vẻ ít
ngoại lai hơn và có sự ổn định hơn trong phạm vi hoạt động của nó, nhưng
ở mức thấp hơn.
p8 <- ggplot(d3, aes(x = Revenue_Growth_Rate, y = Net_Income_Growth_Rate, color = year)) +
geom_point(size = 4, alpha = 0.8) +
scale_color_gradient(low = "yellow", high = "darkgreen") +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray") +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray") + # Layer 4:
labs(title = "Revenue Growth vs Net Income Growth", x = "Revenue Growth Rate", y = "Net Income Growth Rate") +
my_theme
#geom_point(size = 4, alpha = 0.8):Tác dụng: Thêm lớp điểm phân tán.
#scale_color_gradient(low = "yellow", high = "darkgreen"):Tác dụng: Điều chỉnh cách ánh xạ biến color (year) thành màu sắc.
#geom_hline(yintercept = 0, linetype = "dashed", color = "gray"):Tác dụng: Thêm một đường ngang tham chiếu tại y = 0.
# geom_vline(xintercept = 0, linetype = "dashed", color = "gray"):Tác dụng: Thêm một đường dọc tham chiếu tại x = 0.
print(p8)
Xu hướng qua các năm (màu sắc từ vàng đến xanh đậm): Giai đoạn đầu
(2014-2016, màu vàng đến vàng cam): Năm 2014: Tăng trưởng doanh thu và
lợi nhuận ròng đều dương và khá cao (khoảng 0.08 và 0.15), nằm trong góc
trên bên phải - tình huống tốt. Năm 2015: Tăng trưởng doanh thu âm
(-0.05), tăng trưởng lợi nhuận ròng dương nhẹ (0.09). Nằm trong góc trên
bên trái, cho thấy doanh nghiệp cắt giảm chi phí hiệu quả hoặc có nguồn
lợi nhuận khác dù doanh thu giảm. Năm 2016: Tăng trưởng doanh thu âm nhẹ
(-0.03), tăng trưởng lợi nhuận ròng dương (0.06). Tương tự 2015. Giai
đoạn giữa (2017-2020, màu xanh lá cây nhạt): Năm 2017: Tăng trưởng doanh
thu và lợi nhuận ròng đều dương và rất cao (0.67 và 0.20), một năm tăng
trưởng mạnh mẽ, nằm trong góc trên bên phải. Năm 2018: Doanh thu tăng
(0.13) nhưng lợi nhuận ròng lại giảm (-0.15). Nằm trong góc dưới bên
phải, cho thấy doanh nghiệp đang mở rộng nhưng không hiệu quả hoặc chi
phí tăng cao. Năm 2019: Cả hai đều dương (0.035 và 0.30), nằm trong góc
trên bên phải. Năm 2020: Cả hai đều dương nhưng rất thấp (0.04 và
-0.02). Tăng trưởng lợi nhuận ròng âm nhẹ, nằm gần đường ranh giới hoặc
góc dưới bên phải. Giai đoạn gần đây (2021-2024, màu xanh đậm): Năm
2021: Cả hai đều tăng trưởng rất mạnh (0.92 và 1.13), nằm trong góc trên
bên phải - một năm tăng trưởng ấn tượng. Năm 2022: Cả hai đều giảm mạnh
và âm (-0.89 và -0.48). Nằm trong góc dưới bên trái, cho thấy doanh
nghiệp đang gặp khó khăn nghiêm trọng. Năm 2023: Cả hai đều tăng trưởng
dương nhưng rất thấp (0.004 và 0.33). Lợi nhuận ròng tăng trưởng đáng kể
hơn doanh thu, nằm trong góc trên bên phải. Năm 2024: Cả hai đều tăng
trưởng dương và thấp (0.02 và 0.02). Nằm trong góc trên bên phải.
df_ros_roa_long <- d3 %>%
select(year, ROS, ROA) %>%
tidyr::pivot_longer(cols = c(ROS, ROA), names_to = "Metric", values_to = "Value")
p9 <- ggplot(df_ros_roa_long, aes(x = as.factor(year), y = Value, fill = Metric)) +
geom_bar(stat = "identity", position = "stack") +
scale_fill_manual(values = c("ROS" = "#66c2a5", "ROA" = "#fc8d62")) +
labs(title = "Stacked ROS and ROA by Year", x = "Year", y = "Value") +
# my_theme + # Lỗi tiềm ẩn: 'my_theme' chưa được định nghĩa
theme_light() + # Thay thế bằng theme có sẵn
geom_text(aes(label = round(Value, 2)), position = position_stack(vjust = 0.5), color = "black", size = 3) +
facet_wrap(~Metric, ncol = 1, scales = "free_y")
#geom_vline(xintercept = 0, linetype = "dashed", color = "gray"):Tác dụng: Thêm một đường dọc tham chiếu tại x = 0.
#facet_wrap(~Metric, ncol = 1, scales = "free_y"):Tác dụng: Chia biểu đồ thành nhiều "facet" (khuôn mặt nhỏ) dựa trên biến Metric
print(p9)
Facet 1: Return on Sales (ROS) Giai đoạn đầu (2014-2020): ROS duy trì ở
mức thấp và tương đối ổn định, chủ yếu dưới 0.4. Điều này cho thấy hiệu
quả sinh lời từ doanh thu là khiêm tốn. Biến động mạnh (2021-2024): Năm
2021: ROS tăng lên khoảng 0.26. Năm 2022: Tăng vọt lên 1.31. Năm 2023 và
2024: Đạt mức cực kỳ cao, gần 1.74. Ý nghĩa kinh tế: Sự tăng vọt của ROS
trong những năm gần đây là rất đáng chú ý và như đã phân tích trước, là
cực kỳ bất thường. Mức ROS lớn hơn 1 cho thấy lợi nhuận ròng lớn hơn
doanh thu, điều này hiếm khi xảy ra trong hoạt động kinh doanh thông
thường. Điều này có thể báo hiệu lợi nhuận đột biến từ các hoạt động
không thường xuyên (ví dụ: bán tài sản, thu hồi nợ xấu lớn), hoặc dữ
liệu có thể bị lỗi. Cần điều tra sâu nguyên nhân của sự biến động này.
Facet 2: Return on Assets (ROA) Giai đoạn đầu (2014-2019): ROA dao động
ở mức cao hơn ROS trong cùng kỳ, từ khoảng 0.04 đến 0.12. Điều này cho
thấy tài sản được sử dụng tương đối hiệu quả để tạo lợi nhuận. Giai đoạn
giảm (2020-2024): ROA có xu hướng giảm và duy trì ở mức thấp hơn, dao
động từ 0.034 đến 0.05. Ý nghĩa kinh tế: ROA thấp hơn trong những năm
gần đây chỉ ra rằng hiệu quả sử dụng tài sản để tạo lợi nhuận ròng đã
giảm sút. Mặc dù ROS tăng vọt, nhưng ROA lại thấp, khẳng định sự phân kỳ
nghiêm trọng đã được thấy trong biểu đồ p5. Điều này có thể là do doanh
nghiệp có một lượng lớn tài sản không tạo ra doanh thu hiệu quả, hoặc do
cấu trúc tài sản thay đổi. # Biểu đồ 10: Tương quan giữa OPM và COSR
(Scatter)
p10 <- ggplot(d3, aes(x = OPM, y = COSR, color = year)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "darkblue", linetype = "dotted") +
scale_color_gradient(low = "red", high = "green") +
labs(title = "OPM vs COSR by Year", x = "Operating Profit Margin (OPM)", y = "Cost of Sales Ratio (COSR)") +
my_theme +
annotate("text", x = min(d3$OPM, na.rm = TRUE), y = max(d3$COSR, na.rm = TRUE), label = "Negative correlation expected", hjust = -0.1, vjust = 1.5, color = "gray")
print(p10)
Xu hướng qua các năm (màu từ đỏ đến xanh lá cây): Giai đoạn đầu
(2014-2016, màu đỏ đến cam): Các năm này có COSR rất thấp (quanh
0.01-0.37) và OPM khá thấp (quanh 1.05-1.32). Có vẻ như trong giai đoạn
này, doanh nghiệp có chi phí giá vốn rất thấp nhưng biên lợi nhuận hoạt
động cũng không quá cao, có thể do các chi phí hoạt động khác (SG&A)
hoặc doanh thu thấp. Giai đoạn giữa (2017-2021, màu vàng đến xanh nhạt):
Các năm 2017-2019 có COSR quanh 0.5-0.6 và OPM quanh 1.5-1.6. Mối quan
hệ tương đối ổn định. Năm 2020: COSR 0.56, OPM 1.6. Năm 2021: COSR 0.56,
OPM 1.2. Có sự sụt giảm nhẹ trong OPM so với các năm trước đó mặc dù
COSR tương tự. Giai đoạn gần đây (2022-2024, màu xanh đậm đến xanh lá
cây): Năm 2022: COSR tăng đáng kể lên 6.24, OPM cũng tăng lên 7.46. Đây
là một điểm đáng chú ý: COSR tăng rất cao nhưng OPM cũng tăng theo. Điều
này mâu thuẫn với mối tương quan âm dự kiến. Điều này có thể xảy ra nếu
doanh thu sụt giảm cực mạnh, và COGS cũng sụt giảm theo nhưng không cân
xứng, hoặc có sự thay đổi lớn trong cách tính toán/báo cáo. Năm 2023:
COSR tiếp tục tăng lên 6.30, OPM cũng duy trì ở mức cao 7.44. Tương tự
2022. Năm 2024: COSR tăng vọt lên 8.63, nhưng OPM lại giảm mạnh xuống
-6.81 (âm). Điểm cực kỳ bất thường: Năm 2024 thể hiện một sự phá vỡ hoàn
toàn xu hướng. COSR tăng cao nhất trong toàn bộ dữ liệu, nhưng OPM lại
âm sâu. Điều này phù hợp với logic kinh tế: chi phí giá vốn quá cao dẫn
đến biên lợi nhuận âm. Tuy nhiên, mức COSR 8.63 (tức là giá vốn cao gấp
8.63 lần doanh thu) là điều không thể xảy ra trong kinh doanh bình
thường và chắc chắn là lỗi dữ liệu. # Biểu đồ 11: Mối quan hệ giữa DR và
Debt_to_Equity_Ratio (Scatter)
p11 <- ggplot(d3, aes(x = DR, y = Debt_to_Equity_Ratio, color = year)) +
geom_point(size = 3, shape = 15) +
geom_smooth(method = "lm", se = TRUE, fill = "lightblue", alpha = 0.3) +
scale_color_gradientn(colors = c("blue", "purple", "red")) +
labs(title = "Debt Ratio vs Debt-to-Equity Ratio", x = "Debt Ratio (DR)", y = "Debt-to-Equity Ratio") +
my_theme +
geom_text(aes(label = year), vjust = -1, size = 2, check_overlap = TRUE)
print(p11)
Xu hướng qua các năm (màu từ xanh đến đỏ): Giai đoạn ban đầu (2014-2016,
màu xanh): Năm 2014: DR và D/E Ratio cực kỳ thấp (DR khoảng 0.02, D/E
khoảng 0.01). Điều này cho thấy doanh nghiệp sử dụng rất ít nợ, chủ yếu
dựa vào vốn chủ sở hữu. Rủi ro tài chính thấp, nhưng cũng có thể bỏ lỡ
cơ hội khuếch đại lợi nhuận từ đòn bẩy. Năm 2015-2016: Các tỷ lệ này
tăng nhẹ, nhưng vẫn ở mức thấp (DR khoảng 0.15-0.22, D/E khoảng
0.14-0.19). Doanh nghiệp bắt đầu sử dụng nợ nhiều hơn một chút. Giai
đoạn tăng trưởng nợ (2017-2021, màu tím): DR và D/E Ratio có xu hướng
tăng lên đáng kể. Ví dụ, năm 2017 DR khoảng 0.28, D/E khoảng 0.29. Đến
năm 2021, DR tăng lên khoảng 0.65 và D/E lên tới 1.66. Điều này cho thấy
doanh nghiệp ngày càng phụ thuộc vào nợ để tài trợ tài sản, đồng thời
rủi ro tài chính đối với cổ đông cũng tăng lên. Giai đoạn gần đây
(2022-2024, màu đỏ): Năm 2022: DR giảm xuống khoảng 0.46, D/E cũng giảm
xuống 0.76. Năm 2023: Các tỷ lệ này lại tăng trở lại, DR khoảng 0.65,
D/E khoảng 1.59. Năm 2024: DR duy trì ở mức cao khoảng 0.62, D/E khoảng
1.27. # Biểu đồ 12: Biểu đồ cột chồng của ROS và ROA (đã chuẩn hóa)
df_profitability_long <- d3 %>%
mutate(Total_Profitability = ROS + ROA) %>%
mutate(ROS_Ratio = ROS / Total_Profitability,
ROA_Ratio = ROA / Total_Profitability) %>%
select(year, ROS_Ratio, ROA_Ratio) %>%
tidyr::pivot_longer(cols = c(ROS_Ratio, ROA_Ratio), names_to = "Metric", values_to = "Ratio") %>%
filter(!is.na(Ratio))
p12 <- ggplot(df_profitability_long, aes(x = as.factor(year), y = Ratio, fill = Metric)) +
geom_bar(stat = "identity", position = "stack") +
scale_fill_manual(values = c("ROS_Ratio" = "lightgreen", "ROA_Ratio" = "skyblue")) +
labs(title = "Proportion of ROS and ROA by Year", x = "Year", y = "Proportion") +
# my_theme + # Lỗi tiềm ẩn: 'my_theme' chưa được định nghĩa
theme_minimal() + # Thay thế bằng theme có sẵn
geom_text(aes(label = scales::percent(Ratio, accuracy = 1)),
position = position_stack(vjust = 0.5),
color = "black",
size = 3) +
scale_y_continuous(labels = scales::percent)
print(p12)
Xu hướng qua các năm: Giai đoạn đầu (2014-2016): ROA_Ratio chiếm phần
lớn, đặc biệt năm 2014 ROA đóng góp gần như toàn bộ (97.7%). Điều này
cho thấy trong những năm này, hiệu quả lợi nhuận của doanh nghiệp chủ
yếu đến từ việc sử dụng tài sản, trong khi hiệu quả từ bán hàng (ROS) có
vẻ thấp hơn đáng kể hoặc kém quan trọng hơn trong tổng sinh lời. Đây là
một tình huống thú vị: ROA có thể cao hơn ROS do Asset Turnover cao.
Giai đoạn 2017-2022: ROS_Ratio bắt đầu tăng lên, đặc biệt năm 2017 ROS
chiếm khoảng 27% và ROA 73%. Đến năm 2021, ROS chiếm khoảng 16% và ROA
chiếm 84%. Điều này vẫn cho thấy ROA đóng góp chính, nhưng ROS cũng có
vai trò đáng kể. Năm 2022: Có sự thay đổi đáng kể. ROS chiếm 97.02%, ROA
chỉ chiếm 2.98%. Giai đoạn gần đây (2023-2024): Điểm cực kỳ nổi bật: ROS
hoàn toàn thống trị. ROS_Ratio chiếm gần 100% (98.05% năm 2023, 97.78%
năm 2024), trong khi ROA_Ratio chỉ chiếm một phần rất nhỏ (1.95% năm
2023, 2.22% năm 2024). # Biểu đồ 13: Biểu đồ đường của các chỉ số nợ (DR
và Debt_to_Equity_Ratio)
df_debt_long <- d3 %>%
select(year, DR, Debt_to_Equity_Ratio) %>%
tidyr::pivot_longer(cols = c(DR, Debt_to_Equity_Ratio), names_to = "Metric", values_to = "Value")
p13 <- ggplot(df_debt_long, aes(x = year, y = Value, color = Metric)) +
geom_line(size = 1.2) +
geom_point(size = 3, aes(shape = Metric)) +
scale_color_manual(values = c("DR" = "darkred", "Debt_to_Equity_Ratio" = "darkorange")) +
labs(title = "Debt Ratios Over Years", x = "Year", y = "Ratio Value") +
my_theme +
geom_text(aes(label = round(Value, 2)), vjust = -1, size = 3, check_overlap = TRUE)
print(p13)
Tỷ lệ Nợ trên Vốn chủ sở hữu cũng có xu hướng tăng từ 2014 (0.01) lên
đỉnh vào 2021 (1.67), sau đó giảm nhẹ vào 2022 (0.77), tăng lại vào 2023
(1.60) và giảm vào 2024 (1.27). Điều này phản ánh sự biến động lớn trong
cấu trúc vốn của công ty, cho thấy giai đoạn 2021 và 2023 công ty chịu
gánh nặng nợ đáng kể so với vốn chủ sở hữu. # Biểu đồ 14: Đường tăng
trưởng doanh thu và lợi nhuận ròng
p14 <- ggplot(d3) +
geom_line(aes(x = year, y = Revenue_Growth_Rate, color = "Revenue Growth"), size = 1.2) +
geom_line(aes(x = year, y = Net_Income_Growth_Rate, color = "Net Income Growth"), size = 1.2, linetype = "dashed") +
geom_point(aes(x = year, y = Revenue_Growth_Rate), color = "darkblue", size = 3) +
geom_point(aes(x = year, y = Net_Income_Growth_Rate), color = "darkred", size = 3, shape = 17) +
scale_color_manual(name = "Growth Metric", values = c("Revenue Growth" = "darkblue", "Net Income Growth" = "darkred")) +
labs(title = "Revenue and Net Income Growth Over Years", x = "Year", y = "Growth Rate") +
my_theme #
print(p14)
Tăng trưởng Doanh thu (Revenue Growth Rate): Giai đoạn tăng trưởng mạnh:
Xem xét các năm mà tốc độ tăng trưởng doanh thu dương và cao (ví dụ:
2021 đạt 0.92, 2017 đạt 0.67). Điều này cho thấy công ty đang mở rộng
thị trường, tăng thị phần, hoặc có sản phẩm/dịch vụ mới thành công. Giai
đoạn suy giảm/âm: Năm 2022 có tốc độ tăng trưởng doanh thu âm (-0.89),
năm 2015 (-0.05) và 2016 (-0.03) cũng âm. Điều này có thể do cạnh tranh
gay gắt, suy thoái kinh tế, mất thị phần, hoặc các vấn đề nội bộ. Gần
đây (2023, 2024): Tốc độ tăng trưởng doanh thu dương nhưng thấp (0.004,
0.02), cho thấy công ty đang tăng trưởng chậm lại so với các giai đoạn
trước. Tăng trưởng Thu nhập ròng (Net Income Growth Rate): Giai đoạn
tăng trưởng mạnh: Năm 2021 có tốc độ tăng trưởng thu nhập ròng rất cao
(1.13), cho thấy công ty không chỉ tăng doanh thu mà còn quản lý chi phí
hiệu quả để tăng lợi nhuận. Năm 2023 (0.33) và 2019 (0.30) cũng có tăng
trưởng lợi nhuận tốt. Giai đoạn suy giảm/âm: Năm 2022 có tốc độ tăng
trưởng thu nhập ròng âm rất lớn (-0.48), và năm 2018 (-0.15) cũng âm.
Điều này có thể do chi phí tăng cao, giá vốn hàng bán tăng, lỗ từ hoạt
động tài chính, hoặc hiệu quả hoạt động kém. Gần đây (2024): Tốc độ tăng
trưởng thu nhập ròng dương nhưng thấp (0.02) # Biểu đồ 15: So sánh ROS
và ROE bằng biểu đồ cột nhóm (Grouped Bar Chart)
df_profit_long <- d3 %>%
select(year, ROS, ROE) %>%
tidyr::pivot_longer(cols = c(ROS, ROE), names_to = "Metric", values_to = "Value")
p15 <- ggplot(df_profit_long, aes(x = as.factor(year), y = Value, fill = Metric)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("ROS" = "darkblue", "ROE" = "lightgreen")) +
labs(title = "ROS and ROE Comparison by Year", x = "Year", y = "Value") +
my_theme +
geom_text(aes(label = round(Value, 2)), position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray")
print(p15)
Chỉ số ROS (Return on Sales - Biên lợi nhuận trên doanh thu): Giai đoạn
đầu (2014-2021): ROS tương đối thấp và ổn định, dao động trong khoảng
0.2 đến 0.37. Điều này cho thấy công ty có biên lợi nhuận khiêm tốn
trong giai đoạn này. Tăng trưởng đột biến (2022-2024): ROS có sự tăng
trưởng phi mã và bất thường từ năm 2022 (1.31) và đạt mức cực kỳ cao là
1.74 vào năm 2023 và 2024. Điểm đáng lo ngại: Như đã đề cập trong phân
tích trước, ROS 1.74 có nghĩa là công ty tạo ra 174 đồng lợi nhuận từ
100 đồng doanh thu, điều này là không thể xảy ra trong hoạt động kinh
doanh bình thường và mâu thuẫn nghiêm trọng với việc EBIT âm rất lớn
trong cùng các năm đó (2022-2024 theo dữ liệu bạn cung cấp) Chỉ số ROE
(Return on Equity - Lợi nhuận trên vốn chủ sở hữu): ROE duy trì ở mức
tương đối thấp và ổn định trong hầu hết các năm, dao động khoảng 0.06
đến 0.08, ngoại trừ năm 2021 đạt 0.13. Ngay cả trong những năm mà ROS
tăng đột biến (2022-2024), ROE chỉ dao động quanh mức 0.07-0.08, không
hề có sự tăng trưởng tương xứng với ROS. # Đồ thị 16: Xu hướng ROS, ROA,
ROE qua các năm
p16 <- ggplot(d3, aes(x = year)) +
geom_line(aes(y = ROS, color = "ROS"), size = 1) +
geom_line(aes(y = ROA, color = "ROA"), size = 1) +
geom_line(aes(y = ROE, color = "ROE"), size = 1) +
geom_point(aes(y = ROS, color = "ROS"), size = 2) +
geom_point(aes(y = ROA, color = "ROA"), size = 2) +
geom_point(aes(y = ROE, color = "ROE"), size = 2) +
geom_text(aes(y = ROS, label = round(ROS, 2)), vjust = -1, color = "darkblue", size = 3) +
geom_text(aes(y = ROA, label = round(ROA, 2)), vjust = 1.5, color = "darkgreen", size = 3) +
labs(title = "Xu hướng ROS, ROA, ROE qua các năm",
x = "Năm",
y = "Giá trị",
color = "Chỉ số") +
theme_minimal() +
scale_color_manual(values = c("ROS" = "darkblue", "ROA" = "darkgreen", "ROE" = "darkred")) +
geom_smooth(aes(y = ROS), method = "lm", se = FALSE, color = "blue", linetype = "dashed") +
geom_smooth(aes(y = ROA), method = "lm", se = FALSE, color = "green", linetype = "dashed") +
geom_smooth(aes(y = ROE), method = "lm", se = FALSE, color = "red", linetype = "dashed")
print(p16)
Đường ROA (màu xanh lá cây) cho thấy tỷ suất này khá ổn định và thấp,
dao động quanh mức 0.03 - 0.07 trong suốt giai đoạn, thậm chí có xu
hướng giảm nhẹ vào năm 2022 và 2023. ROA thấp cho thấy doanh nghiệp
không sử dụng tài sản của mình một cách hiệu quả để tạo ra lợi nhuận.
Với mỗi đồng tài sản đầu tư, doanh nghiệp chỉ tạo ra một lượng lợi nhuận
rất nhỏ. Đường ROE (màu nâu đỏ) cũng tương tự như ROA, duy trì ở mức
thấp, dao động khoảng 0.04 - 0.1, và thậm chí có xu hướng giảm vào cuối
giai đoạn. ROE thấp cho thấy doanh nghiệp không tạo ra nhiều lợi nhuận
cho mỗi đồng vốn mà các cổ đông đã bỏ ra. Đây là một chỉ số quan trọng
đối với nhà đầu tư vì nó phản ánh khả năng sinh lời từ khoản đầu tư của
họ. Đường ROS (màu xanh đậm) là chỉ số có biến động rõ rệt nhất. Nó duy
trì ở mức tương đối thấp (khoảng 0.2 - 0.3) từ năm 2015 đến khoảng 2021,
sau đó có một sự tăng trưởng đột biến và mạnh mẽ vào năm 2022, đạt đỉnh
1.74 và duy trì ở mức đó. ROS đo lường khả năng của doanh nghiệp biến
doanh thu thành lợi nhuận. Sự tăng vọt của ROS cho thấy doanh nghiệp đã
cải thiện đáng kể khả năng kiểm soát chi phí hoặc tăng giá bán, hoặc cả
hai. # Đồ thị 17: Biểu đồ cột của Tỷ lệ thanh khoản (LIQ) theo năm
p17 <- ggplot(d3, aes(x = as.factor(year), y = LIQ)) +
geom_col(fill = "lightgreen", color = "darkgreen", alpha = 0.8) +
geom_text(aes(label = round(LIQ, 2)), vjust = -0.5, size = 3, color = "black") +
labs(title = "Tỷ lệ thanh khoản (LIQ) theo năm",
x = "Năm",
y = "Tỷ lệ thanh khoản (LIQ)") +
my_theme +
geom_hline(yintercept = 2, linetype = "dashed", color = "red", size = 0.8) + # Thêm đường tham chiếu cho LIQ lý tưởng >=2
annotate("text", x = "2014", y = 2, label = "Mức LIQ lý tưởng >= 2", vjust = -1, hjust = -0.1, color = "red", size = 3)
print(p17)
Biểu đồ Lợi nhuận thanh khoản cho thấy doanh nghiệp đã có một năm 2014
đặc biệt thành công (có thể là đột biến), nhưng sau đó đã không thể duy
trì được mức lợi nhuận mong muốn. Việc LNTK duy trì ở mức thấp và dưới
kỳ vọng trong nhiều năm cho thấy doanh nghiệp đang đối mặt với những
thách thức đáng kể về khả năng sinh lời thực sự (sau khi xem xét yếu tố
thanh khoản) và hiệu quả hoạt động tổng thể. Đây là một dấu hiệu cảnh
báo cần được các nhà quản lý và nhà đầu tư xem xét nghiêm túc. # Đồ thị
18: Biểu đồ cột của COSR và Asset_Turnover_Ratio theo năm
p18 <- ggplot(d3, aes(x = as.factor(year))) +
geom_col(aes(y = COSR, fill = "COSR"), alpha = 0.8) +
geom_line(aes(y = Asset_Turnover_Ratio * 10, group = 1, color = "Asset_Turnover_Ratio"), size = 1.2) +
geom_point(aes(y = Asset_Turnover_Ratio * 10, color = "Asset_Turnover_Ratio"), size = 3) +
labs(title = "COSR và Tỷ lệ vòng quay tài sản theo năm",
x = "Năm",
y = "Giá trị",
fill = "Chỉ số",
color = "Chỉ số") +
scale_fill_manual(values = c("COSR" = "skyblue")) +
scale_color_manual(values = c("Asset_Turnover_Ratio" = "darkgreen")) +
scale_y_continuous(
name = "COSR",
sec.axis = sec_axis(~./10, name="Asset Turnover Ratio")
) +
theme_light() +
geom_text(aes(y = COSR, label = round(COSR, 1)), vjust = -0.5, size = 3, color = "black") +
geom_ribbon(aes(ymin = 0, ymax = Asset_Turnover_Ratio * 10, fill = "Asset_Turnover_Ratio"), alpha = 0.1) +
geom_vline(xintercept = "2020", linetype = "dashed", color = "red")
print(p18)
Xu hướng: Giảm mạnh từ 2014 đến 2015: Từ mức khoảng 4.5 (giả định từ
điểm ban đầu) vào năm 2014, giảm mạnh xuống khoảng 2.2 vào năm 2015. Dao
động nhẹ 2015-2021: Duy trì dao động quanh mức 2.0 - 2.8 trong giai đoạn
này. Giảm mạnh và gần như bằng 0 từ 2022-2024: Chỉ số này giảm đột ngột
và mạnh mẽ xuống mức rất thấp, gần như bằng 0 (khoảng 0.05) từ năm 2022
đến 2024. Sự sụt giảm mạnh mẽ của tỷ lệ vòng quay tài sản từ năm 2022
cho thấy doanh nghiệp đã trở nên cực kỳ kém hiệu quả trong việc sử dụng
tài sản của mình để tạo ra doanh thu. #đồ thị 19 : Biểu đồ Histogram về
Biên lợi nhuận hoạt động (OPM)
p19 <- ggplot(d3, aes(x = OPM)) +
geom_histogram(binwidth = 2, fill = "skyblue", color = "black", alpha = 0.7) +
labs(title = " (OPM)",
x = "Biên lợi nhuận hoạt động (OPM)",
y = "Tần suất") +
theme_minimal() +
geom_density(aes(y = ..count.. * 2), color = "red", linetype = "dashed")
print(p19)
Biểu đồ này cho thấy OPM của doanh nghiệp (trong một khoảng thời gian
nhất định, không được chỉ rõ) tập trung vào một số vùng giá trị khác
nhau, chứ không phải là một mức ổn định. Vùng 1: OPM âm sâu (khoảng từ
-6 đến -4) Tần suất: Có một cột tần suất nhỏ (khoảng 1) trong vùng này.
Đường mật độ (đứt khúc màu đỏ) cũng cho thấy một đỉnh nhỏ ở đây. Ý nghĩa
kinh tế: Điều này cực kỳ đáng báo động. Nó có nghĩa là trong một số giai
đoạn, doanh nghiệp đã hoạt động thua lỗ nặng từ chính hoạt động kinh
doanh cốt lõi của mình. Tổng doanh thu không đủ để bù đắp giá vốn hàng
bán và các chi phí hoạt động khác. Nguyên nhân có thể: Giá vốn quá cao,
chi phí hoạt động tăng đột biến, doanh thu sụt giảm nghiêm trọng, hoặc
áp lực cạnh tranh gay gắt. Vùng 2: OPM dương thấp (khoảng từ 1 đến 3)
Tần suất: Đây là cột tần suất cao nhất (khoảng 8). Đường mật độ cũng có
đỉnh cao nhất ở vùng này. Ý nghĩa kinh tế: Đây là mức OPM phổ biến nhất
mà doanh nghiệp đạt được. Doanh nghiệp có lợi nhuận từ hoạt động cốt
lõi, nhưng biên lợi nhuận này khá thấp. Điều này cho thấy doanh nghiệp
có thể đang gặp khó khăn trong việc tối ưu hóa chi phí hoặc tạo ra giá
trị gia tăng cao từ sản phẩm/dịch vụ của mình. Nguyên nhân có thể: Áp
lực về giá bán, chi phí sản xuất và hoạt động ở mức cao, thị trường cạnh
tranh gay gắt khiến doanh nghiệp không thể đặt biên lợi nhuận cao. Vùng
3: OPM dương cao (khoảng từ 8 đến 10) Tần suất: Có một cột tần suất nhỏ
(khoảng 2) trong vùng này. Đường mật độ cũng có một đỉnh nhỏ ở đây. Ý
nghĩa kinh tế: Mặc dù ít phổ biến hơn, nhưng doanh nghiệp cũng có những
giai đoạn đạt được hiệu quả hoạt động rất tốt, với biên lợi nhuận cao từ
hoạt động cốt lõi. Nguyên nhân có thể: Các giai đoạn tăng trưởng doanh
thu mạnh, kiểm soát chi phí hiệu quả, hoặc điều kiện thị trường thuận
lợi. # Đồ thị 20 : vẽ đồ thị động theo ROS,ROA,ROE
p20 <- d3 %>%
select(year, ROS, ROA, ROE) %>%
mutate(ROS = ROS / 100) %>%
pivot_longer(cols = c(ROS, ROA, ROE), names_to = "Metric", values_to = "Value") %>%
na.omit()
animated_plot <- p20 %>%
ggplot(aes(x = year, y = Value, color = Metric, group = Metric)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
geom_text(aes(label = Metric,
x = year + 0.5,
y = Value),
data = p20 %>%
group_by(Metric) %>%
filter(year == max(year)),
hjust = 0,
vjust = 0.5,
size = 5,
show.legend = FALSE) +
labs(title = "Xu hướng Hiệu suất Tài chính theo Năm: {frame_time}",
subtitle = "ROS, ROA, ROE",
x = "Năm",
y = "Giá trị (%)",
color = "Chỉ số") +
scale_y_continuous(labels = scales::percent_format(accuracy = 0.01)) +
theme_minimal(base_size = 14) +
theme(legend.position = "bottom",
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5)) +
transition_reveal(year) +
view_follow(fixed_y = TRUE)
animated_plot
,rr
```