Date để mô hình hiểu được
các yếu tố thời gian.Tên Bộ dữ liệu: “World-Stock-Prices”.
Nguồn bộ dữ liệu: https://www.kaggle.com/datasets/nelgiriyewithana/world-stock-prices-daily-updating.
Thông tin bộ dữ liệu: Đây là một bộ dữ liệu về thị trường chứng khoán, ghi lại thông tin giao dịch hàng ngày của một danh sách các cổ phiếu từ nhiều công ty nổi tiếng trên toàn cầu.
Phạm vi bộ dữ liệu từ 3/1/2000 – 3/7/2025: bao gồm các công ty từ
nhiều quốc gia khác nhau (Country) như Mỹ (“usa”), Đức
(“germany”), Nhật Bản (“japan”), Canada (“canada”), Thụy Sĩ
(“switzerland”), Hà Lan(“netherlands”). Điều này cho thấy đây là một
danh mục đầu tư toàn cầu. Đa dạng ngành nghề các công ty thuộc nhiều
lĩnh vực kinh tế khác nhau (Industry_Ta). Công
nghệ(technology):Apple, Google, Nvidia, Salesforce. Bán lẻ (retail):
Target, Costco. Thương mại điện tử (e-commerce): Amazon, Shopify. Ô tô
(automotive): Tesla, Honda. Tài chính (finance): American Express,
Mastercard. Hàng không (aviation): Delta Air Lines, Southwest Airlines.
Và nhiều ngành khác như thực phẩm, giải trí, gaming, hàng tiêu dùng.
## [1] 310122 13
Giải thích: Kết quả cho ta thấy số quan sát là 310122 dòng và số biến là 13 cột trong bộ dữ liệu. VIệc này giúp kiểm tra quy mô bộ dữ liệu và xác định ngay có đủ dữ liệu để phân tích chuyên sauu không.
## [1] "Date" "Open" "High" "Low"
## [5] "Close" "Volume" "Brand_Name" "Ticker"
## [9] "Industry_Tag" "Country" "Dividends" "Stock.Splits"
## [13] "Capital.Gains"
Giải thích: Hiển thị tên tất cả các biến, giúp người đọc biết ngay dữ liệu gồm những thông tin gì. Điều này rất quan trọng để chọn biến phù hợp cho từng phân tích.
Giải Thích Kiểm tra dữ liệu (Data Sanity
Check): Lệnh head() 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.
Ý nghĩa Kỹ Thuật Hiểu cấu trúc dữ
liệu: Nhìn vào 2 dòng đầu và 2 dòng cuối, ta có thể suy luận: -
Bộ dữ liệu được sắp xếp theo thứ tự thời gian giảm dần
(descending chronological order). Dữ liệu mới nhất
(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. - Dữ liệu là dạng “bảng dài” (long
format), trong đó mỗi hàng là một quan sát của một mã cổ phiếu tại một
thời điểm. Phát hiện vấn đề tiềm ẩn: - Nhìn vào cột
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ý. - Ngày 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ã.
Giải thích: Lệnh tail(movies_dataset) dùng để xem 10 dòng cuối cùng của bộ dữ liệu. Mục đích là kiểm tra xem phần cuối của tệp có bị lỗi nhập liệu, giá trị trống hoặc dòng dư thừa do nhập tay không.
Nhận xét: Kết quả cho thấy bộ dữ liệu không có lỗi nhập liệu, không có dòng trống hoặc trùng lặp ở cuối file. Điều này chứng tỏ dữ liệu có cấu trúc ổn định, đảm bảo sẵn sàng cho bước xử lý và phân tích tiếp theo.
## [1] 8
Giải thích: - sapply() áp dụng hàm is.numeric() cho tất cả các biến (cột) của bộ dữ liệu “d” => Hàm này sẽ trả về một vector chứa TRUE/FALSE, thể hiện các biến nào là kiểu số (numeric). - sum() tính tổng số TRUE (đếm biến kiểu số). Như vậy, kết quả là tổng số biến định lượng trong dataset.
## [1] 5
Giải thích: sapply() lần lượt kiểm tra từng biến xem có phải kiểu character hoặc factor không. Dùng phép OR | giữa hai kết quả để tổng hợp tất cả biến thuộc dạng phân loại sum() đếm tổng số biến dạng này.
Nhận xét: 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.
loại <- data.frame(
Kiểu_dữ_liệu = sapply(d, class))
kable(loại, col.names = c("Tên biến" , "Kiểu dữ liệu"))| Tên biến | Kiểu dữ liệu |
|---|---|
| Date | character |
| Open | numeric |
| High | numeric |
| Low | numeric |
| Close | numeric |
| Volume | numeric |
| Brand_Name | character |
| Ticker | character |
| Industry_Tag | character |
| Country | character |
| Dividends | numeric |
| Stock.Splits | numeric |
| Capital.Gains | numeric |
Giải thích: (1) Hàm data.frame() chuyển đổi kết quả này thành bảng, gồm hai cột: tên biến và kiểu dữ liệu của biến đó. (2) Hàm sapply() để áp dụng hàm class cho tất cả các cột của dữ liệu movies_dataset. Kết quả trả về là một vector gồm các kiểu dữ liệu như “numeric”, “character”, “factor”. (3)Hàm kable() giúp hiển thị bảng này dưới dạng đẹp, dễ đọc trong báo cáo hoặc tài liệu.
Nhận xét:Kết quả cho thấy dữ liệu có sự đa dạng về kiểu biến, phù hợp cho các phân tích đa dạng như mô tả, so sánh, hay xây dựng mô hình dự báo. Biết rõ kiểu dữ liệu giúp nhóm dễ dàng xử lý, mã hóa, chuyển đổi hoặc trực quan hóa phù hợp từng loại biến, nâng cao độ chính xác và chuyên nghiệp của báo cáo
## [1] "PTON" "CROX" "ADDYY" "AMZN" "AAPL" "NKE" "TGT" "GOOGL" "SPOT"
## [10] "ZM" "DIS" "RBLX" "DAL" "COST" "LUV" "AEO" "TSLA" "SBUX"
## [19] "NVDA" "CRM" "HMC" "CL" "HSY" "CMG" "PINS" "LOGI" "SHOP"
## [28] "AMD" "AXP" "COIN" "MA" "MCD" "ADBE" "UL" "CSCO" "JPM"
## [37] "ABNB" "MAR" "TM" "HLT" "HD" "JNJ" "UBER" "PG" "FDX"
## [46] "MMM" "PHG" "FL" "KO" "MSFT" "V" "LVMUY" "ZI" "UBSFY"
## [55] "NFLX" "PMMAF" "NTDOY" "BAMXF" "POAHY" "TWTR" "JWN" "SQ"
Giải thích: Hàm unique() liệt kê tất cả các giá trị khác nhau (không lặp lại) xuất hiện trong biến Ticker.
Nhận xét:Điều này giúp xác định bộ dữ liệu gồm những thể loại phim nào, rất hữu ích khi phân tích đa dạng thể loại hoặc chuẩn bị cho việc vẽ biểu đồ/nhóm dữ liệu theo thể loại.
## [1] 62
Giải thích: Hàm này kết hợp unique() (lấy giá trị không lặp lại) và length() (đếm số lượng),
Nhận xét:cho ra số lượng thể loại phim khác biệt có mặt trong dữ liệu. Nhờ đó ta biết được độ đa dạng của biến này, qua đó đánh giá mức độ phân chia khi phân tích nhóm.
| Mã CK | Tần suất |
|---|---|
| AAPL | 6470 |
| ABNB | 1201 |
| ADBE | 6470 |
| ADDYY | 4854 |
| AEO | 6470 |
| AMD | 6470 |
| AMZN | 6470 |
| AXP | 6470 |
| BAMXF | 4158 |
| CL | 6469 |
| CMG | 4945 |
| COIN | 1117 |
| COST | 6470 |
| CRM | 5348 |
| CROX | 4937 |
| CSCO | 6470 |
| DAL | 4628 |
| DIS | 6470 |
| FDX | 6469 |
| FL | 6470 |
| GOOGL | 5308 |
| HD | 6469 |
| HLT | 2961 |
| HMC | 6469 |
| HSY | 6469 |
| JNJ | 6470 |
| JPM | 6470 |
| JWN | 6433 |
| KO | 6470 |
| LOGI | 6469 |
| LUV | 6470 |
| LVMUY | 4939 |
| MA | 4863 |
| MAR | 6471 |
| MCD | 6470 |
| MMM | 6470 |
| MSFT | 6470 |
| NFLX | 5872 |
| NKE | 6470 |
| NTDOY | 6465 |
| NVDA | 6470 |
| PG | 6469 |
| PHG | 6469 |
| PINS | 1617 |
| PMMAF | 3275 |
| POAHY | 3938 |
| PTON | 1506 |
| RBLX | 1141 |
| SBUX | 6470 |
| SHOP | 2602 |
| SPOT | 1879 |
| SQ | 2380 |
| TGT | 6470 |
| TM | 6469 |
| TSLA | 3833 |
| TWTR | 1 |
| UBER | 1602 |
| UBSFY | 3940 |
| UL | 6469 |
| V | 4407 |
| ZI | 1324 |
| ZM | 1617 |
Giải thích: Hàm table() đếm số lần xuất hiện của mỗi giá trị trong biến Ticker, trả về bảng tần suất của từng thể loại mã chứng khoán. Nhờ vậy, có thể dễ dàng nhận biết thể loại nào nhiều nhất hay ít để trong trực quan hóa hoặc phát hiện đặc điểm nổi bật.
Nhận xét chung: Bộ ba thao tác trên cho phép kiểm tra chi tiết đặc điểm biến phân loại: biết được danh sách thể loại, mức độ đa dạng và phân bố tần suất từng loại. Từ đó, bài phân tích trở nên đầy đủ, khoa học và sẵn sàng cho các phân tích nhóm hoặc trực quan hóa chuyên sâu hơn trong các bước tiếp theo.
giai_thich_bien <- data.frame(
`Tên Biến` = c(
"Date", "Open", "High", "Low", "Close", "Volume",
"Brand_Name", "Ticker", "Industry_Tag", "Country",
"Dividends", "Stock Splits", "Capital Gains" ),
`Ý Nghĩa Ngắn Gọn` = c(
"Ngày giao dịch.",
"Giá mở cửa: Giá đầu tiên trong phiên giao dịch.",
"Giá cao nhất: Giá cao nhất đạt được trong phiên.",
"Giá thấp nhất: Giá thấp nhất đạt được trong phiên.",
"Giá đóng cửa: Giá cuối cùng khi kết thúc phiên.",
"Khối lượng: Tổng số cổ phiếu được giao dịch.",
"Tên công ty hoặc thương hiệu.",
"Mã cổ phiếu trên sàn chứng khoán (ví dụ: VNM, AAPL).",
"Ngành nghề kinh doanh của công ty.",
"Quốc gia nơi công ty được niêm yết.",
"Cổ tức: Khoản lợi nhuận công ty chia cho cổ đông.",
"Tách cổ phiếu: Chia 1 cổ phiếu thành nhiều cổ phiếu mới.",
"Lãi vốn: Lợi nhuận từ việc bán cổ phiếu." ),
check.names = FALSE )
kable(giai_thich_bien, caption = "Bảng giải thích ý nghĩa các biến dữ liệu chứng khoán")| Tên Biến | Ý Nghĩa Ngắn Gọn |
|---|---|
| Date | Ngày giao dịch. |
| Open | Giá mở cửa: Giá đầu tiên trong phiên giao dịch. |
| High | Giá cao nhất: Giá cao nhất đạt được trong phiên. |
| Low | Giá thấp nhất: Giá thấp nhất đạt được trong phiên. |
| Close | Giá đóng cửa: Giá cuối cùng khi kết thúc phiên. |
| Volume | Khối lượng: Tổng số cổ phiếu được giao dịch. |
| Brand_Name | Tên công ty hoặc thương hiệu. |
| Ticker | Mã cổ phiếu trên sàn chứng khoán (ví dụ: VNM, AAPL). |
| Industry_Tag | Ngành nghề kinh doanh của công ty. |
| Country | Quốc gia nơi công ty được niêm yết. |
| Dividends | Cổ tức: Khoản lợi nhuận công ty chia cho cổ đông. |
| Stock Splits | Tách cổ phiếu: Chia 1 cổ phiếu thành nhiều cổ phiếu mới. |
| Capital Gains | Lãi vốn: Lợi nhuận từ việc bán cổ phiếu. |
Giải thích: Đoạn code này tạo một bảng giải thích ý nghĩa cho từng biến có trong bộ dữ liệu.Đầu tiên, data.frame được dùng để tạo một bảng với hai cột: Variable (tên biến) và Meaning (ý nghĩa chi tiết, giải thích chức năng/chủ đề từng biến). Việc liệt kê này giúp bạn hoặc người đọc nhanh chóng nắm được mỗi trường trong dữ liệu nói về điều gì.
Nhận xét: - Việc bổ sung bảng giải thích biến ngay từ đầu tiểu luận giúp người đọc không bị nhầm lẫn về tên trường, ý nghĩa và cách sử dụng, đặc biệt cần thiết khi tên biến là tiếng Anh hoặc viết tắt khó hiểu.
Việc này thể hiện sự khoa học, chuyên nghiệp và là điểm cộng rất lớn về hình thức khi trình bày báo cáo/tài liệu phân tích dữ liệu.
Nhờ bảng này, mọi thao tác, phân tích, trực quan hóa về sau đều trở nên mạch lạc và dễ tiếp cận cho bất kỳ ai sử dụng hay đọc lại báo cáo, ngay cả khi không quen với bộ dữ.
| x | |
|---|---|
| Date | 0 |
| Open | 0 |
| High | 0 |
| Low | 0 |
| Close | 0 |
| Volume | 0 |
| Brand_Name | 0 |
| Ticker | 0 |
| Industry_Tag | 0 |
| Country | 0 |
| Dividends | 0 |
| Stock.Splits | 0 |
| Capital.Gains | 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.library(knitr)
so_trung_lap <- sum(duplicated(d))
bang_ket_qua <- data.frame(`Nội dung kiểm tra` = "Tổng số dòng bị trùng lặp",
`Kết quả` = so_trung_lap)
kable(bang_ket_qua, caption = "Kết quả kiểm tra dữ liệu trùng lặp")| Nội.dung.kiểm.tra | Kết.quả |
|---|---|
| Tổng số dòng bị trùng lặp | 0 |
Giải thích: (1) Nạp thư viện (2-3) Tính tổng kết quả trùng lặp và tổng hợp kết quả (4) Lưu và hiển thị kết quả
=>Kết quả cho thấy bộ dữ liệu không có một biến anfo bị trùng lặp với nhau
library(dplyr)
library(knitr)
library(kableExtra)
first_row <- d %>%
filter(!is.na(Capital.Gains)) %>% head(1)
t(first_row) %>%
kable(col.names = c("Giá trị"), caption = "Chi tiết dòng đầu tiên sau khi xóa NA") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = F)| Giá trị | |
|---|---|
| Date | 2024-07-18 00:00:00-04:00 |
| Open | 47.375 |
| High | 47.375 |
| Low | 47.375 |
| Close | 47.375 |
| Volume | 0 |
| Brand_Name | puma |
| Ticker | PMMAF |
| Industry_Tag | apparel |
| Country | germany |
| Dividends | 0 |
| Stock.Splits | 0 |
| Capital.Gains | 0 |
Giải thích: (1-3): Nạp thư viện cần thiết (4-8): Sử
dụng filter() để giữ lại những dòng mà cột capital.Gains KHÔNG PHẢI là
NA.Lưu kết quả vào một dataframe mới để không ảnh hưởng đến dữ liệu gốc
d
Ý nghĩa: 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] TRUE
Giải thích: - Hàm is.na(movies_dataset) kiểm tra từng ô của toàn bộ dataset xem có phải là giá trị bị thiếu (NA) hay không, trả về một ma trận TRUE/FALSE tương ứng. - Hàm any() kiểm tra xem có ít nhất một giá trị NA nào xuất hiện không. Nếu có, kết quả là TRUE; nếu toàn bộ dữ liệu đều đầy đủ, kết quả là FALSE.
Nhận xét: Kết quả trả về [1] FALSE, có nghĩa là bộ dữ liệu của bạn không có bất kỳ giá trị nào bị thiếu ở bất kỳ cột hay dòng nào. Điều này giúp đảm bảo độ đầy đủ, không cần xử lý thay thếhoặc loại bỏ dòng bị thiếu, và tạo điều kiện tính toán chính xác cho các bước phân tích tiếp theo.
library(knitr)
d$Dividend_Paid <- ifelse(d$Dividends > 0, 1, 0)
dividend_summary <- table(d$Dividend_Paid)
kable(dividend_summary, col.names = c("Tình trạng chia cổ tức (0: Không, 1: Có)", "Số lượng"))| Tình trạng chia cổ tức (0: Không, 1: Có) | Số lượng |
|---|---|
| 0 | 307417 |
| 1 | 2705 |
ticker_column_name <- "Ticker"
ma_da_chia_co_tuc <- d[[ticker_column_name]][d$Dividend_Paid == 1]
ma_khong_chia_co_tuc <- d[[ticker_column_name]][d$Dividend_Paid == 0]Giải thích: (1): Nạp thư viện (2): Tạo thêm cột mới có tên Dividend_Panid trong data frame d (3): Tạo bảng tần suất và lưu biến dividend_summary (4): Hiển thị bảng (5): Tại biến tên ticker column name và gán nó cho chuỗi ký tự Ticker (6): Lọc lấy mã cổ phiếu đã được chai cổ tức (7): Hiển thị kế quả
Ý nghĩa:
Là các công ty tăng trưởng (Growth Companies): Đây là lý do phổ biến nhất. Các công ty này, đặc biệt là trong lĩnh vực công nghệ, dược phẩm sinh học, hoặc các ngành mới nổi, tin rằng họ có thể tạo ra lợi nhuận cho cổ đông tốt hơn bằng cách tái đầu tư toàn bộ lợi nhuận vào hoạt động kinh doanh. Tiền được dùng cho:Nghiên cứu và phát triển (R&D) sản phẩm mới,mở rộng thị trường, xây dựng nhà máy,các chiến dịch marketing lớn,thâu tóm các công ty khác.
Công ty đang trong giai đoạn khó khăn hoặc không có lợi nhuận: Nhiều công ty, đặc biệt là các công ty mới hoặc đang trong giai đoạn tái cấu trúc, đơn giản là không có đủ lợi nhuận hoặc dòng tiền dư thừa để trả cho cổ đông. Việc giữ lại tiền mặt là cần thiết để tồn tại.
Lựa chọn chiến lược của ban lãnh đạo: Một số công ty có lợi nhuận nhưng vẫn chọn không trả cổ tức. Ban lãnh đạo, như Warren Buffett tại Berkshire Hathaway, tin rằng họ có khả năng phân bổ vốn (tái đầu tư) hiệu quả hơn so với việc để các cổ đông tự đầu tư số tiền cổ tức nhận được.
Là các công ty trưởng thành, ổn định (Mature/Value Companies): Các công ty này thường hoạt động trong các ngành đã bão hòa, có ít cơ hội tăng trưởng đột phá. Họ tạo ra dòng tiền đều đặn, ổn định và dư thừa so với nhu cầu tái đầu tư. Các ngành điển hình: Hàng tiêu dùng thiết yếu (ví dụ: Coca-Cola, Procter & Gamble), tiện ích công cộng (điện, nước),viễn thông lớn,ngân hàng.
Tín hiệu về sức khỏe tài chính: Việc cam kết trả cổ tức đều đặn là một tín hiệu mạnh mẽ mà ban lãnh đạo gửi đến thị trường, cho thấy họ tự tin vào sự ổn định và khả năng tạo ra lợi nhuận trong tương lai của công ty. Điều này giúp xây dựng lòng tin cho nhà đầu tư.
Thu hút một nhóm nhà đầu tư cụ thể: Các công ty trả cổ tức thường hấp dẫn các nhà đầu tư thu nhập (Income Investors), chẳng hạn như các quỹ hưu trí hoặc người về hưu, những người cần một dòng tiền mặt đều đặn từ các khoản đầu tư của họ.
Date để mô
hình hiểu được các yếu tố thời gian.library(dplyr)
library(lubridate)
library(knitr)
library(kableExtra)
first_row_featured <- d %>%
mutate( Date = ymd(Date), Year = year(Date),
Month = month(Date, label = TRUE, abbr = FALSE) ) %>%
head(1)
t(first_row_featured) %>%
kable(col.names = c("Giá trị"),
caption = "Chi tiết dòng đầu tiên sau khi trích xuất đặc trưng thời gian") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Giá trị | |
|---|---|
| Date | NA |
| Open | 6.63 |
| High | 6.74 |
| Low | 6.615 |
| Close | 6.64 |
| Volume | 4209664 |
| Brand_Name | peloton |
| Ticker | PTON |
| Industry_Tag | fitness |
| Country | usa |
| Dividends | 0 |
| Stock.Splits | 0 |
| Capital.Gains | NA |
| Dividend_Paid | 0 |
| Year | NA |
| Month | NA |
Giải thích: (1-4): nạp thư viện vào phiên làm việc.
(5-8): Xử lý dữ liệu và lấy ra dòng đầu tiên Tạo ra các cột mới hoặc
chỉnh sửa cột cũ. (9): Chuyển vị và Tạo bảng dọc (10): Kết quả sau khi
xoay dọc được đưa vào hàm kable để tạo bảng. (11): Thêm một
tiêu đề chung cho cả bảng. (12): Thêm các tùy chỉnh để bảng đẹp hơn.
Nhận xét: 1. Sự ổn định về giá:Cổ
phiếu mở cửa ở giá 6.63 và đóng cửa ở 6.64.
Mức chênh lệch là không đáng kể. * Ý nghĩa: Điều này
cho thấy trong suốt ngày hôm đó, lực mua và lực bán gần như cân
bằng. Không có tin tức hay sự kiện nào đủ mạnh để đẩy giá tăng
vọt hay giảm sâu. Nhà đầu tư đang ở trạng thái “chờ xem”.
gia_tri_giao_dich).
Dividends (Cổ tức) và Stock.Splits (Tách cổ
phiếu) đều bằng 0.
=> Bạn có thể hình dung đây là một khu chợ rất đông đúc (khối lượng giao dịch lớn), nhưng giá của món hàng (cổ phiếu Peloton) lại gần như không thay đổi từ sáng đến chiều.
library(zoo)
library(dplyr)
library(ggplot2)
df_features <- d %>%
arrange(Ticker, Date) %>%
mutate(Daily_Return = (Close - Open) / Open,
Price_Range = High - Low ) %>%
group_by(Ticker) %>%
mutate( MA_3_Days = rollmean(Close, k = 3, fill = NA, align = "right"),
Volatility_3_Days = rollapply(Daily_Return, width = 3, FUN = sd, fill = NA, align = "right")) %>%
ungroup() %>%
mutate( MA_3_Days = ifelse(is.na(MA_3_Days), 0, MA_3_Days),
Volatility_3_Days = ifelse(is.na(Volatility_3_Days), 0, Volatility_3_Days))
df_features %>%
select(Ticker, Close, Daily_Return, Price_Range, MA_3_Days, Volatility_3_Days) %>%
head(5) %>%
kable(caption = "Kết quả tạo đặc trưng tài chính ", digits = 4)| Ticker | Close | Daily_Return | Price_Range | MA_3_Days | Volatility_3_Days |
|---|---|---|---|---|---|
| AAPL | 0.8483 | 0.0673 | 0.0819 | 0.0000 | 0.0000 |
| AAPL | 0.7768 | -0.0531 | 0.0715 | 0.0000 | 0.0000 |
| AAPL | 0.7882 | 0.0024 | 0.0573 | 0.8044 | 0.0603 |
| AAPL | 0.7200 | -0.1048 | 0.0909 | 0.7616 | 0.0536 |
| AAPL | 0.7541 | 0.0311 | 0.0417 | 0.7541 | 0.0716 |
Giải thích: (1-3) nạp thư viện (4) Chuẩn bị dữ liệu.
(5-7) Sắp xếp và Tính toán các đặc trưng cơ bản. (8) Nhóm dữ liệu theo
từng mã chứng khoán. (9-10) Tính toán các đặc trưng “cuốn chiếu”
(Rolling Features) (11-12) Bỏ nhóm và xử lý giá trị NA (13-15) Hiển thị
kết quả cuối cùng 1. Ticker (Mã chứng
khoán) Đây là mã định danh duy nhất của công ty trên sàn giao
dịch. AAPL là mã của công ty Apple. Cột này giúp xác định
dữ liệu thuộc về cổ phiếu nào.
2. Close (Giá đóng cửa) Đây là giá của
cổ phiếu tại thời điểm kết thúc phiên giao dịch của một ngày cụ thể. Đây
thường là con số quan trọng nhất, được sử dụng làm cơ sở cho hầu hết các
phép tính kỹ thuật khác. Các giá trị trong cột này 0.8483,
0.7768 có vẻ đã được chuẩn hóa
(normalized) hoặc điều chỉnh (adjusted) theo
một cách nào đó (ví dụ: điều chỉnh theo chia tách cổ phiếu, hoặc chuẩn
hóa theo một giá trị cơ sở). Giá trị thực của cổ phiếu Apple không phải
là dưới 1 đô la.
3. Daily_Return (Tỷ suất sinh lợi hàng
ngày)Đây là thước đo phần trăm thay đổi của giá cổ phiếu so với
ngày hôm trước. Nó cho biết cổ phiếu đã tăng hay giảm giá bao nhiêu phần
trăm trong một ngày. * Công thức tính (ước tính):
Daily_Return của ngày hôm nay = (Close hôm nay
- Close hôm qua) / Close hôm qua. Dòng thứ 2
có Daily_Return là -0.0531, nghĩa là giá cổ
phiếu đã giảm 5.31% so với ngày hôm trước. Dòng thứ 3 có
Daily_Return là 0.0024, nghĩa là giá tăng
0.24%.
4. Price_Range (Biên độ giá) Cột này đo
lường mức độ biến động giá trong một ngày. Nó cho thấy sự chênh lệch
giữa giá cao nhất (High) và giá thấp nhất
(Low) trong ngày, thường được tính theo tỷ lệ phần trăm so
với giá đóng cửa hoặc giá mở cửa. * Công thức tính (ước
tính): Price_Range = (High -
Low) / Close.Price_Range cao cho
thấy ngày hôm đó thị trường có nhiều biến động và bất ổn.
Price_Range thấp cho thấy một ngày giao dịch tương đối ổn
định.
5. MA_3_Days (Đường trung bình động 3 ngày -
3-Day Moving Average) Đây là một chỉ báo làm mượt dữ liệu giá.
Nó là giá trị trung bình của giá đóng cửa (Close) trong 3
ngày gần nhất (bao gồm cả ngày hiện tại). * Công thức tính (ước
tính): MA_3_Days của ngày hôm nay =
(Close hôm nay + Close hôm qua +
Close hôm kia) / 3.Ở dòng thứ 3, MA_3_Days là
0.8044, được tính từ trung bình của 0.8483,
0.7768, và 0.7882. Hai dòng đầu tiên có giá
trị 0.0000 vì không có đủ 2 ngày dữ liệu trước đó để tính
trung bình 3 ngày. Đây là điều bình thường khi tính toán các chỉ số trễ
(lagged indicators).
6. Volatility_3_Days (Độ biến động 3
ngày) Cột này đo lường mức độ rủi ro hoặc biến động của tỷ suất
sinh lợi trong 3 ngày gần nhất. Nó thường được tính bằng độ lệch
chuẩn (standard deviation) của Daily_Return trong
khoảng thời gian đó. * Công thức tính (ước tính):
Volatility_3_Days của ngày hôm nay = Độ lệch chuẩn của
(Daily_Return hôm nay, Daily_Return hôm qua,
Daily_Return hôm kia). Giá trị Volatility cao
cho thấy tỷ suất sinh lợi của cổ phiếu thay đổi rất nhiều và khó đoán
(rủi ro cao). Giá trị thấp cho thấy tỷ suất sinh lợi ổn định hơn (rủi ro
thấp hơn).Tương tự như MA_3_Days, hai dòng đầu tiên có giá
trị là 0.0000 vì không có đủ dữ liệu để tính độ lệch chuẩn
cho 3 ngày.
danh_sach_chia_duy_nhat <- unique(ma_da_chia_co_tuc)
danh_sach_khong_chia_duy_nhat <- unique(ma_khong_chia_co_tuc)
cty_chia <- head(danh_sach_chia_duy_nhat)
cty_khong_chia <- head(danh_sach_khong_chia_duy_nhat)
bang_so_sanh <- data.frame(
"công_ty_đã_chia_cổ_tức" = cty_chia,
"công_ty_không_chia_cổ_tức" = cty_khong_chia)
kable(bang_so_sanh, caption = "So sánh các công ty chia và không chia cổ tức") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)| công_ty_đã_chia_cổ_tức | công_ty_không_chia_cổ_tức |
|---|---|
| AXP | PTON |
| CSCO | CROX |
| JPM | ADDYY |
| DIS | AMZN |
| FDX | AAPL |
| CRM | NKE |
library(tidyverse)
result <- d %>%
distinct(Ticker, .keep_all = TRUE) %>%
group_by(Country) %>%
summarise(Tickers = paste(Ticker," ", collapse = ", "))
kable(result)| Country | Tickers |
|---|---|
| canada | SHOP |
| france | LVMUY , UBSFY |
| germany | ADDYY , PMMAF , BAMXF , POAHY |
| japan | HMC , TM , NTDOY |
| netherlands | UL , PHG |
| switzerland | LOGI |
| usa | PTON , CROX , AMZN , AAPL , NKE , TGT , GOOGL , SPOT , ZM , DIS , RBLX , DAL , COST , LUV , AEO , TSLA , SBUX , NVDA , CRM , CL , HSY , CMG , PINS , AMD , AXP , COIN , MA , MCD , ADBE , CSCO , JPM , ABNB , MAR , HLT , HD , JNJ , UBER , PG , FDX , MMM , FL , KO , MSFT , V , ZI , NFLX , TWTR , JWN , SQ |
Giải thích code: (1) Tải bộ thư viện tidyverse (2-3)
Bắt đầu với toàn bộ data frame ‘d’ Lấy các mã chứng khoán duy nhất
(distinct). (4) Nhóm dữ liệu theo quốc gia
(group_by). (5) Tổng hợp và nối các mã chứng khoán
(summarise) (6) Hiển thị kết quả (kable)
Ý nghĩa:Đ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).hậ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.
##
## 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.
library(knitr)
library(kableExtra)
d %>% group_by(Country) %>%
summarise( So_Luong_Cong_Ty = n(),
Tong_KLGD = sum(Volume, na.rm = TRUE) ) %>%
arrange(desc(So_Luong_Cong_Ty)) %>%
kable(caption = "Tổng hợp theo Quốc gia", format = "latex",
booktabs = TRUE,longtable = TRUE) %>%
kable_styling(latex_options = c("striped", "hold_position"))Giải thích: (1-2) Nạp thư viện (3-5) Nhóm dữ liệu
theo quốc gia (group_by).Tổng hợp và nối các mã chứng khoán
(summarise). (6)Sắp xếp (arrange). (7-9) Hiển
thị kết quả (`kable).
Ý nghĩa:
1.Sự Thống Trị của Thị trường Vốn Hoa Kỳ (USA)
library(scales)
d %>%
mutate(Date = as_date(Date)) %>%
mutate(Year = year(Date), Month = month(Date)) %>%
group_by(Industry_Tag, Year, Month) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE), .groups = 'drop') %>%
arrange(Year, Month, desc(Total_Volume)) %>%
mutate(Total_Volume = comma(Total_Volume, accuracy = 1)) %>%
head(5) %>%
kable(caption = "Tổng hợp khối lượng giao dịch (KLGD) theo Ngành, Năm và Tháng",
col.names = c("Ngành", "Năm", "Tháng", "Tổng KLGD")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| Ngành | Năm | Tháng | Tổng KLGD |
|---|---|---|---|
| technology | 2000 | 1 | 15,710,613,400 |
| e-commerce | 2000 | 1 | 5,244,180,000 |
| food & beverage | 2000 | 1 | 852,012,800 |
| retail | 2000 | 1 | 330,887,600 |
| finance | 2000 | 1 | 320,562,079 |
Giải thích: (1) Nạp thư viện (2-3)Trích xuất Năm
(mutate). (4) Nhóm dữ liệu (group_by). (5-6)
Tính toán các chỉ số thống kê (summarise). (7-8) Sắp xếp
(arrange) và Định dạng (mutate). (9-11) Tạo
bảng hiển thị (kable và kable_styling)
Ý nghĩa:
technology có KLGD lên tới 15.7 tỷ, cao
gần gấp 3 lần so với ngành đứng thứ hai là
e-commerce (5.2 tỷ). Điều này cho thấy một lượng vốn khổng
lồ và sự quan tâm tột độ của các nhà đầu tư đang đổ dồn vào lĩnh vực
công nghệ.d %>% mutate(Price_Cat = cut(Close, breaks = c(-Inf, 100, 500, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"), right = FALSE),
Volume_Cat = cut(Volume,breaks = c(-Inf, 1000000, 5000000, Inf),
labels = c("Khối lượng thấp", "Khối lượng trung bình", "Khối lượng lớn"),
right = FALSE),
Price_Volume_Category = paste(Price_Cat, Volume_Cat, sep = " - ")) %>%
select(Brand_Name, Ticker, Close, Volume, Price_Volume_Category) %>%
head(5) %>%
kable(caption = "Phân loại cổ phiếu theo mối quan hệ Giá và Khối lượng",
col.names = c("Thương hiệu", "Mã CK", "Giá", "Khối lượng", "Phân loại Giá-KL"),
align = 'l') %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| Thương hiệu | Mã CK | Giá | Khối lượng | Phân loại Giá-KL |
|---|---|---|---|---|
| peloton | PTON | 6.64 | 4209664 | Giá thấp - Khối lượng trung bình |
| crocs | CROX | 107.34 | 560190 | Giá trung bình - Khối lượng thấp |
| adidas | ADDYY | 121.93 | 36600 | Giá trung bình - Khối lượng thấp |
| amazon | AMZN | 223.41 | 29295154 | Giá trung bình - Khối lượng lớn |
| apple | AAPL | 213.55 | 34697317 | Giá trung bình - Khối lượng lớn |
Giải thích: (1-7)Trích xuất Năm
(mutate). (8) Chọn tên các biến. (9) chọn 5 dòng đầu.
(10-13) Tạo bảng hiển thị (kable và
kable_styling)
Ý nghĩa:
amazon (AMZN),
apple (AAPL), google (GOOGL): Đây là nhóm
dẫn dắt thị trường (Market Leaders). Đây là những cổ
phiếu blue-chip, xương sống của nền kinh tế số.
nike (NKE): Đây là
nhóm cổ phiếu đại chúng, có sức hút lớn.
spotify (SPOT):
Đây là nhóm cổ phiếu có thị giá cao, kén nhà đầu tư.
peloton (PTON), target (TGT),
zoom video communications (ZM): Đây là nhóm các
công ty được biết đến rộng rãi nhưng không phải là tâm điểm giao
dịch.
crocs (CROX),
adidas (ADDYY): Đây là nhóm cổ phiếu có thanh khoản
thấp hơn.
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") %>%
mutate(Price_Tier = cut(gia_tri,breaks = c(-Inf, 100, 1000, Inf),labels = c("Giá thấp", "Giá trung bình", "Giá cao"), right = FALSE),
Liquidity_Tier = cut(khoi_luong,
breaks = c(-Inf, 10000000, 1000000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),
right = FALSE)) %>%
arrange(Month, Industry_Tag) %>%head(5) %>%
mutate(gia_tri = round(gia_tri, 2), khoi_luong = comma(khoi_luong, accuracy = 1) ) %>%
kable(caption = "Phân loại Giá và Thanh khoản trung bình theo Ngành, Quốc gia và Tháng",
col.names = c("Tháng", "Ngành", "Quốc gia", "Giá TB", "KLGD TB", "Phân loại Giá", "Phân loại KL"),align = 'l' ) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),full_width = FALSE )| Tháng | Ngành | Quốc gia | Giá TB | KLGD TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|---|
| January | apparel | germany | 63.01 | 32,950 | Giá thấp | Thanh khoản thấp |
| January | apparel | usa | 28.28 | 7,577,394 | Giá thấp | Thanh khoản thấp |
| January | automotive | germany | 37.64 | 93,028 | Giá thấp | Thanh khoản thấp |
| January | automotive | japan | 63.73 | 539,808 | Giá thấp | Thanh khoản thấp |
| January | automotive | usa | 105.17 | 99,645,814 | Giá trung bình | Thanh khoản trung bình |
Giải thích: (1-2)Trích xuất Năm
(mutate). (3) Nhóm dữ liệu (group_by). (4-10)
Tính toán các chỉ số thống kê (summarise). (11-15) Sắp xếp
(arrange) và Định dạng (mutate). (16-18) Tạo
bảng hiển thị (kable và kable_styling)
**Ý nghĩa:*
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.
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_Cat_Temp = cut(Avg_Close,breaks = c(-Inf, 100, 500, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"),right = FALSE),
Volume_Cat_Temp = cut(Avg_Volume, breaks = c(-Inf, 1000000, 5000000, Inf),
labels = c("Khối lượng thấp", "Khối lượng trung bình", "Khối lượng lớn"), right = FALSE),
Price_Volume_Category = paste(Price_Cat_Temp, Volume_Cat_Temp, sep = " - ")) %>%
arrange(Year, Industry_Tag, Country) %>%select(Year, Industry_Tag, Country, Avg_Close, Avg_Volume, Price_Volume_Category) %>%
head(5) %>%mutate(Avg_Close = round(Avg_Close, 2),Avg_Volume = comma(Avg_Volume, accuracy = 1) ) %>%
kable( caption = "Phân loại đặc tính Ngành theo Quốc gia và Năm",
col.names = c("Năm", "Ngành", "Quốc gia", "Giá TB", "KLGD TB", "Phân loại"),align = 'l') %>%
kable_styling( latex_options = c("striped", "hold_position", "scale_down"), full_width = FALSE)| Năm | Ngành | Quốc gia | Giá TB | KLGD TB | Phân loại |
|---|---|---|---|---|---|
| 2000 | apparel | usa | 3.75 | 7,902,543 | Giá thấp - Khối lượng lớn |
| 2000 | automotive | japan | 38.62 | 48,648 | Giá thấp - Khối lượng thấp |
| 2000 | aviation | usa | 13.36 | 2,735,833 | Giá thấp - Khối lượng trung bình |
| 2000 | consumer goods | netherlands | 6.82 | 320,459 | Giá thấp - Khối lượng thấp |
| 2000 | consumer goods | usa | 17.90 | 6,976,633 | Giá thấp - Khối lượng lớn |
Giải thích: (1)Trích xuất Năm (mutate).
(2) Nhóm dữ liệu (group_by). (3-8) Tính toán các chỉ số
thống kê (summarise). (9-10) Sắp xếp (arrange)
và Định dạng (mutate). (11-13) Tạo bảng hiển thị
(kable và kable_styling)
Ý nghĩa:
e-commerce (Thương mại điện tử) tại
Mỹ:
entertainment (giải trí),
finance (tài chính), healthcare (chăm sóc sức
khỏe) tại Mỹ cũng được xếp vào nhóm “Giá thấp - Khối lượng lớn”. Điều
này cho thấy tâm lý đầu cơ đã lan tỏa rộng khắp thị trường Mỹ, không chỉ
giới hạn trong lĩnh vực công nghệ thuần túy.Sự thống trị tuyệt đối của thị trường Mỹ (USA)
Sự tương phản giữa “Kinh tế Mới” và “Kinh tế Cũ”
automotive (ô tô) tại Nhật Bản: Có mức
Giá TB khá cao (38.62 USD), cho thấy đây là các công ty
có giá trị, đã thành lập lâu đời. Tuy nhiên, KLGD TB lại cực kỳ
thấp (chỉ 48,648 cổ phiếu).
consumer goods (hàng tiêu dùng) tại Hà Lan: Tương
tự, giá thấp và khối lượng cũng rất thấp.d %>%
filter(Country == "usa") %>%
mutate( Date = as.Date(Date), Month = month(Date, label = TRUE, abbr = FALSE) ) %>%
group_by(Month, Industry_Tag) %>%
summarise(
gia_tri_tb = mean(Close, na.rm = TRUE),
khoi_luong_tb = mean(Volume, na.rm = TRUE),
.groups = "drop") %>%mutate(
Price_Tier = cut(gia_tri_tb,
breaks = c(-Inf, 100, 300, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"),
right = FALSE),
Liquidity_Tier = cut(khoi_luong_tb,
breaks = c(-Inf, 5000000, 20000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),
right = FALSE)) %>%
arrange(Month, Industry_Tag) %>%
head(5) %>%
mutate(gia_tri_tb = round(gia_tri_tb, 2),khoi_luong_tb = comma(khoi_luong_tb, accuracy = 1)) %>%
kable(caption = "Phân tích đặc tính Ngành tại Mỹ theo Tháng", col.names = c("Tháng", "Ngành", "Giá TB", "KLGD TB", "Phân loại Giá", "Phân loại KL"),
align = 'l' ) %>%
kable_styling(latex_options = c("striped", "hold_position", "scale_down"),
full_width = FALSE)| Tháng | Ngành | Giá TB | KLGD TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|
| January | apparel | 28.28 | 7,577,394 | Giá thấp | Thanh khoản trung bình |
| January | automotive | 105.17 | 99,645,814 | Giá trung bình | Thanh khoản cao |
| January | aviation | 29.13 | 9,020,861 | Giá thấp | Thanh khoản trung bình |
| January | consumer goods | 56.52 | 7,319,693 | Giá thấp | Thanh khoản trung bình |
| January | cryptocurrency | 177.10 | 11,337,161 | Giá trung bình | Thanh khoản trung bình |
Giải thích: (1-2)Trích xuất Năm
(mutate). (3) Nhóm dữ liệu (group_by). (4-10)
Tính toán các chỉ số thống kê (summarise). (11-15) Sắp xếp
(arrange) và Định dạng (mutate). (16-18) Tạo
bảng hiển thị (kable và kable_styling)
Ý nghĩa: Nhóm Thanh Khoản Cao
automotive (Ô tô) và
e-commerce (Thương mại điện tử). automotive:
“Giá trung bình - Thanh khoản cao” (KLGD TB: ~100 triệu)
e-commerce: “Giá thấp - Thanh khoản cao” (KLGD TB: ~138
triệu)e-commerce có thể là nơi tập trung
nhiều hoạt động đầu cơ và giao dịch lướt sóng của các
nhà đầu tư nhỏ lẻ, bị hấp dẫn bởi các cổ phiếu giá rẻ và có nhiều biến
động.Nhóm Giá Cao
food (Thực phẩm). “Giá cao -
Thanh khoản thấp” (Giá TB: 316.62 USD, KLGD TB: 4 triệu)Nhóm Thanh Khoản Trung Bình
apparel, aviation,
consumer goods, cryptocurrency,
entertainment, finance Hầu hết đều có “Giá
thấp” hoặc “Giá trung bình” và “Thanh khoản trung bình”.cryptocurrency: Việc
ngành tiền điện tử được xếp vào nhóm “Giá trung bình - Thanh khoản trung
bình” cho thấy các cổ phiếu liên quan đến crypto (như sàn giao dịch,
công ty đào coin) đã trở thành một phần chính thức và được giao dịch
đáng kể trên thị trường, không còn là một lĩnh vực quá nhỏ lẻ.Nhóm Thanh Khoản Thấp
food (đã phân tích) và
footwear (Giày dép). “Giá thấp - Thanh khoản thấp”d %>% filter(Country == "usa") %>%
mutate( Date = as.Date(Date), Year = year(Date) ) %>%
group_by(Year, Industry_Tag) %>%
summarise(
gia_tri_tb = mean(Close, na.rm = TRUE),
khoi_luong_tb = mean(Volume, na.rm = TRUE),
.groups = "drop" ) %>%mutate( Price_Tier = cut(gia_tri_tb,breaks = c(-Inf, 100, 300, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"),right = FALSE),
Liquidity_Tier = cut(khoi_luong_tb, breaks = c(-Inf, 5000000, 20000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),
right = FALSE) ) %>%
arrange(Year, Industry_Tag) %>%
head(5) %>%
mutate( gia_tri_tb = round(gia_tri_tb, 2), khoi_luong_tb = comma(khoi_luong_tb, accuracy = 1) ) %>%
kable(caption = "Phân tích đặc tính Ngành tại Mỹ theo Năm",col.names = c("Năm", "Ngành", "Giá TB", "KLGD TB", "Phân loại Giá", "Phân loại KL"),
align = 'l') %>%kable_styling( latex_options = c("striped", "hold_position", "scale_down"), full_width = FALSE)| Năm | Ngành | Giá TB | KLGD TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|
| 2000 | apparel | 3.75 | 7,902,543 | Giá thấp | Thanh khoản trung bình |
| 2000 | aviation | 13.36 | 2,735,833 | Giá thấp | Thanh khoản thấp |
| 2000 | consumer goods | 17.90 | 6,976,633 | Giá thấp | Thanh khoản trung bình |
| 2000 | e-commerce | 2.33 | 175,159,333 | Giá thấp | Thanh khoản cao |
| 2000 | entertainment | 28.78 | 5,991,648 | Giá thấp | Thanh khoản trung bình |
Giải thích: (1-2)Trích xuất Năm
(mutate). (3) Nhóm dữ liệu (group_by). (4-10)
Tính toán các chỉ số thống kê (summarise). (11-15) Sắp xếp
(arrange) và Định dạng (mutate). (16-18) Tạo
bảng hiển thị (kable và kable_styling)
Ý nghĩa: 1. Tâm chấn của Bong bóng Dot-com: “Giá thấp - Thanh khoản cao”
Đây là câu chuyện chính của bảng dữ liệu này.
e-commerce (Thương mại điện tử)
và technology (Công nghệ).
e-commerce: Giá TB chỉ 2.33 USD nhưng
KLGD TB lên tới 175 triệu cổ phiếu.technology: Giá TB 21.12 USD và KLGD
TB là 111 triệu cổ phiếu.Hiện tượng “Thị trường giá rẻ”
Một đặc điểm gây kinh ngạc là 100% các ngành trong danh sách đều được phân loại là “Giá thấp” (Giá TB < 100 USD).
e-commerce và technology.apparel (may mặc),
consumer goods (hàng tiêu dùng), finance (tài
chính).aviation (hàng
không), food (thực phẩm), manufacturing (sản
xuất), logistics.d %>% filter(Country == "germany") %>%
mutate( Date = as.Date(Date), Month = month(Date, label = TRUE, abbr = FALSE)) %>%
group_by(Month, Industry_Tag) %>%
summarise(gia_tri_tb = mean(Close, na.rm = TRUE), khoi_luong_tb = mean(Volume, na.rm = TRUE),
.groups = "drop") %>% mutate(
Price_Tier = cut(gia_tri_tb,breaks = c(-Inf, 100, 300, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"),right = FALSE),
Liquidity_Tier = cut(khoi_luong_tb,breaks = c(-Inf, 5000000, 20000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),
right = FALSE)) %>%
arrange(Month, Industry_Tag) %>%
head(5) %>%
mutate( gia_tri_tb = round(gia_tri_tb, 2), khoi_luong_tb = comma(khoi_luong_tb, accuracy = 1) ) %>%
select(Tháng = Month, Ngành = Industry_Tag, `Giá TB` = gia_tri_tb,
`KLGD TB` = khoi_luong_tb, `Phân loại Giá` = Price_Tier, `Phân loại KL` = Liquidity_Tier) %>%
kable( caption = "Phân tích đặc tính Ngành tại Đức theo Tháng",
align = 'l' ) %>%
kable_styling( latex_options = c("striped", "hold_position", "scale_down"), full_width = FALSE)| Tháng | Ngành | Giá TB | KLGD TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|
| January | apparel | 63.01 | 32,950 | Giá thấp | Thanh khoản thấp |
| January | automotive | 37.64 | 93,028 | Giá thấp | Thanh khoản thấp |
| February | apparel | 61.93 | 38,048 | Giá thấp | Thanh khoản thấp |
| February | automotive | 36.88 | 75,268 | Giá thấp | Thanh khoản thấp |
| March | apparel | 59.85 | 43,874 | Giá thấp | Thanh khoản thấp |
Giải thích: (1-2)Trích xuất Năm
(mutate). (3) Nhóm dữ liệu (group_by). (4-10)
Tính toán các chỉ số thống kê (summarise). (11-15) Sắp xếp
(arrange) và Định dạng (mutate). (16-18) Tạo
bảng hiển thị (kable và kable_styling)
Ý nghĩa:
automotive (ô tô) và apparel (may mặc, có thể
bao gồm cả các thương hiệu thể thao lớn như Adidas) là những trụ cột của
nền kinh tế Đức. Chúng là những công ty trưởng thành, không phải là các
startup công nghệ tăng trưởng nóng.automotive luôn duy trì quanh mức $36-$37. Điều này củng cố
thêm cho nhận định về một thị trường ổn định.automotive có khối lượng giao dịch tăng đột biến nhẹ vào
tháng Ba và tháng Năm. Điều này có thể trùng với các sự kiện của công ty
như báo cáo kết quả kinh doanh quý, đại hội cổ đông, hoặc các thông báo
quan trọng, thu hút sự chú ý tạm thời của thị trường.d %>%
filter(Country == "germany") %>%
mutate(Date = as.Date(Date),Year = year(Date)) %>%
group_by(Year, Industry_Tag) %>%
summarise(gia_tri_tb = mean(Close, na.rm = TRUE),
khoi_luong_tb = mean(Volume, na.rm = TRUE),.groups = "drop") %>%
mutate(Price_Tier = cut(gia_tri_tb, breaks = c(-Inf, 100, 300, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"),right = FALSE),
Liquidity_Tier = cut(khoi_luong_tb, breaks = c(-Inf, 5000000, 20000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),
right = FALSE)) %>%
arrange(Year, Industry_Tag) %>%
head(5) %>%
mutate(gia_tri_tb = round(gia_tri_tb, 2),
khoi_luong_tb = comma(khoi_luong_tb, accuracy = 1)) %>%
select(Năm = Year, Ngành = Industry_Tag, `Giá TB` = gia_tri_tb,
`KLGD TB` = khoi_luong_tb, `Phân loại Giá` = Price_Tier, `Phân loại KL` = Liquidity_Tier) %>%
kable( caption = "Phân tích đặc tính Ngành tại Đức theo Năm",
align = 'l' ) %>%
kable_styling(latex_options = c("striped", "hold_position", "scale_down"),full_width = FALSE)| Năm | Ngành | Giá TB | KLGD TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|
| 2006 | apparel | 19.20 | 24,752 | Giá thấp | Thanh khoản thấp |
| 2007 | apparel | 23.92 | 41,278 | Giá thấp | Thanh khoản thấp |
| 2008 | apparel | 23.03 | 56,483 | Giá thấp | Thanh khoản thấp |
| 2009 | apparel | 17.57 | 37,355 | Giá thấp | Thanh khoản thấp |
| 2009 | automotive | 25.65 | 1,199 | Giá thấp | Thanh khoản thấp |
Giải thích: (1-3)Trích xuất Năm
(mutate). (4) Nhóm dữ liệu (group_by). (5-11)
Tính toán các chỉ số thống kê (summarise). (12-17) Sắp xếp
(arrange) và Định dạng (mutate). (18-20) Tạo
bảng hiển thị (kable và kable_styling)
Ý nghĩa: 1. Sự nhất quán đáng kinh ngạc: “Giá thấp - Thanh khoản thấp” là quy luận
Giai đoạn 2006-2014 bao trọn cuộc khủng hoảng tài chính, và dữ liệu này cho thấy cách thị trường Đức phản ứng.
apparel (may mặc), Giá TB giảm từ
23.03 (2008) xuống còn 17.57 (2009).
Đây là tác động rõ ràng của cuộc suy thoái kinh tế toàn cầu.automotive (ô tô) năm
2009 có KLGD TB chỉ 1,199. Đây là con
số cực kỳ thấp, cho thấy thị trường gần như “đóng
băng”. Các nhà đầu tư trong giai đoạn khủng hoảng đã co cụm
lại, ngừng giao dịch, thể hiện sự thận trọng tột độ.apparel
tăng đều đặn từ 17.57 lên 37.35 vào năm 2013.automotive và apparel là những ngành
công nghiệp sản xuất cốt lõi, là niềm tự hào của Đức. Chúng được xây
dựng dựa trên kỹ thuật, chất lượng và thương hiệu lâu đời.d %>%filter(Dividends > 0) %>%
mutate( Date = as.Date(Date),Year = year(Date)) %>%
group_by(Year, Industry_Tag, Country) %>%
summarise(gia_tri_tb = mean(Close, na.rm = TRUE),
khoi_luong_tb = mean(Volume, na.rm = TRUE),
co_tuc_tb = mean(Dividends, na.rm = TRUE),.groups = "drop" ) %>%
mutate( Price_Tier = cut(gia_tri_tb, breaks = c(-Inf, 100, 300, Inf),
labels = c("Giá thấp", "Giá trung bình", "Giá cao"), right = FALSE),
Liquidity_Tier = cut(khoi_luong_tb,breaks = c(-Inf, 3000000, 10000000, Inf),
labels = c("Thanh khoản thấp", "Thanh khoản trung bình", "Thanh khoản cao"),right = FALSE)) %>%
arrange(Year, Country, Industry_Tag) %>% head(5) %>%
mutate(gia_tri_tb = round(gia_tri_tb, 2), khoi_luong_tb = comma(khoi_luong_tb, accuracy = 1),
co_tuc_tb = round(co_tuc_tb, 4) ) %>%
select(Năm = Year, Ngành = Industry_Tag, Quốc_gia = Country,
`Giá TB` = gia_tri_tb, `KLGD TB` = khoi_luong_tb, `Cổ tức TB` = co_tuc_tb,
`Phân loại Giá` = Price_Tier, `Phân loại KL` = Liquidity_Tier) %>%
kable(caption = "Phân tích đặc tính các Ngành có chia cổ tức theo Năm và Quốc gia",
align = 'l') %>%
kable_styling(latex_options = c("striped", "hold_position", "scale_down"),full_width = FALSE)| Năm | Ngành | Quốc_gia | Giá TB | KLGD TB | Cổ tức TB | Phân loại Giá | Phân loại KL |
|---|---|---|---|---|---|---|---|
| 2000 | automotive | japan | 39.69 | 60,900 | 0.1207 | Giá thấp | Thanh khoản thấp |
| 2000 | consumer goods | netherlands | 7.33 | 265,410 | 0.2311 | Giá thấp | Thanh khoản thấp |
| 2000 | technology | netherlands | 22.80 | 3,266,400 | 0.7304 | Giá thấp | Thanh khoản trung bình |
| 2000 | apparel | usa | 3.94 | 13,033,600 | 0.0075 | Giá thấp | Thanh khoản cao |
| 2000 | aviation | usa | 13.48 | 2,232,488 | 0.0040 | Giá thấp | Thanh khoản thấp |
Giải thích: (1-3)Trích xuất Năm
(mutate). (4) Nhóm dữ liệu (group_by). (5-11)
Tính toán các chỉ số thống kê (summarise). (12-17) Sắp xếp
(arrange) và Định dạng (mutate). (18-20) Tạo
bảng hiển thị (kable và kable_styling)
*Ý nghĩa:** 1. Câu chuyện ở Mỹ: “Cổ tức tượng trưng” trong một thị trường “khát” tăng trưởng
Đây là điểm nổi bật nhất khi nhìn vào các ngành của Mỹ. *
Nhóm “Thanh khoản cao” (apparel,
technology): KLGD TB rất lớn (trên 10 triệu), cho
thấy các cổ phiếu này vẫn được giao dịch cực kỳ sôi động. * Điểm
mấu chốt: Cổ tức TB lại cực kỳ thấp
(0.0075 và 0.0063). * Ý nghĩa: Đây là bằng
chứng rõ ràng cho thấy các công ty Mỹ, dù đã có lợi nhuận để trả cổ tức,
vẫn giữ lại gần như toàn bộ tiền để tái đầu tư cho tăng trưởng. Việc trả
cổ tức chỉ mang tính “tượng trưng” để làm hài lòng một
bộ phận cổ đông. Các nhà đầu tư vẫn mua bán chúng vì kỳ vọng vào sự tăng
giá cổ phiếu, chứ không phải vì dòng tiền từ cổ tức.
automotive - Nhật,
consumer goods - Hà Lan): KLGD TB rất thấp (vài
chục đến vài trăm nghìn), cho thấy một thị trường ít đầu cơ, nơi nhà đầu
tư có xu hướng “mua và nắm giữ”.
Cổ tức TB lại
cao hơn đáng kể (0.1207 và 0.2311).technology tại Hà Lan là một
trường hợp ngoại lệ cực kỳ thú vị.
Cổ tức TB cao
nhất bảng (0.7304).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) ) %>%
arrange(Year) %>%
mutate(so_giao_dich = comma(so_giao_dich),across(gia_tri_trung_binh:gia_tri_lon_nhat, ~ round(.x, 2))) %>%
kable(caption = "Bảng thống kê mô tả giá cổ phiếu theo năm",col.names = c("Năm", "Số Giao Dịch", "Giá TB", "Giá Trung Vị", "Độ Lệch Chuẩn", "Giá Thấp Nhất", "Giá Cao Nhất"),
align = c('c', 'r', 'r', 'r', 'r', 'r', 'r')) %>%
kable_styling( latex_options = c("striped", "hold_position", "scale_down"), full_width = FALSE)| Năm | Số Giao Dịch | Giá TB | Giá Trung Vị | Độ Lệch Chuẩn | Giá Thấp Nhất | Giá Cao Nhất |
|---|---|---|---|---|---|---|
| 2000 | 8,568 | 18.55 | 16.86 | 14.05 | 0.21 | 80.36 |
| 2001 | 8,432 | 16.38 | 16.28 | 10.80 | 0.23 | 56.23 |
| 2002 | 8,722 | 15.26 | 13.92 | 11.07 | 0.21 | 51.70 |
| 2003 | 8,820 | 15.52 | 13.77 | 12.15 | 0.20 | 65.52 |
| 2004 | 9,048 | 19.19 | 16.00 | 15.10 | 0.32 | 85.72 |
| 2005 | 9,324 | 21.22 | 17.40 | 16.64 | 0.96 | 89.46 |
| 2006 | 10,283 | 24.48 | 20.11 | 19.67 | 1.30 | 107.02 |
| 2007 | 10,710 | 28.36 | 22.76 | 22.61 | 1.82 | 152.36 |
| 2008 | 11,079 | 23.46 | 18.93 | 19.04 | 0.94 | 146.67 |
| 2009 | 11,311 | 20.34 | 15.64 | 16.60 | 1.11 | 97.05 |
| 2010 | 11,952 | 26.42 | 20.97 | 25.47 | 1.05 | 258.82 |
| 2011 | 12,096 | 31.88 | 23.45 | 42.12 | 0.96 | 343.52 |
| 2012 | 12,092 | 36.06 | 26.32 | 50.19 | 1.13 | 440.40 |
| 2013 | 12,361 | 45.19 | 31.97 | 58.14 | 1.87 | 546.97 |
| 2014 | 12,600 | 56.45 | 42.02 | 84.03 | 2.47 | 692.69 |
| 2015 | 12,786 | 63.31 | 47.66 | 92.12 | 1.62 | 757.77 |
| 2016 | 13,104 | 59.90 | 47.56 | 63.77 | 1.80 | 533.69 |
| 2017 | 13,052 | 72.25 | 52.83 | 64.00 | 4.10 | 496.14 |
| 2018 | 13,241 | 91.28 | 65.04 | 79.51 | 4.68 | 525.89 |
| 2019 | 13,942 | 103.74 | 72.83 | 110.62 | 4.71 | 851.54 |
| 2020 | 14,583 | 130.23 | 90.16 | 160.69 | 2.71 | 1426.30 |
| 2021 | 15,258 | 180.49 | 142.12 | 222.30 | 6.01 | 1944.05 |
| 2022 | 15,311 | 146.02 | 106.35 | 201.88 | 5.00 | 1747.94 |
| 2023 | 15,348 | 160.52 | 102.40 | 254.48 | 4.06 | 2340.00 |
| 2024 | 17,248 | 181.73 | 119.36 | 277.13 | 2.21 | 3427.61 |
| 2025 | 8,851 | 181.17 | 112.44 | 206.03 | 1.89 | 1339.13 |
Giải thích: (1)Trích xuất Năm (mutate).
(2) Nhóm dữ liệu (group_by). (3-7) Tính toán các chỉ số
thống kê (summarise). (8-10) Sắp xếp (arrange)
và Định dạng (mutate). (11-13) Tạo bảng hiển thị
(kable và kable_styling)
Ý nghĩa:
Số Giao Dịch tăng gần
như liên tục từ 8,568 (năm 2000) lên 17,248
(năm 2024).Giá TB đã tăng một cách
ngoạn mục, từ 18.55 (năm 2000) lên 181.73 (năm
2024), tăng gần 10 lần.Giá TB và Giá Trung Vị ngày
càng bị nới rộng.
Độ Lệch Chuẩn (thước đo biến động/rủi ro) đã tăng
vọt một cách phi mã.
Giá Cao Nhất đã tăng từ
80.36 (năm 2000) lên một con số đáng kinh ngạc là
3427.61 (năm 2024).library(ggplot2)
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)
p2 <- ggplot(thong_ke_mo_ta, aes(x = Year)) +
geom_line(aes(y = gia_tri_trung_binh, color = "Giá trị Trung bình"), size = 1.2) +
geom_line(aes(y = gia_tri_trung_vi, color = "Giá trị Trung vị"), size = 1.2, linetype = "dashed") +
scale_color_manual(values = c("Giá trị Trung bình" = "blue", "Giá trị Trung vị" = "darkgreen")) +
scale_y_continuous(labels = scales::dollar) + labs(title = "Sự Tăng Trưởng và Phân Hóa Của Giá Cổ Phiếu", x = "Năm",
y = "Giá trị (USD)", color = "Chỉ số" ) +theme_light() +theme(legend.position = "top")
print(p2)Giải thích: (1) Nạp thư viện cần thiết cho phiền làm
việc. (2-13) Xử lý và Tổng hợp dữ liệu,trích xuất Năm
(mutate), Nhóm dữ liệu (group_by), Tính toán
các chỉ số thống kê (summarise). Sắp xếp
(arrange) và Định dạng (mutate). (14) Vẽ Biểu
đồ (ggplot2). (15) Vẽ đường Giá trị Trung bình. (16) Vẽ
đường Giá trị Trung vị. (17) Tùy chỉnh màu sắc. (18-19) Tùy chỉnh trục
Y. (20) in biểu đồ.
Ý nghĩa:
Giai đoạn 1: 2000 - 2010 (Thị trường tương đối đồng đều): Hai đường “Giá trị Trung bình” và “Giá trị Trung vị” di chuyển rất gần nhau và tương đối bằng phẳng. * Ý nghĩa: Trong thập kỷ này (sau khi bong bóng Dot-com vỡ), không có sự chênh lệch quá lớn giữa các cổ phiếu. Giá của một công ty trung bình không quá khác biệt so với giá của công ty “điển hình”. Thị trường tăng trưởng một cách đồng đều hơn.
Giai đoạn 2: 2011 - 2019 (Bắt đầu phân hóa): Khoảng cách giữa hai đường bắt đầu nới rộng ra một cách rõ rệt. Đường trung bình (màu xanh) bắt đầu tăng tốc nhanh hơn hẳn đường trung vị (màu xanh lá). * Ý nghĩa: Đây là kỷ nguyên trỗi dậy của các gã khổng lồ công nghệ (thường được gọi là nhóm FAANG: Facebook, Apple, Amazon, Netflix, Google). Giá trị của các công ty này tăng vọt, bắt đầu “kéo” giá trị trung bình của toàn thị trường lên. Trong khi đó, các công ty “điển hình” khác vẫn tăng trưởng nhưng với tốc độ chậm hơn.
Giai đoạn 3: 2020 - 2025 (Phân hóa tột độ): Khoảng cách giữa hai đường trở nên cực kỳ lớn. Đường trung bình không chỉ tăng vọt lên mức rất cao mà còn có biến động cực mạnh (sụt giảm mạnh rồi phục hồi vào khoảng năm 2021-2022). * Ý nghĩa: * Hiệu ứng “Kẻ thắng có tất cả” (Winner-Takes-All): Đại dịch COVID-19 đã thúc đẩy quá trình chuyển đổi số, khiến các tập đoàn công nghệ lớn càng trở nên quyền lực và có giá trị hơn bao giờ hết. Sự thống trị của họ lớn đến mức họ gần như một mình kéo chỉ số trung bình của toàn bộ thị trường lên. * Sự bất ổn: Sự sụt giảm mạnh của đường trung bình cho thấy thị trường trong giai đoạn này rất nhạy cảm. Chỉ cần nhóm cổ phiếu dẫn đầu điều chỉnh, nó có thể tạo ra tác động rất lớn lên giá trị trung bình chung, ngay cả khi giá của các công ty “điển hình” (đường trung vị) không biến động nhiều như vậy.
library(scales)
library(tidyverse)
library(e1071)
d %>%
mutate(Year = year(Date)) %>%
group_by(Industry_Tag, Year) %>%
summarise(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' ) %>%
arrange(Year, Industry_Tag) %>%
head(5) %>%
mutate(across(where(is.numeric), ~ round(.x, 2))) %>%
kable( caption = "Thống kê mô tả nâng cao cho Khối lượng Giao dịch theo Ngành và Năm",
col.names = c("Ngành", "Năm", "Hệ số Biến thiên (%)", "Độ xiên", "Độ nhọn"),align = 'l' ) %>%
kable_styling(latex_options = c("striped", "hold_position", "scale_down"),full_width = FALSE)| Ngành | Năm | Hệ số Biến thiên (%) | Độ xiên | Độ nhọn |
|---|---|---|---|---|
| apparel | 2000 | 81.22 | 3.66 | 23.71 |
| automotive | 2000 | 105.50 | 2.73 | 10.28 |
| aviation | 2000 | 43.22 | 1.11 | 1.74 |
| consumer goods | 2000 | 162.02 | 8.77 | 125.97 |
| e-commerce | 2000 | 68.77 | 3.37 | 16.43 |
Giải thích: (1-3) nạp thư viện. (4-9) Xử lý và Tổng hợp dữ liệu. (10-11) Sắp xếp và Lấy mẫu dữ liệu. (12) Định dạng lại số liệu. (13-18) Tạo bảng hiển thị cuối cùng.
Ý nghĩa:
Hệ số Biến thiên (Coefficient of Variation): Đo lường mức độ bất ổn tương đối. * Cao Hàng tiêu dùng 162%: Khối lượng giao dịch của ngành này cực kỳ thất thường, khó dự đoán. Có những ngày giao dịch rất thấp và có những ngày tăng đột biến. Mức độ rủi ro và đầu cơ cao. * Thấp Hàng không 43%: Khối lượng giao dịch ổn định hơn nhiều. Dòng tiền vào ra ngành này đều đặn, dễ đoán hơn. Thị trường ổn định và ít bị sốc thông tin hơn.
Kết luận: Trong năm 2000, ngành Hàng tiêu dùng (consumer goods) có thị trường đầu cơ và bất ổn nhất, phản ứng dữ dội với các thông tin đột biến. Ngược lại, ngành Hàng không (aviation) có khối lượng giao dịch ổn định và dễ dự đoán nhất trong nhóm này.
descriptive_stats <- d %>% mutate( Year = year(Date) ) %>%
group_by(Industry_Tag, Year) %>%
summarise(
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' )
p <- ggplot(data = descriptive_stats, aes(x = Industry_Tag, y = skewness_volume, fill = Industry_Tag)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs( title = "Độ Xiên (Skewness) của Khối Lượng Giao Dịch theo Ngành",
x = "Ngành", y = "Độ Xiên" ) + theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "none")
print(p)Giải thích: (1-6) Xử lý và Tổng hợp dữ liệu. (7) Vẽ
Biểu đồ Độ xiên. (8) Vẽ một đường kẻ ngang tại y = 0 (màu
đỏ, nét đứt). Đây là đường tham chiếu quan trọng. (9-11) Đặt tiêu đề cho
biểu đồ và các trục. (12) In biểu đồ.
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") +
geom_hline(yintercept = 0, linetype = "dashed", color = "blue") +
labs( title = "Độ Nhọn (Kurtosis) của Khối Lượng Giao Dịch 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) Giải thích: (1) Khởi tạo biểu đồ. (2) Thêm lớp biểu đồ cột. (3) Thêm đường tham chiếu ngang. (4-5) Thêm tiêu đề và nhãn. (6-7) Tinh chỉnh giao diện. (8) in biểu đồ
Ý nghĩa; 1. “Độ Nhọn” (Kurtosis) là
gì? - Trong tài chính, Độ Nhọn là thước đo cho “Rủi ro
Đuôi Dày” (Fat-Tail Risk). Nó cho biết xác suất xảy ra những sự
kiện cực đoan, bất ngờ (khối lượng giao dịch tăng vọt
hoặc giảm sâu một cách khủng khiếp) là cao hay thấp. - Cột càng
cao, rủi ro về những cú sốc thanh khoản (những ngày có khối
lượng giao dịch cực kỳ bất thường) càng lớn. Những
ngành này có nhiều khả năng trải qua những ngày giao dịch “thiên nga
đen”. 2. Phân tích Biểu đồ: - Ngành có Độ nhọn
cao nhất (ví dụ: 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. -
Ngành có Độ nhọn thấp hơn (ví dụ: 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.
correlation_result <- cor(d$Volume, d$Close, use = "complete.obs")
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
Giải thích: 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) %>%
group_by(Country, Industry_Tag) %>%
summarise(tong_gia_tri = sum(gia_tri_giao_dich, na.rm = TRUE),.groups = 'drop') %>%
arrange(Country, Industry_Tag)
kable(gia_tri_giao_dich)| Country | Industry_Tag | tong_gia_tri |
|---|---|---|
| canada | e-commerce | 2.070597e+12 |
| france | gaming | 2.777209e+09 |
| france | luxury goods | 5.119930e+10 |
| germany | apparel | 2.158194e+10 |
| germany | automotive | 7.762324e+09 |
| japan | automotive | 3.382736e+11 |
| japan | gaming | 6.764484e+10 |
| netherlands | consumer goods | 2.935208e+11 |
| netherlands | technology | 1.661244e+11 |
| switzerland | technology | 1.183276e+11 |
| usa | apparel | 2.855694e+12 |
| usa | automotive | 3.744710e+13 |
| usa | aviation | 2.652111e+12 |
| usa | consumer goods | 4.946954e+12 |
| usa | cryptocurrency | 1.926475e+12 |
| usa | e-commerce | 2.224315e+13 |
| usa | entertainment | 1.190645e+13 |
| usa | finance | 1.654237e+13 |
| usa | financial services | 2.110229e+12 |
| usa | fitness | 6.577135e+11 |
| usa | food | 4.328873e+12 |
| usa | food & beverage | 5.930393e+12 |
| usa | footwear | 7.582314e+11 |
| usa | gaming | 7.719001e+11 |
| usa | healthcare | 4.302222e+12 |
| usa | hospitality | 2.814471e+12 |
| usa | logistics | 1.749699e+12 |
| usa | manufacturing | 1.798377e+12 |
| usa | music | 8.471361e+11 |
| usa | retail | 9.256578e+12 |
| usa | social media | 6.675816e+11 |
| usa | technology | 1.230582e+14 |
Giải thích: (1) Chuẩn bị dữ liệu. (2) Bắt đầu và
tính toán Giá trị giao dịch (mutate). (3) Nhóm dữ liệu
(group_by). (4) Tổng hợp dữ liệu (summarise).
(5) Sắp xếp kết quả (arrange). (6) Hiển thị kết quả
Ý nghĩa:
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)) +
geom_col(width = 1) +coord_polar("y", start = 0) +
facet_wrap(~ Country) +
labs(title = "Tỷ trọng giá trị giao dịch theo Ngành từng Quốc Gia", fill = "Ngành",
x = NULL, y = NULL) +theme_void() + theme(legend.position = "bottom")Giải thích: (1-3) Xử lý dữ liệu,nhóm dữ liệu theo
từng quốc gia, tạo một cột mới tên là phan_tram_nganh (phần
trăm ngành). (4-8) Vẽ biểu đồ (ggplot):biến biểu đồ cột
chồng thành biểu đồ tròn,Nó sẽ tạo ra một biểu đồ tròn riêng cho mỗi
quốc gia (Country).
Ý nghĩa:
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
d_ket_qua <- d %>%
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)
kable(d_ket_qua)| Industry_Tag | tong_gia_tri_giao_dich | tong_volume | ti_le |
|---|---|---|---|
| apparel | 2.877276e+12 | 1.015255e+11 | 28.34042 |
| automotive | 3.779313e+13 | 3.794928e+11 | 99.58852 |
| aviation | 2.652111e+12 | 9.769137e+10 | 27.14786 |
| consumer goods | 5.240475e+12 | 9.436427e+10 | 55.53452 |
| cryptocurrency | 1.926475e+12 | 1.230908e+10 | 156.50842 |
| e-commerce | 2.431375e+13 | 7.956919e+11 | 30.55674 |
| entertainment | 1.190645e+13 | 1.515906e+11 | 78.54345 |
| finance | 1.654237e+13 | 2.772244e+11 | 59.67140 |
| financial services | 2.110229e+12 | 2.476045e+10 | 85.22580 |
| fitness | 6.577135e+11 | 2.008788e+10 | 32.74181 |
| food | 4.328873e+12 | 4.170200e+10 | 103.80491 |
| food & beverage | 5.930393e+12 | 1.916865e+11 | 30.93798 |
| footwear | 7.582314e+11 | 2.554457e+10 | 29.68268 |
| gaming | 8.423221e+11 | 2.283994e+10 | 36.87935 |
| healthcare | 4.302222e+12 | 5.824213e+10 | 73.86787 |
| hospitality | 2.814471e+12 | 3.283647e+10 | 85.71174 |
| logistics | 1.749699e+12 | 1.387097e+10 | 126.14110 |
| luxury goods | 5.119930e+10 | 6.099427e+08 | 83.94116 |
| manufacturing | 1.798377e+12 | 2.252202e+10 | 79.84972 |
| music | 8.471361e+11 | 3.531840e+09 | 239.85687 |
| retail | 9.256578e+12 | 1.327450e+11 | 69.73202 |
| social media | 6.675816e+11 | 1.914795e+10 | 34.86440 |
| technology | 1.233427e+14 | 4.522656e+12 | 27.27218 |
Giải thích: (1) Chuẩn bị dữ liệu. (2) Bắt đầu và
tính toán Giá trị giao dịch (mutate). (3) Nhóm dữ liệu
(group_by). (4) Tổng hợp dữ liệu (summarise).
(5) Sắp xếp kết quả (arrange). (6) Hiển thị kết quả
Ý nghĩa:
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.
** 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.** 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) +
coord_flip() +
geom_text(aes(label = round(ti_le, 2)), hjust = -0.2) +
labs(title = "Giá Trung Bình Cân Bằng Khối Lượng theo Ngành",
x = "Ngành Công Nghiệp",y = "VWAP (Giá trị / Khối lượng)" ) +
theme_minimal()Giải thích: (1) Khởi tạo biểu đồ và Sắp xếp trục X. (2) Thêm lớp biểu đồ cột. (3) Xoay biểu đồ thành dạng ngang. (4) Thêm nhãn số liệu. (5-6) Đặt tiêu đề và nhãn cho các trục. (7) Áp dụng giao diện tối giản.
Ý nghĩa:
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 %>%
group_by(Ticker) %>%
summarise(Tong_Volume = sum(Volume, na.rm = TRUE))
so_sticker_thoaman_dieu_kien <- tong_volume_theo_sticker %>%
filter(Tong_Volume > 10000000000) %>% nrow()
tong_so_sticker_duy_nhat <- n_distinct(d$Ticker)
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}
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%
Giải thích: (1-3) Tính tổng khối lượng giao dịch theo từng mã (4-5) Đếm số mã thỏa mãn điều kiện (6) Đếm tổng số mã duy nhất (7-9) Tính toán tỷ lệ phần trăm (có điều kiện) (10) in kết quả
Ý nghĩa: 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) %>%
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) %>%
mutate(label_text = paste0(round(n / sum(n) * 100, 2), "%"))
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()Giải thich: (1) Xử lý và Chuẩn bị dữ liệu. (2) Nhóm
dữ liệu theo từng mã chứng khoán (Ticker). (3) Tính tổng
khối lượng giao dịch (Tong_Volume) cho mỗi mã. (4-6) Tạo
một cột mới tên là Nhom để phân loại từng mã. (7) Khởi tạo
biểu đồ. (8) Thêm lớp biểu đồ cột, với chiều cao lấy trực tiếp từ
y. width = 1 để cột chiếm toàn bộ không gian.
(9) Nó lấy trục Y và “uốn cong” nó thành một vòng tròn. (10) Thêm nhãn
phần trăm vào biểu đồ. (11) Đăth tiêu đề cho biểu đò và chú giải. (12)
Áp dụng một giao diện “trống”.
Ý nghĩa:
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 %>%
filter(Dividends > 0 & Volume > 50000000) %>%
summarise(So_Luong_Ma = n_distinct(Ticker))
kable(so_ma_thoaman)| So_Luong_Ma |
|---|
| 8 |
Giải thích: (1-2) Bắt đầu lọc dữ liệu
(filter). (3) Tổng hợp dữ liệu (summarise).
(4) Lưu và xuất kết quả.
Ý nghĩa: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 %>%
summarise(Tong_So_Ma = n_distinct(Ticker)) %>%pull(Tong_So_Ma)
ty_le <- so_ma_thoaman$So_Luong_Ma / tong_so_ma * 100
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)
ggplot(data, aes(x = "", y = value, fill = label)) +
geom_bar(stat = "identity", width = 1) +coord_polar("y", start = 0) +
geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5)) +
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) + theme_void()Giải thích: (1-2) Tính Tổng số mã duy nhất. (3) Tính Tỷ lệ Phần trăm. (4-5) Tạo Data Frame để vẽ biểu đồ. (6) Khởi tạo biểu đồ. (7) Vẽ biểu đồ cột. (8) Thêm nhãn văn bản vào giữa hình tròn. (9-10) Đặt tiêu đề và xóa các nhãn không cần thiết (trục x, y, và chú giải).
Ý nghĩa: 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.
Sự chọn lọc của thị trường: Chỉ khoảng 13 trong 100 công ty đạt được cả hai tiêu chí này. Điều này cho thấy việc tìm kiếm một cơ hội đầu tư vừa an toàn (có cổ tức) vừa linh hoạt (dễ mua bán) đòi hỏi sự sàng lọc kỹ lưỡng. Nhóm cổ phiếu chất lượng cao: 12.9% này có thể được xem là nhóm cổ phiếu chất lượng cao, thường là các doanh nghiệp đầu ngành, có nền tảng vững chắc. Đối với nhiều nhà đầu tư, đây là nhóm cổ phiếu đáng để tập trung phân tích và đưa vào danh mục đầu tư dài hạn.
tong_khoi_luong_cong_nghe <- d %>%
filter(Industry_Tag == "technology") %>%
summarise(Tong_Khoi_Luong = sum(Volume))
kable(tong_khoi_luong_cong_nghe)| Tong_Khoi_Luong |
|---|
| 4.522656e+12 |
Giải thích: (1-2) Bắt đầu lọc dữ liệu
(filter). (3) Tổng hợp dữ liệu (summarise).
(4) Lưu và xuất kết quả.
Ý nghĩa: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.
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 ))
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 Công nghệ", fill = "Nhóm Ngành")Giải thích: (1-5) Tạo bảng dữ liệu
bieu_do_data. (6) Vẽ Biểu đồ. (7) Thêm lớp biểu đồ cột, với
chiều cao lấy trực tiếp từ y. width = 1 để cột
chiếm toàn bộ không gian, làm cho biểu đồ tròn liền mạch. (8) Nó lấy
trục Y và “uốn cong” nó thành một vòng tròn. (9) Đặt tiêu đề cho biểu đồ
(title) và cho phần chú giải (fill).
Ý nghĩa:
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 %>%
filter(Industry_Tag == "apparel") %>%
summarise(Tong_Khoi_Luong = sum(Volume, na.rm = TRUE))
kable(tong_khoi_luong_apparel)| Tong_Khoi_Luong |
|---|
| 101525538443 |
Giải thích: (1-2) Bắt đầu lọc dữ liệu
(filter). (3) Tổng hợp dữ liệu (summarise).
(4) Lưu và xuất kết quả.
Ý nghĩa: 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ư.
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))
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")Giải thích: (1-5) Tạo bảng dữ liệu
bieu_do_data. (6) Vẽ Biểu đồ. (7) Thêm lớp biểu đồ cột, với
chiều cao lấy trực tiếp từ y. width = 1 để cột
chiếm toàn bộ không gian, làm cho biểu đồ tròn liền mạch. (8) Nó lấy
trục Y và “uốn cong” nó thành một vòng tròn. (9) Đặt tiêu đề cho biểu đồ
(title) và cho phần chú giải (fill).
Ý nghĩa:
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á.
tong_khoi_luong_retail <- d %>%
filter(Industry_Tag == "retail") %>%
summarise(Tong_Khoi_Luong = sum(Volume, na.rm = TRUE))
kable(tong_khoi_luong_retail)| Tong_Khoi_Luong |
|---|
| 1.32745e+11 |
Giải thích: (1-2) Bắt đầu lọc dữ liệu
(filter). (3) Tổng hợp dữ liệu (summarise).
(4) Lưu và xuất kết quả.
Ý nghĩa: 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.
bieu_do_data <- data.frame(
Nhom = c("Bán lẻ", "Các ngành khác"),
khoi_Luong = c(tong_khoi_luong_retail$Tong_Khoi_Luong,
sum(d$Volume, na.rm = TRUE) -
tong_khoi_luong_retail$Tong_Khoi_Luong))
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 Bán lẻ", fill = "Nhóm Ngành") Giải thích: (1-5) Tạo bảng dữ liệu
bieu_do_data. (6) Vẽ Biểu đồ. (7) Thêm lớp biểu đồ cột, với
chiều cao lấy trực tiếp từ y. width = 1 để cột
chiếm toàn bộ không gian, làm cho biểu đồ tròn liền mạch. (8) Nó lấy
trục Y và “uốn cong” nó thành một vòng tròn. (9) Đặt tiêu đề cho biểu đồ
(title) và cho phần chú giải (fill).
Ý nghĩa:
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ẽ.
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')
kable(monthly_2024_volume) | YearMonth | Total_Volume |
|---|---|
| 2024-01 | 23406952267 |
| 2024-02 | 23749309220 |
| 2024-03 | 24285768920 |
| 2024-04 | 22748813500 |
| 2024-05 | 22310972400 |
| 2024-06 | 21735549178 |
| 2024-07 | 23548064723 |
| 2024-08 | 25164596411 |
| 2024-09 | 18714158654 |
| 2024-10 | 18800387895 |
| 2024-11 | 20706258213 |
| 2024-12 | 19793773200 |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả.
Ý nghĩa:
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.
format_trieu_ty <- function(x) {sapply(x, function(val) {if (val >= 1e9) {
paste0(round(val / 1e9, 1), " Tỷ") } else if (val >= 1e6) { paste0(round(val / 1e6, 1), " Tr")
} else { format(val, big.mark = ",")} })}
ggplot(monthly_2024_volume,
aes(x = YearMonth, y = Total_Volume)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = format_trieu_ty(Total_Volume)),
vjust = -0.5, size = 3.5) +
scale_y_continuous(labels = comma,
expand = expansion(mult = c(0, 0.1))) +
labs(title = "Tổng Khối lượng giao dịch Toàn bộ 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() + theme( axis.text.x = element_text(angle = 45, hjust = 1))Giải thích: (1-3) Đây là một hàm tự tạo tên là
format_trieu_ty để biến những con số rất lớn thành định
dạng ngắn gọn hơn. (4-5) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu đồ
(6)Thêm lớp biểu đồ cột. (7-8) Thêm nhãn số liệu lên trên các cột.
(9-10) Tùy chỉnh trục Y. (11-12) Thêm tiêu đề và nhãn cho các trục (13)
Tinh chỉnh giao diện chung
Ý nghĩa:
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 %>%
mutate( Date = ymd_hms(Date),Year = year(Date),
YearMonth = format(Date, "%Y-%m")) %>%
filter(Year == 2024,tolower(Country) == "usa" ) %>%
group_by(YearMonth) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE),.groups = 'drop' )
kable(monthly_usa_2024_volume) | YearMonth | Total_Volume |
|---|---|
| 2024-01 | 23062439767 |
| 2024-02 | 23331852720 |
| 2024-03 | 24021621120 |
| 2024-04 | 22402721700 |
| 2024-05 | 21826184900 |
| 2024-06 | 21395981180 |
| 2024-07 | 23165678147 |
| 2024-08 | 24692219213 |
| 2024-09 | 18452661015 |
| 2024-10 | 18524808168 |
| 2024-11 | 20255720810 |
| 2024-12 | 19422079602 |
Giải thích: (1-2) Nạp thư viện. (3-4) Đây là một hàm
tự tạo tên là format_ty để biến những con số rất lớn thành
định dạng ngắn gọn hơn. (5-6) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu
đồ (7)Thêm lớp biểu đồ cột. (8-9) Thêm nhãn số liệu lên trên các cột.
(10-11) Tùy chỉnh trục Y. (12-13) Thêm tiêu đề và nhãn cho các trục (14)
Tinh chỉnh giao diện chung
ý nghĩa:
=> 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.
library(ggplot2)
library(scales)
format_ty <- function(x) {
paste0(round(x / 1e9, 1), " Tỷ")}
ggplot(monthly_usa_2024_volume,
aes(x = YearMonth, y = Total_Volume)) +
geom_bar(stat = "identity", fill = "lightgreen") +
geom_text(aes(label = format_ty(Total_Volume)),
vjust = -0.5,size = 3.5) +
scale_y_continuous(labels = comma,
expand = expansion(mult = c(0, 0.1))) +
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() +theme( axis.text.x = element_text(angle = 45, hjust = 1))Giải thích: (1-2) Nạp thư viện. (3-4) Đây là một hàm
tự tạo tên là format_ty để biến những con số rất lớn thành
định dạng ngắn gọn hơn. (5-6) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu
đồ (7)Thêm lớp biểu đồ cột. (8-9) Thêm nhãn số liệu lên trên các cột.
(10-11) Tùy chỉnh trục Y. (12-13) Thêm tiêu đề và nhãn cho các trục (14)
Tinh chỉnh giao diện chung
Ý nghĩa:
(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 %>%
mutate(Date = ymd_hms(Date), Year = year(Date), YearMonth = format(Date, "%Y-%m")) %>%
filter( tolower(Country) == "usa", Year == 2024,
tolower(Industry_Tag) == "technology" ) %>%
group_by(YearMonth) %>%
summarise(Total_Volume = sum(Volume, na.rm = TRUE), Industry_Tag = first(Industry_Tag), .groups = 'drop' )
kable(tech_usa_2024_monthly_volume)| YearMonth | Total_Volume | Industry_Tag |
|---|---|---|
| 2024-01 | 15157313800 | technology |
| 2024-02 | 15979570300 | technology |
| 2024-03 | 17285194500 | technology |
| 2024-04 | 14789834300 | technology |
| 2024-05 | 14469025100 | technology |
| 2024-06 | 14208761596 | technology |
| 2024-07 | 12844111657 | technology |
| 2024-08 | 15245326678 | technology |
| 2024-09 | 11366656245 | technology |
| 2024-10 | 10640904721 | technology |
| 2024-11 | 10503536908 | technology |
| 2024-12 | 10756604259 | technology |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả.
Ý nghĩa:
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.
library(ggplot2)
library(scales)
format_ty <- function(x) {
paste0(round(x / 1e9, 1), " Tỷ")}
ggplot(tech_usa_2024_monthly_volume,
aes(x = YearMonth, y = Total_Volume, fill = YearMonth)) +
geom_bar(stat = "identity") +
geom_text(aes(label = format_ty(Total_Volume)), vjust = -0.5,
size = 3.5) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.1))) +
labs(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),legend.position = "none" )
Giải thích: (1-2) Nạp thư viện. (3-4) Đây là một hàm tự
tạo tên là
format_ty để biến những con số rất lớn thành
định dạng ngắn gọn hơn. (5-6) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu
đồ (7)Thêm lớp biểu đồ cột. (8-9) Thêm nhãn số liệu lên trên các cột.
(10-11) Tùy chỉnh trục Y. (12-13) Thêm tiêu đề và nhãn cho các trục (14)
Tinh chỉnh giao diện chung
Ý nghĩa:
retail_usa_2024_monthly_volume <- d %>%
mutate(Date = ymd_hms(Date),Year = year(Date),YearMonth = format(Date, "%Y-%m")) %>%
filter( tolower(Country) == "usa",
Year == 2024,tolower(Industry_Tag) == "retail") %>%
group_by(YearMonth) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE),Industry_Tag = first(Industry_Tag),.groups = 'drop')
kable(retail_usa_2024_monthly_volume)| YearMonth | Total_Volume | Industry_Tag |
|---|---|---|
| 2024-01 | 279069900 | retail |
| 2024-02 | 237207700 | retail |
| 2024-03 | 336455500 | retail |
| 2024-04 | 260210300 | retail |
| 2024-05 | 286981500 | retail |
| 2024-06 | 266425593 | retail |
| 2024-07 | 275380362 | retail |
| 2024-08 | 343078669 | retail |
| 2024-09 | 247927535 | retail |
| 2024-10 | 247933162 | retail |
| 2024-11 | 427928597 | retail |
| 2024-12 | 363925569 | retail |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả
Ý nghĩa:
library(ggplot2)
library(scales)
format_trieu <- function(x) {
paste0(round(x / 1e6, 1), " Tr")}
ggplot(retail_usa_2024_monthly_volume,
aes(x = YearMonth, y = Total_Volume, fill = YearMonth)) +
geom_bar(stat = "identity") +
geom_text(aes(label = format_trieu(Total_Volume)), vjust = -0.1,
size = 3.5) +
scale_y_continuous(labels = comma,
expand = expansion(mult = c(0, 0.1))) +
labs( title = "Tổng Khối lượng giao dịch Ngành bán lẻ (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 = 3) )Giải thích: (1-2) Nạp thư viện. (3-4) Đây là một hàm
tự tạo tên là format_ty để biến những con số rất lớn thành
định dạng ngắn gọn hơn. (5-6) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu
đồ (7)Thêm lớp biểu đồ cột. (8-9) Thêm nhãn số liệu lên trên các cột.
(10-11) Tùy chỉnh trục Y. (12-13) Thêm tiêu đề và nhãn cho các trục (14)
Tinh chỉnh giao diện chung
Ý Nghĩa:
healthcare_usa_2024_monthly_volume <- d %>%
mutate( Date = ymd_hms(Date), Year = year(Date), YearMonth = format(Date, "%Y-%m") ) %>%
filter( tolower(Country) == "usa",Year == 2024,
tolower(Industry_Tag) == "healthcare" ) %>%
group_by(YearMonth) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE),Industry_Tag = first(Industry_Tag), .groups = 'drop' )
kable(healthcare_usa_2024_monthly_volume)| YearMonth | Total_Volume | Industry_Tag |
|---|---|---|
| 2024-01 | 138190400 | healthcare |
| 2024-02 | 158288200 | healthcare |
| 2024-03 | 140389700 | healthcare |
| 2024-04 | 175712200 | healthcare |
| 2024-05 | 174612900 | healthcare |
| 2024-06 | 146566262 | healthcare |
| 2024-07 | 173752660 | healthcare |
| 2024-08 | 177967190 | healthcare |
| 2024-09 | 124474055 | healthcare |
| 2024-10 | 146082724 | healthcare |
| 2024-11 | 191947045 | healthcare |
| 2024-12 | 221274816 | healthcare |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả
Ý nghĩa:
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ủ.
format_trieu <- function(x) { paste0(round(x / 1e6, 1), " Tr")}
ggplot(healthcare_usa_2024_monthly_volume,
aes(x = YearMonth, y = Total_Volume, fill = YearMonth)) +
geom_bar(stat = "identity") +
geom_text(aes(label = format_trieu(Total_Volume)), vjust = -0.5,
size = 3.5) +
scale_y_continuous(labels = comma,
expand = expansion(mult = c(0, 0.1))) +
labs(title ="Tổng Khối lượng giao dịch Ngành chăm sóc sức khỏe 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))Giải thích: (1) Đây là một hàm tự tạo tên là
format_trieu để biến những con số rất lớn thành định dạng
ngắn gọn hơn. (2-3) Khởi tạo biểu đồ,Bắt đầu quá trình vẽ biểu đồ
(4)Thêm lớp biểu đồ cột. (5-6) Thêm nhãn số liệu lên trên các cột. (7-8)
Tùy chỉnh trục Y. (9-12) Thêm tiêu đề và nhãn cho các trục
Ý nghĩa:
monthly_france_2024_volume <- d %>%
mutate(Date = ymd_hms(Date),Year = year(Date),
YearMonth = format(Date, "%Y-%m")) %>%
filter(Year == 2024,tolower(Country) == "france") %>%
group_by(YearMonth) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE),.groups = 'drop')
kable(monthly_france_2024_volume)| YearMonth | Total_Volume |
|---|---|
| 2024-01 | 5736100 |
| 2024-02 | 4535000 |
| 2024-03 | 4607000 |
| 2024-04 | 4299400 |
| 2024-05 | 4279300 |
| 2024-06 | 5239817 |
| 2024-07 | 12049117 |
| 2024-08 | 8008934 |
| 2024-09 | 15502574 |
| 2024-10 | 15782740 |
| 2024-11 | 12819859 |
| 2024-12 | 14366913 |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả.
Ý nghĩa:
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.
format_trieu <- function(x) paste0(round(x / 1e6, 1), " Tr")
ggplot(monthly_france_2024_volume, aes(x = YearMonth, y = Total_Volume)) +
geom_bar(stat = "identity", fill = "lightblue") +
geom_text(aes(label = format_trieu(Total_Volume)),vjust = -0.5,
size = 3.5) + scale_y_continuous(labels = comma,expand = expansion(mult = c(0, 0.1))) +
labs( title = "Tổng Khối lượng giao dịch của PHÁP theo Tháng (2024)",
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))Giải thích: (1) Định nghĩa một hàm mới tên là
format_trieu nhận đầu vào là một vector các con số
x,hàm sapply sẽ lặp qua từng phần tử
(val) trong vector x và áp dụng hàm
bên trong cho nó. (2) Vẽ biểu đồ (ggplot2):Sử dụng bảng dữ
liệu đã được tổng hợp theo tháng. (3) Thêm lớp biểu đồ (4) Thêm nhãn số
liệu lên trên các cột. (5-6) Thêm nhãn biểu đồ (7) Tùy chỉnh thêm: xoay
các nhãn trên trục X 45 độ để dễ đọc.
Ý nghĩa:
gaming_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) == "gaming" ) %>%
group_by(YearMonth) %>%
summarise( Total_Volume = sum(Volume, na.rm = TRUE),
Industry_Tag = first(Industry_Tag), .groups = 'drop')
kable(gaming_france_2024_monthly_volume)| YearMonth | Total_Volume | Industry_Tag |
|---|---|---|
| 2024-01 | 565700 | gaming |
| 2024-02 | 735800 | gaming |
| 2024-03 | 764500 | gaming |
| 2024-04 | 525900 | gaming |
| 2024-05 | 1070400 | gaming |
| 2024-06 | 400292 | gaming |
| 2024-07 | 2175283 | gaming |
| 2024-08 | 727946 | gaming |
| 2024-09 | 6456248 | gaming |
| 2024-10 | 7706362 | gaming |
| 2024-11 | 3808402 | gaming |
| 2024-12 | 5551588 | gaming |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả
Ý nghĩa:
library(ggplot2)
library(scales)
format_trieu_nghin <- function(x) { sapply(x, function(val) {
if (val >= 1e6) {paste0(round(val / 1e6, 1), " Tr")} else if (val >= 1e3) {
paste0(round(val / 1e3, 1), " N")} else {as.character(val) }})}
ggplot(gaming_france_2024_monthly_volume,
aes(x = YearMonth, y = Total_Volume, fill = YearMonth)) +
geom_bar(stat = "identity") +
geom_text(aes(label = format_trieu_nghin(Total_Volume)), vjust = -0.5, size = 3.5) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.1))) +
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))Giải thích: (1-2) Nạp thư viện cần thiết. (3-4) Đây
là một hàm tự tạo tên là format_ty để biến những con số rất
lớn thành định dạng ngắn gọn hơn. (5-6) Khởi tạo biểu đồ,Bắt đầu quá
trình vẽ biểu đồ (7)Thêm lớp biểu đồ cột. (8-9) Thêm nhãn số liệu lên
trên các cột. (10-11) Tùy chỉnh trục Y. (12-13) Thêm tiêu đề và nhãn cho
các trục (14) Tinh chỉnh giao diện chung
Ý nghĩa: 1. Giai đoạn 1: Nửa đầu năm “ngủ đông” (Tháng 1 - 8): - Các cột biểu đồ trong 8 tháng đầu năm đều ở mức rất thấp, hầu hết dưới 1 triệu đơn vị.Đây là giai đoạn chờ đợi sản phẩm. Ngành game Pháp Khối lượng giao dịch thấp phản ánh sự thiếu quan tâm của nhà đầu tư khi không có chất xúc tác nào. Thị trường đang chờ đợi sự kiện lớn tiếp theo. 2. Giai đoạn 2: Sự bùng nổ của một “Bom tấn” (Tháng 9 và 10): - Đây là điểm nhấn kịch tính nhất của biểu đồ. Khối lượng giao dịch bùng nổ dữ dội, tăng từ 727 nghìn (tháng 8) lên 6.4 triệu (tháng 9) và đạt đỉnh cao nhất năm tại 7.7 triệu (tháng 10). Mức tăng gấp 10 lần. Một sự kiện như thế này chỉ có thể được giải thích bằng việc ra mắt một trò chơi siêu phẩm. - Thời điểm Vàng: Mùa thu (tháng 9, 10) là “cửa sổ vàng” để các hãng game tung ra những sản phẩm lớn nhất, nhằm tối đa hóa doanh thu trong mùa mua sắm lễ hội cuối năm (Quý 4). - Phản ứng của Nhà đầu tư: Khối lượng giao dịch khổng lồ cho thấy các nhà đầu tư đang đổ xô vào giao dịch cổ phiếu của công ty phát hành. Họ đang “đặt cược” vào sự thành công của sản phẩm mới, dựa trên các chiến dịch marketing rầm rộ, đánh giá ban đầu và sự mong đợi của cộng đồng game thủ. Đây là đỉnh điểm của sự đầu cơ và kỳ vọng. 3. Giai đoạn 3: Giao dịch “Hậu ra mắt” (Tháng 11 và 12): - Khối lượng giao dịch vẫn ở mức rất cao so với đầu năm nhưng đã hạ nhiệt so với đỉnh tháng 10. Giai đoạn này phản ánh sự chuyển dịch từ “giao dịch theo kỳ vọng” sang “giao dịch theo kết quả thực tế”. - Sự hưng phấn ban đầu đã qua đi. Giờ đây, nhà đầu tư đang giao dịch dựa trên các báo cáo doanh số tuần đầu tiên, doanh số Black Friday, và dự báo doanh thu cho toàn bộ Quý 4. - Khối lượng vẫn cao cho thấy sản phẩm này vẫn là tâm điểm chú ý, quyết định đến kết quả kinh doanh cả năm của công ty.
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')
kable(luxury_france_2024_monthly_volume)| YearMonth | Total_Volume | Industry_Tag |
|---|---|---|
| 2024-01 | 5170400 | luxury goods |
| 2024-02 | 3799200 | luxury goods |
| 2024-03 | 3842500 | luxury goods |
| 2024-04 | 3773500 | luxury goods |
| 2024-05 | 3208900 | luxury goods |
| 2024-06 | 4839525 | luxury goods |
| 2024-07 | 9873834 | luxury goods |
| 2024-08 | 7280988 | luxury goods |
| 2024-09 | 9046326 | luxury goods |
| 2024-10 | 8076378 | luxury goods |
| 2024-11 | 9011457 | luxury goods |
| 2024-12 | 8815325 | luxury goods |
Giải thích: (1-2) Bắt đầu và Xử lý Ngày tháng
(mutate). (3) Lọc dữ liệu (filter). (4) Nhóm
dữ liệu (group_by). (5-6) Tổng hợp dữ liệu
(summarise). (7) Lưu và xuất kết quả
Ý nghĩa:
Giai đoạn 1: Nửa đầu năm “Chờ đợi và Theo dõi” (Tháng 1 - 6) - Khối lượng giao dịch thấp cho thấy một thị trường trầm lắng. Đây là giai đoạn các nhà đầu tư đang không chắc chắn. Họ có thể lo ngại về các yếu tố như: - Lạm phát và lãi suất cao ở châu Âu làm giảm sức mua. - Sự phục hồi kinh tế không chắc chắn ở thị trường quan trọng là Trung Quốc. - Căng thẳng địa chính trị. - Trong bối cảnh đó, nhà đầu tư có xu hướng “đứng ngoài quan sát” thay vì tích cực giao dịch, dẫn đến khối lượng thấp. Giai đoạn 2: Sự kiện “Chất xúc tác” và Bùng nổ (Tháng 7 trở đi) - Sự tăng vọt đột ngột vào tháng 7 là tín hiệu quan trọng nhất. Nó cho thấy một tin tức cực kỳ tích cực đã được công bố, phá vỡ hoàn toàn tâm lý chờ đợi trước đó. - Ý nghĩa: Chất xúc tác này rất có thể là: - Báo cáo Lợi nhuận Quý 2 Vượt trội: Đây là giả thuyết hợp lý nhất. Một trong những “gã khổng lồ” hàng xa xỉ của Pháp đã công bố kết quả kinh doanh Quý 2 (thường được công bố vào tháng 7) tốt hơn rất nhiều so với dự báo của các nhà phân tích. Đặc biệt nếu doanh số ở thị trường Trung Quốc phục hồi mạnh mẽ. - Tín hiệu Tích cực từ Kinh tế Vĩ mô: Có thể Ngân hàng Trung ương Châu Âu (ECB) đã phát đi tín hiệu về việc cắt giảm lãi suất, hoặc dữ liệu lạm phát hạ nhiệt nhanh hơn dự kiến, làm tăng niềm tin vào sức mua của người tiêu dùng. - Khối lượng giao dịch duy trì ở mức cao trong các tháng tiếp theo (8, 9, 10) cho thấy đây không phải là một sự kiện nhất thời. Tin tức tích cực đó đã khiến các nhà đầu tư đánh giá lại toàn bộ ngành hàng xa xỉ, dẫn đến một làn sóng mua bán sôi động và kéo dài.
format_trieu_nghin <- function(x) { sapply(x, function(val) {if (val >= 1e6) {
paste0(round(val / 1e6, 1), " Tr")} else if (val >= 1e3) {
paste0(round(val / 1e3, 1), " N") } else { as.character(val) } })}
ggplot(luxury_france_2024_monthly_volume,
aes(x = YearMonth, y = Total_Volume, fill = YearMonth)) +
geom_bar(stat = "identity") +
geom_text(aes(label = format_trieu_nghin(Total_Volume)), vjust = -0.5, size = 3.5) +
scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.1))) +
labs(title = "Tổng khối lượng giao dịch Ngành hàng xa xỉ 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))
Giải thích: (1-3) Định nghĩa một hàm mới tên là
format_trieu_nghin nhận đầu vào là một vector các con số
x,hàm sapply sẽ lặp qua từng phần tử
(val) trong vector x và áp dụng hàm
bên trong cho nó. (4) Vẽ biểu đồ (ggplot2):Sử dụng bảng dữ
liệu đã được tổng hợp theo tháng, (5) Vẽ biểu đồ cột, với chiều cao lấy
trực tiếp từ y. (6) Tùy chỉnh trục Y. (8-11) Tùy chỉnh
thêm: xoay các nhãn trên trục X 45 độ để dễ đọc.
ý Nghĩa:
Giai đoạn đầu năm (Tháng 1 - Tháng 5): Khởi đầu tương đối trầm lắngThá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.
Giai đoạn giữa và cuối năm (Tháng 6 - Tháng 12): Bùng nổ mạnh mẽ - Sự bứt phá từ tháng 6 (4,839,525) và đạt đỉnh vào tháng 7 (9,873,834): Đây là điểm nhấn quan trọng nhất của biểu đồ. Khối lượng giao dịch tháng 7 cao hơn gấp đôi so với các tháng đầu năm. - Duy trì ở mức rất cao (Tháng 8 - Tháng 12): Các tháng còn lại đều duy trì khối lượng giao dịch trên 7.2 triệu, đặc biệt các tháng 9, 11, 12 đều xấp xỉ 9 triệu.
1. Tổng Quan:Một trong những công ty chứng khoán đầu tiên và tiên phong tại Việt Nam, thành lập năm 1999.Là thành viên cốt lõi của Tập đoàn Tài chính - Bảo hiểm Bảo Việt, một tập đoàn nhà nước hàng đầu. Điều này tạo ra một hệ sinh thái vững mạnh về thương hiệu, khách hàng và vốn.Mã chứng khoán BVS (niêm yết trên sàn HNX).Môi giới Chứng khoán dịch vụ cơ bản cho nhà đầu tư cá nhân và tổ chức. Ngân hàng Đầu tư (IB) đây là thế mạnh vượt trội, chuyên tư vấn phát hành cổ phiếu/trái phiếu, IPO, cổ phần hóa và M&A, đặc biệt cho các doanh nghiệp nhà nước.Phân tích & Tư vấn cung cấp các báo cáo phân tích chất lượng cao, được thị trường đánh giá cao.Tự doanh & Lưu ký các hoạt động nghiệp vụ khác.
2. Lý Do Chọn Phân Tích BVS:Chứng nhân lịch sử Phân tích BVS là nhìn lại lịch sử ngành chứng khoán Việt Nam.Hệ sinh thái độc đáo Case study về lợi thế cạnh tranh từ một tập đoàn lớn. Dữ liệu dồi dào Lịch sử niêm yết lâu dài cung cấp dữ liệu minh bạch, đáng tin cậy.
## [1] 12 23
Giải thích: Kết quả cho ta thấy số quan sát là 12 dòng và số biến là 23 cột trong bộ dữ liệu. VIệc này giúp kiểm tra quy mô bộ dữ liệu và xác định ngay có đủ dữ liệu để phân tích chuyên sauu không.
## [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"
Giải thích: Hiển thị tên tất cả các biến, giúp người đọc biết ngay dữ liệu gồm những thông tin gì. Điều này rất quan trọng để chọn biến phù hợp cho từng phân tích.
## 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 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] 22
Giải thích: - sapply() áp dụng hàm is.numeric() cho tất cả các biến (cột) của bộ dữ liệu “d” => Hàm này sẽ trả về một vector chứa TRUE/FALSE, thể hiện các biến nào là kiểu số (numeric). - sum() tính tổng số TRUE (đếm biến kiểu số). Như vậy, kết quả là tổng số biến định lượng trong dataset.
## [1] 0
=>Kết quả cho ta thấy số quan sát là 12 dòng và số biến là 23 cột trong bộ dữ liệu thì không cố số liệu định lượng. Việc này giúp kiểm tra quy mô bộ dữ liệu và xác định ngay có đủ dữ liệu để phân tích chuyên sauu không.
loại <- data.frame(
Kiểu_dữ_liệu = sapply(d2, class))
kable(loại, col.names = c("Tên biến" , "Kiểu dữ liệu"))| Tên biến | Kiểu dữ liệu |
|---|---|
| Year | integer |
| Chi_tieu | logical |
| TSNH | numeric |
| CKCV | numeric |
| TSTC | numeric |
| TSTC_thong.qua.lai.lo | numeric |
| TSDH | numeric |
| TTS | numeric |
| NPT | numeric |
| VCSH | numeric |
| LNCPP | numeric |
| DT_hoat_dong | numeric |
| CP_hoat_dong | numeric |
| CP_du_phong | numeric |
| CP_tu.van_TC | numeric |
| CPLV | numeric |
| TNK_va_CPK | numeric |
| LN_chua_thuc_hien | numeric |
| CPTTNDN | numeric |
| LNSTTNDN | numeric |
| CPTTNDN.hien.hanh | numeric |
| TNTTNDN.hoan.lai | numeric |
| PTK | numeric |
Giải thích: (1) Hàm data.frame() chuyển đổi kết quả này thành bảng, gồm hai cột: tên biến và kiểu dữ liệu của (2) Hàm sapply() để áp dụng hàm class cho tất cả các cột của dữ liệu movies_dataset. (3) Hàm kale() giúp hiển thị bảng này dưới dạng đẹp, dễ đọc trong báo cáo hoặc tài liệu.
Ý nghĩa:Kết quả cho thấy dữ liệu có sự đa dạng về kiểu biến, phù hợp cho các phân tích đa dạng như mô tả, so sánh, hay xây dựng mô hình dự báo. Biết rõ kiểu dữ liệu giúp nhóm dễ dàng xử lý, mã hóa, chuyển đổi hoặc trực quan hóa phù hợp từng loại biến, nâng cao độ chính xác và chuyên nghiệp của báo cáo
## [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
Giải thích: sử dụng toán tử $ để truy cập một cột của dataframe
| x | |
|---|---|
| Year | 0 |
| Chi_tieu | 12 |
| TSNH | 0 |
| CKCV | 0 |
| TSTC | 0 |
| TSTC_thong.qua.lai.lo | 0 |
| TSDH | 0 |
| TTS | 0 |
| NPT | 0 |
| VCSH | 0 |
| LNCPP | 0 |
| DT_hoat_dong | 0 |
| CP_hoat_dong | 1 |
| CP_du_phong | 0 |
| CP_tu.van_TC | 0 |
| CPLV | 0 |
| TNK_va_CPK | 0 |
| LN_chua_thuc_hien | 0 |
| CPTTNDN | 0 |
| LNSTTNDN | 0 |
| CPTTNDN.hien.hanh | 0 |
| TNTTNDN.hoan.lai | 0 |
| PTK | 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.
## [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"
Giải thích: (1) Nạp thư viện ‘janitor’ để có thể sử dụng hàm clean_names() (2) Tùy chọn có thể kiểm tra tên cột mới đã được làm sạch hay chưa (3) xuất kết quả các cột tên biến
=> Đê dễ dàng cho những phân tích nâng cao hơn về bộ dữ liệu
library(knitr)
so_trung_lap <- sum(duplicated(d2))
bang_ket_qua <- data.frame(
`Nội dung kiểm tra` = "Tổng số dòng bị trùng lặp",
`Kết quả` = so_trung_lap)
kable(bang_ket_qua, caption = "Kết quả kiểm tra dữ liệu trùng lặp")| Nội.dung.kiểm.tra | Kết.quả |
|---|---|
| Tổng số dòng bị trùng lặp | 1 |
Giải Thích: (1) Nạp thư viện cần thiết. (2) Tính toán số dòng trùng lặp (giữ nguyên logic của bạn). (3) Tạo một data frame nhỏ để hiển thị kết quả.
Ý nghĩa: Kết quả cho thấy bộ dữ liệu không có một biến anfo bị trùng lặp với nhau
Giải thích: (1-2) Nạp thư viện cho phiên làm việc. (3) Tùy chọn có thể kiểm tra tên cột mới đã được làm sạch hay chưa. (4) Loại bỏ biến chi_tieu.
Ý nghĩa:Và kết quả đã loại bỏ đi cộ chỉ tiêu có chứa giá trị NA
d3 <- read.csv("C:/Users/DELL/Downloads/NN_LT_THAY_TUONG/d3_cleaned_financial_ratios.csv")
library(tidyverse)
library(knitr)
cols_to_clean <- c("OPM", "COSR")
d3_cleaned <- d3 %>% mutate(across( .cols = all_of(cols_to_clean), .fns = ~replace_na(.x, mean(.x, na.rm = TRUE))))
d3_cleaned %>% select(year, all_of(cols_to_clean)) %>% tail() %>% kable(caption = "Kết quả ") | year | OPM | COSR | |
|---|---|---|---|
| 6 | 2019 | 1.525658 | 0.5259966 |
| 7 | 2018 | 1.626772 | 0.6159873 |
| 8 | 2017 | 1.560892 | 0.5204764 |
| 9 | 2016 | 1.327921 | 0.3719677 |
| 10 | 2015 | 1.058998 | 0.0146927 |
| 11 | 2014 | 1.223585 | 0.1748609 |
Gải thích: (1-2) Nạp thư viện cần thiết. (3) Chỉ định 2 cột cần xử lý NA. (4) Xử lý giá trị NA và tạo một data frame mới. (5) In ra kết quả của 2 cột đã được xử lý. (6) Kiểm tra lại số lượng NA của toàn bộ bảng.
Ý Nghĩa: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
nguong_doanh_thu <- 400000000000
df_phan_to_doanh_thu <- df %>%
mutate( doanh_thu_to = ifelse(dt_hoat_dong > nguong_doanh_thu, "To A", "To B")) %>%
select(year, dt_hoat_dong, doanh_thu_to,) %>%
arrange(doanh_thu_to, desc(dt_hoat_dong))
kable(df_phan_to_doanh_thu)| year | dt_hoat_dong | doanh_thu_to |
|---|---|---|
| 2021 | 1.09612e+12 | To A |
| 2020 | 5.68060e+11 | To A |
| 2019 | 5.41264e+11 | To A |
| 2018 | 5.22954e+11 | To A |
| 2017 | 4.62044e+11 | To A |
| 2014 | 3.05344e+11 | To B |
| 2015 | 2.87179e+11 | To B |
| 2016 | 2.75739e+11 | To B |
| 2016 | 2.75739e+11 | To B |
| 2024 | 1.14658e+11 | To B |
| 2023 | 1.12357e+11 | To B |
| 2022 | 1.11876e+11 | To B |
Giải thích: (1) Định nghĩa ngưỡng. (2-5) Phân loại, chọn và sắp xếp dữ liệu. (6) Hiển thị kết quả.
**Ý nghĩa:* 1. Tổ A: Câu chuyện về Tăng trưởng và Đột phá
dt_hoat_dong) tăng trưởng đều đặn và bền vững qua từng năm
(từ 462 nghìn tỷ lên 568 nghìn tỷ). Điều này cho thấy một nền tảng kinh
doanh vững chắc, hoạt động hiệu quả và chiếm lĩnh thị trường tốt.nguong_tsnh <- 3000000000000
df_phan_to_tsnh <- df %>%
mutate(tsnh_to = ifelse(tsnh > nguong_tsnh, "To A", "To B")) %>%
select(year,tsnh, tsnh_to, ) %>%
arrange(tsnh_to, desc(tsnh))
kable(df_phan_to_tsnh)| year | tsnh | tsnh_to |
|---|---|---|
| 2023 | 5.68830e+12 | To A |
| 2021 | 5.50263e+12 | To A |
| 2024 | 5.08099e+12 | To A |
| 2022 | 3.65201e+12 | To A |
| 2020 | 3.05748e+12 | To A |
| 2018 | 2.54708e+12 | To B |
| 2019 | 2.21677e+12 | To B |
| 2017 | 1.74090e+12 | To B |
| 2014 | 1.64493e+12 | To B |
| 2015 | 1.38495e+12 | To B |
| 2016 | 1.36324e+12 | To B |
| 2016 | 1.36324e+12 | To B |
Giải thích: (1) Định nghĩa ngưỡng. (2-5) Phân loại, chọn và sắp xếp dữ liệu. (6) Hiển thị kết quả.
Ý nghĩa: 1. Tổ A: Câu chuyện về Tăng trưởng Bùng nổ và Biến động
library(dplyr)
library(kableExtra)
d3 %>% mutate(across(where(is.numeric), round, 4)) %>%
kable("latex", booktabs = TRUE, caption = "Bảng các hệ số kinh tế") %>%
kable_styling(latex_options = "scale_down")| year | ROS | ROA | ROE | EBIT | OPM |
|---|---|---|---|---|---|
| 2024 | 1.7439167 | 0.0394025 | 0.0807774 | -141430891935 | -6.810593 |
| 2023 | 1.7419742 | 0.0344285 | 0.0845536 | -80402396012 | 7.444671 |
| 2022 | 1.3129536 | 0.0402674 | 0.0673508 | -211965229402 | 7.466662 |
| 2021 | 0.2581323 | 0.0514904 | 0.1319425 | -48522414739 | 1.205486 |
| 2020 | 0.2330388 | 0.0433310 | 0.0706125 | -2878109172 | 1.603118 |
| 2019 | 0.2503584 | 0.0612129 | 0.0750071 | -31631742600 | 1.525658 |
| 2018 | 0.1979753 | 0.0406817 | 0.0611837 | -58227462999 | 1.626772 |
| 2017 | 0.2650072 | 0.0703877 | 0.0721071 | 3715746187 | 1.560892 |
| 2016 | 0.3688778 | 0.0747930 | 0.0648819 | 8372665487 | 1.327921 |
| 2015 | 0.3314376 | 0.0688019 | 0.0656092 | 35665986895 | 1.058998 |
| 2014 | 0.2847105 | 0.1223474 | 0.0648181 | 347785074890 | 1.223585 |
| year | DR | Debt_to_Equity_Ratio |
|---|---|---|
| 2024 | 0.6213808 | 1.2738661 |
| 2023 | 0.6506494 | 1.5979445 |
| 2022 | 0.4596484 | 0.7688015 |
| 2021 | 0.6505547 | 1.6670242 |
| 2020 | 0.5035040 | 0.8205138 |
| 2019 | 0.2670672 | 0.3272502 |
| 2018 | 0.4852825 | 0.7298466 |
| 2017 | 0.2879149 | 0.2949479 |
| 2016 | 0.2294028 | 0.1990036 |
| 2015 | 0.1569205 | 0.1496388 |
| 2014 | 0.0201563 | 0.0106786 |
Giải Thích: (1-2) nạp thư viện. (3-5) Bắt đầu với data frame d3 và chuyển nó cho lệnh tiếp theo. (6-7) Tạo hai bảng nhỏ riêng biệt.
library(knitr)
library(kableExtra)
bien_so <- c("year", "ROS", "ROA", "ROE", "EBIT", "OPM", "DR",
"Debt_to_Equity_Ratio", "LIQ", "Asset_Turnover_Ratio",
"COSR", "Revenue_Growth_Rate", "Net_Income_Growth_Rate")
y_nghia <- c(
"Năm ghi nhận dữ liệu.",
"Tỷ suất lợi nhuận trên doanh thu (Return On Sales).",
"Tỷ suất lợi nhuận trên tổng tài sản (Return On Assets).",
"Tỷ suất lợi nhuận trên vốn chủ sở hữu (Return On Equity).",
"Lợi nhuận trước lãi vay và thuế (Earnings Before Interest and Taxes).",
"Biên lợi nhuận hoạt động (Operating Profit Margin).",
"Tỷ lệ nợ trên tổng tài sản (Debt Ratio).",
"Tỷ lệ nợ trên vốn chủ sở hữu.",
"Tỷ số thanh khoản / Khả năng thanh toán (Liquidity Ratio).",
"Vòng quay tài sản.",
"Tỷ lệ giá vốn hàng bán trên doanh thu (Cost Of Sales Ratio).",
"Tốc độ tăng trưởng doanh thu.",
"Tốc độ tăng trưởng lợi nhuận ròng.")
df_giai_thich <- data.frame(`Biến_số` = bien_so,`Ý_nghĩa_và_Diễn_giải` = y_nghia)
df_giai_thich %>%
kable( caption = "Bảng giải thích ý nghĩa các biến số tài chính",
booktabs = TRUE, longtable = TRUE ) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
latex_options = c("striped", "repeat_header"), full_width = FALSE, position = "center" ) %>%
column_spec(1, bold = TRUE, width = "15em") %>% column_spec(2, width = "35em") | Biến_số | Ý_nghĩa_và_Diễn_giải |
|---|---|
| year | Năm ghi nhận dữ liệu. |
| ROS | Tỷ suất lợi nhuận trên doanh thu (Return On Sales). |
| ROA | Tỷ suất lợi nhuận trên tổng tài sản (Return On Assets). |
| ROE | Tỷ suất lợi nhuận trên vốn chủ sở hữu (Return On Equity). |
| EBIT | Lợi nhuận trước lãi vay và thuế (Earnings Before Interest and Taxes). |
| OPM | Biên lợi nhuận hoạt động (Operating Profit Margin). |
| DR | Tỷ lệ nợ trên tổng tài sản (Debt Ratio). |
| Debt_to_Equity_Ratio | Tỷ lệ nợ trên vốn chủ sở hữu. |
| LIQ | Tỷ số thanh khoản / Khả năng thanh toán (Liquidity Ratio). |
| Asset_Turnover_Ratio | Vòng quay tài sản. |
| COSR | Tỷ lệ giá vốn hàng bán trên doanh thu (Cost Of Sales Ratio). |
| 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. |
Giải thích: (1-2) Nạp thưu viện. (3-5) Tạo vector chứa tên các biến. (6-19) Tạo vector chứa phần giải thích tương ứng. (20) Tạo một data frame (bảng) từ hai vector trên. (21-26) Tạo và Định dạng Bảng với `kableExtr.
Ý nghĩa: 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.
library(dplyr)
library(tidyr)
library(psych)
library(knitr)
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),
do_nhon = psych::kurtosi(ROA, na.rm = TRUE))
thong_ke_doc <- thong_ke_mo_ta_roa %>%
pivot_longer( cols = everything(), names_to = "Chi_so_thong_ke", values_to = "Gia_tri" )
kable( thong_ke_doc,col.names = c("Chỉ số thống kê", "Giá trị"),
caption = "Bảng thống kê mô tả của ROA",
digits = 4 )| Chỉ số thống kê | Giá trị |
|---|---|
| so_quan_sat | 11.0000 |
| trung_binh | 0.0588 |
| trung_vi | 0.0515 |
| do_lech_chuan | 0.0254 |
| gia_tri_nho_nhat | 0.0344 |
| gia_tri_lon_nhat | 0.1223 |
| he_so_bien_thien | 43.2320 |
| do_xien | 1.2404 |
| do_nhon | 0.7265 |
Giải thích: (1-4) Nạp thư viện cần thiết cho phiên làm việc. (5-15) Tính toán thống kê mô tả. (16-17) Đê xoay bảng kết quả. (18-20) In kết quả dạng dọc với kable.
Ý 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 bình (0.0588) & Trung vị (0.0515):
Trung bình mỗi năm, 100 đồng tài sản tạo ra 5.88 đồng lợi nhuận
Trung vị thấp hơn trung bình là điểm quan trọng nhất: Nó cho thấy phần lớn các năm, hiệu suất thực tế của công ty thấp hơn mức 5.88%. Chỉ có một vài năm hoạt động xuất sắc đã “kéo” con số trung bình lên.
Độ lệch chuẩn (0.0254) & Hệ số biến thiên (43.23%):
Giá trị nhỏ nhất (0.0344) & lớn nhất (0.1223):
Độ xiên (1.2404 - Dương):Khẳng định lại kết luận từ trung bình/trung vị**: Dữ liệu bị “lệch phải”, có nghĩa là có một “cái đuôi” kéo dài về phía các giá trị ROA rất cao. Điều này xác nhận sự tồn tại của một vài năm hoạt động đột phá.
Độ nhọn (0.7265 - Dương): Dữ liệu có xu hướng tập trung quanh giá trị trung tâm, nhưng vẫn có khả năng xuất hiện các giá trị đột biến.
Kết luận: Công ty có nền tảng hoạt động ổn định nhưng đôi khi đạt được những thành tựu vượt trội.
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) )
thong_ke_doc <- thong_ke_mo_ta_dr %>%
pivot_longer( cols = everything(), names_to = "Chi_so_thong_ke", values_to = "Gia_tri" )
kable( thong_ke_doc,col.names = c("Chỉ số thống kê", "Giá trị"),
caption = "Bảng thống kê mô tả của DR",
digits = 4 )| Chỉ số thống kê | Giá trị |
|---|---|
| so_quan_sat | 11.0000 |
| trung_binh | 0.3939 |
| trung_vi | 0.4596 |
| do_lech_chuan | 0.2141 |
| gia_tri_nho_nhat | 0.0202 |
| gia_tri_lon_nhat | 0.6506 |
| he_so_bien_thien | 54.3627 |
| do_xien | -0.2332 |
| do_nhon | -1.4699 |
Giải thích:
filter(!is.na(DR)) có nghĩa là hãy giữ lại tất cả
các hàng mà giá trị trong cột DR không bị thiếu. (5-15)
Tính toán thống kê mô tả. (16-17) Đê xoay bảng kết quả. (18-20) In kết
quả dạng dọc với kable.Ý nghĩa: * Trung bình (0.3939): * Trung bình trong 11 năm, có 39.4% tài sản của công ty được tài trợ bằng nợ vay. Đây là một mức nợ trung bình.
=> Tỷ lệ nợ của công ty không ổn định và có xu hướng nghiêng về mức nợ cao trong các năm điển hình, dù bị ảnh hưởng bởi một vài năm có chính sách nợ rất thấp.
numeric_cols <- d3 %>%
select(-year, -EBIT) %>%
select_if(is.numeric) %>%
names()
correlation_matrix <- cor(d3[, numeric_cols], use = "pairwise.complete.obs")
kable(correlation_matrix["ROA", ])| x | |
|---|---|
| ROS | -0.4919230 |
| ROA | 1.0000000 |
| ROE | -0.2457952 |
| OPM | -0.1262530 |
| DR | -0.8704240 |
| Debt_to_Equity_Ratio | -0.7171233 |
| LIQ | 0.8480464 |
| Asset_Turnover_Ratio | 0.8600131 |
| COSR | -0.5426564 |
| Revenue_Growth_Rate | 0.1571748 |
| Net_Income_Growth_Rate | 0.0980653 |
Giải thích: (1) Bắt đầu với bảng dữ liệu d3. (2)
Loại bỏ** 2 cột là year và EBIT ra khỏi phân
tích. (3-4) Từ các cột còn lại, chỉ giữ lại những cột có dữ liệu là dạng
số (numeric). (5) Tính toán Ma trận Tương quan. (6) Trích xuất và Hiển
thị Kết quả cho ROA.
Ý nghĩa kinh tế: 1. Tương quan THUẬN mạnh nhất (cùng tăng, cùng giảm)
=>Kết luận : Để cải thiện ROA, công ty nên tập trung vào việc tăng vòng quay tài sản và quản lý thanh khoản tốt, đồng thời phải cực kỳ cẩn trọng với việc sử dụng nợ vay.
| x |
|---|
| -0.491923 |
Giải thích: (1) Tính toán hệ số tương quan cor. (2) Hiển thị kết quả.
Ý 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).
du_pont_analysis <- d3 %>%
mutate(ROA_DuPont_Calculated = ROS * Asset_Turnover_Ratio) %>%
select(year, ROA, ROS, Asset_Turnover_Ratio, ROA_DuPont_Calculated)
kable(du_pont_analysis)| year | ROA | ROS | Asset_Turnover_Ratio | ROA_DuPont_Calculated |
|---|---|---|---|---|
| 2024 | 0.0394025 | 1.7439167 | 0.0225943 | 0.0394025 |
| 2023 | 0.0344285 | 1.7419742 | 0.0197640 | 0.0344285 |
| 2022 | 0.0402674 | 1.3129536 | 0.0306694 | 0.0402674 |
| 2021 | 0.0514904 | 0.2581323 | 0.1994730 | 0.0514904 |
| 2020 | 0.0433310 | 0.2330388 | 0.1859389 | 0.0433310 |
| 2019 | 0.0612129 | 0.2503584 | 0.2445010 | 0.0612129 |
| 2018 | 0.0406817 | 0.1979753 | 0.2054886 | 0.0406817 |
| 2017 | 0.0703877 | 0.2650072 | 0.2656066 | 0.0703877 |
| 2016 | 0.0747930 | 0.3688778 | 0.2027582 | 0.0747930 |
| 2015 | 0.0688019 | 0.3314376 | 0.2075863 | 0.0688019 |
| 2014 | 0.1223474 | 0.2847105 | 0.4297255 | 0.1223474 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data frame) có tên là d3. (2) Hàm này dùng để tạo ra một cột mới. (4) Sau khi đã tính toán xong, hàm này được dùng để chọn ra những cột quan trọng nhất và sắp xếp lại chúng theo một thứ tự hợp lý để dễ dàng so sánh. (5) Lưu và hiển thị kết quả.
Ý 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 .
##
## 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
Giải thích: (1) lm(): Là hàm chính để tạo mô hình hồi quy tuyến tính. (2) Kết quả hồi quy.
ý 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.
##
## 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
Giải thích: (1) lm(): Là hàm chính để tạo mô hình hồi quy tuyến tính. (2) Kết quả hồi quy
ý 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 ( 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))
kable(d3 %>% select(year, DR, LIQ, DR_to_LIQ_Ratio))| year | DR | LIQ | DR_to_LIQ_Ratio |
|---|---|---|---|
| 2024 | 0.6213808 | 1.611330 | 0.3856323 |
| 2023 | 0.6506494 | 1.537840 | 0.4230931 |
| 2022 | 0.4596484 | 2.178081 | 0.2110337 |
| 2021 | 0.6505547 | 1.539262 | 0.4226407 |
| 2020 | 0.5035040 | 1.987635 | 0.2533181 |
| 2019 | 0.2670672 | 3.749484 | 0.0712277 |
| 2018 | 0.4852825 | 2.062396 | 0.2353003 |
| 2017 | 0.2879149 | 3.475884 | 0.0828321 |
| 2016 | 0.2294028 | 4.369723 | 0.0524982 |
| 2015 | 0.1569205 | 6.379700 | 0.0245968 |
| 2014 | 0.0201563 | 114.851936 | 0.0001755 |
Giải thích: (1) Tính toán tỷ lệ và cập nhật Data Frame (2) Bắt đầu chuỗi lệnh và tạo các cột tỷ lệ mutate. (3) In kết quả
Ý 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.
##
## 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
Giải thích: (1) lm(): Là hàm chính để tạo mô hình hồi quy tuyến tính. (2) Kết quả hồi quy
Ý 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.
Q1_ros <- quantile(d3$ROS, 0.25)
Q3_ros <- quantile(d3$ROS, 0.75)
IQR_ros <- Q3_ros - Q1_ros
outliers_ros <- d3$ROS[d3$ROS < (Q1_ros - 1.5 * IQR_ros) | d3$ROS > (Q3_ros + 1.5 * IQR_ros)]
kable(outliers_ros)| x |
|---|
| 1.743917 |
| 1.741974 |
Giải thích: (1) Tính Tứ phân vị thứ nhất (Q1). (2) Tính Tứ phân vị thứ ba (Q3) (3) Xác định và trích xuất các giá trị ngoại lai (4) Lưu và hiển thị kết quả
ý 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
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)
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
Giải thích: (1) Tạo ra một vector (một danh sách) chứa tên của tất cả các cột là chỉ số tài chính mà bạn muốn phân tích. (2) Tạo một bảng dữ liệu con (3) Xử lý dữ liệu bị thiếu (Missing Values) (4) Thực hiện Phân tích Thành phần chính (PCA) (5) Xem kết quả tóm tắt
Ý 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.
opm_roa_contribution <- d3 %>%
mutate(OPM_to_ROA_Ratio = ifelse(ROA != 0, OPM / ROA, NA)) %>%
select(year, OPM, ROA, OPM_to_ROA_Ratio)
kable(opm_roa_contribution)| year | OPM | ROA | OPM_to_ROA_Ratio |
|---|---|---|---|
| 2024 | -6.810593 | 0.0394025 | -172.84663 |
| 2023 | 7.444671 | 0.0344285 | 216.23600 |
| 2022 | 7.466662 | 0.0402674 | 185.42674 |
| 2021 | 1.205486 | 0.0514904 | 23.41185 |
| 2020 | 1.603118 | 0.0433310 | 36.99706 |
| 2019 | 1.525658 | 0.0612129 | 24.92381 |
| 2018 | 1.626772 | 0.0406817 | 39.98783 |
| 2017 | 1.560892 | 0.0703877 | 22.17565 |
| 2016 | 1.327921 | 0.0747930 | 17.75462 |
| 2015 | 1.058998 | 0.0688019 | 15.39198 |
| 2014 | 1.223585 | 0.1223474 | 10.00091 |
Giải thích:
Ý 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.
equity_turnover <- d3 %>%
mutate(Equity_Turnover = ifelse(ROS != 0, ROE / ROS, NA)) %>%
select(year, ROE, ROS, Equity_Turnover)
kable(equity_turnover)| year | ROE | ROS | Equity_Turnover |
|---|---|---|---|
| 2024 | 0.0807774 | 1.7439167 | 0.0463195 |
| 2023 | 0.0845536 | 1.7419742 | 0.0485390 |
| 2022 | 0.0673508 | 1.3129536 | 0.0512971 |
| 2021 | 0.1319425 | 0.2581323 | 0.5111427 |
| 2020 | 0.0706125 | 0.2330388 | 0.3030074 |
| 2019 | 0.0750071 | 0.2503584 | 0.2995987 |
| 2018 | 0.0611837 | 0.1979753 | 0.3090471 |
| 2017 | 0.0721071 | 0.2650072 | 0.2720947 |
| 2016 | 0.0648819 | 0.3688778 | 0.1758898 |
| 2015 | 0.0656092 | 0.3314376 | 0.1979535 |
| 2014 | 0.0648181 | 0.2847105 | 0.2276631 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data frame) d3. (2) Bắt đầu chuỗi lệnh và tạo các cột tỷ lệ mutate. (3) Lựa chọn các cột để hiển thị select. (4) Lưu và hiển thị kết quả
Ý 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.
roe_dependency_analysis <- d3 %>%
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)
kable(roe_dependency_analysis)| year | ROA_to_ROE_Ratio | DR_to_ROE_Ratio |
|---|---|---|
| 2024 | 0.4877913 | 7.6925060 |
| 2023 | 0.4071790 | 7.6951115 |
| 2022 | 0.5978765 | 6.8246934 |
| 2021 | 0.3902491 | 4.9305940 |
| 2020 | 0.6136448 | 7.1305263 |
| 2019 | 0.8160949 | 3.5605609 |
| 2018 | 0.6649102 | 7.9315650 |
| 2017 | 0.9761552 | 3.9928808 |
| 2016 | 1.1527567 | 3.5356994 |
| 2015 | 1.0486620 | 2.3917450 |
| 2014 | 1.8875500 | 0.3109673 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data frame) d3. (2-3) Bắt đầu chuỗi lệnh và tạo các cột tỷ lệ mutate. (4) Lựa chọn các cột để hiển thị select. (5) Lưu và hiển thị kết quả
Ý 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.
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) %>%
select(year, OPM_Pct_Change, ROS_Pct_Change, OPM_vs_ROS_Trend)
kable(opm_ros_cost_efficiency)| year | OPM_Pct_Change | ROS_Pct_Change | OPM_vs_ROS_Trend |
|---|---|---|---|
| 2014 | NA | NA | NA |
| 2015 | -13.4512245 | 16.4121432 | -29.86337 |
| 2016 | 25.3942028 | 11.2963032 | 14.09790 |
| 2017 | 17.5440218 | -28.1585345 | 45.70256 |
| 2018 | 4.2206120 | -25.2943595 | 29.51497 |
| 2019 | -6.2155782 | 26.4593916 | -32.67497 |
| 2020 | 5.0771671 | -6.9179446 | 11.99511 |
| 2021 | -24.8036712 | 10.7679758 | -35.57165 |
| 2022 | 519.3900232 | 408.6358890 | 110.75413 |
| 2023 | -0.2945176 | 32.6759915 | -32.97051 |
| 2024 | -191.4827910 | 0.1115085 | -191.59430 |
Giaii thích:
Ý 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.
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)
growth_inflection_points %>%
tidyr::pivot_longer(cols = -year, names_to = "Chi_so", values_to = "Gia_tri") %>%
knitr::kable( col.names = c("Năm", "Chỉ số", "Giá trị"), caption = "Chi tiết các điểm uốn tăng trưởng theo từng năm",
digits = 4 )| Năm | Chỉ số | Giá trị |
|---|---|---|
| 2016 | Revenue_Growth_Rate | -0.0398 |
| 2016 | Rev_Growth_Change | 0.0197 |
| 2016 | Net_Income_Growth_Rate | 0.0686 |
| 2016 | Net_Inc_Growth_Change | -0.0262 |
| 2016 | Rev_Inflection_Sign | 1.0000 |
| 2016 | Net_Inc_Inflection_Sign | 0.0000 |
| 2017 | Revenue_Growth_Rate | 0.6757 |
| 2017 | Rev_Growth_Change | 0.7155 |
| 2017 | Net_Income_Growth_Rate | 0.2038 |
| 2017 | Net_Inc_Growth_Change | 0.1352 |
| 2017 | Rev_Inflection_Sign | 0.0000 |
| 2017 | Net_Inc_Inflection_Sign | 1.0000 |
| 2018 | Revenue_Growth_Rate | 0.1318 |
| 2018 | Rev_Growth_Change | -0.5438 |
| 2018 | Net_Income_Growth_Rate | -0.1545 |
| 2018 | Net_Inc_Growth_Change | -0.3583 |
| 2018 | Rev_Inflection_Sign | 1.0000 |
| 2018 | Net_Inc_Inflection_Sign | 1.0000 |
| 2019 | Revenue_Growth_Rate | 0.0350 |
| 2019 | Rev_Growth_Change | -0.0968 |
| 2019 | Net_Income_Growth_Rate | 0.3089 |
| 2019 | Net_Inc_Growth_Change | 0.4633 |
| 2019 | Rev_Inflection_Sign | 0.0000 |
| 2019 | Net_Inc_Inflection_Sign | 1.0000 |
| 2020 | Revenue_Growth_Rate | 0.0495 |
| 2020 | Rev_Growth_Change | 0.0145 |
| 2020 | Net_Income_Growth_Rate | -0.0231 |
| 2020 | Net_Inc_Growth_Change | -0.3320 |
| 2020 | Rev_Inflection_Sign | 1.0000 |
| 2020 | Net_Inc_Inflection_Sign | 1.0000 |
| 2021 | Revenue_Growth_Rate | 0.9296 |
| 2021 | Rev_Growth_Change | 0.8801 |
| 2021 | Net_Income_Growth_Rate | 1.1374 |
| 2021 | Net_Inc_Growth_Change | 1.1605 |
| 2021 | Rev_Inflection_Sign | 0.0000 |
| 2021 | Net_Inc_Inflection_Sign | 1.0000 |
| 2022 | Revenue_Growth_Rate | -0.8979 |
| 2022 | Rev_Growth_Change | -1.8275 |
| 2022 | Net_Income_Growth_Rate | -0.4809 |
| 2022 | Net_Inc_Growth_Change | -1.6182 |
| 2022 | Rev_Inflection_Sign | 1.0000 |
| 2022 | Net_Inc_Inflection_Sign | 1.0000 |
| 2023 | Revenue_Growth_Rate | 0.0043 |
| 2023 | Rev_Growth_Change | 0.9022 |
| 2023 | Net_Income_Growth_Rate | 0.3325 |
| 2023 | Net_Inc_Growth_Change | 0.8133 |
| 2023 | Rev_Inflection_Sign | 1.0000 |
| 2023 | Net_Inc_Inflection_Sign | 1.0000 |
| 2024 | Revenue_Growth_Rate | 0.0205 |
| 2024 | Rev_Growth_Change | 0.0162 |
| 2024 | Net_Income_Growth_Rate | 0.0216 |
| 2024 | Net_Inc_Growth_Change | -0.3108 |
| 2024 | Rev_Inflection_Sign | 0.0000 |
| 2024 | Net_Inc_Inflection_Sign | 1.0000 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data
frame) d3. (2) Bắt đầu và Sắp xếp (arrange). (3-6) Tính
toán các chỉ số thay đổi và dấu hiệu điểm uốn (mutate). (7)
Lọc ra các năm có điểm uốn (filter). (8-9) Chọn các cột cần
thiết (select). (10-11) Chuyển đổi cấu trúc bảng
(pivot_longer). (12-13) Tạo bảng kết quả đẹp.
Ý 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.
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))
kable(ebit_per_estimated_asset_volatility)| EBIT_per_Asset_Volatility |
|---|
| 3.738252 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data
frame) d3. (2-3) Tính toán các chỉ số thay đổi và dấu hiệu điểm uốn
(mutate). (4) Tổng hợp dữ liệu để tính độ biến động
(summarise) (5) Lưu và hiển thị kết quả
ý 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( EBIT_Pct_Change = (EBIT - lag(EBIT)) / abs(lag(EBIT)) * 100,
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)
kable(operating_leverage)| year | EBIT_Pct_Change | Revenue_Pct_Change | Operating_Leverage_Ratio |
|---|---|---|---|
| 2015 | -89.74482 | -5.9490280 | 15.0856274 |
| 2016 | -76.52479 | -3.9835782 | 19.2100634 |
| 2017 | -55.62051 | 67.5657053 | -0.8232062 |
| 2018 | -1667.04630 | 13.1827272 | -126.4568608 |
| 2019 | 45.67556 | 3.5012640 | 13.0454491 |
| 2020 | 90.90120 | 4.9506341 | 18.3615267 |
| 2021 | -1585.91293 | 92.9584903 | -17.0604420 |
| 2022 | -336.83982 | -89.7934533 | 3.7512737 |
| 2023 | 62.06812 | 0.4299403 | 144.3645118 |
| 2024 | -75.90383 | 2.0479365 | -37.0635651 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data frame) d3. (2-4) Bắt đầu và sắp xếp dữ liệu arrange,tính toán các chỉ số thay đổi mutate (5) Lựa chọn các cột để hiển thị select. (6) Lưu và hiển thị kết quả
ý 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ẽ.
net_inc_atr_growth_sustainability <- d3 %>%
arrange(year) %>%mutate(
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)
kable(net_inc_atr_growth_sustainability)| year | Net_Income_Growth_Rate | ATR_Pct_Change | Growth_Sustainability_Gap |
|---|---|---|---|
| 2014 | 0.1509208 | NA | NA |
| 2015 | 0.0948675 | -51.693280 | 51.788148 |
| 2016 | 0.0686273 | -2.325810 | 2.394437 |
| 2017 | 0.2038166 | 30.996738 | -30.792921 |
| 2018 | -0.1544612 | -22.634254 | 22.479793 |
| 2019 | 0.3088707 | 18.985193 | -18.676323 |
| 2020 | -0.0230979 | -23.951679 | 23.928581 |
| 2021 | 1.1373621 | 7.278794 | -6.141432 |
| 2022 | -0.4808584 | -84.624805 | 84.143946 |
| 2023 | 0.3324642 | -35.557696 | 35.890161 |
| 2024 | 0.0216173 | 14.320072 | -14.298455 |
**Giải thích:**
ý 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)) %>%
select(year, Revenue_Growth_Rate, Net_Income_Growth_Rate)
kable(growth_imbalance_years)| year | Revenue_Growth_Rate | Net_Income_Growth_Rate |
|---|---|---|
| 2020 | 0.0495063 | -0.0230979 |
| 2018 | 0.1318273 | -0.1544612 |
| 2016 | -0.0398358 | 0.0686273 |
| 2015 | -0.0594903 | 0.0948675 |
Giải thích: (1) Bắt đầu với bảng dữ liệu (data frame) d3. (2-4) Đây là hàm cốt lõi, dùng để giữ lại những hàng (năm) thỏa mãn một điều kiện logic phức tạp bên trong. (5) Lựa chọn các cột để hiển thị select. (6) Lưu và hiển thị kết quả
Ý 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.
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)") +
annotate("text", x = min(d3$year), y = max(d3$ROS),
label = "Trendline included", hjust = -0.1, vjust = 1.5, color = "darkgreen")
print(p1)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6-7) Thêm chú thích tùy chỉnh (8) In biểu đồ
Ý nghĩa: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)") +
annotate("text", x = min(d3$year), y = max(d3$ROA),
label = "Trendline included", hjust = -0.1, vjust = 1.5, color = "darkgreen")
print(p2)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6-7) Thêm chú thích tùy chỉnh (8) In biểu đồ
Ý nghĩa 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.
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") +
labs(title = "ROS vs ROA by Year", x = "Return on Sales (ROS)", y = "Return on Assets (ROA)") +
geom_text(aes(label = year), vjust = -1.5, size = 3)
print(p3)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6) Thêm chú thích tùy chỉnh (7) In biểu đồ
Ý nghĩa: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).
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)Giải thích: (1-2) xử lý dữ liệu. (3) Vẽ biểu đồ
(ggplot2). (4) Vẽ các điểm dữ liệu. (5) Tùy chỉnh thang đo
kích thước. (6) Đặt tiêu đề và nhãn. (7) Áp dụng giao diện (8) in biểu
đồ
Ý nghĩa: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. 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.
data_for_p5 <- d3 %>%
select(year, ROS, ROA) %>%
tidyr::pivot_longer(cols = c(ROS, ROA), names_to = "Metric", values_to = "Value")
plot_p5 <- ggplot(data_for_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") +
geom_text(aes(label = round(Value, 2)), vjust = -1.5, size = 3)
print(plot_p5)**Giải thích:** (1-3) xử lý dữ liệu. (4) Vẽ biểu đồ (ggplot2`).
(5) Vẽ các đường nói điểm dữ liệu. (6) Vẽ các điểm dữ liệu. (7) Tùy
chỉnh thang đo kích thước. (8) Đặt tiêu đề và nhãn. (9) Áp dụng giao
diện. (10) in biểu đồ.
Ý nghĩa: 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).
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)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6) Thêm chú thích tùy chỉnh (7) In biểu đồ Ý nghĩaBiể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.
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)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6) Thêm chú thích tùy chỉnh (7) In biểu đồ Ý nghĩa: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") +
labs(title = "Revenue Growth vs Net Income Growth", x = "Revenue Growth Rate", y = "Net Income Growth Rate")
print(p8)Giải thích: (1) Khởi tạo biểu đồ (2) Vẽ đường nối các điểm dữ liệu (3) Vẽ các điểm dữ liệu (4) Vẽ đường xu hướng (Trendline) (5) Đặt tiêu đề và nhãn (6) Thêm chú thích tùy chỉnh (7) In biểu đồ Ý nghĩa: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_stacked <- d3 %>%
select(year, ROS, ROA) %>%
tidyr::pivot_longer(cols = c(ROS, ROA), names_to = "Metric", values_to = "Value")
p9 <- ggplot(df_stacked, 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") +
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")
print(p9)Giải thích:
Ý nghĩa:
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.
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)") + 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)Giải thích: (1) Khởi tạo biểu đồ. (2) Vẽ các điểm dữ liệu. (3) Vẽ đường xu hướng. (4) Tùy chỉnh thang màu. (5-6) Đặt tiêu đề và nhãn (6-8) Thêm chú thích tùy chỉnh (9) in biểu đô
Ý nghĩa: 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.
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") +
geom_text(aes(label = year), vjust = -1.5, size = 2, check_overlap = TRUE)
print(p11)Giải thích: Giải thích: (1) Khởi tạo biểu đồ. (2) Vẽ các điểm dữ liệu. (3) Vẽ đường xu hướng. (4) Tùy chỉnh thang màu. (5-6) Đặt tiêu đề và nhãn (6-8) Thêm chú thích tùy chỉnh (9) in biểu đô
Ý nghĩa: 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.
df_ratio <- 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_ratio, 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", x = "Year", y = "Proportion") +
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)
Giải thích: (1) Chuẩn bị dữ liệu. (2) Tạo một cột tạm
thời tên là Total_Profitability, là tổng của ROS và ROA. (3) Tạo ra hai
cột mới. (4) Chỉ giữ lại các cột cần thiết cho việc vẽ: năm, và hai cột
tỷ trọng vừa tính. (5) Tái cấu trúc dữ liệu từ dạng “rộng” sang “dài”
Gom 2 cột ROS_Ratio và ROA_Ratio thành 2 cột mới. (6) Loại bỏ bất kỳ
hàng nào có giá trị tỷ lệ bị thiếu NA. (7-13) Vẽ Biểu đồ: Bắt đầu vẽ, Vẽ
biểu đồ cột, Tự chỉ định màu sắc (xanh lá nhạt và xanh da trời) cho mỗi
chỉ số,đặt tiêu đề cho biểu đồ và các,Thêm nhãn số liệu (dạng %) vào
giữa mỗi phần của cột trục,Định dạng các nhãn trên trục Y thành dạng
phần trăm. (14) In biểu đồ.
Ý nghĩa: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).
df_debt_summary <- d3 %>%
group_by(year) %>%
summarise( avg_DR = mean(DR, na.rm = TRUE), avg_Debt_to_Equity = mean(Debt_to_Equity_Ratio, na.rm = TRUE)) %>%
ungroup() %>%
pivot_longer( cols = c("avg_DR", "avg_Debt_to_Equity"), names_to = "Metric", values_to = "Value")
p13 <- ggplot(df_debt_summary, aes(x = year, y = Value, color = Metric, shape = Metric, group = Metric)) +
geom_line(linewidth = 1.2) + geom_point(size = 4, stroke = 1.5) +
geom_text( aes(label = round(Value, 2)), vjust = -1.5,size = 3.5,show.legend = FALSE ) +
scale_color_manual(name = "Chỉ số nợ", labels = c("avg_DR" = "Tỷ lệ nợ trên TS (DR)", "avg_Debt_to_Equity" = "Tỷ lệ nợ trên VCSH"),
values = c("avg_DR" = "darkred", "avg_Debt_to_Equity" = "darkorange")) +
scale_shape_manual(name = "Chỉ số nợ", labels = c("avg_DR" = "Tỷ lệ nợ trên TS (DR)", "avg_Debt_to_Equity" = "Tỷ lệ nợ trên VCSH"),
values = c("avg_DR" = 16, "avg_Debt_to_Equity" = 17))
labs( title = "Xu hướng trung bình các chỉ số nợ qua các năm",
subtitle = "So sánh Tỷ lệ nợ trên Tổng tài sản (DR) và Tỷ lệ nợ trên Vốn chủ sở hữu",
x = "Năm",
y = "Giá trị trung bình của chỉ số" ) +
theme_minimal() +
theme( plot.title = element_text(hjust = 0.5, face = "bold", size = 16), plot.subtitle = element_text(hjust = 0.5, size = 12),
legend.position = "bottom" )## NULL
Giải thích: (1) Chuẩn bị dữ liệu. (2) Nhóm tất cả các
dòng dữ liệu lại theo từng năm. Mọi phép tính sau đó sẽ được thực hiện
riêng cho mỗi năm. (3) Từ mỗi nhóm năm, tính toán giá trị tóm tắt. (4)
Hủy bỏ việc nhóm dữ liệu để các lệnh sau không bị ảnh hưởng. (5) Tái cấu
trúc** bảng dữ liệu từ dạng “rộng” sang “dài”, gom 2 cột chỉ số thành 2
cột mới. (6) Vẽ Biểu đồ. (7-8) Thêm các Lớp và Tùy chỉnh Chi tiết: Vẽ
các đường nối và các điểm dữ liệu,thêm nhãn số liệu (đã làm tròn) ngay
phía trên mỗi điểm. (9-11) Tùy chỉnh phần chú thích,chỉ định màu sắc**
(đỏ đậm, cam đậm) và hình dạng (tròn, tam giác) cụ thể cho từng chỉ số.
(12-19) Đặt tiêu đề chính, tiêu đề phụ và nhãn cho các trục X, Y. (20)
In biểu đồ
Ý nghĩa: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.
df_long <- d3 %>%
select(year, Revenue_Growth_Rate, Net_Income_Growth_Rate) %>%
pivot_longer(cols = c(Revenue_Growth_Rate, Net_Income_Growth_Rate),
names_to = "Metric", values_to = "Value") %>%
mutate(Metric = ifelse(Metric == "Revenue_Growth_Rate", "Revenue Growth", "Net Income Growth"))
p14 <- ggplot(df_long, aes(x = year, y = Value, color = Metric, linetype = Metric, shape = Metric)) +
geom_line(size = 1.2) + geom_point(size = 3) +
scale_color_manual(name = "Growth Metric",
values = c("Revenue Growth" = "darkblue", "Net Income Growth" = "darkred")) +
scale_linetype_manual(name = "Growth Metric",
values = c("Revenue Growth" = "solid", "Net Income Growth" = "dashed")) +
scale_shape_manual(name = "Growth Metric",
values = c("Revenue Growth" = 16, "Net Income Growth" = 17)) +
labs(title = "Revenue and Net Income Growth Over Years", x = "Year", y = "Growth Rate")
print(p14)Giải thích: (1) Chuẩn bị dữ liệu (2) Chỉ chọn các
cột cần thiết: năm và hai chỉ số tăng trưởng. (3-4) Tái cấu
trúc dữ liệu từ dạng “rộng” sang “dài”. Thay vì có 2 cột cho 2 chỉ số,
nó tạo ra 2 cột mới Metric (chứa tên chỉ số) và
Value (chứa giá trị). (5) Đổi tên các chỉ số trong cột
Metric cho ngắn gọn và đẹp hơn (6) Vẽ biểu đồ (7) Thêm các
lớp và tùy chỉnh,vẽ các đường nố, vẽ các điểm dữ liệu tại mỗi năm.
(8-13) Gán màu xanh đậm (darkblue) cho “Revenue Growth” và
màu đỏ đậm (darkred) cho “Net Income Growth”,Gán kiểu đường
liền (solid) cho “Revenue Growth” và đường đứt
(dashed) cho “Net Income Growth”. Gán hình tròn
(16) cho “Revenue Growth” và hình tam giác
(17) cho “Net Income Growth”. (14) Đặt tiêu đề chính cho
biểu đồ và nhãn cho các trục X, Y. (15) in biểu đồ
Ý nghĩa: 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 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: 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: 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)
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") +
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)Giải thích: (1-3) Chuẩn bị dữ liệu và lưu vào một biến có tên ‘df_profit_long’ gọi trong ggplot (4-12) Vẽ biểu đồ từ dataframe đã tạo ở trên (13) in biểu đồ ra màn hinh
Ý nghĩa: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.
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)
Giải thích: (1) Bắt đầu tạo biểu đồ với dữ liệu là d3
(2-4) Vẽ các đường nói các điểm dữ liệu (5-7) Vẽ các điểm tròn tại mỗi
điểm dữ liệu (8-9) Thêm nhãn dán vào biểu đồ (10) Hàm dùng để thiết lập
tất cả các nhãn dán (11) Áp dụng một giao diện có sẵn, trông sạch sẽ,
tối giản với nền trắng (12) Đây là lệnh “kết quả” cho việc tạo nhóm màu
(13-15) Thêm đường làm mượt xu hướng dữ liệu (16) in biểu đồ
Ý nghĩa:Đườ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.
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)") +
geom_hline(yintercept = 2, linetype = "dashed", color = "red", size = 0.8) +
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)
Giải thích: (1) Bắt đầu tạo một đối tượng biểu đồ và
lưu nó vào biến
p17 (2) Đây là lệnh để vẽ biểu đồ cột. (3)
Thêm văn bản (nhãn) vào biểu đồ. (4) Hàm chuyên dùng để thiết lập các
nhãn (labels) cho biểu đồ. (5) Vẽ một đường kẻ ngang (h là
horizontal) trên biểu đồ. Đó là đường tham chiếu cho LIQ lý tưởng >=
2 (6) Thêm một chú thích tĩnh (không phụ thuộc vào dữ liệu) vào biểu đồ
(7) Tinh chỉnh vị trí của văn bản so với điểm tọa độ (8) in biểu đồ
Ý nghĩa: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.
library(tidyverse)
p18_grouped_bar <- d3 %>%
pivot_longer(cols = c(COSR, `Asset_Turnover_Ratio`),names_to = "Chi_so",
values_to = "Gia_tri" ) %>%
ggplot(aes(x = factor(year), y = Gia_tri, fill = Chi_so)) +
geom_col(position = "dodge", width = 0.7) +
geom_text( aes(label = round(Gia_tri, 2)), position = position_dodge(width = 0.7),
vjust = -0.5,
size = 3.5) +
scale_fill_manual(name = "Chỉ số:", values = c("COSR" = "#1f77b4", "Asset Turnover Ratio" = "#ff7f0e") ) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
labs( title = "So sánh COSR và Tỷ lệ Vòng quay Tài sản theo Năm",
subtitle = "Giá trị trung bình của các chỉ số qua các năm",x = "Năm", y = "Giá trị Trung bình") +
theme_minimal(base_size = 14) +
theme( legend.position = "top", plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5) )
print(p18_grouped_bar)Giải thích: (1) Nạp thư viện (2-4) Chuẩn bị dữ liệu pivot_longer Sắp xếp lại bảng dữ liệu. Thay vì để mỗi chỉ số một cột, nó gom chúng lại thành 2 cột: một cột Chi_so chứa tên và một cột Gia_tri chứa giá trị. Việc này là cần thiết để vẽ biểu đồ nhóm. (5-9) Dữ liệu đã đúng định dạng, giờ đưa vào ggplot để vẽ.ggplot() bây giờ sẽ tự động nhận dữ liệu từ lệnh pivot_longer ở trên và vẽ biểu đồ chính (10-16) Làm đẹp & Chú thích:Tự chọn màu cụ thể cho mỗi chỉ số màu xanh và màu cam,đặt tiêu đề cho biểu đồ và tên cho các trục,Tinh chỉnh giao diện (nền trắng, chú thích ở trên, chữ đậm…) (17) in biểu đồ ra
Ý nghĩa: 1. Giai đoạn 2014 - 2021: Giai đoạn ổn định, hiệu quả thấp:Tỷ lệ Vòng quay Tài sản (Cột xám): Chỉ số này luôn ở mức rất thấp (dưới 1) và gần như đi ngang. Điều này cho thấy công ty sử dụng tài sản để tạo ra doanh thu không hiệu quả và không có sự cải thiện đáng kể trong nhiều năm. * COSR (Cột xanh): Chỉ số này cũng ở mức rất thấp, ổn định trong suốt giai đoạn này.
2. Giai đoạn 2022 - 2024: Giai đoạn đột phá:Tỷ lệ Vòng quay Tài sản (Cột xám): Vẫn tiếp tục ở mức rất thấp, cho thấy hiệu quả sử dụng tài sản vẫn chưa được cải thiện. * COSR (Cột xanh): Chỉ số này tăng vọt một cách đột biến từ năm 2022 và tiếp tục tăng mạnh trong các năm sau đó. =>Kết luận :Sự tương phản này cho thấy có một sự thay đổi mang tính cấu trúc hoặc một sự kiện đặc biệt đã xảy ra với công ty vào năm 2022. Dù công ty vẫn chưa cải thiện được khả năng tạo doanh thu từ tài sản (Vòng quay tài sản thấp), một yếu tố khác (được đo bằng COSR) đã cải thiện vượt bậc. Điều này có thể là do công ty đã thay đổi mô hình kinh doanh, tập trung vào một sản phẩm/dịch vụ có giá trị rất cao, hoặc có một sự kiện tài chính lớn. Năm 2022 rõ ràng là một bước ngoặt quan trọng trong hoạt động của công ty.
library(ggplot2)
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)Giải thích: (1) nạp thư viện (2) Tạo một đối tượng
biểu đồ và gán nó vào biến tên là p19. (3) Thêm một lớp
(layer) biểu đồ histogram vào đối tượng p19 (4) Hàm để đặt
nhãn và tiêu đề cho biểu đồ. (5) Áp dụng một giao diện (theme) có sẵn
tên là minimal. Giao diện này có nền trắng, đường kẻ mờ,
trông rất sạch sẽ và hiện đại. (6) Thêm một lớp biểu đồ đường cong mật
độ. (7) in biểu đồ.
Ý nghĩa:
Trạng thái phổ biến nhất (Cột cao nhất ở giữa): Phần lớn thời gian, biên lợi nhuận hoạt động (OPM) của công ty rơi vào khoảng dương nhưng thấp (khoảng 1% - 3%). Đây có thể coi là tình trạng hoạt động “bình thường” và chủ yếu của công ty.
Trạng thái Lợi nhuận cao (Cột bên phải): Có một số ít giai đoạn, công ty hoạt động rất hiệu quả, đạt được biên lợi nhuận cao (khoảng 7%). Điều này xảy ra ít thường xuyên hơn.
Trạng thái Lỗ (Cột bên trái): Rất hiếm khi, công ty đã có lúc kinh doanh dưới giá vốn, dẫn đến biên lợi nhuận bị âm (lỗ).
=> Thay vì tập trung quanh một giá trị trung bình duy nhất (như hình quả chuông), hiệu suất hoạt động của công ty lại phân cực thành ba nhóm riêng biệt. Điều này cho thấy hoạt động kinh doanh của công ty có thể bị ảnh hưởng bởi những yếu tố chu kỳ hoặc sự kiện đặc biệt, khiến hiệu quả kinh doanh thay đổi rõ rệt giữa các thời kỳ “bình thường”, “rất tốt”, và “rất tệ”.
library(ggplot2)
library(dplyr)
library(tidyr)
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()
static_plot <- ggplot(p20, aes(x = year, y = Value, color = Metric, group = Metric)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
labs(title = "Xu hướng Hiệu suất Tài chính qua các Năm",
subtitle = "So sánh ROS, ROA, và ROE",
x = "Năm",
y = "Giá trị", color = "Chỉ số" ) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
theme_minimal(base_size = 14) +
theme( plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
plot.subtitle = element_text(hjust = 0.5, size = 12), legend.position = "bottom" )
print(static_plot)
Giải thích: (1-3) Nạp thư viện cần thiết cho phiên làm
việc. (4) Lấy dữ liệu từ bảng
d3 để bắt đầu xử lý và lưu
kết quả vào một bảng mới tên là p20. (5) Chuyển đổi giá trị
cột ROS sang dạng số thập phân. (6) xoay 3 cột chỉ số
(ROS, ROA, ROE) thành 2 cột mới.
(7) Xóa các dòng có dữ liệu bị thiếu. (8) Khởi tạo một đối tượng biểu
đồ, sử dụng data frame p20 đã chuẩn bị. (9) Vẽ các đường
nối:** Tạo các đường thẳng nối các điểm dữ liệu. (10) Vẽ các điểm dữ
liệu:** Thêm các điểm tròn tại mỗi điểm dữ liệu. (11-14) Đặt tiêu đề và
nhãn cho các trục,định dạng trục. (15-19) Sử dụng theme tối giản và tùy
chỉnh giao diện,hiển thị biểu đồ.
Ý nghĩa: 1. ROE (Màu xanh lá - Tỷ suất sinh lời trên Vốn chủ sở hữu): Đây là chỉ số cao nhất và biến động mạnh nhất. ROE có xu hướng tăng từ 2018 đến đỉnh điểm vào khoảng năm 2021 (vượt 12%), sau đó sụt giảm mạnh và đang có dấu hiệu phục hồi nhẹ. * Ý nghĩa kinh tế: Chỉ số này cho biết mỗi 100 đồng vốn mà cổ đông bỏ ra thì tạo ra được bao nhiêu đồng lợi nhuận. * ROE cao và biến động: Cho thấy lợi nhuận dành cho cổ đông rất hấp dẫn nhưng cũng đi kèm với rủi ro cao. Sự biến động mạnh có thể do kết quả kinh doanh không ổn định hoặc do tác động của việc sử dụng nợ. Năm 2021 là một năm kinh doanh đặc biệt thành công.
2. ROA (Màu đỏ - Tỷ suất sinh lời trên Tổng tài sản): Luôn thấp hơn ROE. ROA bắt đầu ở mức rất cao (khoảng 12%) rồi sụt giảm mạnh, sau đó có xu hướng giảm dần qua các năm. * Ý nghĩa kinh tế: Chỉ số này đo lường hiệu quả của công ty trong việc sử dụng toàn bộ tài sản (bao gồm cả vốn chủ sở hữu và nợ vay) để tạo ra lợi nhuận. * Xu hướng giảm của ROA là một dấu hiệu đáng lo ngại. Nó cho thấy khả năng sinh lời từ tài sản của công ty đang ngày càng kém hiệu quả đi theo thời gian.
3. ROS (Màu xanh dương - Tỷ suất sinh lời trên Doanh thu): Rất thấp, gần như đi ngang và chỉ nhích nhẹ lên vào những năm cuối. Chỉ số này luôn duy trì ở mức dưới 2%. * Ý nghĩa kinh tế: Đây chính là biên lợi nhuận ròng, cho biết cứ 100 đồng doanh thu tạo ra thì công ty thu về được bao nhiêu đồng lợi nhuận sau thuế. * ROS rất thấp nhưng ổn định: Điều này cho thấy công ty có thể đang hoạt động trong một ngành có tính cạnh tranh cao, biên lợi nhuận mỏng bán lẻ, phân phối. Sự ổn định cho thấy công ty quản lý chi phí và giá bán khá nhất quán qua các năm.