1. Đọc và mô tả dữ liệu

library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.4.1
library(knitr)
DuLieu <- read_csv("DuLieu.csv")
str(DuLieu)
## spc_tbl_ [705 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Age                  : num [1:705] 19 22 20 18 21 19 23 20 18 21 ...
##  $ Gender               : chr [1:705] "Female" "Male" "Female" "Male" ...
##  $ Country              : chr [1:705] "Bangladesh" "India" "USA" "UK" ...
##  $ Avg_Daily_Usage_Hours: num [1:705] 5.2 2.1 6 3 4.5 7.2 1.5 5.8 4 3.3 ...
##  $ Most_Used_Platform   : chr [1:705] "Instagram" "Twitter" "TikTok" "YouTube" ...
##  $ Sleep_Hours_Per_Night: num [1:705] 6.5 7.5 5 7 6 4.5 8 6 6.5 7 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Age = col_double(),
##   ..   Gender = col_character(),
##   ..   Country = col_character(),
##   ..   Avg_Daily_Usage_Hours = col_double(),
##   ..   Most_Used_Platform = col_character(),
##   ..   Sleep_Hours_Per_Night = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

STUDENTS SOCIAL MEDIA ADDICTION

Đây là dữ liệu được tổng hợp từ các cuộc khảo sát thực tế (survey-based dataset). Dữ liệu ghi lại thông tin của các học sinh/sinh viên ở nhiều quốc gia khác nhau (cross-country survey) về thói quen sử dụng mạng xã hội của họ. Theo mô tả của tác giả trên Kaggle, tập dữ liệu được “lấy cảm hứng từ các cuộc khảo sát tâm lý học và giáo dục trong thế giới thực”. Mục tiêu của các cuộc khảo sát này nhằm thấu hiểu:

  • Xu hướng nghiện kỹ thuật số (Digital addiction trends).

  • Sức khoẻ tinh thần của sinh viên (Student mental well-being).

  • Tác động của công nghệ đến kết quả học tập, giấc ngủ và các mối quan hệ (Conflicts over social media, Affects academic performance…).

Bảng mô tả các biến trong tập dữ liệu
Biến Loại Mô.tả
Age Định lượng Tuổi của đối tượng khảo sát
Gender Định tính (nhị phân) Giới tính (Nam/Nữ)
Country Định tính (danh mục) Quốc gia của đối tượng khảo sát
Avg_Daily_Usage_Hours Định lượng Số giờ sử dụng MXH trung bình mỗi ngày
Most_Used_Platform Định tính (danh mục) Nền tảng MXH được sử dụng nhiều nhất
Sleep_Hours_Per_Night Định lượng Số giờ ngủ trung bình mỗi đêm

2. Trực quan hoá dữ liệu bằng gói cơ bản

2.1. Biểu đồ cột về nền tảng mạng xã hội được sử dụng nhiều nhất

Bang1.1 <- table(DuLieu$Most_Used_Platform)
print(Bang1.1)
## 
##  Facebook Instagram KakaoTalk      LINE  LinkedIn  Snapchat    TikTok   Twitter 
##       123       249        12        12        21        13       154        30 
## VKontakte    WeChat  WhatsApp   YouTube 
##        12        15        54        10
barplot(Bang1.1,
        col = my_col,
        las = 2,
        cex.names = 0.8,
        main = "Biểu đồ nền tảng mạng xã hội được sử dụng nhiều nhất",
        ylab = "Số lượng đối tượng khảo sát")
title(xlab = "Nền tảng mạng xã hội", line = 6)

Nhận xét:

Biểu đồ cho thấy số lượng người tham gia sử dụng các nền tảng mạng xã hội có sự chênh lệch rõ rệt. Trong đó, Instagram, TikTokFacebook có số lượng người dùng cao nhất với các cột cao vượt trội so với các nền tảng còn lại.

Ngược lại, một số ứng dụng khác có số lượng người sử dụng thấp hơn đáng kể, thể hiện qua chiều cao cột thấp hơn trên biểu đồ. Điều này phản ánh mức độ phổ biến của các mạng xã hội trong mẫu khảo sát là không đồng đều.

2.2. Biểu đồ tròn và histogram mô tả giới tính và độ tuổi của đối tượng khảo sát

Bang1.2 <- table(DuLieu$Gender)
print(Bang1.2)
## 
## Female   Male 
##    353    352

Biểu đồ tròn

#Biểu đồ tròn
pie(table(DuLieu$Gender),
    main="Cơ cấu giới tính của đối tượng khảo sát",
    col = my_col[c(1,4)])

  • Biểu đồ tròn có hai phần gần bằng nhau, cho thấy cơ cấu giới tính của mẫu khảo sát khá cân đối.
  • Sự chênh lệch giữa hai nhóm là không đáng kể.

Phân tổ dữ liệu theo thời gian sử dụng mạng xã hội 1 ngày

Sau khi thực hiện thống kê mô tả đối với các biến định tính, nghiên cứu tiếp tục phân tích biến định lượng Avg_Daily_Usage_Hours nhằm đánh giá mức độ sử dụng mạng xã hội của đối tượng khảo sát. Để thuận tiện cho việc quan sát và phân tích sự phân bố dữ liệu, biến này được tiến hành phân tổ theo các khoảng thời gian sử dụng trong một ngày.

Xác định khoảng biến thiên của thời gian sử dụng

range_TGSD = range(DuLieu$Avg_Daily_Usage_Hours)
print(range_TGSD)
## [1] 1.5 8.5

Phân các nhóm thời gian của đối tượng khảo sát

Biến Avg_Daily_Usage_Hours (thời gian sử dụng mạng xã hội trung bình mỗi ngày) được phân nhóm bằng hàm cut(). Các khoảng được chia từ 1.5 giờ đến 8.5 giờ với độ rộng mỗi khoảng là 1 giờ, tạo thành các nhóm như: [1.5,2.5),[2.5,3.5),…,[7.5,8.5)

cut_TGSD <- cut(DuLieu$Avg_Daily_Usage_Hours, breaks = seq(1.5,8.5,1), right = F, include.lowest = F)

Kết hợp vào data.frame & Đặt lại tên cho các cột

table_TGSD <- table(cut_TGSD)
cst_TGSD <- cumsum(table_TGSD)
proptable_TGSD <- round(prop.table(table_TGSD),3)*100
csp_TGSD <- cumsum(proptable_TGSD)

Bang2.1 <- data.frame(
  Khoang_T = names(table_TGSD),
  Tan_So = as.numeric(table_TGSD),
  Tan_Suat = as.numeric(proptable_TGSD),
  Tan_So_TL = as.numeric(cst_TGSD),
  Tan_Suat_TL = as.numeric(csp_TGSD))
names(Bang2.1) <- c('Khoảng thời gian', 
                    'Tần số', 'Tần suất (%)', 
                    'Tần số tích lũy', 
                    'Tần suất tích lũy (%)')

Hiển thị

kable(Bang2.1, align = 'c')
Khoảng thời gian Tần số Tần suất (%) Tần số tích lũy Tần suất tích lũy (%)
[1.5,2.5) 13 1.8 13 1.8
[2.5,3.5) 69 9.8 82 11.6
[3.5,4.5) 177 25.1 259 36.7
[4.5,5.5) 208 29.5 467 66.2
[5.5,6.5) 142 20.2 609 86.4
[6.5,7.5) 84 11.9 693 98.3
[7.5,8.5) 11 1.6 704 99.9
print(Bang2.1, align = 'c')
##   Khoảng thời gian Tần số Tần suất (%) Tần số tích lũy Tần suất tích lũy (%)
## 1        [1.5,2.5)     13          1.8              13                   1.8
## 2        [2.5,3.5)     69          9.8              82                  11.6
## 3        [3.5,4.5)    177         25.1             259                  36.7
## 4        [4.5,5.5)    208         29.5             467                  66.2
## 5        [5.5,6.5)    142         20.2             609                  86.4
## 6        [6.5,7.5)     84         11.9             693                  98.3
## 7        [7.5,8.5)     11          1.6             704                  99.9

Nhận xét:

  • Thời gian sử dụng mạng xã hội tập trung chủ yếu trong khoảng 3.5–5.5 giờ/ngày.
  • Nhóm (4.5;5.5] có tần số cao nhất với 208 người (29.5%).
  • Nhóm sử dụng trên 7.5 giờ/ngày chiếm tỷ lệ rất thấp.
#Biểu đồ histogram
range(DuLieu$Age)
## [1] 18 24
hist(DuLieu$Age,
     breaks = seq(18,24,1),
     main = "Phân bố độ tuổi của đối tượng khảo sát",
     xlab = "Tuổi",
     ylab = "Tần số",
     col = "lightblue",
     border = 'white')

2.3. Biểu đồ cột mô tả mối quan hệ giữa giới tính và nền tảng mạng xã hội

Bang1.3 <- table(DuLieu$Gender,DuLieu$Most_Used_Platform)
print(Bang1.3)
##         
##          Facebook Instagram KakaoTalk LINE LinkedIn Snapchat TikTok Twitter
##   Female       24       172        12   12        8        8     86      16
##   Male         99        77         0    0       13        5     68      14
##         
##          VKontakte WeChat WhatsApp YouTube
##   Female         0      4       11       0
##   Male          12     11       43      10
Bang_GT_NenTang <- table(DuLieu$Gender,
                         DuLieu$Most_Used_Platform)
barplot(Bang_GT_NenTang,
        beside = TRUE,
        col = my_col[c(1,4)],
        las = 2,
        cex.names = 0.8,
        main = "Biểu đồ giới tính và nền tảng mạng xã hội",
        ylab = "Số lượng đối tượng khảo sát")
legend("topright",
       legend = rownames(Bang_GT_NenTang),
       fill = my_col[c(1,4)])
title(xlab = 'Nền tảng mạng xã hội', line = 6)

Nhận xét:

Biểu đồ cho thấy số lượng người sử dụng các nền tảng mạng xã hội có sự chênh lệch khá rõ giữa nam và nữ. Các cột của InstagramTikTok ở nhóm nữ cao hơn đáng kể, trong khi cột Facebook ở nhóm nam nổi bật hơn.

Sự khác biệt về chiều cao giữa các cột phản ánh xu hướng sử dụng mạng xã hội không đồng đều giữa hai giới tính.

Ngoài ra, một số cột có chiều cao vượt trội so với các cột còn lại, cho thấy đây là những nền tảng được sử dụng phổ biến hơn trong mẫu khảo sát.

2.4. Đa giác tần số mô tả thời gian sử dụng mạng xã hội

plot(table_TGSD,
     type = "o",
     pch = 19,
     lwd = 2,
     col = my_col[1],
     main = "Đa giác tần số",
     xlab = "Khoảng thời gian",
     ylab = "Tần số")

Nhận xét:

Đa giác tần số có dạng tăng dần đến vùng trung tâm rồi giảm dần về hai phía. Đỉnh của đa giác nằm trong khoảng 4–6 giờ, cho thấy đây là khoảng thời gian sử dụng mạng xã hội phổ biến nhất trong mẫu khảo sát.

Các khoảng thời gian quá thấp hoặc quá cao có tần số nhỏ hơn đáng kể, thể hiện qua các điểm nằm thấp ở hai đầu đồ thị.

2.5. Biểu đồ hộp và râu mô tả thời gian sử dụng mạng xã hội và thời gian ngủ

par(mfrow = c(1,2))
boxplot(DuLieu$Avg_Daily_Usage_Hours,
        main ="Phân bố thời gian sử dụng mạng xã hội",
        xlab = "Số giờ sử dụng", 
        col = my_col[1], 
        horizontal = T)
boxplot(DuLieu$Sleep_Hours_Per_Night,
        main = "Phân bố thời gian ngủ của đối tượng khảo sát",
        col = my_col[3], 
        xlab = 'Thời gian ngủ',
        horizontal = T)

Nhận xét:

Thời gian sử dụng mạng xã hội có độ phân tán lớn, với trung vị khoảng 5 giờ/ngày. Đa số người tham gia sử dụng từ 4–6 giờ mỗi ngày và xuất hiện nhiều giá trị ngoại lai phía trên, cho thấy một số cá nhân sử dụng mạng xã hội với thời lượng rất cao.

Trong khi đó, thời gian ngủ tập trung chủ yếu trong khoảng 6–8 giờ mỗi đêm, với trung vị khoảng 7 giờ. Khoảng biến thiên không quá lớn, cho thấy thời gian ngủ giữa các đối tượng khảo sát tương đối ổn định và ít chênh lệch đáng kể.

Nhìn chung, thời gian sử dụng mạng xã hội biến động mạnh hơn thời gian ngủ.

2.6. Biểu đồ tán xạ thể hiện mối quan hệ giữa thời gian sử dụng mạng xã hội và thời gian ngủ

plot(DuLieu$Avg_Daily_Usage_Hours,
     DuLieu$Sleep_Hours_Per_Night,
     main = "Mối quan hệ giữa thời gian sử dụng mạng xã hội và thời gian ngủ",
     xlab = "Thời gian sử dụng",
     ylab = "Thời gian ngủ",
     col = my_col[c(1,4)],
     pch = 19)

Nhận xét:

Biểu đồ tán xạ cho thấy xu hướng nghịch giữa thời gian sử dụng mạng xã hội và thời gian ngủ.

  • Khi thời gian sử dụng mạng xã hội tăng lên, thời gian ngủ trung bình hàng đêm có xu hướng giảm xuống.
  • Các điểm dữ liệu tập trung tạo thành một đường dốc xuống, cho thấy xu hướng sử dụng mạng xã hội nhiều đi kèm với thời gian ngủ thấp hơn.

3. Trực quan hoá dữ liệu bằng gói ggplot2

# Cài đặt gói ggplot2 nếu bạn chưa cài đặt
# install.packages("ggplot2")
# Khai báo sử dụng thư viện
library(ggplot2)
# 1. Đọc dữ liệu từ file CSV
df <- read.csv("DuLieu.csv")

# Xem nhanh cấu trúc dữ liệu
str(df)
## 'data.frame':    705 obs. of  6 variables:
##  $ Age                  : int  19 22 20 18 21 19 23 20 18 21 ...
##  $ Gender               : chr  "Female" "Male" "Female" "Male" ...
##  $ Country              : chr  "Bangladesh" "India" "USA" "UK" ...
##  $ Avg_Daily_Usage_Hours: num  5.2 2.1 6 3 4.5 7.2 1.5 5.8 4 3.3 ...
##  $ Most_Used_Platform   : chr  "Instagram" "Twitter" "TikTok" "YouTube" ...
##  $ Sleep_Hours_Per_Night: num  6.5 7.5 5 7 6 4.5 8 6 6.5 7 ...

3.1.Biểu đồ cột (Bar Chart): Đếm số lượng theo nhóm (Biến phân loại)

Mục đích: Thống kê xem nền tảng nào được ưa chuộng nhất, và tỷ lệ Nam/Nữ trên từng nền tảng đó ra sao.

mau_gioi_tinh <- c("Male" = '#FFB703', "Female" = '#023E8A') # Nam màu Cam, Nữ màu Xanh nước biển
ggplot(df, aes(x = Most_Used_Platform, fill = Gender)) +
  geom_bar(position = "dodge") + # position = "dodge" để tách cột Nam/Nữ đứng cạnh nhau
  labs(
    title = "Số lượng người dùng từng nền tảng",
    x = "Nền tảng",
    y = "Số lượng người dùng",
    fill = "Giới tính"
  ) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 40, hjust = 1)) +
  #scale_fill_brewer(palette = "Set2") # Sử dụng bộ màu đẹp có sẵn của R
  scale_fill_manual(values=mau_gioi_tinh) # tô đúng màu mà mình chọn

3.2.Biểu đồ cột chồng (Stacked Bar Chart)

Sở thích sử dụng nền tảng phân theo Giới tính

mau_gioi_tinh <- c("Male" = '#FFB703', "Female" = '#023E8A') # Nữ màu Cam, Nam màu Xanh biển
ggplot(df, aes(x = Most_Used_Platform, fill = Gender)) +
  geom_bar(position = "stack") +
  theme_minimal() +
  labs(title = "Lựa chọn Nền tảng mạng xã hội theo Giới tính",
       x = "Nền tảng mạng xã hội",
       y = "Số lượng người dùng",
       fill = "Giới tính") +
  scale_fill_manual(values = mau_gioi_tinh) +  # Thêm dòng này vào để đổi màu theo ý mình muốn
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Xoay chữ ở trục x 45 độ cho dễ nhìn

- Biểu đồ cột chồng (Platform vs Gender): Cung cấp thông tin chi tiết về cơ cấu giới tính trong mỗi nền tảng. Ví dụ: Bạn sẽ thấy Instagram có tỷ lệ Nữ cao hơn hay Nam cao hơn. Hàm theme(axis.text.x = element_text(angle = 45)) được dùng để làm đẹp chữ dưới trục x.

3.3.Biểu đồ hộp (Boxplot)

  • Phân bố số giờ sử dụng MXH theo từng nhóm Giới tính: Cho thấy trung vị (median), độ phân tán và các giá trị ngoại lệ về thời gian sử dụng mạng xã hội giữa nhóm Nam và Nữ.
ggplot(df, aes(x = Gender, y = Avg_Daily_Usage_Hours, fill = Gender)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Phân bố Thời gian sử dụng MXH theo Giới tính",
       x = "Giới tính",
       y = "Thời gian dùng MXH trung bình (giờ/ngày)") +
  scale_fill_manual(values = mau_gioi_tinh) +# Thêm dòng này vào để đổi màu theo ý mình muốn
  theme(legend.position = "none")

  • So sánh phân phối giữa các nhóm Mục đích: Xem nhóm người dùng nền tảng nào (TikTok, Facebook, Instagram…) có xu hướng ngủ ít nhất hoặc nhiều nhất.
ggplot(df, aes(x = reorder(Most_Used_Platform, Sleep_Hours_Per_Night, FUN = median), 
               y = Sleep_Hours_Per_Night, fill = Most_Used_Platform)) +
  geom_boxplot(alpha = 0.8) +
  labs(
    title = "Phân bố Thời gian ngủ theo Nền tảng sử dụng nhiều nhất",
    x = "Nền tảng mạng xã hội",
    y = "Giờ ngủ (giờ/đêm)"
  ) +
  theme_light() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), # Xoay chữ ở trục X cho dễ đọc
        legend.position = "none") # Ẩn chú thích vì trục X đã có tên nền tảng

Biểu đồ hộp (Boxplot) kết hợp lật trục Thời gian ngủ theo từng Nền tảng sử dụng nhiều nhất

  • Biểu đồ hộp lật trục (Platform vs Sleep): Trực quan hóa xem liệu người dùng TikTok có ngủ ít hơn người dùng LinkedIn hay không. Việc dùng coord_flip() (lật trục) giúp nhãn tên của các mạng xã hội không bị đè lên nhau.
ggplot(df, aes(x = Most_Used_Platform, y = Sleep_Hours_Per_Night, fill = Most_Used_Platform)) +
  geom_boxplot(alpha = 0.8) +
  coord_flip() + # Lật trục để tên nền tảng (dài) dễ đọc hơn
  theme_minimal() +
  labs(title = "Thời gian ngủ mỗi đêm theo Nền tảng ưa thích",
       x = "Nền tảng mạng xã hội",
       y = "Thời gian ngủ (giờ/đêm)") +
  theme(legend.position = "none")

  • Biểu đồ hộp (Boxplot) theo từng độ tuổi Xem xét phân bố thời gian dùng MXH của từng tuổi cụ thể (18, 19, 20…)

Dùng as.factor(Age) để ggplot2 hiểu đây là các nhóm tuổi riêng biệt

plot_age_usage_box <- ggplot(df, aes(x = as.factor(Age), y = Avg_Daily_Usage_Hours, fill = as.factor(Age))) +
  geom_boxplot(alpha = 0.7) +
  theme_minimal() +
  labs(title = "Phân bố Thời gian dùng MXH theo từng Độ tuổi (Học sinh/Sinh viên)",
       x = "Độ tuổi",
       y = "Thời gian dùng MXH (giờ/ngày)") +
  theme(legend.position = "none") # Ẩn chú thích màu vì trục x đã rõ ràng

print(plot_age_usage_box)

3.4.Biểu đồ Histogram (Tần suất)

Phân bố độ tuổi

  • Biểu đồ Histogram (Tần suất theo độ tuổi): Giúp bạn thấy rõ tập dữ liệu này tập trung vào lứa tuổi nào nhất (ví dụ: thanh thiếu niên hay người trưởng thành).
ggplot(df, aes(x = Age)) +
  geom_histogram(binwidth = 1, fill = "steelblue", color = "white") +
  theme_minimal() +
  labs(title = "Phân bố Độ tuổi của người dùng",
       x = "Độ tuổi",
       y = "Số lượng người dùng")

  • Biểu đồ phân bố (Histogram): Xem hình dáng dữ liệu Mục đích: Xem độ tuổi của những người tham gia trong tập dữ liệu này phân bố như thế nào (tập trung ở giới trẻ hay rải rác đều).
ggplot(df, aes(x = Age, fill = Gender)) +
  geom_histogram(binwidth = 1, color = "white", alpha = 0.8, position = "identity") +
  facet_wrap(~ Gender, ncol = 1) + # Tách thành 2 biểu đồ trên/dưới cho Nam và Nữ
  labs(
    title = "Phân bố Độ tuổi của người tham gia",
    x = "Tuổi",
    y = "Số lượng"
  ) +
  theme_bw() +
  scale_fill_manual(values = mau_gioi_tinh)

3.5. Biểu đồ phân tán (Scatter plot) - Mối liên hệ giữa số giờ dùng MXH và số giờ ngủ (phân loại theo Giới tính)

ggplot(df, aes(x = Avg_Daily_Usage_Hours, y = Sleep_Hours_Per_Night, color = Gender)) +
  geom_point(size = 3, alpha = 0.7) +
  theme_minimal() +
  # THÊM DÒNG NÀY ĐỂ CAN THIỆP MÀU:
  scale_color_manual(values = mau_gioi_tinh) +
  labs(title = "Mối quan hệ giữa Thời gian dùng MXH và Thời gian ngủ",
       x = "Thời gian dùng MXH trung bình (giờ/ngày)",
       y = "Thời gian ngủ (giờ/đêm)",
       color = "Giới tính")

Biểu đồ phân tán (Scatter plot): Xem xét liệu có sự tương quan nào (ví dụ: dùng mạng xã hội càng nhiều thì ngủ càng ít) giữa số giờ online trung bình và thời lượng giấc ngủ không, đồng thời phân biệt bằng màu sắc giữa Nam và Nữ.

3.6. Biểu đồ phân tán có đường xu hướng (Regression Line)

Tương quan giữa Độ tuổi và Thời gian sử dụng MXH

ggplot(df, aes(x = Age, y = Avg_Daily_Usage_Hours)) +
  geom_point(color = "darkorange", size = 2, alpha = 0.7) +
  geom_smooth(method = "lm", color = "blue", se = TRUE) + # Thêm đường xu hướng tuyến tính (Linear model)
  theme_minimal() +
  labs(title = "Mối liên hệ giữa Độ tuổi và Thời gian sử dụng MXH",
       x = "Độ tuổi",
       y = "Thời gian dùng MXH (giờ/ngày)")

- Biểu đồ phân tán + Đường xu hướng (Age vs Usage): Thêm hàm geom_smooth(method = “lm”) để vẽ một đường xu hướng tuyến tính. Biểu đồ này trả lời câu hỏi: “Liệu người càng lớn tuổi thì thời gian sử dụng mạng xã hội có càng giảm đi hay không?”. Vùng mờ xung quanh đường kẻ xanh là khoảng tin cậy (Confidence Interval).

3.7. Biểu đồ mật độ (Density Plot)

So sánh phân bố Thời gian sử dụng MXH giữa Nam và Nữ

plot_density <- ggplot(df, aes(x = Avg_Daily_Usage_Hours, fill = Gender)) +
  geom_density(alpha = 0.5) + # alpha để làm trong suốt, dễ nhìn khi bị chồng lấp
  theme_minimal() +
  scale_fill_manual(values = mau_gioi_tinh) +
  labs(title = "Biểu đồ Mật độ: Thời gian sử dụng MXH theo Giới tính",
       x = "Thời gian dùng MXH trung bình (giờ/ngày)",
       y = "Mật độ (Density)",
       fill = "Giới tính")
print(plot_density)

  • Biểu đồ mật độ (Density Plot): Tương tự như Histogram nhưng sử dụng đường cong liên tục. Việc dùng alpha = 0.5 giúp các mảng màu bán trong suốt, từ đó bạn có thể dễ dàng so sánh xem đường phân bố của “Male” hay “Female” đang nằm lệch về phía dùng nhiều giờ hay ít giờ hơn.

3.8. Lưới biểu đồ (Facet Wrap)

Mối liên hệ Giờ dùng MXH và Giờ ngủ, chia theo từng Nền tảng

plot_facet <- ggplot(df, aes(x = Avg_Daily_Usage_Hours, y = Sleep_Hours_Per_Night, color = Gender)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, color = "black") + # Đường xu hướng cho từng nhóm
  facet_wrap(~ Most_Used_Platform) + # Chia nhỏ biểu đồ theo từng nền tảng
  scale_color_manual(values = mau_gioi_tinh) + # THÊM DÒNG NÀY VÀO ĐỂ CAN THIỆP MÀU CỦA CÁC CHẤM
  theme_minimal() +
  labs(title = "Tương quan Giờ dùng MXH và Giờ ngủ (Phân theo Nền tảng)",
       x = "Giờ dùng MXH",
       y = "Giờ ngủ",
       color = "Giới tính")

print(plot_facet)

  • Lưới biểu đồ (Facet Wrap): Đây là một tính năng cực kỳ mạnh mẽ của ggplot2. Thay vì dồn tất cả các nền tảng vào 1 biểu đồ duy nhất gây rối mắt, facet_wrap(~ Most_Used_Platform) sẽ tách dữ liệu ra làm nhiều biểu đồ nhỏ (mỗi nền tảng 1 biểu đồ) nhưng vẫn dùng chung thang đo (trục x, trục y) để bạn dễ dàng so sánh xu hướng giữa các mạng xã hội.

3.9. Biểu đồ vĩ cầm (Violin Plot) kết hợp Jitter

Phân bố thời gian ngủ theo Giới tính (hiển thị hình dáng phân bố thực tế)

plot_violin <- ggplot(df, aes(x = Gender, y = Sleep_Hours_Per_Night, fill = Gender, color = Gender)) + # Thêm color = Gender ở đây
  geom_violin(trim = FALSE, alpha = 0.6) + 
  geom_jitter(width = 0.15, size = 1, alpha = 0.7) + # Tăng alpha của jitter lên một chút cho chấm rõ hơn
  
  # THÊM 2 DÒNG NÀY ĐỂ ĐỔI MÀU:
  scale_fill_manual(values = mau_gioi_tinh) +   # Đổi màu phần thân vĩ cầm
  scale_color_manual(values = mau_gioi_tinh) +  # Đổi màu các chấm jitter
  
  theme_minimal() +
  labs(title = "Biểu đồ Vĩ cầm: Phân bố Thời gian ngủ theo Giới tính",
       x = "Giới tính",
       y = "Thời gian ngủ (giờ/đêm)") +
  theme(legend.position = "none") # Đã ẩn chú thích vì trục x đã hiện giới tính

print(plot_violin)

- Biểu đồ vĩ cầm (Violin Plot) kết hợp Jitter: Boxplot (ở phần trước) chỉ cho thấy các mức tứ phân vị (25%, 50%, 75%). Trong khi đó, Violin plot sẽ phình to ra ở những nơi tập trung nhiều người dùng nhất (hiển thị được cả hình dáng của phân phối dữ liệu). Việc thêm geom_jitter() sẽ chấm thêm các điểm dữ liệu thực tế rải rác bên trong giúp ta thấy rõ mật độ thực của từng cá nhân.

3.10. Biểu đồ cột thể hiện Trung bình (Summary Bar Chart)

  • So sánh mức độ thiếu ngủ trung bình giữa các độ tuổi xem độ tuổi nào “thức khuya/ngủ ít” nhất
plot_age_sleep_mean <- ggplot(df, aes(x = as.factor(Age), y = Sleep_Hours_Per_Night)) +
  # Dùng stat_summary để tự động tính trung bình (mean) và vẽ cột
  stat_summary(fun = mean, geom = "bar", fill = "lightseagreen", width = 0.6) +
  # Thêm số liệu trung bình lên đầu cột cho dễ đọc
  stat_summary(fun = mean, geom = "text", aes(label = round(after_stat(y), 1)), vjust = -0.5, size = 4) +
  theme_minimal() +
  labs(title = "Thời gian ngủ trung bình mỗi đêm theo Độ tuổi",
       x = "Độ tuổi",
       y = "Thời gian ngủ trung bình (giờ/đêm)") +
  # Mở rộng trục y một chút để số không bị cắt
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))

print(plot_age_sleep_mean)

3.11. Biểu đồ Kẹo mút (Lollipop Chart)

# XỬ LÝ DỮ LIỆU: Lọc ra Top 5 nền tảng có nhiều người dùng nhất để khớp với bộ 5 màu
df_top5 <- df %>%
  filter(Most_Used_Platform %in% c("Instagram", "TikTok", "Twitter", "Facebook", "YouTube"))

Đẹp và tinh tế hơn Biểu đồ cột (Bar chart) khi so sánh giá trị

# Tính trung bình giờ dùng của Top 5
df_mean <- df_top5 %>%
  group_by(Most_Used_Platform) %>%
  summarise(Mean_Usage = mean(Avg_Daily_Usage_Hours, na.rm = TRUE)) %>%
  arrange(Mean_Usage) # Sắp xếp từ thấp đến cao
# Ép kiểu factor để ggplot2 giữ nguyên thứ tự sắp xếp
df_mean$Most_Used_Platform <- factor(df_mean$Most_Used_Platform, levels = df_mean$Most_Used_Platform)

plot_lollipop <- ggplot(df_mean, aes(x = Most_Used_Platform, y = Mean_Usage, color = Most_Used_Platform)) +
  geom_segment(aes(x = Most_Used_Platform, xend = Most_Used_Platform, y = 0, yend = Mean_Usage), size = 1.5) + # Vẽ que
  geom_point(size = 6) + # Vẽ kẹo (chấm tròn)
  geom_text(aes(label = round(Mean_Usage, 1)), color = "white", size = 2.5) + # Chèn số vào giữa chấm tròn
  scale_color_manual(values = my_col) +
  coord_flip() + # Lật ngang
  theme_minimal() +
  labs(title = "Trung bình giờ sử dụng của Top 5 Nền tảng",
       x = "",
       y = "Số giờ sử dụng (giờ/ngày)") +
  theme(legend.position = "none")

print(plot_lollipop)

3.12. Biểu đồ Bong bóng (Bubble Chart) - Thể hiện 4 Biến cùng lúc

Trục X: Giờ dùng MXH | Trục Y: Giờ ngủ | Màu sắc: Nền tảng | Kích thước: Độ tuổi

plot_bubble <- ggplot(df_top5, aes(x = Avg_Daily_Usage_Hours, y = Sleep_Hours_Per_Night, 
                                   color = Most_Used_Platform, size = Age)) +
  geom_point(alpha = 0.6) +
  scale_color_manual(values = my_col) +
  scale_size_continuous(range = c(2, 8)) + # Chỉnh độ to/nhỏ của bong bóng
  theme_minimal() +
  labs(title = "Phân tích Đa chiều: Thời gian dùng, Giấc ngủ, Tuổi và Nền tảng",
       x = "Giờ dùng MXH",
       y = "Giờ ngủ",
       color = "Nền tảng",
       size = "Độ tuổi") +
  theme(legend.position = "right")

print(plot_bubble)

3.13. Làm chủ Theme (Tuỳ chỉnh giao diện như Báo cáo chuyên nghiệp)

plot_pro_theme <- ggplot(df_top5, aes(x = Most_Used_Platform, y = Avg_Daily_Usage_Hours, fill = Most_Used_Platform)) +
  geom_violin(alpha = 0.8, color = NA) + # color = NA để bỏ viền đen
  scale_fill_manual(values = my_col) +
  theme_classic() + # Dùng theme_classic thay vì theme_minimal để có trục tọa độ sắc nét
  labs(
    title = "Phân bố Thời gian sử dụng MXH (Top 5 Nền tảng)",
    subtitle = "Sự chênh lệch về mức độ tương tác giữa các mạng xã hội",
    caption = "Nguồn dữ liệu: DuLieu.csv | Trực quan hoá bằng ggplot2", # Thêm chú thích nguồn
    x = "Nền tảng",
    y = "Số giờ (h/ngày)"
  ) +
  theme(
    plot.title = element_text(face = "bold", size = 16, color = "#023E8A"), # Đổi màu, in đậm tiêu đề chính
    plot.subtitle = element_text(size = 11, color = "#555555", margin = margin(b = 15)), # Chỉnh tiêu đề phụ và tạo khoảng cách
    plot.caption = element_text(face = "italic", color = "gray", hjust = 1), # Chú thích in nghiêng, căn phải
    axis.text.x = element_text(face = "bold", size = 11, color = "#333333"),
    axis.line = element_line(color = "#CCCCCC"), # Làm mờ đường trục tung/hoành
    legend.position = "none"
  )

print(plot_pro_theme)

4. Mô phỏng dữ liệu và trực quan hoá dữ liệu

Mô phỏng một số phân phối rồi quan sát phân phối qua biểu đồ histogram

Phân phối chuẩn

set.seed(19)
x<- rnorm(1000, 20, 2)
hist(x,xlim=c(10,30),col=my_col[3])

Phân phối nhị thức

#set.seed(19)
x<- rbinom(1000, 20, 0.5)
hist(x,xlim=c(0,20),col=my_col[3])

#set.seed(19)
x<- rbinom(100, 20, 0.1)
hist(x,xlim=c(0,20),col=my_col[1])

Phân phối Poisson

x <- rpois(1000, lambda=15)
hist(x)

Phân phối mũ

x<- rexp(1500, 0.1)
par(mfrow=c(1,2))
hist(x)
curve(dexp(x,10))

Phân phối Chi bình phương

curve(dchisq(x, 1), xlim=c(0,10), ylim=c(0,0.6), col="red", lwd=3)
curve(dchisq(x, 2), add=T, col="green", lwd=3)
curve(dchisq(x, 3), add=T, col="blue", lwd=3)
curve(dchisq(x, 5), add=T, col="orange", lwd=3)
abline(h=0, lty=3)
legend(par("usr")[2], par("usr")[4],
xjust=1,
c("df=1", "df=2", "df=3", "df=5"), lwd=3, lty=1,
col=c("red", "green", "blue", "orange"))

Phân phối Student

curve(dt(x, 1), xlim=c(-3,3), ylim=c(0,0.4), col="red", lwd=3)
curve(dt(x, 2), add=T, col="blue", lwd=3)
curve(dt(x, 5), add=T, col="green", lwd=3)
curve(dt(x, 10), add=T, col="orange", lwd=3)
curve(dnorm(x), add=T, lwd=4, lty=3)
title(main="Student T distributions")
legend(par("usr")[2], par("usr")[4],xjust=0.9,
c("df=1", "df=2", "df=5", "df=10", "Std.norm."),
lwd=c(2,2,2,2,2),
lty=c(1,1,1,1,3),
col=c("red", "blue", "green", "orange", par("fg")))

Phân phối Fisher

curve(df(x,1,1), xlim=c(0,2), ylim=c(0,0.8), lwd=3)
curve(df(x,3,1), add=T)
curve(df(x,6,1), add=T, lwd=3)
curve(df(x,3,3), add=T, col="red")
curve(df(x,6,3), add=T, col="red", lwd=3)
curve(df(x,3,6), add=T, col="blue")
curve(df(x,6,6), add=T, col="blue", lwd=3)
title(main="Fisher F distributions")
legend(par("usr")[2], par("usr")[4],
xjust=1,
c("df=1,1", "df=3,1", "df=6,1", "df=3,3", "df=6,3",
"df=3,6", "df=6,6"),
lwd=c(1,1,3,1,3,1,3),
lty=c(2,1,1,1,1,1,1),
col=c(par("fg"), par("fg"), par("fg"), "red", "blue", "blue"))

Q-Q plot cho hai phân phối chuẩn

#hai phân phối chuẩn
x=rnorm(1000,12,1)
y=rnorm(1000,12,1)
qqplot(x,y)

Q-Q plot cho phân phối chuẩn, phân phối đều

x=runif(1000,12,111)
y=rnorm(1000,12,1)
par(mfrow = c(1,3))#chia cửa sổ thành 3 ô để vẽ hình
qqplot(x,y)
qqnorm(x)
qqnorm(y)