Trước hết, em xin bày tỏ lòng biết ơn chân thành và sâu sắc đến thầy Trần Mạnh Tường, người thầy đã đồng hành và hỗ trợ em trong suốt quá trình thực hiện bài tiểu luận của mình. Sự chỉ dẫn của thầy không chỉ giúp em hiểu rõ hơn về kiến thức chuyên môn mà còn giúp em rèn luyện được kỹ năng nghiên cứu, tư duy logic và phát triển khả năng sáng tạo. Em hy vọng có thể tiếp tục nhận được sự hỗ trợ và chỉ dẫn từ Thầy trong những chặng đường học tập và nghề nghiệp sau này. Em cũng xin chân thành cảm ơn quý thầy/cô trong khoa Khoa học dữ liệu đã giảng dạy, cung cấp những kiến thức nền tảng vững chắc và tạo môi trường học tập chất lượng, là cơ sở quan trọng để em có thể thực hiện và hoàn thành bài tiểu luận này. Vì kiến thức và kinh nghiệm của bản thân em còn hạn chế trong quá trình hoàn thiện bài tiểu luận này, em không tránh khỏi những sai sót. Kính mong quý thầy cô có những góp ý, nhận xét để em có thể học hỏi, trau dồi thêm kinh nghiệm và hoàn thiện hơn trong tương lai. Em xin chân thành cảm ơn!
Em xin cam kết rằng bài tiểu luận này là do chính em thực hiện, được thực hiện dưới sự hướng dẫn của Thầy Trần Mạnh Tường. Mọi số liệu và thông tin được sử dụng trong bài tiểu luận này đều trung thực và chính xác, kết quả nghiên cứu được phân tích kỹ lưỡng. Các dữ liệu được chọn lọc cẩn thận, phản ánh đúng thực tế và được kiểm chứng để đảm bảo sự chính xác và đáng tin cậy. Em xin khẳng định rằng kết quả sử dụng trong báo cáo này là do chính em thực hiện, chưa từng được sử dụng trong bất kỳ báo cáo nào khác và hoàn toàn không sao chép từ bất kỳ nguồn nào khác.
Bộ dữ liệu “vehicle-price-prediction” cung cấp thông tin chi tiết về các loại xe, đi kèm các thuộc tính kỹ thuật như loại nhiên liệu, hộp số, động cơ và giá bán tương ứng trên thị trường. Việc phân tích các yếu tố này bằng ngôn ngữ R giúp khám phá mức độ tác động của từng đặc tính đến giá bán, từ đó định hình xu hướng tiêu dùng và hỗ trợ quyết định trong lĩnh vực sản xuất, kinh doanh ô tô hiện đại. Trong chương này, việc lựa chọn bộ ba biến quan trọng (Fuel Type, Transmission, Engine) sẽ cho phép đánh giá, so sánh ảnh hưởng của đặc tính kỹ thuật xe đối với giá trị thương mại, đồng thời ứng dụng các thao tác xử lý, thống kê và trực quan hóa dữ liệu để minh họa kết luận dưới góc nhìn khoa học dữ liệu hiện đại.
Đề tài sử dụng phương pháp phân tích định lượng làm chủ đạo, cụ thể là các kỹ thuật sau:
Thống kê mô tả: Tính toán các chỉ số đo lường xu hướng trung tâm (mean, median), độ phân tán (standard deviation, range, IQR).
Phân tích tương quan: Tính hệ số tương quan Pearson để đo lường mối quan hệ tuyến tính giữa các biến số.
Phân tích tổng hợp: Sử dụng group_by() và summarise() để so sánh các chỉ số thống kê giữa các nhóm.
Trực quan hóa dữ liệu: Sử dụng histograms, density plots, box plots, scatter plots, và bar plots để khám phá phân phối và các mối quan hệ.
Đối tượng nghiên cứu:
Đề tài sử dụng tập dữ liệu về giá xe ô tô. Bộ dữ liệu bao gồm các thông tin đa dạng phản ánh đặc điểm kỹ thuật, yếu tố sử dụng và thông tin giao dịch của từng xe. Cụ thể, các biến trong dữ liệu thể hiện các khía cạnh như hãng xe (make), mẫu xe (model), năm sản xuất (year), công suất động cơ (engine_hp), quãng đường đã sử dụng (mileage), loại nhiên liệu (fuel_type), loại hộp số (transmission), tình trạng xe (condition), số chủ sở hữu (owner_count), loại người bán (seller_type) và giá bán (price).
Phạm vi nghiên cứu:
Đề tài chỉ giới hạn trong phạm vi phân tích dữ liệu. Đề tài không đi sâu vào các mô hình thống kê suy luận hay xây dựng các mô hình dự đoán như hồi quy tuyến tính đa biến hay machine learning.
Bên cạnh đó, dữ liệu được giả định là đã được thu thập và xử lý sơ bộ ở mức đảm bảo chất lượng, do đó nghiên cứu không đi sâu vào quy trình thu thập mà tập trung vào khai thác, phân tích và trình bày dữ liệu một cách khoa học. Tất cả các phép phân tích đều được thực hiện trong môi trường RStudio, sử dụng các gói công cụ hiện đại như tidyverse, dplyr, ggplot2, skimr, và psych để đảm bảo tính chính xác và hiệu quả.
Ngoài phần mở đầu, kết luận, nội dung chính của đề tài được cấu trúc trong phần nội dung như sau:
Giới thiệu tổng quan về bộ dữ liệu
Xử lý dữ liệu
Thống kê mô tả
Trực quan hóa dữ liệu
library(dplyr)
library(readr)
library(psych)
library(ggplot2)
library(tidyverse)
library(stringr)
library(showtext)
library(scales)Đoạn mã được sử dụng nhằm cài đặt, nạp và đọc dữ liệu phục vụ cho việc phân tích bộ dữ liệu vehicle_price_prediction.csv trong R. Đây là bước đầu tiên trong quy trình xử lý dữ liệu, giúp thiết lập môi trường làm việc và đưa bộ dữ liệu gốc vào hệ thống để chuẩn bị cho các thao tác phân tích thống kê và trực quan hóa.
Cụ thể, library(dplyr) nạp gói hỗ trợ thao tác dữ liệu như lọc (filter()), nhóm (group_by()), và tóm tắt (summarise()).
Gói readr được gọi để sử dụng hàm read_csv() – hàm chính để đọc tệp dữ liệu dạng văn bản phân tách bằng dấu phẩy.
Gói psych được kích hoạt nhằm chuẩn bị cho phần phân tích thống kê mô tả chi tiết trong các bước sau.
Gói stringr là một phần của hệ sinh thái tidyverse, được thiết kế để làm việc với chuỗi ký tự (strings) một cách dễ dàng, nhất quán và trực quan hơn so với các hàm xử lý chuỗi cơ bản của R.
Gói showtext (Khắc phục lỗi Unicode): Đây là công cụ chuyển đổi cách R vẽ chữ. Thay vì sử dụng bộ mã hóa mặc định có thể không hỗ trợ Unicode, showtext buộc R render text như các hình học. Điều này đảm bảo rằng các ký tự Unicode của tiếng Việt được hiển thị chính xác.
Cuối cùng, gói scales đóng vai trò là một bộ công cụ hỗ trợ mạnh mẽ, giúp bạn tùy chỉnh và kiểm soát cách dữ liệu được ánh xạ và hiển thị trên các thang đo của biểu đồ.
Bộ dữ liệu “vehicle-price-prediction” cung cấp thông tin về các đặc điểm kỹ thuật và giá bán của hàng ngàn xe ô tô trên thị trường quốc tế, gồm các cột trọng tâm như: Price, Fuel Type, Transmission, Engine,…
## [1] 1000000
## [1] 20
## [1] 1000000 20
Hàm nrow() có chức năng đếm số hàng trong một đối tượng dữ liệu kiểu data frame, tức là số lượng quan sát hoặc bản ghi trong tập dữ liệu. Kết quả [1] 1000000 cho biết bộ dữ liệu đang phân tích có tổng cộng 1.000.000 quan sát, mỗi dòng tương ứng với thông tin của một chiếc xe.
Tương tự, hàm ncol() dùng để đếm số cột của bộ dữ liệu. Kết quả cho thấy mỗi xe được mô tả bởi 20 biến khác nhau, phản ánh nhiều khía cạnh từ đặc tính kỹ thuật, tình trạng sử dụng cho đến yếu tố kinh tế và thị trường.
dim() là thao tác kiểm tra kích thước ban đầu, xác nhận rằng dữ liệu đã được đọc đầy đủ vào bộ nhớ. Kết quả của hàm này trùng khớp với kích thước mong đợi (ở đây là 1.000.000 dòng và 20 cột), điều đó chứng tỏ rằng quá trình nạp dữ liệu từ tệp CSV đã thành công và không xảy ra lỗi mất mát thông tin trong quá trình nhập.
## [1] "make" "model" "year" "mileage"
## [5] "engine_hp" "transmission" "fuel_type" "drivetrain"
## [9] "body_type" "exterior_color" "interior_color" "owner_count"
## [13] "accident_history" "seller_type" "condition" "trim"
## [17] "vehicle_age" "mileage_per_year" "brand_popularity" "price"
Lệnh names() được sử dụng để liệt kê toàn bộ tên các biến (cột) có trong bộ dữ liệu. Kết quả hiển thị cho thấy tập dữ liệu có 20 biến, bao gồm các thông tin như hãng xe (make), mẫu xe (model), năm sản xuất (year), số dặm (mile) đã đi (mileage), công suất động cơ (engine_hp), loại nhiên liệu (fuel_type), tình trạng xe (condition), và giá bán (price),..
## [1] "spec_tbl_df" "tbl_df" "tbl" "data.frame"
Lệnh class() được dùng để kiểm tra kiểu của đối tượng trong R. Kết quả trả về là “spec_tbl_df”, “tbl_df”, “tbl”, “data.frame”, cho biết vehicle_data là một bảng dữ liệu dạng tibble – kiểu dữ liệu mở rộng của data.frame.
Lệnh head() được sử dụng để hiển thị 6 dòng đầu tiên của bộ dữ liệu .Từ những dòng đầu tiên, nhận thấy mỗi quan sát đại diện cho một chiếc xe cùng các biến mô tả về kỹ thuật, tình trạng và giá bán. Điều này hình thành cái nhìn tổng quát về bộ dữ liệu, xác định loại biến, và chuẩn bị cho các bước thống kê mô tả, làm sạch, hoặc trực quan hóa trong các phần sau.
## spc_tbl_ [1,000,000 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ make : chr [1:1000000] "Volkswagen" "Lexus" "Subaru" "Cadillac" ...
## $ model : chr [1:1000000] "Jetta" "RX" "Crosstrek" "Lyriq" ...
## $ year : num [1:1000000] 2016 2010 2016 2016 2018 ...
## $ mileage : num [1:1000000] 183903 236643 103199 118889 204170 ...
## $ engine_hp : num [1:1000000] 173 352 188 338 196 479 160 172 197 198 ...
## $ transmission : chr [1:1000000] "Manual" "Manual" "Automatic" "Manual" ...
## $ fuel_type : chr [1:1000000] "Electric" "Gasoline" "Diesel" "Gasoline" ...
## $ drivetrain : chr [1:1000000] "RWD" "FWD" "AWD" "AWD" ...
## $ body_type : chr [1:1000000] "Sedan" "Sedan" "Sedan" "SUV" ...
## $ exterior_color : chr [1:1000000] "Blue" "Silver" "Silver" "Black" ...
## $ interior_color : chr [1:1000000] "Brown" "Beige" "Beige" "Gray" ...
## $ owner_count : num [1:1000000] 5 5 5 3 5 5 1 5 3 1 ...
## $ accident_history: chr [1:1000000] "None" "Minor" "None" "None" ...
## $ seller_type : chr [1:1000000] "Dealer" "Dealer" "Dealer" "Private" ...
## $ condition : chr [1:1000000] "Excellent" "Good" "Excellent" "Good" ...
## $ trim : chr [1:1000000] "EX" "LX" "Touring" "Base" ...
## $ vehicle_age : num [1:1000000] 9 15 9 9 7 4 7 3 10 1 ...
## $ mileage_per_year: num [1:1000000] 20434 15776 11467 13210 29167 ...
## $ brand_popularity: num [1:1000000] 0.0401 0.0399 0.0402 0.0398 0.0396 ...
## $ price : num [1:1000000] 7209 6912 11916 25985 8151 ...
## - attr(*, "spec")=
## .. cols(
## .. make = col_character(),
## .. model = col_character(),
## .. year = col_double(),
## .. mileage = col_double(),
## .. engine_hp = col_double(),
## .. transmission = col_character(),
## .. fuel_type = col_character(),
## .. drivetrain = col_character(),
## .. body_type = col_character(),
## .. exterior_color = col_character(),
## .. interior_color = col_character(),
## .. owner_count = col_double(),
## .. accident_history = col_character(),
## .. seller_type = col_character(),
## .. condition = col_character(),
## .. trim = col_character(),
## .. vehicle_age = col_double(),
## .. mileage_per_year = col_double(),
## .. brand_popularity = col_double(),
## .. price = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Lệnh str() được dùng để xem cấu trúc tổng quát của bộ dữ liệu. Kết quả hiển thị cho biết đối tượng vehicle_data là một bảng dữ liệu có 1.000.000 quan sát và 20 biến.
variable_description <- data.frame(
Variable = c(
"make", "model", "year", "mileage", "engine_hp",
"transmission", "fuel_type", "drivetrain", "body_type",
"exterior_color", "interior_color", "owner_count",
"accident_history", "seller_type", "condition",
"trim", "vehicle_age", "mileage_per_year",
"brand_popularity", "price"),
Description = c(
"Hãng sản xuất của xe", "Mẫu xe cụ thể",
"Năm sản xuất","Số dặm đã đi",
"Công suất động cơ (hp)","Loại hộp số",
"Loại nhiên liệu sử dụng","Hệ dẫn động",
"Kiểu thân xe","Màu sơn bên ngoài",
"Màu nội thất","Số lượng chủ sở hữu",
"Lịch sử tai nạn","Loại người bán",
"Tình trạng xe","Phiên bản,trang bị",
"Tuổi xe","Số dặm trung bình/năm",
"Độ phổ biến thương hiệu","Giá bán xe (USD)"))
library(knitr)
kable(variable_description, caption = "**Bảng mô tả các biến trong dữ liệu giá xe**")| Variable | Description |
|---|---|
| make | Hãng sản xuất của xe |
| model | Mẫu xe cụ thể |
| year | Năm sản xuất |
| mileage | Số dặm đã đi |
| engine_hp | Công suất động cơ (hp) |
| transmission | Loại hộp số |
| fuel_type | Loại nhiên liệu sử dụng |
| drivetrain | Hệ dẫn động |
| body_type | Kiểu thân xe |
| exterior_color | Màu sơn bên ngoài |
| interior_color | Màu nội thất |
| owner_count | Số lượng chủ sở hữu |
| accident_history | Lịch sử tai nạn |
| seller_type | Loại người bán |
| condition | Tình trạng xe |
| trim | Phiên bản,trang bị |
| vehicle_age | Tuổi xe |
| mileage_per_year | Số dặm trung bình/năm |
| brand_popularity | Độ phổ biến thương hiệu |
| price | Giá bán xe (USD) |
Phần đầu của đoạn mã sử dụng hàm data.frame() để tạo một khung dữ liệu mới có hai cột chính:
Variable: liệt kê tên các biến trong tập dữ liệu, bao gồm 20 biến như make, model, year, mileage, price, v.v.
Description: mô tả ý nghĩa nội dung và chức năng thống kê của từng biến.
Sử dụng hàm kable() từ gói knitr để trình bày bảng theo định dạng đẹp mắt và chuyên nghiệp.
Đây là bước định nghĩa dữ liệu — giúp người đọc hiểu được phạm vi, bản chất và vai trò của từng trường dữ liệu, là bước bắt buộc trong quy trình Data Documentation chuẩn, giúp phân tích dữ liệu hiệu quả và chuyên nghiệp.
Để đảm bảo độ tin cậy của bộ dữ liệu, trước khi tiến hành các bước xử
lý khác, nhóm nghiên cứu đã kiểm tra giá trị thiếu (NA) và
dữ liệu trùng lặp (duplicated()).
## make model year mileage
## 0 0 0 0
## engine_hp transmission fuel_type drivetrain
## 0 0 0 0
## body_type exterior_color interior_color owner_count
## 0 0 0 0
## accident_history seller_type condition trim
## 0 0 0 0
## vehicle_age mileage_per_year brand_popularity price
## 0 0 0 0
## [1] 0
Lệnh này được dùng để kiểm tra số lượng giá trị thiếu (NA) trong từng biến của bộ dữ liệu. Hàm is.na() xác định vị trí các ô bị thiếu, sau đó colSums() cộng tổng số giá trị thiếu theo từng cột.
Lệnh sum(duplicated()) được sử dụng để kiểm tra xem trong bộ dữ liệu có bản ghi nào bị trùng lặp hay không. Hàm duplicated() trả về giá trị TRUE cho những hàng trùng, và sum() cộng tổng số đó.
Kết quả cho thấy:
Không có giá trị thiếu (NA) nào trong toàn bộ các
cột của dữ liệu.
Không tồn tại bản ghi nào bị trùng lặp.
Do đó, bộ dữ liệu được xem là sạch và đầy đủ có thể sử dụng trực tiếp trong các bước xử lý và phân tích tiếp theo mà không cần loại bỏ hoặc điền giá trị thay thế.
Lệnh này được sử dụng để chuẩn hóa lại tên các biến trong dữ liệu, trong trường hợp tên biến có ký tự đặc biệt, dấu cách hoặc ký hiệu không hợp lệ trong R. Hàm make.names() sẽ tự động thay thế các ký tự không phù hợp bằng dấu chấm “.”, giúp đảm bảo tất cả tên biến đều hợp lệ .
df_clean <- vehicle_data |>
mutate(
fuel_type = as.factor(fuel_type),
condition = as.factor(condition),
seller_type = as.factor(seller_type),
make = as.factor(make),
model = as.factor(model))as.factor(): Thao tác này thay đổi cách R lưu trữ dữ liệu. Chuyển đổi kiểu dữ liệu character sang factor. Điều này thông báo cho R rằng đây là các biến phân loại.
Đảm bảo rằng các danh mục được hệ thống hiểu là các nhóm riêng biệt, không phải là văn bản tự do. Điều này rất quan trọng cho việc lập báo cáo và phân nhóm thị trường.
Biến mileage thể hiện quãng đường xe di chuyển kể từ khi xuất xưởng nhưng được đo bằng đơn vị dặm (mile), trong khi hệ đo lường quốc tế và các nghiên cứu kỹ thuật, đơn vị thường được sử dụng là kilômét (km). Để đảm bảo tính thống nhất, biến này được chuyển đổi sang đơn vị km bằng công thức quy đổi chuẩn là 1 mile = 1.60934 km. Quá trình chuyển đổi được thực hiện bằng lệnh:
df_clean <- df_clean %>% mutate(mileage_km = mileage / 1.60934)
df_clean %>% select(mileage, mileage_km) %>%
head(10)Hàm mutate() tạo thêm một biến mới có tên mileage_km, kết quả thu được là một cột mới mileage_km được thêm vào cuối bảng dữ liệu.
Hàm select() được dùng để hiển thị hai biến mileage và mileage_km, kiểm tra nhanh kết quả chuyển đổi và đảm bảo độ chính xác của phép tính trước khi tiếp tục các bước xử lý tiếp theo.
df_clean <- df_clean %>%
mutate( power_segment = factor(
case_when(
engine_hp < 150 ~ "Low",
engine_hp >= 150 & engine_hp < 250 ~ "Medium",
engine_hp >= 250 ~ "High",),
levels = c("Low", "Medium", "High"), ordered = TRUE))Mục đích của việc sử dụng hàm case_when() và factor() là để phân loại dữ liệu công suất động cơ thành các nhóm có ý nghĩa:
-Phân khúc Low: Đại diện cho các mẫu xe cơ bản hoặc xe tiết kiệm nhiên liệu.
-Phân khúc Medium: Đại diện cho các mẫu xe phổ thông hoặc xe gia đình có hiệu suất cân bằng.
-Phân khúc High: Đại diện cho các mẫu xe hiệu suất cao, xe sang trọng hoặc xe tải/SUV đầy tải.
Việc chuyển đổi sang factor và đặt ordered = TRUE đảm bảo R hiểu rằng có một thứ tự giữa các nhóm (High > Medium > Low).
Biến price_per_engine
Dùng mutate() để tạo một cột mới bằng cách thực hiện phép chia giữa hai cột số (price và engine_hp).
Kết quả tạo ra chỉ số hiệu suất mới: Chi phí cho mỗi đơn vị mã lực. Chỉ số này giúp so sánh giá trị tương đối của các xe, bất kể sức mạnh tuyệt đối. Một chiếc xe $30.000 với 300hp ($100/hp) có thể được coi là giá trị tốt hơn so với chiếc xe $30.000 với 150hp ($200/hp).
Biến tuổi xe
current_year <- max(vehicle_data$year, na.rm = TRUE) + 1
df_clean <- df_clean %>%
mutate(vehicle_age = current_year - year)
df_clean %>% select(year, vehicle_age) %>% head(10)Sử dụng hàm mutate() để tạo thêm biến mới tên vehicle_age. Giá trị của nó được tính bằng cách lấy current_year (năm mới nhất trong bộ dữ liệu + 1) trừ đi cột year (năm sản xuất) của mỗi chiếc xe.
Hàm select() được dùng để hiển thị hai cột year và vehicle_ age giúp kiểm tra kết quả tạo biến trước khi tiếp tục các bước phân tích thống kê tiếp theo.
Việc tạo biến vehicle_ age mang lại thông tin quan trọng về mức độ hao mòn và giá trị sử dụng của xe, yếu tố có ảnh hưởng mạnh đến giá bán và hành vi người tiêu dùng. Biến này giúp phân tích dễ dàng hơn các đặc trưng theo độ tuổi xe, chẳng hạn như xu hướng giảm giá theo thời gian, chi phí bảo trì.
Phân nhóm tuổi xe
mutate(case_when(…)): Duyệt qua từng hàng của cột vehicle_age. Dựa trên tuổi của xe, nó gán một nhãn văn bản tương ứng. Sử dụng hàm factor() để chuyển đổi các nhãn văn bản này thành một kiểu dữ liệu đặc biệt của R là Factor.
levels và ordered: Tạo ra một biến định tính có thứ tự, đảm bảo R hiểu được trật tự logic của các nhóm.
df_clean <- df_clean |>
mutate(
age_group = case_when(
vehicle_age <= 3 ~ "New",
vehicle_age <= 7 ~ "Normal",
vehicle_age <= 12 ~ "Old",
TRUE ~ "Very old") |>
factor(levels = c("New", "Normal", "Old", "Very old")))Việc này giúp đơn giản hóa phân tích. Thay vì phải kiểm tra mối quan hệ của 20 độ tuổi khác nhau với giá xe, giờ chỉ cần so sánh 4 nhóm. Điều này giúp phát hiện các xu hướng lớn dễ dàng hơn.
Ở phần này, toàn bộ phân tích, thống kê mô tả và kiểm định đều tập trung xoay quanh ba biến chính:
Loại nhiên liệu (fuel_type)
Loại hộp số (transmission)
Công suất động cơ (engine_hp)
Các phân tích không chỉ mô tả đơn lẻ từng biến mà còn khai thác sâu mối tương quan, ảnh hưởng lẫn nhau giữa ba yếu tố kỹ thuật đặc trưng này và giá xe.
table(): Tạo một bảng tần suất, đếm số lần xuất hiện của mỗi cấp độ duy nhất trong một vector factor.
prop.table(): Lấy một đối tượng table làm đầu vào và chia mỗi ô cho tổng số, trả về tỷ lệ (từ 0 đến 1), cho biết mỗi loại chiếm bao nhiêu phần trăm trong toàn bộ tập dữ liệu.
##
## Diesel Electric Gasoline
## 320453 359597 319950
##
## Diesel Electric Gasoline
## 0.320453 0.359597 0.319950
Kết quả cho thấy cơ cấu của thị trường xe đang ở trạng thái cạnh tranh cực kỳ gay gắt và bị phân mảnh với sự phân chia gần như đồng đều:
Số xe sử dụng dầu (Diesel) là 320453 xe, chiếm khoảng 32% trong bộ dữ liệu.
Số xe sử dụng xăng (Gasoline) là 319950 xe, xấp xỉ khoảng 32% trong bộ dữ liệu
Số xe sử dụng điện (Electric) là 359579 xe, chiếm xấp xỉ 36% trong bộ dữ liệu. Đây là một tín hiệu , cho thấy xu hướng điện khí hóa đang chiếm ưu thế trong thị trường này.
Biểu đồ thể hiện số lượng xe theo nhiên liệu
Dòng 1: Khởi tạo biểu đồ. Ánh xạ fuel_type (Loại nhiên liệu) vào cả trục X và màu tô (fill).
Dòng 2: Thêm lớp biểu đồ cột. Vì không có trục Y, nó sẽ tự động đếm (stat = “count”) số lượng xe trong mỗi fuel_type.
Dòng 3-4: Thêm lớp nhãn văn bản. stat = ‘count’ và aes(label = after_stat(count)) để lấy kết quả đếm từ geom_bar và hiển thị nó dưới dạng nhãn. vjust = -0.5 đẩy nhãn lên phía trên đỉnh cột.
Dòng 5-7: Đặt tiêu đề và nhãn cho trục X, Y.
Dòng 8: Áp dụng giao diện (theme) “black and white” (nền trắng, lưới đen).
Dòng 9: Ẩn chú giải.
ggplot(df_clean, aes(x = fuel_type, fill = fuel_type)) +
geom_bar() +
geom_text( stat = 'count', aes(label = after_stat(count)),
vjust = -0.5 ) +
labs( title = "Số lượng xe theo nhóm nhiên liệu",
x = "Nhóm nhiên liệu",
y = "Số lượng xe") +
theme_bw() +
theme(legend.position = "none")Biểu đồ thể hiện cơ cấu sử dụng nhiên liệu trên thị trường xe
Dòng 1-4: Tạo một data frame chứa tên các loại nhiên liệu và tỷ lệ của chúng. arrange và mutate được dùng để tính toán cột ypos, là vị trí thẳng đứng (trên thang 0-1) để đặt nhãn phần trăm ở chính giữa.
Dòng 5: Khởi tạo biểu đồ, ánh xạ proportion vào trục Y và fuel_type vào màu tô.
Dòng 6: Vẽ một biểu đồ cột xếp chồng.
Dòng 7: Uốn cong biểu đồ cột đó thành biểu đồ tròn.
Dòng 8: Thêm nhãn văn bản, đặt nhãn tại vị trí ypos đã tính.
Dòng 9: Định dạng nhãn thành phần trăm với 1 chữ số thập phân.
Dòng 10: xóa toàn bộ nền, trục và lưới của biểu đồ.
data_plot_1 <- data.frame(
fuel_type = c("Diesel", "Electric", "Gasoline"),
proportion = c(0.320453, 0.359597, 0.319950)) %>% arrange(desc(fuel_type)) %>%
mutate( ypos = cumsum(proportion) - 0.5 * proportion)
ggplot(data_plot_1, aes(x = "", y = proportion, fill = fuel_type)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(y = ypos,
label = percent(proportion, accuracy = 0.1)),
color = "black",
size = 5) +
theme_void() +
labs(title = "Biểu đồ cơ cấu nhiên liệu") +
theme(plot.title = element_text(hjust = 0.5, size = 16))##
## Automatic Manual
## 500263 499737
##
## Automatic Manual
## 0.500263 0.499737
Dữ liệu cho thấy thị trường bị chia làm hai một cách rõ rệt:
Hộp số tự động (Automatic) chiếm 50.03%
Hộp số sàn (Manual) chiếm 49.97%.
Điều này cho thấy một thị trường cực kỳ trưởng thành và phân cực, không có sở thích nào chiếm ưu thế tuyệt đối. Đối với bất kỳ doanh nghiệp nào trong ngành, họ không thể bỏ qua một trong hai phân khúc; chiến lược sản xuất, tồn kho và tiếp thị phải được phân bổ gần như 1:1 để đáp ứng nhu cầu chia đều của khách hàng.
Biểu đồ thể hiện cơ cấu hộp số trên thị trường xe
data_plot_2 <- data.frame(
transmission_type = c("Automatic", "Manual"),
proportion = c(0.500263, 0.499737)) %>%
mutate(ypos = cumsum(proportion) - 0.5 * proportion)
ggplot(data_plot_2, aes(x = "", y = proportion, fill = transmission_type)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(y = ypos,
label = percent(proportion, accuracy = 0.01)), color = "black", size = 5) +
theme_void() +
labs(title = "Cơ cấu hộp số", fill = "Loại hộp số:") +
theme(plot.title = element_text(hjust = 0.5, size = 16),
legend.position = "bottom") Hàm summarise() thu gọn toàn bộ data frame thành một hàng duy nhất chứa các giá trị tổng hợp. Ta áp dụng ba hàm tổng hợp:min() giá trị nhỏ nhất, max() giá trị lớn nhất, mean() trung bình, và sd() độ lệch chuẩn.
summary_hp <- df_clean |> summarise(
min_hp = min(engine_hp),max_hp = max(engine_hp),
average_hp = mean(engine_hp),std_dev_hp = sd(engine_hp))
print(summary_hp)## # A tibble: 1 × 4
## min_hp max_hp average_hp std_dev_hp
## <dbl> <dbl> <dbl> <dbl>
## 1 90 581 236. 93.6
min_hp (90) & max_hp (581) xác định khoảng biến thiên của dữ liệu. Hai con số này cho thấy thị trường cực kỳ rộng, bao gồm từ các dòng xe phổ thông, tiết kiệm (90 hp) cho đến các dòng xe thể thao/cao cấp (581 hp).
average_hp (235.66) thước đo xu hướng trung tâm. Nó cho biết giá trị mã lực điển hình của bộ dữ liệu là khoảng 236 hp.
std_dev_hp (93.61): độ lệch chuẩn cao cho thấy thị trường rất đa dạng và phân mảnh. Không có một loại xe tiêu chuẩn nào, mà có nhiều phân khúc khách hàng rõ rệt.
Biểu đồ: Số lượng xe theo phân khúc công suất
Dòng 2: Đếm số lượng hàng cho mỗi giá trị x và vẽ một cột có chiều cao tương ứng.
Dòng 3: Lớp này thêm văn bản vào biểu đồ, hiển thị chính kết quả của việc đếm đó ngay trên mỗi cột.
Dòng 4-7: Thêm các tiêu đề và nhãn trục rõ ràng.
ggplot(df_clean, aes(x = power_segment, fill = power_segment) ) +
geom_bar(alpha = 0.8) +
geom_text( aes(label = after_stat(count)),
stat = "count",
vjust = -0.5,
size = 3.5 )+
labs(
title = "Số lượng xe theo phân khúc công suất",
x = "Phân khúc công suất ",
y = "Số lượng xe") +
theme_minimal() +
theme(legend.position = "none") Biểu đồ cho thấy thị trường xe trong bộ dữ liệu này chủ yếu là xe có công suất “Medium” và “High”. Điều này cho thấy nguồn cung hoặc nhu cầu tập trung vào các xe có hiệu suất từ trung bình trở lên.
Lệnh group_by() có chức năng phân chia dữ liệu thành các nhóm riêng biệt.
summarise() thu gọn mỗi nhóm đã phân chia ở trên thành một hàng duy nhất. Bên trong nó, mean() tính giá trung bình và sd() tính độ lệch chuẩn (sd_price) của cột cho từng nhóm riêng biệt đó.
price_stats_fuel <- df_clean |>
group_by(fuel_type) |>
summarise(
avg_price = mean(price, na.rm = TRUE),
sd_price = sd(price, na.rm = TRUE))
print(price_stats_fuel)## # A tibble: 3 × 3
## fuel_type avg_price sd_price
## <fct> <dbl> <dbl>
## 1 Diesel 19836. 13440.
## 2 Electric 21228. 13984.
## 3 Gasoline 19813. 13407.
Nhìn vào kết quả, giá trung bình của xe điện cao hơn khoảng 1.400 đơn vị so với diesel và gasoline. Tuy nhiên, điều này có thể chịu ảnh hưởng mạnh từ việc engine_hp của xe điện cũng thường cao hơn; cần kiểm tra thêm hiệu suất giá/mã lực và phân khúc engine_hp ở các phần tiếp theo để kết luận nguyên nhân thực sự của chênh lệch giá.
Mặt khác, mức giá trung bình của diesel và gasoline là gần như giống hệt nhau, điều này có nghĩa chúng là đối thủ cạnh tranh trực tiếp, nhắm vào cùng một phân khúc khách hàng nhạy cảm về giá.
Độ lệch chuẩn giá ở cả ba nhóm đều cao, chứng tỏ thị trường có biên độ rộng từ xe phổ thông đến xe cao cấp trong mỗi phân khúc nhiên liệu.
Biểu đồ Boxplot phân phối giá theo nhiên liệu
Dòng 2: Vẽ biểu đồ hộp, tùy chỉnh các điểm ngoại lai thành các vòng tròn nhỏ (shape = 1).
Dòng 3: Thêm các điểm dữ liệu riêng lẻ, hiển thị tất cả các điểm dữ liệu gốc màu đen, hơi phân tán (width = 0.1) và làm mờ (alpha = 0.05) để tránh che lấp.
Dòng 4: biến đổi trục Y sang thang Logarit và định dạng các nhãn trên trục Y thành dạng tiền tệ.
ggplot(df_clean, aes(x = fuel_type, y = price, fill = fuel_type))+
geom_boxplot(outlier.color = "red", outlier.shape = 1) +
geom_jitter(width = 0.1, alpha = 0.05, color = "black") +
scale_y_log10(labels = scales::dollar) +
labs(
title = "Phân phối Giá (Boxplot) theo nhóm nhiên liệu",
x = "Nhóm nhiên liệu",
y = "Giá bán (Thang Log)"
) +
theme_light() + theme(legend.position = "none")Biểu đồ cho thấy các cột chấm đen dày đặc thể hiện cả ba nhóm nhiên liệu đều đa dạng về giá, trải dài từ giá rất rẻ đến rất đắt.
price_stats_engine <- df_clean |>
group_by(power_segment) |>
summarise(
avg_price = mean(price, na.rm = TRUE),
sd_price = sd(price, na.rm = TRUE))
print(price_stats_engine)## # A tibble: 3 × 3
## power_segment avg_price sd_price
## <ord> <dbl> <dbl>
## 1 Low 11043. 7124.
## 2 Medium 15509. 9103.
## 3 High 30059. 14237.
Kết quả cho thấy engine_hp là yếu tố chính quyết định giá xe; giá trung bình tăng dần theo từng phân khúc mã lực. Riêng nhóm High vừa có giá trị trung bình cao, vừa có độ đa dạng lớn về giá – thể hiện một thị trường phức tạp, tập trung cả xe thể thao hiệu suất và các mẫu siêu sang, trong khi nhóm Low tương đối ổn định về giá trị.
Biểu đồ giá theo phân khúc động cơ
ggplot(df_clean, aes(x = power_segment, y = price, fill = power_segment) ) +
geom_boxplot(
outlier.color = "red",
outlier.shape = 1,
alpha = 0.7 ) +
scale_y_log10(labels = scales::dollar_format(suffix = " $", prefix = "")) +
labs(
title = "So sánh Phân phối giá theo phân khúc động cơ",
x = "Phân khúc động cơ",
y = "Giá bán (USD) ",
fill = "Phân khúc" ) +
theme_minimal() +
theme(legend.position = "none") Biểu đồ cho thấy mức giá trung vị tăng khi chuyển từ phân khúc động cơ Low sang Medium và High, xác nhận engine_hp là yếu tố quyết định về giá xe. Phân khúc High không chỉ có giá trung bình cao nhất mà còn có sự phân tán giá lớn với nhiều ngoại lai – bao gồm cả xe thể thao giá thấp và siêu xe, tạo nên biên độ giá rộng nhất thị trường. Điều này nhấn mạnh rằng mức mã lực càng cao thì giá trị sản phẩm biến động mạnh, trong khi phân khúc Low chủ yếu ổn định với xe phổ thông, giá rẻ.”
price_stats_trans <- df_clean |>
group_by(transmission) |>
summarise(
avg_price = mean(price, na.rm = TRUE),
sd_price = sd(price, na.rm = TRUE))
print(price_stats_trans)## # A tibble: 2 × 3
## transmission avg_price sd_price
## <chr> <dbl> <dbl>
## 1 Automatic 20310. 13644.
## 2 Manual 20348. 13644.
Kết quả cho thấy loại hộp số (Automatic/Manual) gần như không ảnh hưởng đến giá trung bình và mức độ biến động giá xe; sự khác biệt giá giữa hai nhóm này là không có ý nghĩa thống kê. Điều này cho thấy việc chọn hộp số chỉ là vấn đề sở thích lái xe, không phải yếu tố chi phối giá trị sản phẩm. Cả hai nhóm hộp số đều có mức đa dạng giá lớn, bao trùm từ xe phổ thông đến xe thể thao và xe cao cấp.
Biểu đồ phân phối giá theo hộp số
ggplot(df_clean, aes(x = transmission, y = price, fill = transmission)) +
geom_boxplot() +
scale_y_log10(labels = scales::dollar) +
labs(
title = "Phân phối giá theo hộp số",
x = "Loại hộp số",
y = "Giá bán (Thang Log)") +
theme_bw() + theme(legend.position = "none")Giá xe giữa nhóm số tự động và số sàn gần như không khác biệt, cho thấy hộp số không quyết định phân khúc giá trên thị trường.
Mở rộng thao tác group_by() để nhận vào 3 biến phân loại (group_by(A, B, C)).Thao tác này sẽ tạo ra nhóm tổ hợp duy nhất.
summarise() sau đó tính toán avg_price và car_count cho từng tổ hợp trong 18 nhóm này.
price_combo_3way <- df_clean |>
group_by(power_segment, transmission, fuel_type) |>
summarise( car_count = n(),
avg_price = mean(price),median_price = median(price) ) |>
arrange(power_segment, transmission, desc(avg_price))
print(price_combo_3way)## # A tibble: 18 × 6
## # Groups: power_segment, transmission [6]
## power_segment transmission fuel_type car_count avg_price median_price
## <ord> <chr> <fct> <int> <dbl> <dbl>
## 1 Low Automatic Diesel 31204 11074. 10307.
## 2 Low Automatic Gasoline 31167 11050. 10356.
## 3 Low Automatic Electric 31103 11024. 10270.
## 4 Low Manual Diesel 31068 11065. 10255.
## 5 Low Manual Electric 30999 11036. 10222.
## 6 Low Manual Gasoline 30948 11005. 10250.
## 7 Medium Automatic Electric 70566 15510. 14585.
## 8 Medium Automatic Diesel 71189 15505. 14579.
## 9 Medium Automatic Gasoline 70980 15479. 14535.
## 10 Medium Manual Gasoline 70842 15604. 14644.
## 11 Medium Manual Diesel 70867 15493. 14543.
## 12 Medium Manual Electric 70540 15465. 14514.
## 13 High Automatic Electric 78192 30434. 28803.
## 14 High Automatic Diesel 57830 29847. 27962.
## 15 High Automatic Gasoline 58032 29724. 27878.
## 16 High Manual Electric 78197 30480. 28862.
## 17 High Manual Diesel 58295 29839. 28038.
## 18 High Manual Gasoline 57981 29753. 27982.
Kết quả phân tích nhóm tổ hợp 3 chiều khẳng định sức mạnh động cơ (engine_hp) là yếu tố chi phối mạnh nhất tới giá xe, khi giá trung bình tăng rõ rệt từ Low lên Medium và tăng gần gấp đôi khi sang High.
Ảnh hưởng của loại hộp số (Auto/Manual) là không đáng kể khi so sánh trong từng phân khúc động cơ cố định, thể hiện rõ mức giá trung bình giữa cùng một nhóm engine_hp gần như bằng nhau bất kể hộp số.
Riêng với nhóm nhiên liệu, giá xe điện (Electric) chỉ nhỉnh hơn rõ rệt so với Diesel và Gasoline trong phân khúc High, trong khi ở các phân khúc thấp hơn, mức giá giữa các nhóm nhiên liệu gần như tương tự nhau. Điều này phản ánh các mẫu xe điện chủ yếu được định vị nhiều ở phân khúc động cơ cao cấp.”
## [1] 0.6533389
Biểu đồ thể hiện mối liên hệ trực quan giữa động cơ và giá bán
ggplot() khởi tạo biểu đồ với động cơ trên trục X và giá bán trên trục Y.
geom_point(alpha = 0.1) vẽ các điểm dữ liệu. alpha (độ trong suốt) giúp chúng ta thấy các vùng dày đặc (nơi có nhiều xe) thay vì chỉ là một mảng đen.
geom_smooth(method = “lm”) vẽ một đường hồi quy tuyến tính xuyên qua đám mây điểm. Đường màu đỏ này chính là biểu diễn trực quan của hệ số tương quan mà chúng ta vừa tính.
ggplot(df_clean, aes(x = engine_hp, y = price)) +
geom_point(alpha = 0.1, color = "blue") +
geom_smooth(method = "lm", color = "red", se = FALSE) +
labs( title = "Mối liên hệ trực quan giữa động cơ và giá bán",
x = "Động cơ", y = "Giá bán " ) +
theme_minimal()Kết quả cho thấy engine_hp là một trong những yếu tố dự báo giá xe mạnh nhất, với hệ số tương quan Pearson r ≈ 0.65. Điều này đồng nghĩa, khi khách hàng chọn xe mã lực lớn, giá bán tăng đáng kể theo. Tuy nhiên, engine_hp không giải thích hoàn toàn giá – các yếu tố khác như thương hiệu, năm sản xuất, tình trạng xe… cũng đóng vai trò không nhỏ. Đường hồi quy trong biểu đồ càng minh họa rõ xu hướng giá tăng theo sức mạnh động cơ, dù vẫn có sự phân tán do ảnh hưởng các yếu tố phụ.
Dao động engine_hp theo nhóm nhiên liệu
Sử dụng group_by(fuel_type_grouped) để chia dữ liệu thành 3 nhóm. summarise() sau đó tính toán 4 chỉ số cho từng nhóm: n() (số lượng), mean() (trung bình), median() (trung vị), và sd() (độ lệch chuẩn).
hp_stats_fuel <- df_clean |>
group_by(fuel_type) |>
summarise(
car_count = n(),avg_hp = mean(engine_hp),
median_hp = median(engine_hp),std_dev_hp = sd(engine_hp)) |>
arrange(desc(avg_hp))
print(hp_stats_fuel)## # A tibble: 3 × 5
## fuel_type car_count avg_hp median_hp std_dev_hp
## <fct> <int> <dbl> <dbl> <dbl>
## 1 Electric 359597 244. 226 95.6
## 2 Gasoline 319950 231. 209 92.2
## 3 Diesel 320453 231. 209 92.1
Xe điện (Electric) có trung bình mã lực cao hơn rõ rệt so với xe xăng (Gasoline) và dầu (Diesel), cho thấy các nhà sản xuất định vị xe điện là dòng xe hiệu suất cao trên thị trường. Hai nhóm xe chạy xăng và dầu có chỉ số kỹ thuật gần như giống hệt nhau, phản ánh sự cạnh tranh trực tiếp về hiệu suất giữa hai dạng động cơ đốt trong này. Ngoài ra, việc mức trung bình lớn hơn trung vị ở mọi nhóm chỉ ra sự xuất hiện của một số lượng xe công suất cực lớn đã kéo giá trị trung bình lên, còn phần lớn thị trường vẫn tập trung quanh mức trung vị.
Dao động engine_hp theo nhóm hộp số
hp_stats_transmission <- df_clean |>
group_by(transmission) |>
summarise(
car_count = n(),
avg_hp = mean(engine_hp),
median_hp = median(engine_hp),
std_dev_hp = sd(engine_hp) )|>
arrange(desc(avg_hp))
print(hp_stats_transmission)## # A tibble: 2 × 5
## transmission car_count avg_hp median_hp std_dev_hp
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Manual 499737 236. 215 93.7
## 2 Automatic 500263 236. 214 93.5
Kết quả cho thấy trung bình và trung vị engine_hp ở cả hai nhóm số tự động (Automatic) và số sàn (Manual) đều gần như bằng nhau, đồng thời mức độ phân tán cũng tương tự. Điều này khẳng định loại hộp số không phải là yếu tố quyết định đến sức mạnh động cơ; việc chọn Automatic hay Manual hoàn toàn theo sở thích lái xe, chứ không phản ánh lựa chọn hiệu suất mạnh hay yếu.
Câu hỏi: Có mối quan hệ giữa loại nhiên liệu và mã lực không?
Sử dụng ANOVA vì fuel_type_grouped có 3 cấp độ.
aov(Y ~ X) là hàm R để chạy mô hình phân tích phương sai, kiểm tra xem trung bình của Y (Engine_HP) có khác nhau giữa các nhóm của X (fuel_type_grouped) hay không.
## Df Sum Sq Mean Sq F value Pr(>F)
## fuel_type 2e+00 4.354e+07 21772390 2497 <2e-16 ***
## Residuals 1e+06 8.720e+09 8720
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Kiểm định ANOVA cho thấy sự khác biệt có ý nghĩa thống kê về engine_hp giữa các nhóm nhiên liệu (fuel_type), với p-value ≈ 0. Kết quả này khẳng định loại nhiên liệu là một yếu tố quan trọng quyết định hiệu suất động cơ, phản ánh định vị kỹ thuật khác nhau giữa xe điện và xe động cơ đốt trong.
Câu hỏi: “Có mối quan hệ giữa hộp số và mã lực không?
ta sử dụng T-Test (Kiểm định T) vì Transmission chỉ có 2 cấp độ (Automatic, Manual).
t.test(Y ~ X) là hàm R so sánh trung bình của Y (Engine_HP) giữa 2 nhóm của X.
##
## Welch Two Sample t-test
##
## data: engine_hp by transmission
## t = -1.6914, df = 999985, p-value = 0.09077
## alternative hypothesis: true difference in means between group Automatic and group Manual is not equal to 0
## 95 percent confidence interval:
## -0.68363674 0.05029087
## sample estimates:
## mean in group Automatic mean in group Manual
## 235.5060 235.8227
Kiểm định T-test giữa hai loại hộp số (Automatic/Manual) cho p-value > 0.05, không có bằng chứng về sự khác biệt ý nghĩa thống kê của engine_hp giữa hai nhóm này. Điều này cho thấy hộp số không quyết định hiệu suất động cơ và việc lựa chọn số tự động hay số sàn chủ yếu là quyết định trải nghiệm, không liên quan đến sức mạnh xe.
Hàm table(x, y) là một hàm cơ sở của R. Nó nhận hai (hoặc nhiều) vector factor làm đầu vào. Sau đó, tạo ra một đối tượng kiểu table trong đó các hàng được xác định bởi các cấp độ của vector đầu tiên (power_segment) và các cột được xác định bởi các cấp độ của vector thứ hai (fuel_type).
contingency_table_count <- table(
df_clean$power_segment, df_clean$fuel_type)
names(dimnames(contingency_table_count)) <- c("Phân khúc động cơ", "Nhóm nhiên liệu")
print(contingency_table_count)## Nhóm nhiên liệu
## Phân khúc động cơ Diesel Electric Gasoline
## Low 62272 62102 62115
## Medium 142056 141106 141822
## High 116125 156389 116013
Bảng tần suất này cho thấy ở hai phân khúc phổ thông và tầm trung (Low, Medium), số lượng xe phân bố rất cân bằng giữa ba loại nhiên liệu. Thị trường các dòng xe này cạnh tranh ngang ngửa, mỗi loại đều chiếm khoảng 62.000 xe/nhóm.
Điểm nổi bật xuất hiện ở phân khúc High: xe điện (Electric) vượt trội về số lượng, nhiều hơn khoảng 35% so với Diesel và Gasoline. Điều này lý giải vì sao xe điện có engine_hp và giá trung bình cao nhất – không phải mọi xe điện đều đắt, mà do phần lớn xe điện hiện nay định vị ở phân khúc động cơ lớn, vốn có giá trị và hiệu suất cao nhất thị trường.”
analysis_age_price_hp <- df_clean |>
group_by(age_group,fuel_type) |>
summarise(
avg_price = mean(price, na.rm = TRUE),
avg_hp = mean(engine_hp, na.rm = TRUE),
car_count = n() ) |>
arrange(age_group, fuel_type)
print(analysis_age_price_hp)## # A tibble: 12 × 5
## # Groups: age_group [4]
## age_group fuel_type avg_price avg_hp car_count
## <fct> <fct> <dbl> <dbl> <int>
## 1 New Diesel 37123. 232. 33852
## 2 New Electric 39142. 245. 37958
## 3 New Gasoline 36950. 231. 33866
## 4 Normal Diesel 26128. 230. 95142
## 5 Normal Electric 27875. 244. 106156
## 6 Normal Gasoline 26151. 231. 94516
## 7 Old Diesel 15882. 231. 140772
## 8 Old Electric 17140. 244. 158222
## 9 Old Gasoline 15891. 231. 140775
## 10 Very old Diesel 7463. 230. 50687
## 11 Very old Electric 8326. 245. 57261
## 12 Very old Gasoline 7462. 231. 50793
Bảng này cho thấy giá xe trung bình giảm rõ rệt khi tuổi xe tăng, bất kể loại nhiên liệu, phản ánh tác động mạnh của khấu hao đến giá trị xe. Ví dụ, nhóm “New” (mới) có giá trung bình khoảng 37.000 USD, trong khi xe “Very old” chỉ còn hơn 7.000 USD, giảm hơn 80% giá trị. Điều này khẳng định tuổi thọ là một trong những yếu tố mạnh nhất quyết định giá xe trên thị trường.
Ở mọi nhóm tuổi, xe điện (Electric) đều có giá trung bình cao hơn xăng (Gasoline) và dầu (Diesel). Tuy nhiên, khi phân tích tiếp chỉ số price/hp (giá trên một đơn vị mã lực), sự khác biệt này mất ý nghĩa – lý do chủ yếu giá xe điện cao là nhờ engine_hp trung bình cao hơn, chứ không phải do công nghệ điện đắt đỏ hơn.
Kết luận: Giá trị xe giảm chủ yếu do khấu hao và loại động cơ, trong khi chênh lệch giá theo loại nhiên liệu phần lớn là hệ quả của sự khác biệt về công suất (engine_hp) giữa các dòng sản phẩm.
Sử dụng dplyr để phân nhóm (group_by) data frame df_clean dựa trên cột transmission (hộp số),fuel_type(nhiên liệu), power_segment (phân khúc động cơ). Sau đó, nó dùng summarise() để tính toán ba chỉ số thống kê mô tả cho cột mileage_km (số km đã đi) bên trong mỗi nhóm: giá trị trung bình (mean), độ lệch chuẩn (sd), và số lượng (n).
Mức độ sử dụng xe trung bình theo nhiên liệu
analysis_mileage_fuel <- df_clean |>
group_by(fuel_type) |>
summarise(
avg_mileage = mean(mileage_km, na.rm = TRUE),
std_dev_mileage = sd(mileage_km, na.rm = TRUE),
n = n()) |>
arrange(desc(avg_mileage))
print(analysis_mileage_fuel)## # A tibble: 3 × 4
## fuel_type avg_mileage std_dev_mileage n
## <fct> <dbl> <dbl> <int>
## 1 Electric 70113. 44849. 359597
## 2 Gasoline 69956. 44811. 319950
## 3 Diesel 69930. 44714. 320453
Mức độ sử dụng xe trung bình theo hộp số
analysis_mileage_trans <- df_clean |>
group_by(transmission) |>
summarise(
avg_mileage_km = mean(mileage_km, na.rm = TRUE),
std_dev_mileage_km = sd(mileage_km, na.rm = TRUE),
n = n() ) |>
arrange(desc(avg_mileage_km))
print(analysis_mileage_trans)## # A tibble: 2 × 4
## transmission avg_mileage_km std_dev_mileage_km n
## <chr> <dbl> <dbl> <int>
## 1 Automatic 70048. 44803. 500263
## 2 Manual 69960. 44784. 499737
Mức độ sử dụng xe trung bình theo phân khúc động cơ
analysis_mileage_segment <- df_clean |> group_by(power_segment) |>
summarise(
avg_mileage_km = mean(mileage_km, na.rm = TRUE),
std_dev_mileage_km = sd(mileage_km, na.rm = TRUE),
n = n() ) |>
arrange(power_segment)
print(analysis_mileage_segment)## # A tibble: 3 × 4
## power_segment avg_mileage_km std_dev_mileage_km n
## <ord> <dbl> <dbl> <int>
## 1 Low 69914. 44777. 186489
## 2 Medium 70062. 44767. 424984
## 3 High 69984. 44830. 388527
Kết luận: Mức độ sử dụng trung bình (số km đã đi) gần như không khác biệt giữa các nhóm nhiên liệu, hộp số và phân khúc mã lực, cho thấy các dòng xe mới đều đang được sử dụng với cường độ tương đương nhau bất kể công nghệ.
So sánh hiệu suất giá động cơ theo tuổi xe và phân khúc kỹ thuật
analysis_perf_by_group <- df_clean |>
group_by(age_group, fuel_type, power_segment) |>
summarise(
avg_price_per_hp = mean(price_per_engine, na.rm = TRUE),
avg_mileage = mean(mileage_km, na.rm = TRUE),
avg_hp = mean(engine_hp, na.rm = TRUE),
n = n() )
print(analysis_perf_by_group)## # A tibble: 36 × 7
## # Groups: age_group, fuel_type [12]
## age_group fuel_type power_segment avg_price_per_hp avg_mileage avg_hp n
## <fct> <fct> <ord> <dbl> <dbl> <dbl> <int>
## 1 New Diesel Low 193. 10205. 125. 6619
## 2 New Diesel Medium 158. 10398. 194. 14767
## 3 New Diesel High 157. 10248. 333. 12466
## 4 New Electric Low 193. 10375. 126. 6516
## 5 New Electric Medium 158. 10293. 193. 14861
## 6 New Electric High 157. 10354. 338. 16581
## 7 New Gasoline Low 194. 10314. 125. 6473
## 8 New Gasoline Medium 158. 10304. 193. 15140
## 9 New Gasoline High 156. 10388. 333. 12253
## 10 Normal Diesel Low 127. 43811. 125. 18545
## # ℹ 26 more rows
Phân tích chi tiết cho thấy tuổi xe là yếu tố ảnh hưởng mạnh nhất đến giá trị còn lại: giá xe, bất kể loại hoặc phân khúc động cơ, đều giảm dần khi tuổi xe tăng; chênh lệch bình quân từ hơn 37.000 USD (xe mới) xuống chỉ còn khoảng 7.500 USD (very old).
Ở từng nhóm tuổi, các loại xe - dù là điện, xăng, dầu; động cơ mạnh hay yếu - đều có mức độ sử dụng trung bình (avg_mileage) gần tương đương, phản ánh thói quen sử dụng xe không phụ thuộc nhóm kỹ thuật mà chủ yếu do mục đích di chuyển.
Đồng thời, hiệu suất giá trên mã lực (avg_price_per_hp) thấp nhất ở xe mới/hạng động cơ mạnh - nghĩa là để sở hữu một đơn vị công suất cao ở xe mới, người dùng trả tương đối ít tiền so với xe cũ hoặc động cơ yếu. Điều này giải thích tại sao xe điện (công suất lớn) luôn nổi bật về giá trung bình: không phải bản chất công nghệ, mà do sản phẩm chủ yếu nằm ở nhóm động cơ cao cấp, mới – nơi hiệu suất “giá/mã lực” là tối ưu nhất.
ggplot(df_clean, aes(x = fuel_type, y = engine_hp, fill = fuel_type)) +
geom_violin(trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white", alpha = 0.5) +
labs(
title = "Phân phối mã lực (Violin) theo nhóm nhiên liệu",
x = "Nhóm nhiên liệu",
y = "Mã lực (Engine_HP)") +
theme_minimal() +
theme(legend.position = "none")Phần “phình” rộng nhất và hộp boxplot của xe “Electric” (Điện - màu xanh lá) nằm ở vị trí cao hơn so với hai nhóm còn lại, khẳng định chúng được định vị ở phân khúc hiệu suất cao hơn.
Phân phối của “Diesel” (màu đỏ) và “Gasoline” (màu xanh dương) gần như giống nhau về hình dạng, vị trí trung vị, và độ phân tán. Điều này cho thấy chúng là đối thủ cạnh tranh trực tiếp, nhắm vào cùng một phân khúc hiệu suất động cơ.
ggplot(df_clean, aes(x = transmission, y = engine_hp, fill = transmission)) +
geom_violin(trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white", alpha = 0.5) +
labs(
title = "Phân phối mã lực theo Hộp số",
x = "Loại Hộp số",
y = "Mã lực (engine_hp)") +
theme_minimal() +
theme(legend.position = "none")Biểu đồ cho thấy cả hai phân phối (“Automatic” - màu đỏ và “Manual” - màu xanh) đều gần như giống nhau, chúng có cùng mức trung vị (khoảng 215 hp), cùng độ phân tán, và cùng hình dạng. Điều này chứng minh rằng việc khách hàng chọn xe số tự động hay số sàn là một quyết định về sở thích lái xe, chứ không phải là một quyết định về hiệu suất động cơ. Thị trường cung cấp đầy đủ các tùy chọn, từ xe phổ thông mã lực thấp đến xe thể thao mã lực cao, cho cả hai loại hộp số.
ggplot(df_clean, aes(x = vehicle_age,
y = price_per_engine, color = fuel_type)) +
geom_point(alpha = 0.4) +
geom_smooth(method = 'lm', se = FALSE) +
labs(title = 'Hiệu suất giá theo tuổi xe và nhóm nhiên liệu', x = 'Tuổi xe', y = 'Giá/mã lực') +
theme_classic()Có một xu hướng giảm đều và rất mạnh (đường dốc xuống). Điều này cho thấy giá trị của mỗi mã lực giảm đi một cách nhất quán khi tuổi xe tăng lên.
Cả ba đường xu hướng cho đều chồng lên nhau, cho thấy khi đã kiểm soát theo tuổi xe, thị trường định giá 1 mã lực là như nhau bất kể loại nhiên liệu. Cả ba đều mất giá trị theo cùng một tốc độ chính xác.
ggplot(df_clean, aes(x = engine_hp, y = price, color = transmission)) +
geom_point(alpha = 0.4) +
geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
scale_y_log10(labels = scales::dollar) +
labs( title = "Giá vs mã lực, phân biệt theo hộp số",
x = "Mã lực",
y = "Giá bán",
color = "Hộp số") + theme_bw()Mối quan hệ thuận giữa giá và mã lực, đường xu hướng dốc lên. Điều này nghĩa là xe có mã lực càng cao thì giá bán trung bình càng tăng. Cả hai đám mây dữ liệu đều trộn lẫn với nhau và hai đường xu hướng chồng lên nhau. Điều này chứng minh rằng, ở cùng một mức mã lực, giá của xe số tự động và số sàn là hoàn toàn như nhau.
ggplot(df_clean,
aes(x = engine_hp, y = price, size = vehicle_age, color = fuel_type)) +
geom_point(alpha = 0.3) +
scale_y_log10(labels = scales::dollar) +
labs(
title = "Biểu đồ Bong bóng: giá, mã lực, tuổi xe và nhiên liệu",
subtitle = "Kích thước bong bóng = tuổi xe (vehicle_age)",
x = "Mã lực ",
y = "Giá bán ",
color = "Nhóm nhiên liệu",
size = "Tuổi xe" )+
theme_light()
Đây là một biểu đồ bong bóng trực quan hóa 4 biến dữ liệu cùng một lúc
để thể hiện các mối quan hệ đa chiều:
Mã lực vs giá bán: có mối tương quan thuận rõ rệt, đám mây dữ liệu có xu hướng đi lên từ trái sang phải, cho thấy xe mã lực càng cao thì giá bán trung bình càng cao.
Tuổi xe vs giá bán: Có mối tương quan nghịch, thể hiện sự khấu hao. Các bong bóng lớn nhất (xe cũ nhất) gần như chỉ tập trung ở nửa dưới của biểu đồ (giá thấp). Trong khi đó, các xe có giá cao hầu hết là các bong bóng rất nhỏ (xe mới).
Cả ba màu (Đỏ - Diesel, Xanh lá - Electric, Xanh dương - Gasoline) đều xuất hiện xen kẽ và trộn lẫn trên toàn bộ dải phân phối. Cả ba loại nhiên liệu đều cạnh tranh trực tiếp và có sẵn ở mọi phân khúc hiệu suất và giá cả.
ggplot(df_clean, aes(x = vehicle_age, y = engine_hp)) +
geom_point(aes(color = body_type), alpha = 0.5, size = 2) +
geom_smooth(method = "lm", color = "black", se = FALSE, linetype = "dashed") +
labs(
title = "Mối quan hệ giữa tuổi xe và mã lực",
x = "Tuổi xe ",
y = "Mã lực",
color = "Kiểu dáng"
) +
theme_light()
Biểu đồ cho thấy sự thiếu tương quan tuyến tính giữa tuổi xe và mã lực.
Các điểm dữ liệu không tạo thành một xu hướng dốc lên hay dốc xuống, mà
thay vào đó tạo thành các “đám mây” thẳng đứng ở mọi mốc tuổi. Đường
gạch ngang (đại diện cho mã lực trung bình) cho thấy ở bất kỳ độ tuổi
nào, luôn có một lượng lớn xe nằm trên và dưới mức trung bình, khẳng
định độ phân tán của mã lực là rất cao trong toàn bộ thị trường.
ggplot(df_clean, aes(x = reorder(body_type, engine_hp, FUN = median), y = engine_hp)) +
geom_boxplot(aes(fill = body_type), alpha = 0.7, outlier.shape = NA) +
geom_jitter(width = 0.15, alpha = 0.2, size = 1, color = "grey") +
labs(
title = "Phân phối mã lực theo kiểu dáng xe",
x = "Kiểu dáng xe",
y = "Mã lực" ) +
theme_minimal() +
theme(legend.position = "none")
Biểu đồ hộp kết hợp với biểu đồ phân tán này trực quan hóa sự phân phối
của engine_hp (mã lực) cho từng body_type.
Có một sự phân cấp rõ ràng, “Hatchback” có mã lực trung vị thấp nhất (khoảng 150 hp), đại diện cho các xe phổ thông. Ngược lại, “Coupe” và “Wagon” có mã lực trung vị cao nhất (khoảng 280-300 hp), đại diện cho các dòng xe hiệu suất cao.
“Hatchback”, “Minivan”, và “Pickup Truck” có các hộp rất hẹp, cho thấy mã lực của các xe trong nhóm này rất đồng đều và tập trung. Ngược lại, “Sedan”, “SUV”, và “Coupe” có các hộp rất rộng, chỉ ra rằng có sự đa dạng rất lớn về mã lực ngay cả trong 50% số xe tiêu biểu.
ggplot(df_clean, aes(x = engine_hp, y = price)) +
geom_point(aes(color = df_clean$engine_hp), alpha = 0.6, size = 2) +
scale_color_gradient(low = "blue", high = "yellow") +
geom_smooth(method = "lm", color = "black", formula = y ~ x) +
scale_y_continuous(labels = scales::dollar) +
labs(
title = "Mã lực vs. Giá",
x = "Mã lực",
y = "Giá bán ",
color = "Tuổi xe") +
theme_bw()Biểu đồ phân tán này trực quan hóa một mối quan hệ đa biến phức tạp giữa mã lực, giá bán và tuổi xe. Đường xu hướng (dấu gạch đen) và “đám mây” điểm dữ liệu đi lên từ trái sang phải khẳng định một mối tương quan thuận giữa mã lực và giá bán. Tuy nhiên, đám mây dữ liệu này không phải là một đường thẳng hẹp, cho thấy phương sai không đồng nhất. Điều này có nghĩa là, ở mức mã lực thấp (dưới 200 hp), giá bán rất dễ dự đoán; nhưng ở mức mã lực cao (trên 400 hp), giá bán trở nên cực kỳ biến động. Biến tuổi xe, chính là yếu tố giải thích cho sự biến động này, ta thấy rõ các điểm dữ liệu được phân tầng theo màu: ở bất kỳ mức mã lực nào, các xe mới (màu xanh đậm) luôn nằm ở phía trên (giá cao), trong khi các xe cũ (màu vàng) luôn nằm ở phía dưới (giá thấp).
ggplot(df_clean, aes(x = body_type, y = mileage_km)) +
geom_boxplot(aes(fill = fuel_type)) +
coord_flip() +
scale_y_continuous(labels = scales::comma) +
labs(
title = "Phân phối quãng đường theo kiểu dáng và nhiên liệu",
x = "Kiểu dáng xe",
y = "Số km đã đi",
fill = "Loại nhiên liệu") +
theme_minimal()Biểu đồ hộp phân nhóm này so sánh sự phân phối của số km đã đi giữa ba loại nhiên liệu bên trong từng kiểu dáng xe. Phát hiện sự tương đồng giữa các phân phối. Trong bất kỳ kiểu dáng xe nào, cả ba hộp gần như chồng lên nhau. Điều này có nghĩa là cả ba nhóm nhiên liệu đều có giá trị trung vị (đường kẻ đen ở giữa) và khoảng phân vị gần như giống nhau. Điều này chỉ ra rằng loại nhiên liệu không phải là một yếu tố ảnh hưởng mạnh đến số dặm đã đi. Nó phá vỡ giả định rằng xe điện chỉ được dùng để đi trong thành phố hoặc có mức sử dụng thấp do lo ngại về phạm vi hoạt động. Thay vào đó, biểu đồ cho thấy người tiêu dùng đang sử dụng xe điện với cùng một cường độ như xe xăng/dầu truyền thống.
ggplot(df_clean, aes(x = transmission, y = price, fill = transmission)) +
geom_boxplot() +
facet_wrap(~ fuel_type) +
scale_y_log10(labels = scales::dollar) +
labs(
title = "Boxplot Giá: Hộp số ",
x = "Hộp số",
y = "Giá bán ") +
theme_light() + theme(legend.position = "none")Biểu đồ hộp này cho thấy:
Trong cả ba nhóm nhiên liệu (Diesel, Electric, Gasoline), giá của xe Automatic và Manual là giống nhau.
Xe điện có giá trung vị cao hơn, các hộp của Electric nằm cao hơn một chút so với Diesel và Gasoline.
ggplot(df_clean, aes(x = engine_hp, y = vehicle_age)) +
geom_point(aes(color = price, size = mileage_km), alpha = 0.5) +
scale_color_gradient(low = "green", high = "red", labels = scales::dollar) +
scale_size_continuous(range = c(1, 10), labels = scales::comma) +
labs(
title = "Phân tích 4 biến: HP, Age, Price, Mileage_km",
subtitle = "X=Mã lực, Y=Tuổi, Màu=Giá, Kích thước=Số km",
x = "Mã lực",
y = "Tuổi xe",
color = "Giá ",
size = "Số km ") +
theme_minimal()Biểu đồ bong bóng 4 chiều, trực quan hóa đồng thời bốn biến số, phát hiện sự phân tầng rõ rệt của dữ liệu. Mã lực và tuổi xe không cho thấy mối tương quan rõ ràng, vì các điểm dữ liệu lấp đầy gần như toàn bộ biểu đồ. Tuy nhiên, hai biến còn lại cho thấy các mối quan hệ rất mạnh:
Giá: Có một gradient màu rõ rệt từ dưới lên trên. Các xe ở tuổi xe thấp(xe mới) có giá cao, trong khi các xe có tuổi xe cao (xe cũ) thì giá thấp. Điều này khẳng định một mối tương quan nghịch giữa tuổi xe và giá.
Số km: Có một xu hướng rõ ràng là tuổi xe thấp thì số quãng đường ít và các xe tuổi cao thì quãng đường đi được nhiều. Điều này khẳng định một mối tương quan thuận mạnh giữa tuổi xe và quãng đường đi được.
Về mặt kinh tế, biểu đồ này là một “bản đồ nhiệt” về giá trị thị trường xe cũ, cho thấy sự giằng co giữa các yếu tố quyết định giá:
Phân khúc cao cấp: Nằm ở góc dưới cùng bên phải. Đây là những chiếc xe có giá trị cao, được định nghĩa là xe mới và mạnh (HP cao). Đây chính là phân khúc xe thể thao và xe sang.
Phân khúc phổ thông/Giá rẻ: Nằm ở góc trên cùng bên trái. Đây là những chiếc xe có giá trị thấp nhất, được định nghĩa là xe cũ (tuổi cao) và yếu (HP thấp).
Biểu đồ này trực quan hóa ba yếu tố khấu hao chính. Giá trị của một chiếc xe bị kéo xuống bởi tuổi xe, số km, và bị kéo lên bởi mã lực. Một chiếc xe 20 tuổi có thể vẫn có giá trị nếu nó ở là xe mã lực mạnh (HP cao), nhưng giá trị đó vẫn thấp hơn nhiều so với một chiếc xe 1 tuổi có cùng mã lực.
summary_year_hp <- df_clean |>
filter(year > 1990) |>
group_by(year) |>
summarise(avg_hp = mean(engine_hp, na.rm = TRUE))
ggplot(summary_year_hp, aes(x = year, y = avg_hp)) +
geom_line(color = "navy", linewidth = 1) +
geom_point(color = "navy", size = 2) +
geom_smooth(method = "loess", color = "red", se = FALSE) +
labs(
title = "Mã lực trung bình theo năm sản xuất",
x = "Năm sản xuất",
y = "Mã lực trung bình") +
theme_bw()Biểu đồ đường này cho thấy xu hướng hai giai đoạn rất khác biệt:
Giai đoạn (2000 - 2005): Giai đoạn đầu (đường màu xanh đậm) cho thấy sự biến động cực kỳ mạnh. Bắt đầu ở mức đỉnh gần 280 hp vào năm 2000, sau đó sụt giảm nghiêm trọng xuống còn khoảng 225 hp chỉ một năm sau đó, rồi dao động mạnh trong vài năm tiếp theo.
Giai đoạn (Từ ~2008 - Hiện tại): đường xu hướng (màu đỏ) cho thấy mã lực trung bình đã ổn định một cách đáng kinh ngạc trong suốt 15-20 năm qua. Từ khoảng năm 2008 đến nay, mã lực trung bình gần như đi ngang, dao động rất ít quanh mức khoảng 235 hp.
summary_area <- df_clean |>
filter(year > 2000 & power_segment == "High") |>
count(year, fuel_type)
ggplot(summary_area, aes(x = year, y = n, fill = fuel_type)) +
geom_area(position = "stack", alpha = 0.8) +
labs(
title = "Số lượng xe High power theo thời gian",
subtitle = "Phân tách theo nhiên liệu",
x = "Năm sản xuất",
y = "Số lượng xe",
fill = "Nhóm nhiên liệu" ) +
scale_fill_brewer(palette = "Set2") +
theme_light()Biểu đồ cho thấy xe thuộc nhóm High Power tăng trưởng mạnh từ sau 2005, đạt đỉnh khoảng 2017-2018 rồi suy giảm rõ, trở về quy mô năm 2010. Xe điện (Electric) nổi bật với tốc độ chiếm lĩnh thị trường mã lực cao (high power) cực nhanh trong giai đoạn tăng trưởng này.
Cả ba nhóm nhiên liệu đều theo cùng một chu kỳ bùng nổ và thoái trào, cho thấy bản chất thị trường High power chịu tác động mạnh từ những yếu tố chung về sản xuất, tiêu thụ và chính sách thay vì chỉ phụ thuộc vào loại nhiên liệu cụ thể. Sự suy giảm sau 2018 có thể phản ánh giai đoạn điều chỉnh cung-cầu, quy định mới, hoặc sự thay đổi nhu cầu tiêu dùng hướng tới các loại xe tiết kiệm và bền vững hơn.
summary_table_hp <- df_clean |>
group_by(fuel_type, transmission) |>
summarise(avg_hp = mean(engine_hp, na.rm = TRUE))
ggplot(summary_table_hp, aes(x = fuel_type, y = transmission, fill = avg_hp)) +
geom_tile(color = "white", linewidth = 1) +
geom_text(aes(label = round(avg_hp, 0)), color = "black") +
labs(
title = "Heatmap: Mã lực trung bình",
subtitle = "Theo nhiên liệu và hộp số",
x = "Nhóm nhiên liệu",
y = "Hộp số",
fill = "HP TB" )+
scale_fill_gradient(low = "lightblue", high = "darkblue", labels = scales::comma) +
theme_minimal()Biểu đồ heatmap này trực quan hóa mã lực trung bình (HP) qua 6 tổ hợp của nhiên liệu và hộp số, và nó cho thấy:
Loại nhiên liệu là yếu tố chính: xe “Electric” (Điện) nổi bật với mã lực trung bình cao hơn hẳn (244-245 hp), được tô màu xanh đậm.
Loại hộp số (Manual vs. Automatic) gần như không ảnh hưởng đến mã lực, khi các giá trị trong cùng một cột nhiên liệu là gần như giống nhau.
df_heat <- df_clean |> group_by(power_segment, fuel_type) |> summarise(avg_price_per_engine = mean(price_per_engine, na.rm = TRUE))
ggplot(df_heat, aes(x = power_segment, y = fuel_type, fill = avg_price_per_engine)) +
geom_tile() +
labs(title = 'Heatmap hiệu suất giá động cơ theo nhóm kỹ thuật') +
scale_fill_gradient(low = '#F2F2F2', high = '#18A7B5')Biểu đồ này so sánh hiệu suất giá động cơ giữa các loại nhiên liệu và phân khúc động cơ:
Trong phân khúc Low (Thấp), cả ba loại nhiên liệu đều có hiệu suất giá như nhau.
Trong phân khúc High (Cao), xe electric (Điện) có hiệu suất giá tốt hơn so với Gasoline và Diesel.
Dòng 1-4: Đây là bước tiền xử lý. Code đếm (count) tần suất các hãng xe (make) và sắp xếp. Sau đó, slice(1:10) chọn ra 10 hãng xe phổ biến nhất, và pull(make) rút tên 10 hãng đó lưu vào một vector tên là top_10_makes.
Dòng 5-6: Tạo một data frame mới bằng cách lọc df_clean gốc, chỉ giữ lại những dòng mà make (hãng xe) có tên nằm trong vector top_10_makes đã tạo.
Dòng 7: Khởi tạo ggplot. Ánh xạ price vào trục Y, đặt make (hãng xe) lên trục X, nhưng sắp xếp lại thứ tự của các hãng dựa trên giá trung vị.
Dòng 8-9: geom_boxplot vẽ các biểu đồ hộp và tô màu theo hãng xe. coord_flip() xoay biểu đồ nằm ngang.
top_10_makes <- df_clean %>%
count(make, sort = TRUE) %>%
slice(1:10) %>%
pull(make)
df_top10 <- df_clean %>%
filter(make %in% top_10_makes)
ggplot(df_top10, aes(x = reorder(make, price, FUN = median), y = price)) +
geom_boxplot(aes(fill = make), outlier.shape = NA) +
coord_flip() +
scale_y_log10(labels = label_dollar(accuracy = 1))+
labs(
title = "Phân phối giá theo 10 hãng xe phổ biến nhất",
x = "Hãng xe ", y = "Giá bán ") +
theme(legend.position = "none") Biểu đồ minh họa bảng định vị giá theo thương hiệu, chia rõ 3 nhóm: phân khúc phổ thông (Kia, Nissan, Mazda, Subaru), phân khúc tầm trung (Ram, Chrysler, Acura), và phân khúc cao cấp (Tesla, Land Rover, Porsche). Giá trung vị của từng hãng phản ánh đúng chiến lược định vị thương hiệu trên thị trường.
Các hãng như Kia, Nissan có dải giá hẹp, tập trung vào thị trường phổ thông với giá hợp lý. Ngược lại, các hãng như Porsche, Land Rover có dải giá lớn trải rộng, phản ánh danh mục sản phẩm đa dạng từ xe cơ bản đến siêu xe thể thao, giúp thương hiệu tiếp cận nhiều phân khúc khách hàng. Tesla cũng điển hình cho chiến lược đa dải giá khi vừa có Model 3 (giá vừa phải) vừa có Model X/S Plaid (giá rất cao).
Độ rộng của boxplot từng hãng thể hiện mức biến động giá trong từng thương hiệu; dải ngắn cho thấy định vị tập trung, dải rộng phản ánh danh mục và phân khúc khách hàng đa dạng.
Phân tích dữ liệu thị trường xe cho thấy giá trị của mỗi chiếc xe chịu tác động mạnh mẽ nhất từ các đặc tính kỹ thuật (đặc biệt là công suất động cơ – engine_hp), tuổi xe và phân khúc thương hiệu. Mã lực càng lớn, xe càng mới thì giá bán trung bình càng cao, trong khi loại hộp số (số tự động hay số sàn) chỉ có ý nghĩa với trải nghiệm lái mà không ảnh hưởng đáng kể đến giá trị sản phẩm.
Ở nhóm xe điện, mức giá trung bình cao chủ yếu xuất phát từ việc các mẫu xe này tập trung ở phân khúc động cơ mạnh và xe mới, không phải bản thân công nghệ điện luôn đắt đỏ. Khi xét theo chỉ số hiệu suất giá/mã lực, sự khác biệt theo nhiên liệu gần như mất ý nghĩa nếu kiểm soát đồng thời động cơ và tuổi xe.
Hành vi sử dụng xe của người dùng (quãng đường di chuyển trung bình, mục tiêu sử dụng) gần như không khác biệt giữa các nhóm nhiên liệu, hộp số hoặc phân khúc động cơ, phản ánh rằng lựa chọn sản phẩm hiện đại của người tiêu dùng đi theo xu hướng đa dạng hóa nhưng vẫn ưu tiên các yếu tố thực dụng như động cơ mạnh, thương hiệu uy tín và chi phí hợp lý.
Các biểu đồ thời gian và cơ cấu thị phần cũng cho thấy sự bùng nổ các dòng xe công suất lớn, phát triển nhanh nhất ở nhóm xe điện trong giai đoạn mới đây, đồng thời khẳng định xu hướng đa dạng hóa danh mục sản phẩm ở mọi thương hiệu – từ các mẫu entry-level đến dòng xe cao cấp. Thị trường xe hiện đại vẫn còn nhiều tiềm năng, đặc biệt với phân khúc xe “xanh”, tuy nhiên giá trị sản phẩm thực vẫn được quyết định mạnh mẽ nhất bởi những yếu tố nền tảng: động cơ, tuổi đời, chiến lược thương hiệu và khả năng đáp ứng các nhu cầu sử dụng đa dạng của khách hàng hiện đại.
Chương này tập trung vào việc đánh giá toàn diện hiệu quả hoạt động kinh doanh và sức khỏe tài chính của công ty cổ phần An Phát Xanh thông qua việc phân tích bộ dữ liệu báo cáo tài chính trong giai đoạn 2015–2024. Bộ dữ liệu được thu thập từ các báo cáo thường niên công khai trên website doanh nghiệp bao gồm thông tin chi tiết về doanh thu, chi phí, lợi nhuận, cùng các khoản tài sản và nghĩa vụ tài chính quan trọng. Trên cơ sở các chỉ tiêu cốt lõi đã lựa chọn, việc sử dụng công cụ xử lý, phân tích và trực quan hóa bằng ngôn ngữ lập trình R không chỉ giúp quy trình phân tích trở nên minh bạch và chính xác mà còn cung cấp cái nhìn tổng thể, khách quan về năng lực vận hành cũng như tiềm năng phát triển của doanh nghiệp trong cả ngắn hạn và dài hạn. Kết quả phân tích sẽ là nền tảng để đề xuất các giải pháp quản trị và định hướng phát triển phù hợp, hỗ trợ việc ra quyết định của ban lãnh đạo và nhà đầu tư.
Để thực hiện đề tài này, các phương pháp nghiên cứu sau được sử dụng:
Phương pháp thu thập dữ liệu: Thu thập dữ liệu thứ cấp là BCTC của CTCP An Phát Xanh giai đoạn 2015-2024.
Phương pháp xử lý dữ liệu: Sử dụng ngôn ngữ R, đặc biệt là bộ thư viện Tidyverse (bao gồm dplyr, tidyr, stringr) để làm sạch, chuẩn hóa dữ liệu.
Phương pháp phân tích thống kê: Sử dụng các kỹ thuật thống kê mô tả (trung bình, trung vị, độ lệch chuẩn), phân tích xu hướng (tăng trưởng YoY) và phân tích tương quan để lượng hóa các mối quan hệ tài chính.
Phương pháp trực quan hóa: Sử dụng thư viện ggplot2 và corrplot để trực quan hóa các xu hướng, cơ cấu và mối tương quan, giúp việc diễn giải kết quả trở nên trực quan và dễ hiểu.
Đối tượng nghiên cứu: Tình hình tài chính của CTCP An Phát Xanh (AAA).
Phạm vi nghiên cứu:
Không gian: Dữ liệu BCTC hợp nhất của CTCP An Phát Xanh.
Thời gian: 10 năm, từ năm 2015 đến năm 2024.
Ngoài phần mở đầu và kết luận, nội dung chính của chương này tập trung vào việc phân tích BCTC, bao gồm các phần:
2.1. Giới thiệu và nạp dữ liệu
2.2. Xử lý dữ liệu thô và mã hóa dữ liệu
2.3. Phân tích hiệu quả hoạt động kinh doanh
2.4. Phân tích mối quan hệ giữa các chỉ tiêu kế toán
Nguồn dữ liệu được lấy từ trang web công bố thông tin của công ty cổ phần Nhựa và Môi trường Xanh An Phát (AAA) – nơi đăng tải các báo cáo tài chính định kỳ theo chuẩn mực kế toán Việt Nam.
Các báo cáo này thường có định dạng PDF, chứa các bảng biểu trình bày chi tiết tình hình tài chính qua bốn phần chính:
Bảng cân đối kế toán (BCĐKT)
Báo cáo kết quả hoạt động kinh doanh (KQHDKD)
Báo cáo lưu chuyển tiền tệ (LCTT)
Thuyết minh báo cáo tài chính
Đặc trưng của các file PDF này là định dạng không có cấu trúc dữ liệu rõ ràng, khiến việc trích xuất bằng các công cụ truyền thống trở nên khó khăn.
Để khắc phục hạn chế của PDF, nghiên cứu sử dụng AISTUDIO để tự động nhận diện cấu trúc bảng và chuyển đổi sang Excel.
Các bước thực hiện gồm:
Tải file PDF báo cáo tài chính gốc từ website của AAA.
Dùng mô hình ngôn ngữ AI (GPT) để phân tích, trích xuất các bảng dữ liệu định lượng và danh mục mục tiêu.
File đầu ra được đặt tên là df.bctc.xlsx, đóng vai trò là nguồn dữ liệu trung gian cho toàn bộ quá trình xử lý tiếp theo.
Sau khi hoàn tất bước chuyển đổi, ta khởi tạo môi trường làm việc trong RStudio với các thư viện cần thiết. Đây là bước nền tảng kỹ thuật quan trọng, đảm bảo các hàm chức năng chuyên dụng có sẵn để sử dụng.
Đọc dữ liệu từ file Excel (.xlsx, .xls)
Gói chuyên dụng cho việc thao tác và xử lý dữ liệu
Bao gồm các gói cực kỳ quan trọng như readr (để đọc dữ liệu), dplyr (để xử lý dữ liệu), tidyr (để làm gọn dữ liệu), và ggplot2 (để trực quan hóa).
Nạp gói scales để truy cập các hàm định dạng số.
ggplot2 là gói được sử dụng để trực quan hóa dữ liệu tạo ra các biểu đồ, đồ thị.
Khai báo biến file để lưu đường dẫn tuyệt đối tới tệp Excel chứa dữ liệu.
Hàm read_excel() được gọi từ thư viện readxl để đọc toàn bộ nội dung của tệp Excel và lưu trữ vào biến df_bctc dưới dạng data frame (bảng dữ liệu).
## [1] 10
## [1] 134
## [1] 10 134
Hàm nrow() có chức năng đếm số lượng quan sát hoặc bản ghi trong tập dữ liệu. Kết quả cho biết bộ dữ liệu đang phân tích có tổng cộng 10 quan sát, nghĩa là có mười dòng dữ liệu, mỗi dòng tương ứng với thông tin của một năm.
Tương tự, hàm ncol() dùng để đếm số lượng biến hoặc đặc trưng được ghi nhận cho mỗi quan sát. Kết quả cho thấy bộ dữ liệu có 134 cột. Trong dữ liệu này, 134 cột bao gồm cột “Năm” và 133 chỉ tiêu tài chính khác nhau (ví dụ: “TÀI SẢN NGẮN HẠN”, “Doanh thu thuần…”, “Lợi nhuận sau thuế…”, v.v.).
dim() là kiểm tra kích thước ban đầu, giúp xác nhận rằng dữ liệu đã được đọc đầy đủ vào bộ nhớ. Kết quả trùng khớp với kích thước mong đợi (ở đây là 10 dòng và 134 cột), chứng tỏ quá trình nạp dữ liệu từ tệp Excel đã thành công.
Kết quả này cung cấp cái nhìn định lượng đầu tiên về kích thước mẫu và độ phức tạp của bộ dữ liệu. Số lượng 134 biến cho thấy dữ liệu có tính đa chiều.
Lệnh head() được sử dụng để hiển thị 6 dòng đầu tiên của bộ dữ liệu. Từ những dòng đầu tiên, ta có thể nhận thấy ngay các giá trị là những con số rất lớn (hàng nghìn tỷ), xác nhận đây là BCTC với đơn vị tính là VNĐ.
## tibble [10 × 134] (S3: tbl_df/tbl/data.frame)
## $ Năm : num [1:10] 2015 2016 2017 2018 2019 ...
## $ TÀI SẢN NGẮN HẠN : num [1:10] 1.07e+12 1.36e+12 2.14e+12 3.99e+12 4.97e+12 ...
## $ Tiền và các khoản tương đương tiền : num [1:10] 4.70e+11 4.07e+11 5.10e+11 6.45e+11 2.92e+11 ...
## $ Tiền : num [1:10] 2.42e+11 1.21e+11 1.21e+11 2.18e+11 2.33e+11 ...
## $ Các khoản tương đương tiền : num [1:10] 2.28e+11 2.86e+11 3.89e+11 4.28e+11 5.83e+10 ...
## $ Đầu tư tài chính ngắn hạn : num [1:10] NA NA 5.00e+10 7.21e+11 1.25e+12 ...
## $ Đầu tư nắm giữ đến ngày đáo hạn : num [1:10] NA NA 5.00e+10 7.21e+11 1.19e+12 ...
## $ Các khoản phải thu ngắn hạn : num [1:10] 3.64e+11 4.56e+11 9.61e+11 1.61e+12 2.08e+12 ...
## $ Phải thu ngắn hạn của khách hàng : num [1:10] 1.03e+11 2.21e+11 4.18e+11 6.92e+11 7.27e+11 ...
## $ Trả trước cho người bán ngắn hạn : num [1:10] 1.69e+11 1.84e+11 3.26e+11 5.32e+11 6.36e+11 ...
## $ Phải thu về cho vay ngắn hạn : num [1:10] NA NA 1.30e+11 2.94e+11 5.37e+11 ...
## $ Phải thu ngắn hạn khác : num [1:10] 9.10e+10 5.10e+10 8.83e+10 9.59e+10 1.80e+11 ...
## $ Dự phòng phải thu ngắn hạn khó đòi : num [1:10] -1.62e+08 -6.99e+08 NA NA NA ...
## $ Tổng hàng tồn kho : num [1:10] 2.14e+11 4.51e+11 5.37e+11 8.63e+11 1.22e+12 ...
## $ Hàng tồn kho : num [1:10] 2.14e+11 4.51e+11 5.37e+11 8.65e+11 1.22e+12 ...
## $ Dự phòng giảm giá hàng tồn kho : num [1:10] NA NA NA -2.75e+09 -3.52e+08 ...
## $ Tài sản ngắn hạn khác : num [1:10] 2.38e+10 4.88e+10 8.51e+10 1.47e+11 1.27e+11 ...
## $ Chi phí trả trước ngắn hạn : num [1:10] 1.47e+10 2.13e+10 1.89e+10 2.11e+10 2.83e+10 ...
## $ Thuế giá trị gia tăng được khấu trừ : num [1:10] 9.11e+09 2.75e+10 6.59e+10 1.24e+11 9.74e+10 ...
## $ Thuế và các khoản phải thu Nhà nước : num [1:10] NA NA 2.61e+08 2.71e+09 1.34e+09 ...
## $ TÀI SẢN DÀI HẠN : num [1:10] 8.83e+11 1.72e+12 2.43e+12 3.54e+12 3.02e+12 ...
## $ Các khoản phải thu dài hạn : num [1:10] NA NA NA 2.14e+10 9.64e+10 ...
## $ Phải thu về cho vay dài hạn : num [1:10] NA NA NA NA 7.57e+10 ...
## $ Phải thu dài hạn khác : num [1:10] NA NA NA 2.14e+10 2.07e+10 ...
## $ Tài sản cố định : num [1:10] 6.37e+11 1.43e+12 2.30e+12 2.20e+12 2.08e+12 ...
## $ Tài sản cố định hữu hình : num [1:10] 5.95e+11 1.34e+12 2.20e+12 2.11e+12 2.00e+12 ...
## $ Nguyên giá TSCĐ HH : num [1:10] 9.01e+11 1.70e+12 2.71e+12 2.86e+12 2.98e+12 ...
## $ Giá trị khấu hao lũy kế...28 : num [1:10] -3.06e+11 -3.65e+11 -5.04e+11 -7.45e+11 -9.83e+11 ...
## $ Tài sản cố định thuê tài chính : num [1:10] NA NA NA NA NA ...
## $ Nguyên giá TS cố định thuê tài chính : num [1:10] NA NA NA NA NA ...
## $ Giá trị hao mòn lũy kế...31 : num [1:10] NA NA NA NA NA ...
## $ Tài sản cố định vô hình : num [1:10] 4.12e+10 9.58e+10 9.65e+10 8.50e+10 8.20e+10 ...
## $ Nguyên giá TS cố định vô hình : num [1:10] 4.52e+10 1.01e+11 1.03e+11 9.49e+10 9.48e+10 ...
## $ Giá trị hao mòn lũy kế...34 : num [1:10] -4.05e+09 -5.04e+09 -6.93e+09 -9.91e+09 -1.29e+10 ...
## $ Bất động sản đầu tư : num [1:10] NA NA NA NA 2.23e+11 ...
## $ Nguyên giá bất động sản đầu tư : num [1:10] NA NA NA NA 2.29e+11 ...
## $ Giá trị khấu hao lũy kế...37 : num [1:10] NA NA NA NA -5.72e+09 ...
## $ Tài sản dở dang dài hạn : num [1:10] 1.91e+11 2.15e+11 9.81e+10 1.21e+12 2.94e+11 ...
## $ Chi phí xây dựng cơ bản dở dang : num [1:10] 1.91e+11 2.15e+11 9.81e+10 1.21e+12 2.94e+11 ...
## $ Đầu tư tài chính dài hạn : num [1:10] 4.26e+10 4.43e+10 NA 4.84e+10 1.24e+11 ...
## $ Đầu tư vào công ty liên kết : num [1:10] 4.26e+10 4.43e+10 NA NA 1.52e+10 ...
## $ Đầu tư vào đơn vị khác : num [1:10] NA NA NA 4.84e+10 1.08e+11 ...
## $ Tài sản dài hạn khác : num [1:10] 1.29e+10 2.24e+10 3.58e+10 6.32e+10 1.98e+11 ...
## $ Chi phí trả trước dài hạn : num [1:10] 1.29e+10 2.23e+10 3.56e+10 6.25e+10 1.98e+11 ...
## $ Tài sản thuế thu nhập hoãn lại : num [1:10] -359366 20321243 220148762 709491809 189900417 ...
## $ Lợi thế thương mại : num [1:10] NA NA NA NA NA ...
## $ TỔNG CỘNG TÀI SẢN : num [1:10] 1.95e+12 3.08e+12 4.58e+12 7.53e+12 7.99e+12 ...
## $ NỢ PHẢI TRẢ : num [1:10] 1.14e+12 2.12e+12 2.95e+12 4.55e+12 4.73e+12 ...
## $ Nợ ngắn hạn : num [1:10] 6.67e+11 1.14e+12 1.99e+12 3.21e+12 3.24e+12 ...
## $ Phải trả người bán ngắn hạn : num [1:10] 2.01e+11 3.04e+11 5.19e+11 6.23e+11 6.04e+11 ...
## $ Người mua trả tiền trước ngắn hạn : num [1:10] 1.23e+10 1.13e+10 1.71e+10 4.39e+10 9.87e+10 ...
## $ Thuế và các khoản phải nộp Nhà nước : num [1:10] 5.75e+09 6.95e+09 1.42e+10 1.41e+10 2.69e+10 ...
## $ Phải trả người lao động : num [1:10] 4.56e+09 9.18e+09 1.33e+10 1.96e+10 2.26e+10 ...
## $ Chi phí phải trả ngắn hạn : num [1:10] 3.86e+09 2.08e+09 6.42e+09 8.99e+09 3.65e+10 ...
## $ Doanh thu chưa thực hiện ngắn hạn : num [1:10] NA NA NA 4.53e+08 4.19e+10 ...
## $ Phải trả ngắn hạn khác : num [1:10] NA 5.71e+09 2.70e+09 3.29e+09 4.74e+09 ...
## $ Vay và nợ thuê tài chính ngắn hạn : num [1:10] 4.39e+11 8.01e+11 1.42e+12 2.49e+12 2.40e+12 ...
## $ Quỹ khen thưởng, phúc lợi : num [1:10] 9.59e+08 2.86e+07 2.63e+07 6.24e+08 7.83e+08 ...
## $ Nợ dài hạn : num [1:10] 4.68e+11 9.83e+11 9.60e+11 1.34e+12 1.50e+12 ...
## $ Doanh thu chưa thực hiện dài hạn : num [1:10] NA NA NA NA 7.74e+10 ...
## $ Phải trả dài hạn khác : num [1:10] NA NA NA NA 2.42e+10 ...
## $ Vay và nợ thuê tài chính dài hạn : num [1:10] 1.71e+11 9.83e+11 9.60e+11 1.34e+12 1.37e+12 ...
## $ Thuế thu nhập hoãn lại phải trả : num [1:10] NA NA 4.57e+08 9.28e+06 2.24e+10 ...
## $ Dự phòng phải trả dài hạn : num [1:10] NA NA NA NA NA ...
## $ Tổng Vốn chủ sở hữu : num [1:10] 8.19e+11 9.55e+11 1.62e+12 2.98e+12 3.26e+12 ...
## $ Vốn chủ sở hữu : num [1:10] 8.19e+11 9.55e+11 1.62e+12 2.98e+12 3.26e+12 ...
## $ Vốn góp của chủ sở hữu : num [1:10] 4.95e+11 5.70e+11 8.36e+11 1.71e+12 1.71e+12 ...
## $ Cổ phiếu phổ thông có quyền biểu quyết : num [1:10] 4.95e+11 5.70e+11 8.36e+11 1.71e+12 1.71e+12 ...
## $ Thặng dư vốn cổ phần : num [1:10] 1.47e+11 1.61e+11 1.98e+11 5.32e+11 5.32e+11 ...
## $ Vốn khác của chủ sở hữu : num [1:10] NA NA NA NA NA ...
## $ Chênh lệch tỷ giá hối đoái : num [1:10] 1.59e+09 2.05e+08 1.59e+08 -3.97e+07 -3.38e+08 ...
## $ Quỹ đầu tư phát triển : num [1:10] 3.60e+10 3.83e+10 4.57e+10 5.78e+10 6.73e+10 ...
## $ Quỹ khác thuộc vốn chủ sở hữu : num [1:10] 1.32e+10 1.32e+10 1.32e+10 1.32e+10 1.32e+10 ...
## $ Lợi nhuận sau thuế chưa phân phối : num [1:10] 1.16e+11 1.62e+11 2.84e+11 2.66e+11 6.03e+11 ...
## $ Lợi nhuận sau thuế chưa phân phối đến cuối năm trước : num [1:10] 7.64e+10 7.18e+10 9.01e+10 8.56e+10 1.42e+11 ...
## $ Lợi nhuận sau thuế chưa phân phối năm nay : num [1:10] 4.00e+10 9.01e+10 1.94e+11 1.80e+11 4.60e+11 ...
## $ Lợi ích cổ đông không kiểm soát : num [1:10] 9.92e+09 1.09e+10 2.48e+11 3.99e+11 3.28e+11 ...
## $ TỔNG CỘNG NGUỒN VỐN : num [1:10] 1.95e+12 3.08e+12 4.58e+12 7.53e+12 7.99e+12 ...
## $ Doanh thu bán hàng và cung cấp dịch vụ : num [1:10] 1.62e+12 2.15e+12 4.08e+12 8.02e+12 9.28e+12 ...
## $ Các khoản giảm trừ doanh thu : num [1:10] 1.50e+09 1.73e+09 7.16e+09 7.25e+09 -2.02e+10 ...
## $ Doanh thu thuần về bán hàng và cung cấp dịch vụ : num [1:10] 1.61e+12 2.14e+12 4.07e+12 8.01e+12 9.26e+12 ...
## $ Giá vốn hàng bán : num [1:10] 1.42e+12 1.84e+12 3.52e+12 7.34e+12 8.22e+12 ...
## $ Lợi nhuận gộp về bán hàng và cung cấp dịch vụ : num [1:10] 1.90e+11 3.07e+11 5.50e+11 6.73e+11 1.04e+12 ...
## $ Doanh thu hoạt động tài chính : num [1:10] 2.24e+10 3.02e+10 5.58e+10 6.15e+10 1.80e+11 ...
## $ Chi phí hoạt động tài chính : num [1:10] 5.00e+10 5.39e+10 9.51e+10 2.09e+11 2.68e+11 ...
## $ Trong đó: Chi phí lãi vay : num [1:10] 2.41e+10 2.73e+10 8.06e+10 1.26e+11 -2.25e+11 ...
## $ Lãi/(lỗ) trong công ty liên kết, liên doanh : num [1:10] 3.38e+09 1.75e+09 NA NA -5.66e+07 ...
## $ Chi phí bán hàng : num [1:10] 7.52e+10 5.69e+10 1.06e+11 1.57e+11 2.15e+11 ...
## $ Chi phí quản lý doanh nghiệp : num [1:10] 4.16e+10 6.26e+10 7.93e+10 1.24e+11 1.49e+11 ...
## $ Lợi nhuận thuần từ hoạt động kinh doanh : num [1:10] 4.88e+10 1.66e+11 3.26e+11 2.46e+11 5.90e+11 ...
## $ Thu nhập khác : num [1:10] 1.86e+09 8.08e+09 2.39e+09 1.12e+10 9.24e+09 ...
## $ Chi phí khác : num [1:10] 4.16e+06 7.04e+09 3.95e+08 2.91e+09 -2.25e+09 ...
## $ (Lỗ)/Lợi nhuận khác : num [1:10] 1.86e+09 1.04e+09 1.99e+09 8.30e+09 6.99e+09 ...
## $ Tổng lợi nhuận kế toán trước thuế : num [1:10] 5.06e+10 1.67e+11 3.28e+11 2.54e+11 5.97e+11 ...
## $ Chi phí thuế TNDN hiện hành : num [1:10] 1.00e+10 2.37e+10 6.44e+10 4.28e+10 -8.35e+10 ...
## $ (Chi phí)/ thu nhập thuế TNDN hoãn lại : num [1:10] 3.65e+07 -2.07e+07 2.57e+08 -9.37e+08 -2.29e+10 ...
## $ Lợi nhuận sau thuế thu nhập doanh nghiệp : num [1:10] 4.05e+10 1.43e+11 2.63e+11 2.12e+11 4.91e+11 ...
## $ Lợi nhuận sau thuế của công ty mẹ : num [1:10] 4.00e+10 1.42e+11 2.23e+11 1.80e+11 4.60e+11 ...
## $ (Lỗ)/ Lợi nhuận sau thuế của cổ đông không kiểm soát : num [1:10] 5.33e+08 9.40e+08 4.00e+10 3.19e+10 3.06e+10 ...
## [list output truncated]
Lệnh str() dùng để xem cấu trúc tổng quát của bộ dữ liệu. Kết quả hiển thị là một bảng dữ liệu có 10 quan sát và 134 biến.
Mỗi biến (cột) được liệt kê kèm theo kiểu dữ liệu và một vài giá trị mẫu.
## [1] "Năm"
## [2] "TÀI SẢN NGẮN HẠN"
## [3] "Tiền và các khoản tương đương tiền"
## [4] "Tiền"
## [5] "Các khoản tương đương tiền"
## [6] "Đầu tư tài chính ngắn hạn"
## [7] "Đầu tư nắm giữ đến ngày đáo hạn"
## [8] "Các khoản phải thu ngắn hạn"
## [9] "Phải thu ngắn hạn của khách hàng"
## [10] "Trả trước cho người bán ngắn hạn"
## [11] "Phải thu về cho vay ngắn hạn"
## [12] "Phải thu ngắn hạn khác"
## [13] "Dự phòng phải thu ngắn hạn khó đòi"
## [14] "Tổng hàng tồn kho"
## [15] "Hàng tồn kho"
## [16] "Dự phòng giảm giá hàng tồn kho"
## [17] "Tài sản ngắn hạn khác"
## [18] "Chi phí trả trước ngắn hạn"
## [19] "Thuế giá trị gia tăng được khấu trừ"
## [20] "Thuế và các khoản phải thu Nhà nước"
## [21] "TÀI SẢN DÀI HẠN"
## [22] "Các khoản phải thu dài hạn"
## [23] "Phải thu về cho vay dài hạn"
## [24] "Phải thu dài hạn khác"
## [25] "Tài sản cố định"
## [26] "Tài sản cố định hữu hình"
## [27] "Nguyên giá TSCĐ HH"
## [28] "Giá trị khấu hao lũy kế...28"
## [29] "Tài sản cố định thuê tài chính"
## [30] "Nguyên giá TS cố định thuê tài chính"
## [31] "Giá trị hao mòn lũy kế...31"
## [32] "Tài sản cố định vô hình"
## [33] "Nguyên giá TS cố định vô hình"
## [34] "Giá trị hao mòn lũy kế...34"
## [35] "Bất động sản đầu tư"
## [36] "Nguyên giá bất động sản đầu tư"
## [37] "Giá trị khấu hao lũy kế...37"
## [38] "Tài sản dở dang dài hạn"
## [39] "Chi phí xây dựng cơ bản dở dang"
## [40] "Đầu tư tài chính dài hạn"
## [41] "Đầu tư vào công ty liên kết"
## [42] "Đầu tư vào đơn vị khác"
## [43] "Tài sản dài hạn khác"
## [44] "Chi phí trả trước dài hạn"
## [45] "Tài sản thuế thu nhập hoãn lại"
## [46] "Lợi thế thương mại"
## [47] "TỔNG CỘNG TÀI SẢN"
## [48] "NỢ PHẢI TRẢ"
## [49] "Nợ ngắn hạn"
## [50] "Phải trả người bán ngắn hạn"
## [51] "Người mua trả tiền trước ngắn hạn"
## [52] "Thuế và các khoản phải nộp Nhà nước"
## [53] "Phải trả người lao động"
## [54] "Chi phí phải trả ngắn hạn"
## [55] "Doanh thu chưa thực hiện ngắn hạn"
## [56] "Phải trả ngắn hạn khác"
## [57] "Vay và nợ thuê tài chính ngắn hạn"
## [58] "Quỹ khen thưởng, phúc lợi"
## [59] "Nợ dài hạn"
## [60] "Doanh thu chưa thực hiện dài hạn"
## [61] "Phải trả dài hạn khác"
## [62] "Vay và nợ thuê tài chính dài hạn"
## [63] "Thuế thu nhập hoãn lại phải trả"
## [64] "Dự phòng phải trả dài hạn"
## [65] "Tổng Vốn chủ sở hữu"
## [66] "Vốn chủ sở hữu"
## [67] "Vốn góp của chủ sở hữu"
## [68] "Cổ phiếu phổ thông có quyền biểu quyết"
## [69] "Thặng dư vốn cổ phần"
## [70] "Vốn khác của chủ sở hữu"
## [71] "Chênh lệch tỷ giá hối đoái"
## [72] "Quỹ đầu tư phát triển"
## [73] "Quỹ khác thuộc vốn chủ sở hữu"
## [74] "Lợi nhuận sau thuế chưa phân phối"
## [75] "Lợi nhuận sau thuế chưa phân phối đến cuối năm trước"
## [76] "Lợi nhuận sau thuế chưa phân phối năm nay"
## [77] "Lợi ích cổ đông không kiểm soát"
## [78] "TỔNG CỘNG NGUỒN VỐN"
## [79] "Doanh thu bán hàng và cung cấp dịch vụ"
## [80] "Các khoản giảm trừ doanh thu"
## [81] "Doanh thu thuần về bán hàng và cung cấp dịch vụ"
## [82] "Giá vốn hàng bán"
## [83] "Lợi nhuận gộp về bán hàng và cung cấp dịch vụ"
## [84] "Doanh thu hoạt động tài chính"
## [85] "Chi phí hoạt động tài chính"
## [86] "Trong đó: Chi phí lãi vay"
## [87] "Lãi/(lỗ) trong công ty liên kết, liên doanh"
## [88] "Chi phí bán hàng"
## [89] "Chi phí quản lý doanh nghiệp"
## [90] "Lợi nhuận thuần từ hoạt động kinh doanh"
## [91] "Thu nhập khác"
## [92] "Chi phí khác"
## [93] "(Lỗ)/Lợi nhuận khác"
## [94] "Tổng lợi nhuận kế toán trước thuế"
## [95] "Chi phí thuế TNDN hiện hành"
## [96] "(Chi phí)/ thu nhập thuế TNDN hoãn lại"
## [97] "Lợi nhuận sau thuế thu nhập doanh nghiệp"
## [98] "Lợi nhuận sau thuế của công ty mẹ"
## [99] "(Lỗ)/ Lợi nhuận sau thuế của cổ đông không kiểm soát"
## [100] "Lãi cơ bản trên cổ phiếu"
## [101] "Lãi suy giảm trên cổ phiếu"
## [102] "Lợi nhuận kế toán trước thuế"
## [103] "Khấu hao tài sản cố định hữu hình và bất động sản đầu tư và tài sản cố định thuê tài chính và hao mòn tài sản cố định vô hình (bao gồm phân bổ lợi thế thương mại và tiền thuê đất trả trước)"
## [104] "Trích lập/(hoàn nhập) dự phòng"
## [105] "(Lãi)/Lỗ chênh lệch tỷ giá hối đoái do đánh giá lại các khoản mục tiền tệ có gốc ngoại tệ"
## [106] "(Lãi)/Lỗ từ hoạt động đầu tư"
## [107] "Chi phí lãi vay (bao gồm chi phí phát hành trái phiếu)"
## [108] "Lưu chuyển tiền từ hoạt động kinh doanh trước thay đổi vốn lưu động"
## [109] "(Tăng)/Giảm các khoản phải thu"
## [110] "(Tăng)/Giảm hàng tồn kho"
## [111] "Tăng/(Giảm) các khoản phải trả"
## [112] "(Tăng)/Giảm chi phí trả trước"
## [113] "Tiền lãi vay đã trả"
## [114] "Thuế thu nhập doanh nghiệp đã nộp"
## [115] "Tiền thu khác từ hoạt động kinh doanh"
## [116] "Tiền chi khác từ hoạt động kinh doanh"
## [117] "Lưu chuyển tiền thuần từ hoạt động kinh doanh"
## [118] "Tiền chi để mua sắm, xây dựng TSCĐ và các TSDH khác"
## [119] "Tiền thu do thanh lý, nhượng bán TSCĐ và các TSDH khác"
## [120] "Tiền chi cho vay và mua công cụ nợ của các đơn vị khác"
## [121] "Tiền thu hồi cho vay, bán lại các công cụ nợ của đơn vị khác"
## [122] "Tiền chi đầu tư góp vốn vào đơn vị khác ( trừ tiền thu về)"
## [123] "Tiền thu hồi đầu tư góp vốn vào đơn vị khác"
## [124] "tiền thu lãi cho vay, cổ tức và lợi nhuận được chia"
## [125] "Lưu chuyển tiền thuần từ hoạt động đầu tư"
## [126] "Tiền thu từ đi vay"
## [127] "Tiền trả nợ gốc vay"
## [128] "Tiền trả nợ gốc thuê tài chính"
## [129] "Cổ tức, lợi nhuận đã trả cho chủ sở hữu"
## [130] "Lưu chuyển tiền thuần từ hoạt động tài chính"
## [131] "Lưu chuyển tiền thuần trong năm"
## [132] "Tiền và tương đương tiền đầu năm"
## [133] "Ảnh hưởng của thay đổi tỷ giá hối đoái quy đổi ngoại tệ"
## [134] "Tiền và tương đương tiền cuối năm"
Lệnh names sẽ trả về một vector chứa tên của tất cả các biến trong data frame.
Từ đó, ta có thể phân tích nắm bắt toàn bộ các chỉ tiêu tài chính hiện có trong bộ dữ liệu gốc để có thể chọn lựa, truy cập và sử dụng chúng một cách chính xác trong các công thức tính toán và phân tích.
Kiểm tra số kỳ trong giai đoạn phân tích
## [1] 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
Lệnh này sẽ trích xuất và hiển thị tất cả các giá trị riêng biệt có trong cột “Năm” . Xác định phạm vi thời gian chính xác của bộ dữ liệu (từ 2015 đến 2024). Điều này giúp xác nhận dữ liệu đã được sắp xếp đúng thứ tự thời gian và không bị thiếu các năm quan trọng.
Hàm is.na() trả về TRUE cho mỗi ô bị trống (NA) và FALSE nếu ngược lại. Hàm sum() đếm tổng số ô NA trong toàn bộ data frame.
Hàm colSums() tính tổng NA cho từng cột. Giúp xác định cột nào đang bị thiếu dữ liệu.
## [1] 144
## Năm
## 0
## TÀI SẢN NGẮN HẠN
## 0
## Tiền và các khoản tương đương tiền
## 0
## Tiền
## 0
## Các khoản tương đương tiền
## 0
## Đầu tư tài chính ngắn hạn
## 2
## Đầu tư nắm giữ đến ngày đáo hạn
## 2
## Các khoản phải thu ngắn hạn
## 0
## Phải thu ngắn hạn của khách hàng
## 0
## Trả trước cho người bán ngắn hạn
## 0
## Phải thu về cho vay ngắn hạn
## 2
## Phải thu ngắn hạn khác
## 0
## Dự phòng phải thu ngắn hạn khó đòi
## 3
## Tổng hàng tồn kho
## 0
## Hàng tồn kho
## 0
## Dự phòng giảm giá hàng tồn kho
## 4
## Tài sản ngắn hạn khác
## 0
## Chi phí trả trước ngắn hạn
## 0
## Thuế giá trị gia tăng được khấu trừ
## 0
## Thuế và các khoản phải thu Nhà nước
## 3
## TÀI SẢN DÀI HẠN
## 0
## Các khoản phải thu dài hạn
## 3
## Phải thu về cho vay dài hạn
## 4
## Phải thu dài hạn khác
## 3
## Tài sản cố định
## 0
## Tài sản cố định hữu hình
## 0
## Nguyên giá TSCĐ HH
## 0
## Giá trị khấu hao lũy kế...28
## 0
## Tài sản cố định thuê tài chính
## 9
## Nguyên giá TS cố định thuê tài chính
## 9
## Giá trị hao mòn lũy kế...31
## 9
## Tài sản cố định vô hình
## 0
## Nguyên giá TS cố định vô hình
## 0
## Giá trị hao mòn lũy kế...34
## 0
## Bất động sản đầu tư
## 4
## Nguyên giá bất động sản đầu tư
## 4
## Giá trị khấu hao lũy kế...37
## 4
## Tài sản dở dang dài hạn
## 0
## Chi phí xây dựng cơ bản dở dang
## 0
## Đầu tư tài chính dài hạn
## 1
## Đầu tư vào công ty liên kết
## 2
## Đầu tư vào đơn vị khác
## 6
## Tài sản dài hạn khác
## 0
## Chi phí trả trước dài hạn
## 0
## Tài sản thuế thu nhập hoãn lại
## 0
## Lợi thế thương mại
## 5
## TỔNG CỘNG TÀI SẢN
## 0
## NỢ PHẢI TRẢ
## 0
## Nợ ngắn hạn
## 0
## Phải trả người bán ngắn hạn
## 0
## Người mua trả tiền trước ngắn hạn
## 2
## Thuế và các khoản phải nộp Nhà nước
## 0
## Phải trả người lao động
## 0
## Chi phí phải trả ngắn hạn
## 0
## Doanh thu chưa thực hiện ngắn hạn
## 5
## Phải trả ngắn hạn khác
## 1
## Vay và nợ thuê tài chính ngắn hạn
## 0
## Quỹ khen thưởng, phúc lợi
## 0
## Nợ dài hạn
## 0
## Doanh thu chưa thực hiện dài hạn
## 7
## Phải trả dài hạn khác
## 4
## Vay và nợ thuê tài chính dài hạn
## 0
## Thuế thu nhập hoãn lại phải trả
## 3
## Dự phòng phải trả dài hạn
## 8
## Tổng Vốn chủ sở hữu
## 0
## Vốn chủ sở hữu
## 0
## Vốn góp của chủ sở hữu
## 0
## Cổ phiếu phổ thông có quyền biểu quyết
## 0
## Thặng dư vốn cổ phần
## 0
## Vốn khác của chủ sở hữu
## 5
## Chênh lệch tỷ giá hối đoái
## 0
## Quỹ đầu tư phát triển
## 0
## Quỹ khác thuộc vốn chủ sở hữu
## 0
## Lợi nhuận sau thuế chưa phân phối
## 0
## Lợi nhuận sau thuế chưa phân phối đến cuối năm trước
## 0
## Lợi nhuận sau thuế chưa phân phối năm nay
## 0
## Lợi ích cổ đông không kiểm soát
## 0
## TỔNG CỘNG NGUỒN VỐN
## 0
## Doanh thu bán hàng và cung cấp dịch vụ
## 0
## Các khoản giảm trừ doanh thu
## 0
## Doanh thu thuần về bán hàng và cung cấp dịch vụ
## 0
## Giá vốn hàng bán
## 0
## Lợi nhuận gộp về bán hàng và cung cấp dịch vụ
## 0
## Doanh thu hoạt động tài chính
## 0
## Chi phí hoạt động tài chính
## 0
## Trong đó: Chi phí lãi vay
## 0
## Lãi/(lỗ) trong công ty liên kết, liên doanh
## 2
## Chi phí bán hàng
## 0
## Chi phí quản lý doanh nghiệp
## 0
## Lợi nhuận thuần từ hoạt động kinh doanh
## 0
## Thu nhập khác
## 0
## Chi phí khác
## 0
## (Lỗ)/Lợi nhuận khác
## 0
## Tổng lợi nhuận kế toán trước thuế
## 0
## Chi phí thuế TNDN hiện hành
## 0
## (Chi phí)/ thu nhập thuế TNDN hoãn lại
## 0
## Lợi nhuận sau thuế thu nhập doanh nghiệp
## 0
## Lợi nhuận sau thuế của công ty mẹ
## 0
## (Lỗ)/ Lợi nhuận sau thuế của cổ đông không kiểm soát
## 0
## Lãi cơ bản trên cổ phiếu
## 0
## Lãi suy giảm trên cổ phiếu
## 1
## Lợi nhuận kế toán trước thuế
## 0
## Khấu hao tài sản cố định hữu hình và bất động sản đầu tư và tài sản cố định thuê tài chính và hao mòn tài sản cố định vô hình (bao gồm phân bổ lợi thế thương mại và tiền thuê đất trả trước)
## 0
## Trích lập/(hoàn nhập) dự phòng
## 2
## (Lãi)/Lỗ chênh lệch tỷ giá hối đoái do đánh giá lại các khoản mục tiền tệ có gốc ngoại tệ
## 0
## (Lãi)/Lỗ từ hoạt động đầu tư
## 0
## Chi phí lãi vay (bao gồm chi phí phát hành trái phiếu)
## 0
## Lưu chuyển tiền từ hoạt động kinh doanh trước thay đổi vốn lưu động
## 0
## (Tăng)/Giảm các khoản phải thu
## 0
## (Tăng)/Giảm hàng tồn kho
## 0
## Tăng/(Giảm) các khoản phải trả
## 0
## (Tăng)/Giảm chi phí trả trước
## 0
## Tiền lãi vay đã trả
## 0
## Thuế thu nhập doanh nghiệp đã nộp
## 0
## Tiền thu khác từ hoạt động kinh doanh
## 6
## Tiền chi khác từ hoạt động kinh doanh
## 0
## Lưu chuyển tiền thuần từ hoạt động kinh doanh
## 0
## Tiền chi để mua sắm, xây dựng TSCĐ và các TSDH khác
## 0
## Tiền thu do thanh lý, nhượng bán TSCĐ và các TSDH khác
## 1
## Tiền chi cho vay và mua công cụ nợ của các đơn vị khác
## 2
## Tiền thu hồi cho vay, bán lại các công cụ nợ của đơn vị khác
## 0
## Tiền chi đầu tư góp vốn vào đơn vị khác ( trừ tiền thu về)
## 3
## Tiền thu hồi đầu tư góp vốn vào đơn vị khác
## 2
## tiền thu lãi cho vay, cổ tức và lợi nhuận được chia
## 1
## Lưu chuyển tiền thuần từ hoạt động đầu tư
## 0
## Tiền thu từ đi vay
## 0
## Tiền trả nợ gốc vay
## 0
## Tiền trả nợ gốc thuê tài chính
## 10
## Cổ tức, lợi nhuận đã trả cho chủ sở hữu
## 0
## Lưu chuyển tiền thuần từ hoạt động tài chính
## 0
## Lưu chuyển tiền thuần trong năm
## 0
## Tiền và tương đương tiền đầu năm
## 0
## Ảnh hưởng của thay đổi tỷ giá hối đoái quy đổi ngoại tệ
## 0
## Tiền và tương đương tiền cuối năm
## 0
Kết quả cho thấy có 144 ô dữ liệu bị thiếu. Trong BCTC, NA thường có nghĩa là chỉ tiêu này không phát sinh trong kỳ hoặc giá trị bằng 0.
Cột “Đầu tư nắm giữ đến ngày đáo hạn” bị thiếu 8/10 giá trị, cho thấy đây là chỉ tiêu không thường xuyên phát sinh. Các cột chính như “TÀI SẢN NGẮN HẠN” có 0 NA, cho thấy tính toàn vẹn của dữ liệu cốt lõi.
Sau khi xem xét kết quả của lệnh colSums, nhận thấy có cột chỉ tiêu “Tiền trả nợ gốc thuê tài chính” có 10 giá trị NA. Vì thế nên ta sẽ xóa cột này đi vì không mang lại ý nghĩa thống kê.
Hàm clean_names() tự động:
Chuyển đổi tên cột sang chữ thường.
Chuyển đổi ký tự tiếng Việt có dấu thành không dấu (ví dụ: “Năm” -> “nam”).
Thay thế khoảng trắng và các ký tự đặc biệt bằng dấu gạch dưới _ (ví dụ: “TÀI SẢN NGẮN HẠN” -> “tai_san_ngan_han”).
Loại bỏ các ký tự rác.
## [1] "nam" "tai_san_ngan_han"
## [3] "tien_va_cac_khoan_tuong_duong_tien" "tien"
## [5] "cac_khoan_tuong_duong_tien"
Đây là thao tác cần thiết trong R. Sau khi chạy lệnh này, chúng ta có thể gọi các cột bằng tên đơn giản, không dấu, không khoảng trắng. Dữ liệu đã sẵn sàng cho bước xử lý tiếp theo.
mutate(): Hàm để chỉnh sửa hoặc tạo cột mới.
across(where(is.numeric), …): Áp dụng một hàm cho tất cả các cột where (mà) kiểu dữ liệu is.numeric (là số).
~replace_na(., 0): Một hàm ẩn danh đại diện cho cột đang được xử lý. Lệnh này thay thế tất cả giá trị NA trong cột đó bằng 0.
Trong BCTC, NA đại diện cho mục không phát sinh, được thay thế bằng 0 để tăng tính đầy đủ cho phân tích.
## [1] 0
Kết quả sum(is.na(df_analysis)) trả về 0 xác nhận bộ dữ liệu đã hoàn toàn sạch NA.
Dựa trên ý nghĩa phản ánh toàn diện hiệu quả tài chính doanh nghiệp, nghiên cứu lựa chọn 10 biến tài chính then chốt dưới đây.
Ta tạo một data frame mới để chứa dữ liệu phân tích.
df <- df_bctc %>% select(nam, doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,gia_von_hang_ban,loi_nhuan_gop_ve_ban_hang_va_cung_cap_dich_vu,doanh_thu_hoat_dong_tai_chinh,chi_phi_hoat_dong_tai_chinh,chi_phi_ban_hang,chi_phi_quan_ly_doanh_nghiep,loi_nhuan_thuan_tu_hoat_dong_kinh_doanh,loi_nhuan_sau_thue_thu_nhap_doanh_nghiep,tong_cong_tai_san)
print(df)## # A tibble: 10 × 11
## nam doanh_thu_thuan_ve_ban_hang_v…¹ gia_von_hang_ban loi_nhuan_gop_ve_ban…²
## <dbl> <dbl> <dbl> <dbl>
## 1 2015 1.61e12 1.42e12 189807791166
## 2 2016 2.14e12 1.84e12 307035411700
## 3 2017 4.07e12 3.52e12 550385105168
## 4 2018 8.01e12 7.34e12 672936073191
## 5 2019 9.26e12 8.22e12 1042139378567
## 6 2020 7.43e12 6.65e12 776935221364
## 7 2021 1.31e13 1.18e13 1301375383462
## 8 2022 1.53e13 1.42e13 1086239883713
## 9 2023 1.26e13 1.15e13 1108693322770
## 10 2024 1.28e13 1.13e13 1484105506165
## # ℹ abbreviated names: ¹doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
## # ²loi_nhuan_gop_ve_ban_hang_va_cung_cap_dich_vu
## # ℹ 7 more variables: doanh_thu_hoat_dong_tai_chinh <dbl>,
## # chi_phi_hoat_dong_tai_chinh <dbl>, chi_phi_ban_hang <dbl>,
## # chi_phi_quan_ly_doanh_nghiep <dbl>,
## # loi_nhuan_thuan_tu_hoat_dong_kinh_doanh <dbl>,
## # loi_nhuan_sau_thue_thu_nhap_doanh_nghiep <dbl>, tong_cong_tai_san <dbl>
Bảng mô tả ý nghĩa các biến
variable_description <- data.frame(
Variable = c(
"Doanh thu thuần", "Giá vốn hàng bán", "Lợi nhuận gộp từ bán hàng và cung cấp dịch vụ", "Doanh thu hoạt động tài chính", "Chi phí hoạt động tài chính",
"Chi phí bán hàng", "Chi phí quản lý doanh nghiệp", "Lợi nhuận thuần từ hoạt động kinh doanh", "Lợi nhuận sau thuế thu nhập doanh nghiệp",
"Tổng tài sản"),
Description = c(
"Quy mô hoạt động chính sau khi trừ giảm trừ doanh thu",
"Chi phí đầu vào để tạo ra sản phẩm/dịch vụ",
"Hiệu quả kinh doanh trước các chi phí ngoài sản xuất",
"Thu từ đầu tư, lãi tiền gửi và hoạt động tài chính khác",
"Chi cho lãi vay, lỗ đầu tư ngoài hoạt động chính.",
"Mức chi cho phân phối, tiếp thị, quảng cáo",
"Chi vận hành và quản trị doanh nghiệp",
"Lợi nhuận trước thuế từ hoạt động cốt lõi",
"Kết quả ròng, phản ánh nguồn tích lũy của doanh nghiệp",
"Quy mô và tiềm lực tổng thể của doanh nghiệp tại từng thời điểm"))
library(knitr)
kable(variable_description, caption = "**Bảng mô tả các biến tài chính**")| Variable | Description |
|---|---|
| Doanh thu thuần | Quy mô hoạt động chính sau khi trừ giảm trừ doanh thu |
| Giá vốn hàng bán | Chi phí đầu vào để tạo ra sản phẩm/dịch vụ |
| Lợi nhuận gộp từ bán hàng và cung cấp dịch vụ | Hiệu quả kinh doanh trước các chi phí ngoài sản xuất |
| Doanh thu hoạt động tài chính | Thu từ đầu tư, lãi tiền gửi và hoạt động tài chính khác |
| Chi phí hoạt động tài chính | Chi cho lãi vay, lỗ đầu tư ngoài hoạt động chính. |
| Chi phí bán hàng | Mức chi cho phân phối, tiếp thị, quảng cáo |
| Chi phí quản lý doanh nghiệp | Chi vận hành và quản trị doanh nghiệp |
| Lợi nhuận thuần từ hoạt động kinh doanh | Lợi nhuận trước thuế từ hoạt động cốt lõi |
| Lợi nhuận sau thuế thu nhập doanh nghiệp | Kết quả ròng, phản ánh nguồn tích lũy của doanh nghiệp |
| Tổng tài sản | Quy mô và tiềm lực tổng thể của doanh nghiệp tại từng thời điểm |
Sử dụng hàm kable() từ gói knitr để trình bày bảng theo định dạng đẹp mắt và chuyên nghiệp.
Đây là bước định nghĩa dữ liệu — giúp người đọc hiểu được phạm vi, bản chất và vai trò của từng trường dữ liệu, là bước bắt buộc trong quy trình Data Documentation chuẩn, giúp phân tích dữ liệu hiệu quả và chuyên nghiệp
Chuẩn hóa về đơn vị tỷ đồng
Dòng 1: đây là một lệnh cài đặt chung, nó buộc R phải hiển thị các con số ở dạng thập phân đầy đủ.
Dòng 2: Lệnh này thay đổi tất cả các cột ngoại trừ (-) cột nam. Phép biến đổi được áp dụng là ~ . / 1e9, tức là lấy giá trị hiện tại của cột và chia cho 1 tỷ (1,000,000,000).
Kết quả vừa được chuẩn hóa về đơn vị (tỷ đồng), vừa dễ đọc, giúp việc phân tích và trực quan hóa dữ liệu dễ dàng hơn nhiều.
Chuẩn hóa biến năm
Chuyển cột thời gian từ số sang biến định tính (factor).
Hỗ trợ phân tích phân loại. Giúp R xử lý năm như một biến nhóm (category) hơn là một biến liên tục, rất hữu ích khi dùng trong ggplot2.
df <- df %>% mutate(
bien_loi_nhuan_gop = loi_nhuan_gop_ve_ban_hang_va_cung_cap_dich_vu / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
bien_loi_nhuan_thuan = loi_nhuan_sau_thue_thu_nhap_doanh_nghiep / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
tyle_cpbh = chi_phi_ban_hang / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
tyle_cpql = chi_phi_quan_ly_doanh_nghiep / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
tyle_cptc = chi_phi_hoat_dong_tai_chinh / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
tang_truong_dt_yoy = (doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu - lag(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu)) / lag(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu),
tang_truong_lnst_yoy = (loi_nhuan_sau_thue_thu_nhap_doanh_nghiep- lag(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep)) / lag(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep),
roa = loi_nhuan_sau_thue_thu_nhap_doanh_nghiep / tong_cong_tai_san)Việc xây dựng thêm các biến tài chính mới là bước rất cần thiết và đúng hướng, giúp phân tích đa chiều hiệu quả hoạt động cũng như cấu trúc tài chính của doanh nghiệp.
Các chỉ tiêu như biên lợi nhuận gộp, biên lợi nhuận thuần, tỷ lệ chi phí bán hàng/doanh thu, tỷ lệ chi phí quản lý/doanh thu, tỷ suất sinh lời tài sản (ROA), tốc độ tăng trưởng doanh thu và lợi nhuận (YoY), cùng các tỷ lệ chi phí tài chính đều được tính toán nhằm phản ánh toàn diện sức khỏe tài chính của doanh nghiệp qua các góc độ: hiệu quả kiểm soát chi phí, năng lực sinh lời, rủi ro tài chính và động lực tăng trưởng.
Nhìn chung, việc chủ động chuẩn hóa và mở rộng hệ các biến này đã nâng cao giá trị phân tích, cung cấp nền tảng dữ liệu toàn diện, làm căn cứ đánh giá rõ ràng về hiệu quả tài chính, rủi ro hoạt động cũng như tiềm năng phát triển bền vững của doanh nghiệp trong giai đoạn 2015–2024.
df %>%
select(nam,bien_loi_nhuan_gop, bien_loi_nhuan_thuan, tyle_cpbh, tyle_cpql, tyle_cptc,tang_truong_dt_yoy, tang_truong_lnst_yoy, roa) %>%
head(10)Lệnh này sẽ lọc ra cột bạn quan tâm và hiển thị 6 dòng đầu tiên (bao gồm cả năm 2015 với NA). Mục đích để kiểm tra dữ liệu sau khi tạo có bị lỗi hay không.
Lệnh mutate và case_when để tạo một cột mới (nhom_loi_nhuan) bằng cách phân nhóm (binning) cột lợi nhuận.
Dùng hàm quantile để tìm các ngưỡng phân vị.
df <- df %>%
mutate(
nhom_loi_nhuan = case_when(
loi_nhuan_sau_thue_thu_nhap_doanh_nghiep >= quantile(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, 0.66) ~ "Cao",
loi_nhuan_sau_thue_thu_nhap_doanh_nghiep <= quantile(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, 0.33) ~ "Thấp",
TRUE ~ "Trung bình" ))Giúp phân chia các năm (hoặc từng quan sát) thành các nhóm hiệu quả hoạt động dễ so sánh, trực quan hóa:
“Cao” là nhóm nằm trong 1/3 trên cùng các năm có lợi nhuận tốt nhất,
“Thấp” là 1/3 dưới cùng.
“Trung bình” là phần còn lại.
Sử dụng summarise() thực hiện phép toán tổng hợp trên toàn bộ dữ liệu. Các hàm mean(), min(), max(), và sd() là các hàm tổng hợp tính toán giá trị trung bình, tối thiểu, tối đa, và độ lệch chuẩn cho cột đó, đồng thời bỏ qua các giá trị NA (na.rm = TRUE).
Thống kê mô tả
thong_ke_doanh_thu <- df %>%
summarise(
dt_trungbinh = mean(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, na.rm = TRUE),
dt_toithieu = min(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, na.rm = TRUE),
dt_toida = max(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, na.rm = TRUE),
dt_dolechchuan = sd(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, na.rm = TRUE))
print(thong_ke_doanh_thu)## # A tibble: 1 × 4
## dt_trungbinh dt_toithieu dt_toida dt_dolechchuan
## <dbl> <dbl> <dbl> <dbl>
## 1 8636. 1615. 15290. 4856.
Kết quả thống kê mô tả cho thấy:
Giá trị trung bình doanh thu thuần qua các năm là khoảng 8.636 tỷ đồng. Đây là con số khá cao, phản ánh quy mô doanh nghiệp lớn và có sức cạnh tranh trên thị trường.
Doanh thu tối thiểu là 1.614 tỷ đồng, trong khi doanh thu tối đa đạt 15.290 tỷ đồng . Sự khác biệt lớn này chứng tỏ doanh nghiệp có giai đoạn tăng trưởng rất mạnh, nhất là các năm cao điểm mở rộng kinh doanh hoặc thị trường thuận lợi.
Độ lệch chuẩn gần 4.856 tỷ đồng cho thấy sự biến động doanh thu giữa các năm là khá lớn, thể hiện rõ ảnh hưởng của các yếu tố chu kỳ, thị trường, hoặc các biến động bên ngoài đến kết quả tài chính.
Doanh nghiệp An Phát Xanh duy trì mức doanh thu thuần bình quân cao qua nhiều năm, nhưng mức biến động lớn cũng đặt ra yêu cầu phải kiểm soát rủi ro tốt và có chiến lược ổn định hóa dòng tiền. Việc doanh thu cao nhất gấp gần 10 lần năm thấp nhất là điểm tích cực về tiềm năng tăng trưởng.
Biểu đồ đường xu hướng doanh thu thuần
Dòng 1: Khởi tạo đối tượng ggplot với aes() có chức năng ánh xạ cột nam vào trục X, cột doanh_thu_thuan… vào trục Y. group = 1 buộc tất cả các điểm dữ liệu thuộc 1 nhóm duy nhất.
Dòng 2: geom_line vẽ một đường thẳng màu xanh (blue) với độ dày (size) là 1.
Dòng 3: Geom_point vẽ các chấm tròn màu đỏ (red) với kích thước 2 tại mỗi điểm dữ liệu.
Dòng 4-9: Thêm một lớp nhãn văn bản (geom_text).
Dòng 5-6 định nghĩa nội dung của nhãn (label) và được định dạng số.
Dòng 7-9 có chức năng tùy chỉnh hình thức của nhãn.
Dòng 10: Định dạng lại các nhãn trên trục Y, hiển thị số đầy đủ và thêm dấu chấm (.) làm dấu phân cách hàng nghìn.
Dòng 11-14: Đặt tiêu đề chính cho biểu đồ, cũng như nhãn mô tả cho trục X và trục Y.
ggplot(df, aes(x = nam, y = doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, group = 1)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 2) +
geom_text(
aes(label = scales::label_number(scale=1)(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu)),
vjust = -1,
size = 2.5,
color = "black") +
scale_y_continuous(labels = scales::label_number(scale = 1, big.mark = ".")) +
labs(
title = "Xu hướng doanh thu thuần qua các năm",
x = "Năm",
y = "Doanh thu thuần (Tỷ đồng)" ) +
theme_minimal()Biểu đồ cho thấy doanh thu thuần của An Phát Xanh tăng mạnh từ 2015 đến 2022, lập đỉnh năm 2022 rồi duy trì ở mức cao đến 2024. Năm 2020 doanh thu giảm rõ rệt do yếu tố ngoại cảnh, nhiều khả năng do ảnh hưởng bởi các yếu tố ngoại cảnh như đại dịch COVID-19 hoặc biến động thị trường. Nhưng công ty nhanh chóng phục hồi sau đó. Xu hướng này chứng tỏ doanh nghiệp có năng lực tăng trưởng mạnh và khả năng thích ứng tốt với biến động thị trường.
Biểu đồ tốc độ tăng trưởng doanh thu YoY
Dòng 1: Khởi tạo biểu đồ, ánh xạ nam vào trục X, tang_truong_dt_yoy (Tăng trưởng YoY) vào trục Y.
Dòng 2: Thêm lớp biểu đồ cột. aes(fill = … > 0) đặt màu tô (fill) dựa trên điều kiện: tô màu khác nhau nếu giá trị tang_truong_dt_yoy lớn hơn 0 (dương) hay không (âm).
Dòng 3-6: Thêm lớp nhãn văn bản lên các cột và định dạng nhãn thành phần trăm với 1 chữ số thập phân.
Dòng 7: Tùy chỉnh màu tô đã đặt ở Dòng 2. Gán màu green (xanh lá) cho giá trị TRUE (tăng trưởng dương) và màu red (đỏ) cho giá trị FALSE (tăng trưởng âm).
Dòng 8: Định dạng các nhãn trên trục Y thành dạng phần trăm.
Dòng 9-12: Đặt tiêu đề cho biểu đồ và nhãn cho trục X, Y.
Dòng 13: Áp dụng giao diện nền trắng, tối giản.
Dòng 14: Ẩn chú giải.
ggplot(df, aes(x = nam, y = tang_truong_dt_yoy)) +
geom_col(aes(fill = tang_truong_dt_yoy > 0)) +
geom_text(
aes(label = scales::percent(tang_truong_dt_yoy, accuracy = 0.1)),
vjust = ifelse(df$tang_truong_dt_yoy > 0, -0.5, 1.5),
size = 3) +
scale_fill_manual(values = c("TRUE" = "green", "FALSE" = "red")) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "Tốc độ tăng trưởng doanh thu thuần (YoY)",
x = "Năm",
y = "Tăng trưởng (%)") +
theme_minimal() +
theme(legend.position = "none")Tốc độ tăng trưởng doanh thu thuần của công ty có những giai đoạn vượt trội, đặc biệt năm 2017 và 2018 đạt trên 89% và 96.9%. Tuy nhiên, năm 2020 và 2023 ghi nhận mức tăng trưởng âm mạnh do ảnh hưởng bất lợi từ thị trường, với mức giảm lần lượt là -19.8% và -17.5%. Sau mỗi lần giảm, doanh nghiệp phục hồi tốt như năm 2021 (+76.9%).
Nhìn chung, doanh nghiệp duy trì được các năm tăng trưởng cao nhưng vẫn cần chú ý ổn định trong các năm tiếp theo để giảm khả năng biến động lớn.
Thống kê mô tả
thong_ke_gia_von <- df %>%
summarise(
gvhb_trungbinh = mean(gia_von_hang_ban, na.rm = TRUE),
gvhb_toithieu = min(gia_von_hang_ban, na.rm = TRUE),
gvhb_toida = max(gia_von_hang_ban, na.rm = TRUE),
gvhb_dolechchuan = sd(gia_von_hang_ban, na.rm = TRUE))
print(thong_ke_gia_von)## # A tibble: 1 × 4
## gvhb_trungbinh gvhb_toithieu gvhb_toida gvhb_dolechchuan
## <dbl> <dbl> <dbl> <dbl>
## 1 7784. 1425. 14204. 4467.
Giá vốn hàng bán trung bình của doanh nghiệp đạt khoảng 7.784 tỷ đồng mỗi năm, dao động từ mức thấp nhất 1.424 tỷ đến cao nhất 14.204 tỷ đồng.
Độ lệch chuẩn lớn (4.467 tỷ) thể hiện chi phí đầu vào biến động mạnh theo từng năm.
Doanh nghiệp cần kiểm soát giá vốn tốt để đảm bảo hiệu quả lợi nhuận gộp, nhất là trong các năm giá vốn tăng cao.
Biểu đồ so sánh tỷ lệ giá vốn qua các năm
Dòng 1-3: Có chức năng tạo một cột mới tên tyle_gv_dt (Tỷ lệ giá vốn) bằng cách lấy cột gia_von_hang_ban (Giá vốn) chia cho cột doanh_thu_thuan… (Doanh thu).
Dòng 4: Khởi tạo biểu đồ.
Dòng 5: Thêm một lớp biểu đồ đường.
Dòng 6: Thêm một lớp biểu đồ điểm (chấm tròn) tại mỗi điểm dữ liệu.
Dòng 7-11 : Thêm một lớp nhãn văn bản, hiển thị giá trị tại mỗi điểm, được định dạng thành phần trăm với 1 chữ số thập phân.
Dòng 12-15: Đặt tiêu đề và các nhãn mô tả cho trục X, Y.
Dòng 16: định dạng các nhãn trên trục Y thành dạng phần trăm.
df <- df %>%
mutate(tyle_gv_dt = gia_von_hang_ban / doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu)
ggplot(df, aes(x = nam, y = tyle_gv_dt, group = 1)) +
geom_line(color = "orange", size = 1) +
geom_point(color = "darkred", size = 2) +
geom_text(
aes(label = scales::percent(tyle_gv_dt, accuracy = 0.1)),
vjust = -1.5,
size = 3,
color = "black" ) +
labs(
title = "Xu hướng tỷ lệ giá vốn/doanh thu",
x = "Năm",
y = "Tỷ lệ Giá vốn/Doanh thu") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Tỷ lệ giá vốn/doanh thu của doanh nghiệp dao động trong khoảng 85,7% đến 92,9% qua các năm. Các giai đoạn 2018 và 2022 ghi nhận tỷ lệ cao nhất, cho thấy chi phí đầu vào tăng mạnh, làm giảm biên lợi nhuận gộp. Năm 2024, tỷ lệ này giảm còn 88,4%, phản ánh nỗ lực kiểm soát tốt hơn chi phí sản xuất. Nhìn chung, việc duy trì tỷ lệ giá vốn quanh 90% là hợp lý, nhưng doanh nghiệp cần thận trọng trong các giai đoạn tỷ lệ này tăng vọt để không ảnh hưởng tới lợi nhuận.
Thống kê mô tả
thong_ke_gpm <- df %>% summarise(
gpm_trungbinh = mean(bien_loi_nhuan_gop, na.rm = TRUE),
gpm_dolechchuan = sd(bien_loi_nhuan_gop, na.rm = TRUE))
print(thong_ke_gpm)## # A tibble: 1 × 2
## gpm_trungbinh gpm_dolechchuan
## <dbl> <dbl>
## 1 0.107 0.0226
Biên lợi nhuận gộp trung bình của doanh nghiệp đạt khoảng 10,7% với độ lệch chuẩn ở mức thấp (2,25%). Điều này cho thấy doanh nghiệp kiểm soát giá vốn đầu vào ổn định qua các năm, giữ được hiệu quả sản xuất và kinh doanh tốt. Tuy nhiên, biên gộp ở mức vừa phải nên vẫn cần chú trọng cải tiến công nghệ hoặc tối ưu chi phí để nâng cao hơn nữa khả năng sinh lời.
Biểu đồ đường xu hướng biên lợi nhuận gộp
Dòng 4-5: Thêm một lớp đường tham chiếu ngang, đường này được lấy từ một biến đã tính toán trước đó là thong_ke_gpm$gpm_trungbinh (mức trung bình).
Dòng 6-7: Thêm một lớp nhãn văn bản hiển thị số liệu tại mỗi điểm, được định dạng thành phần trăm với 1 chữ số thập phân.
ggplot(df, aes(x = nam, y = bien_loi_nhuan_gop, group = 1)) +
geom_line(color = "darkgreen", size = 1) +
geom_point(color = "red", size = 3) +
geom_hline(yintercept = thong_ke_gpm$gpm_trungbinh, linetype = "dashed", color = "blue", size = 1) +
geom_text(aes(label = scales::percent(bien_loi_nhuan_gop, accuracy = 0.1)), vjust = -1, size = 3) + labs(
title = "Xu hướng biên lợi nhuận gộp và mức trung bình",
x = "Năm",
y = "Biên lợi nhuận gộp (Tỷ lệ)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Biên lợi nhuận gộp của doanh nghiệp biến động khá rõ qua các năm. Giai đoạn 2016–2017 đạt đỉnh với mức 14,3% và 13,5%, cao hơn so với mức trung bình toàn kỳ. Sau đó, biên gộp giảm mạnh xuống thấp nhất 7,1% năm 2022, phản ánh chi phí đầu vào tăng hoặc áp lực cạnh tranh. Các năm gần đây, chỉ số này phục hồi lên mức 11,6% năm 2024, hướng về sát mức trung bình.
Thống kê mô tả
thong_ke_dthdtc <- df %>%
summarise(
dttc_trungbinh = mean(doanh_thu_hoat_dong_tai_chinh, na.rm = TRUE),
dttc_toithieu = min(doanh_thu_hoat_dong_tai_chinh, na.rm = TRUE),
dttc_toida = max(doanh_thu_hoat_dong_tai_chinh, na.rm = TRUE),
dttc_dolechchuan = sd(doanh_thu_hoat_dong_tai_chinh, na.rm = TRUE))
print(thong_ke_dthdtc)## # A tibble: 1 × 4
## dttc_trungbinh dttc_toithieu dttc_toida dttc_dolechchuan
## <dbl> <dbl> <dbl> <dbl>
## 1 146. 22.4 271. 94.2
Giá trị trung bình doanh thu tài chính đạt 146 tỷ đồng/năm, với mức thấp nhất chỉ 22,4 tỷ và cao nhất 270,7 tỷ đồng.
Độ lệch chuẩn lớn (94,2 tỷ) cho thấy khoản thu này có sự biến động đáng kể giữa các năm, phản ánh hoạt động tài chính không đều hoặc có vài năm xuất hiện khoản thu đột biến.
Biểu đồ đường xu hướng doanh thu hoạt động tài chính
ggplot(df, aes(x = nam, y = doanh_thu_hoat_dong_tai_chinh, group = 1)) +
geom_line(color = "purple", size = 1) +
geom_point(color = "darkred", size = 3) +
geom_text(aes(label = scales::comma(doanh_thu_hoat_dong_tai_chinh)),
vjust = -1.25, size = 3) +
labs(title = "Xu hướng doanh thu hoạt động tài chính",
x = "Năm",
y = "Doanh thu tài chính (tỷ đồng)") +
scale_y_continuous(labels = scales::comma) +
theme_minimal()Biểu đồ cho thấy doanh thu hoạt động tài chính tăng rõ rệt qua các năm, đặc biệt từ năm 2018 trở đi. Sau giai đoạn ổn định ở mức thấp (dưới 62 tỷ đồng từ 2015–2018), chỉ số này đã tăng nhanh, vượt lên mức 179 tỷ đồng năm 2019 và tiếp tục tăng liên tục, đạt đỉnh 270,7 tỷ đồng vào năm 2024. Điều này cho thấy doanh nghiệp đã đẩy mạnh các hoạt động đầu tư tài chính hiệu quả hơn.
Thống kê mô tả
thong_ke_cphtc <- df %>%summarise(
cptc_toithieu = min(chi_phi_hoat_dong_tai_chinh, na.rm = TRUE),
cptc_toida = max(chi_phi_hoat_dong_tai_chinh, na.rm = TRUE),
cptc_dolechchuan = sd(chi_phi_hoat_dong_tai_chinh, na.rm = TRUE))
print(thong_ke_cphtc)## # A tibble: 1 × 3
## cptc_toithieu cptc_toida cptc_dolechchuan
## <dbl> <dbl> <dbl>
## 1 50.0 268. 82.5
Điều này cho thấy chi phí tài chính biến động mạnh, thường là do thay đổi về quy mô khoản vay, lãi suất hoặc đầu tư tài chính từng năm. Doanh nghiệp cần kiểm soát tốt chi phí tài chính để hạn chế rủi ro ảnh hưởng đến lợi nhuận, nhất là trong các giai đoạn chi phí tăng bất thường.
Biểu đồ đường xu hướng tỷ lệ chi phí tài chính
ggplot(df, aes(x = nam, y = tyle_cptc, group = 1)) +
geom_line(color = "orange", size = 1) +
geom_point(color = "blue", size = 3) +
geom_text(aes(label = scales::percent(tyle_cptc, accuracy = 0.1)),
vjust = 3, size = 3) +
labs(title = "Xu hướng tỷ lệ chi phí tài chính",
x = "Năm",
y = "Tỷ lệ (%)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Biểu đồ này giúp đánh giá rủi ro gánh nặng nợ theo thời gian. Đường xu hướng đi xuống cho thấy doanh nghiệp đã kiểm soát tốt hơn chi phí tài chính trong các năm gần đây, giúp giảm áp lực lên lợi nhuận, mặc dù vẫn cần theo dõi sát nếu có dấu hiệu tăng trở lại.
Thống kê mô tả
thong_ke_cpbh <- df %>% summarise(
cpbh_trungbinh = mean(chi_phi_ban_hang, na.rm = TRUE),
cpbh_dolechchuan = sd(chi_phi_ban_hang, na.rm = TRUE),
cpbh_toithieu = min(chi_phi_ban_hang, na.rm = TRUE),
cpbh_toida = max(chi_phi_ban_hang, na.rm = TRUE))
print(thong_ke_cpbh)## # A tibble: 1 × 4
## cpbh_trungbinh cpbh_dolechchuan cpbh_toithieu cpbh_toida
## <dbl> <dbl> <dbl> <dbl>
## 1 350. 278. 56.9 739.
Chi phí bán hàng của doanh nghiệp trung bình đạt khoảng 350 tỷ đồng/năm, dao động từ mức thấp nhất là 56,9 tỷ đến cao nhất là 738,5 tỷ đồng.
Độ lệch chuẩn lớn (278,3 tỷ) cho thấy chi phí bán hàng biến động khá mạnh giữa các năm, phản ánh chiến lược marketing phân phối có thể thay đổi hoặc ảnh hưởng bởi quy mô doanh thu từng năm.
Nhận định: Doanh nghiệp cần kiểm soát tốt chi phí bán hàng để đảm bảo tỷ suất lợi nhuận, nhất là khi doanh thu tăng cao, tránh để chi phí này tăng quá nhanh so với tốc độ mở rộng thị trường.
Biểu đồ đường xu hướng tỷ lệ chi phí bán hàng
ggplot(df, aes(x = nam, y = tyle_cpbh, group = 1)) +
geom_line(color = "orange", size = 1) +
geom_point(color = "red", size = 3) +
geom_text(aes(label = scales::percent(tyle_cpbh, accuracy = 0.1)),
vjust = 2, size = 3.5) +
labs(title = "Xu hướng tỷ lệ chi phí bán hàng ",
x = "Năm",
y = "Tỷ lệ (%)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Tỷ lệ chi phí bán hàng trên doanh thu của doanh nghiệp thay đổi qua các năm. Giai đoạn 2015 đến 2018 giảm mạnh, cho thấy doanh nghiệp kiểm soát tốt chi phí trong thời kỳ mở rộng. Tuy nhiên, từ 2019 trở đi, tỷ lệ này tăng mạnh, cho thấy chi phí bán hàng chiếm tỷ trọng lớn hơn trong doanh thu. Nhìn chung, doanh nghiệp cần tiếp tục chú ý kiểm soát chi phí bán hàng.
Biểu đồ cột chi phí bán hàng
ggplot(df, aes(x = nam, y = chi_phi_ban_hang)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = scales::number(chi_phi_ban_hang, accuracy = 0.01)),
vjust = 2, size = 3, color = "black") +
labs( title = "Quy mô chi phí bán hàng qua các năm",
x = "Năm", y = "Chi phí bán hàng (tỷ đồng)" ) +
scale_y_continuous(labels = scales::number_format(accuracy = 0.01))+
theme_minimal()Biểu đồ cho thấy chi phí bán hàng của doanh nghiệp tăng liên tục. Sự tăng vọt kể từ 2021 phản ánh chiến lược mở rộng quy mô kinh doanh. Doanh nghiệp cần theo dõi sát sao hiệu quả đầu tư cho bán hàng, tránh để chi phí này tăng quá nhanh so với doanh thu, nhằm bảo vệ biên lợi nhuận.
Thống kê mô tả
thong_ke_lnhdkd <- df %>%summarise(
lnhdkd_toithieu = min(loi_nhuan_thuan_tu_hoat_dong_kinh_doanh, na.rm = TRUE),
lnhdkd_toida = max(loi_nhuan_thuan_tu_hoat_dong_kinh_doanh, na.rm = TRUE),
lnhdkd_trungbinh = mean(loi_nhuan_thuan_tu_hoat_dong_kinh_doanh, na.rm = TRUE))
print(thong_ke_lnhdkd)## # A tibble: 1 × 3
## lnhdkd_toithieu lnhdkd_toida lnhdkd_trungbinh
## <dbl> <dbl> <dbl>
## 1 48.8 590. 316.
Lợi nhuận thuần từ hoạt động kinh doanh trung bình của doanh nghiệp đạt 316 tỷ đồng/năm, dao động từ mức thấp nhất 49 tỷ đồng đến cao nhất 590 tỷ đồng. Doanh nghiệp đã có các năm hoạt động rất hiệu quả nhưng cũng có năm ít lợi nhuận hơn; cần duy trì sự ổn định và phát triển đồng đều để nâng cao kết quả kinh doanh trong dài hạn.
Biểu đồ đường xu hướng biên lợi nhuận thuần (NPM)
ggplot(df, aes(x = nam, y = bien_loi_nhuan_thuan, group = 1)) +
geom_line(color = "pink", size = 1) +
geom_point(color = "red", size = 3) +
geom_text(aes(label = scales::percent(bien_loi_nhuan_thuan, accuracy = 0.1)), vjust = -1, size = 2.5) +
labs(
title = "Biên lợi nhuận thuần từ HĐKD qua các năm",
x = "Năm",
y = "NPM (%)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Biểu đồ cho thấy biên lợi nhuận thuần của doanh nghiệp biến động mạnh qua từng năm:
Giai đoạn 2016–2017 đạt đỉnh, lần lượt 6,7% và 6,5%, phản ánh doanh nghiệp kiểm soát chi phí hiệu quả hoặc có điều kiện thị trường thuận lợi.
Năm 2018 giảm sâu xuống 2,6%, sau đó phục hồi lên 5,3% năm 2019 rồi lại giảm dần các năm tiếp.
Hai năm gần đây (2023–2024), NPM ổn định lại ở mức 2,4–2,5%.
Việc NPM phục hồi nhẹ sau năm thấp điểm thể hiện nỗ lực kiểm soát chi phí, nhưng doanh nghiệp cần tiếp tục tối ưu vận hành để nâng cao biên lợi nhuận trong các năm tới.
So sánh NPM giữa các nhóm lợi nhuận
Dòng 1-2: Phân chia dữ liệu thành các nhóm dựa trên cột “nhóm lợi nhuận”.
Dòng 3: Tính toán giá trị trung bình cho từng nhóm.
Dòng 4: Sắp xếp lại bảng kết quả và match(…) để thứ tự sắp xếp theo một logic.
npm_by_group <- df %>%
group_by(nhom_loi_nhuan) %>%
summarise(npm_trungbinh = mean(bien_loi_nhuan_gop, na.rm = TRUE)) %>%
arrange(match(nhom_loi_nhuan, c("Thấp", "Trung bình", "Cao")))
print(npm_by_group)## # A tibble: 3 × 2
## nhom_loi_nhuan npm_trungbinh
## <chr> <dbl>
## 1 Thấp 0.111
## 2 Trung bình 0.108
## 3 Cao 0.104
Kết quả thống kê cho thấy:
Nhóm lợi nhuận thấp có biên lợi nhuận gộp trung bình cao nhất ở mức 11,06%.
Nhóm trung bình đạt NPM trung bình 10,79%.
Nhóm lợi nhuận cao lại có NPM thấp nhất 10,38%.
Những năm thuộc nhóm lợi nhuận cao tổng thể lại có biên lợi nhuận gộp trung bình thấp hơn các nhóm còn lại. Do đó, doanh nghiệp cần duy trì cả hai yếu tố kiểm soát chi phí để giữ NPM ổn định và đẩy mạnh tăng trưởng quy mô nếu muốn lợi nhuận thực sự bền vững về lâu dài.
Thống kê mô tả
thong_ke_lnst <- df %>%summarise(
lnst_toithieu = min(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, na.rm = TRUE),
lnst_toida = max(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, na.rm = TRUE),
lnst_trungbinh = mean(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, na.rm = TRUE))
print(thong_ke_lnst)## # A tibble: 1 × 3
## lnst_toithieu lnst_toida lnst_trungbinh
## <dbl> <dbl> <dbl>
## 1 40.5 491. 250.
Kết quả thống kê mô tả cho thấy:
Giá trị thấp nhất là khoảng 40,5 tỷ đồng, giá trị cao nhất đạt 491 tỷ đồng, và trung bình là khoảng 250,4 tỷ đồng mỗi năm.
Điều này phản ánh mức biến động lớn của lợi nhuận ròng giữa các năm, cho thấy doanh nghiệp có các giai đoạn tích lũy tốt xen kẽ với thời kỳ lợi nhuận thấp. Doanh nghiệp đạt mức lợi nhuận sau thuế bình quân khá ổn, nhưng cần phân tích nguyên nhân những năm lợi nhuận thấp để duy trì tốc độ tăng trưởng ổn định và vững chắc hơn về lâu dài.
Biểu đồ cột lợi nhuận sau thuế
Dòng 1: Khởi tạo ggplot. Ánh xạ nam (Năm) vào trục X và (Lợi nhuận) vào trục Y.
Dòng 2: Vẽ biểu đồ cột.
Dòng 3-5: gắn nhãn giá trị tại mỗi cột. scales::comma được dùng để định dạng nhãn và vjust = -0.5 điều chỉnh nhãn.
Dòng 6-9: Đặt tiêu đề và tên cho các trục X, Y.
Dòng 10: Định dạng các số trên trục Y.
ggplot(df, aes(x = nam, y = loi_nhuan_sau_thue_thu_nhap_doanh_nghiep)) +
geom_col(fill = "skyblue", color = "black") +
geom_text(aes(label = scales::comma(loi_nhuan_sau_thue_thu_nhap_doanh_nghiep)),
vjust = -0.5, size = 3) +
labs(
title = "Lợi nhuận sau thuế TNDN qua các năm",
x = "Năm",
y = "Lợi nhuận sau thuế TNDN (tỷ đồng)" )+
scale_y_continuous(labels = scales::comma) +
theme_minimal()Biểu đồ cho thấy lợi nhuận sau thuế của doanh nghiệp có xu hướng tăng khá ổn định giai đoạn 2015–2019, đạt đỉnh 491 tỷ đồng năm 2019. Sau đó, lợi nhuận biến động mạnh: tăng - giảm xen kẽ qua các năm.
Đáng chú ý, năm 2022 lợi nhuận giảm rất mạnh chỉ còn 117,3 tỷ đồng, thấp so với các năm trước, cho thấy doanh nghiệp có thể đã gặp khó khăn đột biến (như tăng chi phí, giảm biên lợi nhuận, hoặc thị trường bất lợi). Tuy nhiên, sang 2023–2024, lợi nhuận phục hồi trở lại về mức trên 309 tỷ đồng mỗi năm.
Doanh nghiệp có khả năng phục hồi tốt sau năm suy giảm, nhưng biến động mạnh của lợi nhuận là tín hiệu cần lưu ý để tiếp tục nâng cao hiệu quả quản trị rủi ro và ổn định kết quả kinh doanh trong tương lai.
Biểu đồ cột tăng trưởng LNST (YoY)
Dòng 1-3: Khởi tạo ggplot. Ánh xạ nam vào trục X, tang_truong_lnst_yoy vào trục , đặt màu tô (fill) dựa trên điều kiện (tăng trưởng > 0 hay không). geom_col() vẽ biểu đồ cột.
Dòng 4: Vẽ đường tham chiếu.
Dòng 5: Tùy chỉnh màu tô.
Dòng 6-7: Thêm nhãn số liệu, scales::percent định dạng nhãn thành phần trăm. vjust = ifelse(…) điều chỉnh vị trí nhãn: Nếu tăng trưởng dương, đẩy nhãn lên trên (-0.5); nếu âm, đẩy nhãn xuống dưới (1.5).
Dòng 7-12: Đặt tiêu đề/nhãn trục. scale_y_continuous định dạng trục Y thành phần trăm.
ggplot(df, aes(x = nam, y = tang_truong_lnst_yoy,
fill = tang_truong_lnst_yoy > 0)) +
geom_col() +
geom_hline(yintercept = 0, color = "black", linetype = "solid") +
scale_fill_manual(values = c("TRUE" = "darkgreen", "FALSE" = "red")) +
geom_text(aes(label = scales::percent(tang_truong_lnst_yoy, accuracy = 0.1)),
vjust = ifelse(df$tang_truong_lnst_yoy > 0, -0.5, 1.5), size = 3) +
labs(
title = "Tốc độ tăng trưởng lợi nhuận sau thuế TNDN (YoY)",
x = "Năm",
y = "Tăng trưởng (%)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal() +
theme(legend.position = "none")Biểu đồ cho thấy tốc độ tăng trưởng lợi nhuận sau thuế TNDN qua các năm dao động rất lớn:
Nhiều năm tăng trưởng vượt trội: 2016, 2017, 2019, 2023. Những năm này doanh nghiệp tận dụng hiệu quả điều kiện thị trường.
Các năm tăng trưởng âm rõ rệt: 2018, 2020, 2022. Đặc biệt, năm 2022 giảm sâu nhất, cho thấy khó khăn lớn như thị trường tiêu thụ yếu, chi phí tăng cao hoặc phát sinh sự cố bất thường.
Doanh nghiệp có khả năng hồi phục nhanh sau kỳ suy giảm, đồng thời tận dụng tốt thời kỳ thuận lợi để tăng trưởng mạnh. Tuy nhiên, lợi nhuận biến động mạnh qua các năm là điểm cần chú ý, doanh nghiệp nên tiếp tục kiểm soát rủi ro và ổn định kết quả tài chính.
Thống kê mô tả
thong_ke_tai_san <- df %>%
summarise(
ts_trungbinh = mean(tong_cong_tai_san, na.rm = TRUE),
ts_toithieu = min(tong_cong_tai_san, na.rm = TRUE),
ts_toida = max(tong_cong_tai_san, na.rm = TRUE),
ts_dolechchuan = sd(tong_cong_tai_san, na.rm = TRUE))
print(thong_ke_tai_san)## # A tibble: 1 × 4
## ts_trungbinh ts_toithieu ts_toida ts_dolechchuan
## <dbl> <dbl> <dbl> <dbl>
## 1 7985. 1955. 13768. 3815.
Tổng tài sản trung bình của doanh nghiệp đạt khoảng 7.985 tỷ đồng, với giá trị thấp nhất là 1.955 tỷ và cao nhất là 13.768 tỷ đồng. Độ lệch chuẩn lớn (3.815 tỷ) phản ánh quy mô tài sản biến động khá mạnh trong giai đoạn phân tích, cho thấy doanh nghiệp liên tục mở rộng quy mô hoạt động.
Biểu đồ cột thể hiện xu hướng tổng tài sản theo năm
Dòng 1: Khởi tạo ggplot. Ánh xạ nam (Năm) vào trục X và tong_cong_tai_san (Tổng tài sản) vào trục Y.
Dòng 2: Vẽ biểu đồ cột. Đặt màu tô là lightgreen.
Dòng 3-7: aes(y = … / 2) đặt vị trí của nhãn ở giữa chiều cao của cột (bằng cách lấy giá trị Y chia 2). label = round(…): Định dạng nhãn là giá trị Tổng tài sản, làm tròn 1 chữ số thập phân. angle = 90: Xoay nhãn 90 độ (dọc) để đọc từ dưới lên.
Dòng 8-11: Đặt tiêu đề/nhãn trục.
Dòng 12-13: Căn giữa tiêu đề (hjust = 0.5), đặt tiêu đề in đậm, và tăng cỡ chữ cho tiêu đề và trục X.
ggplot(df, aes(x = nam, y = tong_cong_tai_san)) +
geom_col(fill = "lightgreen") +
geom_text(
aes(y = tong_cong_tai_san / 2,
label = round(tong_cong_tai_san, 1)),
color = "black", size = 3.8,
, vjust = 0.5, angle = 90 ) +
labs(
title = "Tổng tài sản theo từng năm",
x = "Năm",
y = "Tổng tài sản (tỷ đồng)") +
theme_minimal(base_family = "Times New Roman") +
theme(
plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
axis.text.x = element_text(size = 12))Biểu đồ cho thấy tổng tài sản của doanh nghiệp tăng trưởng liên tục qua các năm, nổi bật ở các giai đoạn 2018–2024 với tốc độ tăng mạnh mẽ.
Đà tăng trưởng tổng tài sản như vậy cho thấy sức khỏe tài chính của doanh nghiệp tốt, có khả năng thu hút vốn, đầu tư máy móc trang thiết bị hoặc bất động sản, xây dựng nền tảng tài chính vững chắc cho tương lai.
Biểu đồ đường xu hướng ROA
ggplot(df, aes(x = nam, y = roa, group = 1)) +
geom_line(color = "green", size = 1) +
geom_point(color = "red", size = 3) +
geom_text(aes(label = scales::percent(roa, accuracy = 0.1)),
vjust = -2, size = 3) +
labs(
title = "Tỷ suất sinh lời trên tổng tài sản qua các năm",
x = "Năm",
y = "ROA (%)") +
scale_y_continuous(labels = scales::percent) +
theme_minimal()Biểu đồ thể hiện tỷ suất sinh lời trên tổng tài sản (ROA) qua các năm của doanh nghiệp biến động mạnh:
Giai đoạn 2015–2017: ROA tăng nhanh từ 2,1% lên 5,8%, phản ánh khả năng tận dụng tài sản tốt để sinh lợi.
Năm 2018: ROA giảm rõ rệt về 2,8%, cho thấy hiệu suất sử dụng tài sản suy giảm hoặc doanh nghiệp gặp biến động bất lợi.
Năm 2019: Doanh nghiệp phục hồi mạnh, ROA đạt đỉnh 6,1%.
Sau đó, ROA giảm liên tục, đặc biệt năm 2022 chỉ còn 1,1%, mức thấp nhất toàn kỳ.
Giai đoạn 2023–2024, ROA phục hồi nhẹ lên 2,7% và 2,3%, nhưng vẫn thấp so với các năm đầu kỳ.
ROA biến động phản ánh hiệu quả sử dụng tài sản chưa ổn định. Giai đoạn đầu và giữa kỳ doanh nghiệp sinh lợi tốt trên tài sản, nhưng các năm gần đây cần kiểm soát chi phí, tối ưu tài sản và đầu tư hiệu quả hơn để nâng ROA.
So sánh ROA trung bình theo nhóm lợi nhuận
roa_by_group <- df %>%
group_by(nhom_loi_nhuan) %>%
summarise(roa_trungbinh = mean(roa, na.rm = TRUE)) %>%
arrange(match(nhom_loi_nhuan, c("Thấp", "Trung bình", "Cao")))
print(roa_by_group)## # A tibble: 3 × 2
## nhom_loi_nhuan roa_trungbinh
## <chr> <dbl>
## 1 Thấp 0.0260
## 2 Trung bình 0.0396
## 3 Cao 0.0359
Bảng phân tích cho thấy:
Nhóm lợi nhuận thấp có ROA trung bình 2,6%.
Nhóm lợi nhuận trung bình và nhóm cao đều có ROA trung bình gần bằng nhau (khoảng 4,0%).
Hiệu suất sử dụng tài sản (ROA) của doanh nghiệp tăng khi chuyển từ nhóm lợi nhuận thấp sang nhóm trung bình/cao. Tuy nhiên, sự khác biệt giữa nhóm Trung bình và Cao không đáng kể. Điều này gợi ý rằng việc duy trì hiệu quả sử dụng tài sản giúp kết quả lợi nhuận ổn định ở mức khá và cao; ngược lại, nếu hiệu suất tài sản thấp thì khả năng sinh lợi ròng cũng sẽ bị hạn chế rõ rệt.
ket_qua_nhom <- df %>%
group_by(nhom_loi_nhuan) %>%
summarise(tb_doanhthu = mean(doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, na.rm = TRUE),
tb_bienln_gop = mean(bien_loi_nhuan_gop, na.rm = TRUE),
tb_roa = mean(roa, na.rm = TRUE)
) %>%
arrange(match(nhom_loi_nhuan, c("Thấp", "Trung bình", "Cao")))
print(ket_qua_nhom)## # A tibble: 3 × 4
## nhom_loi_nhuan tb_doanhthu tb_bienln_gop tb_roa
## <chr> <dbl> <dbl> <dbl>
## 1 Thấp 6350. 0.111 0.0260
## 2 Trung bình 6503. 0.108 0.0396
## 3 Cao 11951. 0.104 0.0359
Bảng này cho thấy rõ ràng về chiến lược hoạt động của AAA:
Các năm lợi nhuận Cao chủ yếu nhờ quy mô. Doanh thu trung bình (11,951 tỷ) cao vượt trội, bất chấp việc phải hy sinh hiệu quả (Biên LN Gộp 10.38% là thấp nhất).
Lợi nhuận thấp chủ yếu là do hiệu quả sử dụng tài sản kém. ROA trung bình chỉ đạt 2.60%, dù công ty vẫn quản lý giá vốn tốt nhất (Biên LN Gộp 11.06%).
Kết luận: Động lực lợi nhuận chính của AAA là đẩy mạnh doanh thu, và rủi ro lớn nhất là hiệu suất sử dụng tài sản (ROA) kém trong những năm khó khăn.
Thống kê các tỷ lệ chi phí
## # A tibble: 10 × 4
## nam tyle_cpbh tyle_cpql tyle_cptc
## <fct> <dbl> <dbl> <dbl>
## 1 2015 0.0466 0.0258 0.0310
## 2 2016 0.0265 0.0292 0.0252
## 3 2017 0.0260 0.0195 0.0234
## 4 2018 0.0195 0.0154 0.0260
## 5 2019 0.0232 0.0161 0.0289
## 6 2020 0.0344 0.0225 0.0308
## 7 2021 0.0562 0.0148 0.0152
## 8 2022 0.0436 0.0162 0.0168
## 9 2023 0.0405 0.0226 0.0190
## 10 2024 0.0561 0.0298 0.0157
Tỷ lệ chi phí bán hàng tăng mạnh sau 2020, chứng tỏ doanh nghiệp phải chi nhiều hơn cho bán hàng và tiếp thị.
Chi phí quản lý doanh nghiệp giảm dần nhưng tăng nhẹ cuối kỳ, phản ánh giai đoạn tối ưu bộ máy và có năm đột biến.
Chi phí tài chính giảm rõ nét, cho thấy doanh nghiệp kiểm soát tốt nợ vay và chi phí lãi.
Kết luận: Cơ cấu chi phí thay đổi theo thời gian, cần chú trọng hiệu quả đầu tư cho bán hàng và kiểm soát chi phí quản lý để bảo vệ lợi nhuận
Biểu đồ so sánh 3 loại chi phí
geom_col(position = “dodge”, width = 0.8): vẽ biểu đồ cột nhóm
aes(y = TyLe / 2): Chúng ta ghi đè giá trị y (kế thừa từ ggplot()) trong geom_text(). Bằng cách đặt y bằng một nửa giá trị Tyle, chúng ta xác định vị trí neo của văn bản là chính giữa chiều cao của cột.
vjust = 0.5: Kết hợp với angle = 90, vjust = 0.5 đảm bảo văn bản được căn chính giữa theo chiều dọc (đối với văn bản đã xoay).
data_costs_long <- data_costs %>%
pivot_longer(
cols = c(tyle_cpbh, tyle_cpql, tyle_cptc),
names_to = "LoaiChiPhi",
values_to = "TyLe" )
ggplot(data_costs_long, aes(x = nam, y = TyLe, fill = LoaiChiPhi)) +
geom_col(position = "dodge", width = 0.8) +
geom_text(aes(label = scales::percent(TyLe, accuracy = 0.1),
group = LoaiChiPhi, y = TyLe / 2),
position = position_dodge(width = 0.8),
angle = 90, vjust = 0.5,color = "black", size = 3.5 ) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "So sánh 3 loại chi phí trên doanh thu thuần",
x = "Năm",
y = "Tỷ lệ Chi phí / Doanh thu (%)",
fill = "Loại Chi phí") +
theme_minimal()Chi phí bán hàng tăng mạnh sau 2020, vượt 5% doanh thu, gây áp lực lớn lên lợi nhuận.
Chi phí quản lý giảm rõ rệt từ 2016–2021, nhưng có dấu hiệu tăng lại ở 2023–2024.
Chi phí tài chính giảm dần, xuống quanh 1,6–2% doanh thu các năm gần đây.
Doanh nghiệp kiểm soát tốt chi phí quản lý và tài chính, nhưng cần thận trọng với chi phí bán hàng để bảo vệ hiệu quả lợi nhuận.
Tính hệ số tương quan
correlation <- cor(df$doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, df$loi_nhuan_sau_thue_thu_nhap_doanh_nghiep, use = "complete.obs")
print(correlation)## [1] 0.395683
Kết quả hệ số đạt 0,396 – tức là mức tương quan dương, trung bình yếu.
Doanh thu tăng thường đi kèm với khả năng tăng lợi nhuận, nhưng mối liên hệ này chưa thực sự chặt chẽ. Đây là dấu hiệu cho thấy ngoài doanh thu, còn nhiều yếu tố khác (chẳng hạn chi phí giá vốn, chi phí bán hàng, chi phí tài chính, hiệu quả quản lý, các khoản thu nhập/chi phí bất thường…) tác động đáng kể đến lợi nhuận ròng.
Biểu đồ mối tương quan giữa doanh thu và lợi nhuận
geom_point(): Vẽ các điểm dữ liệu.
geom_smooth(method = “lm”, se = FALSE): vẽ một đường xu hướng hồi quy tuyến tính qua các điểm dữ liệu, đồng thời tắt (se = FALSE) việc hiển thị dải tin cậy (vùng xám).
Sử dụng scales::comma để thêm dấu phẩy vào các con số trên trục và áp dụng giao diện theme_minimal() (nền trắng).
ggplot(df, aes(x = doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, y = loi_nhuan_sau_thue_thu_nhap_doanh_nghiep)) +
geom_point(color = "darkblue", size = 3) +
geom_smooth(method = "lm", color = "red", se = FALSE) +
labs(
title = "Mối tương quan giữa doanh thu và lợi nhuận",
x = "Doanh thu thuần (tỷ đồng)",
y = "Lợi nhuận sau thuế (tỷ đồng)" ) +
scale_x_continuous(labels = scales::comma) +
scale_y_continuous(labels = scales::comma) +
theme_minimal()
Biểu đồ minh họa mối tương quan giữa doanh thu thuần và lợi nhuận sau
thuế là mối liên hệ cùng chiều. Cho thấy khi doanh thu tăng thì lợi
nhuận sau thuế cũng tăng theo, nhưng mức tăng không đồng đều giữa các
quan sát.
Các điểm phân tán xa so với đường hồi quy: Lợi nhuận thực tế của doanh nghiệp trong nhiều năm bị ảnh hưởng mạnh bởi các yếu tố khác ngoài doanh thu (như giá vốn, chi phí hoạt động, tài chính, chi phí bất thường hoặc biến động từng năm).
Biểu đồ scatter plot doanh thu – lợi nhuận và phân nhóm theo mức lợi nhuận
Dòng 1: ggrepel để chống các nhãn văn bản chồng chéo lên nhau và khởi tạo biểu đồ.
Dòng 4: Thêm lớp geom_point (các chấm), nđiều khiển cả màu sắc và hình dạng của điểm dữ liệu dựa trên giá trị.
Dòng 6: Thêm đường hồi quy tuyến tính lm màu xám, nét đứt, và ẩn dải tin cậy.
Dòng 7: Gắn nhãn (label) cho mỗi điểm bằng giá trị của cột nam (Năm). geom_text_repel sẽ tự động đẩy các nhãn ra xa nhau để không bị đè lên nhau.
Dòng 8-15: Dùng labs để đặt tiêu đề và tên cho các trục và chú giải. scale_x/y_continuous dùng scales::comma để thêm dấu phẩy vào các số trên trục.
library(ggrepel)
ggplot(df, aes(x = doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu, y = loi_nhuan_sau_thue_thu_nhap_doanh_nghiep)) +
geom_point(aes(color = nhom_loi_nhuan, shape = nhom_loi_nhuan), size = 4, alpha = 0.8) +
geom_smooth(method = "lm", se = FALSE, color = "gray", linetype = "dashed") +
geom_text_repel(aes(label = nam), size = 3, vjust = -1.5) +
labs(
title = "Phân nhóm lợi nhuận trên đồ thị doanh thu – lợi nhuận",
x = "Doanh thu thuần (tỷ đồng)",
y = "Lợi nhuận sau thuế (tỷ đồng)",
color = "Nhóm lợi nhuận",
shape = "Nhóm lợi nhuận") +
scale_x_continuous(labels = scales::comma) +
scale_y_continuous(labels = scales::comma) +
theme_minimal()Biểu đồ này minh họa rất rõ:
Nhóm cao : vừa có doanh thu lớn vừa tối ưu hiệu quả sinh lời. Những năm này không chỉ doanh thu tăng mà doanh nghiệp còn kiểm soát tốt biên lợi nhuận.
Nhóm trung bình: nằm quanh đường xu hướng, minh họa các năm hoạt động ổn định, doanh thu và lợi nhuận đi cùng nhau.
Nhóm thấp ,đặc biệt năm 2022: cho thấy tình trạng doanh thu tăng nhưng lợi nhuận không tương ứng.
Biểu đồ giúp nhận diện ngoại lệ và nhấn mạnh rằng việc kiểm soát chi phí, nâng cao biên lợi nhuận đóng vai trò quyết định chuyển hóa doanh thu thành lợi nhuận
Tải thư viện corrplot. Sau đó, select () các cột tài chính cụ thể cần phân tích từ df và colnames (đổi tên) chúng thành các tên viết tắt (như GPM, ROA) cho dễ đọc.
Sử dụng hàm cor() để tính Ma trận Tương quan (M) (hệ số Pearson) giữa tất cả các cột đã chọn, loại bỏ các hàng bị thiếu dữ liệu (complete.obs).
Sử dụng hàm corrplot() để vẽ ma trận tương quan đó. Cụ thể, method = “color” dùng màu sắc để biểu thị độ mạnh/yếu của tương quan, và addCoef.col = “black” in các con số hệ số trực tiếp lên các ô màu.
library(corrplot)
df_corr <- df %>%
select( doanh_thu_thuan_ve_ban_hang_va_cung_cap_dich_vu,
bien_loi_nhuan_gop, bien_loi_nhuan_thuan, roa, tyle_cpbh,tyle_cpql,tyle_cptc)
colnames(df_corr) <- c("DoanhThu", "GPM", "NPM", "ROA",
"TyLe_CPBH", "TyLe_CPQL", "TyLe_CPTC")
M <- cor(df_corr, use = "complete.obs")
print(M)## DoanhThu GPM NPM ROA TyLe_CPBH TyLe_CPQL
## DoanhThu 1.0000000 -0.7407840 -0.6669786 -0.4337326 0.4778269 -0.39674869
## GPM -0.7407840 1.0000000 0.8402254 0.6504043 -0.1987454 0.58355626
## NPM -0.6669786 0.8402254 1.0000000 0.9067435 -0.6226288 0.22146673
## ROA -0.4337326 0.6504043 0.9067435 1.0000000 -0.6156883 -0.10266325
## TyLe_CPBH 0.4778269 -0.1987454 -0.6226288 -0.6156883 1.0000000 0.23354852
## TyLe_CPQL -0.3967487 0.5835563 0.2214667 -0.1026632 0.2335485 1.00000000
## TyLe_CPTC -0.7498780 0.3287060 0.4319612 0.3666444 -0.6053109 0.08853647
## TyLe_CPTC
## DoanhThu -0.74987805
## GPM 0.32870598
## NPM 0.43196124
## ROA 0.36664436
## TyLe_CPBH -0.60531089
## TyLe_CPQL 0.08853647
## TyLe_CPTC 1.00000000
corrplot(M, method = "color", addCoef.col = "black", number.cex = 0.8,
title = "Ma trận tương quan các chỉ số tài chính", mar = c(0,0,1,0))Phân tích ma trận tương quan cho thấy rõ ràng về chiến lược kinh doanh của An Phát Xanh. Mối tương quan âm rất mạnh (-0.74) giữa Doanh thu và GPM (Biên lợi nhuận gộp) chỉ ra rằng khi công ty đẩy mạnh doanh số, họ chấp nhận hy sinh biên lợi nhuận trên từng sản phẩm. Đây là một chiến lược “lấy số lượng bù chất lượng” điển hình, khi công ty chấp nhận lợi nhuận mỏng hơn để giành thị phần và mở rộng quy mô. Xu hướng này cũng được khẳng định khi doanh thu tăng lên cũng kéo theo NPM (Lợi nhuận ròng, -0.67) và ROA (Hiệu suất tài sản, -0.43) giảm theo.
Có một điểm tích cực về sức khỏe tài chính là khả năng quản lý nợ vay hiệu quả. Mối tương quan âm rất mạnh (-0.75) giữa DoanhThu và TyLe_CPTC (Tỷ lệ chi phí tài chính) là một dấu hiệu tốt. Nó cho thấy doanh thu đang tăng trưởng nhanh hơn gánh nặng lãi vay.
Về mặt hiệu quả hoạt động, ma trận đã chỉ ra chi phí quản lý dường như không ảnh hưởng nhiều đến lợi nhuận, thì tỷ lệ chi phí bán hàng lại cho thấy tương quan âm mạnh (-0.62) với cả NPM và ROA. Điều này có nghĩa là chi phí bán hàng là yếu tố “ăn mòn” lợi nhuận nhiều nhất. Đây là một điểm rò rỉ lợi nhuận quan trọng mà công ty cần tối ưu hóa để cải thiện hiệu quả tài chính tổng thể.
Cốt lõi mô hình kinh doanh của AAA vẫn rất chặt chẽ và nhất quán. Các mối tương quan dương rất mạnh giữa GPM và NPM (0.84), và đặc biệt là giữa NPM và ROA (0.91). Cho thấy khi công ty tạo ra được một đồng lợi nhuận ròng, đồng đó được chuyển hóa thành hiệu suất sinh lời trên tổng tài sản. Điều này cho thấy nền tảng kinh doanh của công ty là vững chắc.
Doanh nghiệp tăng trưởng mạnh về quy mô tài sản và doanh thu trong giai đoạn 2015–2024, thể hiện năng lực mở rộng sản xuất kinh doanh và vị thế ngày càng cao trên thị trường.
Hiệu quả sinh lời, gồm biên lợi nhuận gộp, biên lợi nhuận thuần và ROA từng thời kỳ biến động lớn do chi phí bán hàng, chi phí tài chính và tỷ lệ giá vốn/doanh thu tăng mạnh ở một số năm.
Chi phí bán hàng là yếu tố ảnh hưởng lớn nhất đến khả năng sinh lợi; tỷ lệ chi phí này tăng sau năm 2020 đã gây sức ép lên lợi nhuận, dù doanh thu vẫn tăng trưởng.
Từ phân tích ma trận tương quan, việc doanh thu tăng vẫn chưa chuyển hóa thành tăng lợi nhuận nếu doanh nghiệp không kiểm soát tốt chi phí. Quản trị tài sản, tối ưu chi phí, duy trì hiệu quả vận hành là định hướng ưu tiên giúp doanh nghiệp đạt kết quả tài chính bền vững hơn.
An Phát Xanh đã xây dựng được tiềm lực tài chính vững chắc và nắm bắt tốt cơ hội thị trường, nhưng cần tiếp tục cải thiện hiệu quả sử dụng tài sản, kiểm soát chi phí bán hàng, tài chính, để nâng cao biên lợi nhuận – đảm bảo vừa tăng trưởng quy mô vừa duy trì hiệu quả sinh lời ổn định và an toàn dài hạn.