10 minute read

Ada banyak cara untuk membuat visualisasi data. Setidaknya ada tiga cara yang biasa dilakukan oleh orang-orang, yakni:

  1. Grafik,
  2. Tabel, dan
  3. 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.