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

Blog Banner Twitter Sentiment Analysis 5

“The more complex the world situation becomes, the more scientific and rational analysis you have to have, the less you can do with simple good will and sentiment.”

~ Reinhold Niebuhr

Akhirnya (setelah berpanjang-panjang), sampailah kita pada pembahasan yang paling ditunggu-tunggu, hands-on sentiment analysis with R! Prok prok prok.. 😀

Material yang akan kita analisis sentimennya adalah tweet konsumen maupun media, tentang aplikasi transportasi online, yaitu Go-Jek, Grab, dan Uber. Sebelum dimulai, mohon dibaca peringatan berikut ini:

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

Untuk mendapatkan sekilas insight mengenai Go-Jek, Grab, dan Uber, silakan baca blok kutipan di bawah ini:

GO-JEK (PT. Aplikasi Karya Anak Bangsa) is an Indonesian-owned and run technology startup that specialises in ride-hailing, logistics and digital payments. It is Indonesia’s first “unicorn” startup, and the only company in South East Asia that made it into Fortune’s 2017 list of “50 Companies That Changed the World,” ranking at number 17 alongside Apple (3rd), Unilever (21st), and Microsoft (25th).

~ The Conversation, CNBC, Fortune

 

“GrabTaxi Holdings Pte. Ltd. (branded as simply Grab) is a Singapore-based technology company that offers ride-hailing, ride sharing, and logistics services through its app in Singapore and neighbouring Southeast Asian nations Malaysia, Indonesia, Philippines, Vietnam, Thailand, Myanmar, and Cambodia.

Grab will open a new major development centre and office in Seattle that will serve as a tech hub to attract talent in the United States.”

~ Tech Crunch

 

Uber Technologies Inc. (doing business as Uber) is a peer-to-peer ridesharing, taxi cab, food delivery, and transportation network company headquartered in San Francisco, California, with operations in 633 cities worldwide. Its platforms can be accessed via its websites and mobile apps. Uber has been prominent in the sharing economy, so much so that the changes in industries as a result of it have been referred to as Uberisation.”

~ The Huffington Post, The Manila Times, CSO

Untuk tahap persiapan (autentikasi ke Twitter API, dll), bisa dibaca kembali di Bermain Twitter dengan R (Part 1) – Preparations.

Metode analisis sentimen yang digunakan di sini adalah metode/algoritma word matching sederhana, yaitu mencocokkan hasil tweet yang kita retrieve dengan database kata-kata yang telah diklasifikasikan dan disimpan dalam file terpisah menurut sentimennya, yaitu sentimen positif (referensi: opinion-lexicon-English/positive-words.txt) vs negatif (referensi: opinion-lexicon-English/negative-words.txt).

Let’s get started! 🙂

 

1. Retrieve Tweet

Setelah melakukan autentikasi Twitter API terlebih dahulu, kita retrieve/kita ambil data tweet dengan perintah berikut ini:

gojek_tweets = searchTwitter("gojek", n=5000, lang="en")
grab_tweets = searchTwitter("grab", n=5000, lang="en")
uber_tweets = searchTwitter("uber", n=5000, lang="en")

Catatan: Tweet yang bisa diretrieve dibatasi hingga tweet sekitar seminggu terakhir.

Penampilan 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

Sumber Gambar: Pengalaman Pribadi.

Ternyata seperti yang bisa kita duga, tweet mengenai Go-Jek dalam Bahasa Inggris tidak banyak, yaitu dari 5000 tweet yang kita minta, hanya terdapat 1492 tweet yang tersedia selama seminggu terakhir.

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

Sumber Gambar: Pengalaman Pribadi.

Sementara untuk tweet mengenai Grab dan Uber tidak ada masalah, terdapat 5000 tweet yang berhasil kita retrieve. Lalu gunakan perintah berikut untuk memastikan jumlah tweet yang berhasil kita ambil datanya:

length(gojek_tweets)
length(grab_tweets)
length(uber_tweets)

Penampakan hasilnya di console, sebagai berikut:

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

Sumber Gambar: Pengalaman Pribadi.

Catatan: Dapat kita lihat bahwa jumlah tweet yang berhasil kita retrieve jomplang sekali untuk Go-Jek. Tentu saja ini akan membuat hasil penelitian kita tidak sempurna, namun kita teruskan dulu saja hingga selesai seluruh proses analisis sentimen, dan di kesempatan lain, kita coba metode yang lebih reliabel dalam penelitiannya (contoh: jumlah sampel dataset kurang lebih harus sama, atau kita coba juga dengan tweet berbahasa Indonesia, biarpun tentu saja mencari database opini dalam Bahasa Indonesia memiliki tantangan tersendiri, terutama di minimnya referensi database).

Untuk melihat beberapa baris awal dari tweet yang kita ambil, gunakan perintah berikut:

#melihat bentuk tweet:
head(gojek_tweets)
head(grab_tweets)
head(uber_tweets)

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

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

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

Sumber Gambar: Pengalaman Pribadi.

Voila! Kita berhasil mendapatkan cuitan-cuitan mengenai Go-Jek, Grab, serta Uber dengan baik. Selanjutnya, kita masuk ke tahap preprocessing data. 🙂

 

2. Preprocessing Data

Sebelum melakukan analisis sentimen, terlebih dahulu kita harus membersihkan tweet dari elemen-elemen yang tidak relevan, seperti: URL, hashtag, tanda kutip (punctuation marks), angka-angka, spasi yang tidak diperlukan, dan juga simbol retweet.

Kita lakukan pembersihan data menggunakan kode blok berikut (jika ingin menyelami detil program serta tahap pengerjaannya, dapat dibaca di bagian comment (setelah tanda #) pada kode blok di bawah):

#cleaning text from meta informations, URLs, #hashtags, punctuation marks, numbers, unnecessary spaces, retweets (RTs)

#gunakan code blocks berikut:
gojekTweets <- sapply(gojek_tweets, function(x) x$getText())
grabTweets <- sapply(grab_tweets, function(x) x$getText())
uberTweets <- sapply(uber_tweets, function(x) x$getText())

catch.error = function(x)
{
#buat missing value untuk tujuan tes
y = NA
#test untuk mengecek error (NA) yang telah kita dibuat
catch_error = tryCatch(tolower(x), error=function(e) e)
#if not an error
if (!inherits(catch_error, "error"))
y = tolower(x)
#check result if error exists, otherwise the function works fine
return(y)
}

cleanTweets <- function(tweet) {
#bersihkan tweet untuk sentiment analysis
#remove html links:
tweet = gsub("(f|ht)(tp)(s?)(://)(.*)[.|/](.*)", " ", tweet)
#remove retweet entities:
tweet = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", " ", tweet)
#remove #hashtags:
tweet = gsub("#\\w+", " ", tweet)
#remove all "@people":
tweet = gsub("@\\w+", " ", tweet)
#remove all punctuations:
tweet = gsub("[[:punct:]]", " ", tweet)
#remove numbers, kita hanya butuh teks untuk analytics
tweet = gsub("[[:digit:]]", " ", tweet)
#remove unnecessary spaces (white spaces, tabs, etc)
tweet = gsub("[ \t]{2,}", " ", tweet)
tweet = gsub("^\\s+|\\s+$", "", tweet)
#jika ada lagi yang dirasa ingin dihilangkan, bisa. Contohnya, slang words/bahasa gaul dapat dihilangkan dengan cara serupa di atas.
#ubah semua kata menjadi lowercase:
tweet = catch.error(tweet)
tweet
}

cleanTweetsAndRemoveNAs <- function(Tweets) {
TweetsCleaned = sapply(Tweets, cleanTweets)
#remove "NA" tweets:
TweetsCleaned = TweetsCleaned[!is.na(TweetsCleaned)]
names(TweetsCleaned) = NULL
#remove repetitive tweets:
TweetsCleaned = unique(TweetsCleaned)
TweetsCleaned
}

gojekTweetsCleaned = cleanTweetsAndRemoveNAs(gojekTweets)
grabTweetsCleaned = cleanTweetsAndRemoveNAs(grabTweets)
uberTweetsCleaned = cleanTweetsAndRemoveNAs(uberTweets)

#cek jumlah tweets setelah pembersihan:
length(gojekTweetsCleaned)
length(grabTweetsCleaned)
length(uberTweetsCleaned)

Berikut ini jumlah tweet yang tersisa setelah tahap pembersihan:

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

Sumber Gambar: Pengalaman Pribadi.

Banyak sekali tweet yang terbuang ya ternyata? Hehehe. 😀

Dan masih kita lihat, bahwa data untuk Go-Jek masih jomplang sekali jumlahnya.

Catatan: Tidak semua tweet dapat merepresentasikan sentimen. Suatu tweet bisa jadi isinya berupa informasi/fakta, dan bukan opini/sentimen dari konsumen.

Selanjutnya, mari kita download database opinion lexicon berbahasa Inggris seperti yang saya sebutkan referensinya di atas tadi (sentimen positif: opinion-lexicon-English/positive-words.txt vs negatif: opinion-lexicon-English/negative-words.txt). Sebelumnya, kita cek dulu working directory kita, karena sebaiknya file opinion lexicon telah berada di working directory kita, agar tidak menyulitkan.

Setelah selesai mengunduh opinion lexicon, silakan copaskan ke working directory anda.

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

Sumber Gambar: Pengalaman Pribadi.

Untuk mengecek apakah opinion lexiconnya sudah dapat kita gunakan, kita bisa cek ada berapa baris kata yang berada dalam database kita, dengan perintah berikut:

opinion.lexicon.pos = scan("opinion-lexicon-English/positive-words.txt", what = "character", comment.char = ";")
opinion.lexicon.neg = scan("opinion-lexicon-English/negative-words.txt", what = "character", comment.char = ";")

Lalu, untuk melihat contoh dari beberapa kata untuk opini positif maupun negatif, dengan perintah berikut:

head(opinion.lexicon.pos)
head(opinion.lexicon.neg)

Berikut ini, tampilan 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

Sumber Gambar: Pengalaman Pribadi.

Opinion lexicon yang akan kita gunakan, telah diriset dengan sangat baik, dan telah banyak digunakan dalam berbagai publikasi/riset, namun di sisi lain tetap customizable, dan dengan mudah dapat kita tambahkan kata-kata/term dalam database tersebut. Cara menambahkannya sangat mudah, seperti contoh berikut ini:

pos.words = c(opinion.lexicon.pos, "upgrade")
neg.words = c(opinion.lexicon.neg, "wait", "waiting", "wtf", "cancel", "cancellation")

Voila! Kita berhasil menambahkan beberapa istilah lagi ke dalam database opinion lexicon kita. 🙂

 

3. Hitung Sentimen

Selanjutnya, kita dapat menghitung sentimen setiap tweet menggunakan algoritma word matching, seperti yang kita bahas di bagian pengantar tadi, dengan code block berikut ini:

#membuat fungsi score.sentiment(), yang bisa menghitung hasil sentimen mentah berdasarkan algoritma pencocokan sederhana:
getSentimentScore = function(sentences, pos.words, neg.words, .progress = "none")
{
require(plyr)
require(stringr)

scores = laply(sentences, function(sentence, pos.words, neg.words) {
#remove digit, punctuation, dan special/control character:
sentence = gsub("[[:cntrl:]]", "", gsub("[[:punct:]]", "", gsub("\\d+", "", sentence)))

#convert semua teks menjadi lowercase:
sentence = tolower(sentence)

#pisahkan setiap kalimat menggunakan spasi (space delimiter):
words = unlist(str_split(sentence, "\\s+"))

#lakukan boolean match dari setiap kata-kata menggunakan pos & neg opinion-lexicon:
pos.matches = !is.na(match(words, pos.words))
neg.matches = !is.na(match(words, neg.words))

#score sentimen = total positive sentiment - total negative:
score = sum(pos.matches) - sum(neg.matches)

return(score)
}, pos.words, neg.words, .progress=.progress)

#return data frame berisi kalimat beserta sentimennya:
return(data.frame(text = sentences, score = scores))
}

#terapkan ke data tweet yang telah kita bersihkan:
gojekResult = getSentimentScore(gojekTweetsCleaned, pos.words, neg.words)
grabResult = getSentimentScore(grabTweetsCleaned, pos.words, neg.words)
uberResult = getSentimentScore(uberTweetsCleaned, pos.words, neg.words)

#export to csv:
write.csv(gojekResult, file = "gojekResult.csv")
write.csv(grabResult, file = "grabResult.csv")
write.csv(uberResult, file = "uberResult.csv")

Apabila penasaran dengan detil tahapannya, silakan diikuti headline/komennya. 😀

Singkat cerita, score sentimen diperoleh dari formula berikut:

score sentiment = total positive sentiment – total negative

Jika score sentiment > 0, dikatakan bahwa sentimen positif.

Score sentiment < 0, berarti sentimen negatif.

Score sentiment = 0, berarti netral.

Berikut ini adalah screenshot dari hasil score sentiment dari Go-Jek (download hasil di sini):

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

Sumber Gambar: Pengalaman Pribadi.

Grab (download hasil di sini):

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

Sumber Gambar: Pengalaman Pribadi.

Uber (download hasil di sini):

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

Sumber Gambar: Pengalaman Pribadi.

Jika kita baca, masih lumayan bikin ngakak juga hasil penggolongan sentimennya. 😀

 

4. Data Visualizations

Kita akan kesulitan untuk mendapatkan insight/bayangan umum mengenai sentimen tweet apabila hanya membacanya satu persatu. Tahap selanjutnya adalah, kita akan melakukan exploratory data analysis, terutama visualisasi data, sehingga kita bisa melihat distribusi atau frekuensi dari sentimen tweet yang kita retrieve.

Visualisasi data yang akan kita terapkan adalah histogram dan scatterplot.

 

a. Histogram

Kita akan buat histogram, untuk memudahkan kita dalam melihat frekuensi kemunculan score sentimen.

Untuk membuat histogram pada dataset kita, jalankan perintah berikut:

#create histogram:
hist(gojekResult$score)
hist(grabResult$score)
hist(uberResult$score)

Sehingga, dapat dengan mudah kita lihat persebaran distribusi dari score sentimen yang kita peroleh.

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

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

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

Sumber Gambar: Pengalaman Pribadi.

 

b. Scatterplot

Selanjutnya, kita akan membuat scatterplot, agar tidak hanya bisa melihat distribusi/frekuensi score sentimen, tapi kita juga bisa memetakan tweet (indeksnya) vs score sentimen.

Berikut ini perintah untuk membuat scatterplot:

#scatterplot:
plot(gojekResult$score)
plot(grabResult$score)
plot(uberResult$score)

Hasil scatterplot 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

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

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

Sumber Gambar: Pengalaman Pribadi.

 

5. Statistik

Selanjutnya kita hitung nilai rata-rata dan deviasi standar dari score sentimen yang telah kita peroleh, dengan perintah berikut:

#mean:
mean(gojekResult$score)
mean(grabResult$score)
mean(uberResult$score)

#standard deviation:
sd(gojekResult$score)
sd(grabResult$score)
sd(uberResult$score)

Nilai rata-rata (mean) score sentimen, berturut-turut untuk Go-Jek, Grab, dan 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

Sumber Gambar: Pengalaman Pribadi.

Deviasi standar (standard deviation) score sentimen, berturut-turut untuk Go-Jek, Grab, dan 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

Sumber Gambar: Pengalaman Pribadi.

Catatan: hasil nilai mean dan standard deviation di atas tidak bisa dibandingkan secara langsung/tidak reliabel, karena jumlah tweet/sampel data antara Go-Jek, Grab, dan Uber. Sebagai solusi, kita dapat meretrieve ulang, lalu melakukan penelitian ulang, dengan jumlah sampel tweet Grab dan Uber mengikuti jumlah tweet yang sama dengan Go-Jek (pada penelitian kali ini, tersedia n=1492 tweet minggu ini).

Solusi lainnya, kita juga dapat melakukan cross validation pada sampel data yang ada, dengan memotong/menyamakan jumlah sampel tweet Grab dan Uber agar sama dengan Go-Jek terlebih dahulu.

 

6. Komentar dan Pekerjaan Selanjutnya

Berikut ini beberapa komentar serta pekerjaan lanjutan dari penelitian ini.

a. Menyamakan Jumlah Sampel Data

Seperti dibahas di atas, ketidaksamaan jumlah sampel akan menyebabkan hasil penelitian menjadi tidak reliabel untuk dibandingkan satu sama lainnya. Sebagai solusi, kita dapat meretrieve ulang, lalu melakukan penelitian ulang (namun dengan metode yang sama), dengan jumlah sampel tweet Grab dan Uber mengikuti jumlah tweet yang sama dengan Go-Jek (pada penelitian kali ini, tersedia n=1492 tweet minggu ini).

Solusi lainnya, kita juga bisa melakukan cross validation pada sampel data yang ada, dengan memotong/menyamakan jumlah sampel tweet Grab dan Uber agar sama dengan Go-Jek terlebih dahulu.

 

b. Menggunakan Algoritma Naive Bayes

Algoritma pencocokan tweet dengan opinion lexicon (simple word matching) adalah cara yang sederhana, cepat dan mudah untuk mendapatkan insight kasar dari sentimen suatu teks. Jika kita baca sekilas, dapat kita lihat bahwa algoritma ini bekerja cukup baik pada sentimen/opini konsumen secara umum. Namun hasilnya tidak reliabel apabila tweet/data yang digunakan tidak berhubungan dengan opini konsumen mengenai layanan dari transportasi-transportasi online tersebut.

Pada kesempatan berikutnya, kita akan menggunakan algoritma Naive Bayes untuk melihat secara lebih detail emosi yang muncul dari setiap tweet. Stay tuned! 🙂

 

c. Memvisualisasikan Hasil Sentimen dengan Lebih Baik

Visualisasi data dengan histogram atau scatterplot mungkin kurang eyecatching atau kurang nyaman untuk yang tidak terbiasa menggunakannya, sehingga diperlukan metode visualisasi data yang lebih enak dinikmati dan lebih straightforward.

 

d. Melakukan Sentimen Analisis dengan Tweet Berbahasa Indonesia

Dan yang terakhir, sekaligus yang paling menantang adalah melakukan sentimen analisis berbahasa Indonesia, mengingat masih minimnya sumber lexicon/database kosa kata untuk Natural Language Processing berbahasa Indonesia. 🙂

 

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

 

References & Further Reading

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

Follow and like us:

9 tanggapan pada “Bermain Twitter dengan R (Part 5) – Sentiment Analysis (Go-Jek vs Grab vs Uber)”

  1. Pingback: Bermain Twitter dengan R (Part 6) – Sentiment Analysis dengan Naive Bayes (Go-Jek vs Grab vs Uber) - hakim-azizul.com

    1. Halo Mas Aji, salam kenal ya Mas. 🙂
      Boleh dikirimkan ke mari Mas, screenshot error messagenya?
      Siapa tahu saya atau pengunjung di sini bisa bantu cari solusinya.

      Dugaan sementara saya, penyebab errornya kemungkinan saat pencocokan tweet dengan database opinion lexicon.
      Karena, jika tweet yang Mas retrieve dan akan diolah berbahasa Indonesia, Maka opinion lexicon yg harus didownload dan dijadikan referensi adalah opinion lexicon yang berbahasa Indonesia juga. Silakan cek di sini: https://github.com/masdevid/ID-OpinionWords

      Semoga membantu 🙂

    1. Salam kenal Mas Kara. 🙂

      Wah, sepertinya ada kesalahan ketika saya migrasi konten dari blog ke website Mas, untuk code snippetnya.
      Jadi, setiap:
      gojekTweets &amp;lt;- sapply(gojek_tweets, function(x) x$getText()),
      Yang benarnya adalah:
      gojekTweets <- sapply(gojek_tweets, function(x) x$getText())

  2. Oiya mas, saya mendapati sebuah error pada syntax Result.

    Ouput yang dihasilkan invalid input ‘when you got sumanto as your gojek driver ðŸ™€ðŸ™€í ½ gonna come and beat me up’ in ‘utf8towcs’.

    Mohon solusinya, terimakasih.

Tinggalkan Balasan

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