library(readr)
library(data.table)
library(ggplot2)
library(dplyr)
library(skimr)
library(psych)
library(csv)
library(DT)
library(pander)
library(formattable)
library(htmltools)
library(DescTools)
library(epitools)
library(MASS)
library(fmsb)
library(brglm2)
library(janitor)
library(lubridate)
library(ggridges)
Bộ dữ liệu Movie Dataset for Analytics & Visualization gồm 999.999 quan sát phim tổng hợp, mô phỏng đặc trưng thực tế của ngành điện ảnh toàn cầu trong giai đoạn 1950 – 2025. Mỗi phim có ngày phát hành ngẫu nhiên trong năm tương ứng và được phân loại theo tám thể loại chính như Drama, Action, Comedy, Thriller, Romance, Sci-Fi, Horror và Documentary, kèm thông tin về quốc gia sản xuất và thời lượng.
Ngoài ra các biến tài chính trong bộ dữ liệu gồm BudgetUSD, US_BoxOfficeUSD, Global_BoxOfficeUSD, Opening_Day_SalesUSD, One_Week_SalesUSD, cùng các chỉ số phản hồi khán giả như IMDbRating, RottenTomatoesScore, NumVotesIMDb, NumVotesRT, và thông tin diễn viên gồm Director và LeadActor. Các biến này thể hiện mối quan hệ giữa đầu tư, doanh thu và phản ứng của thị trường.
Bộ dữ liệu được xây dựng nhằm phục vụ mục đích phân tích tài chính, đánh giá hiệu quả đầu tư và dự báo doanh thu trong ngành điện ảnh. Với quy mô lớn và cấu trúc đa chiều, dữ liệu thích hợp cho phân tích định lượng, trực quan hóa và mô hình hóa trong lĩnh vực kinh tế – tài chính ứng dụng.
d<- read_csv("C:/Users/PC/OneDrive/Máy tính/RRRR/Tiểu Luận R.csv")
names(d)
## [1] "MovieID" "Title" "Genre"
## [4] "ReleaseYear" "ReleaseDate" "Country"
## [7] "BudgetUSD" "US_BoxOfficeUSD" "Global_BoxOfficeUSD"
## [10] "Opening_Day_SalesUSD" "One_Week_SalesUSD" "IMDbRating"
## [13] "RottenTomatoesScore" "NumVotesIMDb" "NumVotesRT"
## [16] "Director" "LeadActor"
d <- d %>%
rename(
IDPhim = MovieID,
Title = Title,
Genre = Genre,
NamPhatHanh = ReleaseYear,
NgayPhatHanh = ReleaseDate,
QuocGia = Country,
KinhPhiUSD = BudgetUSD,
DT_MyUSD = US_BoxOfficeUSD,
DT_ToanCauUSD = Global_BoxOfficeUSD,
DT_NgayDauUSD = Opening_Day_SalesUSD,
DT_TuanDauUSD = One_Week_SalesUSD,
XepHang = IMDbRating,
ĐánhGiá = RottenTomatoesScore,
SoBinhChonIMDb = NumVotesIMDb,
SoBinhChonRT = NumVotesRT,
DaoDien = Director,
DienVienChinh = LeadActor
)
head(d)
tail(d)
Sau khi thực hiện câu lệnh ta nhận kết quả như sau
nrow(d)
## [1] 999999
Kích thước cột sau khi thực hiện câu lệnh là
length(d)
## [1] 17
# 999999 quan sát (dòng) 17 biến (cột)
dim(d)
## [1] 999999 17
str(d)
| Tên biến | Mô tả | Kiểu dữ liệu |
|---|---|---|
| MovieID | Mã định danh duy nhất cho mỗi bộ phim. | Số nguyên (int) |
| Title | Tên phim được tạo ngẫu nhiên theo ngôn ngữ tự nhiên. | Chuỗi ký tự (chr) |
| Genre | Thể loại chính của phim (ví dụ: Drama, Action, Comedy, …). | Chuỗi ký tự (chr) |
| ReleaseYear | Năm phát hành của bộ phim. | Số nguyên (int) |
| ReleaseDate | Ngày phát hành cụ thể trong năm (định dạng YYYY-MM-DD). | Chuỗi ký tự (chr) |
| Country | Quốc gia sản xuất hoặc phát hành phim. | Chuỗi ký tự (chr) |
| BudgetUSD | Ngân sách sản xuất ước tính (USD, từ 100.000 đến 300.000.000). | Số thực (num) |
| US_BoxOfficeUSD | Doanh thu phòng vé tại thị trường Hoa Kỳ. | Số thực (num) |
| Global_BoxOfficeUSD | Tổng doanh thu phòng vé toàn cầu. | Số thực (num) |
| Opening_Day_SalesUSD | Doanh thu bán vé tại Mỹ trong ngày công chiếu đầu tiên. | Số thực (num) |
| One_Week_SalesUSD | Doanh thu bán vé tại Mỹ trong tuần đầu tiên. | Số thực (num) |
| IMDbRating | Điểm đánh giá của phim trên nền tảng IMDb (1.0–10.0). | Số thực (num) |
| RottenTomatoesScore | Điểm đánh giá trên Rotten Tomatoes (0–100%). | Số nguyên (int) |
| NumVotesIMDb | Số lượt đánh giá phim trên IMDb. | Số nguyên (int) |
| NumVotesRT | Số lượt đánh giá phim trên Rotten Tomatoes. | Số nguyên (int) |
| Director | Tên đạo diễn của bộ phim (dữ liệu tổng hợp, không phải tên thật). | Chuỗi ký tự (chr) |
| LeadActor | Tên diễn viên chính của bộ phim (dữ liệu tổng hợp). | Chuỗi ký tự (chr) |
skim(d)
| Name | d |
| Number of rows | 999999 |
| Number of columns | 17 |
| _______________________ | |
| Column type frequency: | |
| character | 6 |
| numeric | 11 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Title | 0 | 1 | 1 | 41 | 0 | 9665 | 0 |
| Genre | 0 | 1 | 5 | 11 | 0 | 8 | 0 |
| NgayPhatHanh | 0 | 1 | 10 | 10 | 0 | 27757 | 0 |
| QuocGia | 0 | 1 | 2 | 11 | 0 | 10 | 0 |
| DaoDien | 0 | 1 | 9 | 24 | 0 | 150 | 0 |
| DienVienChinh | 0 | 1 | 9 | 21 | 0 | 299 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| IDPhim | 0 | 1 | 500000.00 | 288674.99 | 1.00 | 250000.5 | 500000.0 | 749999.5 | 999999 | ▇▇▇▇▇ |
| NamPhatHanh | 0 | 1 | 1998.00 | 19.26 | 1950.00 | 1984.0 | 2001.0 | 2014.0 | 2025 | ▂▃▅▆▇ |
| KinhPhiUSD | 0 | 1 | 9802823.55 | 22494208.37 | 100000.00 | 1190510.8 | 3265789.5 | 9002791.0 | 300000000 | ▇▁▁▁▁ |
| DT_MyUSD | 0 | 1 | 14961631.98 | 38794034.26 | 40025.47 | 1489805.2 | 4388875.6 | 12876058.4 | 1018197889 | ▇▁▁▁▁ |
| DT_ToanCauUSD | 0 | 1 | 27206253.68 | 69542938.25 | 100000.00 | 2762370.0 | 8090223.4 | 23552451.2 | 1499496720 | ▇▁▁▁▁ |
| DT_NgayDauUSD | 0 | 1 | 2992745.17 | 8132438.35 | 4050.47 | 279026.2 | 838722.1 | 2510359.5 | 295751068 | ▇▁▁▁▁ |
| DT_TuanDauUSD | 0 | 1 | 7483442.02 | 19553372.08 | 16507.42 | 738314.5 | 2179436.3 | 6415142.6 | 579555113 | ▇▁▁▁▁ |
| XepHang | 0 | 1 | 6.49 | 1.49 | 1.00 | 5.5 | 6.5 | 7.5 | 10 | ▁▂▇▇▂ |
| ĐánhGiá | 0 | 1 | 64.78 | 17.59 | 0.00 | 53.0 | 65.0 | 77.0 | 100 | ▁▂▆▇▃ |
| SoBinhChonIMDb | 0 | 1 | 9137.18 | 24922.36 | 100.00 | 1083.0 | 2983.0 | 8192.0 | 1000000 | ▇▁▁▁▁ |
| SoBinhChonRT | 0 | 1 | 2031.88 | 8433.38 | 50.00 | 119.0 | 405.0 | 1360.0 | 500000 | ▇▁▁▁▁ |
#MovieID
summary(d$IDPhim)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 250001 500000 500000 750000 999999
Biến MovieID có giá trị từ 1 đến 999.999, với trung bình và trung vị đều bằng 500.000, cho thấy các mã được phân bố đều trên toàn bộ dải giá trị. Điều này chứng tỏ đây là biến định danh thuần túy, không mang ý nghĩa thống kê hay kinh tế, chỉ dùng để nhận dạng từng bộ phim trong tập dữ liệu.
#Title
summary(d$Title)
## Length Class Mode
## 999999 character character
Biến Title có 999.999 giá trị, thuộc kiểu character, cho biết đây là dữ liệu dạng chuỗi ký tự mô tả tên phim. Vì độ dài bằng đúng số quan sát trong tập dữ liệu, có thể thấy mỗi bộ phim đều có một tiêu đề riêng biệt, phản ánh tính duy nhất của từng bản ghi.
#BudgetUSD
summary(d$KinhPhiUSD)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 100000 1190511 3265790 9802824 9002791 300000000
Biến Kinh Phí USD có giá trị dao động từ 100.000USD đến 300 triệuUSD, với trung bình khoảng 9,8 triệuUSD. Trung vị 3,27 triệuUSD nhỏ hơn nhiều so với giá trị trung bình, cho thấy phân phối lệch phải — tức là phần lớn phim có kinh phí thấp hoặc trung bình, chỉ một số ít phim có ngân sách rất lớn làm tăng giá trị trung bình toàn mẫu.
#ReleaseYear
summary(d$NamPhatHanh)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1950 1984 2001 1998 2014 2025
Biến Năm Phát Hành có giá trị từ 1950 đến 2025, với trung bình khoảng 1998 và trung vị 2001. Điều này cho thấy dữ liệu bao phủ toàn bộ giai đoạn lịch sử điện ảnh hiện đại, tập trung nhiều hơn vào các phim phát hành từ cuối thế kỷ 20 đến đầu thế kỷ 21, phản ánh xu hướng gia tăng mạnh mẽ số lượng phim trong thời kỳ gần đây.
d1 <-colSums(is.na(d))
Không có giá trị NA trong bộ dữ liệu
# Đếm số dòng trùng lặp
n_dup <- sum(duplicated(d))
n_dup
## [1] 0
# Loại bỏ bản ghi trùng lặp hoàn toàn
d1 <- d %>% distinct()
Ta thực hiện kiểm tra sự trùng lập và loại bỏ sự trùng lập ra khỏi dữ liệu.
#Loại bỏ ký tự đặt biệt
d1 <- d %>% clean_names()
names(d)
## [1] "IDPhim" "Title" "Genre" "NamPhatHanh"
## [5] "NgayPhatHanh" "QuocGia" "KinhPhiUSD" "DT_MyUSD"
## [9] "DT_ToanCauUSD" "DT_NgayDauUSD" "DT_TuanDauUSD" "XepHang"
## [13] "ĐánhGiá" "SoBinhChonIMDb" "SoBinhChonRT" "DaoDien"
## [17] "DienVienChinh"
d2 <- d1 %>%
mutate(
# Chuyển chuỗi ký tự ngày sang kiểu Date theo định dạng ngày/tháng/năm
ngay_phat_hanh = dmy(ngay_phat_hanh),
# Tạo lại biến năm phát hành từ biến ngày để đảm bảo không bị sai lệch dữ liệu
nam_phat_hanh = year(ngay_phat_hanh),
# Chuyển các biến định tính sang dạng factor phục vụ phân tích thống kê
genre = as.factor(genre),
quoc_gia = as.factor(quoc_gia)
)
d2 <- d1 %>%
mutate(
ROI = dt_toan_cau_usd / kinh_phi_usd,
log_budget = log(kinh_phi_usd + 1),
log_global = log(dt_toan_cau_usd + 1)
)
Biến ROI Return on Investment được tạo ra nhằm đánh giá hiệu quả tài chính của từng bộ phim. ROI được tính bằng tỷ lệ giữa doanh thu phòng vé toàn cầu và kinh phí sản xuất. Chỉ số này phản ánh mức độ sinh lời, cụ thể cho biết mỗi một đơn vị chi phí đầu tư tạo ra bao nhiêu đơn vị doanh thu. Giá trị ROI càng cao thể hiện bộ phim càng mang lại lợi nhuận tốt so với nguồn vốn bỏ ra. Việc sử dụng ROI giúp so sánh hiệu quả kinh tế giữa các phim có quy mô ngân sách khác nhau, đồng thời hỗ trợ xác định các yếu tố ảnh hưởng đến mức sinh lời, chẳng hạn như thể loại, quốc gia sản xuất hay thời điểm phát hành.
Biến log_budget được tạo ra bằng cách lấy logarit tự nhiên của kinh phí sản xuất cộng một đơn vị. Phép biến đổi log được sử dụng để giảm hiện tượng phân phối lệch phải trong dữ liệu ngân sách, đặc biệt khi một số phim có chi phí rất cao so với phần lớn còn lại. Việc chuẩn hóa này giúp quá trình phân tích và mô hình hóa sau đó trở nên chính xác và ổn định hơn.
Biến log_global được tính tương tự bằng logarit tự nhiên của doanh thu toàn cầu sau khi cộng thêm một đơn vị. Mục tiêu của việc biến đổi này là giảm ảnh hưởng của các giá trị doanh thu quá lớn, đồng thời làm nổi bật mối quan hệ tuyến tính hơn giữa doanh thu và các biến giải thích khác trong mô hình. Điều này hỗ trợ phân tích dữ liệu hiệu quả hơn và cải thiện chất lượng dự báo doanh thu phim.
ggplot(d2, aes(x = ROI)) +
geom_density(fill = "orange", alpha = 0.5) +
labs(
title = "Đường mật độ phân bố ROI",
x = "ROI",
y = "Mật độ"
) +
theme_minimal()
Biểu đồ mật độ phân bố ROI cho thấy đa số các bộ phim có giá trị ROI tập trung mạnh ở vùng gần 1. Điều này nghĩa là phần lớn phim chỉ đạt doanh thu toàn cầu xấp xỉ kinh phí sản xuất, tức là hòa vốn hoặc lợi nhuận rất thấp. Mật độ giảm nhanh khi ROI tăng, phản ánh rằng chỉ có số ít phim mang lại mức sinh lời cao (ROI lớn hơn 2 hoặc 3).
Đường mật độ nghiêng lệch phải khá rõ, chứng tỏ phân phối ROI bị “lệch dương” (right-skewed), nguyên nhân thường do một vài phim thành công đột biến về doanh thu kéo trung bình ROI lên. Đặc điểm này cũng cho thấy ngành phim có mức rủi ro cao — phần lớn dự án thu về lợi nhuận thấp, trong khi chỉ một tỷ lệ nhỏ đạt lợi nhuận vượt trội.
d2 <- d1 %>% filter(!is.na(kinh_phi_usd) & kinh_phi_usd > 0)
nrow(d)
## [1] 999999
# Thêm biến mới 'release_quarter' dựa trên tháng phát hành
d1 <- d1 %>%
mutate(release_quarter = case_when(
month(ngay_phat_hanh) %in% 1:3 ~ "Q1",
month(ngay_phat_hanh) %in% 4:6 ~ "Q2",
month(ngay_phat_hanh) %in% 7:9 ~ "Q3",
month(ngay_phat_hanh) %in% 10:12 ~ "Q4",
TRUE ~ NA_character_
))
ggplot(d1, aes(x = release_quarter, fill = release_quarter)) +
geom_bar() +
coord_flip() +
labs(
title = "Số lượng phim phát hành theo từng quý",
x = "Quý phát hành",
y = "Số lượng phim"
) +
scale_fill_brewer(palette = "Blues") +
theme_minimal() +
theme(legend.position = "none")
Biểu đồ cho thấy số lượng phim phát hành theo từng quý không có sự chênh lệch quá lớn, nhưng có xu hướng tăng dần từ Q1 đến Q4. Cụ thể, Q4 ghi nhận số lượng phim phát hành cao nhất, trong khi Q1 là quý có ít phim phát hành nhất. Điều này có thể phản ánh chiến lược của các hãng phim khi thường ưu tiên phát hành vào nửa cuối năm — giai đoạn có nhiều kỳ nghỉ lễ và nhu cầu giải trí tăng cao.
sort(table(d1$release_quarter), decreasing = TRUE)
##
## Q3 Q4 Q2 Q1
## 252115 251520 249370 246994
quantiles <- quantile(d1$dt_my_usd, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
d1 <- d1 %>%
mutate(dt_my_level = case_when(
dt_my_usd <= quantiles[1] ~ "Thấp",
dt_my_usd <= quantiles[2] ~ "Trung bình thấp",
dt_my_usd <= quantiles[3] ~ "Trung bình cao",
dt_my_usd > quantiles[3] ~ "Cao",
TRUE ~ NA_character_
))
d1 %>%
filter(release_quarter == "Q3") %>%
summarise(
Tong_doanh_thu_Q3 = sum(dt_my_usd, na.rm = TRUE),
Trung_binh_Q3 = mean(dt_my_usd, na.rm = TRUE),
So_phim_Q3 = n()
)
summary(d1$genre)
## Length Class Mode
## 999999 character character
ts_G <- table(d1$genre)
print(ts_G)
##
## Action Comedy Documentary Drama Horror Romance
## 150131 199832 50114 250018 100010 100021
## Sci-Fi Thriller
## 49802 100071
ts_G <- d1 %>%
count(genre, name = "Tan_so") %>%
mutate(Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2))
| Genre | Tần số | Tần suất (%) |
|---|---|---|
| Action | 150131 | 17.45 |
| Comedy | 199832 | 23.20 |
| Documentary | 50114 | 5.82 |
| Drama | 250018 | 29.00 |
| Horror | 100010 | 11.61 |
| Romance | 100021 | 11.61 |
| Sci-Fi | 49802 | 5.78 |
| Thriller | 100071 | 11.62 |
Trong tổng số phim, Drama (29%) và Comedy (23.2%) là hai thể loại phổ biến nhất, chiếm hơn nửa lượng phim trên thị trường. Action đứng thứ ba với 17.45%, trong khi Thriller, Romance và Horror đều chiếm khoảng 11–12%, thể hiện sự đa dạng về nội dung. Các thể loại Documentary và Sci-Fi chiếm tỷ lệ thấp nhất (~5–6%), phản ánh đây là các thể loại hướng đến đối tượng khán giả chuyên biệt. Nhìn chung, thị trường phim tập trung vào các thể loại phổ biến nhưng vẫn duy trì sự đa dạng để đáp ứng nhiều sở thích khác nhau.
library(ggplot2)
ggplot(ts_G, aes(x = genre, y = Tan_so)) +
geom_col(fill = "#B22222") + # FireBrick
geom_text(aes(label = Tan_so), # chỉ hiển thị số lượng
vjust = -0.5, color = "black", size = 3.5) +
labs(
title = "Tần số phim theo thể loại",
x = "Thể loại",
y = "Số lượng phim"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", color = "#8B0000"),
axis.text.x = element_text(angle = 45, hjust = 1)
)
Biểu đồ thể hiện tần số phim theo thể loại cho thấy sự chênh lệch rõ rệt giữa các nhóm. Drama chiếm ưu thế vượt trội với 250.018 phim, cho thấy đây là thể loại phổ biến và được sản xuất nhiều nhất. Comedy và Action cũng có số lượng đáng kể, lần lượt đạt khoảng 200.000 và 150.000 phim, phản ánh nhu cầu cao của khán giả đối với nội dung giải trí và hành động. Ngược lại, các thể loại như Documentary và Sci-Fi có số lượng phim ít hơn nhiều, cho thấy đây là những thể loại mang tính đặc thù và kén người xem hơn. Tổng thể, thị trường phim nghiêng về các thể loại mang tính giải trí đại chúng và cảm xúc mạnh như Drama, Comedy và Action.
d3 <- d[, c("XepHang", "ĐánhGiá", "SoBinhChonIMDb", "SoBinhChonRT", "Genre")]
summary(d3$ĐánhGiá)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 53.00 65.00 64.78 77.00 100.00
ts_D <- table(d3$ĐánhGiá)
print(ts_D)
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12
## 166 42 47 59 63 84 100 133 173 206 221 235 312
## 13 14 15 16 17 18 19 20 21 22 23 24 25
## 350 434 502 536 619 757 826 934 1161 1318 1493 1600 1883
## 26 27 28 29 30 31 32 33 34 35 36 37 38
## 2190 2461 2744 3024 3398 3751 4148 4520 4968 5602 6083 6786 7367
## 39 40 41 42 43 44 45 46 47 48 49 50 51
## 7753 8499 9187 9899 10502 11147 11824 12849 13504 14086 14975 15618 16359
## 52 53 54 55 56 57 58 59 60 61 62 63 64
## 17129 17789 18213 19032 19494 19990 20632 20816 21374 21424 21696 21943 22030
## 65 66 67 68 69 70 71 72 73 74 75 76 77
## 21932 22279 21931 21873 21828 21297 20998 20683 20032 19677 18826 18230 17879
## 78 79 80 81 82 83 84 85 86 87 88 89 90
## 17282 16394 15481 14924 14230 13443 12833 11995 11437 10592 9650 9304 8519
## 91 92 93 94 95 96 97 98 99 100
## 7909 7284 6671 6089 5558 5016 4649 4107 3827 26280
ts_D <- d3 %>%
count(ĐánhGiá, name = "Tan_so") %>%
mutate(Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2))
# Chia điểm IMDb thành 5 mức
d3$ĐánhGiá <- as.numeric(d3$ĐánhGiá)
d3$ĐánhGiá <- cut(d3$ĐánhGiá ,
breaks = c(0, 40, 60, 70, 80, 100),
labels = c("Rất thấp", "Thấp", "Trung bình", "Cao", "Rất cao"),
include.lowest = TRUE)
# Tính tần số theo thể loại và mức điểm
ts_diem <- table(d1$genre, d3$ĐánhGiá )
Để dễ đánh giá chúng ta chia điểm ra làm 6 mức độ và nhận được kết quả như sau:
# Biểu đồ cột nhóm (so sánh trực quan hơn)
ggplot(d3, aes(x = Genre, fill = ĐánhGiá)) +
geom_bar(position = position_dodge(width = 0.8)) + # xếp cột cạnh nhau
labs(
title = "So sánh số lượng phim theo thể loại và mức điểm đánh giá",
x = "Thể loại",
y = "Số lượng phim",
fill = "Mức điểm"
) +
theme_minimal(base_size = 13) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold")
) +
scale_fill_brewer(palette = "Set2")
Biểu đồ cho thấy sự khác biệt rõ ràng về số lượng phim giữa các thể loại và mức điểm xếp hạng. Trong đó, Drama và Comedy là hai thể loại có số lượng phim vượt trội ở hầu hết các mức điểm, đặc biệt là nhóm “Thấp” và “Trung bình”, phản ánh tính phổ biến rộng rãi nhưng chất lượng còn phân hóa. Action cũng chiếm tỷ trọng lớn, tập trung ở các mức điểm trung bình, cho thấy đây là thể loại thiên về giải trí đại chúng. Ngược lại, các thể loại như Documentary và Sci-Fi có số lượng phim ít hơn, song tỷ lệ phim đạt điểm “Cao” và “Rất cao” lại nổi bật, chứng tỏ sự chọn lọc và đầu tư kỹ lưỡng hơn về nội dung. Nhìn chung, trong khi các thể loại phổ biến chiếm ưu thế về số lượng, những thể loại chuyên sâu lại thể hiện chất lượng tốt hơn, phản ánh sự đa dạng trong định hướng sản xuất phim hiện nay.
summary(d3$XepHang)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 5.500 6.500 6.495 7.500 10.000
ts_X <- table(d3$XepHang)
print(ts_X)
##
## 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2
## 134 41 63 74 74 98 125 154 188 269 313 363 437
## 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3 3.1 3.2 3.3 3.4 3.5
## 511 635 756 887 1066 1245 1485 1727 2029 2303 2818 3172 3547
## 3.6 3.7 3.8 3.9 4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8
## 4108 4598 5293 5894 6636 7453 8066 9020 10084 11185 12059 12904 13959
## 4.9 5 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6 6.1
## 15036 15981 17147 18216 19261 20101 21621 22145 23034 23808 24427 25231 25942
## 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7 7.1 7.2 7.3 7.4
## 25843 26229 26618 26685 26709 26544 26335 25461 25071 24570 24032 23275 22140
## 7.5 7.6 7.7 7.8 7.9 8 8.1 8.2 8.3 8.4 8.5 8.6 8.7
## 21159 20311 19354 18237 17412 16230 14623 14057 12727 11934 10987 9926 9133
## 8.8 8.9 9 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10
## 8179 7336 6809 5936 5345 4598 3968 3600 3202 2674 2350 2027 10650
ts_X <- d3 %>%
count(XepHang, name = "Tan_so") %>%
mutate(Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2))
d3$MucXepHang <- cut(as.numeric(d3$XepHang), 3,
labels = c("Thấp", "Trung bình", "Cao"),
include.lowest = TRUE)
ts_X <- table(d3$MucXepHang)
d3 %>%
count(MucXepHang) %>%
mutate(label = paste0(MucXepHang, "\n", round(n / sum(n) * 100, 1), "%")) %>%
ggplot(aes(x = "", y = n, fill = MucXepHang)) +
geom_col(color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = label), position = position_stack(vjust = 0.5)) +
theme_void() +
scale_fill_brewer(palette = "Set2") +
labs(title = "Tỷ lệ phim theo mức xếp hạng")
Biểu đồ tròn thể hiện tỷ lệ phim theo mức xếp hạng cho thấy:
Nhóm phim “Trung bình” chiếm tỷ trọng cao nhất (≈59.2%), cho thấy phần lớn các bộ phim được đánh giá ở mức vừa phải, không quá cao cũng không quá thấp.
Nhóm phim “Cao” chiếm khoảng 35.7%, phản ánh vẫn có một tỷ lệ gồm các phim được đánh giá tốt, chất lượng cao.
+Nhóm phim “Thấp” chỉ chiếm khoảng 5.1%, tức là rất ít phim bị đánh giá thấp.
Nhận xét tổng quát: Phần lớn phim nằm ở mức trung bình đến cao, cho thấy chất lượng chung của các phim trong tập dữ liệu tương đối tốt, ít phim kém. Biểu đồ có bố cục rõ ràng, màu sắc hài hòa, dễ phân biệt giữa các mức xếp hạng.
d_plot <- d3 %>%
mutate(genre = d1$genre) %>%
count(genre, MucXepHang)
ggplot(d_plot, aes(x = genre, y = n, fill = MucXepHang)) +
geom_col(position = "dodge") + # cột cạnh nhau
geom_text(aes(label = n), position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
labs(
title = "Số lượng phim theo thể loại và mức xếp hạng",
x = "Thể loại",
y = "Số lượng phim",
fill = "Mức xếp hạng"
) +
theme_minimal(base_size = 13) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set2")
d4 <- d[, c("QuocGia", "DaoDien", "DienVienChinh", "Genre")]
d4 <- d4 %>%
mutate(TacGiaSX = case_when(
Genre == "Drama" ~ "Tác giả Drama",
Genre == "Documentary" ~ "Tác giả Documentary",
Genre == "Comedy" ~ "Tác giả Comedy",
Genre == "Action" ~ "Tác giả Action",
TRUE ~ "Tác giả Khác" # các thể loại còn lại
))
Để phục vụ cho quá trình phân tích, biến TacGiaSX được tạo ra nhằm phân loại tác giả sản xuất theo từng thể loại phim. Cụ thể, các phim thuộc nhóm Drama, Documentary, Comedy và Action lần lượt được gán nhãn “Tác giả Drama”, “Tác giả Documentary”, “Tác giả Comedy” và “Tác giả Action”, trong khi các thể loại còn lại được xếp vào nhóm “Tác giả Khác”. Việc phân nhóm này giúp làm rõ đặc trưng sáng tác của từng thể loại, tạo cơ sở thuận lợi cho việc so sánh và đánh giá xu hướng sản xuất phim trong tập dữ liệu.
ts_DD <- table(d4$DaoDien)
print(ts_DD)
##
## Abigail Robles Adam Brown Adriana Campbell
## 6701 6741 6748
## Albert Phillips Alyssa Adams Amanda Cantrell
## 6634 6771 6546
## Amanda Montgomery Amber Anderson Andrew Chambers
## 6692 6604 6750
## Anthony Henry Anthony Rowland Ashley Medina
## 6614 6758 6667
## Barbara Torres Benjamin Hudson Benjamin Ray
## 6711 6698 6602
## Bethany Rodriguez Brandon Fuller Brenda Smith
## 6615 6750 6711
## Brian Robinson Brooke Morales Bryan Murray
## 6818 6750 6743
## Caitlin Brewer Carolyn Schwartz Chad Koch
## 6830 6722 6574
## Chad Peters MD Charles Lopez Charlotte Williams
## 6555 6514 6654
## Christian Hernandez Christopher Roach Claudia Smith
## 6667 6714 6460
## Colleen Willis Courtney Reynolds Crystal Harris
## 6694 6627 6675
## Daniel Brown Daniel Rivera Darlene Murphy
## 6590 6625 6616
## Darrell Carlson David Charles David Hall
## 6616 6761 6729
## David Lee David Morris David Perez
## 6637 6644 6583
## David Rosales Denise Horne Diana Davis
## 6599 6658 6699
## Diane Skinner Donna Hall Donna Wagner
## 6675 6693 6602
## Dr. Jonathan Long Dr. Michael Monroe Elizabeth Lane
## 6592 6585 6658
## Emily Miller Eric Ramirez Faith Franklin
## 6776 6708 6621
## Francisco Ford Gary Simmons Hannah Camacho
## 6779 6757 6643
## Heidi Cisneros Jacqueline Briggs James Cross
## 6720 6615 6649
## James Miller James Wright Janice Taylor
## 6677 6606 6676
## Jason Jones Jeffrey Myers MD Jeffrey Neal
## 6517 6738 6674
## Jennifer Atkinson Jennifer Henry Jennifer Miller
## 6597 6698 6687
## Jennifer Willis Jeremy Davis Jeremy Ray
## 6721 6650 6604
## Jerry Owens Jessica Gonzalez Jessica Rodriguez
## 6494 6670 6734
## Jessica Singh John Jones Jonathan Evans
## 6621 6569 6712
## Jordan Orozco Joseph Willis Joshua Baker
## 6726 6677 6657
## Joshua Morales Judy Walker Julie Maxwell
## 6637 6658 6615
## Karen Barrett Karen Robinson Karen Smith
## 6568 6790 6689
## Kayla Young Kelsey Ellis Kevin Green
## 6748 6683 6591
## Kim Watkins Kimberly Barker Kristina Moore
## 6657 6470 6516
## Lisa Atkins Lori Callahan Manuel Benton
## 6708 6585 6768
## Maria Lane Mark Brooks Mark Moody
## 6794 6580 6716
## Mary Mitchell Matthew Beck Megan Sharp
## 6767 6633 6675
## Melanie Olson Melissa Cohen Melissa Hernandez
## 6555 6576 6862
## Michael Chung Michael Manning Michael Richards
## 6708 6759 6656
## Michael Ross Michelle Collins Mr. Drew Clark Jr.
## 6608 6699 6583
## Mr. Jorge Anderson Mrs. Hannah Campbell DDS Nathan Bolton
## 6717 6484 6620
## Nicholas Murphy Oscar Santos Patricia Munoz
## 6689 6596 6706
## Paul Rogers Paul Weiss Philip Simmons
## 6697 6773 6729
## Rachel Hayes Rachel Kirby Raymond Morris
## 6794 6702 6635
## Renee Campbell Robert Hendricks Robert Webster
## 6694 6719 6629
## Roberto Underwood Robin Hooper Ryan Tate
## 6603 6633 6715
## Samantha Campbell Sara Higgins Sean Howard
## 6623 6755 6748
## Seth Whitehead Shannon Ross Sharon Wilson
## 6569 6489 6673
## Sonya Clark Sophia Gomez Stephanie Hayes
## 6674 6660 6720
## Susan Farley Suzanne Gonzalez Tara Underwood
## 6759 6591 6898
## Terry Lawrence Thomas Peterson Tracy Tucker
## 6776 6672 6614
## Troy Cochran Tyler Sanchez Vanessa Fox
## 6718 6508 6647
## William Banks William Carpenter William Walker
## 6667 6646 6758
ts_DD <- d4 %>%
count(DaoDien, name = "Tan_so") %>%
mutate(Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2))
d4_main <- d4 %>%
filter(TacGiaSX != "Tác giả Khác") # loại bỏ các hàng còn lại
summary(d4$QuocGia)
## Length Class Mode
## 999999 character character
ts_QG <- table(d4_main$QuocGia)
print(ts_QG)
##
## Australia Canada China France Germany India
## 19750 26315 20073 19666 13172 33209
## Japan South Korea UK USA
## 13118 6618 33314 464860
ts_QG <- d4_main %>%
count(QuocGia, name = "Tan_so") %>%
mutate(Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2))
# Tính tần số và tần suất + tạo nhãn
ts_QG <- d4_main %>%
count(QuocGia, name = "Tan_so") %>%
mutate(
Tan_suat = round(Tan_so / sum(Tan_so) * 100, 2),
label = paste0(QuocGia, "\n", Tan_suat, "%")
)
ggplot(ts_QG, aes(x = "", y = Tan_so, fill = QuocGia)) +
geom_col(color = "white") +
coord_polar(theta = "y") +
labs(
fill = "Quốc gia"
) +
theme_void() +
theme(
legend.position = "right" # Chú thích nằm bên phải biểu đồ
)
Biểu đồ tròn thể hiện tỷ lệ phim theo quốc gia sản xuất cho thấy sự phân bổ không đồng đều giữa các quốc gia. Trong đó, Mỹ (USA) chiếm tỷ trọng lớn áp đảo so với các nước còn lại, thể hiện vai trò chủ đạo của ngành công nghiệp điện ảnh Mỹ trên thị trường toàn cầu. Các quốc gia như Anh (UK), Ấn Độ (India), Pháp (France) và Canada chỉ chiếm tỷ lệ nhỏ hơn nhiều, trong khi Australia, Trung Quốc, Đức, Nhật Bản và Hàn Quốc có số lượng phim khiêm tốn.
Nhìn chung biểu đồ phản ánh sự tập trung sản xuất phim cao tại Mỹ, còn các quốc gia khác chủ yếu đóng vai trò bổ trợ với quy mô nhỏ hơn, thể hiện sự chênh lệch rõ rệt trong đóng góp điện ảnh giữa các quốc gia.
d5 <- d[, c("KinhPhiUSD", "DT_MyUSD", "DT_ToanCauUSD", "DT_NgayDauUSD", "DT_TuanDauUSD", "Genre")]
summary(d5$KinhPhiUSD)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 100000 1190511 3265790 9802824 9002791 300000000
d5_area <- d5 %>%
group_by(Genre) %>%
summarise(TongKinhPhi = sum(KinhPhiUSD, na.rm = TRUE)) %>%
arrange(TongKinhPhi)
ggplot(d5_area, aes(x = Genre, y = TongKinhPhi, group = 1)) +
geom_area(fill = "#69b3a2", alpha = 0.8) +
geom_line(size = 1) +
geom_point(size = 3) +
theme_minimal() +
labs(
title = "Biểu đồ miền: Tổng kinh phí theo thể loại phim",
x = "Thể loại",
y = "Tổng kinh phí (USD)"
) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold", size = 14, hjust = 0.5)
)
Biểu đồ miền cho thấy tổng kinh phí sản xuất phim có sự khác biệt giữa các thể loại. Trong đó, phim Drama dẫn đầu với tổng kinh phí cao nhất, phản ánh xu hướng đầu tư mạnh cho các tác phẩm có chiều sâu nội dung và giá trị nghệ thuật. Comedy và Action cũng chiếm tỷ trọng lớn, cho thấy hai thể loại này được ưu tiên về nguồn vốn do khả năng thu hút khán giả rộng rãi. Ngược lại, Documentary và Sci-Fi có tổng kinh phí thấp nhất, thể hiện sự hạn chế trong đầu tư cho các thể loại mang tính chuyên biệt hoặc rủi ro thương mại cao.
Nhìn chung biểu đồ thể hiện sự tập trung vốn vào các thể loại phổ biến, nơi các nhà sản xuất kỳ vọng hiệu quả thương mại cao hơn.
d5 <- d5 %>%
mutate(MucKinhPhi = cut(KinhPhiUSD,
breaks = quantile(KinhPhiUSD, probs = c(0, 1/3, 2/3, 1), na.rm = TRUE),
labels = c( "Thấp", "Trung bình", "Cao"),
include.lowest = TRUE))
mm <- d5 %>%
filter(MucKinhPhi %in% c("Cao", "Trung bình"))
ggplot(mm, aes(x = KinhPhiUSD, y = MucKinhPhi, fill = MucKinhPhi)) +
geom_density_ridges(alpha = 0.8, color = "black") +
theme_minimal() +
labs(
title = "Phân phối kinh phí theo mức cao và trung bình",
x = "Kinh phí (USD)",
y = "Mức kinh phí"
) +
theme(
legend.position = "none",
plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
)
Biểu đồ thể hiện phân phối kinh phí sản xuất giữa hai nhóm phim có mức xếp hạng “Cao” và “Trung bình”. Dễ nhận thấy, cả hai nhóm đều có phân phối lệch phải, tức phần lớn phim có kinh phí thấp, chỉ một số ít phim có kinh phí rất cao. Nhóm phim xếp hạng cao có phạm vi kinh phí rộng hơn, kéo dài đến các giá trị lớn, cho thấy nhiều phim được đầu tư mạnh hơn. Ngược lại, nhóm trung bình tập trung chủ yếu ở mức kinh phí thấp, phản ánh sự hạn chế về nguồn vốn.
stats_my_genre <- d5 %>%
group_by(Genre) %>%
summarise(
So_phim = n(),
DoanhThuTB = mean(DT_MyUSD, na.rm = TRUE),
DoanhThuSD = sd(DT_MyUSD, na.rm = TRUE),
Min = min(DT_MyUSD, na.rm = TRUE),
Max = max(DT_MyUSD, na.rm = TRUE)
)
stats_my_genre
d5 <- d5 %>%
mutate(
Muc_DT_My = cut(
DT_MyUSD,
breaks = quantile(DT_MyUSD, probs = c(0, 1/3, 2/3, 1), na.rm = TRUE),
labels = c("Thấp", "Trung bình", "Cao"),
include.lowest = TRUE
))
d5 %>%
count(Muc_DT_My, Genre) %>%
ggplot(aes(x = "", y = n, fill = Genre)) +
geom_col(color = "white") +
coord_polar("y") +
facet_wrap(~ Muc_DT_My) +
theme_void() +
labs(
title = "Cơ cấu thể loại phim theo 3 mức Doanh thu tại Mỹ",
fill = "Thể loại phim"
)
Biểu đồ trên thể hiện cơ cấu thể loại phim theo ba mức doanh thu tại Mỹ (thấp, trung bình và cao). Có thể thấy, tỷ trọng các thể loại tương đối đồng đều giữa ba nhóm doanh thu, tuy nhiên vẫn có một số khác biệt đáng chú ý.
Cụ thể, phim Drama và Comedy chiếm tỷ trọng lớn ở cả ba nhóm, cho thấy đây là hai thể loại phổ biến và có khả năng thu hút khán giả rộng. Trong khi đó, Action và Sci-Fi xuất hiện nhiều hơn ở nhóm doanh thu cao, phản ánh xu hướng đầu tư mạnh vào các phim hành động và viễn tưởng để đạt hiệu quả thương mại tốt hơn. Ngược lại, Documentary và Romance tập trung chủ yếu ở nhóm doanh thu thấp đến trung bình, cho thấy hạn chế về sức hút phòng vé.
Nhìn chung, thể loại phim có ảnh hưởng đến doanh thu, trong đó Action, Sci-Fi và Comedy là các thể loại có tiềm năng tạo ra doanh thu cao nhất tại thị trường Mỹ.
# Lấy thể loại có số lượng phim nhiều nhất theo từng mức
top_count <- d5 %>%
count(Muc_DT_My, Genre) %>%
group_by(Muc_DT_My) %>%
slice_max(n, n = 1) %>%
ungroup()
# Vẽ biểu đồ tròn cho 3 mức gộp chung
ggplot(top_count, aes(x = "", y = n, fill = Muc_DT_My)) +
geom_col(color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(Genre, "\n", n)),
position = position_stack(vjust = 0.5),
size = 4) +
labs(
title = "Thể loại phim nhiều nhất theo từng mức doanh thu Mỹ",
fill = "Mức doanh thu Mỹ"
) +
theme_void(base_size = 12)
Biểu đồ trên thể hiện thể loại phim chiếm số lượng lớn nhất trong từng mức doanh thu tại Mỹ (thấp, trung bình và cao). Kết quả cho thấy thể loại Drama giữ vị trí áp đảo ở cả ba nhóm doanh thu, với số lượng phim gần như tương đương nhau — khoảng 83.000 phim mỗi nhóm.
Điều này cho thấy Drama là thể loại phổ biến nhất và có mức độ sản xuất ổn định, bất kể doanh thu cao hay thấp. Các nhà sản xuất có xu hướng ưu tiên thể loại này do tính đa dạng trong nội dung, khả năng khai thác cảm xúc và tính nghệ thuật cao, giúp Drama phù hợp với nhiều phân khúc khán giả khác nhau.
Tuy nhiên, kết quả cũng gợi ý rằng việc sản xuất nhiều không đồng nghĩa với doanh thu cao, bởi Drama xuất hiện đồng đều ở cả nhóm thấp, trung bình và cao. Do đó, dù là thể loại chủ đạo, hiệu quả thương mại của Drama có thể phụ thuộc mạnh vào chất lượng kịch bản, diễn viên và chiến lược marketing, thay vì chỉ thuộc về bản thân thể loại phim.
library(readxl)
bmp <- read_excel("C:/Users/PC/OneDrive/Máy tính/RRRR/BMP 14-24.xlsx")
Bộ dữ liệu BMP 14–24.xlsx cung cấp thông tin chi tiết về báo cáo tài chính và luân chuyển tiền tệ của Công ty Cổ phần Nhựa Bình Minh (BMP) trong giai đoạn 2014–2024. Dữ liệu phản ánh tình hình tài chính, hiệu quả hoạt động và khả năng tạo dòng tiền của doanh nghiệp qua các năm, bao gồm các chỉ tiêu quan trọng như doanh thu thuần, lợi nhuận sau thuế, chi phí hoạt động, dòng tiền từ hoạt động kinh doanh, đầu tư và tài chính.
Bộ dữ liệu này là cơ sở để phân tích biến động tài chính qua thời gian, đánh giá hiệu quả sử dụng vốn, khả năng thanh toán và sức khỏe tài chính tổng thể của doanh nghiệp. Đồng thời, dữ liệu cũng phục vụ cho việc xây dựng các mô hình định lượng tài chính, hỗ trợ dự báo dòng tiền, lợi nhuận và đánh giá rủi ro tài chính trong giai đoạn nghiên cứu.
# Số biến dữ liệu (cột)
length(bmp)
## [1] 20
# Số quan sát (dòng)
nrow(bmp)
## [1] 345
Bộ dữ liệu gồm 20 cột và 345 dòng
str(bmp)
skim(bmp)
| Name | bmp |
| Number of rows | 345 |
| Number of columns | 20 |
| _______________________ | |
| Column type frequency: | |
| character | 10 |
| numeric | 10 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Chỉ tiêuTỷ VND | 0 | 1.00 | 4 | 87 | 0 | 306 | 0 |
| 2016 | 3 | 0.99 | 1 | 22 | 0 | 154 | 0 |
| 2017 | 3 | 0.99 | 1 | 22 | 0 | 145 | 0 |
| 2018 | 3 | 0.99 | 1 | 21 | 0 | 149 | 0 |
| 2019 | 3 | 0.99 | 1 | 22 | 0 | 155 | 0 |
| 2020 | 3 | 0.99 | 1 | 21 | 0 | 153 | 0 |
| 2021 | 3 | 0.99 | 1 | 22 | 0 | 151 | 0 |
| 2022 | 3 | 0.99 | 1 | 22 | 0 | 151 | 0 |
| 2023 | 3 | 0.99 | 1 | 22 | 0 | 148 | 0 |
| 2024 | 3 | 0.99 | 1 | 22 | 0 | 146 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| 2006 | 3 | 0.99 | 46.91 | 377.57 | -374.68 | 0 | 0 | 5.70 | 6812 | ▇▁▁▁▁ |
| 2007 | 3 | 0.99 | 51.31 | 385.65 | -538.02 | 0 | 0 | 8.07 | 6838 | ▇▁▁▁▁ |
| 2008 | 12 | 0.97 | 53.39 | 365.00 | -633.93 | 0 | 0 | 8.15 | 6237 | ▇▁▁▁▁ |
| 2009 | 13 | 0.96 | 80.60 | 439.45 | -806.60 | 0 | 0 | 12.54 | 7246 | ▇▁▁▁▁ |
| 2010 | 13 | 0.96 | 92.36 | 491.36 | -1035.35 | 0 | 0 | 13.63 | 7894 | ▇▁▁▁▁ |
| 2011 | 3 | 0.99 | 105.81 | 539.75 | -1355.89 | 0 | 0 | 21.77 | 8419 | ▇▁▁▁▁ |
| 2012 | 13 | 0.96 | 127.96 | 645.64 | -1301.57 | 0 | 0 | 22.00 | 10306 | ▇▁▁▁▁ |
| 2013 | 13 | 0.96 | 134.42 | 568.88 | -1466.11 | 0 | 0 | 36.00 | 8134 | ▇▁▁▁▁ |
| 2014 | 13 | 0.96 | 147.14 | 612.98 | -1746.46 | 0 | 0 | 36.00 | 8285 | ▇▁▁▁▁ |
| 2015 | 2 | 0.99 | 182.36 | 777.74 | -1901.88 | 0 | 0 | 61.08 | 11410 | ▇▁▁▁▁ |
head(bmp)
tail(bmp)
# NA theo từng biến
colSums(is.na(bmp))
## Chỉ tiêuTỷ VND 2006 2007 2008 2009
## 0 3 3 12 13
## 2010 2011 2012 2013 2014
## 13 3 13 13 13
## 2015 2016 2017 2018 2019
## 2 3 3 3 3
## 2020 2021 2022 2023 2024
## 3 3 3 3 3
# NA theo từng cột
colMeans(is.na(bmp))
## Chỉ tiêuTỷ VND 2006 2007 2008 2009
## 0.000000000 0.008695652 0.008695652 0.034782609 0.037681159
## 2010 2011 2012 2013 2014
## 0.037681159 0.008695652 0.037681159 0.037681159 0.037681159
## 2015 2016 2017 2018 2019
## 0.005797101 0.008695652 0.008695652 0.008695652 0.008695652
## 2020 2021 2022 2023 2024
## 0.008695652 0.008695652 0.008695652 0.008695652 0.008695652
# Tổng số biến bị thiếu trong bộ dữ liệu
sum(is.na(bmp))
## [1] 115
# Loại bỏ các biến NA trong dữ liệu
bmp1 <-colSums(is.na(bmp))
unique(bmp$TenCot)
## NULL
# Đếm số dòng trùng lặp
bmp_dup <- sum(duplicated(bmp1))
bmp_dup
## [1] 15
bmp_clean <- bmp[!duplicated(bmp), ]
bmp_taisan <- bmp_clean %>%
filter(grepl("TÀI SẢN NGẮN HẠN|TÀI SẢN DÀI HẠN|TỔNG TÀI SẢN|
CÁC KHOẢN PHẢI THU|HÀNG TỒN KHO|TÀI SẢN CỐ ĐỊNH|
CHI PHÍ TRẢ TRƯỚC|ĐẦU TƯ NGẮN HẠN|ĐẦU TƯ DÀI HẠN",
`Chỉ tiêuTỷ VND`, ignore.case = TRUE))
bmp_taisan
#Chuẩn hóa tên cột (đề phòng có cột numeric / character lẫn lộn)
names(bmp_taisan) <- as.character(names(bmp_taisan))
#Loại bỏ dòng trống hoặc NA
bmp_taisan <- bmp_taisan %>%
filter(!is.na(`Chỉ tiêuTỷ VND`) & `Chỉ tiêuTỷ VND` != "")
library(dplyr)
# Lọc dữ liệu tài sản ngắn hạn
bmp_nganhan <- bmp_taisan %>%
filter(grepl("TÀI SẢN NGẮN HẠN", `Chỉ tiêuTỷ VND`, ignore.case = TRUE)) %>%
# Chuẩn hóa dữ liệu số
mutate(across(-`Chỉ tiêuTỷ VND`, as.numeric))
bmp_nganhan
library(tidyr)
library(ggplot2)
library(dplyr)
# Chuyển dữ liệu sang dạng dài
bmp_nganhan_long <- bmp_nganhan %>%
pivot_longer(
cols = -`Chỉ tiêuTỷ VND`,
names_to = "Năm",
values_to = "Giá_trị"
) %>%
mutate(
Năm = as.numeric(Năm),
Giá_trị = as.numeric(Giá_trị)
)
# Vẽ biểu đồ đường
ggplot(bmp_nganhan_long, aes(x = Năm, y = Giá_trị)) +
geom_line(color = "steelblue", linewidth = 1.3) +
geom_point(color = "darkorange", size = 3) +
labs(
title = "Xu hướng TÀI SẢN NGẮN HẠN của BMP qua các năm",
x = "Năm",
y = "Giá trị (Tỷ VND)"
) +
theme_minimal(base_size = 14)
Biểu đồ thể hiện xu hướng TÀI SẢN NGẮN HẠN của BMP qua các năm cho thấy:
Xu hướng tăng rõ rệt theo thời gian:
Tài sản ngắn hạn của BMP tăng liên tục từ mức dưới 500 tỷ đồng (giai đoạn 2006–2008) lên trên 2.500 tỷ đồng vào những năm gần đây.
Mức tăng khá đều đặn, phản ánh quy mô hoạt động và năng lực tài chính của doanh nghiệp được mở rộng ổn định.
Các giai đoạn tăng mạnh:
Giai đoạn 2010–2016: tốc độ tăng nhanh, thể hiện giai đoạn tăng trưởng mạnh của BMP.
Giai đoạn 2018–2020: có sự điều chỉnh giảm nhẹ, có thể do tác động từ môi trường kinh tế hoặc chu kỳ kinh doanh.
Từ 2021 trở đi, tài sản ngắn hạn tiếp tục tăng mạnh trở lại, đạt mức cao nhất trong chuỗi thời gian.
Ý nghĩa:
Việc tài sản ngắn hạn tăng đều cho thấy khả năng thanh khoản và nguồn lực lưu động của BMP được củng cố.
Đồng thời, điều này phản ánh BMP có xu hướng tăng quy mô sản xuất – kinh doanh, đầu tư hàng tồn kho, và tăng khoản phải thu khách hàng.
Tài sản ngắn hạn của BMP có xu hướng tăng ổn định và bền vững qua các năm, thể hiện năng lực tài chính tốt, mặc dù có một vài giai đoạn chững lại do biến động kinh tế chung.
library(dplyr)
# Lọc dữ liệu tài sản ngắn hạn
bmp_nganhank <- bmp_taisan %>%
filter(grepl("Tài sản ngắn hạn khác", `Chỉ tiêuTỷ VND`, ignore.case = TRUE)) %>%
# Chuẩn hóa dữ liệu số
mutate(across(-`Chỉ tiêuTỷ VND`, as.numeric))
bmp_nganhank
bmp_nganhank_long <- bmp_nganhank %>%
pivot_longer(
cols = -`Chỉ tiêuTỷ VND`,
names_to = "Năm",
values_to = "Giá_trị"
) %>%
mutate(Năm = as.numeric(Năm))
# Vẽ biểu đồ đường thể hiện xu hướng
ggplot(bmp_nganhank_long, aes(x = Năm, y = Giá_trị)) +
geom_line(color = "#0072B2", size = 1.2) +
geom_point(color = "orange", size = 3) +
labs(
title = "Xu hướng TÀI SẢN NGẮN HẠN KHÁC của BMP qua các năm",
x = "Năm",
y = "Giá trị (Tỷ VND)"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
panel.grid.minor = element_blank()
)
Biểu đồ cho thấy giá trị tài sản ngắn hạn khác của BMP có xu hướng biến động mạnh trong giai đoạn 2006–2014, dao động chủ yếu trong khoảng 15–30 tỷ đồng và đạt đỉnh gần 50 tỷ đồng vào năm 2014. Tuy nhiên, từ sau năm 2015, chỉ tiêu này giảm mạnh gần như về 0 và duy trì ở mức rất thấp cho đến nay. Diễn biến này cho thấy BMP đã tái cơ cấu danh mục tài sản ngắn hạn, chuyển phần lớn giá trị sang các khoản mục chính như tiền, tương đương tiền hoặc các khoản phải thu ngắn hạn. Việc duy trì giá trị thấp ổn định trong nhiều năm thể hiện sự thận trọng và hiệu quả trong quản lý tài chính, khi doanh nghiệp loại bỏ các khoản mục nhỏ lẻ, không thường xuyên phát sinh.
# Gộp hai bộ dữ liệu
bmp_taisan_long <- bind_rows(
bmp_nganhan_long %>% mutate(Loại = "Tài sản ngắn hạn"),
bmp_nganhank_long %>% mutate(Loại = "Tài sản ngắn hạn khác")
)
# Vẽ biểu đồ đẹp và dễ đọc
ggplot(bmp_taisan_long, aes(x = Năm, y = Giá_trị, color = Loại, group = Loại)) +
geom_line(linewidth = 1.5) +
geom_point(size = 3.5) +
geom_text(aes(label = round(Giá_trị, 0)),
vjust = -0.8, size = 3.5, show.legend = FALSE) +
scale_color_manual(
values = c("Tài sản ngắn hạn" = "#1f77b4",
"Tài sản ngắn hạn khác" = "#ff7f0e")
) +
scale_x_continuous(breaks = seq(min(bmp_taisan_long$Năm, na.rm = TRUE),
max(bmp_taisan_long$Năm, na.rm = TRUE), by = 2)) +
labs(
title = "So sánh xu hướng TÀI SẢN NGẮN HẠN và TÀI SẢN NGẮN HẠN KHÁC của BMP qua các năm",
subtitle = "Đơn vị: Tỷ VND",
x = "Năm",
y = "Giá trị (Tỷ VND)",
color = "Loại tài sản"
) +
theme_minimal(base_size = 15) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
legend.position = "bottom",
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank()
)
Kết quả cho thấy
Tài sản ngắn hạn của BMP có xu hướng tăng mạnh và ổn định theo thời gian, từ mức khoảng 350–500 tỷ đồng giai đoạn 2006–2010 lên hơn 2.500 tỷ đồng vào năm 2024. Mức tăng đều đặn qua từng năm phản ánh sự mở rộng quy mô hoạt động và năng lực tài chính ngày càng vững mạnh của doanh nghiệp.
Ngược lại, tài sản ngắn hạn khác chỉ chiếm tỷ trọng rất nhỏ, dao động từ 10–50 tỷ đồng trong giai đoạn đầu (2006–2014) và gần như bằng 0 từ sau năm 2015. Điều này cho thấy BMP đã tái cấu trúc danh mục tài sản, loại bỏ hoặc gộp các khoản mục nhỏ, không thường xuyên phát sinh.
Tổng thể, sự khác biệt rõ rệt giữa hai đường cho thấy tài sản ngắn hạn chính đóng vai trò chủ lực trong cơ cấu tài sản của BMP, trong khi tài sản ngắn hạn khác hầu như không còn ảnh hưởng đáng kể. Xu hướng này phản ánh chiến lược quản lý tài chính tập trung, hiệu quả và ổn định của công ty trong dài hạn.
library(dplyr)
# Lọc các khoản mục nợ trong bảng cân đối kế toán
bmp_no <- bmp %>%
filter(grepl("NỢ NGẮN HẠN|NỢ DÀI HẠN|NỢ PHẢI TRẢ", `Chỉ tiêuTỷ VND`, ignore.case = TRUE)) %>%
mutate(across(-`Chỉ tiêuTỷ VND`, as.numeric))
bmp_no
library(tidyr)
bmp_no_long <- bmp_no %>%
pivot_longer(cols = -`Chỉ tiêuTỷ VND`,names_to = "Năm",values_to = "Giá_trị") %>%
mutate(
Năm = as.numeric(Năm),
Nhóm_nợ = `Chỉ tiêuTỷ VND`
)
bmp_nodaihan_long <- bmp_no_long %>%
filter(grepl("NỢ DÀI HẠN", Nhóm_nợ, ignore.case = TRUE))
# Vẽ biểu đồ đường
ggplot(bmp_nodaihan_long, aes(x = Năm, y = Giá_trị)) +
geom_line(color = "#E69F00", linewidth = 1.3) +
geom_point(color = "#E69F00", size = 3) +
labs(
title = "Xu hướng NỢ DÀI HẠN của BMP qua các năm",
x = "Năm",
y = "Giá trị (Tỷ VND)"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
panel.grid.minor = element_blank()
)
Trong giai đoạn 2008–2017, giá trị nợ dài hạn của BMP duy trì ở mức rất thấp, gần như không đáng kể trong tổng cơ cấu nguồn vốn. Điều này cho thấy công ty chủ yếu sử dụng vốn tự có và nợ ngắn hạn để tài trợ cho hoạt động sản xuất kinh doanh, đồng thời phản ánh mức độ an toàn tài chính cao và khả năng tự chủ vốn tốt.
Tuy nhiên, kể từ năm 2018 trở đi, nợ dài hạn bắt đầu tăng mạnh, đạt mức đỉnh trong giai đoạn 2019–2020, trước khi có xu hướng giảm nhẹ ở các năm gần đây. Sự gia tăng này có thể liên quan đến các khoản vay dài hạn phục vụ đầu tư mở rộng nhà máy, dây chuyền sản xuất hoặc đầu tư tài sản cố định, trong bối cảnh công ty mở rộng quy mô hoạt động và hiện đại hóa sản xuất.
Dù nợ dài hạn tăng, song BMP vẫn giữ được tỷ trọng nợ hợp lý trong tổng nguồn vốn, cho thấy chính sách quản trị tài chính thận trọng. Việc sử dụng vốn vay dài hạn cũng giúp công ty cân đối dòng tiền, tránh áp lực thanh toán ngắn hạn và tận dụng lợi thế chi phí vốn thấp trong giai đoạn lãi suất ưu đãi.
Nhìn chung, xu hướng nợ dài hạn của BMP phản ánh sự chuyển dịch chiến lược tài chính từ mô hình ít sử dụng đòn bẩy sang cấu trúc vốn linh hoạt hơn, đồng thời thể hiện khả năng mở rộng quy mô và đầu tư dài hạn của doanh nghiệp trong giai đoạn phát triển.
bmp_nonganhan_long <- bmp_no_long %>%
filter(grepl("NỢ NGẮN HẠN", Nhóm_nợ, ignore.case = TRUE))
# Vẽ biểu đồ đường
ggplot(bmp_nonganhan_long, aes(x = Năm, y = Giá_trị)) +
geom_line(color = "yellow", linewidth = 1.3) +
geom_point(color = "black", size = 3) +
labs(
title = "Xu hướng NỢ NGẮN HẠN của BMP qua các năm",
x = "Năm",
y = "Giá trị (Tỷ VND)"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
panel.grid.minor = element_blank()
)
Biểu đồ cho thấy nợ ngắn hạn của Công ty Cổ phần Nhựa Bình Minh (BMP) có xu hướng tăng mạnh và khá biến động trong giai đoạn từ năm 2006 đến năm gần đây.
Giai đoạn 2006–2010, mức nợ ngắn hạn còn thấp, tăng chậm, phản ánh quy mô hoạt động và nhu cầu vốn lưu động chưa lớn.
Từ 2011 trở đi, nợ ngắn hạn tăng nhanh và dao động mạnh giữa các năm, cho thấy công ty đẩy mạnh mở rộng sản xuất – kinh doanh, kéo theo nhu cầu vay vốn ngắn hạn cao hơn để tài trợ cho hàng tồn kho, các khoản phải thu hoặc chi phí vận hành.
Một số năm xuất hiện đỉnh nợ cao đột biến, có thể do BMP tăng vay phục vụ các dự án đầu tư hoặc đối phó biến động chi phí đầu vào.
Tổng thể, xu hướng này phản ánh mức độ phụ thuộc ngày càng lớn vào nguồn vốn ngắn hạn, đồng thời cho thấy áp lực thanh toán nợ ngắn hạn của công ty có thể tăng, đòi hỏi quản lý dòng tiền và vốn lưu động chặt chẽ hơn.
bmp_nonganhan_long <- bmp_nonganhan_long %>%
filter(grepl("Vay và nợ ngắn hạn", Nhóm_nợ, ignore.case = TRUE))
# Vẽ biểu đồ đường
ggplot(bmp_nonganhan_long, aes(x = Năm, y = Giá_trị)) +
geom_line(color = "pink", linewidth = 1.3) +
geom_point(color = "#E69F00", size = 3) +
labs(
title = "Xu hướng vay và nợ ngắn hạn của BMP qua các năm",
x = "Năm",
y = "Giá trị (Tỷ VND)"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
panel.grid.minor = element_blank()
)
Giai đoạn 2006 – 2010
Năm 2006 gần như không có nợ ngắn hạn. Từ 2007 → 2008: tăng đột biến (từ gần 0 lên khoảng 50 tỷ VND).
Sau đó, nợ giảm mạnh và duy trì quanh mức thấp trong vài năm (2009–2011). BMP có thể đã thực hiện đầu tư mở rộng sản xuất hoặc bổ sung vốn lưu động trong giai đoạn đầu, sau đó giảm nợ khi dòng tiền ổn định.
Giai đoạn 2012 – 2016
Từ 2012 đến 2015: nợ tăng nhanh liên tục, đạt đỉnh hơn 100 tỷ VND năm 2016. Có thể BMP đã tăng cường đầu tư máy móc, nhà xưởng hoặc dự án phát triển thị trường.
Giai đoạn 2017 – 2023
Sau năm 2016, nợ giảm dần rồi duy trì ổn định quanh mức 55–60 tỷ VND. Giai đoạn này thể hiện chính sách tài chính thận trọng, BMP dường như duy trì cơ cấu vốn ổn định và không mở rộng vay ngắn hạn thêm.