Introduction

Pasti dari pembaca pernah melakukan liburan baik itu dalam kota maupun luar kota. Sebelum melakukan perjalanan, biasanya seseorang akan membuat sebuah rencana terlebih dahulu mengenai lokasi yang akan dikunjungi. Terkadang dalam pemilihan lokasi akan memakan waktu yang tidak sedikit karena referensi tentang lokasi wisata yang tidak terlalu banyak. Oleh karena itu, tujuan dari LBB ini untuk memberikan rekomendasi tempat wisata bagi para wisatawan yang akan berkunjungke tempat wisata khususnya di pulau Jawa.

Data diambil dari website kaggle dengan isi data tahun 2015. Dataset ini merupakan dataset yang memuat beberapa tempat wisata di 5 kota besar di Indonesia yaitu Jakarta, Yogyakarta, Semarang, Bandung, dan Surabaya.

Data Preparation

Import Library

Sebelum melakukan analisis lebih lanjut, terlebih dahulu akan diimport library yang akan digunakan.

library(dplyr) # melakukan EDA
library(ggplot2) # membuat plot statis 
library(ggpubr) # export plot statis
library(scales) # mengatur skala plot
library(glue) # setting teks pada tooltip
library(plotly) # membuat plot interaktif
library(leaflet) # membuat map
library(stringr) # mengubah skala

Import Data

Setelah library sudah dipanggil selanjutnya memanggil dataset yang akan digunakan. Kali ini, terdapat 3 dataset yang akan dipanggil dan disimpan dalam variabel nama berbeda-beda.

tourism_rating <- read.csv("tourism_rating.csv")
tourism_with_id <- read.csv("tourism_with_id.csv")
user <- read.csv("user.csv")

Inspeksi Dataset

Untuk melihat bentuk data set yang sudah dipanggil bisa menggunakan perintah head.

head(tourism_rating)
head(tourism_with_id)
head(user)

Selanjutnya akan dilakukan pengecekan data dari tiap-tiap dataset apakah tipe data yang digunakan sudah benar atau belum. Dengan menggunakan perintah glimpse yang ada di library dplyr akan ditampilkan ringkasan dari dataset seperti berikut:

glimpse(tourism_rating)
#> Rows: 10,000
#> Columns: 3
#> $ User_Id       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
#> $ Place_Id      <int> 179, 344, 5, 373, 101, 312, 258, 20, 154, 393, 103, 208,…
#> $ Place_Ratings <int> 3, 2, 5, 3, 4, 2, 5, 4, 2, 5, 3, 5, 3, 5, 5, 4, 4, 3, 3,…
glimpse(tourism_with_id)
#> Rows: 437
#> Columns: 13
#> $ Place_Id     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
#> $ Place_Name   <chr> "Monumen Nasional", "Kota Tua", "Dunia Fantasi", "Taman M…
#> $ Description  <chr> "Monumen Nasional atau yang populer disingkat dengan Mona…
#> $ Category     <chr> "Budaya", "Budaya", "Taman Hiburan", "Taman Hiburan", "Ta…
#> $ City         <chr> "Jakarta", "Jakarta", "Jakarta", "Jakarta", "Jakarta", "J…
#> $ Price        <int> 20000, 0, 270000, 10000, 94000, 25000, 4000, 180000, 1750…
#> $ Rating       <dbl> 4.6, 4.6, 4.6, 4.5, 4.5, 4.5, 4.5, 4.0, 4.4, 4.5, 4.6, 4.…
#> $ Time_Minutes <int> 15, 90, 360, NA, 60, 10, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ Coordinate   <chr> "{'lat': -6.1753924, 'lng': 106.8271528}", "{'lat': -6.13…
#> $ Lat          <dbl> -6.175392, -6.137645, -6.125312, -6.302446, -6.124190, -6…
#> $ Long         <dbl> 106.8272, 106.8171, 106.8335, 106.8952, 106.8391, 106.858…
#> $ X            <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ X.1          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17…
glimpse(user)
#> Rows: 300
#> Columns: 3
#> $ User_Id  <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…
#> $ Location <chr> "Semarang, Jawa Tengah", "Bekasi, Jawa Barat", "Cirebon, Jawa…
#> $ Age      <int> 20, 21, 23, 21, 20, 18, 39, 40, 38, 39, 20, 37, 18, 26, 34, 4…

Tempak beberapa kolom yang harus diubah tipe datanya seperti Place_Name, Category, City, Metode, Location, Lat, dan Long.

Deskripsi

Adapun deskripsi dari dataset yang digunakan yaitu:

  • User_Id : Id dari wisatawan.
  • Place_Id : Id dari tempat wisata.
  • Place_Rating : Nilai dari wisatawan.
  • Place_Name : Nama Tempat Wisata.
  • Description : Penjelasan mengenai tempat wisata.
  • Category : Kategori tempat wisata yang terdiri dari “Budaya”, “Taman Hiburan”, “Cagar Alam”, “Bahari”, Pusat Perbelanjaan”, “Tempat Ibadah”.
  • City : Kota yang terdiri dari “Jakarta”, “Bandung”, “Semarang”, “Yogyakarta”, “Surabaya”.
  • Price : Harga Tiket Masuk
  • Rating : Nilai berdasarkan tempat.
  • Time_Minutes : Rata-rata waktu yang dihabiskan di tempat wisata
  • Coordinate : lokasi latitude dan langitude tempat wisata
  • Lat : Latitude lokasi
  • Long : Longitude lokasi
  • Location : Asal wisatawan
  • Age : Umur wisatawan

Data Processing

Dari inspeksi dan deskripsi dataset, kita akan melakukan penggabungan beberapa dataset dan membuang kolom-kolom yang tidak diperlukan dalam analisis ke depannya. Serta melakuakan perubahan tipe data agar hasil analisis lebih akurat.

Untuk langkah awalnya, akan dilakukan penggabungan dari 3 dataset mengguakan perintah merge.

Merge

Akan dilakukan penggabungan dari ketiga dateset yang digunakan menjadi satu dataset. Langkah pertama, menggabungkan dataset tourism_rating dan user dengan User_Id sebagai primary key

data <- merge(x = tourism_rating, y = user,by = "User_Id")
data

Kemudian merge lagi dengan dataset tourism_with_id. Sehingga hasilnya sebagai berikut:

data <- merge(x = tourism_with_id,y = data, by.x = "Place_Id")
data

Setelah datasetnya sudah siap, akan dilakukan pengecekan kembali tipe datanya dengan menggunakan glimpse

glimpse(data)
#> Rows: 10,000
#> Columns: 17
#> $ Place_Id      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,…
#> $ Place_Name    <chr> "Monumen Nasional", "Monumen Nasional", "Monumen Nasiona…
#> $ Description   <chr> "Monumen Nasional atau yang populer disingkat dengan Mon…
#> $ Category      <chr> "Budaya", "Budaya", "Budaya", "Budaya", "Budaya", "Buday…
#> $ City          <chr> "Jakarta", "Jakarta", "Jakarta", "Jakarta", "Jakarta", "…
#> $ Price         <int> 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, …
#> $ Rating        <dbl> 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4.6, 4…
#> $ Time_Minutes  <int> 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, …
#> $ Coordinate    <chr> "{'lat': -6.1753924, 'lng': 106.8271528}", "{'lat': -6.1…
#> $ Lat           <dbl> -6.175392, -6.175392, -6.175392, -6.175392, -6.175392, -…
#> $ Long          <dbl> 106.8272, 106.8272, 106.8272, 106.8272, 106.8272, 106.82…
#> $ X             <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ X.1           <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,…
#> $ User_Id       <int> 64, 189, 187, 100, 235, 162, 254, 74, 86, 159, 169, 105,…
#> $ Place_Ratings <int> 2, 5, 4, 1, 4, 5, 5, 2, 4, 1, 5, 5, 4, 5, 4, 5, 4, 2, 5,…
#> $ Location      <chr> "Bandung, Jawa Barat", "Cirebon, Jawa Barat", "Yogyakart…
#> $ Age           <int> 38, 21, 25, 28, 18, 25, 34, 30, 32, 20, 18, 37, 30, 19, …

Karena dalam analisis berikutnya akan dilakukan pengelompokan tempat wisata yang gratis dan berbayar maka langkah berikutnya adalah mendefenisikan fungsi baru yang akan digunakan untuk membagi kolom menjadi beberapa kategori.

# Function
metode_bayar <- function(y){ 
  if(y == 0)
  {
    y <- "Gratis" # Metode gratis
  }
  else
  {
    y <- "Berbayar" # Metode berbayar
  }  
}

Cleansing Data

Dalam merapikan dataset kali ini, kita akan membuang sekaligus mengganti beberapa tipe data kolom, dan menambahkan beberapa kolom yang dibutuhkan dalam analisis. Untuk melakukan itu semua sekaligus, kita bisa menggunakan %>% atau pipes untuk menyambungkan beberapah perintah dalam satu penulisan code.

data1 <- data %>% 
  #Drop kolom  
  select(-c(X,X.1,Coordinate,Time_Minutes)) %>% 
  mutate(
    # menambahkan kolom baru
    avg = (Rating + Place_Ratings)/2,
    Metode = sapply(X = Price, FUN = metode_bayar)) %>% 
    # ganti tipe data
    mutate_at(c("Lat","Long"), as.double) %>% 
    mutate_at(c("Place_Name","Category","City","Metode","Location"), as.factor) 
data1

Setelah melakukan pengecekan ternyata ditemukan dua baris yang memiliki koordinat yang salah, sehingga akan dilakukan perbaikan isi di baris tersebut.

# Memperbaiki data
data1$Lat <- str_replace(data1$Lat, "1.07888", "-6.1204747")
data1$Long <- str_replace(data1$Long, "103.931398", "106.8297537")

Missing Values

Pertama-tama, akan dilakukan pengecekan missing values pada dataset dengan menggunakan perintah is.na() dan disambung dengan colSums()

data1 %>% 
  is.na() %>% 
  colSums()
#>      Place_Id    Place_Name   Description      Category          City 
#>             0             0             0             0             0 
#>         Price        Rating           Lat          Long       User_Id 
#>             0             0             0             0             0 
#> Place_Ratings      Location           Age           avg        Metode 
#>             0             0             0             0             0

Ternyata hasilnya tidak ada data yang kosong.

Duplicates

Selanjutnya dilakuakan pengecekan duplicates pada dataset.

sum(duplicated(data1))
#> [1] 79

Hasilnya ternyata ada 79 baris yang duplikat. Maka baris tersebut bisa dihilangkan dengan perintah distinct.

data1 <- data1 %>% distinct()

Sekarang dataset sudah bersih. Kita akan melakukan pengecekan kembali apakah data duplikat sudah tidak ada.

sum(duplicated(data1))
#> [1] 0

Hasilnya sekarang sudah benar-benar bersih.

Exploratory Data Analysis

Pada tahap ini, akan dilakukan EDA pada dataset data1 yang telah melalui tahap data processing. Secara singkat, beberapa informasi dari data bisa didapatkan dengan menggunakan perintah summary.

Cek Persebaran data:

summary(data1)
#>     Place_Id                                         Place_Name  
#>  Min.   :  1.0   Gunung Lalakon                           :  39  
#>  1st Qu.:109.0   Gereja Perawan Maria Tak Berdosa Surabaya:  37  
#>  Median :220.0   Pantai Parangtritis                      :  37  
#>  Mean   :219.5   Taman Sungai Mudal                       :  36  
#>  3rd Qu.:329.0   Pantai Kesirat                           :  34  
#>  Max.   :437.0   Geoforest Watu Payung Turunan            :  33  
#>                  (Other)                                  :9705  
#>  Description                      Category            City     
#>  Length:9921        Bahari            :1072   Bandung   :2822  
#>  Class :character   Budaya            :2665   Jakarta   :1902  
#>  Mode  :character   Cagar Alam        :2397   Semarang  :1311  
#>                     Pusat Perbelanjaan: 381   Surabaya  :1038  
#>                     Taman Hiburan     :3024   Yogyakarta:2848  
#>                     Tempat Ibadah     : 382                    
#>                                                                
#>      Price            Rating          Lat                Long          
#>  Min.   :     0   Min.   :3.400   Length:9921        Length:9921       
#>  1st Qu.:     0   1st Qu.:4.400   Class :character   Class :character  
#>  Median :  5000   Median :4.500   Mode  :character   Mode  :character  
#>  Mean   : 23774   Mean   :4.446                                        
#>  3rd Qu.: 20000   3rd Qu.:4.600                                        
#>  Max.   :900000   Max.   :5.000                                        
#>                                                                        
#>     User_Id      Place_Ratings                        Location   
#>  Min.   :  1.0   Min.   :1.000   Bekasi, Jawa Barat       :1247  
#>  1st Qu.: 77.0   1st Qu.:2.000   Semarang, Jawa Tengah    : 766  
#>  Median :151.0   Median :3.000   Yogyakarta, DIY          : 696  
#>  Mean   :151.3   Mean   :3.067   Lampung, Sumatera Selatan: 658  
#>  3rd Qu.:226.0   3rd Qu.:4.000   Bogor, Jawa Barat        : 582  
#>  Max.   :300.0   Max.   :5.000   Cirebon, Jawa Barat      : 476  
#>                                  (Other)                  :5496  
#>       Age             avg             Metode    
#>  Min.   :18.00   Min.   :2.200   Berbayar:6759  
#>  1st Qu.:24.00   1st Qu.:3.200   Gratis  :3162  
#>  Median :29.00   Median :3.750                  
#>  Mean   :28.73   Mean   :3.756                  
#>  3rd Qu.:34.00   3rd Qu.:4.300                  
#>  Max.   :40.00   Max.   :5.000                  
#> 

Berdasarkan data diatas, terdapat informasi yang dapat diambil sebagai berikut:

  • Umur Wisatawan yang ada di dataset berada dalam rentang 18-40.
  • Terdapat 437 tempat wisata yang tersebar di pulau Jawa berdasarkan dataset.
  • Taman Hiburan merupakan kategori tempat wisata yang paling banyak dikunjungi
  • Rating Place berada dalam rentang 3.4 - 5.0
  • Rating oleh wisatawan berada dalam rentang 1.0 - 5.0

Eksplor Data

Dari 437 tempat wisata yang tersedia, akan dilihat ada berapa banyak tempat wisata di masing-masing kota.

data1 %>% 
  count(Place_Name,City) %>% 
  count(City) %>% 
  arrange(-n)

Hasilnya tempat wisata terbanyak didominasi 2 kota yakni Yogyakarta dan Bandung. Bahkan 2 kota ini masing-masing memeilki jumlah tempat wisata 2-2,5 kali lebih banyak dari kota Semarang dan Surabaya.

Selanjutnya akan dilihat Kota mana yang paling banyak dikunjungi oleh wisatawan.

data1 %>% 
  count(City) %>% 
  arrange(-n)

Terlihat pula jumlah kunjungan wisatawan terbanyak didominasi pula oleh 2 kota dengan tempat wisata terbanyak. Ternyata ada hubungan antara banyaknya tempat wisata dengan banyaknya wisatawan yang datang. Hal ini bisa menjadi insight bagi pemerintah daerah setempat khususnya dinas pariwisata untuk lebih jeli mengeksplor daerahnya untuk dijadikan tempat wisata demi meningkatkan pendapatan daerahnya.

Selanjutnya akan diamati kategori mana yang paling banyak tempat wisatanya.

data1 %>% 
  count(Place_Name,Category) %>% 
  count(Category) %>% 
  arrange(-n)

Hasilnya Taman Hiburan, Budaya, dan Cagar Alam merupakan kategori dengan tempat wisata terbanyak. Sedangkan yang paling sedikit berada di kategori tempat ibadah dan pusat perbelanjaan. Hal ini kemungkinan dikarenakan tempat ibadah dan tempat perbelanjaan memang sedikit yang bisa dijadikan tempat wisata. Apalagi tempat ibadah yang tujuan awal dibangunnya bukan sebagai tempat wisata.

Selanjutnya akan diamati kategori mana yang paling banyak dikunjungi.

data1 %>% 
  count(Category) %>% 
  arrange(-n)

Kategori Taman Hiburan memiliki jumlah kunjungan wisatwan terbanyak, hal ini dikarenakan jumlah tempat wisata di kategori Taman Hiburan juga banyak.

Sehingga, ini membuktikan adanya hubungan kuat antara banyaknya tempat wisata dan jumlah kunjungan wisatawan.

Distribusi Umur

Selanjutnya akan dilakukan analisis data pada Umur wisatawan. Dengan menggunakan geom_boxplot kita bisa melihat persebaran dari umur wisatawan.

      plot5 <- ggplot(data1,aes(y = Age))+
        geom_boxplot(width = 2,color = "black", fill = "skyblue")+
        labs(title = "Boxplot Umur Pengunjung Tempat Wisata di Jakarta",
             x = NULL,
             y = "Umur")+
        theme_minimal()+
        theme(#plot.title = element_text(face="bold"),untuk menebalkan judul
          legend.position = "none"
        )
      
      plot5

Karena belum terlihat jelas datanya terpusat dimana, kita akan menggunakan bantuan summary untuk melihat letak Q1, median dan Q3.

summary(data1$Age)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   18.00   24.00   29.00   28.73   34.00   40.00

Hasilnya ternyata data wisatawan terpusat di umur 29 dengan rentang umur 24-34 tahun.

Selanjutnya akan dilihat jumlah kunjungan wisatawan berdasarkan umurnya. Kita akan menggunakan geom_col untuk membuat bar plot.

age <- data1 %>% 
  count(Age)

plot_hist <- ggplot(age, aes(Age,n))+
  geom_col(fill="skyblue", color="black", alpha=0.5)+
  scale_x_continuous(breaks = seq(min(age$Age),max(age$Age),1))+
  labs(title = "Distribusi Umur Pengunjung Tempat Wisata di Kota Besar Pulau Jawa",
             x = "Umur",
             y = "Banyaknya Kunjungan Wisatawan")+
  theme_minimal()+
        theme(legend.position = "none"
        )

plot_hist

Ternyata dari data wisatawan yang ada, wisatawan terbanyak dengan umur 30 dan terendah di umur 36.

###Visualisasi

Kita bisa melihat persebaran umur wisatawan dengan menggunakan boxplot di tiap daerahnya

      plot_box <- ggplot(data1,aes(x= City, y = Age))+
        geom_boxplot(color = "black", fill = "skyblue",alpha=0.5)+
        labs(title = "Demografi Umur Pengunjung Tempat Wisata di Kota Besar Pulau Jawa",
             x = NULL,
             y = "Umur")+
        theme_minimal()+
        theme(#plot.title = element_text(face="bold"),untuk menebalkan judul
          legend.position = "none"
        )
      
      plot_box

Ternyata persebaran umur wisatawan yang berkunjung di tiap daerah tidak jauh berbeda.

Tempat Wisata

Untuk memudahkan wisatawan dalam memilih tempat wisata berdasarkan jenis tempatnya yakni berbayar atau gratis, akan dilakukan analisis serta visualisasi terhadap tempat wisata yang gratis dan berbayar.

Pertama, akan dihitung berapa banyak lokasi wisata yang gratis dan berbayar dengan menggunakan metode subsetting.

data1 %>% 
  filter(Metode == "Gratis") %>% 
  group_by(Place_Name,City) %>% 
  count(Metode)
data1 %>% 
  filter(Metode == "Berbayar") %>% 
  group_by(Place_Name,City) %>% 
  count(Metode)

Ternyata ada 137 Tempat Wisata yang gratis dan 300 tempat wisata yang berbayar.

Selanjutnya kita ingin mengurutkan tempat wisata yang gratis dan berbayar ini berdasarkan penilaian yang diperoleh. Dimana penilaian disini berasal dari rata-rata dari penilaian tempat wisata dan penilaian dari wisatawan.

place <- data1 %>% 
  select(Place_Name,City,Metode,Rating,Place_Ratings) %>% 
  group_by(Place_Name,City,Metode) %>% 
  summarise(Avg_Place = mean(Rating), Avg_User = round(mean(Place_Ratings),3), count = n()) %>% 
  mutate(Avg_total = (Avg_Place+Avg_User)/2) %>% 
  # ungroup()%>% 
  arrange(-Avg_total) %>% 
  group_by(Metode) %>%
  slice(1:5)
place

Ternyata Tempat wisata berbayar didominasi oleh Kota Yogyakarta dan temapt wisata gratis didominasi oleh kota Jakarta.

Karena hasil diatas belum mewakili tempat wisata di masing-masing kota maka selanjutnya akan ditampilkan tempat wisata favorit di tiap kotanya berdasarkan rata-rata penilaian.

Visualisasi

Untuk melihat visualisasinya, akan dibuat 2 plot secara terpisah yakni untuk tempat wisata yang gratis dan berbayar.

place_free <- data1 %>% 
  filter(Metode == "Gratis") %>% 
  select(Place_Name,Category,City,Metode,Rating,Place_Ratings,Price) %>% 
  group_by(Place_Name,Category,City,Metode,Price) %>% 
  summarise(Avg_Place = mean(Rating), Avg_User = round(mean(Place_Ratings),3), count = n()) %>% 
  mutate(Avg_total = (Avg_Place+Avg_User)/2) %>% 
  # ungroup()%>% 
  arrange(-Avg_total) %>% 
  group_by(City) %>% 
  slice(1) %>% 
  arrange(-Avg_total) 
place_free
place_paid <- data1 %>% 
  filter(Metode == "Berbayar") %>% 
  select(Place_Name,Category,City,Metode,Rating,Place_Ratings,Price) %>% 
  group_by(Place_Name,Category,City,Metode,Price) %>% 
  summarise(Avg_Place = mean(Rating), Avg_User = round(mean(Place_Ratings),3), count = n()) %>% 
  mutate(Avg_total = ((Avg_Place+Avg_User)/2)) %>% 
  # ungroup()%>% 
  arrange(-Avg_total) %>% 
  group_by(City) %>% 
  slice(1) %>% 
  arrange(-Avg_total)
place_paid
plot_place_free<- ggplot(data = place_free,
       aes(x = Avg_total, y = reorder(Place_Name, Avg_total)))+
  geom_col(aes(fill=Avg_total),width=0.5)+
  scale_fill_gradient(low="skyblue", high="black")+
  labs(title = "Tempat Wisata Gratis Terfavorit",
    x = "Skor Penilaian",
       y = NULL)+
  theme_minimal()+
        theme(legend.position = "none"
        )
plot_place_free

plot_place_paid<- ggplot(data = place_paid,
       aes(x = Avg_total, y = reorder(Place_Name, Avg_total)))+
  geom_col(aes(fill=Avg_total),width=0.5)+
  scale_fill_gradient(low="skyblue", high="black")+
  labs(title= "Tempat Wisata Berbayar Terfavorit",
       x = "Skor Penilaian",
       y = NULL)+
    theme_minimal()+
        theme(legend.position = "none"
        )

plot_place_paid

Berdasarkan hasil plot di atas, ada 5 rekomendasi tempat wisata favorit baik itu gratis dan berbayar di setiap kota besar di pulau Jawa. Dan dari daftar tempat wisata favorit tersebut didominasi oleh tempat wisata dengan kategori budaya.

Setelah nama tempat wisata favorit sudah ditentukan, selanjutnya akan dibuatkan sebuah peta persebaran lokasi tempat wisata.

Map Leaflet

Untuk memudahkan wisatawan menemukan lokasi tempat wisata yang telah di analisis sebelumnya, maka akan dibuatkan sebuah map dengan menggunakan library leaflet.

    loca <- data1 %>% 
      group_by(Place_Name,Description,Category,City,Metode,Price,Lat,Long) %>% 
      summarise(Avg_Place = mean(Rating), Avg_User = round(mean(Place_Ratings),3), count = n()) %>% 
      mutate(Avg_total = (Avg_Place+Avg_User)/2) %>% 
      mutate_at(c("Lat","Long"), as.double) %>% 
      mutate(label = glue(
        "<b>Nama: </b> {Place_Name} <br/>
        <b>Deskripsi: </b> {Description} <br/>
        <b>Kategori: </b> {Category} <br/>
        <b>Kota: </b> {City} <br/>
        <b>Jenis: </b> {Metode} <br/>
        <b>Harga Masuk: </b> Rp.{comma(Price)} <br/>
        <b>Penilaian Tempat: </b> {Avg_Place} <br/>
        <b>Penilaian dari Pengunjung: </b> {Avg_User} dari <b>{count}</b> pengunjung<br/>
        <b>Penilaian Keseluruhan: </b> {Avg_total} <br/>"
        ))
    
    # create a leaflet map widget
    map1 <- leaflet() 
    # add tiles (kerangka peta) from open street map
    map1 <- addTiles(map1, group = "Default") %>% 
      addProviderTiles(providers$Esri.WorldImagery, group = "Satelite") %>%
      addLayersControl(baseGroups = c("Default", "Satelite"))
    # add markers
    map1 <- addMarkers(map = map1, data = loca, popup = loca$label, clusterOptions = markerClusterOptions()) %>% 
      addMiniMap(
        toggleDisplay = TRUE
      )
    
    map1

Dalam map di atas, kita bisa melihat informasi tambahan pada setiap lokasi yang dipilih.

Dari skor penilaian yang ditampilkan, muncul sebuah pertanyaan

Apakah ada hubungan antara banyaknya pengunjung dengan penilaian yang diberikan di suatu tempat wisata?

Untuk menjawab pertanyaan tersebut, pertama-tama akan dibuatkan scatter plot untuk melihat kekuatan hubungan kedua variabel tersebut.

scatter <- ggplot(loca, aes(x=count, y=Avg_User)) + 
  geom_point() +
  geom_smooth(method=lm)
scatter

Hasilnya adalah garis datar yang mengidentifikasikan bahwa tidak ada hubungan antara jumlah pengunjung dan rata-rata penilaian dari pengunjung. Untuk melihat angka dari kekuatan hubungannya bisa menggunakan perintah ggcorr.

library(GGally)

# visualisasi:
ggcorr(loca, label = T)

Terlihat bahwa nilai korelasinya berada di 0 yang menandakan bahwa tidak adanya hubungan antara kedua variabel tersebut.

Kesimpulan

Dari hasil EDA dan visualisasi yang dilakukan, ada beberapa poin kesimpulan yang didapatkan, yakni

  • Terdapat pilihan tempat wisata favorit di tiap kota besar di pulau Jawa berdasarkan rating yang telah diberikan. Adapun nama tempat wisatanya dibagi menjadi 2 kategori yakni gratis dan berbayar yang diantaranya:

    • Bandung :
      • Gratis: Masjid Agung Trans Studio Bandung
      • Berbayar: Rainbow Garden
    • Jakarta:
      • Gratis: Monumen Selamat Datang
      • Berbayar: Kampung Cina
    • Surabaya:
      • Gratis: Keraton Surabaya
      • Berbayar: Gereja Perawan Maria Tak Berdosa Surabaya
    • Yogyakarta:
      • Gratis: Desa Wisata Sungai Code Jogja Kota
      • Berbayar: Puncak Gunung Api Purba - Nglanggeran
    • Semarang:
      • Gratis: Taman Srigunting
      • Berbayar: Kampoeng Djadhoel Semarang
  • Hasil visualisasi terutama map leafet sangat mempermudah kita untuk menentukan tempat wisata yang ingin dikunjungi. Apalagi dengan disertai deskripsi singkat mengenai tempat tersebut semakin meyakinkan kita dalam memilih tempat wisata.

  • Ternyata ada hubungan antara banyaknya tempat wisata dengan banyaknya wisatawan yang datang. Hal ini bisa menjadi insight bagi pemerintah daerah setempat khususnya dinas pariwisata untuk lebih jeli mengeksplor daerahnya untuk dijadikan tempat wisata baru demi meningkatkan pendapatan daerahnya.

  • Terdapat beberapa kategori tempat wisata yang sangat sedikit tempat wisatanya seperti tempat ibadah dan pusat perbelanjaan. Hal ini mungkin disebabkan karena tujuan awal dari tempat tersebut bukan sebagai tempat wisata.