Bermain Twitter dengan R (Part 6) – Sentiment Analysis dengan Naive Bayes (Go-Jek vs Grab vs Uber)

twitter sentiment analysis r naive bayes hakim-azizul.com

“Twitter and Facebook are brilliant- tools, the journalistic uses of which are still being plumbed. They are great for disseminating interesting material. They are useful for gathering information, including from places that are inaccessible.”

~ Bill Keller

Akhirnya, sampai juga kita di penghujung bagian dari pembahasan dasar sentiment analysis post Twitter menggunakan bahasa pemrograman R. 🙂

Di bagian akhir ini, kita juga akan hands on, dan tidak kalah seru (dan panjangnya) dibandingkan part 5, bahkan kita akan melengkapinya (dan lebih seru). Jika pada post part 5, kita hanya memanfaatkan algoritma word matching sederhana untuk melakukan sentiment analysis, di part 6 ini, kita akan melakukan sentiment analysis dengan algoritma yang lebih advanced, yaitu Naive Bayes. Algoritma Naive Bayes ini memungkinkan kita untuk mengkategorikan emosi yang muncul pada tweet.

Jika dirasa perlu untuk mereview kembali apa itu Naive Bayes, bisa dibaca di Bermain Twitter dengan R (Part 4) – Pengantar Algoritma Klasifikasi Sentimen, sedangkan, untuk dasar dari sentiment analysis bisa dibaca di Bermain Twitter dengan R (Part 3) – Pengantar Sentiment Analysis.

Selamat membaca dan mempraktekkan, semoga bermanfaat selalu. Enjoy! 😀

Peringatan: Sentimen analisis ini dilakukan dengan tujuan penelitian/edukasi semata (educational purposes only), tanpa bertujuan untuk mempromosikan apalagi menjatuhkan brand tertentu.

 

1. Mengklasifikasikan Kategori Emosi Tweet

Untuk melakukan analisis sentimen menggunakan algoritma Naive Bayes pada R, dibutuhkan package Rstem dan sentiment. Namun sayang sekali kedua package tersebut sudah tidak disupport oleh CRAN (The Comprehensive R Archive Network), bahkan Rstem telah digantikan oleh package SnowBallC, dan package sentiment, kita hanya bisa mengunduh package yang telah lampau.

Untuk menginstall package SnowBallC dan sentiment, gunakanlah script dibawah ini:

install.packages("Rstem", repos="http://www.omegahat.net/R", type="source")

#jika Rstem sudah tidak available, ganti dengan SnowballC
install.packages("SnowballC", repos='http://cran.us.r-project.org')

#install package sentiment
require(devtools)
install_url("http://cran.r-project.org/src/contrib/Archive/sentiment/sentiment_0.2.tar.gz")
require(sentiment)
ls("package:sentiment")

Berikut ini adalah function yang tersedia pada package sentiment:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Perlu diingat, seperti telah disebutkan pada Bermain Twitter dengan R (Part 1) – Preparations, versi R yang digunakan pada seluruh penelitian di sini adalah R 3.1.0 atau “Spring Dance” (versi yang juga sama dengan yang disarankan pada referensi/Ravindran et. al (2015). Dari pengalaman saya mencoba beraneka versi R (v3.2.2, 3.4.3, dan 3.5.1), semuanya tidak kompatibel dengan mayoritas package yang digunakan pada sentiment analysis yang di demonstrasikan di sini.

Untuk menerapkan bayes classifier untuk analisis sentimen, gunakanlah code block di bawah ini:

#implementasikan bayes classifier untuk sentiment analysis:
library(sentiment)

#classify_emotion function returns an object of class data frame with 7 columns (anger, disgust, fear, joy, sadness, surprise, best_fit) and one row for each document:
gojekTweetsClassEmo = classify_emotion(gojekTweetsCleaned, algorithm="bayes", prior=1.0)
grabTweetsClassEmo = classify_emotion(grabTweetsCleaned, algorithm="bayes", prior=1.0)
uberTweetsClassEmo = classify_emotion(uberTweetsCleaned, algorithm="bayes", prior=1.0)

Script di atas berfungsi untuk mengklasifikasikan tweet menjadi 7 kolom (6 kolom emosi: anger (marah), disgust (jijik), fear (takut), joy (gembira), sadness (sedih), surprise (terkejut), dan 1 kolom best fit). Package sentiment dibangun dari trained dataset berupa kumpulan sekitar 1500 kata yang merepresentasikan emosi.

Selanjutnya, contoh hasil klasifikasi sentimen dapat dilihat, menggunakan script di bawah:

#lihat contoh teratas hasil klasifikasi sentimen:
#hasil klasifikasi sentimen/emosi dicantumkan pada kolom best_fit, jika sistem tidak bisa mengestimasi emosi, sistem akan menuliskan "NA"
head(gojekTweetsClassEmo, 20)
head(grabTweetsClassEmo, 20)
head(uberTweetsClassEmo, 20)

Penampakan di console:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Dari hasil best_fit pada console di atas, dapat kita lihat bahwa, sistem akan memberikan nilai “NA”, apabila ia tidak bisa menggolongkan emosi pada tweet.

Untuk memudahkan analisis lebih lanjut, kita ganti nilai NA dengan unknown, menggunakan codeblock di bawah ini:

#ganti NA dengan unknown
#pilih kolom ke-7 atau best_fit:
gojekEmotion = gojekTweetsClassEmo[,7]
grabEmotion = grabTweetsClassEmo[,7]
uberEmotion = uberTweetsClassEmo[,7]

gojekEmotion[is.na(gojekEmotion)] = "unknown"
grabEmotion[is.na(grabEmotion)] = "unknown"
uberEmotion[is.na(uberEmotion)] = "unknown"

#lihat hasilnya:
head(gojekEmotion, 20)
head(grabEmotion, 20)
head(uberEmotion, 20)

Hasil setelah penggantian NA menjadi unknown:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Voila! Kita berhasil mengklasifikasikan tweet pada 6 kategori emosi. 🙂

Selanjutnya; yang tidak kalah menariknya, kita akan melihat kecenderungan polaritas sentimen pada tweet. Apakah condong ke sentimen positif, negatif, atau netral.

 

2. Mengklasifikasikan Polaritas Tweet

Masih menggunakan algoritma Naive Bayes; selanjutnya kita akan memanfaatkan function classify_polarity() pada package sentiment, untuk mengklasifikasikan tweet menjadi dua kelas, yaitu pos (opini/sentimen positif) dan neg (opini/sentimen negatif).

Klasifikasi kelas ini diperoleh dengan menghitung log likelihood (kebolehjadian) dari suatu tweet, dengan mengasumsikannya berada di salah satu dari dua kelas yang ada. Setelah nilai likelihood dihitung, rasio dari pos-likelihood terhadap neg-likelihood juga dihitung, dan dari hasil rasio ini, diperolehlah nilai untuk mengklasifikasikan tweet pada salah satu kelas yang ada.

Klasifikasi ke kelas netral diperoleh apabila hasil perhitungan rasio di atas, nilainya sama dengan 1. Code block untuk mengklasifikasikannya, sebagai berikut:

#measure polarity (pos, neg, neutral):
gojekTweetsClassPol = classify_polarity(gojekTweetsCleaned, algorithm = "bayes")
grabTweetsClassPol = classify_polarity(grabTweetsCleaned, algorithm = "bayes")
uberTweetsClassPol = classify_polarity(uberTweetsCleaned, algorithm = "bayes")

#lihat hasilnya:
head(gojekTweetsClassPol, 20)
head(grabTweetsClassPol, 20)
head(uberTweetsClassPol, 20)

Hasil pada console:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Voila! Tak hanya mengklasifikasikan berdasarkan emosi, kita juga telah berhasil melihat kecondongan/polaritas tweet, ke arah opini positif, negatif, atau netral.

 

3. Visualisasi Sentimen Tweet

Sebelum memvisualisasikan hasil klasifikasi emosi dan polaritas sentimen, terlebih dahulu kita buat data frame untuk hasil yang telah kita peroleh. Buat data frame dengan code block di bawah:

#fetch polarity category best_fit for our analysis purposes:
gojekPol = gojekTweetsClassPol[,4]
grabPol = grabTweetsClassPol[,4]
uberPol = uberTweetsClassPol[,4]

#lihat hasilnya:
head(gojekPol, 20)
head(grabPol, 20)
head(uberPol, 20)

#buat data frame dari hasil di atas:
gojekSentimenDataFrame = data.frame(text=gojekTweetsCleaned, emotion=gojekEmotion, polarity=gojekPol, stringAsFactors=FALSE)
grabSentimentDataFrame = data.frame(text=grabTweetsCleaned, emotion=grabEmotion, polarity=grabPol, stringAsFactors=FALSE)
uberSentimentDataFrame = data.frame(text=uberTweetsCleaned, emotion=uberEmotion, polarity=uberPol, stringAsFactors=FALSE)

Selanjutnya, sort data dan lihat hasilnya dengan script berikut:

#rearrange data inside the frame, sorting it
gojekSentimenDataFrame = within(gojekSentimenDataFrame, emotion <- factor(emotion, levels=names(sort(table(emotion), decreasing=TRUE))))
grabSentimentDataFrame = within(grabSentimentDataFrame, emotion <- factor(emotion, levels=names(sort(table(emotion), decreasing=TRUE))))
uberSentimentDataFrame = within(uberSentimentDataFrame, emotion <- factor(emotion, levels=names(sort(table(emotion), decreasing=TRUE))))

#lihat data frame:
head(gojekSentimenDataFrame, 20)
head(grabSentimentDataFrame, 20)
head(uberSentimentDataFrame, 20)

Done! Selanjutnya mari kita mulai proses visualisasi data, untuk memudahkan kita memperoleh insight dari hasil analisis sentimen yang telah kita lakukan.

a. Visualisasi Emosi

Untuk membuat visualisasi data menggunakan R, kita membutuhkan package ggplot2.

Berikut ini adalah perintah untuk instalasi package ggplot2:

#install ggplot2:
require(devtools)
install.packages("ggplot2", repos='http://cran.us.r-project.org')
require(ggplot2)
ls("package:ggplot2")

Catatan: Apabila terdapat error dalam instalasi package akibat dependencies dengan package lainnya (dan packages tersebut tidak dapat terinstall secara otomatis), silakan coba install packages berikut terlebih dahulu (requirements ggplot dan ggplot2):

#install ggplot requirements:
install.packages("RColorBrewer", repos='http://cran.us.r-project.org')
install.packages("reshape", repos='http://cran.us.r-project.org')

#install ggplot2 requirements:
install.packages("digest", repos='http://cran.us.r-project.org')
install.packages("gtable", repos='http://cran.us.r-project.org')
install.packages("lazyeval", repos='http://cran.us.r-project.org')
install.packages("reshape2", repos='http://cran.us.r-project.org')
install.packages("scales", repos='http://cran.us.r-project.org')
install.packages("tibble", repos='http://cran.us.r-project.org')
install.packages("cli", repos='http://cran.us.r-project.org')
install.packages("pillar", repos='http://cran.us.r-project.org')
install.packages("rlang", repos='http://cran.us.r-project.org')

Apabila masih gagal juga, coba upgrade atau downgrade versi R anda, dengan sebelumnya telah menyimpan workspace anda terlebih dahulu, agar dapat langsung dijalankan, pada versi R yang berbeda. Seperti yang saya bahas sebelumnya, kemungkinan akan terdapat banyak error pada saat instalasi packages. Selain downgrade ataupun upgrade versi R yang digunakan, anda juga dapat mencoba untuk downgrade versi packages yang akan diinstall, atau mencoba menginstall packages dari sumber repositori yang anda gunakan sebelumnya.

Saya sendiri belum mengetahui sebab errornya dengan pasti, dan saya perlu tweaking dan troubleshooting (and lots of googling) berjam-jam hingga mendapatkan hasil seperti tercantum pada tulisan ini. Tetap semangat dan banyak berdoa guys! 😀

Buat visualisasi emosi pada tweet, dengan menjalankan code block berikut:

#function for plotting
plotSentiments1 <- function(sentiment_dataframe, title) 
{
    library(ggplot2)
    ggplot(sentiment_dataframe, aes(x=emotion)) + 
    geom_bar(aes(y=..count.., fill=emotion)) + 
    scale_fill_brewer(palette="Dark2") + 
    ggtitle(title) + 
    theme(legend.position="right") + 
    ylab("Number of Tweets") + 
    xlab("Emotion Categories")
}

#plotting tweets emotions
plotSentiments1(gojekSentimenDataFrame, "Sentiment Analysis of Tweets on Twitter about Go-Jek")
plotSentiments1(grabSentimentDataFrame, "Sentiment Analysis of Tweets on Twitter about Grab")
plotSentiments1(uberSentimentDataFrame, "Sentiment Analysis of Tweets on Twitter about Uber")

Voila! Berikut ini, hasil visualisasi emosi pada tweet tentang Go-Jek:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Grab:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Uber:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Apabila kita abaikan terlebih dahulu hasil “unknown”, maka dapat kita lihat, mayoritas emosi yang hadir pada tweet mengenai tiga startup transportasi online tersebut adalah joy, atau kegembiraan/suka cita. 🙂

 

b. Visualisasi Polaritas

Selanjutnya, visualisasikan polaritas opini/sentimen pada tweet, dengan perintah berikut:

#tinjau polaritas sentimen (positif vs negatif), untuk melihat tingkat kepuasan pelanggan:
#plot distribusi polaritas tweet:
plotSentiments2 <- function(sentiment_dataframe, title)
{
    library(ggplot2)
    ggplot(sentiment_dataframe, aes(x=polarity)) +
    geom_bar(aes(y=..count.., fill=polarity)) +
    scale_fill_brewer(palette="RdGy") +
    ggtitle(title) +
    theme(legend.position="right") +
    ylab("Number of Tweets") +
    xlab("Polarity Categories")
}

#plotting tweets polarity
plotSentiments2(gojekSentimenDataFrame, "Polarity Analysis of Tweets on Twitter about Go-Jek")
plotSentiments2(grabSentimentDataFrame, "Polarity Analysis of Tweets on Twitter about Grab")
plotSentiments2(uberSentimentDataFrame, "Polarity Analysis of Tweets on Twitter about Uber")

Hasil polaritas opini untuk Go-Jek:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Grab:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Uber:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Congratulations for Go-Jek, Grab and Uber! Mayoritas hasil dari polaritas opini adalah sentimen positif! 🙂

 

c. Wordcloud

Terakhir, untuk mendapatkan insight/sense mengenai isi tweet yang tersedia, mari kita generate wordcloud dari hasil tweet yang telah kita preprocessing.

Install package wordcloud terlebih dahulu:

#install wordcloud:
install.packages("wordcloud", repos='http://cran.us.r-project.org')

Generate wordcloud dengan codeblock berikut:

removeCustomWords <- function(TweetsCleaned)
{
    for(i in 1:length(TweetsCleaned)){
        TweetsCleaned[i] <- tryCatch({
            TweetsCleaned[i] = removeWords(TweetsCleaned[i], 
            c(stopwords("english"), "care", "guys", "can", "dis", "didn", "guy", "booked", "plz"))
            TweetsCleaned[i]
            }, error=function(cond) {
            TweetsCleaned[i]
            }, warning=function(cond) {
            TweetsCleaned[i]
            })
    }
    return(TweetsCleaned)
}

getWordCloud <- function(sentiment_dataframe, TweetsCleaned, Emotion)
{
    library(tm)
    library(wordcloud)
    emos = levels(factor(sentiment_dataframe$emotion))
    n_emos = length(emos)
    emo.docs = rep("", n_emos)
    TweetsCleaned = removeCustomWords(TweetsCleaned)
    
    for(i in 1:n_emos){
        emo.docs[i] = paste(TweetsCleaned[Emotion == emos[i]], collapse=" ")
    }
    corpus <- Corpus(VectorSource(emo.docs))
    tdm = TermDocumentMatrix(corpus)
    tdm = as.matrix(tdm)
    colnames(tdm) = emos
    #require(wordcloud)
    suppressWarnings(comparison.cloud(tdm, colors = brewer.pal(n_emos, "Dark2"), scale = c(3,.5), random.order = FALSE, title.size = 1.5))
}

getWordCloud(gojekSentimenDataFrame, gojekTweetsCleaned, gojekEmotion)
getWordCloud(grabSentimentDataFrame, grabTweetsCleaned, grabEmotion)
getWordCloud(uberSentimentDataFrame, uberTweetsCleaned, uberEmotion)

Wordcloud Go-Jek:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Grab:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Uber:

Data Scientist, Data Science, Machine Learning, Statistics, Data Science Indonesia, Data Analytics, Data Analysis, Data Analyst, Data, Astronomy, Astronomer, Science, Python, iPython, Jupyter Notebook, R, RStudio, Excel, Coding, Koding, Cara Mengolah Data, Mengolah Data, Olah Data, Programming, Pemrograman, Sains, Teknologi, Ilmu Data, Teknologi Informasi, Tech in Asia, Teknologi, Technology, Sains, Bisnis, Business, Business Analyst, Business Analysis, Social Media Mining, Movie Review, Muhammad Azizul Hakim, Aziz, Indonesia, ID, Singapore, Asia, Southeast Asia

Sumber Gambar: Pengalaman Pribadi.

Done! Kita telah selesai melakukan end-to-end sentiment analysis untuk contoh 3 bisnis, yaitu Go-Jek, Grab, dan Uber, yaay!

 

4. Komentar

Dari artikel “Bermain Twitter dengan R”, dari bagian 1 hingga 6, kita telah mengetahui beragam fitur yang disediakan oleh Twitter API. Kita juga telah mencoba melihat trending topic pada suatu daerah, mencari/search tweet, kita retrieve, lalu kumpulkan menjadi data frame, dan kita analisis sentimennya menggunakan dua algoritma, yaitu simple word matching algorithm dan Naive Bayes classifier.

Kita telah lihat bersama bahwa dengan memanfaatkan media sosial, dalam contoh kali ini Twitter, kita dapat melihat respon/penilaian customer serta media mengenai suatu bisnis, yang di sisi lain metode ini juga dapat dimanfaatkan oleh analis atau pemilik bisnis untuk menjadi metric/tolok ukur untuk menilai performa bisnis mereka sendiri berdasarkan penilaian/komentar pelanggan di media sosial.

Penelitian ini pun dapat dilakukan secara kontinu, untuk melihat perubahan atau tren respon/sentimen pelanggan (mengingat bahwa layanan Twitter API hanya memungkinkan kita untuk meretrieve tweet seminggu ke belakang).

 

5. What Next?

Selanjutnya, akan lebih menarik jika kita eksplor juga kemungkinan-kemungkinan berikut:

  1. Membandingkan hasil sentimen yang diperoleh, dengan tren pencarian di mesin pencari.
  2. Menggunakan metode sentimen analisis ini pada bidang lain (contoh: menilai sentimen media sosial untuk saham perusahaan atau cryptocurrency yang ingin kita invest, menilai sentimen menjelang pemilu, dll).
  3. Melakukan sentimen analisis dari beragam platform media sosial yang lainnya.
  4. Mencoba metode sentimen analisis di luar yang telah kita bahas di sini.
  5. Dll

Terima kasih telah meluangkan waktu untuk membaca dan mencoba, see you in the next posts! Enjoy! 🙂

 

Baca Juga

Bermain Twitter dengan R (Part 1) – Preparations

Bermain Twitter dengan R (Part 2) – Finding Trending Topics

Bermain Twitter dengan R (Part 3) – Pengantar Sentiment Analysis

Bermain Twitter dengan R (Part 4) – Pengantar Algoritma Klasifikasi Sentimen

Bermain Twitter dengan R (Part 5) – Sentiment Analysis (Go-Jek vs Grab vs Uber)

 

References & Further Reading

Ravindran et. al (2015): Mastering Social Media Mining with R, Packt Publishing.

Follow and like us:

1 tanggapan pada “Bermain Twitter dengan R (Part 6) – Sentiment Analysis dengan Naive Bayes (Go-Jek vs Grab vs Uber)”

  1. mas untuk tahap Visualisasi Sentimen Tweet, ada error di perancangan data frame
    error (Error in sort.list(y) : invalid input) kira2 solusinya bagaimana ya mas ?
    terima kasih sebelumnya

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *