Best Tutorial: Scraping dan Visualisasi Trending Topic Twitter dengan R

Best Tutorial: Scraping dan Visualisasi Trending Topic Twitter dengan R

Scraping trending topic Twitter dengan R

Salam sehat teman-teman, kita berjumpa kembali pada blog sederhana ini. Pada unggahan sebelumnya, kita telah membahas mengenai machine learning berjenis supervised learning, yaitu model Decision Tree untuk klasifikasi sekaligus regresi dan step by step praktiknya dengan R. Bagi teman-teman yang berminat menyimak keseruannya, bisa mengunjungi tautan ini.

Kali ini kita akan melanjutkan belajar dan berbagi mengenai bagaimana cara melakukan scraping topik yang sedang trending di Twitter menggunakan R. Beberapa unggahan sebelumnya, dalam blog ini sebenarnya telah membahas mengenai aktivitas scraping, namun penerapannya adalah pada blog atau website. Teman-teman yang berminat mempelajari cara web scraping, bisa berkunjung pada tautan berikut. Inti dari scraping sendiri merupakan aktivitas hacking untuk memperoleh sebagian data atau informasi atau informasi tertentu secara langsung pada sebuah page atau laman baik itu media sosial, blog, atau lainnya sedemikian rupa untuk diolah menjadi sebuah informasi baru yang bermanfaat sekaligus menambah insight bagi pengguna data atau informasi tersebut.

Hal terpenting yang harus dilakukan dalam scraping adalah bagaimana kita menerapkan etika yang baik sebelum mendapatkan data atau informasi pada sebuah page. Salah satunya etika yang biasa diterapkan adalah dengan melihat status data atau informasi pada sebuah page atau laman tertentu, diperbolehkan melakukan scraping atau tidak. Hal ini bisa kita terapkan dengan menggunakan robots.txt.

Misalkan kita akan melakukan scraping berita dari detik.com, maka etika kita untuk melihat status laman tersebut diperbolehkan atau tidak adalah dengan melihat status atau warning menggunakan "https://www.detik.com/robots.txt", setelah kita enter akan muncul keterangan berikut:

Status robots.txt detik.com sebelum melakukan scraping berita

Itu kalau website atau situs. Lantas bagaimana etika untuk melakukan scraping media sosial Twitter? Uniknya, untuk melakukan baik scraping maupun crawling, Twitter menyediakan fasilitas bagi kita untuk menjadi developernya. Untuk menjadi developer Twitter, sejumlah tahapan diperlukan dengan memenuhi sejumlah syarat dan ketentuan yang ditetapkan oleh Twitter. Dengan menjadi developer inilah kita bisa memperoleh API Twitter sebagai sarana melakukan baik scraping maupun crawling data.

Kali ini, dengan menggunakan sarana tersebut, kita akan mencoba melakukan scraping topik yang sedang trending atau trending topic di Twitter kemudian kita akan memvisualisasikannya dalam bentuk awan kata (wordcloud) dengan menggunakan package wordcloud2 yang merupakan package pengembangan dari wordcloud serta untuk memperjelas visualisasi, kita juga akan menggunakan tampilan bar chart atau diagram batang menggunakan package ggplot2.

Untuk mendapatkan sejumlah Tweet dari Twitter, pada umumnya di R kita bisa memanfaatkan package rtweet untuk membuat token baru sebagai "jalan masuk" kita menggunakan API Twitter guna melakukan scraping kali ini. Untuk lebih tergambar lebih jelas, kita dapat mengikuti beberapa code dan hasil visualisasi sebagai berikut:

#Aktivasi Package rtweet
library(rtweet)
#Membuat Kredensial Akses Twitter dengan API
create_token(app = "xxxxxxxxxxxxxxx", consumer_key = "xxxxxxxxxxxxxxxxxxxxxx",
             consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
## <Token>
## <oauth_endpoint>
##  request:   https://api.twitter.com/oauth/request_token
##  authorize: https://api.twitter.com/oauth/authenticate
##  access:    https://api.twitter.com/oauth/access_token
## <oauth_app> xxxxxxxxxxxxxxx
##   key:    xxxxxxxxxxxxxxxxxxxxxx
##   secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---
#Melihat Trending Topic di Dunia
trend <- trends_available()
head(trend)
## # A tibble: 6 x 8
##   name      url                                      parentid country  woeid countryCode  code place_type
##   <chr>     <chr>                                       <int> <chr>    <int> <chr>       <int> <chr>     
## 1 Worldwide http://where.yahooapis.com/v1/place/1           0 ""           1 <NA>           19 Supername 
## 2 Winnipeg  http://where.yahooapis.com/v1/place/2972 23424775 "Canada"  2972 CA              7 Town      
## 3 Ottawa    http://where.yahooapis.com/v1/place/3369 23424775 "Canada"  3369 CA              7 Town      
## 4 Quebec    http://where.yahooapis.com/v1/place/3444 23424775 "Canada"  3444 CA              7 Town      
## 5 Montreal  http://where.yahooapis.com/v1/place/3534 23424775 "Canada"  3534 CA              7 Town      
## 6 Toronto   http://where.yahooapis.com/v1/place/4118 23424775 "Canada"  4118 CA              7 Town
#Melihat Trending Topic di Indonesia
trendindo <- get_trends("Indonesia")
head(trendindo)
## # A tibble: 6 x 9
##   trend         url   promoted_content query tweet_volume place  woeid as_of               created_at         
##   <chr>         <chr> <lgl>            <chr>        <int> <chr>  <int> <dttm>              <dttm>             
## 1 #SUMMER_X_TO~ http~ NA               %23S~        16053 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 2 SMAN 1        http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 3 TXT FEELS LI~ http~ NA               %22T~        27600 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 4 #TokocryptoK~ http~ NA               %23T~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 5 #SmartphoneO~ http~ NA               %23S~        14432 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 6 SDN 1         http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
#Melihat Struktur data Keseluruhan
trendindo %>%
  glimpse()
## Rows: 50
## Columns: 9
## $ trend            <chr> "#SUMMER_X_TOGETHER", "SMAN 1", "TXT FEELS LIKE SUMMER", "#TokocryptoKeSurabaya", "~
## $ url              <chr> "http://twitter.com/search?q=%23SUMMER_X_TOGETHER", "http://twitter.com/search?q=%2~
## $ promoted_content <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ query            <chr> "%23SUMMER_X_TOGETHER", "%22SMAN+1%22", "%22TXT+FEELS+LIKE+SUMMER%22", "%23Tokocryp~
## $ tweet_volume     <int> 16053, NA, 27600, NA, 14432, NA, 68840, NA, NA, NA, NA, NA, NA, NA, 1016942, 17458,~
## $ place            <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indo~
## $ woeid            <int> 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 234~
## $ as_of            <dttm> 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58~
## $ created_at       <dttm> 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55~
#Melihat Volume Tweets dari Trending Topic
library(dplyr)
trendindo %>%
  select(trend, tweet_volume)
## # A tibble: 50 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 SMAN 1                              NA
##  3 TXT FEELS LIKE SUMMER            27600
##  4 #TokocryptoKeSurabaya               NA
##  5 #SmartphoneOPPOdariShopee        14432
##  6 SDN 1                               NA
##  7 #TOMORROW_X_TOGETHER             68840
##  8 #HBSBongkarKasusKM50                NA
##  9 Bangun Pertahanan Kita              NA
## 10 kerja fokus prabowo                 NA
## # ... with 40 more rows
#Memfilter Volume Tweets yang tidak NA
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA")
## # A tibble: 27 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 TXT FEELS LIKE SUMMER            27600
##  3 #SmartphoneOPPOdariShopee        14432
##  4 #TOMORROW_X_TOGETHER             68840
##  5 nayeon                         1016942
##  6 Cinta Laura                      17458
##  7 Nestle                           18486
##  8 Left & Right                   1611240
##  9 Maria                           208737
## 10 FELIX 1ST SOLO FEATURE           50607
## # ... with 17 more rows
#Mengurutkan dari Volume Tweets yang terbanyak
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume))
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
#Memvisualisasikan Trending Topic Indonesia dengan Wordcloud
library(wordcloud2)
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) %>% 
  wordcloud2(size = 2, shape = "circle",minRotation = -pi/6, maxRotation = -pi/6,
             rotateRatio = 1)
Visualisasi Trending Topic Twitter Indonesia

#Visualisasi Tweets menurut waktu menit
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) -> barku
barku
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
library(ggplot2)
ggplot(data = barku, aes(x = reorder(trend, tweet_volume), y = tweet_volume, fill = as.factor(trend))) +
  geom_bar(stat = "identity") +
  theme(legend.position = "none") +
  coord_flip()+
  labs(x = "Trending Topik", y = "Frekuensi Tweet", caption = paste0("Sumber: Twitter, tanggal: ", Sys.Date())) +
  ggtitle("Barchart Trending Topik Twitter Indonesia")
plot of chunk unnamed-chunk-11
Bar Chart Trending Topic Twitter Indonesia

Terlihat bahwa visualisasi awan kata (wordcloud) dengan bar chart sedikit berbeda, karena pada wordcloud belum diatur lebih lanjut mengenai ukuran minimal atau rasio visualisasi wordcloud yang ditampilkan. Topik mengenai Left and Right dan SAFE FLIGHT LALISA tidak terlihat karena jumlah Tweetnya sangat besar. Sedangkan pada bar chart, kita dapat melihat seluruh trending topic dan lebih insightfull. Setidaknya, pada 24 Juni 2022 kemarin, terdapat 5 trending topic di Twitter Indonesia, yaitu Left and Right, SAFE FLIGHT LALISA, nayeon, #LeftandRight, dan Sungwoon, sepertinya topik-topik berkaitan dengan konser NCT DREAM, termasuk boygroup Korea masih menarik perhatian netizen Twitter di Indonesia.

Demikian sedikit ulasan mengenai bagaimana melakukan scraping Twitter menggunakan R. Bagi teman-teman yang berminat memperdalam pengetahuan bagaimana melakukan scapring dan crawling menggunakan R, saya telah menuliskannya dalam buku berjudul: Pengantar Data Mining dengan R Studio. Urgensi pembuatan buku tersebut adalah untuk mempersiapkan kita menuju gerbang Data Science dan Big Data serta perkembangan Artificial Intelligence yang begitu pesat saat ini. Pemesanan buku dapat melalui tautan berikut. Selamat memahami dan mempraktikkan!

Tutorial Lengkap (Step by Step) Supervised Learning: Decision Tree dengan R

Tutorial Lengkap (Step by Step) Supervised Learning: Decision Tree dengan R

Decision Tree dengan R

Halo teman-teman, jumpa lagi dengan blog sederhana ini. Pada pembahasan sebelumnya, kita telah berbagai mengenai cara mengunduh dan menginstal R serta R Studio, melakukan web scraping, serta melakukan peramalan pertumbuhan ekonomi Indonesia yang menurut sejumlah pakar ekonomi, ekonomi Indonesia dalam beberapa kuartal ke depan akan menemui berbagai tantangan, termasuk resesi global akibat krisis di sejumlah negara mitra dagang, terutama Amerika Serikat (AS).

Dalam unggahan kali ini, kita akan melangkah pada pembahasan mengenai machine learning lagi teman-teman. Adapun jenis model machine learning yang akan kita pelajari bersama ini berjenis supervised learning, karena data berlabel pada praktiknya nanti kita pakai dalam proses membuat model, alias kita pisahkan mana variabel dependen dan variabel independennya.

Dalam aktivitas sehari-hari, acapkali kita dihadapkan pada sebuah situasi di mana kita harus mengambil sebuah keputusan dari beberapa pilihan terbaik atau terburuk. Bila kita berada dalam atmosfer bisnis misalkan, kita bakal sering menghadapi beberapa pilihan berisiko dan kita harus sesegera mungkin mengambil keputusan atau kebijakan untuk mengatasi masalah. Teknik mengambil sebuah keputusan memang banyak jenisnya, namun terdapat sebuah model pengambilan keputusan yang mungkin bisa menjadi alternatif bagi kita saat ini, yaitu model Decision Tree atau Pohon Keputusan.

Seperti halnya sebuah pohon yang tumbuh menjulang ke atas dimulai dari akar hingga daun, Decision Tree ini juga sama persis dengan pohon tersebut, hanya saja bentuknya terbalik. Model Decision Tree merupakan sebuah "pohon keputusan" yang menjulur ke bawah, diawali dengan akar pada bagian atasnya, berlanjut pada cabang dan ranting-ranting keputusan atau yang biasa disebut lengan keputusan dan berakhir pada daun-daun keputusan yang bisa kita petik dan ambil sebagai kebijakan menyelesaikan masalah, menghindari masalah, atau meminimalkan risiko serta efisiensi biaya.

Adapun prinsip dasar Decision Tree ini merupakan model klasifisikasi yang menggunakan hubungan fungsional sebab-akibat atau regresi di dalamnya. Dengan prinsip tersebut, model Decision Tree dapat kita manfaatkan untuk memecahkan permasalah dengan klasifikasi maupun regresi. Sebelum lebih jauh, kita akan awali sebagaimana adat kita dalam blog ini, yaitu pendefinisiannya dulu.

Menurut Lestari (2019), Decision Tree merupakan suatu metode klasifikasi yang menggunakan struktur pohon, di mana setiap node menunjukkan atribut dan cabangnya menunjukkan nilai dari atribut tersebut, sedangkan daunnya menunjukkan kelas. Node paling atas dalam model ini diistilahkan sebagai akar (root). Menurut Gie (2021), Decision Tree merupakan alat pendukung yang mempunyai struktur seperti pohon untuk memodelkan kemungkinan hasil, biaya dari sumber daya, kebermanfaatan, serta beberapa kemungkinan risiko atau konsekuensi. Berdasarkan dua definisi tersebut kita dapat simpulkan bahwa Decision Tree merupakan salah satu alat analisis machine learning di era Data Science dan Big Data dengan pendekatan klasifikasi berstruktur pohon yang terdiri atas node sebagai atributnya, cabang sebagai nilai atributnya, dan daun-daun keputusan yang berkelas-kelas di dalamnya sebagai pendukung kemungkinan hasil, biaya atas sumber daya, kebermanfaatan, serta kemungkinan risiko dari permasalahan.

Dari sisi manfaat, Decision Tree ini kalau kita lakukan pencarian pada mesin pencari (search engine), kita akan banyak temui beragam manfaat penggunaannya. Beberapa di antaranya, Decision Tree dimanfaatkan untuk melakukan penilaian berpeluang atas pertumbuhan prospektif sebuah bisnis atau usaha dengan memakai data historis; model ini juga bisa kita gunakan untuk menganalisis segmentasi konsumen produk yang kita hasilkan dari bisnis atau usaha kita, termasuk melihat peluang pangsa pasar produk bisnis, dan segmentasi klien yang mungkin menjadi target pelayanan bisnis kita menggunakan data demografi; di bidang riset operasi (operation research), model ini juga bisa digunakan dalam perencanaan logistik serta strategi pemasaran produk dengan konstrain atau formulasi kendala tertentu sehingga mampu meminimalkan biaya, sumber daya, waktu, dan aspek lainnya; Decsion Tree juga bisa dimanfaatkan dalam pengambilan keputusan hukum suatu perkara dengan memanfaatkan data historis perkara yang ada; di bidang pendidikan, model ini bisa digunakan dalam perencanaan pembangunan pendidikan suatu wilayah; di bidang keuangan, model ini juga banyak dimanfaatkan untuk meminimalisir kredit macet perbankan dengan konstrain segmentasi calon klien berdasarkan pendapatan serta pekerjaannya; dan di bidang kesehatan, model ini dapat digunakan untuk pengujian efektivitas obat, vaksin, atau mendiagnosa sebuah penyakit.

Bagian-bagian Decision Tree

Berikutnya, kita lanjutkan pada bagian-bagian yang ada pada hasil pemodelan Decision Tree. Gambar di atas merupakan struktur yang saya rangkum dari berbagai sumber. Terlihat bahwa sebuah model Decision Tree terdiri atas beberapa node mulai dari node akar hingga daun. Di dalam sekumpulan node, terdapat node keputusan (decision node), yaitu sebuah node yang menjadi pilihan keputusan dari node sebelumnya. Node inilah yang kemudian menjadi acuan pengujian cabang berikutnya. Pada setiap node terdapat beberapa kelas yang merupakan variabel kategorik "Ya" dan "Tidak". Di bagian ujung bawah terdapat node-node yang merupakan sejumlah pilihan keputusan diistilahkan sebagai node daun. Node inilah yang kemudian disebut sebagai terminal keputusan. Dari sekumpulan node dalam sebuah Decision Tree, terdapat Sub-Tree yang merupakan miniatur lengkap dari keseluruhan Decision Tree. Sedangkan garis-garis yang menghubungkan antara node satu dan lainnya kita istilahkan sebagai lengan Tree.

Dalam penggunaannya, Decision Tree memperkenalkan istilah atribut pada proses pembuatan struktur pohon keputusannya. Penentuan atribut ini, kita perlu melakukan proses pemilihan sedemikian rupa sehingga diperoleh Decision Tree yang paling kecil ukurannya. Untuk menentukan atribut terbaik, kita perlu memilih atribut yang memiliki information Gain paling besar nilainya. Adapun rumus penghitungan information Gain dapat dituliskan sebagai berikut:

Beberapa formula dalam penentuan atribut Decision Tree

Berdasarkan rumus tersebut, dalam memahami Decision Tree kita akan mengenal beberapa istilah, yaitu information Gain sendiri dan Entropi. Information Gain sendiri merupakan selisih antara informasi yang diharapkan dikurangi dengan Entropi dari informasi. Konsep Entropi biasanya kita kenal dalam ilmu Fisika, tetapi seiring berkembangan ilmu pengetahuan, konsep Entropi juga dikembangkan dalam bidang matematika informasi. Entropi dalam bidang matematika informasi dikenalkan pertama kali oleh Claude Shannon pada tahun 1948. Dalam pengertiannya, Entropi informasi menunjukkan seberapa besar peluang ketidakpastian sebuah kejadian benar-benar terjadi. Secara umum, Entropi sendiri dirumuskan I(x) = -log P(x). Bila nilai I = 0, maka tidak ada ketidakpastian, atau ketidakpastiannya sama dengan 0, misalkan pada kejadian "hari ini matahari terbit arah timur". Bila nilai I = tak hingga, maka sangat tidak pasti atau ketidakpastiannya tidak terhingga, misalkan pada kondisi "hari ini hujan berlian". Dari pengertian sederhana tersebut, kita dapat menarik kesimpulan, semakin tinggi nilai Entropi maka ketidakpastiannya semakin besar, demikian sebaliknya.

Apa kaitannya dengan Decision Tree yang kita bahas? Misalkan kita disuruh menebak nama benda dalam sebuah kotak tertutup, tentu keputusan kita dalam menebak sangat dipengaruhi oleh banyaknya informasi yang kita peroleh. Semakin banyak informasi yang kita dapatkan (dalam Decision Tree ditunjukkan oleh node daun), maka semakin besar pula ketidakpastian tebakan kita mengenai benda di dalam kotak itu. Karena semakin banyak informasi, banyak ketidakpastian yang timbul bahkan membuat kita bingung dalam menebak benda dalam kotak. Sebaliknya, bila informasi yang kita peroleh tidak banyak pilihannya (sedikit), maka derajat ketidakpastian akan rendah sehingga kita lebih mudah dalam menebak benda dalam kotak. Inilah filosofi mengapa di dalam Decision Tree, tujuan kita adalah memilih atribut yang mampu membuat struktur Decision Tree dengan ukuran seminimal mungkin.

Untuk lebih memahami pembentukan atribut dan Decision Tree, kita bisa mencoba melakukan penghitungan secara manual terlebih dahulu berdasarkan Pak Rahmadya dari Nusa Putra University berikut:

Baik, itu sekilas mengenai konsep atau teori mengenai Decision Tree teman-teman. Pada tahapan akhir, kita akan coba mempraktikkan bagaimana cara memodelkan Decision Tree sebagai salah satu jenis machine learning supervised. Pada praktik kali ini, kita akan menggunakan data dummy yang telah saya siapkan, teman-teman dapat mengunduhnya terlebih dahulu pada tautan berikut. Dengan pemodelan Decision Tree ini kita akan mengidentifikasi variabel apa saja yang menjadi penentu seseorang dalam membeli komputer. Adapun data demografi yang kita gunakan meliputi umur, pendapatan, statusnya sebagai murid atau tidak, serta rating kredit historisnya.

Dari hasil penelusuran saya, kebanyakan praktik Decision Tree dilakukan dengan mengkonversi variabel kategorik menjadi numerik dengan variabel dependennya adalah variabel kategorik. Tetapi, kali ini kita akan menggunakan variabel-variabel yang murni kategorik semua.

#Import Data
library(readxl)
data <- read_excel("datareal.xlsx")
data
## # A tibble: 14 x 5
##    umur  pendapatan status_murid rating_kredit beli_komputer
##    <chr> <chr>      <chr>        <chr>         <chr>        
##  1 <=30  Tinggi     Tidak        Sedang        Tidak        
##  2 <=30  Tinggi     Tidak        Baik          Tidak        
##  3 31-40 Tinggi     Tidak        Sedang        Ya           
##  4 >40   Sedang     Tidak        Sedang        Ya           
##  5 >40   Rendah     Ya           Sedang        Ya           
##  6 >40   Rendah     Ya           Baik          Tidak        
##  7 31-40 Rendah     Ya           Baik          Ya           
##  8 <=30  Sedang     Tidak        Sedang        Tidak        
##  9 <=30  Rendah     Ya           Sedang        Ya           
## 10 >40   Sedang     Ya           Sedang        Ya           
## 11 <=30  Sedang     Ya           Baik          Ya           
## 12 31-40 Sedang     Tidak        Baik          Ya           
## 13 31-40 Tinggi     Ya           Sedang        Ya           
## 14 >40   Sedang     Tidak        Baik          Tidak
#Struktur Data
str(data)
## tibble [14 x 5] (S3: tbl_df/tbl/data.frame)
##  $ umur         : chr [1:14] "<=30" "<=30" "31-40" ">40" ...
##  $ pendapatan   : chr [1:14] "Tinggi" "Tinggi" "Tinggi" "Sedang" ...
##  $ status_murid : chr [1:14] "Tidak" "Tidak" "Tidak" "Tidak" ...
##  $ rating_kredit: chr [1:14] "Sedang" "Baik" "Sedang" "Sedang" ...
##  $ beli_komputer: chr [1:14] "Tidak" "Tidak" "Ya" "Ya" ...
#Mengubah Tipe Data
data$umur <- as.factor(data$umur)
data$pendapatan <- as.factor(data$pendapatan)
data$status_murid <- as.factor(data$status_murid)
data$rating_kredit <- as.factor(data$rating_kredit)
data$beli_komputer <- as.factor(data$beli_komputer)
#Struktur Data
str(data)
## tibble [14 x 5] (S3: tbl_df/tbl/data.frame)
##  $ umur         : Factor w/ 3 levels "<=30",">40","31-40": 1 1 3 2 2 2 3 1 1 2 ...
##  $ pendapatan   : Factor w/ 3 levels "Rendah","Sedang",..: 3 3 3 2 1 1 1 2 1 2 ...
##  $ status_murid : Factor w/ 2 levels "Tidak","Ya": 1 1 1 1 2 2 2 1 2 2 ...
##  $ rating_kredit: Factor w/ 2 levels "Baik","Sedang": 2 1 2 2 2 1 1 2 2 2 ...
##  $ beli_komputer: Factor w/ 2 levels "Tidak","Ya": 1 1 2 2 2 1 2 1 2 2 ...
#Partisi Data
library(caret)
inTrain <- createDataPartition(y = data$beli_komputer, p = 0.75, list = F)
train <- data[inTrain,]
test <- data[-inTrain,]
dim(train)
## [1] 11  5
dim(test)
## [1] 3 5
#Attach Data
attach(train)
attach(test)
#Model Decision Tree
library(rpart)
dtku <- rpart(beli_komputer ~ umur + pendapatan + status_murid + rating_kredit, data = train,
              method = "class", minsplit = 1, minbucket = 1)
#bila regression tree methodnya "class", jika classification tree methodnya "anova" 
#Ringkasan Model
summary(dtku)
## Call:
## rpart(formula = beli_komputer ~ umur + pendapatan + status_murid + 
##     rating_kredit, data = train, method = "class", minsplit = 1, 
##     minbucket = 1)
##   n= 11 
## 
##      CP nsplit rel error xerror      xstd
## 1 0.375      0      1.00    1.0 0.3988620
## 2 0.125      2      0.25    1.5 0.4128614
## 3 0.010      4      0.00    1.5 0.4128614
## 
## Variable importance
## rating_kredit    pendapatan          umur 
##            41            31            29 
## 
## Node number 1: 11 observations,    complexity param=0.375
##   predicted class=Ya     expected loss=0.3636364  P(node) =1
##     class counts:     4     7
##    probabilities: 0.364 0.636 
##   left son=2 (8 obs) right son=3 (3 obs)
##   Primary splits:
##       umur          splits as  LLR, improve=1.0909090, (0 missing)
##       status_murid  splits as  LR,  improve=1.0242420, (0 missing)
##       rating_kredit splits as  LR,  improve=1.0242420, (0 missing)
##       pendapatan    splits as  RLL, improve=0.1623377, (0 missing)
## 
## Node number 2: 8 observations,    complexity param=0.375
##   predicted class=Tidak  expected loss=0.5  P(node) =0.7272727
##     class counts:     4     4
##    probabilities: 0.500 0.500 
##   left son=4 (3 obs) right son=5 (5 obs)
##   Primary splits:
##       rating_kredit splits as  LR,  improve=2.4000000, (0 missing)
##       status_murid  splits as  LR,  improve=1.0000000, (0 missing)
##       pendapatan    splits as  RRL, improve=0.5714286, (0 missing)
##       umur          splits as  LR-, improve=0.2666667, (0 missing)
##   Surrogate splits:
##       pendapatan splits as  RRL, agree=0.75, adj=0.333, (0 split)
## 
## Node number 3: 3 observations
##   predicted class=Ya     expected loss=0  P(node) =0.2727273
##     class counts:     0     3
##    probabilities: 0.000 1.000 
## 
## Node number 4: 3 observations
##   predicted class=Tidak  expected loss=0  P(node) =0.2727273
##     class counts:     3     0
##    probabilities: 1.000 0.000 
## 
## Node number 5: 5 observations,    complexity param=0.125
##   predicted class=Ya     expected loss=0.2  P(node) =0.4545455
##     class counts:     1     4
##    probabilities: 0.200 0.800 
##   left son=10 (2 obs) right son=11 (3 obs)
##   Primary splits:
##       umur         splits as  LR-, improve=0.6000000, (0 missing)
##       status_murid splits as  LR,  improve=0.6000000, (0 missing)
##       pendapatan   splits as  RL-, improve=0.2666667, (0 missing)
## 
## Node number 10: 2 observations,    complexity param=0.125
##   predicted class=Tidak  expected loss=0.5  P(node) =0.1818182
##     class counts:     1     1
##    probabilities: 0.500 0.500 
##   left son=20 (1 obs) right son=21 (1 obs)
##   Primary splits:
##       pendapatan   splits as  RL-, improve=1, (0 missing)
##       status_murid splits as  LR,  improve=1, (0 missing)
## 
## Node number 11: 3 observations
##   predicted class=Ya     expected loss=0  P(node) =0.2727273
##     class counts:     0     3
##    probabilities: 0.000 1.000 
## 
## Node number 20: 1 observations
##   predicted class=Tidak  expected loss=0  P(node) =0.09090909
##     class counts:     1     0
##    probabilities: 1.000 0.000 
## 
## Node number 21: 1 observations
##   predicted class=Ya     expected loss=0  P(node) =0.09090909
##     class counts:     0     1
##    probabilities: 0.000 1.000
#Visualisasi Decision Tree
library(rpart.plot)
rpart.plot(dtku)
plot of chunk unnamed-chunk-20
Visualisasi Decision Tree dengan R

#Prediksi dari Model Train
predtrain <- predict(dtku, train, type = "class")
predtrain
##     1     2     3     4     5     6     7     8     9    10    11 
## Tidak    Ya    Ya Tidak    Ya Tidak    Ya    Ya    Ya    Ya Tidak 
## Levels: Tidak Ya
#Akurasi Prediksi
confusionMatrix(predtrain, train$beli_komputer, mode = "everything")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak     4  0
##      Ya        0  7
##                                      
##                Accuracy : 1          
##                  95% CI : (0.7151, 1)
##     No Information Rate : 0.6364     
##     P-Value [Acc > NIR] : 0.00693    
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##               Precision : 1.0000     
##                  Recall : 1.0000     
##                      F1 : 1.0000     
##              Prevalence : 0.3636     
##          Detection Rate : 0.3636     
##    Detection Prevalence : 0.3636     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : Tidak      
## 
#Prediksi dengan Test
predtest <- predict(dtku, test, type = "class")
predtest
##     1     2     3 
## Tidak    Ya Tidak 
## Levels: Tidak Ya
#Confusion Matriks Test
confusionMatrix(predtest, test$beli_komputer, mode = "everything")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction Tidak Ya
##      Tidak     1  1
##      Ya        0  1
##                                           
##                Accuracy : 0.6667          
##                  95% CI : (0.0943, 0.9916)
##     No Information Rate : 0.6667          
##     P-Value [Acc > NIR] : 0.7407          
##                                           
##                   Kappa : 0.4             
##                                           
##  Mcnemar's Test P-Value : 1.0000          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.5000          
##          Pos Pred Value : 0.5000          
##          Neg Pred Value : 1.0000          
##               Precision : 0.5000          
##                  Recall : 1.0000          
##                      F1 : 0.6667          
##              Prevalence : 0.3333          
##          Detection Rate : 0.3333          
##    Detection Prevalence : 0.6667          
##       Balanced Accuracy : 0.7500          
##                                           
##        'Positive' Class : Tidak           
## 

Dari hasil pemodelan, terlihat bahwa rating kredit, pendapatan, dan umur merupakan variabel penentu seseorang membeli komputer (lihat pada bagian Variable Important). Akurasi pada menggunakan data training kita sebesar 1, artinya akurasi model Decision Tree yang terbentuk 100 persen mampu mengklasifikasikan data dengan benar (lihat Confusion Matrix Statistics bagian train). Sedangkan akurasi dengan data testing adalah sebesar 0,6667. Artinya, kemampuan model yang kita bangun mampu mengklasifikasikan data dengan benar sebesar 66,67 persen. Kendati demikian, nilai recall bain training dan testing 100 persen, artinya model yang terbentuk mampu mengklasifikasikan data dengan baik alias kelasnya tidak terbalik.

Berdasarkan visualisasi Decision Tree, kita dapat interpretasikan bahwa dari seluruh responden (100 persen) yang berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun yang berpeluang membeli komputer sebesar 0,64. Dari seluruh responden yang bukan berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun tersebut, seluruhnya berpeluang membeli komputer. Sebanyak 73 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun berpeluang membeli komputer sebesar 0,5. Dari 73 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun, bila rating kreditnya baik, 45 persennya akan membeli komputer dengan peluang sebesar 0,80. Dari 45 persen responden berumur kurang dari atau sama dengan 30 tahun dan lebih dari 40 tahun, bila umurnya ternyata kurang dari atau sama dengan 30 tahun, 27 persennya pasti membeli komputer semua atau dengan peluang 1,00.

Demikian sedikit sharing kita tentang machine learning jenis supervised learning: Decision Tree menggunakan R. Selamat memahami dan mempratikkan!

Cara Mendowload dan Install R serta RStudio di Windows (Step by Step)

Cara Mendowload dan Install R serta RStudio di Windows (Step by Step)

Cara Download dan Install R serta R Studio di Windows

Halo teman-teman, mohon maaf karena beberapa waktu ini, blog ini sempat vakum dari unggahan. Kali ini saya akan coba berbagai mengenai bagaimana cara mengunduh (download) dan menginstal (install) program R sekaligus R Studio khususnya di Windows. Unggahan kali ini sedikit terbalik karena semestinya saya unggah terlebih dahulu pertama kali di blog ini, namun bukan masalah, mengingat kemarin ada beberapa pihak yang meminta untuk menerangkap bagaimana tahapan mengunduh dan instalasi R dan R Studio, jadinya saya dahulukan pada unggahan ini sebelum pembahasan mengenai Data Mining, Data Science, atau bahasan Big Data kita terlampau jauh.

Baik, kita akan mulai dengan bagaimana mengunduh R dan R Studio melalui mesin pencari Google. R dan R Studio ini memang beberapa waktu terakhir ini booming, apalagi dengan munculnya konsep mengenai Big Data, Data Modelling, Data Mining, dan Data Science serta Data Visualization. Sebenarnya, menurut beberapa literatur yang saya baca, R dan R Studio ini lebih cocok untuk aplikasi Data Mining yang erat kaitannya dengan pemrosesan data untuk kebutuhan analisis hasil pemodelan statistik. Khusus R Studio sendiri, sebenarnya bahasanya sama seperti R, hanya saja wujudnya berbeda, atau dalam bahasa planet luar angkasanya R Studio ini merupakan bentuk GUI atau Graphical User Interface dari R.

Lantas, bagaimana cara mengunduh kedua aplikasi ini? Berikut beberapa tahapannya:

#Download R

1. Teman-teman langsung saja klik link berikut: https://cran.r-project.org/bin/windows/base/

2. Silakan klik kotak dengan keterangan: Download R-4.2.0 for Windows (79 megabytes, 64 bit)

Tampilan Download R

3. Selesai

#Download R Studio

1. Langsung saja klik link berikut: https://www.rstudio.com/products/rstudio/download/#download

2. Klik kotak dengan narasi DOWNLOAD RSTUDIO FOR WINDOWS berikut

Tampilan Download R Studio untuk Windows

3. Selesai

Setelah R dan R Studio telah terunduh sempurna, berikutnya kita akan coba instal keduanya dengan terlebih dahulu kita instal R pada Windows kita dengan beberapa tahapan berikut:

#Install R

1. Double click hasil download-an R-nomor versi-win.exe;

2. Selanjutnya muncul informasi berupa lisensi General Public License atau disebut GNU, klik saja tombol Next;

3. Berikutnya muncul jendela posisi atau letak tempat kita akan menyimpan aplikasi R, biasanya secara default tersimpan di drive: C, lalu klik Next;

4. Klik Next lagi;

5. Kalau muncul jendela Startup Option, maka pilih No (Accept default);

6. Klik Next;

7. Centang opsi create a desktop shortcut dan registry entries, itupun bila diperlukan, kalau tidak, ya tidak perlu dicentang, tahapan ini opsional;

8. Klik Next lagi dan tunggu sampai instalasi selesai;

9. Selesai dengan klik tombol Finish

#Install R Studio

1. Double click hasil download-an RStudio-nomor seri.exe;

2. Pilih tempat penyimpanan aplikasi R Studio, defaultnya di drive: C;

3. Muncul jendelan Choose Start Menu Folder, klik Install;

4. Install dimulai dan tunggu hingga selesai;

5. Selesai dengan klik tombol Finish

Selamat, teman-teman berhasil melakukan unduh dan instalasi R dan R Studio. Kedua aplikasi siap digunakan.

Demikian sedikit berbagi kita mengenai cara mendownload dan install R serta R Studio di Windows, semoga sedikit ini bermanfaat, selamat mempraktikkan!

Data Manipulation: Mengubah Data Harian menjadi Data Bulanan, Triwulanan, dan Tahunan dengan R

Data Manipulation: Mengubah Data Harian menjadi Data Bulanan, Triwulanan, dan Tahunan dengan R

Mengubah data harian menjadi data periode bulanan, triwulanan, dan tahunan

Halo teman-teman, berjumpa kembali dengan blog sederhana ini. Setelah membahas mengenai visualisasi menggunakan Gephi, kita coba balik lagi menggunakan R dan membahas visualisasi data runtun waktu (time series data).

Data runtun waktu atau time series merupakan salah satu jenis data yang paling diminati banyak penelitian. Sebab, dengan menggunakan data runtun waktu, selain kita dapat mempelajari pola sebuah data, kita dapat pula melakukan prediksi atau peramalan beberapa waktu ke depan atau beberapa waktu ke belakang menggunakan pola dari data tersebut. Kendati demikian, dalam pemodelan menggunakan runtun waktu atau time series ini biasa rentan sekali terganggu oleh asumsi autokorelasi atau korelasi serial antar residual antar waktu amatan.

Kali ini kita akan mencoba belajar bagaimana melakukan manipulasi data atau istilah kerennya data manipulation menggunakan 2 jenis package yang kalau di Python, mirip dengan package pandas, yaitu package lubridate dan dplyr. Inti perbedaan dari kedua package ini, kalau lubridate adalah package untuk manipulasi pada aspek waktu atau periode dari sebuah data, sedangkan package dplyr biasanya digunakan untuk melakukan manipulasi salah satunya pada aspek agregasi data atau pivot data.

Data manipulation merupakan sebuah proses mengubah struktur data agar lebih mudah dibaca dan lebih terorganisir untuk disajikan atau digunakan pada proses berikutnya

Untuk praktikum menggunakan dua package ini, saya telah menyiapkan data periode harian jumlah penerbangan komersil yang tercatat secara realtime di Bandar Udara Juanda Surabaya di Sidoarjo Jawa Timur selama 2019. Data ini saya peroleh dengan menggunakan teknik web scraping menggunakan R. Bagi teman-teman yang ingin belajar mengenai web scraping dengan R dapat mengunjungi tautan berikut. Adapun data yang saya siapkan tersebut bisa teman-teman unduh terlebih dahulu pada tautan berikut dan setelah itu kita akan melakukan data manipulation menggunakan beberapa code berikut ini:

#Instal dan Aktivasi package
library(lubridate)
library(dplyr)
#Import data
library(readxl)
terbang <- read_excel("C:/Users/Joko Ade/Downloads/terbang.xlsx")
head(terbang, 10)
## # A tibble: 10 x 2
##    periode             penerbangan
##    <dttm>                    <dbl>
##  1 2019-01-01 00:00:00      128717
##  2 2019-01-02 00:00:00      162303
##  3 2019-01-03 00:00:00      169310
##  4 2019-01-04 00:00:00      173386
##  5 2019-01-05 00:00:00      161288
##  6 2019-01-06 00:00:00      156172
##  7 2019-01-07 00:00:00      163601
##  8 2019-01-08 00:00:00      163535
##  9 2019-01-09 00:00:00      167080
## 10 2019-01-10 00:00:00      172335
#Melihat Struktur data awal
str(terbang)
## tibble [365 x 2] (S3: tbl_df/tbl/data.frame)
##  $ periode    : POSIXct[1:365], format: "2019-01-01" "2019-01-02" "2019-01-03" ...
##  $ penerbangan: num [1:365] 128717 162303 169310 173386 161288 ...
#Mengubah tipe periode menjadi date
terbang$periode <- as.Date(terbang$periode)

#Melihat hasil ubah struktur
str(terbang)
## tibble [365 x 2] (S3: tbl_df/tbl/data.frame)
##  $ periode    : Date[1:365], format: "2019-01-01" "2019-01-02" "2019-01-03" ...
##  $ penerbangan: num [1:365] 128717 162303 169310 173386 161288 ...
#Deskriptif data
summary(terbang)
##     periode            penerbangan    
##  Min.   :2019-01-01   Min.   :120212  
##  1st Qu.:2019-04-02   1st Qu.:175300  
##  Median :2019-07-02   Median :190876  
##  Mean   :2019-07-02   Mean   :189019  
##  3rd Qu.:2019-10-01   3rd Qu.:203062  
##  Max.   :2019-12-31   Max.   :230409
#Menampilkan Histogram 
hist(terbang$penerbangan, main = "Histogram Sebaran Jumlah Penerbangan \nBandar Udara Juanda Selama 2019",
     xlab = "Jumlah Penerbangan", ylab = "Frekuensi")
plot of chunk unnamed-chunk-4
Histogram

#Plot data harian
plot(ts(terbang$penerbangan, start = 2019, frequency = 365),
     main = "Jumlah Penerbangan Non-Komersil Harian \nBandar Udara Juanda Selama 2019",
     ylab = "Jumlah Penerbangan", xlab = "Periode")
plot of chunk unnamed-chunk-4
Plot data harian

#Mengubah data harian menjadi data mingguan
terbang$minggu <- floor_date(terbang$periode, "week")
terbang %>%
  group_by(minggu) %>%
  summarize(jumlah = sum(penerbangan))
## # A tibble: 53 x 2
##    minggu      jumlah
##    <date>       <dbl>
##  1 2018-12-30  795004
##  2 2019-01-06 1139166
##  3 2019-01-13 1123597
##  4 2019-01-20 1150497
##  5 2019-01-27 1143284
##  6 2019-02-03 1130726
##  7 2019-02-10 1167594
##  8 2019-02-17 1188634
##  9 2019-02-24 1213346
## 10 2019-03-03 1189471
## # ... with 43 more rows
#Visualisasi data mingguan
w <- terbang %>%
  group_by(minggu) %>%
  summarize(jumlah = sum(penerbangan))
plot(ts(w$jumlah, start = 2019, frequency = 53),
     main = "Jumlah Penerbangan Non-Komersil Mingguan \nBandar Udara Juanda Selama 2019",
     ylab = "Jumlah Penerbangan", xlab = "Periode")
plot of chunk unnamed-chunk-5
Plot data mingguan

#Mengubah data harian menjadi bulanan
terbang$bulan <- floor_date(terbang$periode, "month")
terbang %>%
  group_by(bulan) %>%
  summarize(jumlah = sum(penerbangan))
## # A tibble: 12 x 2
##    bulan       jumlah
##    <date>       <dbl>
##  1 2019-01-01 5030796
##  2 2019-02-01 4687711
##  3 2019-03-01 5480727
##  4 2019-04-01 5568775
##  5 2019-05-01 5939960
##  6 2019-06-01 6141644
##  7 2019-07-01 6527801
##  8 2019-08-01 6525953
##  9 2019-09-01 6096469
## 10 2019-10-01 6005009
## 11 2019-11-01 5510504
## 12 2019-12-01 5476661
#Visualisasi data mingguan
m <- terbang %>%
  group_by(bulan) %>%
  summarize(jumlah = sum(penerbangan))
plot(ts(m$jumlah, start = 2019.1, frequency = 12),
     main = "Jumlah Penerbangan Non-Komersil Bulanan \nBandar Udara Juanda Selama 2019",
     ylab = "Jumlah Penerbangan", xlab = "Periode")
plot of chunk unnamed-chunk-6
Plot data bulanan

#Mengubah data bulanan menjadi data triwulanan
terbang %>%
  mutate(quarter = paste(quarters(periode), year(periode)), year = year(periode)) %>%
  group_by(quarter, year, .add = T) %>%
  summarise(jumlah = sum(penerbangan)) %>%
  arrange(year)
## `summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.
## # A tibble: 4 x 3
## # Groups:   quarter [4]
##   quarter  year   jumlah
##   <chr>   <dbl>    <dbl>
## 1 Q1 2019  2019 15199234
## 2 Q2 2019  2019 17650379
## 3 Q3 2019  2019 19150223
## 4 Q4 2019  2019 16992174
#Visualisasi data
x <- terbang %>%
  mutate(triwulan = paste(quarters(periode), year(periode)), tahun = year(periode)) %>%
  group_by(triwulan, tahun, .add = T) %>%
  summarise(jumlah = sum(penerbangan)) %>%
  arrange(tahun)
## `summarise()` has grouped output by 'triwulan'. You can override using the `.groups` argument.
x[-2]
## # A tibble: 4 x 2
## # Groups:   triwulan [4]
##   triwulan   jumlah
##   <chr>       <dbl>
## 1 Q1 2019  15199234
## 2 Q2 2019  17650379
## 3 Q3 2019  19150223
## 4 Q4 2019  16992174
plot(ts(x$jumlah, start = 2020, frequency = 4), type = "l", col = "blue",
     main = "Jumlah Penerbangan Non-Komersil Triwulanan \nBandar Udara Juanda Selama 2019",
     ylab = "Jumlah Penerbangan", xlab = "Periode")
plot of chunk unnamed-chunk-7
Plot data triwulanan

#Mengubah data bulanan menjadi data tahunan
terbang %>%
  mutate(tahun = paste(year(periode)), tahun = year(periode)) %>%
  group_by(tahun, .add = T) %>%
  summarise(jumlah = sum(penerbangan))
## # A tibble: 1 x 2
##   tahun   jumlah
##   <dbl>    <dbl>
## 1  2019 68992010

Demikian sekilas bagaimana kita melakukan data manipulation menggunakan R menggunakan package lubridate dan dplyr. Selamat memahami dan mempraktikkan!