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)

CHƯƠNG 1. Movie Dataset for Analytics & Visualization

1.1 Giới thiệu dữ liệu

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.

1.1.1 Đọc dữ liệu

d<- read_csv("C:/Users/PC/OneDrive/Máy tính/RRRR/Tiểu Luận R.csv")

1.1.2 Tên các biến

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
  )

1.1.3 Các dòng đầu tiên

head(d)

1.1.4 Các dòng cuối

tail(d)

1.1.5 Kiểm tra kích thước hàng

Sau khi thực hiện câu lệnh ta nhận kết quả như sau

nrow(d)
## [1] 999999

1.1.6 Kiểm tra kích thước cột

Kích thước cột sau khi thực hiện câu lệnh là

length(d)
## [1] 17

1.1.7 Kiểm tra kích thước nhanh

# 999999 quan sát (dòng) 17 biến (cột)
dim(d)
## [1] 999999     17

1.1.8 Kiểm tra cấu trúc kiểu dữ liệu

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)

1.1.9 Tóm tắt tổng quan bộ dữ liệu

skim(d)
Data summary
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 ▇▁▁▁▁

1.1.10 Thống kê cơ bản

#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.

1.2 Xử lý dữ liệu thô và mã hóa dữ liệu

1.2.1 Kiểm tra giá trị NA

d1 <-colSums(is.na(d))

Không có giá trị NA trong bộ dữ liệu

1.2.2 Kiểm tra và loại bỏ bản ghi trùng lặp

# Đế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.

1.2.3 Làm sạch các biến

#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"

1.2.4 Chuẩn hóa kiểu dữ liệu

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)
  )

1.2.5 Tạo biến ROI “Tỷ lệ giữa doanh thu phòng vé toàn cầu và kinh phí sản xuất”

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.

1.2.6 Loại bỏ phim không có kinh phí

d2 <- d1 %>% filter(!is.na(kinh_phi_usd) & kinh_phi_usd > 0)
nrow(d)
## [1] 999999

1.2.7 Phim chiếu theo quý của các năm

# 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.

1.2.8 Thống kê phim chiếu theo quý

sort(table(d1$release_quarter), decreasing = TRUE)
## 
##     Q3     Q4     Q2     Q1 
## 252115 251520 249370 246994

1.2.9 Doanh thu Mỹ theo bốn mức độ

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_
  ))

1.2.10 Doanh thu bình ở Mỹ theo Q3

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()
  )

1.3 Các thống kê cơ bản

1.3.1 Biến phụ thuộc Genre

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.

1.3.2 Nhóm yếu tố cảm xúc của khán giả

d3 <- d[, c("XepHang", "ĐánhGiá", "SoBinhChonIMDb", "SoBinhChonRT", "Genre")]

1.3.2.1 Genre và DiemIMDb

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.

1.3.2.2 Genre và IMDbRating

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")

1.3.3 Nhóm yếu tố hình ảnh thương hiệu

d4 <- d[, c("QuocGia", "DaoDien", "DienVienChinh", "Genre")]

1.3.3.1 Director

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

1.3.3.2 Country

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.

1.3.4 Nhóm yếu tố chi phối

d5 <- d[, c("KinhPhiUSD", "DT_MyUSD", "DT_ToanCauUSD", "DT_NgayDauUSD", "DT_TuanDauUSD", "Genre")]

1.3.4.1 Kinh phí theo thể loại phim

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.

1.3.4.2 Doanh thu ở Mỹ theo thể loại phim

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.


CHƯƠNG 2. PHÂN TÍCH DỮ LIỆU BMP

2.1 Giới thiệu dữ liệu

2.1.1 Đọc dữ liệu

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.

2.1.2 Số dòng số cột dữ liệ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

2.1.3 Kiểm tra cấu trúc kiểu dữ liệu

str(bmp)

2.1.3 Tóm tắt tổng quan bộ dữ liệu

skim(bmp)
Data summary
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 ▇▁▁▁▁

2.1.4 Xem nhanh dữ liệu

head(bmp)
tail(bmp)

2.2 Xử lý dữ liệu thô

2.2.1 Kiểm tra giá trị NA

# 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))

**2.2.2 Kiểm tra và loại bỏ bản ghi trùng lặp

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), ]

2.3 Phân tích cơ bản

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` != "")

2.3.1 Xu hướng tài sản qua thời gian

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.

2.3.2 So sánh hai loại tại sản

# 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.

2.3.3 Tình trạng nợ của doanh nghiệp

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.

2.3.4 Xu hướng đầu tư