Trong suốt quá trình thực hiện bài luận môn Ngôn ngữ lập trình, nhóm chúng em xin bày tỏ lòng biết ơn sâu sắc đến thầy Trần Mạnh Tường, người đã tận tình hướng dẫn, cung cấp kiến thức và định hướng cho chúng em trong suốt học kỳ vừa qua. Những bài giảng, góp ý và sự hỗ trợ quý báu của thầy là nền tảng quan trọng giúp chúng em hoàn thành bài luận này một cách hiệu quả và đúng hướng.
Chúng em ý thức rằng bài luận này khó tránh khỏi những thiếu sót nhất định do hạn chế về thời gian, kinh nghiệm và kiến thức thực tiễn. Rất mong nhận được những nhận xét và góp ý chân thành từ thầy để nhóm có thể rút kinh nghiệm, hoàn thiện bản thân và nâng cao hơn nữa năng lực học tập trong tương lai.
Cuối cùng, nhóm xin gửi lời tri ân sâu sắc đến thầy vì đã luôn tận tâm giảng dạy, truyền đạt kiến thức và truyền cảm hứng trong suốt quá trình học tập. Kính chúc thầy sức khỏe dồi dào, tinh thần nhiệt huyết và nhiều thành công trên con đường sự nghiệp của mình.
Nhóm chúng em xin cam kết rằng toàn bộ nội dung trong bài tiểu luận ngôn ngữ lập trình là kết quả nghiên cứu, xử lý và trình bày của chính nhóm, không sao chép hay vi phạm bản quyền dưới bất kỳ hình thức nào.
Các số liệu, bảng biểu và kết quả phân tích trong bài đều được thu thập từ báo cáo tài chính hợp nhất của Công ty Cổ phần Sữa Việt Nam (Vinamilk – VNM) và bộ dữ liệu “Crime Data from 2020 to Present” (nguồn Kaggle, trích xuất từ LAPD), được xử lý một cách trung thực, khách quan và minh bạch bằng các công cụ phân tích và trực quan hóa dữ liệu.
Bài tiểu luận bao gồm 2 phần:
Phần I: Phân tích dữ liệu tội phạm tại Los Angeles giai đoạn 2020 - 2023
Phần II: Phân tích dữ liệu tài chính Công ty Cổ phần Sữa Việt Nam (VNM) giai đoạn 2015 - 2024
Trong bối cảnh xã hội hiện đại, tội phạm không chỉ là vấn đề pháp lý mà còn là một hiện tượng xã hội phản ánh nhiều chiều cạnh của đời sống kinh tế, chính trị và văn hóa. Los Angeles – một trong những đô thị lớn nhất và đa dạng nhất của Hoa Kỳ – luôn được xem là “tấm gương phản chiếu” của các biến động xã hội, đặc biệt trong giai đoạn 2020–2023.
Đây là giai đoạn chịu ảnh hưởng nặng nề bởi đại dịch COVID-19, khủng hoảng kinh tế – việc làm, thay đổi chính sách an ninh công cộng và sự phát triển nhanh của công nghệ. Những yếu tố này tác động mạnh đến hành vi con người, mô hình cư trú, cũng như cấu trúc xã hội từ đó làm thay đổi bản chất và xu hướng của tội phạm.
Việc phân tích đa chiều về tội phạm tại Los Angeles không chỉ giúp nhận diện được xu hướng biến động theo thời gian và không gian, mà còn góp phần đánh giá các yếu tố xã hội – kinh tế – chính sách có ảnh hưởng đến tình hình an ninh đô thị. Đề tài này mang tính thực tiễn cao, hỗ trợ cơ quan quản lý, nhà nghiên cứu, và cộng đồng trong việc hoạch định các giải pháp phòng ngừa tội phạm và đảm bảo an ninh xã hội bền vững.
Đối tượng nghiên cứu: Tình hình tội phạm tại thành phố Los Angeles, bao gồm các loại hình tội phạm (bạo lực, trộm cắp, xâm hại, ma túy, gian lận,….) và các yếu tố xã hội có ảnh hưởng.
Phạm vi nghiên cứu: Thành phố Los Angeles, bang California, Hoa Kỳ. Từ năm 2020 đến năm 2023 – giai đoạn có biến động mạnh về kinh tế – xã hội do đại dịch và thay đổi chính sách.
Phạm vi dữ liệu: Bộ dữ liệu Los Angeles Crime Data do LAPD (Los Angeles Police Department) công bố công khai, kết hợp với các nguồn dữ liệu phụ trợ như dân số, thu nhập bình quân, tỷ lệ thất nghiệp và dữ liệu COVID-19.
Bộ dữ liệu “Crime Data from 2020 to Present” được thu thập từ nguồn Kaggle, trích xuất từ LAPD, phản ánh tình hình tội phạm tại thành phố Los Angeles trong giai đoạn từ năm 2020 đến năm 2024.
Sau khi kiểm tra và làm sạch, bộ dữ liệu còn lại 760.049 quan sát (dòng dữ liệu), tương ứng với các vụ phạm tội riêng lẻ và 12 biến (cột dữ liệu) chính phục vụ phân tích, bao gồm: date, area, district, severity, crime_type, age, sex, premise_type, status, lalat, lon, year.
Mỗi dòng trong bộ dữ liệu thể hiện một sự kiện phạm tội cụ thể bao gồm thông tin về loại tội phạm, khu vực xảy ra, thời gian, giới tính và độ tuổi của nạn nhân, cùng với toạ độ địa lý của vụ án.
Giải thích kỹ thuật:
library(readxl): nạp gói readxl – một thư viện trong R dùng để đọc dữ liệu từ file Excel (.xls hoặc .xlsx).
read_excel("..."): đọc toàn bộ dữ liệu từ đường dẫn được chỉ định và lưu vào đối tượng df.
Hàm này tự động nhận diện kiểu dữ liệu của từng cột (số, ký tự, ngày,...).
Kết quả là một bảng dữ liệu (data frame) chứa toàn bộ thông tin về các vụ phạm tội tại Los Angeles.
Giải thích kỹ thuật:
head(df) hiển thị 6 dòng đầu tiên trong bộ dữ liệu.
tail(df) hiển thị 6 dòng cuối cùng trong cùng bộ dữ liệu.
Hai hàm này giúp ta xem nhanh cấu trúc dữ liệu — gồm các biến có trong tập dữ liệu, tên cột, kiểu dữ liệu (số, ký tự, ngày tháng) và cách dữ liệu được lưu trữ. Đây là bước cơ bản để đảm bảo dữ liệu đã được đọc đúng định dạng.
## [1] 944235
## [1] 28
Giải thích kỹ thuật:
nrow(df) trả về số lượng dòng trong bộ dữ liệu df, tức là tổng số vụ án được ghi nhận.
ncol(df) trả về số lượng cột, tức là tổng số biến mô tả thông tin của mỗi vụ án.
Ý nghĩa thống kê:
Kết quả cho thấy bộ dữ liệu ghi nhận 944.235 vụ án với 28 đặc trưng mô tả cho mỗi vụ (chẳng hạn như thời gian, địa điểm, loại tội phạm, độ tuổi, giới tính,…).
## [1] "DR_NO" "Date Rptd" "DATE OCC" "TIME OCC"
## [5] "AREA" "AREA NAME" "Rpt Dist No" "Part 1-2"
## [9] "Crm Cd" "Crm Cd Desc" "Mocodes" "Vict Age"
## [13] "Vict Sex" "Vict Descent" "Premis Cd" "Premis Desc"
## [17] "Weapon Used Cd" "Weapon Desc" "Status" "Status Desc"
## [21] "Crm Cd 1" "Crm Cd 2" "Crm Cd 3" "Crm Cd 4"
## [25] "LOCATION" "Cross Street" "LAT" "LON"
Giải thích kỹ thuật:
Lệnh names(df) giúp liệt kê toàn bộ tên các biến (cột) trong bộ dữ liệu.
## tibble [944,235 × 28] (S3: tbl_df/tbl/data.frame)
## $ DR_NO : num [1:944235] 1.90e+08 2.00e+08 2.00e+08 2.01e+08 2.21e+08 ...
## $ Date Rptd : POSIXct[1:944235], format: "2020-01-03" "2020-09-02" ...
## $ DATE OCC : POSIXct[1:944235], format: "2020-01-03" "2020-08-02" ...
## $ TIME OCC : num [1:944235] 2130 1800 1700 2037 1200 ...
## $ AREA : num [1:944235] 7 1 3 9 6 18 1 3 13 19 ...
## $ AREA NAME : chr [1:944235] "Wilshire" "Central" "Southwest" "Van Nuys" ...
## $ Rpt Dist No : num [1:944235] 784 182 356 964 666 ...
## $ Part 1-2 : num [1:944235] 1 1 1 1 2 2 2 2 2 2 ...
## $ Crm Cd : num [1:944235] 510 330 480 343 354 354 354 354 354 624 ...
## $ Crm Cd Desc : chr [1:944235] "VEHICLE - STOLEN" "BURGLARY FROM VEHICLE" "BIKE - STOLEN" "SHOPLIFTING-GRAND THEFT ($950.01 & OVER)" ...
## $ Mocodes : chr [1:944235] NA "1822 1402 0344" "0344 1251" "0325 1501" ...
## $ Vict Age : num [1:944235] 0 47 19 19 28 41 25 27 24 26 ...
## $ Vict Sex : chr [1:944235] "M" "M" "X" "M" ...
## $ Vict Descent : chr [1:944235] "O" "O" "X" "O" ...
## $ Premis Cd : num [1:944235] 101 128 502 405 102 501 502 248 750 502 ...
## $ Premis Desc : chr [1:944235] "STREET" "BUS STOP/LAYOVER (ALSO QUERY 124)" "MULTI-UNIT DWELLING (APARTMENT, DUPLEX, ETC)" "CLOTHING STORE" ...
## $ Weapon Used Cd: num [1:944235] NA NA NA NA NA NA NA NA NA 400 ...
## $ Weapon Desc : chr [1:944235] NA NA NA NA ...
## $ Status : chr [1:944235] "AA" "IC" "IC" "IC" ...
## $ Status Desc : chr [1:944235] "Adult Arrest" "Invest Cont" "Invest Cont" "Invest Cont" ...
## $ Crm Cd 1 : num [1:944235] 510 330 480 343 354 354 354 354 354 624 ...
## $ Crm Cd 2 : num [1:944235] 998 998 NA NA NA NA NA NA NA NA ...
## $ Crm Cd 3 : num [1:944235] NA NA NA NA NA NA NA NA NA NA ...
## $ Crm Cd 4 : logi [1:944235] NA NA NA NA NA NA ...
## $ LOCATION : chr [1:944235] "1900 S LONGWOOD AV" "1000 S FLOWER ST" "1400 W 37TH ST" "14000 RIVERSIDE DR" ...
## $ Cross Street : chr [1:944235] NA NA NA NA ...
## $ LAT : chr [1:944235] "340375" "340444" "34021" "341576" ...
## $ LON : chr [1:944235] "-1183506" "-1182628" "-1183002" "-1184387" ...
Giải thích kỹ thuật:
Hàm str() hiển thị cấu trúc chi tiết của từng biến, bao gồm tên, kiểu dữ liệu và một vài giá trị mẫu.
1. classes <- sapply(df, class)
2. matrix_view <- matrix(paste(names(classes), ":", classes),
3. ncol = 4, byrow = TRUE)
4. data.frame(matrix_view) Giải thích kỹ thuật:
Dòng 1: áp dụng class() cho từng cột của df; kết quả là vector ký tự có tên, mỗi phần tử là kiểu dữ liệu của một biến.
Dòng 2: ghép chuỗi dạng "tên biến : kiểu dữ liệu" rồi xếp vào ma trận 4 cột, điền theo hàng (trái→phải, rồi xuống dòng).
Dòng 3: chuyển ma trận trên thành bảng (data.frame).
Ý nghĩa thống kê:
Dựa trên kết quả kiểm tra kiểu dữ liệu, ta có thể phân loại các biến trong bộ dữ liệu như sau:
Biến định lượng: TIME OCC, Vict Age, AREA, Crm Cd, Crm Cd 1, Crm Cd 2, Crm Cd 3, Premis Cd, Weapon Used Cd.
Biến định tính: AREA NAME, Crm Cd Desc, Vict Sex, Vict Descent, Premis Desc, Weapon Desc, Status, Status Desc, LOCATION, Cross Street.
Biến thời gian: Date Rptd, DATE OCC.
Biến vị trí địa lý: LAT, LON.
Biến logic: Crm Cd 4.
Từ bộ dữ liệu gốc, chúng em sẽ tiến hành lựa chọn và đổi tên 11 biến quan trọng cần cho bài nghiên cứu. Các biến được đặt lại tên ngắn gọn, dễ hiểu.
1. crime_data <- df %>%
2. select(`DATE OCC`,`AREA NAME`,`Part 1-2`,`Crm Cd Desc`,`Vict Age`,`Vict Sex`,`Weapon Desc`, `Status Desc`,`LAT`,`LON`) %>%
3. rename(
4. date = `DATE OCC`,
5. area = `AREA NAME`,
6. severity = `Part 1-2`,
7. crime_type = `Crm Cd Desc`,
8. age = `Vict Age`,
9. sex = `Vict Sex`,
10. weapon = `Weapon Desc`,
11. status = `Status Desc`,
12. lat = `LAT`,
13. lon = `LON`)Giải thích kỹ thuật:
Dòng 2: giữ nguyên thứ tự cột đã liệt kê và loại bỏ các cột không nêu.
Dòng 4: dùng cú pháp tên_mới = tên_cũ; thứ tự cột không đổi sau khi đổi tên. Các cột có khoảng trắng/ký tự đặc biệt cần bọc backticks (`...`).
Ý nghĩa thống kê:
Các biến được giữ lại bao gồm:
date: thời điểm xảy ra vụ án (biến thời gian).
area: khu vực xảy ra vụ án (biến định tính).
severity: mức độ nghiêm trọng của vụ án (định tính thứ bậc).
crime_type: mô tả loại tội phạm (định tính).
age: tuổi nạn nhân (định lượng liên tục).
sex: giới tính nạn nhân (định tính).
weapon: loại vũ khí được sử dụng.
status: tình trạng xử lý vụ án (định tính).
lat, lon: tọa độ địa lý nơi xảy ra vụ án (biến định lượng).
## date area severity crime_type age sex weapon
## 0 0 0 0 0 126595 619758
## status lat lon
## 0 0 0
## [1] 746353
Giải thích kỹ thuật:
Hàm is.na(): kiểm tra giá trị bị thiếu (NA) trong từng ô dữ liệu, trả về TRUE/FALSE
Hàm colSums(): tính tổng số TRUE (tức là số NA) theo từng cột
=> colSums(is.na(crime_data)) cho biết mỗi biến có bao nhiêu giá trị bị thiếu
Hàm sum(): tính tổng tất cả các giá trị TRUE trong toàn bộ bảng
=> sum(is.na(crime_data)) cho biết tổng số giá trị thiếu trong toàn bộ dataset
Ý nghĩa thống kê:
Biến sex có 126.595 và biến weapon có 619.758 dữ liệu bị thiếu.
Các biến còn lại không có dữ liệu bị thiếu.
Tổng cộng có 746.353 ô dữ liệu bị trống.
## [1] 11098
Giải thích kỹ thuật:
Hàm duplicated(): xác định các dòng bị trùng lặp trong bộ dữ liệu, trả về TRUE/FALSE
Hàm sum(): tính tổng số dòng TRUE, tức là tổng số dòng bị trùng
=> sum(duplicated(crime_data)) cho biết có bao nhiêu quan sát trùng lặp trong dữ liệu
Ý nghĩa thống kê:
Kết quả cho thấy 11.098 quan sát bị trùng lặp.
Trong bộ dữ liệu, mỗi dòng (một quan sát) không nhất thiết tương ứng với một vụ án duy nhất, có thể có nhiều nạn nhân trong cùng một sự việc, các biến như date, area, crime_type… sẽ giống nhau, khiến hệ thống nhận diện là trùng lặp về mặt kỹ thuật, dù thực tế chúng phản ánh các đối tượng khác nhau trong cùng vụ án. Nếu loại bỏ các bản ghi này, dữ liệu sẽ mất thông tin về số lượng nạn nhân, giới tính hoặc độ tuổi — những yếu tố quan trọng trong phân tích hành vi tội phạm.
Vì vậy, nhóm giữ nguyên toàn bộ các bản ghi trùng lặp để đảm bảo tính toàn vẹn, đầy đủ và chính xác của bộ dữ liệu, đặc biệt cho các phân tích liên quan đến nhân khẩu học của nạn nhân.
Giải thích kỹ thuật:
Dòng 1 + 2: áp dụng is.na cho mỗi cột được chọn, trả về một logical vector theo hàng, TRUE nếu ít nhất một cột trong hàng đó là NA. !if_any(...): phủ định, TRUE khi không có NA trong tất cả các cột được chọn. -weapon — tidyselect: chọn tất cả các cột trừ cột weapon. filter(...): giữ lại các hàng với điều kiện TRUE.
Ý Nghĩa thống kê:
Biến crime được tạo mới từ crime_data sau khi đã loại bỏ các dòng có dữ liệu thiếu (trừ biến weapon).
Các giá trị NA trong biến weapon không phải là lỗi nhập liệu, mà phản ánh bản chất của dữ liệu thực tế: Nhiều vụ án không có vũ khí được sử dụng, chẳng hạn như trộm cắp, lừa đảo hoặc các hành vi phạm tội không liên quan đến bạo lực.
Trong các trường hợp này, biến weapon được để trống (NA) để biểu thị rằng không có vũ khí được ghi nhận. Do đó, em không loại bỏ các dòng có NA ở biến weapon, để tránh làm sai lệch bản chất của dữ liệu gốc và giữ nguyên thông tin thống kê về tần suất sử dụng vũ khí trong tội phạm.
## [1] "Date"
Giải thích kỹ thuật:
Dòng 1 dùng để chuyển đổi dữ liệu thời gian từ dạng ký tự hoặc dạng thời gian sang định dạng ngày (Date) trong R.
Dòng 2 giúp kiểm tra kiểu dữ liệu của biến date sau khi chuyển đổi.
Giải thích kỹ thuật:
Hàm format() được dùng để trích xuất thông tin cụ thể từ biến ngày tháng, ở đây là năm ("%Y").
Lệnh as.Date(crime$date) đảm bảo rằng biến date được định dạng đúng kiểu ngày trước khi trích xuất.
Giải thích kỹ thuật:
Dòng 1 + 2: toán tử %>% giúp nối các thao tác xử lý dữ liệu một cách trực quan. filter() là hàm dùng để lọc các quan sát theo điều kiện nhất định. Ở đây: age >= 0: loại bỏ các giá trị tuổi âm, đảm bảo tuổi của nạn nhân hợp lệ. year >= 2020, year <= 2023: giữ lại các quan sát xảy ra trong giai đoạn nghiên cứu (2020–2023).
## tibble [760,572 × 11] (S3: tbl_df/tbl/data.frame)
## $ date : Date[1:760572], format: "2020-01-03" "2020-08-02" ...
## $ area : chr [1:760572] "Wilshire" "Central" "Southwest" "Van Nuys" ...
## $ severity : num [1:760572] 1 1 1 1 2 2 2 2 2 2 ...
## $ crime_type: chr [1:760572] "VEHICLE - STOLEN" "BURGLARY FROM VEHICLE" "BIKE - STOLEN" "SHOPLIFTING-GRAND THEFT ($950.01 & OVER)" ...
## $ age : num [1:760572] 0 47 19 19 28 41 25 27 24 26 ...
## $ sex : chr [1:760572] "M" "M" "X" "M" ...
## $ weapon : chr [1:760572] NA NA NA NA ...
## $ status : chr [1:760572] "Adult Arrest" "Invest Cont" "Invest Cont" "Invest Cont" ...
## $ lat : chr [1:760572] "340375" "340444" "34021" "341576" ...
## $ lon : chr [1:760572] "-1183506" "-1182628" "-1183002" "-1184387" ...
## $ year : chr [1:760572] "2020" "2020" "2020" "2020" ...
Giải thích kỹ thuật:
str() là hàm cơ bản trong R dùng để hiển thị cấu trúc tổng quan của dữ liệu: bao gồm số dòng, số cột, tên biến, kiểu dữ liệu từng cột và một số giá trị đầu tiên.
Ý nghĩa thống kê:
Sau quá trình làm sạch, bộ dữ liệu “Crime Data from 2020 to Present” thu thập từ Sở Cảnh sát Los Angeles (LAPD) còn lại 760.572 quan sát và 11 biến.
1. crime <- crime %>%
2. mutate(
3. lat = as.numeric(lat),
4. lon = as.numeric(lon)
5. ) %>%
6. mutate(
7. lat = ifelse(lat > 100, lat / 10, lat),
8. lon = ifelse(lon > -200, lon * 100, lon))Giải thích kỹ thuật:
Dòng 1 + 2: ghi đè lại bảng crime sau khi thực hiện các bước biến đổi trong mutate().
lat = as.numeric(lat), lon = as.numeric(lon)
Dòng 3 + 4: chuyển cột lat và lon sang kiểu số. Nếu trong dữ liệu có ký tự, R sẽ tự chuyển thành NA.
Dòng 7 + 8: khi vĩ độ (lat) lớn hơn 100, chia 10 để sửa lỗi nhập sai do thiếu dấu chấm. Các giá trị hợp lệ (≤100) giữ nguyên. Khi kinh độ (lon) lớn hơn -200, nhân 100 để đưa về giá trị đúng. Các giá trị ≤ -200 giữ nguyên.
Ý nghĩa thống kê:
Dữ liệu ban đầu có một số giá trị lat và lon bị sai lệch do lỗi nhập liệu hoặc định dạng, nằm ngoài phạm vi thực tế của Los Angeles (LAT ≈ 33.7–34.4, LON ≈ -118.6 đến -118.1). Các giá trị này bị lệch một bậc thập phân nên được hiệu chỉnh để đảm bảo tọa độ chính xác trên bản đồ.
Việc chuẩn hóa các tọa độ giúp các thao tác trực quan hóa không gặp lỗi, đảm bảo bản đồ tội phạm hiển thị đúng vị trí các vụ án.
## [1] 80
1. crime <- crime %>%
2. mutate(
3. weapon_group = case_when(
4. str_detect(weapon, "GUN|RIFLE|PISTOL|REVOLVER|FIREARM|SHOTGUN|UZI|MAC|ASSAULT WEAPON|AUTOMATIC") ~ "Firearm",
5. str_detect(weapon, "KNIFE|BLADE|MACHETE|RAZOR|DAGGER|SWORD|ICE PICK|DIRK|CLEAVER") ~ "Sharp object",
6. str_detect(weapon, "BAT|CLUB|PIPE|STICK|BOARD|HAMMER|BRICK|ROCK|TIRE IRON|AXE|BLUNT") ~ "Blunt object",
7. str_detect(weapon, "BOMB|EXPLOSIVE|FIRE|CHEMICAL|POISON|SCALDING|ACID") ~ "Chemical/Explosive",
8. str_detect(weapon, "STUN GUN|MACE|PEPPER|GAS") ~ "Support weapon",
9. str_detect(weapon, "ROPE|LIGATURE|DOG|ANIMAL|SYRINGE|LIQUOR|DRUG") ~ "Control tool",
10. str_detect(weapon, "STRONG-ARM|BODILY FORCE|VERBAL|PHYSICAL PRESENCE|DEMAND NOTE|NONE|UNKNOWN") ~ "Bare-handed attack",
11. is.na(weapon) ~ "No weapon",
12. TRUE ~ "Other"))Giải thích kỹ thuật:
Dòng 1: length(unique(crime$weapon)) trả về tổng số loại vũ khí khác nhau.
Dòng 2: mutate() tạo thêm biến mới weapon_group trong cùng bảng crime.
Dòng 3: phân loại theo điều kiện
Dòng 4 đến dòng 10: tìm kiếm chuỗi con trong weapon có chứa bất kỳ từ khóa nào trong danh sách (ngăn cách bởi dấu |). Rồi gán tên tương ứng.
Dòng 11: gán nhóm “No weapon” cho các dòng thiếu dữ liệu.
Dòng 12: mọi trường hợp không khớp mẫu nào đều được xếp vào nhóm “Other”.
1. crime <- crime %>%
2. mutate(age_group = case_when(
3. age < 18 ~ "Juvenile",
4. age >= 18 & age < 40 ~ "Young adult",
5. age >= 40 & age < 60 ~ "Middle-aged",
6. age >= 60 ~ "Elderly",
7. TRUE ~ NA_character_))Giải thích kỹ thuật:
Dòng 2: dùng để tạo biến mới hoặc chỉnh sửa biến hiện có. case_when() tạo nhiều điều kiện logic: mỗi điều kiện đi kèm với nhãn kết quả tương ứng.
Dòng 7: tất cả các giá trị khác (không xác định) sẽ gán NA.
Giải thích kỹ thuật:
Dòng 2: mutate được dùng để tạo biến mới hoặc cập nhật biến hiện có. ifelse() là hàm điều kiện cơ bản trong R:nếu điều kiện đúng gán nhãn "Severe" (nghiêm trọng), điều kiện sai gán nhãn "Minor" (nhẹ).
1. crime <- crime %>%
2. mutate(sex = toupper(sex))
3. crime <- crime %>%
4. mutate(
5. sex = case_when(
6. sex == "M" ~ "Male",
7. sex == "F" ~ "Female",
8. TRUE ~ "Unknown"))Giải thích kỹ thuật:
Dòng 2: toupper(sex) chuyển toàn bộ giá trị trong cột sex thành chữ hoa.
Dòng 5: case_when() dùng để gán nhãn định tính dễ hiểu cho dữ liệu đã đồng nhất: "M" → "Male", "F" → "Female". Các giá trị khác (không xác định, trống hoặc bất thường) → "Unknown".
1. crime <- crime %>%
2. mutate(arrested = ifelse(status %in% c("Adult Arrest", "Juv Arrest"), "Arrested", "Not arrested"))Giải thích kỹ thuật:
Dòng 2: mutate dùng để tạo biến mới hoặc cập nhật biến hiện có.
Dòng 2: Tạo biến mới tên là arrested. ifelse() là hàm điều kiện: Kiểm tra xem giá trị của biến status có nằm trong tập hợp gồm "Adult Arrest" hoặc "Juv Arrest" không. Toán tử %in% trả về TRUE hoặc FALSE cho từng dòng. Nếu điều kiện đúng → gán "Arrested". Nếu điều kiện sai → gán "Not arrested".
## [1] 137
1. crime <- crime %>%
2. mutate(
3. crime_group = case_when(
4. grepl("THEFT|BURGLARY|ROBBERY|SHOPLIFT|LARCENY|VEHICLE|AUTO|CAR", crime_type, ignore.case = TRUE) ~ "Theft & Robbery",
5. grepl("ASSAULT|BATTERY|KIDNAPPING|THREAT|STALKING", crime_type, ignore.case = TRUE) ~ "Violence & Assault",
6. grepl("RAPE|SEX|HARASS|LEWD", crime_type, ignore.case = TRUE) ~ "Sexual & Harassment",
7. grepl("HOMICIDE|MURDER|MANSLAUGHTER", crime_type, ignore.case = TRUE) ~ "Homicide",
8. grepl("DRUG|NARCOTIC", crime_type, ignore.case = TRUE) ~ "Drug-related",
9. grepl("FRAUD|FORGERY|IDENTITY|SCAM|EMBEZZLEMENT|BRIBERY", crime_type, ignore.case = TRUE) ~ "Fraud & Financial Crime",
10. grepl("ARSON|FIRE", crime_type, ignore.case = TRUE) ~ "Arson",
11. TRUE ~ "Other"))Giải thích kỹ thuật:
Dòng 1 length(unique(crime$crime_type)): tính tổng số loại tội phạm khác nhau trong cột crime_type.
Dòng 3 tạo biến mới crime_group để gom nhóm tội phạm theo từ khóa trong crime_type.
Dòng 4 dò chuỗi không phân biệt hoa/thường. Gán tên tương ứng.
Dòng 11 mọi trường hợp không khớp vào các nhóm trên sẽ được để vào nhóm "Other".
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 23.00 34.00 34.21 48.00 99.00
Giải thích kỹ thuật
Lệnh summary(crime$age) trả về các chỉ số tóm tắt cơ bản của biến số (age):
Min.: giá trị nhỏ nhất.
1st Qu.: giá trị phần tư thứ nhất.
Median: trung vị.
Mean: giá trị trung bình.
3rd Qu.: phần tư thứ ba.
Max.: giá trị lớn nhất.
Ý nghĩa thống kê:
Dữ liệu cho thấy độ tuổi nạn nhân dao động từ 0 đến 99 tuổi, với trung vị là 34 tuổi và giá trị trung bình xấp xỉ 34,21 tuổi, chứng tỏ phần lớn nạn nhân nằm trong nhóm người trưởng thành đang trong độ tuổi lao động.
Giá trị nhỏ nhất bằng 0 nhiều khả năng phản ánh các trường hợp trẻ sơ sinh hoặc thai nhi bị ảnh hưởng trong các vụ án hình sự (như bạo hành, tấn công khi người mẹ mang thai).
Điều này cũng phản ánh rõ hơn mức độ đa dạng và nghiêm trọng của các loại tội phạm ảnh hưởng đến các nhóm tuổi khác nhau trong xã hội.
1. crime_by_group <- crime %>%
2. group_by(crime_group) %>%
3. summarise(tong_so_vu = n()) %>%
4. mutate(ty_trong = round(tong_so_vu / sum(tong_so_vu) * 100, 3)) %>%
5. arrange(desc(tong_so_vu))
6. print(crime_by_group)## # A tibble: 8 × 3
## crime_group tong_so_vu ty_trong
## <chr> <int> <dbl>
## 1 Theft & Robbery 369262 48.6
## 2 Violence & Assault 210113 27.6
## 3 Other 154071 20.3
## 4 Sexual & Harassment 16038 2.11
## 5 Arson 6489 0.853
## 6 Fraud & Financial Crime 3112 0.409
## 7 Homicide 1476 0.194
## 8 Drug-related 11 0.001
Giải thích kỹ thuật:
Dòng 2 tạo nhóm theo biến phân loại crime_group.
Dòng 3 tổng hợp ở mức nhóm; n()đếm số dòng trong mỗi nhóm ⇒ số vụ của từng crime_group.
Dòng 4 tính tỷ trọng mỗi nhóm trên tổng toàn bảng đã tổng hợp (tức tổng qua các nhóm). round(..., 3) làm tròn 3 chữ số thập phân.
Dòng 5 sắp xếp giảm dần theo số vụ.
Dòng 1 print(crime_by_group) in kết quả ra màn hình dưới dạng bảng thống kê tổng hợp.
Ý nghĩa thống kê:
Nhóm “Theft & Robbery (Trộm cắp – Cướp giật)” với 369.262 vụ (48,6%) chiếm gần một nửa tổng số vụ án, cho thấy tội phạm xâm phạm tài sản vẫn là vấn đề nổi cộm nhất tại Los Angeles.
Đứng thứ hai là “Violence & Assault (Bạo lực – Hành hung)” với 210.113 vụ (27,6%), phản ánh mức độ phổ biến của các hành vi gây tổn hại thân thể và tiềm ẩn rủi ro về an ninh công cộng.
Nhóm “Other (Khác)” gồm 154.071 vụ (20,3%), chủ yếu là các tội phạm ít gặp hoặc khó phân loại, thể hiện sự đa dạng và phức tạp của hành vi phạm tội đô thị.
Các nhóm có quy mô nhỏ hơn như “Sexual & Harassment (Tình dục – Quấy rối)” (16.038 vụ, 2,1%) và “Arson (Phóng hỏa)” (6.489 vụ, 0,9%) tuy chiếm tỷ trọng thấp nhưng mang tính chất nghiêm trọng, gây ảnh hưởng lớn đến tâm lý và an toàn cộng đồng.
Trong khi đó, “Fraud & Financial Crime (Gian lận – Tài chính)” (3.112 vụ, 0,4%) và “Homicide (Giết người)” (1.476 vụ, 0,2%) xuất hiện ít nhưng hậu quả kinh tế và xã hội cao, đòi hỏi biện pháp phòng ngừa chuyên biệt.
Đáng chú ý, “Drug-related (Ma túy)” chỉ ghi nhận 11 vụ (0,001%), cho thấy loại tội phạm này xảy ra rất ít trong giai đoạn nghiên cứu và không phải là vấn đề nổi bật tại Los Angeles so với các nhóm tội phạm khác.
Giải thích kỹ thuật:
Dòng 1 dùng toán tử pipe từ dplyr để chuyền dữ liệu crime vào chuỗi thao tác tiếp theo.
Dòng 2 gộp nhóm các bản ghi theo biến crime_group.
Dòng 3 tính giá trị trung bình của cột age cho mỗi nhóm. mean(age, na.rm = TRUE) tính trung bình, loại bỏ NA (tham số na.rm = TRUE) để tránh lỗi hoặc làm sai lệch kết quả khi có giá trị thiếu. Kết quả được lưu vào cột mới đặt tên tuổi trung bình.
Ý nghĩa thống kê:
Kết quả phân tích cho thấy độ tuổi trung bình của nạn nhân khác biệt rõ rệt giữa các nhóm tội phạm, phản ánh đặc trưng xã hội – hành vi của từng loại tội phạm:
Nhóm “Fraud & Financial Crime (Gian lận – Tài chính)” với độ tuổi trung bình hơn 37 tuổi. Nạn nhân thường là người trưởng thành, có công việc và tài sản, cho thấy tội phạm kinh tế thường nhắm đến các đối tượng có khả năng tài chính và tham gia giao dịch.
Nhóm “Violence & Assault (Bạo lực – Hành hung)” (≈36 tuổi) và “Homicide (Giết người)” (≈36 tuổi) có độ tuổi trung bình tương đồng, cho thấy các vụ việc nghiêm trọng thường xảy ra giữa người trưởng thành, xuất phát từ mâu thuẫn cá nhân, gia đình hoặc xã hội.
Nhóm “Theft & Robbery (Trộm cắp – Cướp giật)” có độ tuổi trung bình ≈34 tuổi, phản ánh nạn nhân chủ yếu là người trong độ tuổi lao động, thường xuyên di chuyển và mang theo tài sản cá nhân.
Nhóm “Sexual & Harassment (Tình dục – Quấy rối)” (≈29 tuổi) có xu hướng nạn nhân trẻ hơn, có thể bao gồm học sinh, sinh viên hoặc người trẻ đang lao động — nhóm cần được bảo vệ đặc biệt.
Nhóm “Arson (Phóng hỏa)” có độ tuổi trung bình ≈21 tuổi, tương đối trẻ, gợi ý liên quan đến các vụ phá hoại hoặc tai nạn tập thể, đặc biệt trong khu dân cư hoặc nhóm thanh thiếu niên.
Nhóm “Drug-related (Ma túy)” có độ tuổi trung bình ≈8 tuổi, có khả năng phản ánh trường hợp nạn nhân là trẻ em hoặc thai nhi bị ảnh hưởng gián tiếp, cho thấy tác động lan tỏa đáng lo ngại của ma túy đến nhóm tuổi nhỏ.
Nhóm “Other (Khác)” có độ tuổi trung bình ≈32,3 tuổi, bao gồm nhiều loại tội phạm không thuộc các nhóm chính, song vẫn cho thấy đa số nạn nhân là người trưởng thành.
1. crime_summary_age <- crime %>%
2. group_by(year, age_group) %>%
3. summarise(frequency = n(), .groups = "drop_last") %>%
4. group_by(year) %>%
5. mutate(percentage = round(frequency / sum(frequency) * 100, 2)) %>%
6. ungroup()
7. print(crime_summary_age)## # A tibble: 16 × 4
## year age_group frequency percentage
## <chr> <chr> <int> <dbl>
## 1 2020 Elderly 18634 10.7
## 2 2020 Juvenile 28243 16.2
## 3 2020 Middle-aged 48550 27.9
## 4 2020 Young adult 78752 45.2
## 5 2021 Elderly 19522 10.8
## 6 2021 Juvenile 27282 15.0
## 7 2021 Middle-aged 50285 27.7
## 8 2021 Young adult 84229 46.4
## 9 2022 Elderly 21896 10.7
## 10 2022 Juvenile 32439 15.8
## 11 2022 Middle-aged 55133 26.9
## 12 2022 Young adult 95400 46.6
## 13 2023 Elderly 21739 10.9
## 14 2023 Juvenile 38395 19.2
## 15 2023 Middle-aged 51289 25.6
## 16 2023 Young adult 88784 44.4
Giải thích kỹ thuật:
Dòng 1: dùng toán tử pipe từ dplyr để chuyền dữ liệu crime vào chuỗi thao tác tiếp theo.
Dòng 2: nhóm dữ liệu theo năm (year) và nhóm tuổi (age_group), để mỗi nhóm đại diện cho một tổ hợp năm – độ tuổi.
Dòng 3: tính tần số nạn nhân mỗi năm ở mỗi độ tuổi. .groups = "drop_last" giữ nhóm ngoài cùng khi cần tính tiếp.
Dòng 4: tiếp tục nhóm theo năm để chuẩn bị tính tỷ lệ phần trăm trong từng năm.
Dòng 5: tính tỷ trọng (%) của từng nhóm tuổi trong mỗi năm, làm tròn 2 chữ số thập phân.
Dòng 6: để bỏ việc chia nhóm đó đi, trả bảng về dạng bình thường.
Ý nghĩa thống kê:
Kết quả thống kê cho thấy sự thay đổi đáng chú ý trong cơ cấu độ tuổi nạn nhân từ năm 2020–2023.
Young adult (18–39 tuổi) – (nhóm thanh niên) chiếm tỷ lệ cao nhất, dao động khoảng 43–47% trong toàn giai đoạn. Đây là nhóm hoạt động xã hội nhiều, di chuyển thường xuyên, nên tiếp xúc nhiều hơn với các môi trường có rủi ro tội phạm cao, đặc biệt là trộm cắp và bạo lực.
Middle-aged (40–59 tuổi) – (Nhóm trung niên) duy trì ổn định quanh mức 26–28%, phản ánh nhóm có mức độ tham gia xã hội cao nhưng rủi ro thấp hơn so với thanh niên.
Elderly (≥60 tuổi) – (Nhóm cao tuổi) chiếm khoảng 10–11%, tỷ lệ tương đối ổn định giữa các năm. Tuy nhiên, đây là nhóm dễ bị tổn thương do hạn chế về thể chất và phụ thuộc kinh tế, nên vẫn cần được quan tâm đặc biệt.
Juvenile (<18 tuổi) – (Nhóm trẻ vị thành niên) có xu hướng tăng dần, từ 16,2% (2020) lên 19,18% (2023). Đây là dấu hiệu đáng lo ngại, cho thấy độ tuổi nạn nhân đang ngày càng trẻ hóa, đặc biệt trong bối cảnh môi trường mạng phát triển và hành vi xâm hại, lừa đảo trên không gian số gia tăng.
1. crime_by_area_year <- crime %>%
2. group_by(year, area) %>%
3. summarise(tong_so_vu = n()) %>%
4. arrange(area, year)
5. print(crime_by_area_year)## # A tibble: 84 × 3
## # Groups: year [4]
## year area tong_so_vu
## <chr> <chr> <int>
## 1 2020 77th Street 11524
## 2 2021 77th Street 11102
## 3 2022 77th Street 12508
## 4 2023 77th Street 11593
## 5 2020 Central 10872
## 6 2021 Central 12203
## 7 2022 Central 16342
## 8 2023 Central 15459
## 9 2020 Devonshire 7028
## 10 2021 Devonshire 7322
## # ℹ 74 more rows
Giải thích kỹ thuật:
Dòng 2: gom dữ liệu theo từng năm và khu vực, đảm bảo mỗi nhóm thể hiện đúng số vụ xảy ra trong khu vực đó ở từng năm.
Dòng 3: đếm tổng số vụ bằng hàm n().
Dòng 4: sắp xếp kết quả theo tên khu vực, sau đó theo năm.
Ý nghĩa thống kê:
Khi so sánh các năm, có thể thấy sự phân bố tội phạm không đồng đều giữa các khu vực.
Những nơi như Central, 77th Street và Hollywood thường xuyên nằm trong nhóm có tổng số vụ cao (trên 10.000 vụ mỗi năm), cho thấy đây là các khu vực trung tâm, đông dân cư và nhiều hoạt động xã hội nên dễ kéo theo các hành vi phạm tội.
Ngược lại, các khu vực như Foothill, Hollenbeck, hay Mission có số vụ ít hơn, phản ánh đặc trưng dân cư ổn định hoặc kiểm soát an ninh hiệu quả hơn.
Từ năm 2020 đến 2022, tổng số vụ tăng rõ rệt, đặc biệt ở khu Central, 77th Street và Hollywood. Từ 2023, số vụ có dấu hiệu ổn định hơn, nhưng các khu trung tâm như Central vẫn luôn dẫn đầu toàn thành phố.
Các khu vực như Foothill, Hollenbeck, và Mission thường nằm ở nhóm ít tội phạm hơn.
1. crime_area_sex <- crime %>%
2. group_by(area, sex) %>%
3. summarise(tong_so_vu = n(), .groups = "drop") %>%
4. arrange(area)
5. print(crime_area_sex)## # A tibble: 63 × 3
## area sex tong_so_vu
## <chr> <chr> <int>
## 1 77th Street Female 24309
## 2 77th Street Male 17913
## 3 77th Street Unknown 4505
## 4 Central Female 19029
## 5 Central Male 29789
## 6 Central Unknown 6058
## 7 Devonshire Female 12599
## 8 Devonshire Male 13422
## 9 Devonshire Unknown 5362
## 10 Foothill Female 11125
## # ℹ 53 more rows
Giải thích kỹ thuật:
Dòng 1: gom nhóm dữ liệu theo hai biến định tính khu vực (area) và giới tính (sex).
Dòng 3: tính tần suất cho từng nhóm, tức là số vụ tội phạm xảy ra trong từng tổ hợp area–sex.
Dòng 4: sắp xếp kết quả theo tên khu vực.
Ý nghĩa thống kê:
Phần lớn khu vực có nạn nhân nam nhiều hơn nữ. Khu vực Central (Nam 29.789 > Nữ 19.029), North Hollywood (Nam 22.442 > Nữ 15.047), Pacific (Nam 20.741 > Nữ 16.709), Wilshire (Nam 17.579 > Nữ 14.639). Điều này cho thấy hành vi phạm tội xảy ra có xu hướng liên quan nhiều đến nạn nhân nam ở đa số địa bàn.
Chỉ một số khu vực có nữ cao hơn nam gồm: 77th Street (Nữ 24.309 > Nam 17.913), Harbor (Nữ 13.497 > Nam 12.358), Southeast (Nữ 20.006 > Nam 13.658), Southwest (Nữ 20.240 > Nam 16.692). Đây là các “điểm nóng” theo chiều hướng ngược với mặt bằng chung.
Ngoài ra, mật độ nạn nhân là nam ở các khu vực Central (29.789) và Pacific (20.741) là rất cao; ở nhóm nữ, 77th Street (24.309), Southwest (20.240), Southeast (20.006) nổi bật. Các giá trị lớn này có thể phản ánh mật độ dân cư, hoạt động kinh tế - giải trí hoặc điểm tụ tập khiến tần suất va chạm tội phạm cao hơn.
Tỷ lệ “Không xác định giới tính” tuy không chiếm đa số nhưng vẫn có quy mô đáng kể, đặc biệt tại Central (6.058 vụ) và Hollywood (6.688 vụ). Sự tồn tại của nhóm này có thể ảnh hưởng đến việc tính toán và diễn giải tỷ trọng nam - nữ, bởi nếu các bản ghi thiếu giới tính không được phân bổ lại hợp lý, tỷ lệ phần trăm của hai nhóm còn lại (nam và nữ) sẽ bị sai lệch so với thực tế
1. crime %>%
2. group_by(year, crime_group) %>%
3. summarise(total = n()) %>%
4. arrange(crime_group, year)Giải thích kỹ thuật:
Dòng 2: gom nhóm dữ liệu theo năm và loại tội phạm.
Dòng 3: đếm số lượng số vụ trong mỗi nhóm.
Dòng 4: sắp xếp theo tên nhóm tội phạm, sau đó theo năm.
Ý nghĩa thống kê:
Kết quả thống kê cho thấy sự chênh lệch rõ rệt giữa các nhóm tội phạm trong giai đoạn 2020–2023, phản ánh đặc trưng tội phạm tại Los Angeles:
Nhóm Theft – Robbery (Trộm cắp – Cướp giật) chiếm tỷ trọng cao nhất toàn giai đoạn, tăng mạnh từ 79.227 vụ (2020) lên 105.306 vụ (2022) trước khi giảm nhẹ còn 100.347 vụ (2023). Xu hướng này thể hiện sự bùng phát tội phạm tài sản sau đại dịch COVID-19, có thể do yếu tố kinh tế - xã hội và mức độ phục hồi sinh hoạt đô thị.
Nhóm Violence – Assault (Bạo lực – Hành hung) duy trì ở mức cao, dao động từ 50.320 vụ (2020) lên 54.300 vụ (2023), cho thấy mức độ ổn định nhưng đáng lo ngại về tội phạm có tính đối đầu, có thể liên quan đến mâu thuẫn cá nhân, bạo lực gia đình hoặc xung đột khu vực.
Nhóm Homicide (Giết người) có quy mô nhỏ hơn đáng kể (chỉ vài trăm vụ mỗi năm), nhưng dao động từ 356 vụ (2020) lên 402 vụ (2021) rồi giảm dần còn 326 vụ (2023). Điều này phản ánh xu hướng kiểm soát được phần nào tội phạm đặc biệt nghiêm trọng sau giai đoạn đỉnh năm 2021.
Các nhóm quy mô nhỏ như Sexual – Harassment (Tình dục – Quấy rối), Arson (Phóng hỏa), Fraud – Financial (Gian lận – Tài chính), và Drug-related (Ma túy) duy trì ở mức thấp, dao động nhẹ qua các năm. Cụ thể, Sexual – Harassment ổn định quanh 3.800–4.200 vụ/năm, Arson giảm từ 1.670 xuống 1.541 vụ, Fraud – Financial tăng nhẹ đến 871 vụ (2022) rồi giảm, còn Drug-related chỉ ghi nhận vài vụ mỗi năm. Xu hướng này phản ánh mức kiểm soát tương đối hiệu quả, song vẫn cần lưu ý khả năng báo cáo thiếu trong các nhóm nhạy cảm như tội phạm tình dục và ma túy.
Nhóm Other (Khác) duy trì quanh mức 38.000–39.000 vụ/năm, thể hiện sự tồn tại của nhiều hành vi vi phạm đa dạng nằm ngoài các nhóm chính được phân loại.
Tổng thể, giai đoạn 2020–2023 cho thấy mức độ tội phạm chung tăng nhẹ đến năm 2022 rồi chững lại, trong đó hai nhóm chính Theft – Robbery (Trộm cắp – Cướp giật) và Violence – Assault (Bạo lực – Hành hung) chiếm ưu thế tuyệt đối — là trọng tâm cần được ưu tiên trong phân tích và hoạch định chính sách an ninh đô thị.
1. crime %>%
2. group_by(year, crime_group) %>%
3. summarise(tong_so_vu = n()) %>%
4. mutate(ty_trong = round(tong_so_vu / sum(tong_so_vu) * 100, 2)) %>%
5. slice_max(tong_so_vu, n = 3) %>%
6. arrange(year, desc(tong_so_vu))Giải thích kỹ thuật:
Dòng 2: gom nhóm dữ liệu theo năm và loại tội phạm.
Dòng 3: đếm số lượng số vụ trong mỗi nhóm.
Dòng 4: tính tỷ lệ % của mỗi nhóm trong tổng số vụ của năm đó.
Dòng 5: chọn 3 nhóm phổ biến nhất mỗi năm.
Dòng 6: sắp xếp theo năm và giảm dần theo tổng số vụ.
Ý nghĩa thống kê:
Kết quả thống kê 2020–2023 cho thấy:
Theft – Robbery chiếm tỷ trọng cao nhất, tăng từ 79.227 vụ (2020) lên 105.306 vụ (2022), rồi giảm nhẹ còn 100.347 vụ (2023). Violence – Assault ổn định ở mức cao, từ 50.320 vụ (2020) lên 54.300 vụ (2023). Homicide có quy mô nhỏ, dao động từ 356 vụ (2020) lên 402 vụ (2021) rồi giảm còn 326 vụ (2023). Các nhóm nhỏ như Sexual – Harassment, Arson, Fraud – Financial và Drug-related duy trì mức thấp. Other duy trì quanh 38.000–39.000 vụ/năm.
Tổng thể, tội phạm chung tăng nhẹ đến 2022 rồi ổn định, với Theft – Robbery và Violence – Assault là trọng tâm cần chú ý.
1. crime %>%
2. group_by(sex, age_group) %>%
3. summarise(tong_so_vu = n()) %>%
4. arrange(sex, desc(tong_so_vu))Giải thích kỹ thuật:
Dòng 2: chia dữ liệu thành từng nhóm theo giới tính (sex) và nhóm tuổi (age_group).
Dòng 3: đếm số lượng số vụ trong mỗi nhóm.
Dòng 4: sắp xếp kết quả theo giới tính và trong từng giới thì xếp giảm dần theo số vụ.
Ý nghĩa thống kê:
Kết quả cho thấy phần lớn vụ án liên quan đến nhóm tuổi Young adult (thanh niên) và Middle-aged (trung niên), với Female Young adult (nữ thanh niên) 174.158 vụ và Male Young adult (nam thanh niên) 165.648 vụ chiếm tỷ trọng cao nhất trong toàn bộ dữ liệu. Điều này phản ánh tính năng động, tần suất tham gia xã hội cao của nhóm tuổi trẻ, đồng thời cũng là nhóm có nguy cơ cao trở thành nạn nhân hoặc đối tượng liên quan đến tội phạm.
Nhóm Middle-aged (trung niên) đứng thứ hai ở cả hai giới, với nam 110.933 vụ và nữ 93.815 vụ, cho thấy sự lan tỏa của tội phạm sang độ tuổi trưởng thành ổn định hơn, có thể gắn với các hành vi bạo lực hoặc tranh chấp kinh tế.
Nhóm Elderly (người cao tuổi) có số vụ thấp hơn đáng kể (nam 44.994, nữ 36.637), phù hợp với xu hướng giảm dần khả năng tham gia hoặc bị tác động trực tiếp bởi tội phạm khi tuổi cao.
Đáng chú ý, nhóm Unknown (Không xác định) chiếm lượng khá lớn ở Juvenile (trẻ vị thành niên) 70.584 vụ - có thể do thiếu dữ liệu nhận dạng hoặc đặc thù các vụ liên quan đến trẻ em chưa xác định giới tính rõ trong hệ thống ghi nhận. Tình trạng này có thể làm sai lệch tỷ trọng giới tính thật sự, nên cần chuẩn hóa dữ liệu hoặc loại trừ có kiểm soát trước khi tiến hành phân tích sâu hơn.
Dữ liệu cho thấy Female (nữ) và Male Young adult (nam thanh niên) là hai nhóm chịu tác động nhiều nhất từ tội phạm, phản ánh vấn đề xã hội - tâm lý - kinh tế đặc thù của lứa tuổi trẻ, đồng thời đặt ra yêu cầu về chính sách phòng ngừa và hỗ trợ sớm cho nhóm dân số này.
1. crime %>%
2. group_by(area, age_group) %>%
3. summarise(tong_so_vu = n()) %>%
4. arrange(desc(tong_so_vu))Giải thích kỹ thuật:
Dòng 2: gom nhóm dữ liệu theo hai biến là khu vực (area) và nhóm tuổi (age_group).
Dòng 3: tính tổng số vụ trong từng nhóm.
Dòng 4: sắp xếp kết quả giảm dần theo tổng số vụ.
Ý nghĩa thống kê:
Kết quả cho thấy nhóm tuổi Young adult (thanh niên) chiếm ưu thế tuyệt đối tại hầu hết các khu vực, phản ánh rõ xu hướng tội phạm tập trung mạnh ở lứa tuổi trẻ. Các khu vực có số vụ cao nhất thuộc nhóm này gồm Central (28.056 vụ), Southwest (24.903 vụ), 77th Street (21.580 vụ) và Hollywood (21.533 vụ) — đều là những khu vực đông dân, hoạt động kinh tế–xã hội sôi động, dễ phát sinh va chạm và cơ hội phạm tội.
Nhóm Middle-aged (trung niên) đứng thứ hai về quy mô, với các khu vực nổi bật như Central (13.699 vụ), 77th Street (13.137 vụ) và Pacific (11.971 vụ), cho thấy nhóm tuổi này vẫn duy trì mức độ liên quan tương đối cao đến tội phạm, có thể liên quan đến các vụ bạo lực, tranh chấp hoặc hành vi kinh tế – tài chính.
Nhóm Juvenile (trẻ vị thành niên) chiếm tỷ trọng nhỏ hơn nhưng vẫn đáng chú ý tại Central (8.810 vụ) và Pacific (7.666 vụ), phản ánh sự gia tăng các vụ việc liên quan đến thanh thiếu niên đô thị, đặc biệt trong môi trường có mật độ trường học và khu dân cư cao.
Trong khi đó, nhóm Elderly (người cao tuổi) có số vụ thấp nhất ở tất cả các khu vực (thường chỉ vài nghìn vụ), tập trung nhiều ở West LA, Pacific, West Valley - cho thấy đây chủ yếu là nạn nhân hoặc các trường hợp bị ảnh hưởng gián tiếp bởi tội phạm hơn là đối tượng vi phạm.
Kết quả cho thấy xu hướng tập trung mạnh vào nhóm tuổi Young adult (thanh niên) tại hầu hết các khu vực, nhất là ở các quận trung tâm và phía nam thành phố, trong khi nhóm Middle-aged (trung niên) và Elderly (người cao tuổi) có quy mô thấp hơn đáng kể. Kết quả này khẳng định yếu tố tuổi tác là biến nhân khẩu học có ảnh hưởng lớn đến nguy cơ tội phạm, đồng thời gợi ý hướng phân tích giao thoa giữa độ tuổi và loại tội phạm hoặc giới tính để làm rõ đặc điểm hành vi phạm pháp theo vùng dân cư.
1. crime_top_group_area <- crime %>%
2. group_by(area, crime_group) %>%
3. summarise(tong_so_vu = n(), .groups = "drop_last") %>%
4. mutate(ty_trong = round(tong_so_vu / sum(tong_so_vu) * 100, 2)) %>%
5. slice_max(tong_so_vu, n = 1, with_ties = FALSE) %>%
6. arrange(desc(tong_so_vu))
7. print(crime_top_group_area)## # A tibble: 21 × 4
## # Groups: area [21]
## area crime_group tong_so_vu ty_trong
## <chr> <chr> <int> <dbl>
## 1 Central Theft & Robbery 26770 48.8
## 2 Pacific Theft & Robbery 25469 58.0
## 3 West LA Theft & Robbery 22306 61.0
## 4 Wilshire Theft & Robbery 21083 56.2
## 5 Hollywood Theft & Robbery 20714 49.2
## 6 N Hollywood Theft & Robbery 20286 52.8
## 7 Topanga Theft & Robbery 18026 56.0
## 8 Olympic Theft & Robbery 18014 47.0
## 9 Southwest Theft & Robbery 17972 42.5
## 10 Devonshire Theft & Robbery 17920 57.1
## # ℹ 11 more rows
Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu theo khu vực và nhóm tội phạm.
Dòng 3: n() đếm số dòng trong từng tổ hợp area, .groups = "drop_last": sau summarise, giữ lại mức nhóm ngoài cùng là area và bỏ crime_group.
Dòng 4: sum(tong_so_vu) tính tổng số vụ của khu vực đó. Tính tỷ trọng (%) của mỗi nhóm tội trong tổng số vụ của khu vực. round(..., 2) làm tròn 2 chữ số thập phân.
Dòng 5: Chọn nhóm tội có số vụ lớn nhất trong từng area. with_ties = FALSE buộc chỉ lấy 1 hàng; nếu có đồng hạng, chỉ lấy đúng 1 dòng lớn nhất, bỏ qua các dòng khác dù bằng nhau.
Dòng 6: sắp xếp kết quả cuối theo số vụ giảm dần.
Ý nghĩa thống kê:
Bảng thống kê cho thấy nhóm Theft & Robbery (Trộm cắp – Cướp giật) là nhóm tội phạm phổ biến nhất ở hầu hết các khu vực của Los Angeles, với tỷ trọng dao động từ khoảng 41% đến hơn 60% tổng số vụ trong từng khu vực. Điều này phản ánh rõ tính chất chiếm ưu thế của tội phạm xâm phạm tài sản, đặc biệt ở các khu vực đông dân và hoạt động kinh tế - thương mại sôi động như West LA, Pacific, Wilshire hay Central.
Ngược lại, một số khu vực như 77th Street và Southeast lại có nhóm Violence & Assault (Bạo lực – Hành hung) đứng đầu, chiếm tỷ trọng đáng kể (khoảng 38-40%), cho thấy đặc thù tội phạm thiên về hành vi xâm hại thân thể tại các vùng này.
Nhìn chung, cơ cấu tội phạm giữa các khu vực cho thấy sự chênh lệch rõ rệt về loại hình tội phạm chiếm ưu thế - các khu vực trung tâm và ven biển chủ yếu đối mặt với tội phạm tài sản, trong khi khu vực phía nam và đông nam có xu hướng tập trung các vụ việc mang tính bạo lực cao hơn, phản ánh sự khác biệt về điều kiện kinh tế – xã hội và mức độ an ninh cộng đồng giữa các vùng trong thành phố.
1. crime_avg_age_year <- crime %>%
2. group_by(age_group, year) %>%
3. summarise(total_cases = n(), .groups = "drop_last") %>%
4. group_by(age_group) %>%
5. summarise(
6. avg_cases_per_year = round(mean(total_cases), 1),
7. sd_cases = round(sd(total_cases), 1),
8. year_max = year[which.max(total_cases)],
9. max_cases = max(total_cases),
10. year_min = year[which.min(total_cases)],
11. min_cases = min(total_cases))
12. print(crime_avg_age_year)## # A tibble: 4 × 7
## age_group avg_cases_per_year sd_cases year_max max_cases year_min min_cases
## <chr> <dbl> <dbl> <chr> <int> <chr> <int>
## 1 Elderly 20448. 1624. 2022 21896 2020 18634
## 2 Juvenile 31590. 5059. 2023 38395 2021 27282
## 3 Middle-aged 51314. 2786. 2022 55133 2020 48550
## 4 Young adult 86791. 7054 2022 95400 2020 78752
Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu theo nhóm tuổi và năm.
Dòng 3: n() đếm số vụ theo nhóm tuổi - năm. .groups = "drop_last": sau khi tổng hợp, bỏ mức nhóm trong cùng (year), giữ age_group.
Dòng 4: đảm bảo các phép tính tiếp theo diễn ra trong từng nhóm tuổi.
Dòng 5: tạo bảng thống kê gọn cho mỗi nhóm tuổi:
- Dòng 6: trung bình số vụ/năm (làm tròn 1 chữ số thập phân).
- Dòng 7: độ lệch chuẩn của số vụ qua các năm, làm tròn 1 chữ số.
- Dòng 8: năm có tổng số vụ lớn nhất trong nhóm tuổi.
- Dòng 9: tổng số vụ cao nhất trong nhóm.
- Dòng 10: năm có tổng số vụ thấp nhất trong nhóm.
- Dòng 11: tổng số vụ thấp nhất trong nhóm.
Ý nghĩa thống kê:
Bảng thống kê cho thấy nhóm tuổi Young adult (thanh niên) chiếm tỷ trọng cao nhất trong toàn bộ giai đoạn 2020–2023, với trung bình 86.791 vụ/năm. Độ lệch chuẩn lớn (7.054) phản ánh mức biến động mạnh qua các năm, đặc biệt tăng đột biến vào năm 2022 với 95.400 vụ, cho thấy tội phạm tập trung nhiều ở nhóm dân số trẻ, năng động và thường xuyên tham gia các hoạt động xã hội.
Tiếp theo là nhóm Middle-aged (trung niên) với trung bình 51.314 vụ/năm, biến động ở mức vừa phải và cũng đạt đỉnh trong năm 2022. Điều này gợi ý rằng tội phạm trong giai đoạn này không chỉ ảnh hưởng đến giới trẻ mà còn lan sang nhóm lao động chính trong xã hội.
Nhóm Juvenile (vị thành niên) ghi nhận trung bình 31.590 vụ/năm, kèm độ lệch chuẩn tương đối cao (5.059), đạt đỉnh vào năm 2023. Xu hướng này cho thấy các vụ việc liên quan đến trẻ vị thành niên đang gia tăng đáng kể, có thể xuất phát từ tác động của môi trường xã hội, học đường và truyền thông trong thời kỳ hậu đại dịch.
Trong khi đó, nhóm Elderly (cao tuổi) có trung bình thấp nhất, 20.448 vụ/năm, với mức dao động nhỏ hơn nhiều so với các nhóm khác. Điều này phù hợp với đặc điểm nhóm tuổi cao - ít tiếp xúc xã hội và ít bị tác động trực tiếp bởi tội phạm.
Tổng thể, cấu trúc độ tuổi của nạn nhân chịu ảnh hưởng tội phạm tại Los Angeles đang dịch chuyển theo hướng trẻ hóa, với mức gia tăng rõ rệt ở hai nhóm Young adult và Juvenile trong giai đoạn 2022–2023. Xu hướng này đặt ra yêu cầu cho chính quyền và cộng đồng trong việc tăng cường giáo dục pháp luật, phòng ngừa sớm và hỗ trợ tâm lý - xã hội cho nhóm dân số trẻ.
1. tbl_summary_year <- crime %>%
2. group_by(year) %>%
3. summarise(
4. total_cases = n(),
5. arrested_pct = round(100 * mean(arrested == "arrested"), 2),
6. armed_pct = round(100 * mean(weapon_group != "No weapon" & !is.na(weapon_group)), 2),
7. serious_pct = round(100 * mean(severity_label == "Serious"), 2),
8. .groups = "drop"
9. ) %>%
10. arrange(year)
11. print(tbl_summary_year)## # A tibble: 4 × 5
## year total_cases arrested_pct armed_pct serious_pct
## <chr> <int> <dbl> <dbl> <dbl>
## 1 2020 174179 0 41.9 0
## 2 2021 181318 0 40.8 0
## 3 2022 204868 0 38.0 0
## 4 2023 200207 0 39.3 0
Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu theo từng năm.
Dòng 3: tổng hợp dữ liệu cho mỗi nhóm năm, tạo ra các biến mới:
- Dòng 4: đếm tổng số vụ phạm tội trong năm.
- Dòng 5:mean(...) tính trung bình các giá trị "arrested",làm tròn 2 chữ số thập phân.
- Dòng 6: tỷ lệ phần trăm vụ có vũ khí, làm tròn 2 chữ số.
- Dòng 7: tính tỷ lệ vụ nghiêm trọng (%). .groups = "drop" bỏ grouping để kết quả trả về là data frame bình thường, không còn nhóm.
- Dòng 10: Sắp xếp bảng theo thứ tự năm tăng dần.
Ý nghĩa thống kê:
Bảng kết quả cho thấy sự biến động đáng chú ý của tội phạm tại Los Angeles giai đoạn 2020–2023.
Tổng số vụ tăng mạnh từ 174.179 vụ năm 2020 lên 204.868 vụ năm 2022, sau đó giảm nhẹ xuống 200.207 vụ năm 2023, cho thấy xu hướng gia tăng tội phạm rõ rệt trong hai năm đầu hậu đại dịch rồi bắt đầu ổn định trở lại.
Tỷ lệ đã bắt giữ (arrested_pct) giảm dần qua các năm (từ 11,49% xuống 9,17%), phản ánh khả năng truy bắt có xu hướng giảm tương đối so với quy mô tội phạm, có thể do khối lượng vụ việc lớn hơn hoặc nguồn lực điều tra bị phân tán.
Tỷ lệ có vũ khí (armed_pct) trong các vụ án cũng giảm từ 41,87% năm 2020 xuống 37,95% năm 2022, sau đó tăng nhẹ năm 2023 (39,27%), cho thấy xu hướng giảm tội phạm sử dụng vũ khí nhưng vẫn duy trì ở mức cao.
Tỷ lệ vụ nghiêm trọng (serious_pct) duy trì quanh 51–54%, với năm 2023 đạt mức cao nhất 54,40%, cho thấy dù tổng số vụ có xu hướng ổn định, mức độ nghiêm trọng của tội phạm lại có dấu hiệu tăng.
Tổng thể, dữ liệu phản ánh tội phạm gia tăng về số lượng trong giai đoạn 2020–2022, đồng thời chuyển dịch theo hướng tinh vi và nghiêm trọng hơn trong năm 2023.
1. crime %>%
2. group_by(year, crime_group, sex) %>%
3. summarise(tong_so_vu = n(), .groups = "drop") %>%
4. group_by(year, crime_group) %>%
5. mutate(ty_le = round(tong_so_vu / sum(tong_so_vu) * 100, 2)) %>%
6. filter(sex == "Female") %>%
7. group_by(year) %>%
8. slice_max(ty_le, n = 3, with_ties = FALSE) %>%
9. arrange(year, desc(ty_le))Giải thích kỹ thuật:
Dòng 2: gom dữ liệu theo năm, nhóm tội và giới tính.
Dòng 3: đếm số vụ trong mỗi tổ hợp, .groups = "drop" để bỏ nhóm tạm thời sau khi tổng hợp.
Dòng 4: tính tỷ lệ phần trăm số vụ của từng giới trong mỗi nhóm tội, làm tròn số thập phân thứ 2.
Dòng 5: chỉ giữ các dòng tương ứng với nạn nhân nữ.
Dòng 6: nhóm lại theo năm để chọn top trong từng năm riêng biệt.
Dòng 8: sắp xếp kết quả theo năm và tỷ lệ giảm dần.
Ý nghĩa thống kê:
Kết quả cho thấy Female (nữ giới) chiếm tỷ lệ cao nhất trong các vụ “Sexual & Harassment” (Tội phạm tình dục - quấy rối), với mức ổn định quanh 73–75% qua các năm 22020-2023. Điều này phản ánh đặc trưng giới rõ rệt của nhóm tội phạm này, khi phần lớn nạn nhân là phụ nữ, đặc biệt trong các hành vi xâm hại và quấy rối tình dục.
Nhóm “Violence & Assault” (Bạo lực – Hành hung) đứng thứ hai với tỷ lệ khoảng 50-51%, cho thấy nạn nhân nữ và nam chịu ảnh hưởng tương đối cân bằng. Tuy nhiên, việc tỷ lệ nữ duy trì quanh mức một nửa tổng số vụ cũng cảnh báo mức độ lan rộng của bạo lực giới trong cộng đồng.
Nhóm “Other” (Khác) duy trì tỷ lệ 40–41%, phản ánh rằng nữ giới cũng là đối tượng bị tác động đáng kể trong các hành vi phạm pháp không thuộc nhóm chính (như đe dọa, xâm nhập, hoặc vi phạm dân sự).
Nhìn chung, Female (nữ giới) thường là nạn nhân chính trong các tội phạm liên quan đến tình dục và bạo lực thể chất, và xu hướng này ổn định qua các năm, cho thấy vấn đề an toàn và bảo vệ phụ nữ vẫn là thách thức lớn trong công tác phòng chống tội phạm tại Los Angeles.
1. crime %>%
2. group_by(crime_group, severity_label) %>%
3. summarise(so_vu = n()) %>%
4. mutate(ty_le = round(so_vu / sum(so_vu) * 100, 2))Giải thích kỹ thuật:
Dòng 2: gom dữ liệu theo nhóm tội phạm và mức độ.
Dòng 3: đếm số bản ghi cho từng tổ hợp.
mutate(ty_le = round(so_vu/ sum(so_vu) * 100, 2))`: tính tỷ lệ % của mỗi mức độ trong nhóm tội tương ứng, rồi làm tròn 2 chữ số.
Ý nghĩa thống kê:
Homicide (Giết người): 100% Severe (Nghiêm trọng) - toàn bộ vụ giết người đều được đánh giá mức nghiêm trọng, phản ánh bản chất cực kỳ nguy hiểm của hành vi này.
Fraud & Financial Crime (Gian lận – tài chính) và Drug-related (Ma túy): 100% Minor (Nhẹ) - các vụ này trong dữ liệu hiện tại đều được đánh giá mức nhẹ, tức không gây nguy hiểm trực tiếp cho thân thể hay tính mạng.
Arson (Phóng hỏa): 60,75% Severe (Nghiêm trọng), 39,25% Minor (Nhẹ) - phần lớn vụ phóng hỏa gây hậu quả đáng kể, rủi ro an toàn cao, nhưng vẫn có một phần vụ mức độ nhẹ.
Violence & Assault (Bạo lực – hành hung): 30,11% Severe / 69,89% Minor - đa số vụ nhẹ, nhưng tỷ lệ nghiêm trọng vẫn đáng kể, phản ánh rủi ro tổn hại thân thể không nhỏ.
Sexual & Harassment (Tình dục – quấy rối): 34,82% Severe / 65,18% Minor - gần 1/3 vụ nghiêm trọng, nhấn mạnh nhu cầu bảo vệ nạn nhân nữ, đặc biệt với các hành vi xâm hại và quấy rối.
Theft & Robbery (Trộm cắp – cướp giật): 81,96% Severe / 18,04% Minor - phần lớn vụ xâm phạm tài sản được đánh giá nghiêm trọng, cần lưu ý cách phân loại mức độ trong dataset.
Other + Small Groups (Khác + các nhóm nhỏ): 84,25% Minor / 15,75% Severe — đây là các nhóm còn lại, bao gồm các hành vi rải rác như đe dọa, xâm nhập, vi phạm dân sự… phần lớn ở mức độ nhẹ.
1. tbl_severity_year <- crime %>%
2. group_by(year, severity_label) %>%
3. summarise(
4. num_cases = n(),
5. pct_cases = round(num_cases / sum(num_cases) * 100, 2),
6. .groups = "drop"
7. ) %>%
8. tidyr::pivot_wider(
9. names_from = severity_label,
10. values_from = c(num_cases, pct_cases),
11. names_sep = "_")
12. print(tbl_severity_year)## # A tibble: 4 × 5
## year num_cases_Minor num_cases_Severe pct_cases_Minor pct_cases_Severe
## <chr> <int> <int> <dbl> <dbl>
## 1 2020 83455 90724 100 100
## 2 2021 85758 95560 100 100
## 3 2022 98907 105961 100 100
## 4 2023 91292 108915 100 100
Giải thích kỹ thuật:
Dòng 2: gom dữ liệu theo năm (year) và mức độ nghiêm trọng.
Dòng 3 + 4 + 5 + 6: n() đếm số bản ghi trong mỗi nhóm. .groups = "drop" loại bỏ thông tin nhóm sau khi tổng hợp. sum(num_cases) tính tổng số vụ trong năm đó. round(..., 2) làm tròn 2 chữ số thập phân để dễ đọc.
Dòng 8: chuyển bảng từ dạng dài sang dạng rộng.
Dòng 9: dùng tên mức độ làm tên cột mới.
Dòng 10: lấy giá trị số vụ và tỷ lệ % điền vào các cột tương ứng.
Dòng 11: nối tên cột bằng dấu gạch dưới.
Ý nghĩa thống kê:
Số vụ “Minor” (nhẹ) tăng từ 83.455 vụ năm 2020 lên 98.907 vụ năm 2022, sau đó giảm xuống 91.292 vụ năm 2023. Số vụ “Severe” (nghiêm trọng) liên tục tăng từ 90.724 vụ năm 2020 lên 108.915 vụ năm 2023. Điều này phản ánh xu hướng tổng số vụ nhẹ giảm nhẹ, nhưng các vụ nghiêm trọng vẫn gia tăng.
Dữ liệu cho thấy xu hướng gia tăng các vụ nghiêm trọng qua các năm, trong khi số vụ nhẹ biến động không lớn. Điều này gợi ý rằng mặc dù tổng số vụ có thể ổn định hoặc giảm nhẹ, mức độ nghiêm trọng của tội phạm có dấu hiệu tăng, cần chú trọng vào các biện pháp phòng ngừa và bảo vệ cộng đồng.
1. crime %>%
2. group_by(year, arrested) %>%
3. summarise(tong_so_vu = n()) %>%
4. group_by(year) %>%
5. mutate(ty_le = round(tong_so_vu / sum(tong_so_vu) * 100, 2))Giải thích kỹ thuật:
Dòng 2: gom nhóm dữ liệu theo năm và tình trạng vụ án.
Dòng 3: đếm tổng số vụ trong từng nhóm.
Dòng 4: dùng để tính tỷ lệ phần trăm của từng loại tình trạng trong tổng số vụ mỗi năm, làm tròn 2 chữ số thập phân.
Ý nghĩa thống kê:
Qua các năm 2020–2023, số vụ Arrested (được bắt giữ) chiếm tỷ lệ thấp, khoảng 9-11% so với tổng số vụ, trong khi phần lớn vụ việc (Not arrested) không dẫn đến bắt giữ.
Tỷ lệ bắt giữ giảm dần từ 11,49% năm 2020 xuống 9,17% năm 2023, cho thấy khả năng truy bắt có xu hướng giảm so với quy mô tội phạm, có thể do tăng khối lượng vụ việc hoặc hạn chế về nguồn lực điều tra.
Dữ liệu phản ánh rằng mặc dù tổng số vụ có biến động (tăng giai đoạn 2020–2022, giảm nhẹ 2023), khả năng xử lý và bắt giữ vẫn chưa tăng, cho thấy cần tập trung cải thiện hiệu quả điều tra và phân bổ nguồn lực.
1. crime %>%
2. group_by(year) %>%
3. summarise(tong_so_vu = n()) %>%
4. mutate(tang_giam = round((tong_so_vu - lag(tong_so_vu)) / lag(tong_so_vu) * 100, 2))Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu theo từng năm.
Dòng 3: đếm tổng số vụ tội phạm từng năm.
Dòng 4: tính tỷ lệ tăng/giảm so với năm trước bằng công thức chênh lệch phần trăm, làm tròn đến số thập phân thứ 2. lag() dùng để lấy giá trị của năm liền kề trước.
Ý nghĩa thống kê:
Bảng cho thấy xu hướng biến động tổng số vụ phạm tội tại Los Angeles giai đoạn 2020–2023:
Năm 2020 là năm khởi đầu chuỗi dữ liệu, nên không có giá trị so sánh.
Năm 2021, tổng số vụ tăng 4,10% so với năm 2020, phản ánh giai đoạn thành phố bắt đầu mở cửa trở lại sau các biện pháp giãn cách, dẫn đến hoạt động xã hội và nguy cơ phạm pháp gia tăng.
Năm 2022, mức tăng đạt 12,99%, là mức tăng cao nhất trong toàn kỳ, cho thấy sự bùng phát rõ rệt của tội phạm — có thể do áp lực kinh tế, thất nghiệp và các yếu tố hậu đại dịch.
Năm 2023, tổng số vụ giảm nhẹ 2,28%, đánh dấu tín hiệu ổn định trong an ninh trật tự, có khả năng phản ánh hiệu quả của các chính sách kiểm soát tội phạm hoặc tăng cường tuần tra của LAPD.
Nhìn chung, giai đoạn 2020–2022 chứng kiến xu hướng gia tăng mạnh, sau đó có dấu hiệu hạ nhiệt vào năm 2023, cho thấy mối liên hệ giữa bối cảnh xã hội và sự biến động của hoạt động phạm tội.
1. crime %>%
2. group_by(crime_group, sex) %>%
3. summarise(tuoi_trung_binh = round(mean(age, na.rm = TRUE), 1))Giải thích kỹ thuật:
Dòng 2: kết hợp hai biến phân loại.
Dòng 3: tính tuổi trung bình, loại bỏ giá trị thiếu, làm tròn 1 chữ số thập phân.
Ý nghĩa thống kê:
Kết quả thống kê cho thấy tuổi trung bình của nạn nhân có sự khác biệt rõ rệt giữa các nhóm tội phạm và giới tính:
Nhóm Fraud & Financial Crime (Gian lận - Tài chính) có tuổi trung bình cao nhất, lần lượt 52,1 tuổi ở nữ và 42,5 tuổi ở nam. Điều này phản ánh đặc trưng của loại tội phạm đòi hỏi hiểu biết, kinh nghiệm và vị thế kinh tế - xã hội nhất định, thường xảy ra trong độ tuổi trung niên.
Nhóm Arson (Phóng hỏa) và Theft & Robbery (Trộm cắp - Cướp giật) có tuổi trung bình dao động từ 28-41 tuổi, cho thấy đây là độ tuổi hoạt động mạnh, dễ tham gia hoặc bị ảnh hưởng bởi tội phạm tài sản và hành vi bạo lực.
Nhóm Violence & Assault (Bạo lực - Hành hung) và Sexual & Harassment (Tình dục - Quấy rối) có tuổi trung bình khoảng 35-38 tuổi, thể hiện mức độ tham gia ổn định của nhóm trưởng thành, thường gắn với xung đột cá nhân, gia đình hoặc xã hội.
Nhóm Drug-related (Ma túy) có tuổi trung bình của nữ là 21,5 tuổi, nam là 2,0 tuổi và giới tính không xác định (Unknown) là 0,0 tuổi. Điều này cho thấy trong các vụ án ma túy, nữ giới thường ở độ tuổi thanh niên, còn nam giới xuất hiện chủ yếu ở nhóm rất nhỏ tuổi, có thể liên quan đến các tình huống trẻ em hoặc trẻ sơ sinh bị tác động trong bối cảnh tội phạm ma túy.
1. crime %>%
2. group_by(area) %>%
3. summarise(
4. total_cases = n(),
5. severe_pct = round(mean(severity_label == "Severe") * 100, 2),
6. .groups = "drop"
7. ) %>%
8. mutate(risk_level = case_when(
9. severe_pct > 55 ~ "Rất cao",
10. severe_pct > 45 ~ "Cao",
11. TRUE ~ "Trung bình - thấp"))Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu theo khu vực.
Dòng 3: tính số vụ và tỷ lệ vụ nghiêm trọng (Severe).round(..., 2): làm tròn 2 chữ số thập phân.
Dòng 8: tạo thêm biến phân loại mức độ rủi ro dựa trên severe_pct, sử dụng case_when() để gán nhãn điều kiện.
Ý nghĩa thống kê:
Kết quả cho thấy hầu hết các khu vực ở Los Angeles đều thuộc nhóm “Cao” về tỷ lệ vụ nghiêm trọng, phản ánh mức độ tội phạm nghiêm trọng phổ biến trên diện rộng. Một số khu vực nổi bật với mức “Rất cao”, gồm Central (59,32%), Pacific (60,97%), West LA (57,76%) và Wilshire (57,66%), đều là các khu trung tâm, ven biển hoặc tập trung thương mại - môi trường đông dân cư và du khách, dẫn đến nguy cơ tội phạm xâm phạm tài sản và bạo lực cao hơn.
Các khu khác như Hollywood (55,0%), N Hollywood (53,5%) và Devonshire (53,0%), dù chỉ ở mức “Cao”, nhưng tỷ lệ nghiêm trọng trên 50% vẫn cho thấy nguy cơ tổn hại không nhỏ.
Trong khi đó, các khu Foothill (45,98%), Mission (45,85%) và Southeast (47,02%) nằm sát ngưỡng “Trung bình - Cao”, cho thấy môi trường tội phạm được kiểm soát tương đối tốt, nhưng vẫn tiềm ẩn rủi ro.
Kết quả thể hiện rõ mức độ chênh lệch về an ninh đô thị, với khu trung tâm và kinh tế sôi động chịu nhiều tội phạm nghiêm trọng hơn, còn vùng ngoại vi hoặc dân cư ổn định có rủi ro thấp hơn.
1. crime_top10 <- crime %>%
2. group_by(area) %>%
3. summarise(total_cases = n()) %>%
4. arrange(desc(total_cases)) %>%
5. slice_head(n = 10)
6. ggplot(crime_top10, aes(x = reorder(area, -total_cases), y = total_cases)) +
7. geom_col(fill = "#5A9F68", alpha = 0.8) +
8. geom_text(aes(label = total_cases), vjust = -0.5, size = 3) +
9. geom_line(aes(group = 1, y = total_cases), color = "#264653", linewidth = 1) +
10. geom_hline(yintercept = mean(crime_top10$total_cases),
11. linetype = "dashed", color = "red", linewidth = 1) +
12. labs(
13. x = "Khu vực",
14. y = "Số vụ",
15. title = "Top 10 khu vực có số vụ nhiều nhất",
16. subtitle = "Có đường trung bình và xu hướng") +
17. theme_minimal(base_size = 10) +
18. theme(
19. plot.title = element_text(hjust = 0.5, face = "bold"),
20. legend.position = "none")Giải thích kỹ thuật:
Dòng 1 + 2 + 3: gom dữ liệu theo khu vực và đếm số vụ trong mỗi khu vực.
Dòng 4 + 5: sắp xếp giảm dần theo số vụ và lấy 10 khu vực có số vụ cao nhất.
Dòng 6: ánh xạ trục x là khu vực đã reorder theo thứ tự giảm dần (dấu -), trục y là số vụ.
Dòng 7: vẽ cột với màu cố định, dùng giá trị thực (stat = "identity"); alpha tạo độ trong suốt nhẹ.
Dòng 8: gắn nhãn số vụ trên đỉnh cột; vjust = -0.5 đẩy chữ lên trên cột để không đè vào cột.
Dòng 9: nối các đỉnh để thể hiện xu hướng giữa các khu vực.
Dòng 10: thêm đường ngang tại mức trung bình top 10.
Dòng 11 đến dòng 15: đặt tiêu đề, nhãn trục và phụ đề.
Dòng 16 đến dòng 19: tạo giao diện tối giản và đặt cỡ chữ mặc định là 16. Căn giữa, in đậm tiêu đề; legend.position = "none" thì ẩn chú thích.
Ý nghĩa thống kê:
Khu vực Central ghi nhận 54.876 vụ án, cao vượt trội so với mặt bằng chung. Mức này cao hơn trung bình nhóm khoảng 14.000 vụ, tương đương gấp 1,3 lần mức bình quân. Điều đó cho thấy Central là điểm nóng tội phạm nghiêm trọng nhất, có thể do đặc điểm dân cư đông, khu trung tâm thương mại lớn hoặc hoạt động kinh tế - xã hội phức tạp.
Khu vực 77th Street (46.727 vụ) đứng thứ hai, vẫn cao hơn trung bình khoảng 6.000 vụ, phản ánh tình hình tội phạm vẫn đáng quan ngại, cần duy trì các biện pháp giám sát và kiểm soát an ninh.
Khu vực Pacific (43.873 vụ) nằm trong nhóm rủi ro cao, vượt trung bình khoảng 3.500 vụ, cho thấy tội phạm tuy thấp hơn hai khu vực đầu nhưng vẫn đáng chú ý.
Bắt đầu từ Southwest (42.319 vụ) và Hollywood (42.107 vụ), số vụ tiệm cận mức trung bình (~40.000), thể hiện mức độ tội phạm trung bình - cần kiểm soát nhưng chưa tới mức báo động.
Các khu vực còn lại gồm N Hollywood, Olympic, Wilshire, Southeast, West LA đều có số vụ dao động từ 38.000–36.000 vụ, tức thấp hơn trung bình từ 2.000 đến 4.000 vụ, phản ánh tình hình an ninh ổn định hơn đáng kể.
Đường nối xu hướng màu xám trong biểu đồ thể hiện mức giảm đều từ trái sang phải, cho thấy sự phân hóa mạnh: vài khu vực (Central, 77th Street, Pacific) chiếm phần lớn tổng số vụ, trong khi phần lớn các khu vực còn lại có tỷ lệ thấp hơn rõ rệt. Đường trung bình đỏ đứt đóng vai trò là ngưỡng chuẩn so sánh, giúp xác định khu vực nào vượt hoặc dưới mức trung bình.
1. crime %>%
2. group_by(age_group, severity_label) %>%
3. summarise(total_cases = n(), .groups = "drop") %>%
4. ggplot(aes(x = age_group, y = total_cases, fill = severity_label)) +
5. geom_col(position = "dodge", width = 0.8) +
6. geom_text(aes(label = total_cases),
7. position = position_dodge(width = 0.8),
8. vjust = -0.5, size = 3, color = "black") +
9. scale_fill_manual(values = c("Severe" = "#ff8fab", "Minor" = "#6a994e")) +
10. labs(x = "Nhóm tuổi",
11. y = "Số vụ",
12. fill = "Mức độ phạm tội",
13. title = "Thống kê mức độ phạm tội theo nhóm tuổi") +
14. theme_minimal(base_size = 12) +
15. theme(plot.title = element_text(hjust = 0.5, face = "bold", color = "#3b3b3b"),
16. legend.position = "right",
17. legend.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 2: gom dữ liệu theo 2 biến nhóm tuổi và nhãn mức độ phạm tội.
Dòng 3: tạo cột total_cases là số quan sát trong mỗi tổ hợp; .groups = "drop" loại bỏ grouping metadata sau khi summarise.
Dòng 4: ánh xạ trục x là age_group, trục y là total_cases, màu theo severity_label.
Dòng 5 đến dòng 8: đặt các cột sát cạnh nhau (không xếp chồng). width = 0.8: bề rộng cột. vjust = -0.5: dịch nhãn lên phía trên đỉnh cột một chút. size = 3: kích thước chữ. color = "black": màu chữ.
Dòng 9: dùng để tự gán màu cho từng nhóm.
Dòng 10 đến dòng 13: đặt nhãn và tiêu đề
Dòng 14: tạo phong cách tối giản, chữ mặc định cỡ 13.
Dòng 15: căn giữa tiêu đề (hjust = 0.5), in đậm (face = "bold"), màu.
Dòng 16 + 17: đưa chú thích sang bên phải, in đậm tiêu đề của chú thích để dễ phân biệt.
Ý nghĩa thống kê:
Nhóm Elderly (Người cao tuổi): Tổng số vụ là 40.164 (Phạm tội nhẹ) và 41.627 (Phạm tội nghiêm trọng). Tội phạm chủ yếu là nhẹ, với số vụ nghiêm trọng ít hơn. Điều này có thể do người cao tuổi dễ bị tổn thương và các hành vi vi phạm nhỏ.
Nhóm Juvenile (Thanh thiếu niên): Tổng số vụ là 56.289 (Phạm tội nhẹ) và 70.070 (Phạm tội nghiêm trọng). Tội phạm nghiêm trọng chiếm ưu thế, phản ánh các vấn đề xã hội hoặc thiếu sự can thiệp.
Nhóm Middle-aged (Trung niên): Tổng số vụ là 100.517 (Phạm tội nhẹ) và 104.740 (Phạm tội nghiêm trọng). Mức độ tội phạm nặng và nhẹ gần như cân bằng trong nhóm này.
Nhóm Young adult (Thanh niên): Tổng số vụ là 162.442 (Phạm tội nhẹ) và 184.723 (Phạm tội nghiêm trọng). Tội phạm nghiêm trọng chiếm phần lớn, cho thấy nhóm này dễ bị lôi kéo vào hành vi phạm tội nghiêm trọng.
Nhóm Young adult có tội phạm nghiêm trọng cao nhất, cần tăng cường biện pháp phòng ngừa và hỗ trợ. Juvenile cũng cần sự can thiệp để giảm tội phạm. Elderly cần được bảo vệ khỏi các hành vi tội phạm nhẹ. Biểu đồ giúp nhận diện các nhóm tuổi có nguy cơ cao để xây dựng chính sách phù hợp.
1. crime %>%
2. group_by(year, age_group) %>%
3. summarise(total_cases = n(), .groups = "drop") %>%
4. ggplot(aes(x = age_group, y = total_cases, fill = age_group)) +
5. geom_col() + # Layer 1: Bar chart
6. geom_text(aes(label = total_cases), position = position_stack(vjust = 0.5), size = 3, color = "black") +
7. facet_wrap(~year) +
8. labs(x = 'Nhóm tuổi', y = 'Số vụ', title = 'Số vụ theo nhóm tuổi qua các năm') +
9. theme(axis.text.x = element_blank()) +
10. theme(plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),
11. axis.title = element_text(size = 15, face = "bold"),
12. axis.text = element_text(size = 14),
13. strip.text = element_text(size = 15, face = "bold")) Giải thích kỹ thuật:
Dòng 2 + 3: gom dữ liệu theo năm và nhóm tuổi, rồi tính tổng số vụ cho mỗi tổ hợp. .groups = "drop" trả về dataframe không còn grouping.
Dòng 4: thiết lập mapping - trục x là nhóm tuổi, y là tổng vụ, và fill tô màu theo nhóm tuổi.
Dòng 5: vẽ cột dùng giá trị y đã tính.
Dòng 6: tách biểu đồ theo từng năm thành nhiều panel nhỏ, mỗi panel hiển thị các cột cho một năm riêng, theo mặc định tất cả panel chia sẻ cùng thang y (scale cố định).
Dòng 7: đặt tiêu đề và nhãn trục để biểu đồ có ngữ nghĩa.
Dòng 8: ẩn nhãn trục x (tên nhóm tuổi).
Dòng 9: căn giữa tiêu đề (hjust = 0.5).
Ý nghĩa thống kê:
Nhóm Elderly (Người cao tuổi): Số vụ tội phạm ở nhóm này giảm dần qua các năm (từ 2020 đến 2023), phản ánh rằng tội phạm liên quan đến người cao tuổi không có sự gia tăng đáng kể. Mặc dù không phải nhóm có tội phạm cao, nhưng vẫn cần sự bảo vệ và phòng ngừa từ các cơ quan chức năng.
Nhóm Juvenile (Thanh thiếu niên): Tội phạm trong nhóm này có xu hướng tăng lên trong các năm 2021, 2022, nhưng lại giảm nhẹ vào 2023. Việc tăng tội phạm vào các năm đầu có thể phản ánh sự gia tăng của hành vi vi phạm trong giới trẻ, cần có sự can thiệp từ các chương trình giáo dục và hỗ trợ.
Nhóm Middle-aged (Trung niên): Tội phạm trong nhóm này có mức ổn định qua các năm, với sự gia tăng nhẹ vào 2022 và 2023. Mặc dù không phải nhóm tội phạm lớn nhất, nhưng nhóm trung niên vẫn cần được chú ý, đặc biệt là trong các vấn đề liên quan đến tham nhũng hay các hành vi phạm tội nghiêm trọng.
Nhóm Young adult (Thanh niên): Nhóm này có sự gia tăng mạnh mẽ trong các năm 2021 và 2022, đặc biệt là trong năm 2022, với số vụ tội phạm vượt trội hơn nhiều so với các nhóm tuổi còn lại. Điều này chỉ ra rằng nhóm thanh niên có xu hướng liên quan đến tội phạm nghiêm trọng nhiều hơn, cần có các biện pháp phòng ngừa và hỗ trợ phù hợp.
1. crime %>%
2. group_by(crime_group, sex) %>%
3. summarise(total_cases = n(), .groups = "drop") %>%
4. group_by(crime_group) %>%
5. mutate(pct = total_cases / sum(total_cases) * 100) %>%
6. ggplot(aes(x = reorder(crime_group, -pct), y = pct, fill = sex)) +
7. geom_bar(stat = "identity", position = "stack", width = 0.7) +
8. geom_text(aes(label = paste0(round(pct, 1), "%")),
9. position = position_stack(vjust = 0.5), size = 3, color = "black") +
10. scale_fill_brewer(palette = "Set4") +
11. labs(
12. title = "Cơ cấu giới tính trong từng nhóm tội phạm",
13. x = "Nhóm tội phạm", y = "Tỷ lệ (%)", fill = "Giới tính") +
14. theme_minimal(base_size = 14) +
15. theme(
16. plot.title = element_text(hjust = 0.5, face = "bold"),
17. axis.text.x = element_text(angle = 45, hjust = 1))Giải thích kỹ thuật:
group_by(crime_group, sex): Gom dữ liệu theo 2 biến phân loại nhóm tội phạm và giới tính.
summarise(total_cases = n(), .groups = "drop"): Tạo bảng tóm tắt total_cases là số quan sát trong mỗi tổ hợp. .groups = "drop" loại bỏ metadata về grouping sau khi summarise, tránh cảnh báo và hành vi không mong muốn.
group_by(crime_group): Gom lại theo crime_group để tính tỷ lệ nội bộ trong từng nhóm tội phạm.
mutate(pct = total_cases / sum(total_cases) * 100): Tạo cột pct là tỷ lệ phần trăm của total_cases trong mỗi crime_group. sum(total_cases) tính tổng cho mỗi nhóm tội phạm, nên pct là tỷ lệ nội bộ (cộng lại = 100% cho mỗi crime_group).
ggplot(aes(x = reorder(crime_group, -pct), y = pct, fill = sex)): aes(...) ánh xạ thẩm mỹ trục x là crime_group (đã được reorder theo -pct), trục y là pct, màu cột theo sex.
geom_bar(stat = "identity", position = "stack", width = 0.7): stat = "identity": dùng giá trị y (pct) có sẵn (không đếm lại). position = "stack": các thanh theo sex được xếp chồng để cột cuối cùng thể hiện tổng 100% (tuy ở đây y đã là tỷ lệ, nên tổng ~100%). width = 0.7: điều chỉnh bề rộng cột.
geom_text(aes(label = paste0(round(pct, 1), "%")), position = position_stack(vjust = 0.5), size = 4, color = "black"). Thêm nhãn phần trăm đặt ở giữa mỗi segment nhờ position_stack(vjust = 0.5). round(pct, 1) làm tròn 1 chữ số thập phân; paste0(..., "%") thêm ký tự phần trăm.
scale_fill_brewer(palette = "Set3")
labs(...): đặt tiêu đề, nhãn trục, tên chú giải.
theme_minimal(base_size = 13) + theme(...): thiết lập giao diện và bố cục; xoay nhãn x bằng angle = 45 để tránh chồng chữ.
Ý nghĩa thống kê:
Biểu đồ cho thấy giới tính có ảnh hưởng rõ rệt đến đặc điểm tội phạm. Trong nhóm tội giết người, nam giới chiếm tỷ lệ áp đảo (≈ 86,5%), cho thấy các hành vi phạm tội nghiêm trọng chủ yếu do nam giới thực hiện. Các nhóm “bạo lực – hành hung” và “trộm cắp – cướp giật” có phân bố tương đối cân bằng hơn, nhưng nam giới vẫn chiếm ưu thế (≈ 47–50%), phản ánh tính đặc trưng của các tội phạm sử dụng vũ lực.
Ngược lại, nhóm “tình dục – quấy rối” có tỷ lệ nữ giới rất cao (≈ 74%), cho thấy nữ giới thường là nạn nhân chính trong loại tội phạm này. “Gian lận – tài chính” có cơ cấu giới tương đối đồng đều (nam ~47%, nữ ~33%, không xác định ~19%), thể hiện đây là loại tội phạm không mang đặc trưng giới tính mạnh, thường liên quan đến hành vi trí tuệ hoặc vị trí nghề nghiệp. Nhóm “ma túy” và “khác” lại ghi nhận tỷ lệ giới tính không xác định khá cao (≈ 15–36%), có thể do thiếu dữ liệu hoặc trường hợp đặc thù chưa được phân loại rõ.
Nhìn chung, nam giới chiếm đa số trong các tội phạm mang tính bạo lực, xung động và thể chất, trong khi nữ giới thường là nạn nhân trong các vụ án liên quan đến tình dục. Điều này cho thấy cần tăng cường các biện pháp bảo vệ, giáo dục giới tính và can thiệp sớm, đồng thời chuẩn hóa dữ liệu về giới tính để phục vụ công tác thống kê và hoạch định chính sách. Việc phân tích cơ cấu giới tính giúp nhận diện nhóm có nguy cơ cao và định hướng chiến lược phòng ngừa – hỗ trợ xã hội hiệu quả hơn.
1. top_areas <- crime %>%
2. group_by(area) %>%
3. summarise(total_cases = n()) %>%
4. arrange(desc(total_cases)) %>%
5. slice_head(n = 5)
6. crime_top_areas <- crime %>%
7. filter(area %in% top_areas$area, !is.na(area), !is.na(sex))
8. crime_top_areas %>%
9. group_by(area, sex) %>%
10. summarise(total = n(), .groups = "drop") %>%
11. ggplot(aes(x = sex, y = reorder(area, -total), fill = total)) +
12. geom_tile(color = "white") +
13. geom_text(aes(label = total), color = "red", size = 6) +
14. scale_fill_gradient(low = "#d8f3dc", high = "#1b4332") +
15. labs(
16. title = "Mức độ phạm tội theo giới tính và khu vực",
17. x = "Giới tính", y = "Khu vực", fill = "Số vụ") +
18. theme_minimal(base_size = 16) +
19. theme(plot.title = element_text(hjust = 0.5, face = "bold"))Giải thích kỹ thuật:
Dòng 1: Lọc dữ liệu từ crime và nhóm theo khu vực (area).
Dòng 2 + 3: Gom dữ liệu theo khu vực (area) và tính tổng số vụ cho mỗi khu vực.
Dòng 4: Sắp xếp các khu vực theo tổng số vụ giảm dần.
Dòng 5: Chọn 5 khu vực có số vụ nhiều nhất.
Dòng 6: Tạo bảng dữ liệu crime_top_areas, lọc ra các bản ghi chỉ thuộc các khu vực có số vụ cao nhất, đồng thời loại bỏ các giá trị thiếu trong các cột area và sex.
Dòng 7: Áp dụng lọc dữ liệu để chỉ giữ các khu vực và giới tính hợp lệ trong crime_top_areas.
Dòng 8 + 9: Gom nhóm theo khu vực và giới tính, sau đó tính tổng số vụ cho từng tổ hợp.
Dòng 10: Trục x là giới tính, trục y là khu vực và màu sắc được xác định bởi tổng số vụ.
Dòng 12: Thêm nhãn vào các ô với tổng số vụ, điều chỉnh màu sắc chữ thành đỏ và kích thước chữ là 6.
Dòng 13: Áp dụng màu gradient cho các ô, tạo hiệu ứng màu sắc từ nhạt đến đậm.
Dòng 14 + 15: Đặt tiêu đề và nhãn cho các trục x và y, đồng thời thêm chú thích là "Số vụ".
Dòng 16: Áp dụng theme minimal với kích thước văn bản cơ bản là 16 cho biểu đồ.
Dòng 17: Căn giữa tiêu đề và làm cho tiêu đề in đậm.
Ý nghĩa thống kê:
Nhìn chung, nạn nhân nam chiếm tỷ lệ cao hơn đáng kể so với nữ ở hầu hết các khu vực, đặc biệt là tại Central – nơi ghi nhận gần 30.000 vụ với nạn nhân là nam, cao nhất trong 5 khu vực. Các khu vực như 77th Street và Southwest lại có số vụ nạn nhân nữ tương đối cao, cho thấy mức độ tội phạm nhắm vào phụ nữ vẫn đáng lưu ý. Số vụ có giới tính không xác định tuy chiếm tỷ lệ nhỏ, nhưng vẫn xuất hiện ở tất cả các khu vực.
1. crime %>%
2. group_by(year, sex) %>%
3. summarise(total_cases = n(), .groups = "drop") %>%
4. ggplot(aes(x = factor(year), y = total_cases, fill = sex)) +
5. geom_col(position = "dodge") +
6. geom_text(aes(label = total_cases),
7. position = position_dodge(width = 1), vjust = -0.5, size = 3) +
8. labs(
9. title = "So sánh số lượng nạn nhân qua các năm",
10. x = "Năm",
11. y = "Số vụ",
12. fill = "Giới tính") +
13. theme_minimal() +
14. theme(
15. plot.title = element_text(hjust = 0.5, size = 18, face = "bold"))Giải thích kỹ thuật:
Dòng 1: Lọc dữ liệu theo năm và giới tính.
Dòng 2 + 3: Gom dữ liệu theo năm và giới tính, tính tổng số vụ cho mỗi tổ hợp năm và giới tính.
Dòng 4: trục x là năm, trục y là tổng số vụ và tô màu các cột theo giới tính.
Dòng 5: Vẽ các cột cho từng năm và giới tính, với các cột không chồng lên nhau.
Dòng 6 + 7: Thêm nhãn vào các cột để hiển thị số lượng vụ, đảm bảo nhãn không bị chồng lấn.
Dòng 8 + 9: Đặt tiêu đề cho biểu đồ là "So sánh số lượng nạn nhân qua các năm" và đặt nhãn cho các trục x, y và chú thích màu là "Giới tính".
Dòng 11 + 12: Căn giữa tiêu đề, điều chỉnh kích thước chữ tiêu đề và làm cho tiêu đề in đậm.
Ý nghĩa thống kê:
Nam giới luôn là nhóm nạn nhân chiếm tỷ lệ cao nhất, dao động 84.000–95.000 vụ/năm, trong khi nữ giới chỉ thấp hơn chút ít, đặc biệt năm 2022 khi hai giới gần tương đương. Nhóm giới tính không xác định có số vụ ít hơn nhưng tăng đều từ khoảng 16.000 (2020) lên 26.000 (2023). Nhìn chung, tổng số vụ phạm tội nhắm vào cá nhân tăng nhẹ qua các năm, cho thấy xu hướng gia tăng rủi ro an ninh cộng đồng và nhu cầu bảo vệ cá nhân cao hơn.
1. plot7 <- crime %>%
2. group_by(area, severity) %>%
3. summarise(total = n(), .groups = "drop") %>%
4. ggplot(aes(x = area, y = total, fill = severity)) +
5. geom_bar(stat = "identity") +
6. coord_flip() +
7. theme_minimal() +
8. labs(
9. title = "Phân bố mức độ nghiêm trọng theo khu vực",
10. x = "Khu vực",
11. y = "Số vụ") +
12. theme(
13. plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
14. legend.position = "right")
15. plot7Giải thích kỹ thuật:
Dòng 1: Lọc dữ liệu từ crime và nhóm theo khu vực và mức độ nghiêm trọng.
Dòng 2 + 3: Gom dữ liệu theo khu vực và mức độ nghiêm trọng, tính tổng số vụ cho mỗi tổ hợp.
Dòng 4: trục x là khu vực (area), trục y là tổng số vụ (total), tô màu các cột theo mức độ nghiêm trọng.
Dòng 5: Vẽ biểu đồ cột.
Dòng 6: xoay biểu đồ từ dạng cột dọc sang dạng cột ngang.
Dòng 8 + 9: Đặt tiêu đề cho biểu đồ là "Phân bố mức độ nghiêm trọng theo khu vực" và nhãn cho các trục x và y là "Khu vực" và "Số vụ".
Dòng 10: Căn giữa tiêu đề, điều chỉnh kích thước chữ tiêu đề và làm cho tiêu đề in đậm.
Dòng 11: Đặt vị trí của chú thích ở bên phải của biểu đồ.
Dòng 12: Cuối cùng, lưu biểu đồ vào biến plot7.
Ý nghĩa thống kê:
Biểu đồ thể hiện mức độ nghiêm trọng của tội phạm theo từng khu vực. Dễ thấy các khu vực như Central, 77th Street, và Hollywood có tổng số vụ phạm tội cao nhất, phản ánh mật độ dân cư lớn và tần suất hoạt động tội phạm cao.
Ngược lại, Topanga, Pacific và Wilshire có tổng số vụ thấp hơn, cho thấy môi trường an ninh tương đối ổn định.
Dải màu xanh nhạt hơn tương ứng với mức độ nghiêm trọng cao hơn, cho thấy ở nhiều khu vực có tỷ lệ lớn các vụ nghiêm trọng (ví dụ Central và 77th Street vừa có nhiều vụ, vừa có mức độ nghiêm trọng cao). Điều này gợi ý mối quan hệ giữa quy mô tội phạm và mức độ nghiêm trọng, đồng thời giúp cơ quan chức năng ưu tiên phân bổ nguồn lực kiểm soát tội phạm cho các khu vực có nguy cơ cao hơn.
1. crime %>%
2. group_by(area) %>%
3. summarise(
4. total_cases = n(),
5. arrested_cases = sum(arrested == "Arrested", na.rm = TRUE),
6. arrest_rate = arrested_cases / total_cases * 100
7. ) %>%
8. ggplot(aes(x = reorder(area, arrest_rate), y = arrest_rate)) +
9. geom_col(fill = "violet") +
10. geom_text(aes(label = paste0(round(arrest_rate, 1), "%")),
11. position = position_stack(vjust = 0.5),
12. hjust = -0.1,
13. size = 3) +
14. coord_flip() +
15. labs(
16. title = "Tỷ lệ vụ án đã giải quyết theo khu vực",
17. x = "Khu vực",
18. y = "Tỷ lệ (%)") +
19. theme_minimal() +
20. theme(
21. plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
22. axis.text.y = element_text(size = 10),
23. axis.title.x = element_text(size = 12),
24. axis.title.y = element_text(size = 12))Giải thích kỹ thuật:
Dòng 2 + 3: Gom dữ liệu theo khu vực (area) và tính tổng số vụ trong mỗi khu vực.
Dòng 4 + 5: Tính số vụ đã bị bắt.
Dòng 6: trục x là khu vực (reorder(area, arrest_rate)) để sắp xếp khu vực theo tỷ lệ bắt giữ giảm dần, trục y là tỷ lệ bắt giữ (arrest_rate).
Dòng 7 + 8: Vẽ biểu đồ cột. Thêm nhãn vào các cột để hiển thị tỷ lệ phần trăm bắt giữ, làm tròn tới 1 chữ số sau dấu phẩy.
Dòng 9 + 10: căn giữa nhãn và điều chỉnh vị trí của nhãn ra ngoài cột một chút.
Dòng 12: xoay biểu đồ thành dạng ngang.
Dòng 13 + 14: Đặt tiêu đề cho biểu đồ là "Tỷ lệ vụ án đã giải quyết theo khu vực" và nhãn cho các trục x và y là "Khu vực" và "Tỷ lệ (%)".
Dòng 16 + 17: Căn giữa tiêu đề, điều chỉnh kích thước chữ tiêu đề và làm cho tiêu đề in đậm. Điều chỉnh kích thước chữ cho nhãn trục y (axis.text.y = element_text(size = 12)).
Dòng 18 + 19: Điều chỉnh kích thước chữ cho nhãn trục x và trục y.
Ý nghĩa thống kê:
Tỷ lệ vụ án được giải quyết có sự khác biệt rõ rệt giữa các khu vực.
Harbor (14.7%), Mission (14.4%) và Foothill (13.3%) đạt tỷ lệ cao nhất, cho thấy công tác điều tra và xử lý tội phạm tại đây tương đối hiệu quả.
Ngược lại, Central (7.0%), West LA (7.1%) và Pacific (7.5%) có tỷ lệ thấp hơn, phản ánh những khó khăn do mật độ dân cư cao và tính chất tội phạm phức tạp. Sự chênh lệch gần gấp đôi giữa khu vực cao nhất và thấp nhất cho thấy hiệu quả điều tra chưa đồng đều.
1. crime %>%
2. count(area, severity_label) -> d
3. ggplot(d, aes(x = reorder(area, -n), y = n, fill = severity_label)) +
4. geom_col(color = 'white') +
5. geom_text(aes(label = n), position = position_stack(vjust = 0.5), size = 3) +
6. scale_fill_manual(values = c("#a8ddb5", "#43a2ca", "#0868ac")[1:length(unique(d$severity_label))]) +
7. coord_flip() +
8. labs(
9. title = 'Số vụ theo khu vực & mức độ',
10. x = 'Khu vực',
11. y = 'Số vụ') +
12. theme_light() +
13. theme(
14. plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
15. axis.text.y = element_text(size = 10),
16. axis.title.x = element_text(size = 12),
17. axis.title.y = element_text(size = 12))Giải thích kỹ thuật:
Dòng 1: Lọc dữ liệu từ crime, chuẩn bị cho bước tính toán.
Dòng 2: tính số lượng các vụ theo khu vực và mức độ nghiêm trọng, kết quả lưu vào biến d.
Dòng 3: trục x là khu vực (reorder(area, -n)) sắp xếp theo số vụ giảm dần, trục y là số vụ (n) và tô màu cột theo mức độ nghiêm trọng.
Dòng 4: Vẽ biểu đồ cột, dùng màu trắng cho viền cột.
Dòng 5: Thêm nhãn vào các cột để hiển thị số lượng vụ với vị trí của nhãn căn giữa trong cột và kích thước chữ là 3.
Dòng 7: xoay biểu đồ thành dạng ngang.
Dòng 8 + 9: Đặt tiêu đề cho biểu đồ là "Số vụ theo khu vực & mức độ" và nhãn cho các trục x và y là "Khu vực" và "Số vụ".
Dòng 10: Áp dụng theme light cho biểu đồ để làm cho biểu đồ sáng và dễ nhìn hơn.
Dòng 11 + 12: Căn giữa tiêu đề, điều chỉnh kích thước chữ tiêu đề và làm cho tiêu đề in đậm. Điều chỉnh kích thước chữ cho nhãn trục y.
Dòng 13 + 14: Điều chỉnh kích thước chữ cho nhãn trục x và trục y.
Ý nghĩa thống kê:
Biểu đồ thể hiện tổng số vụ phạm tội tại từng khu vực cùng với mức độ nghiêm trọng (Severe – nghiêm trọng, Minor – nhẹ), sắp xếp theo thứ tự giảm dần để quan sát rõ sự khác biệt về quy mô và tính chất tội phạm. Central, 77th Street và Pacific là ba khu vực có số vụ cao nhất, với tỷ trọng các vụ nghiêm trọng đáng kể, phản ánh mức rủi ro an ninh cao cần ưu tiên phòng chống. Ngược lại, Foothill, Hollenbeck và Mission có số vụ thấp hơn, phần lớn là tội nhẹ, cho thấy an ninh ổn định hơn. Sự chênh lệch rõ rệt giữa các khu vực chỉ ra tội phạm phân bố không đồng đều: trung tâm và phía nam tập trung nhiều vụ nghiêm trọng, trong khi vùng ngoại ô phía bắc duy trì mức thấp hơn, liên quan đến mật độ dân cư, kinh tế và hiệu quả quản lý.
1. top5_loaitoi <- crime %>%
2. count(crime_group, sort = TRUE) %>%
3. slice_head(n = 5) %>%
4. pull(crime_group)
5. crime_top5 <- crime %>%
6. filter(crime_group %in% top5_loaitoi)
7. ggplot(crime_top5, aes(x = factor(year), fill = sex)) +
8. geom_bar(position = "fill") +
9. facet_wrap(~crime_group) +
10. scale_y_continuous(labels = scales::percent) +
11. scale_fill_manual(values = c("lightpink", "lightblue", "lightgreen")) +
12. labs(
13. title = "Cơ cấu giới tính theo năm cho Top 5 nhóm tội phạm",
14. x = "Năm",
15. y = "Tỷ lệ (%)") +
16. theme_minimal(base_size = 11) +
17. theme(
18. plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
19. strip.text = element_text(size = 9),
20. axis.title.x = element_text(size = 12),
21. axis.title.y = element_text(size = 12))Giải thích kỹ thuật:
Dòng 2: Dữ liệu được gom nhóm theo các nhóm tội phạm và năm.
Dòng 3: Tạo cột total_cases để tính tổng số vụ cho mỗi nhóm tội phạm và năm. .groups = "drop" loại bỏ metadata nhóm sau khi tóm tắt.
Dòng 4: Trục x đại diện cho năm, trục y là tỷ lệ phần trăm (%) và màu sắc được phân loại theo giới tính.
Dòng 5 đến Dòng 8: Các cột được vẽ sát nhau, không xếp chồng, xác định bề rộng của các cột, điều chỉnh vị trí của nhãn ở phía trên các cột và xác định kích thước chữ.
Dòng 9: Ánh xạ màu sắc cho từng nhóm giới tính.
Dòng 10 đến Dòng 13: Cung cấp nhãn cho các trục và tiêu đề cho biểu đồ.
Dòng 14: Áp dụng phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 15: Tiêu đề được căn giữa và in đậm.
Dòng 16 + 17: Chú thích được chuyển sang phía bên phải và in đậm để dễ dàng phân biệt.
**Ý nghĩa thống kê*:
Biểu đồ thể hiện cơ cấu giới tính của các vụ án trong Top 5 nhóm tội phạm phổ biến từ 2020 đến 2023, với mỗi khung nhỏ (facet) tương ứng một nhóm tội để so sánh tỷ lệ giới tính qua thời gian.
Nhóm Sexual & Harassment cho thấy nữ chiếm ưu thế tuyệt đối (70–80%), phản ánh đặc trưng nạn nhân nữ trong các vụ xâm hại và quấy rối tình dục, tỷ lệ ổn định qua các năm. Nhóm Homicide và Violence & Assault chủ yếu do nam thực hiện hoặc liên quan đến nam (60–70%), duy trì ổn định, phản ánh đặc trưng bạo lực thể chất.
Nhóm Fraud & Financial Crime và Drug-related có tỷ lệ nam – nữ khá cân bằng, thể hiện các tội phi bạo lực chịu ảnh hưởng xã hội – kinh tế hơn là giới tính. Các nhóm phụ như Arson hay Theft & Robbery duy trì mức chênh lệch giới nhỏ, cho thấy sự đa dạng hành vi trong từng loại phạm pháp.
1. crime %>%
2. group_by(crime_group) %>%
3. summarise(mean_age = mean(age, na.rm = TRUE)) %>%
4. slice_max(mean_age, n = 10) %>%
5. ggplot(aes(x = reorder(crime_group, mean_age), y = mean_age)) +
6. geom_col(fill = "#75664D") +
7. coord_flip() +
8. geom_text(aes(label = round(mean_age, 1)), hjust = -0.3, size = 2) +
9. labs(
10. title = "Tuổi trung bình theo loại tội",
11. x = "Loại tội",
12. y = "Tuổi trung bình") +
13. theme_minimal(base_size = 12) +
14. theme(
15. plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
16. axis.title.x = element_text(size = 12),
17. axis.title.y = element_text(size = 12),
18. axis.text.x = element_text(size = 10),
19. axis.text.y = element_text(size = 10))Giải thích kỹ thuật
Dòng 2: Dữ liệu được nhóm theo loại tội phạm và tính toán tuổi trung bình cho mỗi loại.
Dòng 3: Trục x là tuổi trung bình, trục y là các loại tội phạm.
Dòng 4 đến Dòng 7: Các thanh được vẽ theo chiều ngang.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 12.
Dòng 13: Căn giữa tiêu đề và in đậm.
Ý nghĩa thống kê:
Biểu đồ cho thấy độ tuổi trung bình của các nhóm tội phạm khác nhau có sự khác biệt rõ rệt. Nhóm Fraud & Financial Crime có tuổi trung bình cao nhất (37.7), chủ yếu liên quan đến người trưởng thành hoặc trung niên, tiếp theo là Homicide (36.8) và Violence & Assault (36.3), cho thấy các hành vi nghiêm trọng thường liên quan đến người trưởng thành.
Nhóm Theft & Robbery có tuổi trung bình 34.2, trong khi nhóm Other là 32.3, phản ánh sự tham gia đa dạng về độ tuổi. Nhóm Sexual & Harassment liên quan nhiều đến người trưởng thành trẻ tuổi (29.5), Arson chủ yếu là thanh niên (21.5), và Drug-related có tuổi trung bình rất thấp (8.4), có thể do lỗi dữ liệu hoặc ghi nhận những trường hợp trẻ em liên quan đến ma túy.
Nhìn chung, biểu đồ cung cấp cái nhìn về mối quan hệ giữa loại tội phạm và độ tuổi, giúp nhận diện nhóm tuổi dễ mắc các hành vi tội phạm khác nha.
1. breaks16 <- seq(0, 90, by = 5)
2. df16 <- crime %>%
3. filter(!is.na(age), sex %in% c("Male","Female")) %>%
4. mutate(age_bin = cut(age, breaks = breaks16, right = FALSE)) %>%
5. count(sex, age_bin) %>%
6. group_by(sex) %>%
7. mutate(n = ifelse(sex == "Female", -n, n)) %>% ungroup()
8. ggplot(df16, aes(x = age_bin, y = n, fill = sex)) +
9. geom_col(width = 0.9) +
10. coord_flip() +
11. scale_y_continuous(labels = function(x) scales::comma(abs(x))) +
12. labs(title = "Tuổi nạn nhân theo giới tính", x = "Nhóm tuổi (5 năm)", y = "Số vụ") +
13. theme_minimal() +
14. theme(plot.title = element_text(hjust=.5))Giải thích kỹ thuật
Dòng 2: Dữ liệu được phân chia theo giới tính và nhóm độ tuổi.
Dòng 3: Trục x biểu diễn số vụ, trục y là các nhóm tuổi (bước nhảy 5 năm).
Dòng 4 đến Dòng 7: Biểu đồ hình chóp được sử dụng để so sánh số vụ giữa nam và nữ. Dữ liệu cho nam được hiển thị phía bên trái (màu xanh da trời) và dữ liệu cho nữ được hiển thị phía bên phải (màu hồng).
Dòng 8 đến Dòng 11: Các thanh thể hiện số vụ trong từng nhóm độ tuổi. Chúng được vẽ đối xứng qua trục x, giúp dễ dàng so sánh giữa giới tính.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ này phân tích độ tuổi và giới tính của những người có liên quan đến các vụ án. Dựa trên biểu đồ:
Giới tính nữ (màu hồng): Phần lớn các vụ liên quan đến nữ giới chủ yếu tập trung vào nhóm tuổi từ 20 đến 40. Đây là nhóm có tần suất vụ việc cao nhất.
Giới tính nam (màu xanh da trời): Nam giới có sự phân bố vụ việc rộng rãi hơn, từ độ tuổi 10 đến trên 60, với sự tập trung ở độ tuổi 20 đến 40.
Độ tuổi: Biểu đồ cho thấy số vụ liên quan đến các đối tượng trẻ (dưới 20 tuổi) thấp hơn so với những người trong độ tuổi trưởng thành và trung niên. Tuy nhiên, cũng có sự tham gia của nhóm người cao tuổi trong các vụ việc.
Biểu đồ này cung cấp cái nhìn rõ ràng về sự phân bổ độ tuổi và giới tính trong các vụ việc, giúp hỗ trợ các chính sách phòng ngừa và can thiệp cho các nhóm đối tượng cụ thể.
1. crime %>%
2. filter(!is.na(age)) %>%
3. group_by(year) %>%
4. summarise(mean_age = mean(age, na.rm = TRUE)) %>%
5. ggplot(aes(x = factor(year), y = mean_age, group = 1)) +
6. geom_line(color = "#2A9D8F", linewidth = 1.2) +
7. geom_point(size = 3, color = "#E76F51") +
8. geom_text(aes(label = round(mean_age, 1)),
9. vjust = -1, hjust = -0.3, size = 5, color = "#264653") +
10. labs(title = "Tuổi trung bình của người phạm tội theo năm",
11. x = "Năm",
12. y = "Tuổi trung bình") +
13. theme_minimal(base_size = 16) +
14. theme(
15. plot.title = element_text(hjust = 0.5, face = "bold", color = "#333333"),
16. axis.text = element_text(color = "#3b3b3b"),
17. axis.title = element_text(face = "bold", color = "#264653"))Giải thích kỹ thuật
Dòng 2: Dữ liệu được nhóm theo năm và tính toán tuổi trung bình của nạn nhân.
Dòng 3: Trục x là năm và trục y là tuổi trung bình của người phạm tội trong năm đó.
Dòng 4: Vẽ biểu đồ đường.
Dòng 5: Các điểm dữ liệu (các vòng tròn đỏ) đánh dấu tuổi trung bình của mỗi năm.
Dòng 6 đến Dòng 9: Đặt nhãn cho trục và tiêu đề biểu đồ.
Dòng 10: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 11: Căn giữa và in đậm tiêu đề .
Ý nghĩa thống kê:
Biểu đồ thể hiện sự thay đổi của tuổi trung bình của người phạm tội qua các năm từ 2020 đến 2023. Dựa trên biểu đồ:
Tăng trưởng trong năm 2021: Tuổi trung bình tăng lên 34.8, có thể do sự thay đổi trong cấu trúc đối tượng phạm tội hoặc có sự tham gia của những người trưởng thành hoặc cao tuổi hơn.
Giảm trong năm 2022 và 2023: Tuổi trung bình giảm xuống còn 33.3 vào năm 2023, phản ánh sự gia tăng của các vụ phạm tội liên quan đến đối tượng trẻ tuổi hoặc có sự thay đổi trong mô hình tội phạm.
Biểu đồ này cung cấp thông tin hữu ích về sự thay đổi tuổi tác của người phạm tội theo thời gian, giúp nhận diện các xu hướng và hỗ trợ xây dựng chiến lược phòng ngừa tội phạm.
1. df_donut <- crime %>%
2. count(year, severity_label) %>%
3. group_by(year) %>%
4. mutate(p = n / sum(n), label = paste0(scales::percent(p, 0.1)))
5. ggplot(df_donut, aes(x = 2, y = p, fill = severity_label)) +
6. geom_col(color = "white", width = 1) +
7. coord_polar(theta = "y") +
8. xlim(0.5, 2.5) +
9. facet_wrap(~year) +
10. geom_text(aes(label = label), position = position_stack(vjust = 0.5), size = 3, color = "black") +
11. scale_fill_manual(values = c("#ff8fab", "#43a2ca")) +
12. theme_void() +
13. labs(title = "Cơ cấu mức độ phạm tội theo năm") +
14. theme(
15. plot.title = element_text(hjust = 0.5, face = "bold", size = 14, color = "#264653"),
16. strip.text = element_text(size = 12),
17. legend.position = "none")Giải thích kỹ thuật
Dòng 2: Dữ liệu được nhóm theo năm và tỷ lệ phân chia mức độ phạm tội.
Dòng 3: Vẽ biểu đồ dạng.Màu hồng là mức độ phạm tội nhẹ, màu xanh da trời là mức độ phạm tội nghiêm trọng.
Dòng 4: Mỗi vòng tròn đại diện cho một năm.
Dòng 5 đến Dòng 8: Các biểu đồ được bố trí theo dạng lưới 2x2.
Dòng 9 đến Dòng 12: Đặt nhãn cho các biểu đồ và tiêu đề biểu đồ.
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện tỷ lệ giữa mức độ phạm tội nghiêm trọng và phạm tội nhẹ qua các năm từ 2020 đến 2023. Dựa trên biểu đồ:
Tỷ lệ phạm tội nghiêm trọng (màu xanh da trời) có sự thay đổi nhẹ qua các năm. Mặc dù tỷ lệ này vẫn chiếm phần lớn trong tất cả các năm, nhưng sự thay đổi không quá lớn.
Tỷ lệ phạm tội nhẹ (màu hồng) có sự giảm nhẹ trong năm 2023, cho thấy xu hướng giảm tội phạm nhẹ và có thể phản ánh sự thay đổi trong môi trường xã hội hoặc chính sách.
Biểu đồ này cung cấp cái nhìn tổng quan về sự thay đổi trong cơ cấu mức độ phạm tội qua các năm, giúp các nhà quản lý và chuyên gia an ninh đánh giá xu hướng và xác định các chiến lược phòng ngừa phù hợp.
1. crime %>%
2. filter(year == 2023) %>%
3. count(crime_group, sort = TRUE) %>%
4. slice_head(n = 10) %>%
5. ggplot(aes(x = reorder(crime_group, n), y = n)) +
6. geom_col(fill = "#457b9d") +
7. geom_text(aes(label = n), hjust = -0.1, size = 4, color = "white") +
8. coord_flip() +
9. labs(title = "Top 10 nhóm tội trong năm 2023",
10. x = "Nhóm tội",
11. y = "Số vụ") +
12. theme_minimal(base_size = 16) +
13. theme(
14. plot.title = element_text(hjust = 0.5, face = "bold", color = "#264653"),
15. axis.title = element_text(size = 14),
16. axis.text = element_text(size = 12),
17. axis.title.x = element_text(size = 14))Giải thích kỹ thuật
Dòng 2: Dữ liệu được phân nhóm theo các loại tội phạm và số lượng vụ án trong năm 2023.
Dòng 3: Trục x đại diện cho số vụ, trục y đại diện cho các nhóm tội phạm. Các nhóm tội phạm được liệt kê từ trên xuống dưới theo số lượng vụ án giảm dần.
Dòng 5 đến Dòng 8: Các cột được vẽ với chiều dài tương ứng với số vụ án trong từng nhóm tội phạm.
Dòng 9 đến Dòng 12: Đặt nhãn cho trục x (Số vụ) và trục y (Nhóm tội).
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ cho thấy trong năm 2023, nhóm Theft & Robbery (Cướp giật) có số vụ cao nhất, chiếm tỷ trọng lớn nhất, phản ánh đây là vấn đề nổi bật cần được cơ quan chức năng ưu tiên xử lý. Violence & Assault (Bạo lực – Hành hung) đứng thứ hai, thể hiện mức độ phổ biến và nghiêm trọng của các hành vi bạo lực.
Nhóm Other (Khác) có số vụ đáng kể nhưng mức độ ảnh hưởng thấp hơn. Các nhóm còn lại như Sexual & Harassment, Arson, Fraud & Financial Crime, Homicide, và Drug-related có tỷ trọng thấp, cho thấy phạm vi tác động hẹp hơn.
Tổng thể, biểu đồ phản ánh cơ cấu tội phạm tại Los Angeles năm 2023, trong đó tội phạm tài sản và bạo lực chiếm ưu thế, là trọng tâm cần tăng cường phòng ngừa.
1. top5_group <- crime %>% count(crime_group, sort = TRUE) %>% slice_head(n = 5) %>% pull(crime_group)
2. crime %>%
3. filter(crime_group %in% top5_group) %>%
4. group_by(year, crime_group) %>%
5. summarise(mean_age = mean(age, na.rm = TRUE), .groups = "drop") %>%
6. ggplot(aes(x = year, y = mean_age, fill = crime_group)) +
7. geom_col(position = "dodge", width = 0.7) +
8. labs(title = "Tuổi trung bình theo nhóm tội", x = "Năm", y = "Tuổi trung bình", fill = "Nhóm tội") +
9. theme_minimal() +
10. theme(plot.title = element_text(hjust = 0.5))Giải thích kỹ thuật:
Dòng 2: Dữ liệu được phân nhóm theo loại tội và tính toán tuổi trung bình của nạn nhân theo từng năm.
Dòng 3: Trục x đại diện cho các năm, trục y là tuổi trung bình.
Dòng 5 đến Dòng 8: Các cột được vẽ cạnh nhau cho từng năm.
Dòng 9 đến Dòng 12: Đặt nhãn cho các trục và tiêu đề biểu đồ, cũng như chú thích các nhóm tội phạm.
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện sự thay đổi tuổi trung bình của người phạm tội theo nhóm tội phạm từ 2020 đến 2023.
Nhóm Arson (Phóng hỏa) có tuổi trung bình biến động rõ rệt, tăng vào năm 2021 rồi giảm nhẹ các năm sau. Nhóm Other (Khác) ghi nhận tuổi trung bình tăng nhẹ từ khoảng 30 lên gần 34 vào năm 2023. Sexual & Harassment (Quấy rối tình dục) tăng tuổi trung bình vào 2021, sau đó giảm dần, trong khi Theft & Robbery (Cướp giật) có tuổi trung bình thay đổi nhẹ, phản ánh sự tham gia đa dạng về độ tuổi.
Nhóm Violence & Assault (Bạo lực – tấn công) duy trì tuổi trung bình ổn định, chỉ thay đổi chút ít qua các năm. Biểu đồ giúp nhận diện xu hướng tuổi tác của người phạm tội, hỗ trợ phân tích các nhóm tội có sự biến động đáng chú ý trong đối tượng tham gia.
1. df_a1 <- crime %>%
2. mutate(is_severe = severity_label %in% c("Severe", "High")) %>%
3. group_by(year, area) %>%
4. summarise(
5. rate_severe = mean(is_severe, na.rm = TRUE),
6. mean_age = mean(age, na.rm = TRUE),
7. n = n(), # Số vụ
8. .groups = "drop")
9. ggplot(df_a1, aes(x = factor(year), y = reorder(area, rate_severe), fill = rate_severe)) +
10. geom_tile(color = "white") +
11. scale_fill_viridis_c(name = "Tỷ lệ nghiêm trọng") +
12. labs(
13. title = "Tỷ lệ nghiêm trọng theo khu vực và năm",
14. x = "Năm",
15. y = "Khu vực"
16. ) +
17. theme_minimal() +
18. theme(
19. plot.title = element_text(hjust = 0.5, face = "bold"))Giải thích kỹ thuật
Dòng 2: Dữ liệu được phân theo khu vực và năm.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho các khu vực.
Dòng 5 đến Dòng 7: Các ô trong biểu đồ được tô màu dựa trên giá trị tỷ lệ nghiêm trọng trong mỗi khu vực và năm, với các giá trị tỷ lệ được ánh xạ theo thang màu từ 0.45 đến 0.60.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ, cũng như cung cấp thang màu tương ứng với tỷ lệ nghiêm trọng.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện sự thay đổi tỷ lệ nghiêm trọng của các vụ tội phạm theo từng khu vực từ 2020 đến 2023. Khu vực Pacific ghi nhận tỷ lệ nghiêm trọng cao nhất vào năm 2020 và duy trì mức cao trong các năm tiếp theo, cho thấy tình trạng tội phạm nghiêm trọng đáng lo ngại.
Ngược lại, Mission và các khu vực khác có tỷ lệ thấp hơn nhiều, với xu hướng giảm qua các năm, phản ánh hiệu quả của các biện pháp phòng ngừa. Nhìn chung, tỷ lệ nghiêm trọng có sự biến động giữa các khu vực và qua các năm, cung cấp cơ sở để các cơ quan chức năng xác định những khu vực cần tăng cường biện pháp phòng chống tội phạm.
1. overall_f <- mean(crime$sex == "Female", na.rm = TRUE)
2. df_a5 <- crime %>%
3. filter(!is.na(area), !is.na(sex)) %>%
4. group_by(area) %>%
5. summarise(p_f = mean(sex == "Female"), n = n(), .groups = "drop") %>%
6. mutate(
7. diff = p_f - overall_f,
8. area = reorder(area, diff),
9. group = ifelse(diff > 0, "Cao hơn trung bình", "Thấp hơn trung bình"))
10. ggplot(df_a5, aes(x = diff, y = area)) +
11. geom_segment(aes(xend = 0, yend = area), color = "#b0bec5") +
12. geom_point(aes(size = n, color = group)) +
13. scale_x_continuous(labels = percent) +
14. scale_color_manual(
15. values = c("Thấp hơn trung bình" = "#e76f51", "Cao hơn trung bình" = "#2a9d8f"),
16. name = "Chênh lệch so với toàn thành phố") +
17. labs(
18. title = "Chênh lệch tỷ lệ nạn nhân nữ so với toàn thành phố",
19. x = "Chênh lệch (%)",
20. y = "Khu vực",
21. size = "Số vụ") +
22. theme_minimal() +
23. theme(
24. plot.title = element_text(hjust = 0.5, face = "bold"),
25. legend.position = "right")Giải thích kỹ thuật
Dòng 2: Dữ liệu được phân nhóm theo khu vực và tỷ lệ chênh lệch giữa tỷ lệ nữ và tỷ lệ chung của thành phố.
Dòng 3: Trục x biểu diễn tỷ lệ chênh lệch giữa tỷ lệ nữ và tỷ lệ chung của thành phố (tính theo %), trong khi trục y là các khu vực.
Dòng 5 đến Dòng 7: Kích thước của các điểm biểu thị số vụ tội phạm trong khu vực.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ, cung cấp thông tin về tỷ lệ chênh lệch.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê:
Biểu đồ thể hiện sự chênh lệch giữa tỷ lệ nữ và tỷ lệ trung bình của thành phố trong từng khu vực. Các khu vực như Southwest, 77th Street và Mission có tỷ lệ nữ tham gia tội phạm cao hơn mức trung bình, trong khi Central, West LA và Hollywood có tỷ lệ nữ thấp hơn. Kích thước điểm cho thấy Southwest và 77th Street cũng có số vụ tội phạm cao, bất kể tỷ lệ nữ. Biểu đồ giúp nhận diện các khu vực có sự chênh lệch rõ rệt về tỷ lệ nữ trong tội phạm, hỗ trợ các cơ quan chức năng xây dựng biện pháp can thiệp phù hợp.
1. df_heat <- crime %>%
2. count(year, sex) %>%
3. group_by(sex) %>%
4. arrange(year, .by_group = TRUE) %>%
5. mutate(yoy = (n - lag(n)) / lag(n)) %>%
6. filter(!is.na(yoy)) %>%
7. ungroup()
8. ggplot(df_heat, aes(x = factor(year), y = sex, fill = yoy)) +
9. geom_tile(color = "white") +
10. scale_fill_gradient2(low = "#d73027", mid = "white", high = "#1a9850", labels = scales::percent) +
11. labs(title = "Tăng trưởng số vụ theo năm và giới tính",
12. x = "Năm", y = "Giới", fill = "(%)") +
13. theme_minimal() +
14. theme(plot.title = element_text(hjust = 0.5))Giải thích kỹ thuật
Dòng 2: Dữ liệu được phân nhóm theo năm và giới tính.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho giới tính.
Dòng 5 đến Dòng 7: Các ô màu đại diện cho tỷ lệ tăng trưởng số vụ giữa các năm và giới tính. Các ô với màu xanh lá cây biểu thị tăng trưởng tích cực, trong khi màu hồng thể hiện sự giảm sút.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ, cung cấp thông tin về tỷ lệ phần trăm tăng trưởng.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn
Ý nghĩa thống kê:
Biểu đồ thể hiện tỷ lệ tăng trưởng số vụ theo năm và giới tính. Dựa trên biểu đồ:
Unknown (Giới tính không xác định): Tỷ lệ tăng trưởng số vụ trong nhóm này là cao, thể hiện bằng màu xanh lá cây. Điều này có thể chỉ ra sự gia tăng số vụ mà giới tính không xác định đang chiếm ưu thế.
Male (Nam): Tăng trưởng ở nhóm này cũng cho thấy xu hướng tăng nhẹ, nhưng mức tăng trưởng không cao như nhóm “Unknown.”
Female (Nữ): Tỷ lệ tăng trưởng số vụ ở nhóm nữ có vẻ không cao, thể hiện bằng màu hồng, cho thấy số vụ ở nhóm này có sự giảm sút hoặc tăng trưởng thấp trong các năm.
Biểu đồ này giúp nhận diện các xu hướng thay đổi trong số vụ tội phạm theo giới tính qua các năm, hỗ trợ trong việc phân tích các yếu tố tác động đến sự tăng trưởng hoặc giảm sút của các vụ tội phạm.
Ngành sữa Việt Nam là một trong những lĩnh vực có tốc độ tăng trưởng ổn định và đóng vai trò quan trọng trong việc cải thiện dinh dưỡng quốc gia. Trong đó, Công ty Cổ phần Sữa Việt Nam (Vinamilk - VNM) là doanh nghiệp dẫn đầu thị trường, có vị thế thống lĩnh cả về quy mô sản xuất, doanh thu và giá trị thương hiệu. Việc phân tích dữ liệu tài chính của VNM trong giai đoạn 2015–2024 không chỉ giúp đánh giá hiệu quả hoạt động kinh doanh của một doanh nghiệp đầu ngành, mà còn phản ánh bức tranh tổng thể của ngành sữa Việt Nam trong bối cảnh hội nhập và cạnh tranh ngày càng cao.
Ngoài ra, giai đoạn này bao gồm nhiều biến động đáng chú ý như ảnh hưởng của đại dịch COVID-19, sự thay đổi trong hành vi tiêu dùng, và xu hướng mở rộng thị trường quốc tế của Vinamilk. Do đó, việc nghiên cứu các chỉ tiêu tài chính của VNM (như doanh thu, lợi nhuận, NIM, NPM, hiệu quả sử dụng vốn và tỷ lệ tiền mặt trên tài sản) sẽ giúp đánh giá mức độ ổn định, khả năng sinh lời và hiệu quả quản trị tài chính của công ty qua thời gian.
Từ những lý do trên, đề tài “Phân tích dữ liệu tài chính Công ty Cổ phần Sữa Việt Nam (VNM) giai đoạn 2015–2024” được lựa chọn nhằm cung cấp cái nhìn toàn diện về hiệu quả hoạt động của doanh nghiệp đầu ngành, hỗ trợ việc ra quyết định đầu tư, hoạch định chiến lược và đánh giá tiềm năng tăng trưởng trong tương lai.
Đối tượng nghiên cứu: Các chỉ tiêu tài chính của Công ty Cổ phần Sữa Việt Nam (Vinamilk – VNM) giai đoạn 2015–2024, bao gồm tổng tài sản, nợ phải trả, vốn chủ sở hữu, lợi nhuận sau thuế, NIM, NPM và hiệu quả tài chính.
Phạm vi nghiên cứu: Doanh nghiệp VNM – niêm yết trên sàn HOSE. Thời gian: Từ năm 2015 đến 2024.
Bộ dữ liệu được thu thập từ báo cáo tài chính hợp nhất của Công ty Cổ phần Sữa Việt Nam (Vinamilk – VNM) trong giai đoạn 2015–2024. Dữ liệu ghi nhận các chỉ tiêu tài chính chủ yếu phản ánh quy mô tài sản, cơ cấu nguồn vốn, kết quả kinh doanh và hiệu quả sinh lời của doanh nghiệp theo từng năm.
Bộ dữ liệu được tổng hợp, làm sạch và chuẩn hóa để phục vụ cho phân tích mô tả, trực quan hóa và đánh giá xu hướng tài chính của VNM trong suốt 10 năm nghiên cứu.
1. CDKT <- read_excel( "C:/Users/USER/Downloads/VNM.xlsx", sheet = "CDKT")
2. HDKD <- read_excel("C:/Users/USER/Downloads/VNM.xlsx", sheet = "HDKD")
3. LCTT <- read_excel("C:/Users/USER/Downloads/VNM.xlsx", sheet = "LCTT")Giải thích kỹ thuật:
Dòng 1: Đọc dữ liệu từ sheet "CDKT" trong file Excel và lưu vào biến CDKT. Sheet này chứa thông tin về bảng cân đối kế toán.
Dòng 2: Đọc dữ liệu từ sheet "HDKD" trong file Excel và lưu vào biến HDKD. Sheet này chứa thông tin về bảng kết quả hoạt động kinh doanh.
Dòng 3: Đọc dữ liệu từ sheet "LCTT" trong file Excel và lưu vào biến LCTT. Sheet này chứa thông tin về bảng lưu chuyển tiền tệ.
## [1] 10 83
## [1] 10 23
## [1] 10 50
Giải thích kỹ thuật:
Hàm dim() trả về một vector gồm hai phần tử: số hàng và số cột của data frame.
Ý nghĩa thống kê:
Kết quả cho biết CDKT có 10 hàng và 83 cột, HDKD có 10 hàng và 23 cột, LCTT có 10 hàng và 50 cột.
Giải thích kỹ thuật:
head() hiển thị 5 dòng đầu tiên trong mỗi bộ dữ liệu.
1. CDKT_chon <- CDKT %>%
2. select(
3. Năm,
4. `TỔNG CỘNG TÀI SẢN`,
5. `NỢ PHẢI TRẢ`,
6. `Nợ ngắn hạn`,
7. `Vốn chủ sở hữu`,
8. `Tiền và các khoản tương đương tiền`,
9. `Phải thu khách hàng`,
10. `Hàng tồn kho`)
11. HDKD_chon <- HDKD %>%
12. select(
13. Năm,
14. `Doanh thu thuần về bán hàng và cung cấp dịch vụ (10 = 01 - 02)`,
15. `Lợi nhuận gộp về bán hàng và cung cấp dịch vụ (20 = 10 - 11)`,
16. `Lợi nhuận thuần từ hoạt động kinh doanh`,
17. `Lợi nhuận sau thuế TNDN`,
18. `Trong đó: Chi phí lãi vay`)
19. LCTT_chon <- LCTT %>%
20. select(
21. Năm,
22. `Lưu chuyển tiền thuần từ hoạt động kinh doanh`,
23. `Lưu chuyển tiền thuần từ hoạt động đầu tư`,
24. `Lưu chuyển tiền thuần từ hoạt động tài chính`,
25. `Tiền chi trả cổ tức`)Giải thích kỹ thuật:
Hàm select() từ package dplyr cho phép chọn các cột cụ thể từ data frame dựa trên tên biến.
Toán tử %>% giúp nối các thao tác xử lý dữ liệu một cách tuần tự và dễ đọc.
1. vnm <- CDKT_chon %>%
2. full_join(HDKD_chon, by = "Năm") %>%
3. full_join(LCTT_chon, by = "Năm") %>%
4. arrange(Năm)Giải thích kỹ thuật:
full_join() là hàm từ package dplyr, thực hiện phép nối hai data frame dựa trên một hoặc nhiều cột khóa chung.
Tham số by = "Năm" chỉ định biến "Năm" là khóa để ghép các bảng.
full_join() giữ lại tất cả các hàng từ cả hai bảng, kể cả khi không có giá trị khớp.
arrange(Năm) sắp xếp dữ liệu theo thứ tự tăng dần của năm.
## [1] 0
Giải thích kỹ thuật:
duplicated() trả về một vector logic, với giá trị TRUE cho các hàng bị trùng lặp và FALSE cho hàng duy nhất.
sum() đếm số lượng giá trị TRUE, tức là số hàng trùng lặp.
Ý nghĩa thống kê:
Sau khi kiểm tra dữ liệu, kết quả cho tháy không có dữ liệu nào bị trùng lặp.
## Năm
## 0
## TỔNG CỘNG TÀI SẢN
## 0
## NỢ PHẢI TRẢ
## 0
## Nợ ngắn hạn
## 0
## Vốn chủ sở hữu
## 0
## Tiền và các khoản tương đương tiền
## 0
## Phải thu khách hàng
## 0
## Hàng tồn kho
## 0
## Doanh thu thuần về bán hàng và cung cấp dịch vụ (10 = 01 - 02)
## 0
## Lợi nhuận gộp về bán hàng và cung cấp dịch vụ (20 = 10 - 11)
## 0
## Lợi nhuận thuần từ hoạt động kinh doanh
## 0
## Lợi nhuận sau thuế TNDN
## 0
## Trong đó: Chi phí lãi vay
## 0
## Lưu chuyển tiền thuần từ hoạt động kinh doanh
## 0
## Lưu chuyển tiền thuần từ hoạt động đầu tư
## 0
## Lưu chuyển tiền thuần từ hoạt động tài chính
## 0
## Tiền chi trả cổ tức
## 0
Giải thích kỹ thuật:
is.na() kiểm tra từng ô dữ liệu, trả về TRUE nếu giá trị là NA (missing) và FALSE nếu không.
colSums() tính tổng theo cột, cho biết mỗi biến có bao nhiêu giá trị bị thiếu.
Ý nghĩa thống kê:
Kết quả cho thấy không có dữ liệu bị thiếu.
1. vnm <- vnm %>%
2. rename(
3. Year = `Năm`,
4. Total_Assets = `TỔNG CỘNG TÀI SẢN`,
5. Total_Liabilities = `NỢ PHẢI TRẢ`,
6. Short_Term_Liabilities = `Nợ ngắn hạn`,
7. Equity = `Vốn chủ sở hữu`,
8. Cash_and_Cash_Equivalents = `Tiền và các khoản tương đương tiền`,
9. Accounts_Receivable = `Phải thu khách hàng`,
10. Inventory = `Hàng tồn kho`,
11. Net_Sales = `Doanh thu thuần về bán hàng và cung cấp dịch vụ (10 = 01 - 02)`,
12. Gross_Profit = `Lợi nhuận gộp về bán hàng và cung cấp dịch vụ (20 = 10 - 11)`,
13. Operating_Profit = `Lợi nhuận thuần từ hoạt động kinh doanh`,
14. Net_Profit_After_Tax = `Lợi nhuận sau thuế TNDN`,
15. Interest_Expense = `Trong đó: Chi phí lãi vay`,
16. Operating_Cash_Flow = `Lưu chuyển tiền thuần từ hoạt động kinh doanh`,
17. Investing_Cash_Flow = `Lưu chuyển tiền thuần từ hoạt động đầu tư`,
18. Financing_Cash_Flow = `Lưu chuyển tiền thuần từ hoạt động tài chính`,
19. Dividend_Payments = `Tiền chi trả cổ tức`)Giải thích kỹ thuật:
rename(): thay thế tên các cột hiện tại trong bảng vnm thành các tên tương ứng.
1. vnm <- vnm %>%
2. arrange(Year) %>%
3. mutate(avg_assets = (Total_Assets + lag(Total_Assets)) / 2)Giải thích kỹ thuật:
Dòng 2: sắp xếp bảng vnm theo cột Year.
Dòng 3: mutate() dùng để tạo một cột mới tên là avg_assets. Rồi tính giá trị tổng tài sản bình quân giữa năm hiện tại và năm trước.
Ý nghĩa thống kê:
Tổng tài sản bình quân là một chỉ số tài chính quan trọng để đo lường giá trị trung bình của tổng tài sản qua hai năm liên tiếp. Thông qua chỉ số này, có thể đánh giá sự biến động tài sản qua các năm và làm cơ sở cho các tính toán tài chính khác như lợi suất, tỷ lệ sinh lời, hoặc mức độ sử dụng tài sản của công ty.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới tên là ros. Tính tỷ suất lợi nhuận trên doanh thu bằng cách chia lợi nhuận sau thuế cho doanh thu thuần. Kết quả này cho biết công ty thu được bao nhiêu lợi nhuận sau thuế cho mỗi đơn vị doanh thu.
Ý nghĩa thống kê:
Tỷ suất lợi nhuận trên doanh thu (ROS) là một chỉ số tài chính quan trọng để đo lường hiệu quả hoạt động của công ty. Nó thể hiện khả năng sinh lời của công ty từ doanh thu mà công ty tạo ra.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới tên là roa. Tính tỷ suất lợi nhuận trên tài sản bằng cách chia lợi nhuận sau thuế cho tài sản bình quân. Kết quả này cho biết mức độ sinh lời của công ty từ mỗi đồng tài sản mà công ty sở hữu.
Ý nghĩa thống kê:
Tỷ suất lợi nhuận trên tài sản (ROA) là chỉ số tài chính dùng để đo lường khả năng sinh lời của công ty từ toàn bộ tài sản mà công ty sở hữu. Nó phản ánh mức độ hiệu quả trong việc sử dụng tài sản để tạo ra lợi nhuận.
1. vnm <- vnm %>%
2. mutate(equity_avg = (Equity + lag(Equity)) / 2,
3. roe = Net_Profit_After_Tax / equity_avg)Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên equity_avg. Tính giá trị bình quân giữa vốn chủ sở hữu của năm hiện tại và năm trước.
Dòng 3: tính toán roe bằng cách chia lợi nhuận sau thuế cho vốn chủ sở hữu bình quân.
Ý nghĩa thống kê:
Tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) là một chỉ số tài chính quan trọng để đo lường mức độ hiệu quả sử dụng vốn chủ sở hữu của công ty. ROE cho biết công ty tạo ra bao nhiêu lợi nhuận từ vốn chủ sở hữu của cổ đông.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên revenue_growth (Tăng trưởng doanh thu). Tính mức độ thay đổi trong doanh thu thuần (từ năm trước đến năm hiện tại), sau đó chia cho doanh thu của năm trước để có tỷ lệ phần trăm tăng trưởng.
Ý nghĩa thống kê:
Tăng trưởng doanh thu là một chỉ số tài chính quan trọng dùng để đo lường sự phát triển của doanh thu qua các năm. Chỉ số này giúp đánh giá liệu công ty có đang tăng trưởng doanh thu từ hoạt động kinh doanh chính hay không.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên equity_ratio (Tỷ lệ vốn chủ sở hữu). Tính bằng cách chia vốn chủ sở hữu cho tổng tài sản.
Ý nghĩa thống kê:
Tỷ lệ vốn chủ sở hữu là một chỉ số tài chính quan trọng để đo lường mức độ tài trợ tài sản bằng vốn chủ sở hữu thay vì nợ. Nó phản ánh khả năng tài chính của công ty trong việc duy trì sự ổn định tài chính mà không phụ thuộc quá nhiều vào nợ.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên size (Kích thước công ty). Được tính bằng cách lấy logarit tự nhiên của tổng tài sản (Total_Assets).
Ý nghĩa thống kê:
Trong các phân tích tài chính, tổng tài sản của công ty có thể dao động rất lớn, vì vậy sử dụng logarit giúp giảm độ biến động của dữ liệu. Khi tính logarit của tổng tài sản, ta sẽ có giá trị kích thước công ty giúp mô hình dễ dàng xử lý hơn, đặc biệt trong các mô hình hồi quy hoặc khi so sánh các công ty với quy mô tài sản khác nhau.
Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên debt_ratio (Tỷ lệ nợ). Được tính bằng cách chia tổng nợ phải trả cho tổng tài sản.
Ý nghĩa thống kê:
Tỷ lệ nợ là một chỉ số tài chính quan trọng để đánh giá mức độ phụ thuộc vào nợ trong việc tài trợ cho tài sản của công ty. Nó giúp phản ánh rủi ro tài chính của công ty, bởi vì công ty có tỷ lệ nợ cao có thể gặp khó khăn khi thanh toán các khoản nợ trong trường hợp gặp vấn đề tài chính.
1. vnm <- vnm %>%
2. mutate(current_assets = Cash_and_Cash_Equivalents + Accounts_Receivable + Inventory,
3. current_liquidity_ratio = current_assets / Short_Term_Liabilities)Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên current_assets (Tài sản ngắn hạn). Được tính bằng cách cộng ba yếu tố: tiền mặt, phải thu khách hàng và hàng tồn kho.
Dòng 3: tạo cột mới có tên current_liquidity_ratio (Hệ số thanh toán ngắn hạn) được tạo ra. Tính bằng cách chia tài sản ngắn hạn cho nợ ngắn hạn.
Ý nghĩa thống kê:
Tài sản ngắn hạn (Current Assets) là các tài sản mà công ty có thể chuyển đổi thành tiền mặt trong vòng một năm, giúp công ty thanh toán các khoản nợ ngắn hạn và chi phí khác.
Hệ số thanh toán ngắn hạn (Current Liquidity Ratio) chỉ số này cho biết công ty có đủ tài sản ngắn hạn để đáp ứng các nghĩa vụ nợ ngắn hạn trong một khoảng thời gian ngắn hay không.
1. vnm <- vnm %>%
2. mutate(growth_category = case_when(
3. revenue_growth < 0 ~ "Declining",
4. revenue_growth < 0.1 ~ "Stable",
5. TRUE ~ "High Growth"))Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên growth_category (Nhóm tăng trưởng). case_when() là hàm điều kiện để phân loại giá trị dựa trên các điều kiện xác định.
Dòng 3 + 4 + 5: là điều kiện để phân loại. Nếu tăng trưởng doanh thu (revenue_growth) âm, thì nhóm tăng trưởng được gán là "Declining" (Suy giảm). Nếu tăng trưởng doanh thu nhỏ hơn 0.1 nhưng không âm, thì nhóm tăng trưởng được gán là "Stable" (Ổn định). Nếu không thỏa mãn các điều kiện trên, sẽ được gán là "High Growth" (Tăng trưởng cao).
Ý nghĩa thống kê:
Nhóm tăng trưởng doanh thu là một chỉ số phân loại công ty dựa trên tốc độ tăng trưởng doanh thu trong một khoảng thời gian nhất định.
“Declining” (Suy giảm) chỉ ra rằng công ty đang trải qua một giai đoạn suy thoái hoặc giảm doanh thu. “Stable” (Ổn định) cho thấy công ty đang duy trì mức tăng trưởng ổn định, nhưng chưa đạt được sự tăng trưởng mạnh mẽ. “High Growth” (Tăng trưởng cao) cho thấy công ty đang có mức tăng trưởng doanh thu mạnh mẽ, điều này có thể phản ánh chiến lược thành công, mở rộng thị trường, hoặc ra mắt sản phẩm mới hiệu quả.
1. vnm <- vnm %>%
2. mutate(
3. efficiency_category = case_when(
4. roe >= quantile(roe, 0.67, na.rm = TRUE) ~ "High Efficiency",
5. roe >= quantile(roe, 0.33, na.rm = TRUE) ~ "Average Efficiency",
6. TRUE ~ "Low Efficiency"))Giải thích kỹ thuật:
Dòng 2 + 3: tạo một cột mới có tên efficiency_category. Rồi phân loại các giá trị của cột roe vào các nhóm hiệu quả khác nhau.
Dòng 4: lấy giá trị của roe tại phân vị thứ 67. Đây là điểm chia nhóm Hiệu quả cao.
Dòng 5: lấy giá trị của roe tại phân vị thứ 33. Đây là điểm chia nhóm Hiệu quả trung bình.
Dòng 6: các giá trị còn lại sẽ được gán vào nhóm "Low Efficiency" (Hiệu quả thấp).
Ý nghĩa thống kê:
Nhóm hiệu quả phân loại công ty theo tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) thành ba nhóm. Chỉ số này giúp đánh giá khả năng sinh lời từ vốn chủ sở hữu, với nhóm “Hiệu quả cao” thể hiện khả năng sinh lời tốt, còn “Hiệu quả thấp” cho thấy công ty kém hiệu quả trong việc sử dụng vốn.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.008e+13 5.142e+13 5.798e+13 5.495e+13 6.027e+13 6.178e+13
Giải thích kỹ thuật:
Hàm summary() dùng để tính toán các chỉ số thống kê mô tả cho biến số liên tục, bao gồm:
Min.: giá trị nhỏ nhất trong tập dữ liệu
1st Qu.: giá trị mà 25% quan sát nhỏ hơn nó
Median:giá trị ở giữa khi sắp xếp tăng dần
Mean: giá trị trung bình cộng
3rd Qu.: giá trị mà 75% quan sát nhỏ hơn nó
Max.: giá trị lớn nhất
Ý nghĩa thống kê:
Kết quả thống kê cho thấy doanh thu thuần của VNM trong giai đoạn 2015-2024 dao động từ 40.080 nghìn tỷ đồng (năm 2015) đến 61.780 nghìn tỷ đồng (năm 2024), với trung bình là 54.950 nghìn tỷ đồng và trung vị là 57.980 nghìn tỷ đồng.
Sự chênh lệch giữa trung bình và trung vị là tương đối nhỏ (54.950 so với 57.980), điều này phản ánh xu hướng tăng trưởng doanh thu ổn định qua các năm mà không bị ảnh hưởng quá nhiều bởi các giá trị ngoại lai.
Khoảng tứ phân vị (IQR), được tính bằng Q3 - Q1 = 60.270 - 51.420 ≈ 8.850 nghìn tỷ, cho thấy 50% giá trị trung tâm của doanh thu phân bố trong một biên độ tương đối hẹp. Điều này chứng tỏ rằng doanh thu của VNM là ổn định và không có sự biến động mạnh trong giai đoạn này.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.770e+12 9.105e+12 9.829e+12 9.709e+12 1.049e+13 1.124e+13
Giải thích kỹ thuật:
summary() sẽ tính toán các thống kê mô tả cơ bản cho cột Net_Profit_After_Tax (lợi nhuận sau thuế của công ty) trong bảng dữ liệu vnm. Các thống kê mô tả cơ bản bao gồm: Min (Giá trị nhỏ nhất). 1st Qu. (Q1 - Phân vị thứ 1). Median (Trung vị). Mean (Trung bình). 3rd Qu. (Q3 - Phân vị thứ 3). Max (Giá trị lớn nhất).
Ý nghĩa thống kê:
Lợi nhuận sau thuế của VNM trong giai đoạn 2015-2024 dao động từ 7.770 nghìn tỷ đồng đến 11.240 nghìn tỷ đồng, với trung bình là 9.709 nghìn tỷ đồng và trung vị là 9.829 nghìn tỷ đồng.
Sự chênh lệch nhỏ giữa trung bình và trung vị cho thấy phân phối lợi nhuận của công ty khá đồng đều, phản ánh sự ổn định trong khả năng sinh lời của doanh nghiệp. Tuy nhiên, biên độ dao động (Max - Min ≈ 3.470 nghìn tỷ) chiếm 44,7% so với giá trị nhỏ nhất, cho thấy rằng lợi nhuận của VNM có sự biến động đáng kể, có thể bị tác động bởi các yếu tố bên ngoài như biến động thị trường hoặc chiến lược kinh doanh. Điều này yêu cầu một phân tích sâu hơn để hiểu rõ hơn về các yếu tố tác động đến sự biến động lợi nhuận qua các năm.
1. vnm %>%
2. summarise(
3. mean = mean(Total_Assets, na.rm = TRUE),
4. sd = sd(Total_Assets, na.rm = TRUE),
5. min = min(Total_Assets, na.rm = TRUE),
6. max = max(Total_Assets, na.rm = TRUE),
7. median = median(Total_Assets, na.rm = TRUE))Giải thích kỹ thuật:
Dòng 2: tính các thống kê mô tả cho cột Total_Assets trong bảng vnm. Cụ thể, các chỉ số được tính toán là:
mean: Trung bình (mean) của tổng tài sản.
sd: Độ lệch chuẩn (standard deviation) của tổng tài sản, cho biết mức độ phân tán của tổng tài sản quanh giá trị trung bình.
min: Giá trị tổng tài sản nhỏ nhất.
max: Giá trị tổng tài sản lớn nhất.
median: Trung vị (median) của tổng tài sản, giá trị ở giữa khi sắp xếp các giá trị từ nhỏ đến lớn.
na.rm = TRUE: bỏ qua các giá trị thiếu (NA) trong khi tính toán các thống kê. Nếu không có tham số này, hàm sẽ trả về NA nếu dữ liệu có giá trị thiếu.
Ý nghĩa thống kê:
Tổng tài sản bình quân của VNM đạt 43.200 nghìn tỷ đồng với độ lệch chuẩn 10.200 nghìn tỷ đồng (hệ số biến thiên CV = 10.200/43.200 ≈ 23,6%), cho thấy quy mô tài sản có biến động đáng kể qua thời gian nghiên cứu.
Tài sản tăng từ 27.500 nghìn tỷ đồng (2015) lên 55.000 nghìn tỷ đồng (2024), tương đương mức tăng trưởng 100% trong 9 năm (CAGR ≈ 8,0% mỗi năm). Trung vị (46.600 nghìn tỷ) cao hơn trung bình (43.200 nghìn tỷ), cho thấy phân phối nghiêng phải (right-skewed), phản ánh xu hướng gia tăng quy mô tài sản mạnh mẽ trong những năm gần đây, đặc biệt từ 2019 trở đi khi công ty thực hiện chiến lược mở rộng và M&A
Giải thích kỹ thuật:
Dòng 2: lọc các bản ghi trong bảng vnm sao cho chỉ giữ lại những dòng có giá trị âm trong cột Operating_Cash_Flow (Lưu chuyển tiền thuần từ hoạt động kinh doanh). Dữ liệu đã được lọc sẽ được lưu vào bảng mới có tên vnm_cfo_am.
Ý nghĩa thống kê:
Kết quả trả về 0 quan sát, chứng tỏ VNM duy trì dòng tiền hoạt động dương liên tục trong toàn bộ giai đoạn 2015-2024. Đây là dấu hiệu tích cực về chất lượng lợi nhuận và sức khỏe tài chính.
Dòng tiền hoạt động dương thường xuyên cho thấy:
Lợi nhuận kế toán có nền tảng tiền mặt thực (không chỉ là lợi nhuận “trên giấy”)
Doanh nghiệp có khả năng thu hồi công nợ tốt
Chu kỳ chuyển đổi tiền mặt (cash conversion cycle) được quản lý hiệu quả
Công ty có nguồn lực nội sinh để tái đầu tư và chi trả cổ tức
Điều này đặc biệt quan trọng trong ngành sữa - ngành có đặc thủy chu kỳ sản xuất dài, hàng tồn kho lớn và yêu cầu vốn lưu động cao.
1. vnm %>%
2. group_by(growth_category) %>%
3. summarise(across(c(roa, roe, ros, debt_ratio), mean, na.rm = TRUE))Giải thích kỹ thuật:
Dòng 2: nhóm dữ liệu trong bảng vnm theo cột growth_category (Nhóm tăng trưởng).
Dòng 3: tính tóm tắt các thống kê trong mỗi nhóm. across() áp dụng hàm mean() cho các cột roa, roe, ros và debt_ratio, tính trung bình của các giá trị trong từng nhóm. na.rm = TRUE: Bỏ qua các giá trị thiếu (NA) khi tính toán trung bình.
Ý nghĩa thống kê:
Kết quả phân tích cho thấy nhóm High Growth (Tăng trưởng cao) có hiệu quả tài chính vượt trội, với các chỉ số ROA, ROE, và ROS cao nhất trong ba nhóm. Cụ thể, ROA cao nhất (0.329) cho thấy các công ty trong nhóm này có khả năng sinh lời từ tài sản tốt, và ROE cao nhất (0.432) phản ánh khả năng sinh lời mạnh từ vốn chủ sở hữu. Họ cũng có ROS cao nhất (0.197), chứng tỏ khả năng chuyển đổi doanh thu thành lợi nhuận tốt, đồng thời có tỷ lệ nợ thấp nhất (0.238), cho thấy sự phụ thuộc ít vào nợ.
Ngược lại, nhóm Declining (Suy giảm) có các chỉ số tài chính thấp nhất, với ROA (0.168) và ROE (0.249) thấp, cho thấy các công ty trong nhóm này có hiệu quả sinh lời kém từ tài sản và vốn chủ sở hữu. ROS của nhóm này cũng thấp nhất (0.143), phản ánh khả năng sinh lợi từ doanh thu yếu. Họ có tỷ lệ nợ cao nhất (0.323), cho thấy phụ thuộc nhiều vào nợ để tài trợ cho tài sản.
Nhóm Stable (Ổn định) có hiệu quả tài chính trung bình. Các chỉ số ROA (0.238), ROE (0.346), và ROS (0.178) đều ở mức trung bình, trong khi tỷ lệ nợ của nhóm này (0.322) gần bằng nhóm Declining, cho thấy sự phụ thuộc vào nợ tương đương.
1. vnm <- vnm %>%
2. arrange(Year) %>%
3. mutate(
4. delta_revenue = Net_Sales - lag(Net_Sales),
5. delta_profit = Net_Profit_After_Tax - lag(Net_Profit_After_Tax),
6. delta_roa = roa - lag(roa),
7. delta_roe = roe - lag(roe))
8. vnm %>%
9. select(Year, delta_revenue, delta_profit, delta_roa, delta_roe)Giải thích kỹ thuật:
Dòng 2: sắp xếp dữ liệu theo cột Year.
Dòng 3: tạo các cột mới cho phép tính toán.
Dòng 4: tính sự biến động doanh thu giữa năm hiện tại và năm trước, tính bằng cách trừ doanh thu năm trước khỏi doanh thu năm hiện tại.
Dòng 5 + 6 + 7: tạo các biến tương tự cho các chỉ số khác: delta_profit (Biến động lợi nhuận sau thuế giữa các năm). delta_roa (Biến động tỷ suất lợi nhuận trên tài sản giữa các năm). delta_roe (Biến động tỷ suất lợi nhuận trên vốn chủ sở hữu giữa các năm). select(Year, delta_revenue, delta_profit, delta_roa, delta_roe):
Dòng 9: chọn các cột bạn muốn hiển thị trong kết quả, bao gồm cột Year và các cột tính toán sự thay đổi (delta) của doanh thu, lợi nhuận, ROA, và ROE.
Ý nghĩa thống kê:
Trong giai đoạn 2015-2024, các chỉ số tài chính của VNM có sự biến động lớn, đặc biệt là về doanh thu, lợi nhuận, và các chỉ số hiệu quả tài chính như ROA (Tỷ suất lợi nhuận trên tài sản) và ROE (Tỷ suất lợi nhuận trên vốn chủ sở hữu).
Năm 2015: Vì đây là năm đầu tiên trong bộ dữ liệu, không có biến động nào được ghi nhận trong các chỉ số tài chính.
Năm 2016: Doanh thu và lợi nhuận của VNM tăng mạnh so với năm trước. Tuy nhiên, các chỉ số hiệu quả tài chính như ROA và ROE không có dữ liệu để đánh giá.
Năm 2017: Cả doanh thu và lợi nhuận đều có sự tăng trưởng, nhưng tỷ suất ROA giảm nhẹ (giảm 0.0084) trong khi ROE tăng đáng kể (tăng 0.01197), cho thấy hiệu quả sinh lời từ vốn chủ sở hữu được cải thiện.
Năm 2018: Mặc dù doanh thu và lợi nhuận giảm so với năm trước, nhưng ROA và ROE đều giảm mạnh, phản ánh sự suy giảm trong hiệu quả tài chính của công ty.
Năm 2019 - 2024: Trong giai đoạn này, các chỉ số tài chính tiếp tục có sự biến động mạnh. Đặc biệt, ROA và ROE có sự thay đổi đáng kể qua từng năm, phản ánh sự biến động trong khả năng sinh lời và quản lý tài chính của VNM.
1. cv <- function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)
2. vnm %>%
3. summarise(across(c(roa, roe, ros, debt_ratio, revenue_growth), cv))Giải thích kỹ thuật:
Dòng 1: tính hệ số biến động cho một cột dữ liệu. Hệ số biến động được tính bằng cách chia độ lệch chuẩn cho trung bình. sd(x, na.rm = TRUE): tính độ lệch chuẩn của một cột dữ liệu, với tham số na.rm = TRUE để bỏ qua các giá trị thiếu (NA). mean(x, na.rm = TRUE): tính trung bình của cột dữ liệu, cũng bỏ qua các giá trị thiếu.
Dòng 3: tính các giá trị thống kê cho các cột chỉ định.
Ý nghĩa thống kê:
Trong giai đoạn 2015-2024, các chỉ số tài chính của VNM cho thấy một sự hiệu quả sinh lời khá tốt và chiến lược tài chính ổn định. Cụ thể:
Tỷ suất lợi nhuận trên tài sản (ROA) đạt 0.2579, cho thấy công ty có khả năng tạo ra 25.79% lợi nhuận từ tài sản. Điều này cho thấy công ty sử dụng tài sản của mình hiệu quả trong việc sinh lời.
Tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) đạt 0.2189, tức là công ty tạo ra 21.89% lợi nhuận từ vốn của cổ đông, phản ánh một khả năng sinh lời rất tốt từ vốn đầu tư của các cổ đông.
Tỷ suất lợi nhuận trên doanh thu (ROS) là 0.1241, nghĩa là công ty có thể chuyển đổi khoảng 12.41% doanh thu thành lợi nhuận. Đây là một mức tỷ lệ lợi nhuận khá ổn định và thể hiện khả năng quản lý chi phí hiệu quả.
Tỷ lệ nợ (Debt Ratio) là 0.1253, cho thấy công ty chỉ sử dụng 12.53% nợ để tài trợ cho tài sản. Điều này cho thấy VNM có mức độ phụ thuộc vào nợ khá thấp, giúp giảm rủi ro tài chính.
Tăng trưởng doanh thu (Revenue Growth) là 1.0875, tức là doanh thu của công ty đã tăng gần gấp đôi trong giai đoạn phân tích. Điều này phản ánh một chiến lược tăng trưởng mạnh mẽ và khả năng mở rộng hoạt động kinh doanh hiệu quả.
1. vnm %>%
2. filter(roa > mean(roa, na.rm = TRUE) & roe > mean(roe, na.rm = TRUE)) %>%
3. select(Year, roa, roe, ros, debt_ratio)Giải thích kỹ thuật:
Dòng 2: lọc các bản ghi trong bảng vnm sao cho chỉ giữ lại những công ty có tỷ suất lợi nhuận trên tài sản (ROA) và tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) cao hơn trung bình của từng chỉ số trong dữ liệu, bỏ qua các giá trị thiếu (NA). mean(roe, na.rm = TRUE) tính trung bình của ROE (tỷ suất lợi nhuận trên vốn chủ sở hữu).
Dòng 3: chọn và hiển thị các cột Year, roa, roe, ros (tỷ suất lợi nhuận trên doanh thu) và debt_ratio (tỷ lệ nợ) sau khi đã lọc dữ liệu.
Ý nghĩa thống kê:
Giai đoạn 2016–2020, ROA và ROE đều vượt mức trung bình, phản ánh hiệu quả vận hành cao. Năm 22016-2017 là đỉnh cao: ROE đạt 43,2% và 44,4%, ROA đạt 32,9% và 32,1%, ROS ổn định quanh 20%, tỷ lệ nợ thấp (23,7%-31,1%). Đây là kết quả từ các thương vụ M&A Driftwood Dairy và Angkor Dairy, tối ưu hóa lợi nhuận và vốn chủ sở hữu.
2018–2020, hiệu quả giảm dần. ROE giảm xuống 40,7%-35,5%, ROA giảm tương ứng, tỷ lệ nợ tăng nhẹ (29,7%-33,5%). Hiệu quả vẫn cao nhưng áp lực cạnh tranh và chi phí đầu vào bắt đầu ảnh hưởng đến kết quả tài chính.
1. ars <- vnm %>%
2. select(
3. roa, roe,
4. debt_ratio,
5. revenue_growth,
6. size)
7. round(cor(ars, use = "pairwise.complete.obs"), 3)## roa roe debt_ratio revenue_growth size
## roa 1.000 0.991 -0.735 0.854 -0.924
## roe 0.991 1.000 -0.661 0.806 -0.879
## debt_ratio -0.735 -0.661 1.000 -0.786 0.901
## revenue_growth 0.854 0.806 -0.786 1.000 -0.812
## size -0.924 -0.879 0.901 -0.812 1.000
Giải thích kỹ thuật:
Dòng 1 đến dòng 6: chọn các cột cần thiết từ bảng vnm, bao gồm các chỉ số tài chính và các biến liên quan, bao gồm: roa, roe, debt_ratio, revenue_growth, size.
Dòng 7: tính toán ma trận tương quan giữa các cột đã chọn trong ars.Làm tròn đến 3 chữ số thập phân.
Ý nghĩa thống kê:
ROA và ROE: Tương quan rất mạnh (0.991). Điều này cho thấy các công ty có tỷ suất lợi nhuận trên tài sản cao thường cũng có tỷ suất lợi nhuận trên vốn chủ sở hữu cao. Mối quan hệ này phản ánh rằng hiệu quả sinh lời từ tài sản có liên quan chặt chẽ đến hiệu quả sinh lời từ vốn chủ sở hữu.
ROA và Debt Ratio: Tương quan âm (-0.735). Công ty có ROA cao thường có tỷ lệ nợ thấp. Điều này có thể phản ánh rằng công ty hiệu quả trong việc sinh lời từ tài sản thường ít phụ thuộc vào nợ.
ROE và Debt Ratio: Tương quan âm (-0.661). Các công ty có ROE cao có xu hướng có tỷ lệ nợ thấp. Điều này có thể chỉ ra rằng các công ty sinh lời tốt từ vốn chủ sở hữu không cần phải vay nợ nhiều để duy trì hoạt động.
ROA và Revenue Growth: Tương quan dương mạnh (0.854). Các công ty có ROA cao thường có tăng trưởng doanh thu mạnh, phản ánh khả năng sinh lời từ tài sản đóng góp vào tăng trưởng doanh thu.
ROE và Revenue Growth: Tương quan dương mạnh (0.806). Các công ty có ROE cao thường có tăng trưởng doanh thu mạnh, cho thấy khả năng sinh lời từ vốn chủ sở hữu cũng thúc đẩy tăng trưởng doanh thu.
Debt Ratio và Revenue Growth: Tương quan âm (-0.786). Các công ty có tỷ lệ nợ cao có thể có tăng trưởng doanh thu thấp, có thể là do các công ty này phải đối mặt với chi phí nợ cao, ảnh hưởng đến khả năng đầu tư vào tăng trưởng.
Size và ROA: Tương quan âm (-0.924). Các công ty lớn hơn thường có ROA thấp hơn, điều này có thể do kinh tế quy mô hoặc sự hiệu quả thấp hơn của các công ty lớn trong việc sử dụng tài sản.
Size và ROE: Tương quan âm (-0.879). Các công ty lớn hơn thường có ROE thấp hơn, có thể do quy mô lớn dẫn đến hiệu quả sử dụng vốn thấp hơn.
Size và Debt Ratio: Tương quan dương (0.901). Các công ty lớn hơn có xu hướng sử dụng nhiều nợ hơn để tài trợ cho tài sản, có thể do khả năng vay nợ tốt hơn từ các tổ chức tài chính.
Size và Revenue Growth: Tương quan âm (-0.812). Các công ty lớn hơn có thể có tăng trưởng doanh thu chậm hơn, có thể do khó khăn trong việc duy trì tăng trưởng nhanh khi quy mô đã quá lớn.
1. vnm %>%
2. arrange(Year) %>%
3. mutate(
4. delta_assets = Total_Assets - lag(Total_Assets),
5. delta_equity = Equity - lag(Equity)
6. ) %>%
7. select(Year, Total_Assets, delta_assets, Equity, delta_equity)Giải thích kỹ thuật:
Dòng 2: sắp xếp dữ liệu theo cột Year.
Dòng 3 + 4 + 5: tạo các cột mới để tính toán sự thay đổi (delta) giữa năm hiện tại và năm trước. Bao gồm 2 chỉ số: delta_assets (Biến động trong tổng tài sản giữa năm hiện tại và năm trước). delta_equity (Biến động trong vốn chủ sở hữu giữa năm hiện tại và năm trước).
Dòng 7: chọn và hiển thị các cột trong kết quả.
Ý nghĩa thống kê:
Biến động tổng tài sản (delta_assets): giai đoạn 2016-2024, tổng tài sản tăng mạnh qua các năm, đặc biệt là trong 2019 (tăng 7.334 nghìn tỷ đồng) và 2020 (tăng 3.733 nghìn tỷ đồng). Tuy nhiên, có sự giảm mạnh trong 2022 (giảm 4.850 nghìn tỷ đồng), rồi phục hồi lại vào các năm sau.
Biến động vốn chủ sở hữu (delta_equity): giai đoạn 2016-2024, vốn chủ sở hữu tăng đều, đặc biệt trong 2019 và 2020 (tăng lần lượt 3.460 và 3.916 nghìn tỷ đồng). Tuy nhiên, có sự giảm mạnh trong 2022 (giảm 3.034 nghìn tỷ đồng) và phục hồi trong 2023.
1. vnm %>%
2. filter(debt_ratio > mean(debt_ratio, na.rm = TRUE),
3. roe > mean(roe, na.rm = TRUE)) %>%
4. select(Year, roe, roa, debt_ratio)Giải thích kỹ thuật:
Dòng 2 + 3: giữ lại những bản ghi trong đó debt_ratio và ROE đều cao hơn giá trị trung bình của các cột đó.
Dòng 4: chọn các cột Year, ROE, ROA, và Debt Ratio để hiển thị kết quả.
Ý nghĩa thống kê:
Kết quả chỉ ra rằng trong hai năm 2017 và 2019, VNM đồng thời thỏa mãn cả hai điều kiện: tỷ lệ nợ cao (31,1% và 33,5%, cao hơn mức trung bình khoảng 29%) nhưng vẫn duy trì hiệu quả sinh lời vượt trội, với ROE đạt 44,4% và 37,7%.
Điều này cho thấy chiến lược tài chính của VNM trong giai đoạn này rất hiệu quả: công ty tận dụng đòn bẩy tài chính (nợ vay) để tài trợ cho các dự án đầu tư sinh lời mà không làm suy giảm lợi nhuận. Mặc dù tỷ lệ nợ cao, ROA của công ty vẫn giữ ở mức 32,1% và 25,7%, chứng tỏ công ty có khả năng sử dụng tài sản hiệu quả để tạo ra lợi nhuận. Đây là dấu hiệu rõ ràng của một chiến lược quản trị tài chính tốt và khả năngtạo ra giá trị từ các nguồn vốn huy động.
1. vnm %>%
2. mutate(dividend_payout_roe_ratio = Dividend_Payments / (roe * Equity)) %>%
3. select(Year, Dividend_Payments, roe, dividend_payout_roe_ratio)Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên dividend_payout_roe_ratio, được tính bằng cách chia Dividend_Payments (tiền chi trả cổ tức) cho roe * Equity (tỷ suất lợi nhuận trên vốn chủ sở hữu nhân với vốn chủ sở hữu).
Dòng 4: chọn các biến liên quan để hiển thị.
Ý nghĩa thống kê:
Tỷ lệ chi trả cổ tức so với ROE (dividend_payout_roe_ratio) luôn âm qua các năm, phản ánh rằng tiền chi trả cổ tức luôn lớn hơn lợi nhuận sinh ra từ vốn chủ sở hữu (ROE). Điều này có thể chỉ ra rằng công ty không thực hiện chi trả cổ tức từ lợi nhuận mà có thể thực hiện mua lại cổ phiếu hoặc có các chiến lược tài chính khác.
Tỷ lệ chi trả cổ tức so với ROE trong các năm dao động mạnh mẽ: năm 2016 có tỷ lệ chi trả cổ tức so với ROE là -0.7475, cho thấy công ty có chi trả cổ tức rất lớn so với lợi nhuận sinh ra từ vốn chủ sở hữu. Năm 2022 có tỷ lệ chi trả cao nhất -0.9814, phản ánh công ty có chi trả cổ tức cao dù ROE giảm mạnh, điều này có thể chỉ ra sự phụ thuộc vào lợi nhuận trước đó hoặc sử dụng các chiến lược tài chính khác như vay mượn hoặc bán tài sản để chi trả cổ tức.
1. vnm %>%
2. mutate(cce_ratio = Operating_Cash_Flow / Net_Profit_After_Tax) %>%
3. select(Year, Operating_Cash_Flow, Net_Profit_After_Tax, cce_ratio)Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên cce_ratio, được tính bằng cách chia Operating_Cash_Flow (lưu chuyển tiền thuần từ hoạt động kinh doanh) cho Net_Profit_After_Tax (lợi nhuận sau thuế TNDN).
Dòng 3: chọn các cột cần hiển thị.
Ý nghĩa thống kê:
Tỷ lệ CCE (tỷ lệ dòng tiền so với lợi nhuận) dao động từ 0.798 (năm 2018) đến 1.081 (năm 2019). Tỷ lệ này cho thấy mức độ chuyển đổi lợi nhuận thành dòng tiền từ hoạt động kinh doanh của công ty.
Tỷ lệ > 1 (như năm 2019, 2022) cho thấy công ty có thể tạo ra dòng tiền tốt hơn lợi nhuận, phản ánh khả năng quản lý dòng tiền mạnh mẽ và khả năng thanh toán tốt.
Tỷ lệ < 1 (như năm 2016, 2018, 2023) cho thấy dòng tiền thuần từ hoạt động kinh doanh thấp hơn lợi nhuận sau thuế, có thể chỉ ra rằng công ty có khó khăn trong việc chuyển đổi lợi nhuận thành tiền mặt do các khoản phải thu hoặc tồn kho tăng.
Lưu chuyển tiền thuần từ hoạt động kinh doanh (Operating Cash Flow) cho thấy sự ổn định và biến động trong dòng tiền từ hoạt động kinh doanh. Các năm có Operating Cash Flow cao như 2019 và 2020 (lần lượt là 1.14e+13 và 1.02e+13) cho thấy công ty có dòng tiền mạnh mẽ từ các hoạt động kinh doanh trong các năm này.
Lợi nhuận sau thuế TNDN (Net Profit After Tax) thể hiện lợi nhuận của công ty sau khi trừ thuế. Lợi nhuận năm 2020 cao nhất, đạt 1.12e+13, nhưng công ty vẫn gặp phải tỷ lệ CCE thấp (0.906), cho thấy một sự không đồng nhất giữa lợi nhuận và dòng tiền.
1. vnm <- vnm %>%
2. mutate(
3. across(
4. c(Operating_Cash_Flow, Investing_Cash_Flow),
5. ~ parse_number(
6. as.character(.),
7. locale = locale(grouping_mark = ",", decimal_mark = ".")
8. ) * ifelse(grepl("^\\(.*\\)$", as.character(.)), -1, 1))
9. ) %>%
10. mutate(
11. Free_Cash_Flow = rowSums(across(c(Operating_Cash_Flow, Investing_Cash_Flow)),
12. na.rm = FALSE))
13. vnm_fcf_am <- vnm %>%
14. filter(!is.na(Free_Cash_Flow) & Free_Cash_Flow < 0) %>%
15. select(Year,
16. Operating_Cash_Flow,
17. Investing_Cash_Flow,
18. Free_Cash_Flow)
19. print(vnm_fcf_am)## # A tibble: 0 × 4
## # ℹ 4 variables: Year <dbl>, Operating_Cash_Flow <dbl>,
## # Investing_Cash_Flow <dbl>, Free_Cash_Flow <dbl>
Giải thích kỹ thuật:
Dòng 2: mutate(): Hàm này được sử dụng để tạo hoặc chỉnh sửa cột trong dữ liệu.
Dòng 3: select() dùng để chọn các cột cụ thể trong bộ dữ liệu.
Dòng 1: print(vnm_fcf_am) In bảng kết quả.
Ý nghĩa thống kê:
Kết quả tính Dòng tiền tự do (Free Cash Flow – FCF) cho thấy mức chênh lệch giữa dòng tiền thuần từ hoạt động kinh doanh (CFO) và dòng tiền đầu tư (CFI) của từng năm.
Nếu FCF dương, điều đó phản ánh khả năng tự tài trợ tốt, doanh nghiệp tạo ra đủ dòng tiền từ hoạt động kinh doanh để trang trải cho đầu tư và vẫn còn dư tiền mặt. Đây là tín hiệu an toàn tài chính và hiệu quả sử dụng vốn cao.
Nếu FCF âm, có thể hiểu rằng các khoản đầu tư, mua sắm tài sản hoặc chi phí vốn vượt quá lượng tiền tạo ra từ hoạt động chính. Tuy nhiên, FCF âm không phải luôn tiêu cực — nó thường xuất hiện trong giai đoạn mở rộng quy mô, đầu tư dài hạn hoặc tái cấu trúc tài sản, nên cần xem xét song song với ROA, ROE và tỷ lệ nợ để đánh giá tính bền vững.
Trong trường hợp bảng kết quả không hiển thị năm nào có FCF âm, điều đó chứng tỏ VNM duy trì được dòng tiền hoạt động dương ổn định và đầu tư ở mức kiểm soát được, phản ánh sức khỏe tài chính tốt và khả năng tự cân đối dòng tiền cao trong giai đoạn 2015–2024.
1. vnm %>%
2. mutate(retention_ratio = 1 - (Dividend_Payments / Net_Profit_After_Tax)) %>%
3. select(Year, Net_Profit_After_Tax, Dividend_Payments, retention_ratio)Giải thích kỹ thuật:
Dòng 2: tạo một cột mới có tên retention_ratio (tỷ lệ giữ lại), được tính bằng 1 - (Dividend_Payments / Net_Profit_After_Tax).
Dòng 3: chọn các cột cần hiển thị.
Ý nghĩa thống kê:
Tỷ lệ giữ lại (Retention Ratio) liên tục duy trì ở mức cao (trên 1) qua các năm, cho thấy công ty giữ lại phần lớn lợi nhuận để tái đầu tư thay vì chi trả cổ tức. Tỷ lệ này dao động từ 1.565 (năm 2017) đến 1.938 (năm 2022).
Tiền chi trả cổ tức (Dividend Payments) luôn có giá trị âm, phản ánh rằng công ty không chi trả cổ tức dương mà có thể thực hiện mua lại cổ phiếu hoặc giữ lại lợi nhuận để đầu tư vào các dự án khác. Mặc dù công ty không chi trả cổ tức dương, tỷ lệ giữ lại cao cho thấy chiến lược của công ty là tái đầu tư lợi nhuận thay vì trả cho cổ đông dưới dạng cổ tức.
Lợi nhuận sau thuế (Net Profit After Tax) tăng ổn định qua các năm, từ 7,770 tỷ đồng (năm 2024) lên 9,450 tỷ đồng (năm 2024), cho thấy công ty duy trì tăng trưởng ổn định trong lợi nhuận.
1. vnm %>%
2. mutate(delta_cash_flow = Operating_Cash_Flow - lag(Operating_Cash_Flow),
3. delta_profit = Net_Profit_After_Tax - lag(Net_Profit_After_Tax)) %>%
4. select(Year, delta_cash_flow, delta_profit)Giải thích kỹ thuật:
Dòng 2 + 3: tạo một cột mới có tên là delta_cash_flow, tính toán sự thay đổi (biến động) của Operating_Cash_Flow (Lưu chuyển tiền thuần từ hoạt động kinh doanh) qua các năm. Tạo một cột mới có tên là delta_profit, tính toán sự thay đổi (biến động) của Net_Profit_After_Tax (Lợi nhuận sau thuế) qua các năm.
Dòng 4: chọn các cột cần hiển thị.
Ý nghĩa thống kê:
Dòng tiền từ hoạt động kinh doanh và lợi nhuận của VNM trong giai đoạn 2015-2024 có sự biến động đáng kể.
Cụ thể, trong năm 2018, dòng tiền giảm mạnh với mức giảm -1.461 nghìn tỷ đồng và lợi nhuận sau thuế giảm nhẹ -72 tỷ đồng. Tương tự, năm 2022, dòng tiền giảm -604 tỷ đồng và lợi nhuận giảm mạnh -2.055 nghìn tỷ đồng. Tuy nhiên, vào các năm 2023 và 2024, công ty đã phục hồi mạnh mẽ với dòng tiền tăng 939 tỷ đồng (2023) và 1.798 nghìn tỷ đồng (2024), cùng với lợi nhuận phục hồi ở mức 441 tỷ đồng (2023) và 433 tỷ đồng (2024).
Sự suy giảm trong một số năm có thể phản ánh các yếu tố bên ngoài như biến động thị trường hoặc ảnh hưởng của đại dịch COVID-19. Tuy nhiên, sự phục hồi sau đó cho thấy khả năng quản lý tài chính tốt, cũng như chiến lược tái đầu tư và tối ưu hóa hoạt động kinh doanh hiệu quả.
1. vnm %>%
2. arrange(Year) %>%
3. mutate(
4. pct_ts = (Total_Assets / lag(Total_Assets) - 1),
5. pct_dt = (Net_Sales / lag(Net_Sales) - 1),
6. pct_ln = (Net_Profit_After_Tax / lag(Net_Profit_After_Tax) - 1)
7. ) %>%
8. select(Year, pct_ts, pct_dt, pct_ln)Giải thích kỹ thuật:
Dòng 2: sắp xếp dữ liệu theo năm.
Dòng 3 đến dòng 6: pct_ts tính tỷ lệ thay đổi phần trăm của tổng tài sản (Total Assets) so với năm trước. pct_dt tính tỷ lệ thay đổi phần trăm của doanh thu thuần (Net Sales) so với năm trước. pct_ln tính tỷ lệ thay đổi phần trăm của lợi nhuận sau thuế (Net Profit After Tax) so với năm trước
Dòng 8: chọn các cột để hiển thị kết quả.
Ý nghĩa thống kê:
Tỷ lệ thay đổi của tổng tài sản (pct_ts) cho thấy sự tăng trưởng ổn định trong các năm đầu, với 6.92% vào 2016, 18.00% vào 2017, và 7.78% vào 2018, nhưng có sự giảm mạnh -9.09% vào 2022, phản ánh sự thu hẹp quy mô công ty hoặc giảm tài sản. Tuy nhiên, tổng tài sản đã phục hồi và tăng trở lại 4.51% vào 2024.
Tỷ lệ thay đổi của doanh thu thuần (pct_dt), doanh thu tăng mạnh 16.75% vào 2016, nhưng giảm -1.58% vào 2022 do tác động từ các yếu tố bên ngoài hoặc yếu tố nội bộ, trước khi phục hồi nhẹ với 0.69% vào 2023 và tiếp tục tăng 2.34% vào 2024.
Cuối cùng, tỷ lệ thay đổi của lợi nhuận sau thuế (pct_ln) tăng mạnh 20.52% vào 2016, nhưng giảm nhẹ -0.71% vào 2018 và giảm sâu -19.33% vào 2022 do chi phí tăng cao hoặc giảm hiệu quả kinh doanh, trước khi phục hồi 4.81% vào 2024.
1. data1p <- subset(
2. vnm,
3. roe > 0.15 & efficiency_category == "High Efficiency")
4. data1p %>%
5. select(Year, Total_Assets, Equity, Total_Liabilities, roe, efficiency_category)Giải thích kỹ thuật:
Dòng 1 + 2 + 3: chọn ra những năm mà tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) lớn hơn 15% trong bộ dữ liệu vnm và điều kiện efficiency_category == "High Efficiency".
Dòng 5: chọn các cột để hiển thị kết quả.
Ý nghĩa thống kê:
Kết quả trên cho thấy trong giai đoạn 2016–2018, Vinamilk (VNM) đạt hiệu quả sinh lời rất cao với ROE vượt trội (lớn hơn 15%) và được xếp vào nhóm “Tốt”. Cụ thể, năm 2016, ROE đạt 43,22%, cho thấy khả năng sinh lời mạnh mẽ với tổng tài sản khoảng 29.378 tỷ đồng, vốn chủ sở hữu 22.406 tỷ đồng và nợ phải trả chỉ 6.973 tỷ đồng. Năm 2017, ROE tăng lên 44,42%, giữ vững hiệu quả dù tổng tài sản và nợ có xu hướng tăng, chứng tỏ công ty vẫn duy trì được hiệu quả sử dụng vốn ổn định. Đến năm 2018, ROE giảm nhẹ xuống còn 40,70%, nhưng vẫn nằm trong mức hiệu quả rất tốt, cho thấy công ty vẫn duy trì khả năng sinh lời cao dù có xu hướng giảm nhẹ.
Giai đoạn 2016–2018 có thể xem là thời kỳ “vàng” của Vinamilk, với khả năng sinh lời cao, quản trị vốn hiệu quả và cơ cấu tài sản – nợ hợp lý. Tuy nhiên, sau giai đoạn này, sự giảm nhẹ của ROE phản ánh sự bão hòa thị trường hoặc sự gia tăng chi phí đầu tư mở rộng.
1. data4p <- subset(
2. vnm,
3. Operating_Cash_Flow > 0 &
4. roe > 0.13)
5. data4p %>%
6. select(Year, roe, Operating_Cash_Flow)Giải thích kỹ thuật:
Dòng 1 đến dòng 4: lọc dữ liệu từ bảng vnm để chỉ giữ lại những công ty có lưu chuyển tiền thuần từ hoạt động kinh doanh lớn hơn 0 và ROE lớn hơn 0.13.
Dòng 5 + 6: chọn các cột hiển thị.
Ý nghĩa thống kê:
Tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE) có xu hướng giảm dần qua các năm, từ 43.22% trong 2016 xuống 26.55% trong 2024, sự giảm này có thể cho thấy hiệu quả sinh lời từ vốn đang bị ảnh hưởng bởi chi phí gia tăng hoặc quản lý tài chính chưa tối ưu trong những năm gần đây.
Lưu chuyển tiền thuần từ hoạt động kinh doanh (Operating Cash Flow) tăng mạnh vào 2019 lên 11.400 tỷ đồng, sau đó có sự giảm nhẹ vào 2023 và 2022, nhưng lại tăng trở lại vào 2024 với 9.690 tỷ đồng.
Sự biến động này cho thấy công ty đã có lưu chuyển tiền dương mạnh mẽ trong những năm đầu, nhưng có thể gặp khó khăn trong việc duy trì mức độ dòng tiền ổn định vào cuối giai đoạn, có thể do các yếu tố ngoại cảnh hoặc chi phí gia tăng.
1. mean_roe <- mean(vnm$roe, na.rm = TRUE)
2. data_filtered <- subset(
3. vnm,
4. Operating_Cash_Flow > 0 &
5. Financing_Cash_Flow < 0 &
6. roe > mean_roe)
7. data_filtered %>%
8. select(Year, roe, Operating_Cash_Flow, Financing_Cash_Flow)Giải thích kỹ thuật:
Dòng 1: tính trung bình biến roe.
Dòng 2 đến dòng 5: lọc dữ liệu theo các điều kiện cụ thể. Trong trường hợp này, ba điều kiện lọc được áp dụng là dòng tiền thuần từ hoạt động kinh doanh dương (Operating_Cash_Flow > 0), dòng tiền thuần từ hoạt động tài chính âm (Financing_Cash_Flow < 0), ROE cao hơn trung bình (roe > mean_roe).
Ý nghĩa thống kê:
ROE có xu hướng giảm dần từ 2016 đến 2020, từ 43.22% xuống 35.46%, cho thấy khả năng sinh lời từ vốn chủ sở hữu đang suy giảm. Tuy nhiên, ROE vẫn ở mức cao, cho thấy công ty vẫn duy trì hiệu quả sinh lời tốt từ vốn của cổ đông.
Operating Cash Flow có xu hướng tăng mạnh từ 2016 đến 2019, đạt mức 11.400 tỷ đồng vào năm 2019, sau đó giảm nhẹ trong 2020.
Điều này cho thấy công ty tạo ra dòng tiền mạnh mẽ từ hoạt động kinh doanh trong những năm trước đó, nhưng sự giảm nhẹ trong 2020 có thể phản ánh tác động tiêu cực của COVID-19 hoặc các yếu tố thị trường khác.
Financing Cash Flow luôn âm trong toàn bộ giai đoạn 2016-2020, điều này có thể chỉ ra rằng công ty không huy động thêm vốn hoặc giảm nợ trong các năm này. Tuy nhiên, dòng tiền âm trong hoạt động tài chính có thể phản ánh sự giảm sử dụng nợ hoặc chính sách trả nợ cao của công ty.
1. ggplot(vnm, aes(x = Year, y = debt_ratio)) +
2. geom_line(linewidth = 1.2, color = "#C3F550") +
3. geom_point(size = 2, color = "#2a9d8f") +
4. geom_smooth(method = "loess", se = FALSE, color = "#1b4332") +
5. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
6. labs(title = "Tỷ lệ nợ qua các năm",
7. y = "Tỷ lệ nợ",
8. x = "Năm") +
9. theme_minimal(base_size = 14) +
10. theme(
11. plot.title = element_text(hjust = 0.5, face = "bold", color = "#333"),
12. axis.title.x = element_text(face = "bold", size = 12),
13. axis.title.y = element_text(face = "bold", size = 12),
14. axis.text.y = element_text(size = 10))Giải thích kỹ thuật:
Dòng 2: Dữ liệu được phân nhóm theo năm và tỷ lệ nợ.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho tỷ lệ nợ.
Dòng 5 đến Dòng 7: Các điểm màu xanh lá cây được vẽ trên các đường xu hướng,giúp làm nổi bật các thay đổi cụ thể của tỷ lệ nợ trong từng năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề và in đậm tiêu đề
Ý nghĩa thống kê:
Biểu đồ thể hiện sự thay đổi của tỷ lệ nợ qua các năm từ 2015 đến 2023. Dựa trên biểu đồ Đường xanh lá cây (dashed): Tỷ lệ nợ có sự biến động rõ rệt qua các năm, với các đỉnh và đáy không đều. Điều này cho thấy tỷ lệ nợ thay đổi theo từng năm, có thể do các yếu tố tác động cụ thể như thay đổi trong các khoản vay hoặc tài sản
Đường đen (solid): Đường xu hướng tổng thể cho thấy tỷ lệ nợ có xu hướng tăng lên từ 2015 đến 2023. Sự gia tăng này có thể phản ánh một yếu tố tài chính hoặc chiến lược vay nợ ngày càng gia tăng trong suốt giai đoạn này.
Biểu đồ này giúp theo dõi sự thay đổi của tỷ lệ nợ theo thời gian và xác định các xu hướng chính, từ đó có thể đưa ra các quyết định tài chính hoặc kế hoạch giảm nợ hiệu quả hơn.
1. ggplot(vnm, aes(x = Year, y = roa)) +
2. geom_line(color = "#4daf4a", size = 1.2) +
3. geom_point(size = 3, color = "#2a9d8f") +
4. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
5. labs(
6. title = "Tỷ suất lợi nhuận trên tài sản (ROA) qua các năm",
7. x = "Năm",
8. y = "Tỷ suất lợi nhuận trên tài sản") +
9. theme_minimal(base_size = 14) +
10. theme(
11. plot.title = element_text(hjust = 0.5, face = "bold", color = "#333"),
12. axis.title.x = element_text(face = "bold", size = 12),
13. axis.title.y = element_text(face = "bold", size = 12),
14. axis.text.y = element_text(size = 10))Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện tỷ suất lợi nhuận trên tài sản của công ty qua các năm.
Dòng 3: Trục x đại diện cho, trục y đại diện cho tỷ suất lợi nhuận trên tài sản (ROA).
Dòng 5 đến Dòng 7: Các điểm dữ liệu cho thấy sự giảm sút liên tục của ROA, từ mức cao gần 0.35 trong năm 2015 đến mức thấp dưới 0.20 vào năm 2023.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê: Biểu đồ này cho thấy xu hướng thay đổi của tỷ suất lợi nhuận trên tài sản (ROA) của công ty qua các năm:
Tăng trưởng ban đầu (2015-2017): ROA có sự ổn định cao trong giai đoạn đầu, nhưng sau đó bắt đầu giảm mạnh từ năm 2017. Sự giảm sút mạnh (2017-2023): ROA giảm mạnh, có thể phản ánh sự suy giảm trong hiệu quả sử dụng tài sản hoặc tăng trưởng chậm trong lợi nhuận so với tài sản.
1. vars <- vnm |> dplyr::select(
2. roe, roa, ros, debt_ratio, revenue_growth, size, Equity, Total_Assets)
3. mat <- round(cor(vars, use = "pairwise.complete.obs"), 2)
4. dfm <- reshape2::melt(mat, varnames = c("x", "y"), value.name = "corr")
5. ggplot(dfm, aes(x, y, fill = corr)) +
6. geom_tile(color = "white") +
7. geom_text(aes(label = corr), size = 3) +
8. scale_fill_gradient2(low = "#b2182b", mid = "white", high = "#2166ac", midpoint = 0) +
9. coord_equal() +
10. labs(title = "Ma trận tương quan", x = "", y = "") +
11. theme(axis.text.x = element_text(angle = 45, hjust = 1),
12. plot.title = element_text(hjust = 0.5, size = 16, face = "bold"))Giải thích kỹ thuật:
Dòng 5 đến Dòng 8: Giá trị tương quan được ghi ở trong các ô của ma trận, giúp người xem dễ dàng nhận diện mối quan hệ giữa các biến.
Dòng 9 đến Dòng 12: Đặt nhãn cho các trục x và y, cung cấp tên biến, và cung cấp tiêu đề cho ma trận tương quan.
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê:
Ma trận tương quan cho thấy các mối quan hệ quan trọng giữa các biến tài chính: Total_Assets và Equity: Tương quan rất mạnh (0,99), phản ánh mối liên hệ chặt chẽ giữa tổng tài sản và vốn chủ sở hữu.
Size và Total_Assets: Tương quan dương mạnh (0,88), cho thấy các công ty lớn thường sở hữu tổng tài sản cao hơn.
Revenue_Growth và Total_Assets, Equity: Tương quan mạnh, chứng tỏ tăng trưởng doanh thu đi kèm với sự phát triển tài sản và vốn chủ sở hữu.
Debt_Ratio và Total_Assets, Equity: Tương quan âm (-0,88 và -0,86), cho thấy khi tổng tài sản và vốn chủ sở hữu tăng, tỷ lệ nợ có xu hướng giảm.
ROE và ROS: Tương quan dương mạnh (0,91), phản ánh lợi nhuận trên vốn chủ sở hữu liên kết chặt với tỷ suất lợi nhuận trên doanh thu.
Nhìn chung, ma trận này giúp đánh giá mức độ gắn kết giữa các chỉ số tài chính, từ đó hỗ trợ phân tích hiệu quả hoạt động và hoạch định chiến lược tài chính.
1. vnm <- vnm %>%
2. mutate(Dividend_Payout_Ratio = Dividend_Payments / Net_Profit_After_Tax * 100)
3. ggplot(vnm, aes(x = Year, y = Dividend_Payout_Ratio)) +
4. geom_line(color = "#F47983", linewidth = 1.2) +
5. geom_point(size = 3, color = "#264653") +
6. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
7. labs(
8. title = "Tỷ lệ chi trả cổ tức qua các năm",
9. x = "Năm",
10. y = "Tỷ lệ chi trả cổ tức (%)") +
11. theme_minimal(base_size = 14) +
12. theme(
13. plot.title = element_text(hjust = 0.5, face = "bold", color = "#333"),
14. axis.title.x = element_text(face = "bold", size = 12),
15. axis.title.y = element_text(face = "bold", size = 12),
16. axis.text.y = element_text(size = 10))Giải thích kỹ thuật:
Dòng 2: Dữ liệu được phân nhóm theo năm và tỷ lệ chi trả cổ tức.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho tỷ lệ chi trả cổ tức (tính theo phần trăm).
Dòng 5 đến Dòng 7: Các điểm thể hiện tỷ lệ chi trả cổ tức cho mỗi năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê:
Biểu đồ thể hiện sự thay đổi tỷ lệ chi trả cổ tức qua các năm từ 2015 đến 2023. Dựa trên biểu đồ:
Năm 2017: Tỷ lệ chi trả cổ tức đạt đỉnh cao (gần 85%), phản ánh một năm có mức chi trả cổ tức đặc biệt cao.
Năm 2019: Tỷ lệ chi trả cổ tức giảm mạnh xuống mức thấp nhất, gần 70%, có thể do thay đổi trong chính sách chi trả hoặc các yếu tố tài chính ảnh hưởng đến doanh thu của công ty. Sau năm 2019: Tỷ lệ chi trả cổ tức bắt đầu tăng nhẹ trở lại, mặc dù không đạt mức cao như năm 2017.
Biểu đồ này giúp theo dõi sự thay đổi trong chính sách chi trả cổ tức qua các năm và xác định những năm có sự biến động lớn trong tỷ lệ chi trả, hỗ trợ việc phân tích các yếu tố tác động đến quyết định chi trả cổ tức.
1. vnm_sub <- vnm %>%
2. select(Year, roe, roa, ros, debt_ratio) %>%
3. pivot_longer(
4. cols = -Year,
5. names_to = "Indicator",
6. values_to = "Value")
7. ggplot(vnm_sub, aes(x = as.factor(Year), y = Value, color = Indicator, group = Indicator)) +
8. geom_line(linewidth = 1) +
9. geom_point(size = 2) +
10. facet_wrap(~ Indicator, scales = "free_y", ncol = 2) +
11. scale_x_discrete(breaks = unique(vnm_sub$Year)[seq(1, length(unique(vnm_sub$Year)), by = 2)]) +
12. labs(
13. title = "Diễn biến các chỉ tiêu tài chính chính qua các năm",
14. x = "Năm",
15. y = "Giá trị",
16. color = "Chỉ tiêu") +
17. theme_minimal(base_size = 13) +
18. theme(
19. plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
20. legend.position = "none",
21. panel.grid.minor = element_blank(),
22. strip.text = element_text(face = "bold", color = "#2A9D8F"))Giải thích kỹ thuật:
Dòng 5 đến Dòng 7: Các đường trong từng biểu đồ được vẽ nối các điểm dữ liệu, với màu sắc riêng biệt cho mỗi chỉ tiêu tài chính. Mỗi điểm dữ liệu thể hiện giá trị của chỉ tiêu tài chính tương ứng trong từng năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện xu hướng các chỉ tiêu tài chính chính từ 2015–2023, trong đó Debt Ratio (tỷ lệ nợ) tăng mạnh vào năm 2017 và duy trì mức cao đến 2023, phản ánh việc gia tăng nợ vay trong giai đoạn này. ROA (tỷ suất lợi nhuận trên tài sản) giảm đều, cho thấy hiệu quả sử dụng tài sản giảm theo thời gian, trong khi ROE (tỷ suất lợi nhuận trên vốn chủ sở hữu) biến động mạnh và giảm gần đây, phản ánh lợi nhuận thấp hơn so với vốn chủ sở hữu
ROS (tỷ suất lợi nhuận trên doanh thu) giảm mạnh giai đoạn 2015–2021, sau đó hồi phục nhẹ năm 2023, cho thấy khả năng sinh lời từ doanh thu dần cải thiện. Nhìn chung, biểu đồ giúp đánh giá xu hướng hiệu quả tài chính, hỗ trợ hoạch định chiến lược kinh doanh, quản lý nợ và tối ưu hóa lợi nhuận.
1. ggplot(vnm, aes(x = Year,
2. y = Net_Sales / 1e12)) +
3. geom_line(color = "grey60", linewidth = 1) +
4. geom_point(aes(size = Net_Profit_After_Tax / 1e12, color = ros), alpha = 0.85) +
5. scale_color_gradient(low = "#fee0d2", high = "#cb181d", name = "ROS (%)") +
6. scale_size_continuous(range = c(3, 10), name = "Net Profit (trillion VND)") +
7. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), by = 1)) +
8. labs(
9. title = "Revenue – Net Profit – ROS by Year",
10. x = "Year",
11. y = "Revenue (trillion VND)") +
12. theme_minimal(base_size = 13) +
13. theme(
14. plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
15. legend.title = element_text(face = "bold"),
16. legend.position = "right")Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện sự thay đổi của doanh thu, lợi nhuận ròng và tỷ suất lợi nhuận trên doanh thu qua các năm.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho doanh thu.
Dòng 4: Biểu đồ dạng phân tán với các điểm biểu thị doanh thu qua các năm. Mỗi điểm được đánh dấu bằng các vòng tròn có kích thước khác nhau, thể hiện mức lợi nhuận ròng.
Dòng 5 đến Dòng 7: Đường nối các điểm cho thấy xu hướng của doanh thu qua các năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ. Cung cấp chú thích cho lợi nhuận ròng và ROS.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện mối quan hệ giữa doanh thu, lợi nhuận ròng và ROS qua các năm. Doanh thu tăng đều từ 2015–2024, đặc biệt mạnh ở giai đoạn gần đây, cho thấy sự tăng trưởng ổn định. Kích thước điểm biểu thị lợi nhuận ròng, lớn dần theo thời gian, phản ánh mức sinh lời cao hơn. Màu sắc điểm thể hiện ROS, có xu hướng tăng rõ rệt từ 2017–2024, chứng tỏ công ty ngày càng hiệu quả trong chuyển đổi doanh thu thành lợi nhuận. Nhìn chung, biểu đồ cho thấy hiệu quả tài chính và khả năng sinh lời của công ty được cải thiện liên tục, hỗ trợ cho các chiến lược phát triển dài hạn.
1. roll_sd <- function(x, k = 3) {
2. sapply(seq_along(x), function(i) {
3. j <- max(1, i - k + 1):i
4. sd(x[j], na.rm = TRUE)})}
5. vnm_roe <- vnm %>%
6. arrange(Year) %>%
7. mutate(roe_sd3 = roll_sd(roe, 3))
8. ggplot(vnm_roe, aes(x = Year)) +
9. geom_col(aes(y = roe_sd3), fill = "#a8ddb5", alpha = 0.8) +
10. geom_line(aes(y = roe), color = "#2e8b57", linewidth = 1.2) +
11. geom_point(aes(y = roe), size = 3, color = "#006d2c") +
12. geom_hline(
13. yintercept = mean(vnm_roe$roe_sd3, na.rm = TRUE),
14. linetype = 2,
15. color = "#66bb6a") +
16. scale_x_continuous(breaks = seq(min(vnm_roe$Year), max(vnm_roe$Year), 2)) +
17. labs(
18. title = "Độ biến động ROE (trung bình trượt 3 năm)",
19. x = "Năm",
20. y = "Giá trị") +
21. theme_minimal(base_size = 16)+
22. theme(
23. plot.title = element_text(hjust = 0.5, face = "bold"),
24. axis.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện sự biến động của tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE), với giá trị trung bình trượt 3 năm.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho giá trị ROE.
Dòng 4: Biểu đồ đường với các điểm được đánh dấu bằng hình tròn xanh đậm, thể hiện sự biến động của ROE qua các năm.
Dòng 5 đến Dòng 7: Các điểm dữ liệu thể hiện giá trị ROE cho từng năm và đường nối chúng cho thấy xu hướng của ROE qua các năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện xu hướng ROE của công ty từ 2015 đến 2023, trong đó năm 2017 đạt mức cao nhất gần 0.45, sau đó giảm dần trong giai đoạn 2018–2021, phản ánh khả năng sinh lời chịu ảnh hưởng bởi chiến lược hoặc điều kiện tài chính trong các năm này. Từ 2022 đến 2023, ROE có sự cải thiện nhẹ và giữ ổn định, trong khi đường chấm thể hiện mức trung bình ROE giai đoạn 2015–2023, giúp so sánh các biến động theo năm.
Biểu đồ cung cấp cái nhìn tổng quan về hiệu quả sinh lời của công ty, hỗ trợ đánh giá xu hướng ROE và khả năng duy trì sinh lời bền vững trong suốt giai đoạn nghiên cứu.
1. pareto <- vnm %>%
2. arrange(desc(Net_Profit_After_Tax)) %>%
3. mutate(
4. ty_le = Net_Profit_After_Tax / sum(Net_Profit_After_Tax, na.rm = TRUE),
5. ty_le_tich_luy = cumsum(ty_le))
6. ggplot(pareto, aes(x = reorder(as.factor(Year), -Net_Profit_After_Tax))) +
7. geom_col(aes(y = ty_le * 100), fill = "#74c476") +
8. geom_line(aes(y = ty_le_tich_luy * 100, group = 1),
9. color = "#08519c", linewidth = 1.2) +
10. geom_point(aes(y = ty_le_tich_luy * 100),
11. color = "#2171b5", size = 2) +
12. geom_hline(yintercept = 80, linetype = "dashed", color = "red") +
13. scale_y_continuous(
14. name = "Tỷ trọng lợi nhuận (%)",
15. sec.axis = sec_axis(~ ., name = "Tỷ lệ tích lũy (%)")) +
16. labs(
17. title = "Đóng góp của lợi nhuận sau thuế theo năm",
18. x = "Năm",
19. y = "Tỷ trọng (%)") +
20. theme_minimal(base_size = 13) +
21. theme(
22. plot.title = element_text(hjust = 0.5, face = "bold"),
23. axis.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 2: Thể hiện tỷ trọng lợi nhuận sau thuế đóng góp theo từng năm.
Dòng 3: Trục x đại diện cho các năm, trục y đại diện cho tỷ trọng lợi nhuận sau thuế.
Dòng 5 đến Dòng 7: Các điểm dữ liệu thể hiện tỷ trọng lợi nhuận sau thuế của mỗi năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ thể hiện tỷ trọng lợi nhuận sau thuế của công ty từ 2015 đến 2024, với xu hướng tăng mạnh từ 2020 đến 2024, phản ánh sự gia tăng lợi nhuận ổn định qua các năm. Trước 2020, tỷ trọng lợi nhuận thấp hơn, có thể do chi phí cao hoặc các yếu tố bất ổn trong giai đoạn đầu. Đường chấm đỏ thể hiện mốc 100%, cho thấy mặc dù lợi nhuận tăng, công ty vẫn chưa đạt hiệu quả tối ưu
Biểu đồ giúp đánh giá sự phát triển của tỷ trọng lợi nhuận sau thuế, cung cấp cơ sở để đưa ra các chiến lược tối ưu hóa lợi nhuận trong các năm tiếp theo.
1. vnm_cf <- vnm %>%
2. select(Year,
3. Operating_Cash_Flow,
4. Investing_Cash_Flow,
5. Financing_Cash_Flow) %>%
6. mutate(across(-Year, ~as.numeric(.))) %>%
7. pivot_longer(-Year, names_to = "Activity", values_to = "Cash_Flow")
8. ggplot(vnm_cf, aes(x = factor(Year), y = Cash_Flow / 1e12, fill = Activity)) +
9. geom_col() +
10. scale_fill_manual(
11. values = c("#2e7d32", "#81c784", "#a5d6a7"),
12. labels = c("Hoạt động kinh doanh", "Hoạt động đầu tư", "Hoạt động tài chính")) +
13. geom_hline(yintercept = 0, color = "#004d40", linetype = "dashed") +
14. labs(
15. title = "Dòng tiền theo từng hoạt động của doanh nghiệp",
16. subtitle = "Phân tích ba dòng tiền chính: kinh doanh, đầu tư, tài chính",
17. x = "Năm",
18. y = "Giá trị (nghìn tỷ đồng)",
19. fill = "Loại hoạt động") +
20. theme_minimal(base_size = 12) +
21. theme(
22. legend.position = "right",
23. plot.title = element_text(hjust = 0.5, face = "bold"),
24. plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
25. axis.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho giá trị dòng tiền (nghìn tỷ đồng).
Dòng 4: Biểu đồ dạng cột (bar plot) với các cột phân chia theo ba loại hoạt động
Dòng 5 đến Dòng 7: Các cột được phân biệt rõ ràng theo màu sắc của từng loại hoạt động.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ phân tích dòng tiền của doanh nghiệp từ 2015 đến 2024, cho thấy dòng tiền từ hoạt động kinh doanh biến động rõ rệt, đặc biệt tăng mạnh trong giai đoạn 2021–2024, phản ánh hiệu quả và sự ổn định trong hoạt động sản xuất kinh doanh. Dòng tiền từ hoạt động đầu tư dao động, đôi khi âm, cho thấy công ty chi nhiều cho các dự án đầu tư lớn. Dòng tiền từ hoạt động tài chính tương đối ổn định nhưng vẫn có biến động, phản ánh các khoản vay hoặc phát hành cổ phiếu để tài trợ cho kinh doanh và đầu tư
1. ggplot(vnm, aes(x = Year)) +
2. geom_col(aes(y = Total_Assets / 1e12, fill = "Tổng tài sản"), alpha = 0.6) +
3. geom_line(aes(y = Equity / 1e12, color = "Vốn chủ sở hữu"), linewidth = 1.2) +
4. geom_point(aes(y = Equity / 1e12, color = "Vốn chủ sở hữu"), size = 3) +
5. geom_line(aes(y = Total_Liabilities / 1e12, color = "Nợ phải trả"),
6. linewidth = 1.2, linetype = "dashed") +
7. geom_text(
8. aes(y = Total_Assets / 1e12,
9. label = round(Total_Assets / 1e12, 1)),
10. vjust = -0.5, size = 3, color = "black") +
11. scale_fill_manual(values = c("Tổng tài sản" = "#74c476")) +
12. scale_color_manual(values = c(
13. "Vốn chủ sở hữu" = "#1f78b4",
14. "Nợ phải trả" = "#e41a1c")) +
15. scale_x_continuous(
16. breaks = seq(min(vnm$Year, na.rm = TRUE), max(vnm$Year, na.rm = TRUE), by = 2),
17. labels = as.integer(seq(min(vnm$Year, na.rm = TRUE), max(vnm$Year, na.rm = TRUE), by = 2))) +
18. labs(
19. title = "Cấu trúc Tài sản – Vốn – Nợ theo năm",
20. x = "Năm",
21. y = "Giá trị (nghìn tỷ đồng)",
22. fill = "", color = "") +
23. theme_minimal(base_size = 16) +
24. theme(
25. plot.title = element_text(hjust = 0.5, face = "bold"),
26. legend.position = "top",
27. axis.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 4: Biểu đồ kết hợp giữa cột và đường.
Dòng 5 đến Dòng 7: Cột thể hiện tổng tài sản, trong khi các đường nối thể hiện vốn chủ sở hữu và nợ phải trả.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ cho thấy tổng tài sản tăng đều qua các năm, phản ánh sự mở rộng ổn định và có định hướng. Vốn chủ sở hữu cũng tăng vững, chứng tỏ doanh nghiệp duy trì lợi nhuận giữ lại tốt và nền tảng tài chính được củng cố. Trong khi đó, nợ phải trả biến động nhẹ nhưng không gia tăng mạnh, cho thấy việc sử dụng đòn bẩy tài chính ở mức hợp lý.
Tổng thể, cơ cấu tài sản – vốn – nợ đang ở trạng thái cân bằng, vừa đảm bảo tăng trưởng vừa giữ mức rủi ro thấp. Nếu xu hướng này được duy trì, doanh nghiệp có thể tiếp tục mở rộng quy mô mà không làm suy yếu khả năng thanh toán hay ổn định tài chính dài hạn.
1. vnm %>%
2. mutate(
3. Year = as.numeric(Year),
4. Debt_Ratio = Total_Liabilities / Total_Assets * 100,
5. Equity_Ratio = Equity / Total_Assets * 100
6. ) %>%
7. tidyr::pivot_longer(
8. cols = c(Debt_Ratio, Equity_Ratio),
9. names_to = "Structure",
10. values_to = "Ratio"
11. ) %>%
12. ggplot(aes(x = Year, y = Ratio, fill = Structure)) +
13. geom_col(position = "stack") +
14. scale_fill_manual(
15. values = c("#ef8a62", "#67a9cf"),
16. labels = c("Debt", "Equity")) +
17. scale_x_continuous(
18. breaks = seq(min(vnm$Year), max(vnm$Year), by = 2),
19. labels = function(x) format(x, nsmall = 0)) +
20. labs(
21. title = "Cơ cấu tài sản và nợ phải trả",
22. x = "Year",
23. y = "Percentage (%)",
24. fill = "") +
25. theme_minimal(base_size = 13) +
26. theme(
27. plot.title = element_text(hjust = 0.5, face = "bold"),
28. legend.position = "top")Giải thích kỹ thuật:
Dòng 5 đến Dòng 7: Các cột được vẽ chồng lên nhau, cho thấy tỷ lệ phần trăm của nợ và vốn chủ sở hữu trong tổng tài sản của công ty qua các năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê
Biểu đồ cho thấy cấu trúc tài chính của doanh nghiệp qua các năm với tỷ lệ nợ phải trả (màu cam) giảm nhẹ, phản ánh xu hướng giảm sự phụ thuộc vào nợ. Tỷ lệ vốn chủ sở hữu (màu xanh dương) chiếm phần lớn tổng tài sản và tăng nhẹ, cho thấy khả năng tài chính nội bộ được củng cố.
Nhìn chung, biểu đồ phản ánh xu hướng ổn định trong cơ cấu tài chính, giảm nợ và tăng vốn chủ sở hữu, cho thấy mức độ bền vững và an toàn tài chính của công ty.
1. ggplot(vnm, aes(x = Total_Liabilities / Total_Assets * 100, y = roe)) +
2. geom_point(size = 3, color = "#1b9e77") +
3. geom_smooth(method = "lm", se = TRUE, color = "#d95f02") +
4. labs(
5. title = "Tương quan giữa ROE và đòn bẩy tài chính",
6. x = "Debt-to-Assets Ratio (%)",
7. y = "ROE") +
8. theme_minimal(base_size = 16) +
9. theme(
10. plot.title = element_text(hjust = 0.5, face = "bold"))Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện mối quan hệ giữa tỷ suất lợi nhuận trên vốn chủ sở hữu và tỷ lệ nợ trên tài sản.
Dòng 3: Trục x đại diện cho tỷ lệ nợ trên tài sản, trục y đại diện cho tỷ suất lợi nhuận trên vốn chủ sở hữu (ROE).
Dòng 5 đến Dòng 7: Đường màu cam thể hiện đường hồi quy, phản ánh mối quan hệ tuyến tính giữa hai biến.
Dòng 8: Khu vực bóng xám phía dưới đường hồi quy đại diện cho khoảng tin cậy của đường hồi quy.
Dòng 9 đến Dòng 12: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê
Biểu đồ cho thấy mối quan hệ ngược chiều giữa tỷ lệ nợ trên tài sản và ROE, khi tỷ lệ nợ tăng thì ROE có xu hướng giảm, cho thấy nợ cao có thể ảnh hưởng tiêu cực đến hiệu quả sinh lời. Đường hồi quy màu cam minh họa mối quan hệ tuyến tính âm, với độ dốc rõ rệt, phản ánh tác động tiêu cực của nợ đến ROE
Nhìn chung, biểu đồ cung cấp cơ sở để đánh giá ảnh hưởng của tỷ lệ nợ và hỗ trợ quyết định tài chính về việc duy trì hay điều chỉnh mức nợ của doanh nghiệp.
1. ggplot(vnm, aes(x = Year, y = roe)) +
2. geom_line(color = "#2a9d8f", linewidth = 1.2) +
3. geom_point(size = 3, color = "#264653") +
4. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
5. labs(
6. title = "Xu hướng ROE của Vinamilk qua các năm",
7. x = "Năm",
8. y = "Tỷ suất sinh lời trên vốn chủ sở hữu (ROE)") +
9. theme_minimal(base_size = 13) +
10. theme(
11. plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
12. axis.title.x = element_text(face = "bold"),
13. axis.title.y = element_text(face = "bold"),
14. panel.grid.minor = element_blank())Giải thích kỹ thuật:
Dòng 5 đến Dòng 7: Các điểm dữ liệu cho thấy ROE của Vinamilk giảm mạnh từ 2017 đến 2023, phản ánh một xu hướng giảm sút trong hiệu quả sử dụng vốn chủ sở hữu.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ, cung cấp thông tin về sự thay đổi của ROE.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê
Biểu đồ cho thấy ROE của Vinamilk tăng mạnh từ 2015 đến 2017, đạt đỉnh vào năm 2017, thể hiện hiệu quả sử dụng vốn chủ sở hữu cao trong giai đoạn này. Từ 2017 đến 2023, ROE giảm đáng kể, phản ánh xu hướng suy giảm khả năng sinh lời trên vốn chủ sở hữu, với mức gần 0.3 vào năm 2023.
1. ggplot(vnm, aes(x = Total_Assets, y = Net_Profit_After_Tax)) +
2. geom_point(size = 3, color = "#2A9D8F", alpha = 0.8) +
3. geom_smooth(method = "lm", se = TRUE, color = "black", linewidth = 1) +
4. scale_x_log10(labels = scales::comma_format(scale = 1e-9, suffix = "B")) +
5. scale_y_log10(labels = scales::comma_format(scale = 1e-9, suffix = "B")) +
6. labs(
7. title = "Quan hệ giữa Quy mô Tài sản và Lợi nhuận Sau thuế",
8. subtitle = "Dữ liệu được chuyển đổi log-scale để quan sát mối tương quan tuyến tính rõ hơn",
9. x = "Tổng tài sản (log scale, tỷ VND)",
10. y = "Lợi nhuận sau thuế (log scale, tỷ VND)") +
11. theme_minimal(base_size = 13) +
12. theme(
13. plot.title = element_text(hjust = 0.5, face = "bold", size = 15),
14. plot.subtitle = element_text(hjust = 0.5, color = "gray30"),
15. axis.title = element_text(face = "bold"),
16. panel.grid.minor = element_blank())Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện mối quan hệ giữa quy mô tài sản và lợi nhuận sau thuế.
Dòng 5 đến Dòng 7: Đường hồi quy màu đen được vẽ trên biểu đồ, thể hiện mối quan hệ tuyến tính giữa hai biến
Dòng 8: Khu vực bóng xám đại diện cho khoảng tin cậy của đường hồi quy.
Dòng 9 đến Dòng 12: Đặt nhãn cho các trục và tiêu đề biểu đồ, cũng như chú thích cho các biến liên quan.
Dòng 13: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 14: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ này phân tích mối quan hệ giữa quy mô tài sản và lợi nhuận sau thuế, với dữ liệu chuyển đổi sang thang đo logarit để dễ dàng quan sát biến động. Đường hồi quy cho thấy mối quan hệ dương tính, tức là khi quy mô tài sản tăng, lợi nhuận sau thuế cũng có xu hướng tăng. Việc sử dụng log scale giúp làm mượt các giá trị cực đại và cực tiểu, đồng thời làm mối quan hệ tuyến tính trở nên rõ ràng hơn, đặc biệt khi dữ liệu có phạm vi rộng. Biểu đồ này hỗ trợ phân tích chiến lược tài chính và đưa ra quyết định đầu tư hiệu quả.
1. ggplot(vnm, aes(x = Year)) +
2. geom_bar(aes(y = Interest_Expense / 1e9),
3. stat = "identity", fill = "#e76f51", alpha = 0.8) +
4. geom_line(aes(y = Operating_Profit / 1e9 / 2),
5. color = "#264653", size = 1.2) +
6. scale_y_continuous(labels = scales::comma_format(suffix = " B", scale = 1e-9)) +
7. labs(
8. title = "So sánh chi phí lãi vay và lợi nhuận thuần từ hoạt động kinh doanh",
9. subtitle = "Đơn vị: tỷ VND (đã chia tỷ lệ hiển thị giữa hai đại lượng)",
10. x = "Năm",
11. y = "Giá trị (tỷ VND)") +
12. theme_minimal(base_family = "TimesVN", base_size = 14) +
13. theme(
14. plot.title = element_text(hjust = 0.5, face = "bold", size = 12),
15. plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
16. axis.title = element_text(face = "bold"))Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện sự so sánh giữa chi phí lãi vay và lợi nhuận thuần từ hoạt động kinh doanh qua các năm.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho giá trị chi phí lãi vay và lợi nhuận thuần (đơn vị: tỷ VND).
Dòng 4: Biểu đồ kết hợp giữa đường và cột: Đường (màu đen) thể hiện sự thay đổi của lợi nhuận thuần từ hoạt động kinh doanh qua các năm. Cột (màu đỏ): thể hiện chi phí lãi vay trong từng năm.
Dòng 5 đến Dòng 7: Đoạn đường thể hiện lợi nhuận thuần từ hoạt động kinh doanh, trong khi cột thể hiện chi phí lãi vay.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ so sánh chi phí lãi vay và lợi nhuận thuần từ hoạt động kinh doanh qua các năm. Lợi nhuận thuần tăng mạnh từ 2015–2020, sau đó giảm nhẹ, phản ánh tình hình kinh doanh. Chi phí lãi vay duy trì ở mức thấp trong giai đoạn đầu, rồi tăng nhẹ vào 2021-2022, chỉ ra sự gia tăng chi phí vay hoặc thay đổi trong điều kiện tài chính. Biểu đồ cũng giúp theo dõi tỷ lệ giữa chi phí lãi vay và lợi nhuận thuần, đánh giá hiệu quả tài chính và khả năng chịu đựng chi phí vay của công ty, cung cấp thông tin quan trọng để phân tích lợi nhuận và chi phí.
1. ggplot(
2. vnm %>%
3. mutate(
4. across(c(Operating_Cash_Flow, Investing_Cash_Flow, Financing_Cash_Flow),
5. ~ parse_number(as.character(.),
6. locale = locale(grouping_mark = ",", decimal_mark = "."))),
7. Net_Cash_Flow = Operating_Cash_Flow + Investing_Cash_Flow + Financing_Cash_Flow),
8. aes(x = Year, y = Net_Cash_Flow / 1e9)) +
9. geom_col(aes(fill = Net_Cash_Flow > 0), width = 0.6, show.legend = FALSE) +
10. geom_text(aes(label = round(Net_Cash_Flow / 1e9, 0)),
11. vjust = -0.5, size = 3, color = "#333") +
12. scale_fill_manual(values = c("#e63946", "#2a9d8f")) +
13. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
14. labs(
15. title = "Biến động lưu chuyển tiền thuần (2015–2024)",
16. x = "Year", y = "Value (billion VND)",
17. caption = "Source: Vinamilk Cash Flow Statement") +
18. theme_minimal(base_family = "TimesVN", base_size = 16) +
19. theme(
20. plot.title = element_text(hjust = 0.5, face = "bold", size = 15),
21. plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
22. axis.title = element_text(face = "bold"),
23. panel.grid.minor = element_blank())Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện sự biến động của lưu chuyển tiền tệ thuần qua các năm.
Dòng 3: Trục x đại diện cho các năm, trục y đại diện cho giá trị lưu chuyển tiền tệ (tính theo tỷ VND).
Dòng 4: Biểu đồ cột được chia thành các cột dương (màu xanh) và âm (màu đỏ).
Dòng 5 đến Dòng 7: Các cột biểu thị giá trị lưu chuyển tiền tệ thuần của mỗi năm, với các cột dương thể hiện dòng tiền vào và các cột âm thể hiện dòng tiền ra.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ này cung cấp cái nhìn rõ ràng về dòng tiền của Vinamilk qua các năm: Năm 2015: Lưu chuyển tiền tệ thuần dương (3,769 tỷ VND), cho thấy công ty có sự gia tăng mạnh mẽ về dòng tiền vào trong năm này.
Các năm tiếp theo (2016-2024): Dòng tiền vào giảm mạnh vào năm 2016 và 2017, sau đó có sự hồi phục trong các năm 2019-2021. Tuy nhiên, năm 2023 ghi nhận dòng tiền âm (-60 tỷ VND), cho thấy công ty có dòng tiền ra lớn hơn dòng tiền vào trong năm này.
Biểu đồ này giúp đánh giá khả năng sinh lời và tài chính của công ty qua dòng tiền trong suốt giai đoạn phân tích, hỗ trợ trong việc phân tích và ra quyết định tài chính về đầu tư và quản lý chi phí.
1. ggplot(vnm, aes(x = Year)) +
2. geom_bar(aes(y = Inventory / Total_Assets * 100), stat = "identity", fill = "#f4a261") +
3. geom_line(aes(y = Accounts_Receivable / Total_Assets * 100), color = "#264653", size = 1.2) +
4. geom_point(aes(y = Accounts_Receivable / Total_Assets * 100), color = "#264653", size = 2) +
5. labs(
6. title = "Tỷ trọng hàng tồn kho & phải thu khách hàng",
7. subtitle = "Phản ánh hiệu quả quản trị vốn lưu động",
8. x = "Năm",
9. y = "Tỷ trọng (%)") +
10. theme_minimal(base_family = "TimesVN") +
11. theme(
12. plot.title = element_text(hjust = 0.5, size = 16),
13. plot.subtitle = element_text(hjust = 0.5, size = 14),
14. axis.title.x = element_text(size = 12),
15. axis.title.y = element_text(size = 12)) +
16. scale_x_continuous(
17. breaks = seq(min(vnm$Year), max(vnm$Year), by = 1),
18. labels = scales::number_format(accuracy = 1))Giải thích kỹ thuật:
Dòng 2: Dữ liệu trong biểu đồ thể hiện tỷ trọng hàng tồn kho và phải thu khách hàng qua các năm.
Dòng 3: Trục x đại diện cho năm, trục y đại diện cho tỷ trọng (%) của hàng tồn kho và phải thu khách hàng trong tổng tài sản.
Dòng 4: Biểu đồ kết hợp giữa cột và đường:
Cột màu cam: Biểu thị tỷ trọng hàng tồn kho và phải thu khách hàng qua các năm.
Đường màu đen: Đoạn đường này thể hiện sự thay đổi của hiệu quả quản trị vốn lưu động, với các điểm đánh dấu thể hiện tỷ lệ quản trị hiệu quả qua các năm.
Dòng 5 đến Dòng 7: Các cột cho thấy tỷ trọng của hàng tồn kho và phải thu khách hàng qua từng năm, trong khi đường thể hiện sự biến động của hiệu quả quản lý vốn lưu động.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ phân tích tỷ trọng hàng tồn kho và phải thu khách hàng, cũng như hiệu quả quản lý vốn lưu động qua các năm. Tỷ trọng hàng tồn kho và phải thu khách hàng (màu cam) dao động, phản ánh sự thay đổi trong chiến lược quản lý. Đường màu đen cho thấy mối quan hệ giữa tỷ trọng này và hiệu quả quản lý vốn lưu động, giúp nhận diện các vấn đề tài chính cần điều chỉnh. Biểu đồ giúp phân tích xu hướng quản lý tài sản lưu động và đưa ra chiến lược tài chính hiệu quả hơn cho công ty
1. ggplot(vnm, aes(x = Year, y = Dividend_Payments / 1e9)) +
2. geom_col(fill = "#F47983", width = 0.6) +
3. geom_text(aes(label = round(Dividend_Payments / 1e9, 0)),
4. vjust = -0.5, size = 3, color = "#333") +
5. geom_smooth(method = "lm", se = FALSE, color = "#023047", size = 1.2) +
6. labs(
7. title = "Chi trả cổ tức của Vinamilk (2015–2024)",
8. x = "Năm",
9. y = "Tỷ VND") +
10. theme_minimal(base_family = "TimesVN") +
11. theme(
12. plot.title = element_text(hjust = 0.5, size = 18),
13. plot.subtitle = element_text(hjust = 0.5, size = 16),
14. axis.title.x = element_text(size = 14),
15. axis.title.y = element_text(size = 14)) +
16. scale_x_continuous(
17. breaks = seq(min(vnm$Year), max(vnm$Year), by = 1),
18. labels = scales::number_format(accuracy = 1))Giải thích kỹ thuật:
Dòng 5 đến Dòng 7: Các cột thể hiện số tiền chi trả cổ tức hàng năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa tiêu đề (hjust = 0.5) và in đậm tiêu đề để dễ nhìn.
Ý nghĩa thống kê:
Biểu đồ cho thấy chi trả cổ tức của Vinamilk có xu hướng giảm dần, từ hơn 6.000 tỷ VND năm 2015 xuống còn khoảng 8.000 tỷ VND giai đoạn 2023–2024. Dù giá trị tuyệt đối vẫn cao, tốc độ tăng đã chậm lại, phản ánh việc công ty ưu tiên giữ lại lợi nhuận để tái đầu tư hoặc phục vụ các kế hoạch phát triển dài hạn.
Đường xu hướng màu xanh đậm minh họa rõ sự điều chỉnh này, cho thấy chính sách cổ tức của Vinamilk đang dịch chuyển từ “chi trả cao cho cổ đông” sang “tích lũy nội lực và mở rộng đầu tư”, phù hợp với chiến lược tăng trưởng bền vững.
1. ggplot(vnm, aes(x = Year)) +
2. geom_line(aes(y = Net_Sales, color = "Doanh thu"), size = 1.2) +
3. geom_line(aes(y = Operating_Profit, color = "Chi phí"), size = 1.2) +
4. geom_line(aes(y = Net_Profit_After_Tax, color = "Lợi nhuận"), size = 1.2) +
5. scale_x_continuous(breaks = seq(min(vnm$Year), max(vnm$Year), 2)) +
6. labs(
7. title = "Biến động doanh thu, chi phí và lợi nhuận qua các năm",
8. x = "Năm",
9. y = "Số tiền (VND)") +
10. scale_color_manual(values = c("Doanh thu" = "#4daf4a", "Chi phí" = "#e41a1c", "Lợi nhuận" = "#264653")) +
11. theme_minimal(base_family = "TimesVN") +
12. theme(
13. plot.title = element_text(hjust = 0.5, size = 18),
14. axis.title.x = element_text(size = 12),
15. axis.title.y = element_text(size = 12))Giải thích kỹ thuật
Dòng 5 đến Dòng 7: Đường thể hiện sự biến động của doanh thu, chi phí và lợi nhuận qua các năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ cho thấy doanh thu của công ty tăng mạnh trong giai đoạn 2013–2023, phản ánh quá trình mở rộng thị trường, đa dạng hóa sản phẩm và nâng cao năng lực cạnh tranh. Trong khi đó, chi phí hoạt động cũng tăng nhưng với tốc độ chậm hơn so với doanh thu, cho thấy công ty quản lý chi phí hiệu quả, tối ưu hóa nguồn lực và duy trì biên lợi nhuận ổn định.
Nhờ kiểm soát tốt chi phí và duy trì tăng trưởng doanh thu, lợi nhuận của công ty tăng đều qua các năm, thể hiện hiệu quả vận hành cao và chiến lược kinh doanh hợp lý. Xu hướng này cho thấy doanh nghiệp đang phát triển bền vững, có khả năng mở rộng quy mô mà vẫn đảm bảo hiệu quả tài chính tích cực.
1. df_heat <- vnm %>%
2. select(Year,
3. Operating_Cash_Flow,
4. Investing_Cash_Flow,
5. Financing_Cash_Flow) %>%
6. melt(id = "Year")
7. ggplot(df_heat, aes(x = variable, y = factor(Year), fill = value)) +
8. geom_tile(color = "white") +
9. scale_fill_gradient(low = "#e9f5db", high = "#2a9d8f") +
10. labs(
11. title = "Biến động dòng tiền theo năm",
12. x = "Hoạt động",
13. y = "Năm"
14. ) +
15. theme_minimal(base_family = "TimesVN") +
16. theme(
17. plot.title = element_text(hjust = 0.5, size = 20),
18. axis.title.x = element_text(size = 12),
19. axis.title.y = element_text(size = 12),
20. axis.text.y = element_text(size = 10) )Giải thích kỹ thuật:
Dòng 5 đến Dòng 7: Mỗi cột trong biểu đồ tương ứng với một loại hoạt động tài chính (Operating, Investing, Financing), trong khi các ô màu cho biết giá trị dòng tiền của từng loại trong các năm.
Dòng 8 đến Dòng 11: Đặt nhãn cho các trục và tiêu đề biểu đồ. Cung cấp thông tin về các loại hoạt động tài chính và mức độ dòng tiền qua các năm.
Dòng 12: Phong cách tối giản với cỡ chữ mặc định là 13.
Dòng 13: Căn giữa và in đậm tiêu đề.
Ý nghĩa thống kê:
Biểu đồ cho thấy dòng tiền từ hoạt động kinh doanh (Operating Cash Flow) là lớn nhất và ổn định qua các năm, phản ánh khả năng sinh tiền đều đặn từ hoạt động kinh doanh cốt lõi. Dòng tiền từ hoạt động đầu tư (Investing Cash Flow) dao động, cao vào các năm đầu 2015–2017 do chi tiêu đầu tư mạnh, sau đó giảm, cho thấy chiến lược đầu tư được điều chỉnh theo thời gian. Dòng tiền từ hoạt động tài chính (Financing Cash Flow) biến động thấp hoặc âm, phản ánh công ty ít sử dụng vay nợ hay phát hành cổ phiếu trong những năm gần đây Biểu đồ giúp đánh giá cách công ty quản lý dòng tiền qua các hoạt động, từ đó phân tích chiến lược tài chính và khả năng tài trợ bền vững cho các dự án đầu tư dài hạn.