Pada titik ini, kita akan mulai pengaplikasian simultan dari visualisasi dan manipulasi data dalam bentuk proses analisa data berna Exploration Data Analysis, atau yang lebih sering disingkat EDA. EDA adalah sebuah proses repetitif yang berusaha mencari gambaran dan pemahaman lebih jauh soal data yg kita hadapi, proses ini melibatkan tiga proses utama :
Dalam proses formal, EDA juga merupakan bagian integral dari proses cleaning data yang kerap kali mengonsumsi waktu kerja seorang data scientist.
Memulai
Seperti yg telah kita pelajari sebelumnya, sebelum memulai proses manipulasi maupun visualisasi, kita perlu menginstal paket R yg dibuat khusus untuk menangani proses ini.
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.4 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.0.2 v forcats 0.5.1
## Warning: package 'tidyr' was built under R version 4.1.2
## Warning: package 'dplyr' was built under R version 4.1.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
Kita mulai dari sub proses pertama : Pertanyaan. Seperti yang bisa kita perkirakan, bagian ini sangat luas, dan tak semudah yg kita asumsikan. Membuat pertanyaan adalah langkah tricky namun krisis, di mana ketidaktepatan memilih pertanyaan akan berakibat fatal pada esensi dari analisa itu sendiri.
Untuk memberi sedikit ‘alur pikiran’, kita perlu memahami apa yg sebenarnya kita (maupun end-user) inginkan tiap kali menghadapi tumpukan data. Secara umum, semua orang yg melihat data, ingin bisa memahami makna dari barisan angka dan variabel yg tertulis di sana. Mereka ingin sebuah pemahaman yg akurat dan jelas tentang bagaimana segala sesuatu terjadi dan kenapa. Apa yang menyebabkan product A lebih laku dibanding product B? Kenapa para rotasi karyawan di perusahaan C begitu tinggi dibanding perusahaan sektor sejenis? Apa yang bisa dilakukan untuk meningkatkan efektifitas sebuah kampanye online? Semua pertanyaan itu, jika diperas dan ditelusuri akar-akarnya, kita akan menemukan bahwa pada dasarnya semua orang ingin memahami dua hal dari sebuah data :
Tentu saja pada kenyataannya, tidak semua projek data mencari dua pertanyaan tersebut, namun sebagian besar, mungkin hampir secara kesuluruhan, semua pertanyaan terkait data dapat dimulai dari 2 pertanyaan di atas.
Kembali lagi, lalu apa yg perlu kita cari berdasarkan dua pertanyaan di atas?
Singkatnya, untuk mencari pola pergerakan sebuah variabel, berarti mencari bagaimana sebarannya, yg berarti kita mencari varian sebuah variabel. Untuk mencari hubungan antar variabel, berarti kita mencari covariance antar variabel.
Menulis definisi singkat dari statistisk, Variabel adalah tendensi nilai sebuah variabel untuk berubah atau terdistribusi dari observasi ke observasi.
Visual distribusi kita ambil contoh dari dataset ‘diamonds’. Untuk memahami distribusi data, cara terbaik adalah dengan memvisualkannya. Satu hal yg perlu diingat, ada dua jenis data yg perlu diperhatikan, yaitu data continous dan data categorical. Saran mendasar adalah, untuk visual dist data categorical, gunakan chart bar; sedangkan untuk data continous, gunakan histogram.
diamond <- read_csv(file = "diamonds.csv")
## Rows: 53940 Columns: 10
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (3): cut, color, clarity
## dbl (7): carat, depth, table, price, x, y, z
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
diamonds %>% ggplot() + geom_bar(aes(x = cut))
Atau, bisa kita tampilkan numericalnya dengan cara berikut :
diamonds %>% count(cut)
## # A tibble: 5 x 2
## cut n
## <ord> <int>
## 1 Fair 1610
## 2 Good 4906
## 3 Very Good 12082
## 4 Premium 13791
## 5 Ideal 21551
Untuk data continous, sebagai berikut :
diamonds %>% ggplot() + geom_histogram(aes(x = carat), binwidth = 0.5)
Untuk melihat data numericnya :
diamonds %>% count(cut_width(carat, 0.5))
## # A tibble: 11 x 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
Note : ada fungsi baru di atas, jika kita ingin menunjukkan nilai interval seperti di atas, kita bisa menggunakan fungsi ‘cut_interval(var,interval value)’ seperti ‘cut_width’, dia membagi data berdasarkan nilai interval lebar tertentu (sebesar 0.5) pada variabel ‘carat’.
Ada bentuk visualisasi lain yg didasarkan pada manfaat histogram. Jika kita ingin menampilkan banyak histogram dalam satu plot, kita bisa menggunakan ‘freqpoly’.
diamonds %>% ggplot() + geom_freqpoly(aes(x = carat, color = cut),
binwidth = 0.1)
Dari beragam gambaran di atas, mungkin kita bisa menarik beberapa insight tentang data diamond. Diantaranya : * Kita tahu bahwa berlian yg dihasilkan didominasi oleh diamond class cut ideal. * Karat yg dominan adalah dalam rentang 0.25-0.75 * Cut paling jarak adalah yg kualitas ‘fair’ * karat di atas 2.75 sangat jarang * Semua kelas cut memiliki distribusi pola karat yg serupa.
Tidak menemukan apapun? kita bisa mengganti variabel yg bisa dilihat. contoh, kita tertarik dengan pola var harga dan carat
diamonds %>% group_by(cut) %>% summarise(mean = mean(price, na.rm = TRUE),
count = n())
## # A tibble: 5 x 3
## cut mean count
## <ord> <dbl> <int>
## 1 Fair 4359. 1610
## 2 Good 3929. 4906
## 3 Very Good 3982. 12082
## 4 Premium 4584. 13791
## 5 Ideal 3458. 21551
Di sini kita bisa melihat hal yang menarik. Mungkin di luar dugaan kita, kenapa berlian dengan kualitas cut ‘ideal’ memiliki harga rerata lebih murah 900 dollar daripada berlian dengan cut yg lebih rendah lainnya? Apakah karena hukum ekonomi di mana supply barang yg melimpah membuat harga lebih rendah? Masuk akal. Tapi tidak bisa disimpulkan begitu saja. Seperti yg bisa kita lihat pada ‘count’, rupanya meski berlian ‘premium’ yg diproduksi 12 kali lebih banyak daripada berlian ‘fair’, berlian premium masih memiliki harga lebih mahal seratus dollar secara rata2.
Hal-hal seperti ini yg bisa kita gali lebih dalam.
Outliers
Outliers adalah data yg perlu ditreatment secara khusus dalam setiap data. Keberadaannya bisa jadi tanda adanya potensi variabel lain yg lebih signifikan bagi model, atau mungkin juga sekedar kesalahan input data. Pada visual di atas, kita kesulitan atau bahkan tidak bisa melihat adanya outlier. Untuk memudahkan kita, bisa dilakukan cara berikut
diamonds %>% ggplot + geom_histogram(aes(x = y), binwidth = 0.5) +
coord_cartesian(ylim = c(0,50))
coord_cartesian() di atas berfungsi untuk mengatur sumbu. Dalam kasus ini, coord_cartesian() mengatur panjang maksimal sumbu y menjadi 50 (ylim = c(0,50)) di mana kita tahu persis itu hanya sepersekian dari banyaknya jumlah data ‘y’. Pengaturan ini, memungkinkan kita untuk melihat lebih dekat pada bagian historgram yg frekuensinya di bawah 50. Terbukti pembesaran ini menunjukkan adanya adanya tiga titik nilai yg berada jauh di luar pola histogram. Inilah indikasi outliner.
Kita tahu bahwa ada titik outlier pada variabel ‘y’ dengan nilai 0, sekitar 30, dan 60. Untuk melihat poin observasi mana yg menjadi outlier, kita manipulasi data dengan syarat yg sesuai.
unusual <- diamonds %>%
filter(y < 3 | y >20) %>% # Ini menyaring nilai y di bawah 3 dan di atas 20
select(price, x, y) %>% #Ini memilih var yg ingin ditampilkan
arrange(y) # Ini mengatur baris berdasarkan nilai y
unusual
## # A tibble: 9 x 3
## price x y
## <int> <dbl> <dbl>
## 1 5139 0 0
## 2 6381 0 0
## 3 12800 0 0
## 4 15686 0 0
## 5 18034 0 0
## 6 2130 0 0
## 7 2130 0 0
## 8 2075 5.15 31.8
## 9 12210 8.09 58.9
Inilah daftar obs yg menjadi outlier. Kita perlu menentukan apakah nilai ini memang alami dan berdampak khusus bagi data, atau sekedar salah input.
Exercise
jawab
# distribusi variabel 'x'
diamonds %>% ggplot() + geom_histogram(aes(x), binwidth = 0.5)
Bentuk numericnya :
diamonds %>% count(cut_width(x, 0.5))
## # A tibble: 16 x 2
## `cut_width(x, 0.5)` n
## <fct> <int>
## 1 [-0.25,0.25] 8
## 2 (3.25,3.75] 3
## 3 (3.75,4.25] 1834
## 4 (4.25,4.75] 12680
## 5 (4.75,5.25] 7502
## 6 (5.25,5.75] 6448
## 7 (5.75,6.25] 6031
## 8 (6.25,6.75] 9381
## 9 (6.75,7.25] 4193
## 10 (7.25,7.75] 3437
## 11 (7.75,8.25] 1620
## 12 (8.25,8.75] 699
## 13 (8.75,9.25] 79
## 14 (9.25,9.75] 18
## 15 (9.75,10.2] 6
## 16 (10.2,10.8] 1
Distribusi z
diamonds %>% ggplot() + geom_histogram(aes(z), binwidth = 0.25)
diamonds %>% count(cut_width(z, 0.25))
## # A tibble: 26 x 2
## `cut_width(z, 0.25)` n
## <fct> <int>
## 1 [-0.125,0.125] 20
## 2 (0.875,1.12] 1
## 3 (1.38,1.62] 2
## 4 (1.88,2.12] 1
## 5 (2.12,2.38] 49
## 6 (2.38,2.62] 1771
## 7 (2.62,2.88] 10712
## 8 (2.88,3.12] 5587
## 9 (3.12,3.38] 6567
## 10 (3.38,3.62] 5727
## # ... with 16 more rows
diamonds %>% filter(carat == 0.99) %>% group_by(carat) %>%
summarise(count = n())
## # A tibble: 1 x 2
## carat count
## <dbl> <int>
## 1 0.99 23
Missing Value
Kita membahas kembali pada outlier di atas, jika apa yang kita lakukan jika menemukan data seperti itu?
Jika kita ingin mengabaikannya dan meneruskan analisa, ada dua opsi yg bisa ditempuh :
*hapus atau drop seluruh baris dengan nilai outlier.
diamond2 <- diamonds %>% filter(between(y,3,20))
Meski begitu, cara ini tidak terlalu direkomendasikan karena bisa berakibat vatal pada analisa data.
*Ganti nilai outlier dengan missing value.
diamond3 <- diamonds %>% mutate(y = ifelse(y<3|y>20, NA, y))
Selain penggunaan ifelse(), kita juga bisa menggunakan case_when() jika perubahan melibatkan hubungan kompleks.
Covarian
Jika varian menjelaskan perilaku variabel itu sendiri, maka covarian menjelaskan perilaku variabel tersebut terhadap variabel lain. Covarian adalah tendensi nilai dua atau lebih variabel untuk bervariasi secara bersamaan. Dan sekali lagi, cara terbaik untuk melihatnya adalah dengan membuat visual hubungan dari para variabel tersebut. Bagaimana bentuk visualisasinya akan tergantung pada tipe dari masing-masing variabel.
Variabel kategorikal dan kontinuu
Kita pernah melakukan ini dengan membuat plot harga menggunakan freqpoly dan pembagian ‘color’ dengan ‘cut’.
diamonds %>% ggplot() + geom_freqpoly(aes(x = price, color = cut),
binwidth = 300)
Namun seperti yang bisa dilihat, chart ini tidak menunjukkan banyak hal. Karena pada dasarnya yang ditunjukkan adalah berapa kali sebuah value price muncul. Namun apabila kita coba ubah properti ‘stat’ default nya yg ‘count’ menjadi ‘density’, kita akan menemukan sesuatu yg menarik (kita sudah menduganya dari eksplorasi sebelumnya).
diamonds %>% ggplot() + geom_freqpoly(aes(x = price, y =..density..,
color = cut), binwidth = 500)
Dari visual di atas kita bisa melihat bahwa rupanya, berlian ‘fair’ memiliki rata-rata harga paling tinggi dibandingkan berlian lainnya. (seperti kesimpulan kita di bagian sebelumnya.)
Selain dengan freqpoly, cara lain untuk menampilkan distribusi variabel kontinu yg dipecah dalam variabel kategorik adalah dengan menggunakan boxplot.
Setiap boxplot terdiri dari ‘box’ yg memiliki lebar dari quantile 25 hingga quaantil 75 (IQR). Pada tengah ‘box’ terdapat garis yang menandai median atau quantil 50. Memiliki dua ‘ekor’ yang menunjukkan nilai max dan nilai min non outlier; untuk berada dalam batas non-outlier di sini, batas panjang ‘ekor’ adalah 1.5x dari nilai IQR . Jika ada titik-titik lain di luar garis ‘ekor’, itu adalah tanda outlier.
contoh boxplot :
diamonds %>% ggplot() + geom_boxplot(aes(x = cut, y = price))
Tentang reorder()
Jika kita perhatikan, var ‘cut’ telah memiliki nilai-nilai factorial yg runtut; di mana ‘fair’ sebagai kualitas terendah berada di urutan paling kiri, diikuti oleh ‘good’, dan seterusnya hingga ‘ideal’ berada di ujung paling kanan. Tidak semua data dan variabel memiliki struktur dan karakteristik terutut seperti itu. Jika kita ingin memiliki sebuah variabel factor yg runtut (ordinal), maka kita bisa mengaturnya di awal, atau menggunakan fungsi ‘reorder’
data("mpg")
mpg %>% ggplot() + geom_boxplot(aes(x = class, y = hwy))
Tidak berurutan, bukan? Jika, misal, kita ingin mengurutkan tamplian chart tersebut berdasarkan mediannya. Kita gunakan reorder()
mpg %>% ggplot() + geom_boxplot(aes(x = reorder(class,hwy,FUN = median),
y = hwy))
Membalikkan visual (coor_flip())
mpg %>% ggplot() + geom_boxplot(aes(x = reorder(class,hwy,FUN = median),
y = hwy)) +
coord_flip()
Jawab :
str(diamond)
## spec_tbl_df [53,940 x 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
## $ cut : chr [1:53940] "Ideal" "Premium" "Good" "Premium" ...
## $ color : chr [1:53940] "E" "E" "E" "I" ...
## $ clarity: chr [1:53940] "SI2" "SI1" "VS1" "VS2" ...
## $ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
## $ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
## $ price : num [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
## $ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
## $ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
## $ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
## - attr(*, "spec")=
## .. cols(
## .. carat = col_double(),
## .. cut = col_character(),
## .. color = col_character(),
## .. clarity = col_character(),
## .. depth = col_double(),
## .. table = col_double(),
## .. price = col_double(),
## .. x = col_double(),
## .. y = col_double(),
## .. z = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Pertama, mari kita coba ubah beberapa data yg chara, menjadi factor.
diamond$cut <- as.factor(diamond$cut)
diamond$clarity <- as.factor(diamond$clarity)
str(diamond)
## spec_tbl_df [53,940 x 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
## $ cut : Factor w/ 5 levels "Fair","Good",..: 3 4 2 4 2 5 5 5 1 5 ...
## $ color : chr [1:53940] "E" "E" "E" "I" ...
## $ clarity: Factor w/ 8 levels "I1","IF","SI1",..: 4 3 5 6 4 8 7 3 6 5 ...
## $ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
## $ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
## $ price : num [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
## $ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
## $ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
## $ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
## - attr(*, "spec")=
## .. cols(
## .. carat = col_double(),
## .. cut = col_character(),
## .. color = col_character(),
## .. clarity = col_character(),
## .. depth = col_double(),
## .. table = col_double(),
## .. price = col_double(),
## .. x = col_double(),
## .. y = col_double(),
## .. z = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Jika sudah, kita bisa pakai dua cara di sini. Yaitu langsung mengukur korelasinya dan kovariannya.
# carat vs price
diamond %>% ggplot() + geom_smooth(aes(x = carat, y = price))
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
# cut vs price
diamond %>% ggplot() + geom_boxplot(aes(x= reorder(cut,price, FUN = median), y=price))
diamond %>% ggplot() + geom_smooth(aes(x = depth, y = price))
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Kita bisa melakukannya satu demi satu, namun untuk sekarang, kita beralih pada analisa pembuktian korelasi dengan menggunakan angka.
caratTest <- cor.test(diamond$carat,diamond$price,method = "pearson", alternative = "greater", exact = FALSE)
###Depth vs Price
depthTest <- cor.test(diamond$depth,diamond$price, method = "pearson",
exact = FALSE)
###Table vs Price
TableTest <- cor.test(diamond$table, diamond$price, method = "pearson",
exact = FALSE)
xVarTest <- cor.test(diamond$x, diamond$price, method = "pearson",
exact = FALSE)
yVarTest <- cor.test(diamond$y, diamond$price, method = "pearson",
exact = FALSE)
zVarTest <- cor.test(diamond$z, diamond$price, method = "pearson",
exact = FALSE)
cov(diamond$z,diamond$price, method = "pearson")
## [1] 2424.713
Jika kita melakukan analisa kovarian dan korelasi antara variabel ‘cut’ dengan ‘price’, maka kita akan mendapat error seperti berikut :
cov(diamond$cut, diamond$price, method = "spearman")
cor.test(diamond$cut, diamond$price, method = "spearman")
Terlihat bahwa variabel ‘x’ (dalam kasus ini adalah ‘cut’) bukan variabel numeric. Hal ini mengisyaratkan kita untuk mentransformasi seluruh variabel factor terlebih dahulu menjadi var numeric.
diamond$cut <- as.numeric(diamond$cut)
coba cek kembali kondisi variabel ‘cut’ pada ‘diamond’.
summary(diamond$cut)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 3.000 3.553 4.000 5.000
Lihat bagaimana cut sudah berubah menjadi numeric. Sekarang, kita bisa mulai melakukan analisa korelasi dan kovarian.
cov(diamond$cut, diamond$price, method = "spearman")
## [1] 8819882
cutTest <- cor.test(diamond$cut, diamond$price, method = "spearman",
exact = FALSE)
Lanjut dengan variabel factor lainnya
diamond$color <- diamonds$color
diamond$color <- as.numeric(diamond$color)
diamond$clarity <- as.numeric(diamond$clarity)
###Color vs Price
cov(diamond$color, diamond$price, method = "spearman")
## [1] 35900339
colCorTest <- cor.test(diamond$color, diamond$price, method = "spearman",
exact = FALSE)
Untuk memudahkan perbandingan, kita bisa menyimpan hasil test cor dengan cara ini :
colCorTest$estimate
## rho
## 0.1501422
sa###Clarity vs Price
clarTest <- cor.test(diamond$clarity, diamond$price, method = "spearman",
exact = FALSE)
Coba kita susun :
estValDia <- c(caratTest$estimate,cutTest$estimate,clarTest$estimate, depthTest$estimate,TableTest$estimate, xVarTest$estimate,yVarTest$estimate, zVarTest$estimate,colCorTest$estimate)
pValDia <- c(caratTest$p.value, cutTest$p.value, clarTest$p.value,
depthTest$p.value, TableTest$p.value, xVarTest$p.value,
yVarTest$p.value, zVarTest$p.value, colCorTest$p.value)
VarNames <- names(select((diamond), -c(price)))
corTab <- data.frame(VarNames, estValDia, pValDia)
corTab
## VarNames estValDia pValDia
## 1 carat 0.92159130 0.000000e+00
## 2 cut 0.03818499 7.217444e-19
## 3 color -0.11620554 1.699512e-161
## 4 clarity -0.01064740 1.340325e-02
## 5 depth 0.12713390 3.761534e-193
## 6 table 0.88443516 0.000000e+00
## 7 x 0.86542090 0.000000e+00
## 8 y 0.86124944 0.000000e+00
## 9 z 0.15014215 2.027505e-269
Dari nilai estimasi korelasi dan p-value di atas, kita bisa mengetahui bahwa seluruh variabel memiliki signifikansi terhadap price, yang berarti seluruh variabel memang memiliki pengaruh terhadap varian ‘price’. Namun jika disebutkan mana yang terkuat adalah : carat, x, y, dan z.
Nah, di sini ada yg menarik. Jika kembali pada pertanyaan kenapa justru berian yg ‘fair’ memiliki harga termahal? mungkin jawabannya terletak pada keempat variabel ini.
Secara intuitif, saya penasaran dengan hubungan antara ‘carat’ dan ‘cut’. Bagaimana sebenarnya sebaran ‘carat’ berdasarkan ‘cut’ nya?
Carat vs Cut
diamond %>% ggplot() + geom_boxplot(aes(x = reorder(cut, carat, FUN = median),
y = carat,group = cut))
diamonds %>% ggplot() + geom_histogram(aes(x = carat,y = ..density..,
fill = cut), binwidth = 0.3)
diamonds %>% group_by(cut) %>% summarise(Median = median(carat))
## # A tibble: 5 x 2
## cut Median
## <ord> <dbl>
## 1 Fair 1
## 2 Good 0.82
## 3 Very Good 0.71
## 4 Premium 0.86
## 5 Ideal 0.54
Akhirnya terlihat bahwa berlian ‘fair’ memiliki proporse sebaran nilai carat tinggi yg lebih banyak, dan tervalidasi dengan nilai median carat tertinggi berada di berlian ‘fair’.
Pertanyaannya : apakah variabel lainnya (x,y,dan z) juga memiliki sebaran yg sama dengan carat?
x dan cut
diamonds %>% ggplot() + geom_boxplot(aes(x = cut, y = x))
diamonds %>% ggplot() + geom_freqpoly(aes(x = x, y = ..density..,
color = cut))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
diamonds %>% group_by(cut) %>%summarise(median = median(x))
## # A tibble: 5 x 2
## cut median
## <ord> <dbl>
## 1 Fair 6.18
## 2 Good 5.98
## 3 Very Good 5.74
## 4 Premium 6.11
## 5 Ideal 5.25
Dan… terlihat kembali bahwa dalam variabel ‘x’, sebaran dan mediannya juga berada di berlian ‘fair’
Kita bisa melanjutkannya dengan y dan z… Tapi akan menghabiskan banyak tempat, jadi kita sudahi dulu sampai di sini.
##Hubungan dua variabel kategorikal
Sebelumnya kita sudah membahas garis besar untuk menganalisa korelasi antara var kategorikal dan kontinu. Sekarang kita beralih pada analisa korelasi dua var kateogrik. Secara garis besar, metode cor.test tidak banyak berubah, kita bisa menggunakan cor.test() dengan method “spearman” atau “karnell”.
Yg sedikit menarik di sini, adalah bagaimana kita memvisualisasikannya. Untuk keperluan tersebut, kita menghitung jumlah observasi di tiap kombinasi. Maksudnya, berapa observasi yang berada dalam kategori “A” sekaligus “B”, dan sebagainya.
Salah satu cara untuk melakukan ini adalah dengan menggunakan ‘geom_count’
diamonds %>% ggplot() + geom_count(aes(x=cut, y = color))
Susah lihatnya? kita bisa menampilkan nilainya daripada visual yg membingungkan.
diamonds %>% count(color, cut)
## # A tibble: 35 x 3
## color cut n
## <ord> <ord> <int>
## 1 D Fair 163
## 2 D Good 662
## 3 D Very Good 1513
## 4 D Premium 1603
## 5 D Ideal 2834
## 6 E Fair 224
## 7 E Good 933
## 8 E Very Good 2400
## 9 E Premium 2337
## 10 E Ideal 3903
## # ... with 25 more rows
Nilai di atas kemudian kita bisa kombinasikan dengan geom_tile yg lebih cantik dan (mudah2an) lebih jelas.
diamonds %>% count(color, cut) %>% ggplot() + geom_tile(aes(x = color,
y = cut,
fill = n))