Tiga Cara Visualisasi Data di R
Ada banyak cara untuk membuat visualisasi data. Setidaknya ada tiga cara yang biasa dilakukan oleh orang-orang, yakni:
- Grafik,
- Tabel, dan
- Flowchart.
Sebenarnya, cara apapun bisa kita pilih selama tujuan dan pesan yang disampaikan bisa diterima dengan baik oleh audiences.
Saya akan menunjukkan cara membuat ketiga visualisasi tersebut dari data yang sama dengan pesan yang sama pula. Nanti kita akan coba bandingkan, mana yang lebih mudah dimengerti oleh audience.
Data yang saya gunakan adalah data survey sintetis yang pernah saya tulis di artikel ini. Berikut adalah sampel datanya:
id | lokasi | gender | usia | ses | tom | aided | trial | repe | last | futur |
---|---|---|---|---|---|---|---|---|---|---|
1 | f | pria | 21 - 25 th | upper | ya | ya | ya | tidak | ya | ya |
2 | b | pria | 21 - 25 th | middle | tidak | ya | ya | ya | ya | ya |
3 | f | wanita | 21 - 25 th | upper | ya | ya | ya | ya | tidak | tidak |
4 | c | wanita | < 15 th | upper | ya | ya | ya | ya | ya | tidak |
5 | e | pria | 16 - 20 th | upper | ya | ya | ya | tidak | ya | tidak |
6 | f | wanita | 21 - 25 th | middle | ya | ya | tidak | tidak | tidak | tidak |
7 | b | wanita | 21 - 25 th | middle | tidak | ya | tidak | tidak | tidak | tidak |
8 | e | wanita | 26 - 30 th | middle | ya | ya | tidak | tidak | tidak | tidak |
9 | f | pria | 21 - 25 th | middle | tidak | ya | tidak | tidak | tidak | tidak |
10 | e | wanita | < 15 th | upper | ya | ya | ya | tidak | ya | tidak |
Saya akan menyampaikan pesan:
Berapa banyak responden dengan SES Upper yang trial produk? Coba cross per jenis kelamin!
Tabel
Ada banyak cara membuat tabel tabulasi di R dari data tersebut. Kita
bisa menggunakan library(dplyr)
, library(expss)
, atau
library(janitor)
tergantung dengan preferensi masing-masing. Saya akan
tunjukkan caranya:
dplyr
df_survey %>%
group_by(ses,gender,trial) %>%
tally() %>%
ungroup() %>%
filter(ses == "upper") %>%
knitr::kable()
ses | gender | trial | n |
---|---|---|---|
upper | pria | tidak | 41 |
upper | pria | ya | 209 |
upper | wanita | tidak | 45 |
upper | wanita | ya | 203 |
expss
df_survey %>%
tab_cells(trial) %>%
tab_rows(ses) %>%
tab_cols(gender) %>%
tab_stat_cases() %>%
tab_pivot() %>%
tab_caption("Berapa banyak responden dengan SES Upper yang trial produk? Cross dengan jenis kelamin")
Berapa banyak responden dengan SES Upper yang trial produk? Cross dengan jenis kelamin | |||||
---|---|---|---|---|---|
gender | |||||
pria | wanita | ||||
ses | |||||
middle | trial | tidak | 124 | 139 | |
ya | 124 | 115 | |||
#Total cases | 248 | 254 | |||
upper | trial | tidak | 41 | 45 | |
ya | 209 | 203 | |||
#Total cases | 250 | 248 |
janitor
df_survey %>%
tabyl(trial,ses,gender) %>%
adorn_title(placement = "top")
$pria
ses
trial middle upper
tidak 124 41
ya 124 209
$wanita
ses
trial middle upper
tidak 139 45
ya 115 203
Grafik
Membuat grafik di R bisa kita lakukan dengan menggunakan
library(ggplot2)
. Sebagai input-nya, kita perlu membuat tabulasi
terlebih dahulu seperti cara di atas. Sekarang saya buat visualisasinya.
Berikut adalah visualisasi jika saya menggunakan cara 100% stacked columns.
df_survey %>%
group_by(ses,gender,trial) %>%
tally() %>%
ungroup() %>%
filter(ses == "upper") %>%
ggplot(aes(x = gender,y = n,fill = trial)) +
geom_col(color = "black",position = "fill") +
geom_label(aes(label = paste0(trial,": n = ",n)),
position = position_fill(vjust = 0.5),
color = "white") +
scale_fill_manual(values = c("darkred","darkblue")) +
theme_minimal() +
labs(title = "Berapa banyak responden dengan SES Upper yang trial produk?",
subtitle = "Cross dengan jenis kelamin") +
theme(legend.position = "none",
axis.title = element_blank(),
axis.text.y = element_blank())
Sedangkan berikut adalah jika saya mengikuti style crosstab yang pernah saya tulis di artikel ini:
df_survey %>%
group_by(ses,gender,trial) %>%
tally() %>%
ungroup() %>%
filter(ses == "upper") %>%
mutate(n = ifelse(trial == "ya",n,-n)) %>%
ggplot(aes(x = gender,y = n,fill = trial)) +
geom_col(color = "black") +
coord_flip() +
geom_label(aes(label = paste0(trial,": n = ",abs(n))),
color = "white") +
scale_fill_manual(values = c("darkred","darkblue")) +
ylim(-60,220) +
theme_minimal() +
labs(title = "Berapa banyak responden dengan SES Upper yang trial produk?",
subtitle = "Cross dengan jenis kelamin",
y = "n responden") +
theme(legend.position = "none",
axis.text.x = element_blank())
Selain itu, kita juga bisa membuat sankey diagram yang tentunya pembuatannya lebih rumit dibandingkan kedua grafik di atas.
library(ggsankey)
df =
df_survey %>%
mutate(trial = ifelse(ses != "upper","exclude",trial)) %>%
mutate(gender = ifelse(trial != "ya","exclude",gender)) %>%
make_long(ses,trial,gender)
dagg =
df %>%
dplyr::group_by(node) %>%
tally()
df2 = merge(df, dagg, by.x = 'node', by.y = 'node', all.x = TRUE)
pl = ggplot(df2,
aes(x = x,next_x = next_x,node = node,next_node = next_node,
fill = factor(node),label = paste0(node," n=", n))) +
geom_sankey(flow.alpha = 0.5,
color = "gray40",
show.legend = TRUE) +
geom_sankey_label(size = 3,
color = "white",
fill= "gray40",
hjust = -0.2) +
theme_bw() +
theme(legend.position = "none",
axis.title = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank()) +
scale_fill_viridis_d(option = "inferno") +
labs(title = "Berapa banyak responden dengan SES Upper yang trial produk?",subtitle = "Cross dengan jenis kelamin",fill = 'Nodes')
pl
Flowchart
Satu bentuk visualisasi lain di R yang baru saya pelajari beberapa
hari ini adalah flowchart. Berikut ini saya akan tunjukkan cara
membuat flowchart menggunakan library(flowchart)
:
flow = df_survey %>% as_fc(label = "Data Hasil Survey")
flow %>%
fc_filter(ses == "upper",
label = "SES Upper Only",
show_exc = TRUE) %>%
fc_split(trial) %>%
fc_split(gender) %>%
fc_draw()
Diskusi
Bagaimana menurut kalian? Visualisasi mana yang paling mudah dalam menyampaikan pesan yang diinginkan?
if you find this article helpful, support this blog by clicking the ads.