Skip to content

Buổi 4: Phân tích Dữ liệu Khám phá (EDA) trong R

Buổi 4: Phân tích Dữ liệu Khám phá (EDA) trong R

Mục tiêu

Học viên sẽ học cách khám phá và hiểu dữ liệu thông qua các kỹ thuật trực quan hóa và thống kê trong R. Sau buổi học, học viên sẽ có khả năng:

  • Nhận diện các đặc điểm chính của tập dữ liệu.
  • Phát hiện các vấn đề như giá trị bị thiếu, giá trị ngoại lai (outliers).
  • Sử dụng các công cụ trực quan hóa để tìm ra các mẫu (patterns) và mối quan hệ trong dữ liệu.

Nội dung chi tiết

1. Giới thiệu về EDA

EDA là gì?

Phân tích Dữ liệu Khám phá (Exploratory Data Analysis – EDA) là bước đầu tiên trong quy trình khoa học dữ liệu, giúp hiểu rõ dữ liệu trước khi xây dựng mô hình. EDA giúp:

  • Phát hiện các vấn đề trong dữ liệu (dữ liệu bị thiếu, ngoại lai, phân phối không bình thường).
  • Xác định các mối quan hệ giữa các biến.
  • Đưa ra các giả thuyết ban đầu để phân tích sâu hơn.

Tại sao EDA quan trọng?

  • Tránh việc xây dựng mô hình trên dữ liệu “bẩn” (dữ liệu có lỗi).
  • Giúp chọn các kỹ thuật mô hình hóa phù hợp (ví dụ: nếu dữ liệu không tuyến tính, hồi quy tuyến tính có thể không hiệu quả).
  • Cải thiện chất lượng mô hình bằng cách làm sạch và tiền xử lý dữ liệu.

Các bước cơ bản trong EDA:

  • Kiểm tra cấu trúc dữ liệu (số hàng, số cột, kiểu dữ liệu).
  • Tính toán các thống kê tóm tắt (trung bình, trung vị, độ lệch chuẩn, v.v.).
  • Trực quan hóa dữ liệu để tìm các mẫu và mối quan hệ.
  • Xử lý các vấn đề như giá trị bị thiếu, ngoại lai.

2. Trực quan hóa Dữ liệu với ggplot2

Giới thiệu về ggplot2:

ggplot2 là một trong những gói mạnh mẽ nhất trong R để tạo biểu đồ. Nó dựa trên “Grammar of Graphics”, cho phép xây dựng biểu đồ một cách linh hoạt và trực quan.

Cài đặt và tải gói:

# Cài đặt ggplot2 nếu chưa có
install.packages("ggplot2")
# Tải gói
library(ggplot2)

Các loại biểu đồ cơ bản:

1. Biểu đồ phân tán (Scatter Plot): Dùng để xem mối quan hệ giữa hai biến liên tục.

Ví dụ: Xem mối quan hệ giữa trọng lượng xe (wt) và quãng đường đi được (mpg) trong tập dữ liệu mtcars.

# Tạo biểu đồ phân tán
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  labs(title = "Mối quan hệ giữa Trọng lượng và Quãng đường",
       x = "Trọng lượng (wt)", y = "Quãng đường (mpg)") +
  theme_minimal()

2. Biểu đồ cột (Histogram): Dùng để xem phân phối của một biến liên tục.

Ví dụ: Xem phân phối của quãng đường đi được (mpg).

# Tạo biểu đồ cột
ggplot(data = mtcars, aes(x = mpg)) +
  geom_histogram(binwidth = 2, fill = "blue", color = "black") +
  labs(title = "Phân phối Quãng đường (mpg)",
       x = "Quãng đường (mpg)", y = "Số lượng") +
  theme_minimal()

3. Biểu đồ hộp (Boxplot): Dùng để xem phân phối và phát hiện ngoại lai.

Ví dụ: So sánh quãng đường (mpg) theo số xi-lanh (cyl).

# Tạo biểu đồ hộp
ggplot(data = mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Quãng đường theo Số Xi-lanh",
       x = "Số Xi-lanh (cyl)", y = "Quãng đường (mpg)") +
  theme_minimal()

4. Biểu đồ thanh (Bar Chart): Dùng cho biến phân loại.

Ví dụ: Đếm số lượng xe theo số xi-lanh (cyl).

# Tạo biểu đồ thanh
ggplot(data = mtcars, aes(x = factor(cyl))) +
  geom_bar(fill = "orange") +
  labs(title = "Số lượng Xe theo Số Xi-lanh",
       x = "Số Xi-lanh (cyl)", y = "Số lượng") +
  theme_minimal()

Tùy chỉnh biểu đồ:

  • Thay đổi màu sắc: Sử dụng fill hoặc color.
  • Thêm tiêu đề và nhãn: Sử dụng labs().
  • Thay đổi giao diện: Sử dụng các chủ đề như theme_minimal(), theme_classic().

3. Thống kê Tóm tắt

Mục đích: Hiểu các đặc điểm cơ bản của dữ liệu thông qua các số liệu thống kê.

Các hàm cơ bản trong R:

1. summary(): Cung cấp tóm tắt nhanh (min, max, trung bình, trung vị, tứ phân vị).

# Tóm tắt tập dữ liệu mtcars
summary(mtcars)

Kết quả mẫu:

     mpg             cyl             disp             hp       
 Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
 1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
 Median :19.20   Median :6.000   Median :196.3   Median :123.0  
 Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
 3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
 Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  

2. Các hàm cụ thể:

  • Trung bình: mean(mtcars$mpg) → Kết quả: 20.09.
  • Trung vị: median(mtcars$mpg) → Kết quả: 19.2.
  • Độ lệch chuẩn: sd(mtcars$mpg) → Kết quả: 6.03.
  • Tương quan: cor(mtcars$mpg, mtcars$wt) → Kết quả: -0.87 (tương quan nghịch mạnh).

Phát hiện ngoại lai:

Sử dụng quy tắc IQR (Interquartile Range):

  • Tính IQR: IQR(mtcars$mpg).
  • Xác định ngưỡng:
    • Giới hạn dưới: Q1 – 1.5 * IQR.
    • Giới hạn trên: Q3 + 1.5 * IQR.

Ví dụ:

Q1 <- quantile(mtcars$mpg, 0.25)
Q3 <- quantile(mtcars$mpg, 0.75)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
outliers <- mtcars$mpg[mtcars$mpg < lower_bound | mtcars$mpg > upper_bound]
print(outliers)

Kết quả: Nếu có giá trị nào nằm ngoài khoảng [lower_bound, upper_bound], đó là ngoại lai.

4. Xử lý Dữ liệu Bị Thiếu

Phát hiện giá trị bị thiếu:

Sử dụng is.na() để kiểm tra.

Ví dụ: Tạo một tập dữ liệu mẫu có giá trị bị thiếu:

# Tạo dữ liệu mẫu
df <- data.frame(
  A = c(1, 2, NA, 4, 5),
  B = c(NA, 2, 3, 4, NA)
)
# Kiểm tra giá trị bị thiếu
sum(is.na(df))  # Tổng số giá trị bị thiếu
colSums(is.na(df))  # Số giá trị bị thiếu theo cột

Chiến lược xử lý giá trị bị thiếu:

1. Xóa hàng/cột chứa giá trị bị thiếu:

# Xóa hàng có giá trị bị thiếu
df_clean <- na.omit(df)
print(df_clean)

2. Điền giá trị (Imputation):

  • Điền bằng trung bình hoặc trung vị:
  • # Điền giá trị bị thiếu trong cột A bằng trung bình
    df$A[is.na(df$A)] <- mean(df$A, na.rm = TRUE)
    print(df)
        
  • Sử dụng gói tidyr để điền giá trị:
  • library(tidyr)
    # Điền giá trị bị thiếu bằng giá trị trước đó (forward fill)
    df <- fill(df, A, .direction = "down")
    print(df)
        

Lưu ý:

  • Việc xử lý giá trị bị thiếu phụ thuộc vào bối cảnh dữ liệu. Ví dụ, nếu dữ liệu bị thiếu quá nhiều, việc xóa có thể làm mất thông tin quan trọng.
  • Có thể sử dụng các phương pháp nâng cao hơn như điền giá trị bằng mô hình dự đoán (dùng gói mice).

5. Bài tập Thực hành

Yêu cầu:

  • Tải một tập dữ liệu (dùng tập dữ liệu diamonds có sẵn trong ggplot2).
  • Thực hiện EDA:
    • Kiểm tra cấu trúc dữ liệu.
    • Tính toán các thống kê tóm tắt.
    • Tạo các biểu đồ để khám phá dữ liệu.
    • Xử lý giá trị bị thiếu (nếu có) và phát hiện ngoại lai.

Hướng dẫn chi tiết:

1. Tải và kiểm tra dữ liệu:

# Tải gói ggplot2 (để sử dụng tập dữ liệu diamonds)
library(ggplot2)
# Xem cấu trúc dữ liệu
str(diamonds)
# Xem vài dòng đầu
head(diamonds)
# Tóm tắt dữ liệu
summary(diamonds)

2. Trực quan hóa dữ liệu:

  • Biểu đồ phân tán giữa giá (price) và trọng lượng (carat):
  • ggplot(data = diamonds, aes(x = carat, y = price)) +
      geom_point() +
      labs(title = "Mối quan hệ giữa Trọng lượng và Giá",
           x = "Trọng lượng (carat)", y = "Giá (price)") +
      theme_minimal()
        
  • Biểu đồ hộp để xem giá (price) theo chất lượng cắt (cut):
  • ggplot(data = diamonds, aes(x = cut, y = price)) +
      geom_boxplot(fill = "lightblue") +
      labs(title = "Giá theo Chất lượng Cắt",
           x = "Chất lượng Cắt (cut)", y = "Giá (price)") +
      theme_minimal()
        

3. Phát hiện và xử lý ngoại lai:

  • Tính IQR và tìm ngoại lai trong cột price:
  • Q1 <- quantile(diamonds$price, 0.25)
    Q3 <- quantile(diamonds$price, 0.75)
    IQR <- Q3 - Q1
    lower_bound <- Q1 - 1.5 * IQR
    upper_bound <- Q3 + 1.5 * IQR
    outliers <- diamonds$price[diamonds$price < lower_bound | diamonds$price > upper_bound]
    print(length(outliers))  # Số lượng ngoại lai
        

4. Kiểm tra giá trị bị thiếu:

colSums(is.na(diamonds))  # Kiểm tra giá trị bị thiếu

(Tập dữ liệu diamonds không có giá trị bị thiếu, nhưng nếu có, bạn có thể áp dụng các phương pháp xử lý như đã hướng dẫn ở trên).

Kết quả mong đợi:

Học viên sẽ hiểu được phân phối của các biến trong tập dữ liệu diamonds, nhận diện các mối quan hệ (ví dụ: giá tăng theo trọng lượng), và phát hiện các giá trị bất thường (nếu có).

Công cụ/Gói sử dụng

  • ggplot2: Để trực quan hóa dữ liệu.
  • dplyr: Để xử lý và biến đổi dữ liệu (nếu cần).
  • tidyr: Để xử lý giá trị bị thiếu (nếu cần).

Tóm tắt buổi học

Buổi 4 tập trung vào việc khám phá dữ liệu thông qua các kỹ thuật trực quan hóa và thống kê. Học viên được thực hành với tập dữ liệu thực tế (mtcarsdiamonds), từ việc tạo biểu đồ, tính toán thống kê, đến xử lý các vấn đề như giá trị bị thiếu và ngoại lai. Đây là bước nền tảng quan trọng để chuẩn bị dữ liệu cho các phân tích và mô hình hóa ở các buổi sau.

Leave a Reply

Your email address will not be published. Required fields are marked *