Pada chapter EDA ini kita bisa menggunakan Visualisasi dan Transformation untuk melakukan explore data in a systematic way, yaitu proses EDA. Biasanya yang dilakukan adalah:
Generate questions about your data
Search for answers by visualising, transforming, and modelling your data.
Use what you learn to refine your questions and/or generate new questions.
EDA merupakan bagian yang penting untuk melakukan proses data analysis, karena kita harus investigate kualitas dari data yang kita gunakan. Data cleaning itu merupakan bagian dari EDA.
Biasanya ada dua tipe pertanyaan yang umum ditanyakan untuk mencari temuan dari dataset yang dimiliki, yaitu:
What type of variation occus within my variables?
What type of covariation occurs between my variables?
Variation is the tendency of the values of a variable to change from measurement to measurement. Berarti seperti distribusi datanya.
Kita bisa melakukan visualisasi data terhadap data yang categorical ataupun continuous. Contohnya jika kita ingin melihat distribusi data categorical kita bisa menggunakan bar chart
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
diamonds %>%
count(cut)
## # A tibble: 5 × 2
## cut n
## <ord> <int>
## 1 Fair 1610
## 2 Good 4906
## 3 Very Good 12082
## 4 Premium 13791
## 5 Ideal 21551
Lalu, untuk data yang continuous kita bisa menggunakan histogram
ggplot(data = diamonds) +
geom_histogram(mapping = aes(x = carat), binwidth = 0.5)
Kita juga bisa melihat hasil per binning nya menggunakan
count
diamonds %>%
count(cut_width(carat, 0.5))
## # A tibble: 11 × 2
## `cut_width(carat, 0.5)` n
## <fct> <int>
## 1 [-0.25,0.25] 785
## 2 (0.25,0.75] 29498
## 3 (0.75,1.25] 15977
## 4 (1.25,1.75] 5313
## 5 (1.75,2.25] 2002
## 6 (2.25,2.75] 322
## 7 (2.75,3.25] 32
## 8 (3.25,3.75] 5
## 9 (3.75,4.25] 4
## 10 (4.25,4.75] 1
## 11 (4.75,5.25] 1
Dari hasil tersebut kita bisa mendapatkan sebuah temuan, bahwa hampir
ada 30.000 observasi yang mimiliki carat di value antara
0.25 dan 0.75. Kita juga bisa memainkan parameter binwidth
untuk mengatur jumlah atau lebar dari binning yang ingin kita buat
Jika kita ingin membuat multiple histogram (berarti untuk data
categorical?) kita bisa menggunakan geom_freqpoly()
daripada geom_histogram()
ggplot(data = diamonds, mapping = aes(x = carat, colour = cut)) +
geom_freqpoly(binwidth = 0.1)
Nah, tujuan dari informasi yang kita dapatkan melalui proses EDA kita bisa membuat pertanyaan - pertanyaan seperti berikut:
Value mana yang most common? Kenapa?
Value mana yang rare? Apakah sesuai dengan ekspektasi kita?
Apakah terdapat unusual pattern? Kira - kira apa yang membuat itu terjadi?
Sebagai contoh, kita akan menggunakan histogram berikut. Kita bisa memiliki beberapa pertanyaan seperti:
Why are there more diamonds at whole carats and common fractions of carats?
Why are there more diamonds slightly to the right of each peak than there are slightly to the left of each peak?
Why are there no diamonds bigger than 3 carats?
ggplot(data = diamonds, mapping = aes(x = carat)) +
geom_histogram(binwidth = 0.01)
Kita juga bisa menemukan unusual values pada data yang dimiliki, seperti Outliers yang dimana data points tidak sesuai dengan pattern data yang dimiliki. Contoh nya pada plot di bawah ini memliki outlier
ggplot(diamonds) +
geom_histogram(mapping = aes(x = y), binwidth = 0.5) +
coord_cartesian(ylim = c(0, 50))
Kita bisa treat data tersebut dengan filter()
unusual <- diamonds %>%
filter(y < 3 | y > 20) %>%
select(price, x, y, z) %>%
arrange(y)
unusual
## # A tibble: 9 × 4
## price x y z
## <int> <dbl> <dbl> <dbl>
## 1 5139 0 0 0
## 2 6381 0 0 0
## 3 12800 0 0 0
## 4 15686 0 0 0
## 5 18034 0 0 0
## 6 2130 0 0 0
## 7 2130 0 0 0
## 8 2075 5.15 31.8 5.12
## 9 12210 8.09 58.9 8.06
Ketika ktia berhadapat unusual values pada data, selain outliers kita juga bisa menghadapi missing values. Untuk treat data tersebut kita bisa melakukan beberapa cara berikut:
diamonds <- diamonds %>%
filter(between(y, 3, 20))
Tetapi method ini tidak direkomendasi karena bukan berarti jika ada satu data point yang invalid, maka semua data jadi tidak valid. Semisal kalo kita memiliki jumlah data yang sedikit, jika data yang unusual kita drop maka nanti kita tidak memiliki data lagi
mutate() dan
ifelse() untuk replace unusual values dengan
NAdiamonds2 <- diamonds %>%
mutate(y = ifelse(y < 3 | y > 20, NA, y))
If variation describes the behavior within a variable, covariation describes the behavior between variables. Covariation is the tendency for the values of two or more variables to vary together in a related way.
ggplot(data = diamonds, mapping = aes(x = price)) +
geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)
It’s hard to see the difference in distribution because the overall counts differ so much:
ggplot(diamonds) +
geom_bar(mapping = aes(x = cut))
Nah, untuk melakukan comparison agar lebih gampang, daripada menggunakan count kita bisa menggunakan density.
ggplot(data = diamonds, mapping = aes(x = price, after_stat(density))) +
geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)
Jika menggunakan density juga masih sulit, kita bisa melihat
distribusi price nya menggunakan geom_boxplot()
ggplot(data = diamonds, mapping = aes(x = cut, y = price)) +
geom_boxplot()
Untuk visualisai convariation between categorical, kita perlu count
observasi dari masing - masing kombinasi. Kita bisa menggunakan
geom_count()
ggplot(data = diamonds) +
geom_count(mapping = aes(x = cut, y = color))
Atau kita bisa menggunakan count dan combine heatmap
diamonds %>%
count(color, cut) %>%
ggplot(mapping = aes(x = color, y = cut)) +
geom_tile(mapping = aes(fill = n))
Umumnya yang digunakan adalah Scatterplot dan di buku ini juga menggunakan itu
ggplot(data = diamonds) +
geom_point(mapping = aes(x = carat, y = price), alpha = 1 / 100)