0.1 Pendahuluan

Visualisasi data terbagi menjadi dua yaitu grafik statis dan grafik interaktif, grafik interaktif memungkinkan pengguna untuk melihat detail dari tiap titik atau garis pada grafik, memperbesar atau memperkecil range pada grafik dan memilih bagian yang ingin disoroti. Dalam portofolio kali ini akan dibahas bagaimana membuat grafik interkatif menggunakan beberapa packages dalam R. Packages yang akan digunakan yaitu plotly, rbokeh, trelliscope, dan leaflet.

0.2 Visualisasi Interaktif menggunakan packages plotly

Packages pertama yang akan digunakan yaitu plotly. dataset yang digunakan kali ini adalah vgsales yang merupakan data penjualan berbagai macam video game dengan 16450 observasi dan 16 variabel. Berikut merupakan summary dari dataset tersebut:

#Summary
glimpse(vgsales)
## Rows: 16,450
## Columns: 16
## $ Name         <fct> Wii Sports, Super Mario Bros., Mario Kart Wii, Wii Spo...
## $ Platform     <fct> Wii, NES, Wii, Wii, GB, GB, DS, Wii, Wii, NES, DS, DS,...
## $ Year         <int> 2006, 1985, 2008, 2009, 1996, 1989, 2006, 2006, 2009, ...
## $ Genre        <fct> Sports, Platform, Racing, Sports, Role-Playing, Puzzle...
## $ Publisher    <fct> Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nint...
## $ NA_Sales     <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.28, 13.96...
## $ EU_Sales     <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9.18, 6.9...
## $ JP_Sales     <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.93, 4.70,...
## $ Other_Sales  <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84, 2.24, ...
## $ Global_Sales <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.80, 28.92...
## $ Critic_Score <int> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91, NA, 80...
## $ Critic_Count <int> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64, NA, 63...
## $ User_Score   <fct> 8, NA, 8.3, 8, NA, NA, 8.5, 6.6, 8.4, NA, NA, 8.6, NA,...
## $ User_Count   <int> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, NA, 464,...
## $ Developer    <fct> Nintendo, NA, Nintendo, Nintendo, NA, NA, Nintendo, Ni...
## $ Rating       <fct> E, NA, E, E, NA, NA, E, E, E, NA, NA, E, NA, E, E, E, ...

0.2.1 Mengubah plot statis menjadi interaktif

Untuk membuat grafik interaktif kita dapat menggunakan grafik statis yang sudah kita buat menggunakan packages ggplot2, dengan menggunakan fungsi ggplotly(). tetapi kelemahan dari fungsi ini adalah tidak semua objek dari ggplo2 bisa dikonversi ke dalam grafik interaktif

# menyimpan grafik ggplot2 sebagai objek scatter
scatter <- vgsales %>%
            filter(Year == 2016) %>%
            ggplot(aes(x = NA_Sales, y = Critic_Score)) +
            geom_point(alpha = 0.3)

# grafik statis 
scatter

# grafik interaktif (dikonversi menggunakan fungsi ggplotly)
ggplotly(scatter)

0.2.2 Membuat grafik univariat menggunakan plotly

Sebelumnya kita mengubah grafik statis menjadi interkatif, kali ini kita akan langsung membuat histogram dan barplot menggunakan fungsi plot_ly. Untuk histogram kita akan mengvisualisasikan dari varibel Critic_Score. Sedangkan untuk barplot akan ditampilkan jumlah Genre dari video game.

# membuat histogram interaktif dengan fungsi plot_ly
vgsales %>%
  plot_ly(x = ~Critic_Score) %>%
  add_histogram(xbins = list(start = 0, end = 100, size = 10),
                color = I("#111e6c"))
# menghitung tabel frekuensi berdasarkan genre
genre_table <- vgsales %>%
    count(Genre)

# membuat barplot interaktif dengan fungsi plot_ly
genre_table %>%
    mutate(Genre = fct_reorder(Genre, n, .desc = TRUE)) %>%
    plot_ly(x = ~Genre, y = ~n, color = I("darkgreen")) %>% 
    add_bars() 

0.2.3 Membuat grafik bivariat menggunakan plotly

Grafik bivariat yang akan kita buat kali ini adalah Scatterplot, Stacked Bar Chart, dan Boxplot.

# memilih data di tahun 2016
vg2016 <- vgsales %>%
    filter(Year == 2016)

# Scatter plot 
vg2016 %>% 
  plot_ly(x = ~Critic_Score, y = ~User_Score, color = ~Genre, 
          hoverinfo = "text",
          text = ~paste("Critic Score: ", Critic_Score, "<br>",
                     "User_Score: ", User_Score, "<br>",
                     "Name: ", Name)) %>%
  add_markers(marker = list(size = 8, symbol = "diamond")) 
# Stacked Bar Chart
vg2016 %>%
    count(Genre, Rating) %>%
    plot_ly(x = ~Genre, y = ~n, color = ~Rating) %>%
    add_bars() %>%
    layout(barmode = "stack")
# Boxplot
vg2016 %>% 
  plot_ly(x = ~Global_Sales, y = ~Genre) %>%
  add_boxplot()

0.2.4 Menbuat grafik lebih dari 1 layer

Pada contoh-contoh sebelumnya grafik yang ditampilkan hanya memuat satu layer saja, pada contoh kali ini didalam satu grafik akan terdapat beberapa layer, contoh yang pertama adalah gabungan dari scatterplot (add_markers()) dan garis linear (add_line()). Untuk contoh kedua akan dibuat beberapa grafik dari density plot yang dibedakan berdasarkan variabel Developer dari beberapa video games.

# membuat model linear menggunakan fungsi lm
m <- lm(User_Score ~ Critic_Score, data = vg2016)

# Contoh 1, scatterplot dan garis linear
vg2016 %>%
   select(User_Score, Critic_Score) %>%
   na.omit() %>%
   plot_ly(x = ~Critic_Score, y = ~User_Score) %>%
   add_markers(showlegend = FALSE) %>%
   add_lines(y = ~fitted(m))
# membuat dataset berdasarkan developer
activision <- vgsales %>% filter(Publisher == "Activision")
ea <- vgsales %>% filter(Publisher == "Electronic Arts")
nintendo <- vgsales %>% filter(Publisher == "Nintendo")

# Hitung kurva kepadatan  
d.a <- density(activision$Critic_Score, na.rm = TRUE)
d.e <- density(ea$Critic_Score, na.rm = TRUE)
d.n <- density(nintendo$Critic_Score, na.rm = TRUE)

# Contoh 2, kurva kepadatan
plot_ly() %>%
  add_lines(x = ~d.a$x, y = ~d.a$y, name = "Activision", fill = 'tozeroy') %>%
  add_lines(x = ~d.e$x, y = ~d.e$y, name = "Electronic Arts", fill = 'tozeroy') %>%
  add_lines(x = ~d.n$x, y = ~d.n$y, name = "Nintendo", fill = 'tozeroy') %>%
  layout(xaxis = list(title = 'Critic Score'),
         yaxis = list(title = 'Density'))

0.2.5 Membagi grafik menjadi beberapa sector

Membagi grafik menjadi beberapa sector dibutuhkan ketika ingin membandingkan satu kategori dengan kategori lain, misalnya kita ingin melihat perbandingan Critic_Score terhadap User_Score dengan platform yang berbeda yaitu PS4 dan XOne. Membagi grafik menjadi beberapa sector dapat dilakukan manual yaitu dengan bantuan subplot() ataupun automatis dengan fungsi do().

# Scaterplot dari Critic score terhadap User score dengan platform PS4
p1 <- vg2016 %>%
   filter(Platform == "PS4") %>%
   plot_ly(x = ~Critic_Score, y = ~User_Score) %>% 
   add_markers(name = "PS4")

# Scaterplot dari Critic score terhadap User score dengan platform XOne
p2 <- vg2016 %>%
   filter(Platform == "XOne") %>%
   plot_ly(x = ~Critic_Score, y = ~User_Score) %>% 
   add_markers(name = "XOne")

# menggabungkan 2 plot (Manual)
subplot(p1, p2, nrows = 2) %>%
  layout(
     xaxis = list(title = ""), 
     xaxis2 = list(title = "Critic Score"),
     yaxis = list(title = "User Score"), 
     yaxis2 = list(title = "User Score")
  )
# menggabungkan beberapa plot (Automatis)
vg2016 %>%
  group_by(Platform) %>%
  do(
    plot = plot_ly(data = ., x = ~Critic_Score, y = ~User_Score) %>%
      add_markers(name = ~Platform)
  ) %>%
  subplot(nrows = 3, shareY = TRUE, shareX = TRUE)
# Matrix Scatterplot  
vg2016 %>%
  mutate(nintendo = ifelse(Publisher == "Nintendo", "Nintendo", "Other")) %>%
  plot_ly(color = ~nintendo) %>% 
  add_trace(
    type = "splom",                                  
    dimensions = list(
      list(label = "N. America", values = ~NA_Sales), 
      list(label = "Europe", values = ~EU_Sales),     
      list(label = "Japan", values = ~JP_Sales)       
    )
  )

0.2.6 Membuat Map Chroropleth

Pada bagian ini akan digunakan dataset turnout yaitu jumlah peralihan suara pemilihan pada tahun 2018 dan 2014 pada beberapa negara bagian di Amerika Serikat. Untuk membuat choropleth map kita akan menggunakan fungsi plot_geo() dan add_trace().

# Membuat peta choropleth dari perubahan partisipasi pemilih dari 2014 hingga 2018
turnout %>%
  mutate(change = turnout2018 - turnout2014) %>%
  plot_geo(locationmode = 'USA-states') %>%
  add_trace(z = ~change, locations = ~state.abbr) %>%
  layout(geo = list(scope = "usa"))
# peta choropleth yang menampilkan hasil Senat
senate_winners %>%
  plot_geo(locationmode = "USA-states") %>%
  add_trace(z = ~as.numeric(party), locations = ~state,
    colors = c("dodgerblue", "mediumseagreen", "tomato"),
    hoverinfo = "text",
    text = ~paste("Candidate:", name, "<br>",
                  "Party:", party, "<br>",
                  "% vote:", round(pct.vote, 1))
  ) %>%
  layout(geo = list(scope = 'usa')) %>% 
  hide_colorbar()