EDA - Phân tích khám phá dữ liệu

Exploratory Data Analysis

Khái niệm về EDA

Khái niệm

Khi một nhà khoa học dữ liệu nhận được dữ liệu để làm việc, giai đoạn đầu tiên đó là phải hiểu dữ liệu và đánh giá nó về chất lượng, tính hữu ích và tính đầy đủ. Đây là một giai đoạn quan trọng vì nó có thể có ích hoặc phá vỡ toàn bộ phân tích dữ liệu chuyên sâu sau này. Trong giai đoạn này, để hiểu dữ liệu mà chúng ta được cung cấp và sau đó quyết định cách tốt nhất để sử dụng các nguồn dữ liệu có sẵn để có được câu trả lời cần thiết trước khi đưa ra bất kỳ giả định nào về nó. Có thể sử dụng các phương pháp trực quan và định lượng [1].

Các nội dung thao tác EDA:

“Phân tích dữ liệu khám phá (EDA) là một thuật ngữ để chỉ một số loại phân tích và phát hiện ban đầu được thực hiện với các tập dữ liệu, thường là ở giai đoạn đầu của một quá trình phân tích.

Được phát triển bởi John Tukey vào những năm 1970, phân tích dữ liệu khám phá thường được mô tả như một triết lý và không có quy tắc khó và nhanh nào cho cách bạn tiếp cận nó. Điều đó nói rằng, nó cũng đã tạo ra cả một môi trường điện toán thống kê cả được sử dụng để giúp xác định EDA là gì và để giải quyết các nhiệm vụ cụ thể như:

  • Phát hiện lỗi và thiếu dữ liệu.

  • Vẽ sơ đồ cấu trúc cơ bản của dữ liệu.

  • Xác định các biến quan trọng nhất.

  • Liệt kê dị thường và ngoại lệ.

  • Kiểm tra một giả thuyết / kiểm tra các giả định liên quan đến một mô hình cụ thể.

  • Thiết lập một mô hình tuyệt vời (một mô hình có thể được sử dụng để giải thích dữ liệu với các biến dự đoán tối thiểu).

  • Ước tính các tham số và tìm ra các khoảng tin cậy hoặc biên độ sai số liên quan.

Phân tích dữ liệu khám phá (EDA) là quá trình phân tích và trực quan hóa dữ liệu để hiểu rõ hơn về dữ liệu và thu thập thông tin chi tiết từ đó. Có nhiều bước liên quan khi thực hiện EDA nhưng sau đây là các bước phổ biến mà nhà phân tích dữ liệu có thể thực hiện khi thực hiện EDA:

  • Nhập dữ liệu

  • Làm sạch dữ liệu

  • Xử lý dữ liệu

  • Trực quan hóa dữ liệu

EDA

Giới thiệu về R Course của Harvard

Trong nội dung bài thực hành này, chúng ta sẽ làm quen với tập dữ liệu murders và các bước phân tích dữ liệu khám phá EDA với tập dữ liệu này. Bài thực hành này được miêu tả lại từ một khóa học cơ bản về khám phá dữ liệu với R của Đại học Harvard, được diễn giải do Giáo sư Rafael Irizarry, chuyên ngành Thống kê sinh học và Sinh học Tính toán tại Viện Ung thư Dana Farber giảng dạy [2]

Giáo sư Rafael Irizarry

Thực hành

Tập dữ liệu này nằm trong gói dslabs. Trước khi tiến hành phân tích cần load tập dữ liệu này từ package dslabs và sử dụng lệnh data(“murders”) để lấy dữ liệu.

Các thư viện cần thiết trong nội dung phân tích bao gồm:

  1. Thư viện tidyverse
  2. Thư viện dslabs

Tập dữ liệu murders, tên đầy đủ là US gun murders by state for 2010 cho biết thông tin về tội phạm bằng súng tại các bang của nước Mỹ, dữ liệu được cung cấp bởi FBI - Cục điều tra liên bang Mỹ, tập dữ liệu cũng cung cấp thông tin về dân số các bang của Mỹ vào năm 2010[3]

Dựa vào các nội dung đã được học về xử lý dữ liệu với tidyr, dplyr, ggplot2. Hãy thực hiện một số nội dung cơ bản như sau:

Bài tập 1: Hàm cơ bản

Viết hàm giải phương trình bậc hai trong R, với hệ số \(a\neq 0\)

\[ ax^{2} +bc+c=0 \]

Bài tập 2: Tạo dãy cách đều

Hãy tạo ra một véc tơ x chứa các số nguyên từ 1 đến 1000, viết hàm in ra tổng của 1000 số tự nhiên đầu tiên

Bài tập 3: Thống kê cơ bản

Thống kê cơ bản

  • Kiểm tra xem murders có phải là một data.frame hay không?

  • Kiểm tra cấu trúc dữ liệu của murders

  • Hãy liệt kê 10 dữ liệu đầu của tập dữ liệu này

  • Hãy liệt kê 10 dữ liệu cuối cùng của dữ liệu này

  • Viết lệnh kiểm tra chiều (dimension) của dữ liệu

  • Viết lệnh liệt kê các biến (tên cột) của dữ liệu này

  • Kiểm tra xem biến population có bao nhiêu dòng quan sát?

  • Biến region có phải là một biến factor hay không, nếu không phải hãy chuyển thành biến factor và gán nhãn levels cho biến này, sau khi gán nhãn xong hãy dùng hàm nlevels() để kiểm tra lại các nhãn cho biến region

Bài tập 3: Sắp xếp sort(), rank() và order()

Trong nội dung bài giảng lý thuyết về R trong thống kê của mình, giáo sư Rafael Irizarry có nêu ra nội dung các hàm này như sau:

Các hàm sắp xếp

Giả sử chúng ta có cột original là một véc tơ số chưa được sắp xếp, các bạn hãy giải thích thông qua các cột giá trị còn lại ý nghĩa của các hàm sort(), hàm order() và hàm rank().

Áp dụng ba hàm trên vào bài toán thực tế, hãy truy cập vào các biến populationstates. Tạo ra một véc tơ là states với tên của các bang trong nước Mỹ, véc tơ khác có tên là ranks để sắp xếp theo hạng về quy mô dân số của các bang; và véc tơ ind để lưu giá trị index dữ liệu của biến population

Hãy giải thích đoạn code sau:

Bài tập 4: Dữ liệu trống NA, thống kê min, max.

Trong thư viện dslabs cung cấp thêm tập dữ liệu véc tơ có tên na_example cho phép chúng ta thao tác với các dữ liệu trống.

Hãy giải thích kết quả của các dòng lệnh sau:

library(dslabs)
data("na_example")
str(na_example)
##  int [1:1000] 2 1 3 2 1 3 1 4 3 2 ...
mean(na_example)
## [1] NA
ind <- is.na(na_example)
sum(ind)
## [1] 145
mean(na_example[!ind])
## [1] 2.301754

Tiếp theo, cùng thống kê để tìm một số thông tin hữu ích liên quan:

  • Viết lệnh kiểm tra xem tên của bang (tại dòng quan sát nào) của tập dữ liệu murders có số dân lớn nhất. Gợi ý: Dùng which.max

  • Hãy bổ sung thêm cột biến mới có tên murder_rate, biến này lưu trữ dữ liệu về tỷ lệ tội phạm trên toàn dân số của từng bang trên 100.000 dân. Gợi ý: Dùng mutate để thêm biến mới, tỷ lệ tội phạm:

    \(ratemurder = \sum(murders)/\sum(population)\times 100.000\)

  • Sử dụng hàm order, hãy sắp xếp tỷ lệ tội phạm của các bang theo thứ tự giảm dần.

  • Tạo ra véc-tơ có tên là index lưu trữ các chỉ số quan sát có \(murderrate\leq 0.71\)

  • Liệt kê tên các bang có tỷ lệ tội phạm nhỏ hơn 0.71, có tất cả bao nhiêu bang có tỷ lệ này?

  • Giả sử chúng ta muốn tìm hiểu xem ở phía Tây nước Mỹ (West) các bang nào có thể coi là an toàn. Một bang an toàn nếu nằm ở phía Tây gọi là an toàn nếu: Tỷ lệ tội phạm nhỏ hơn hoặc bằng 1 và nằm ở phía Tây. Hãy tạo ra một véc tơ có tên là index_safe liệt kê các quan sát và tên các bang thỏa mãn điều kiện trên

Bài tập 5: Indexing function

• Hàm which () cung cấp cho chúng ta các kết quả tại các quan sát có giá trị True thỏa mãn một điều kiện nào đó

• Hàm match () cho phép trả về kết quả là chỉ mục của quan sát khi dữ liệu thỏa mãn điều kiện.

• Hàm % in% nếu chúng ta muốn biết liệu mỗi phần tử trong vectơ thứ nhất có nằm trong vectơ thứ hai hay không.

  • Sử dụng tính chất của hàm which() và véc tơ murder_rate, hãy chỉ ra tỷ lệ tội phạm tại bang Massachusetts?

  • Giải thích cách dùng hàm match() qua ví dụ sau:

x <- c("a", "b", "c", "d", "e")
y <- c("a", "d", "f")
y %in% x
## [1]  TRUE  TRUE FALSE
  • Áp dụng hàm match(), hãy chỉ ra tỷ lệ tội phạm tại các bang sau: “New York”, “Florida”, “Texas”

  • Sử dụng hàm %in%, hãy kiểm tra xem Boston, Dakota, and Washington có phải là các bang hay không?

Bài tập 6: Tóm tắt lại index

Hãy làm lại các câu lệnh sau, giải thích ý nghĩa từng câu lệnh:

# Nội dung về murder_rate
murder_rate <- murders$total/murders$population*100000
low <- murder_rate < 1
murders$state[low]
##  [1] "Hawaii"        "Idaho"         "Iowa"          "Maine"        
##  [5] "Minnesota"     "New Hampshire" "North Dakota"  "Oregon"       
##  [9] "South Dakota"  "Utah"          "Vermont"       "Wyoming"
murder_rate <- murders$total/murders$population*100000
low <- murder_rate < 1
ind <- low & murders$region == "Northeast"
murders$state[ind]
## [1] "Maine"         "New Hampshire" "Vermont"
avg <- mean(murder_rate)
sum(murder_rate < avg)
## [1] 27
# Toán tử %in%
abbs <- c("AK", "MI", "IA")
ind <- match(abbs, murders$abb)
murders$state[ind]
## [1] "Alaska"   "Michigan" "Iowa"
abbs <- c("MA", "ME", "MI", "MO", "MU")
abbs %in%murders$abb
## [1]  TRUE  TRUE  TRUE  TRUE FALSE

Bài tập 7: Thao tác cơ bản với dplyr

x <- c(88, 100, 83, 92, 94)
rank(-x)
## [1] 4 1 5 3 2
# Defining rate
rate <-  murders$total/ murders$population * 100000

# Redefine murders to include a column named rank
# with the ranks of rate from highest to lowest
murders <- mutate(murders, rank = rank(-rate))
# Load dplyr
library(dplyr)

# Use select to only show state names and abbreviations from murders
select(murders, state, abb)
##                   state abb
## 1               Alabama  AL
## 2                Alaska  AK
## 3               Arizona  AZ
## 4              Arkansas  AR
## 5            California  CA
## 6              Colorado  CO
## 7           Connecticut  CT
## 8              Delaware  DE
## 9  District of Columbia  DC
## 10              Florida  FL
## 11              Georgia  GA
## 12               Hawaii  HI
## 13                Idaho  ID
## 14             Illinois  IL
## 15              Indiana  IN
## 16                 Iowa  IA
## 17               Kansas  KS
## 18             Kentucky  KY
## 19            Louisiana  LA
## 20                Maine  ME
## 21             Maryland  MD
## 22        Massachusetts  MA
## 23             Michigan  MI
## 24            Minnesota  MN
## 25          Mississippi  MS
## 26             Missouri  MO
## 27              Montana  MT
## 28             Nebraska  NE
## 29               Nevada  NV
## 30        New Hampshire  NH
## 31           New Jersey  NJ
## 32           New Mexico  NM
## 33             New York  NY
## 34       North Carolina  NC
## 35         North Dakota  ND
## 36                 Ohio  OH
## 37             Oklahoma  OK
## 38               Oregon  OR
## 39         Pennsylvania  PA
## 40         Rhode Island  RI
## 41       South Carolina  SC
## 42         South Dakota  SD
## 43            Tennessee  TN
## 44                Texas  TX
## 45                 Utah  UT
## 46              Vermont  VT
## 47             Virginia  VA
## 48           Washington  WA
## 49        West Virginia  WV
## 50            Wisconsin  WI
## 51              Wyoming  WY
# Add the necessary columns
murders <- mutate(murders, rate = total/population * 100000, rank = rank(-rate))

# Filter to show the top 5 states with the highest murder rates
filter(murders, rank <= 5)
##                  state abb        region population total rank      rate
## 1 District of Columbia  DC         South     601723    99    1 16.452753
## 2            Louisiana  LA         South    4533372   351    2  7.742581
## 3             Maryland  MD         South    5773552   293    4  5.074866
## 4             Missouri  MO North Central    5988927   321    3  5.359892
## 5       South Carolina  SC         South    4625364   207    5  4.475323
# Use filter to create a new data frame no_south
no_south <- filter(murders, region != "South")
# Use nrow() to calculate the number of rows

# Create a new data frame called murders_nw with only the states from the northeast and the west
murders_nw <-filter(murders, region %in% c("Northeast", "West"))
# Number of states (rows) in this category 
nrow(murders_nw)
## [1] 22
# add the rate column
murders <- mutate(murders, rate =  total / population * 100000, rank = rank(-rate))

# Create a table, call it my_states, that satisfies both the conditions 
my_states <- filter(murders, region %in% c("Northeast", "West") &rate < 1)
# Use select to show only the state name, the murder rate and the rank
# Load library
library(dplyr)

## Define the rate column
murders <- mutate(murders, rate =  total / population * 100000, rank = rank(-rate))

# show the result and only include the state, rate, and rank columns, all in one line, in that order
filter(murders, region %in% c("Northeast", "West") & rate < 1) %>% select(state, rate, rank)
##           state      rate rank
## 1        Hawaii 0.5145920   49
## 2         Idaho 0.7655102   46
## 3         Maine 0.8280881   44
## 4 New Hampshire 0.3798036   50
## 5        Oregon 0.9396843   42
## 6          Utah 0.7959810   45
## 7       Vermont 0.3196211   51
## 8       Wyoming 0.8871131   43
# Loading the libraries
library(dplyr)
data(murders)

# Create new data frame called my_states (with specifications in the instructions)
my_states <- murders %>% 
    mutate(rate =  total / population * 100000, rank = rank(-rate)) %>%
    filter(region %in% c("Northeast", "West") & rate < 1) %>%
    select(state, rate, rank)

Bài tập 8: Trực quan

  • Sử dụng thư viện ggplot2 và corrplot, hãy trực quan mối tương quan bằng biểu đồ phân tán dành cho tỷ lệ tội phạm và số dân của các bang.

  • Hãy vẽ biểu đồ histogram cho biến tỷ lệ tộ phạm, có nhận xét gì?

  • Hãy vẽ biểu đồ hộp box-plot, miêu tả tỷ lệ tội phạm cho từng khu vực tại Mỹ, có nhận xét gì?

boxplot(rate~region, data = murders)

[1]
L. Montero Mercadé, “Introduction to r: EDA,” 2021.
[2]
R. Segol and A. Parkhomenko, “Massive open online course ‘CS50 introduction to computer science’ by harvard university implementation into ukrainian educational process,” Industry 4.0, vol. 4, no. 4, pp. 195–197, 2019.
[3]
J. M. Chambers, Software for data analysis: Programming with r, vol. 2. Springer, 2008.