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:
- Thư viện tidyverse
- 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 population và states. 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)