BAB 5 - Analisis Sentimen Netizen Terhadap Calon Presiden
BAB 5 - Analisis Sentimen Netizen Terhadap Calon Presiden
BAB V
KESIMPULAN DAN SARAN
5.1 Kesimpulan
Berdasarkan hasil analisis dan pembahasan yang telah dijelaskan penulis pada
bagian intreprestasi hasil, maka diperoleh beberapa simpulan sebagai berikut.
Pada skenario 1 dengan 60 % data latih atau 315 tweet dan 40% data uji
atau 210 tweet dengan menghasilkan 69,20%. Skenario 2 dengan 70 % data
latih atau 367 tweet dan 30% data uji atau 158 tweet menghasilkan
153
klasifikasi 69,47%. Skenario 3 dengan 80 % data latih atau 420 tweet dan
20% data uji atau 105 tweet menghasilkan 70,23%. Kemudian pada
skenario 4 dengan 90 % data latih atau 472 tweet dan 10% data uji atau 53
tweet menghasilkan klasifikasi 70,76%. Nilai akurasi tersebut menunjukkan
bahwa metode Naïve Bayes Classifier memiliki klasifikasi sentiment yang
cukup baik.
A. Word cloud sentimen positif untuk data tweet positif, diketahui ada
beberapa kata-kata yang paling sering muncul diantaranya: Calon, Presiden,
ganjar pranowo, Ridwan kamil, puan, ganjar, pranowo, Indonesia, dukung,
Indonesia, pilpres, wakil, presiden dan lainnya.
154
B. Word cloud sentimen negatif untuk data tweet pada media social twitter,
diketahui ada beberapa kata-kata yang paling sering muncul diantaranya:
Calon, Presiden, nasdem, cebong, pilpres, pemilu, anies, Prabowo, ganjar
pranowo, Indonesia, Jokowi, Cebong, bodoh dan Lainya.
155
5.2 Saran
Berdasarkan hasil penelitian yang telah dilakukan maka ada beberapa saran yang
disampaikan diantaranya sebagai berikut.
3. Pada Saat proses pelabelan sentimen, sebaiknya lebih banyak lagi orang
yang melabeling (anatator) sehingga pembagian data lebih sedikit sehingga
orang yang melabeli dapat focus melabeling dengan cermat hasil data tweet
ketika menjumpai kaimat awal dan akhir pada proses labeling memudahkan
seorang anatator sehingga hasil labeling dan seleksi data maksimal.
4. Dalam penelitian ini penulis menggunakan data tweet yang diambil pada
tanggal 01 Agustus 2022 s/d 1 November 2022 dengan jumlah tweet data
sebesar adalah 2000 tweet. Untuk penelitian selanjutnya, dapat
menggunakan jumlah data training yang lebih banyak, agar semakin tinggi
akurasi dari pengujian klasifikasi yang dihasilkan dan ketepatan sistem
dalam mengenali data uji akan lebih baik karena machine learning mampu
156
DAFTAR PUSTAKA
Neves, L., Silva, V., Barbieri, F., (2022). “Twitter Topic Classification”.
Jurnal Cardiff University. arXiv:2209.09824v1. DOI :
https://doi.org/10.48550/arXiv.2209.09824
Medhat, W., Hassan, A,. Korashy, H., (2014). “Sentiment analysis algorithms and
applications: A survey”. Ain Shams Engineering Journal. doi :
https://doi.org/10.1016/j.asej.2014.04.011
Darwis, D., Siskawati, N., Abidin, Z,, (2021). “Penerapan Algoritma Naive
Bayes untuk Analisis Sentimen Review Data Twitter BMKG Nasional”. Journal
Teknokompak. Volume 15(1) DOI: https://doi.org/10.33365/jtk.v15i1.744
Seno, D.W., & Wibowo, A., (2019). “Analisis Sentimen Data Twitter
Tentang Pasangan Capres-Cawapres Pemilu 2019 Berbasis Metode Lexicon Dan
159
Support Vector Machine”. Jurnal Ilmiah FIFO. Volume 11(2), pp.144-145. DOI:
http://dx.doi.org/10.22441/fifo.2019.v11i2.004
Frederick, Brian and Elder, Laurel. (2022) "Public Opinion and the Candidate
Spouses in the 2020 Democratic Presidential Primary" The Forum, vol. 20, no. 2,
2022, pp. 275-292. https://doi.org/10.1515/for-2022-2056.
160
Sari, F., & Wibowo, A. (2019). Analisis Sentimen Pelanggan Toko Online jd.id
Menggunakan Metode Naïve Bayes Classifier Berbasis Konversi Ikon
Emosi. Simetris: Jurnal Teknik Mesin, Elektro dan Ilmu Komputer, 10(2), 681-
686. doi:https://doi.org/10.24176/simet.v10i2.3487
Ceswell, John W.. (2010). Research Design John W. Creswell. Yogyakarta: John
W. Creswell.
LAMPIRAN
1. Mengimpor Library
2. Crawling Data
def clean_tweet(tweet):
return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-
9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split())
hasil.to_csv(r'hasilcrawling.csv', index=False)
tweet = pd.read_csv('hasilcrawling.csv')
tweet = pd.DataFrame(tweet)
tweet.to_excel ('hasilcrawling.xlsx', index =
False, header=True)
163
Link:
https://docs.google.com/spreadsheets/d/19bWE_9LoSTZa4KlAf2h8QgenlsmXzG
OeFxkIJWP__qk/edit?usp=sharing
164
1. Analisis Deskriptif
import pandas as pd
df = pd.read_excel("filepreprocessing.xlsx")
df.head(10)
#Analisis Deskriptif
df = pd.read_excel('filepreprocessing.xlsx')
df.sort_index(inplace=True)
df.sample(n=10)
165
2. Teks Preprocessing
Load Data
import pandas as pd
tweets = pd.read_csv('hasilseleksi.csv')
tweets.head()
Cleansing
import re
def cleaningulasan(tweets):
#menghapus mention, link, hashtag
tweets = re.sub(r'@[A-Za-a0-9]+',' ',tweets)
tweets = re.sub(r'#[A-Za-z0-9]+',' ',tweets)
tweets = re.sub(r"http\S+",' ',tweets)
tweets = re.sub(r'[0-9]+',' ',tweets)
tweets = re.sub(r"[-()\"#/@;:<>{}'+=~|.!?,_]",
" ", tweets)
tweets = tweets.strip(' ')
return tweets
tweets['Cleaning']=
tweets['Tweet'].apply(cleaningulasan)
return tweets.encode('ascii',
'ignore').decode('ascii')
tweets['HapusEmoji']=
tweets['Cleaning'].apply(clearEmoji)
def replaceTOM(tweets):
pola = re.compile(r'(.)\1{2,}', re.DOTALL)
return pola.sub(r'\1', tweets)
tweets['3/Lebih']=
tweets['HapusEmoji'].apply(replaceTOM)
Case Folding
def casefoldingText(tweets):
tweets = tweets.lower()
return tweets
tweets['CaseFolding']=
tweets['3/Lebih'].apply(casefoldingText)
Tokenizing
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
def tokenizingText(tweets):
tweets = word_tokenize(tweets)
return tweets
tweets['Tokenizing']=
tweets['CaseFolding'].apply(tokenizingText)
Formalisasi
168
def convertToSlangword(tweets):
kamusSlang = eval(open("slangwords.txt").read())
pattern = re.compile(r'\b( ' + '|'.join
(kamusSlang.keys())+r')\b')
content = []
for kata in tweets:
filterSlang = pattern.sub(lambda x:
kamusSlang[x.group()],kata)
content.append(filterSlang.lower())
tweets = content
return tweets
tweets['Formalisasi'] =
tweets['Tokenizing'].apply(convertToSlangword)
Stopword Removal
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
daftar_stopword = stopwords.words('indonesian')
# ---------------------------- manualy add
stopword ------------------------------------
# append additional stopword
daftar_stopword.extend(["yg","dg","rt"])
daftar_stopword = set(daftar_stopword)
def stopwordText(words):
return [word for word in words if word not in
daftar_stopword]
tweets['Stopword Removal'] =
tweets['Formalisasi'].apply(stopwordText)
169
Stemming
factory = StemmerFactory()
stemmer = factory.create_stemmer()
def stemmed_wrapper(term):
return stemmer.stem(term)
term_dict = {}
def stemmingText(document):
return [term_dict[term] for term in
document]
tweets['Stemming'] = tweets['Stopword
Removal'].swifter.apply(stemmingText)
170
df = pd.read_csv('filepreprocessingutf.csv')
import difflib
#body_list = df['body'].tolist()
review_tweet_list = df['Stemming'].tolist()
#body = body_list
reviews = review_tweet_list
s = difflib.SequenceMatcher(None,
reviews).ratio()
print("Jumlah RRatio:", s,"\n")
fdist = FreqDist(all_words)
171
words_df =
pd.DataFrame({'word':list(fdist.keys()),
'count':list(fdist.values())})
PEMBOBOTAN KATA
from sklearn.feature_extraction.text import
CountVectorizer
from sklearn.feature_extraction.text import
TfidfTransformer
cver = CountVectorizer(stop_words='english',
min_df=1, max_df=.5, ngram_range=(1,2))
cver
cver.fit(review_tweet_list)
list(islice(cver.vocabulary_.items(),20))
len(cver.vocabulary_)
hitung_cver = cver.transform(review_tweet_list)
print('sparse matrix shape:', hitung_cver.shape)
print('hitung nonzero:',hitung_cver.nnz)
print('sparsity: %.2f%%' % (100.0 * hitung_cver.nnz /
(hitung_cver.shape[0] * hitung_cver.shape[1])))
transformer = TfidfTransformer()
transformer_weights =
transformer.fit_transform(hitung_cver)
transformer_weights
weights =
np.asarray(transformer_weights.mean(axis=0)).ravel().to
list()
weights_df =
pd.DataFrame({'term':cver.get_feature_names(),'Weight':
weights})
weights_df.sort_values(by='Weight',
ascending=False).head(20)
175
4. Pengujian Validasi
5. Klasifikasi
Skenario 1
# MEMBACA DATA
import pandas as pd
df = pd.read_csv('filepreprocessingutf.csv')
X = df['Stemming']
Y = df['Label']
y_train = Encoder.fit_transform(y_train)
y_test = Encoder.fit_transform(y_test)
NB = naive_bayes.MultinomialNB()
NB.fit(x_train,y_train)
y_pred = NB.predict(x_test) #prediksi
Skenario 2
# METODE KLASIFIKASI
# MEMBACA DATA
import pandas as pd
df = pd.read_csv('filepreprocessingutf.csv')
X = df['Stemming']
Y = df['Label']
NB = naive_bayes.MultinomialNB()
NB.fit(x_train,y_train)
y_pred = NB.predict(x_test) #prediksi
Skenario 3
# METODE KLASIFIKASI
# MEMBACA DATA
import pandas as pd
df = pd.read_csv('filepreprocessingutf.csv')
X = df['Stemming']
Y = df['Label']
NB = naive_bayes.MultinomialNB()
NB.fit(x_train,y_train)
y_pred = NB.predict(x_test) #prediksi
Skenario 4
# METODE KLASIFIKASI
# MEMBACA DATA
import pandas as pd
df = pd.read_csv('filepreprocessingutf.csv')
X = df['Stemming']
Y = df['Label']
NB = naive_bayes.MultinomialNB()
NB.fit(x_train,y_train)
y_pred = NB.predict(x_test) #prediksi
6. Evaluasi Model
#Confusion Matrix
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize=(8, 5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True,
fmt=".0f", ax=ax)
class_label = ["negatif","positif"]
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()
184
Skenario 2
#Confusion Matrix
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize=(8, 5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True,
fmt=".0f", ax=ax)
class_label = ["negatif","positif"]
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()
185
Skenario 3
#Confusion Matrix
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize=(8, 5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True,
fmt=".0f", ax=ax)
class_label = ["negatif","positif"]
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()
186
Skenario 4
#Confusion Matrix
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize=(8, 5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True,
fmt=".0f", ax=ax)
class_label = ["negatif","positif"]
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()
187
7. Visualisasi Data
#Read Data
df = pd.read_csv("filepreprocessingutf.csv")
df.sort_index(inplace=True)
df.sample(n=10)
sentiment_count = df["Label"].value_counts()
plt.pie(sentiment_count,
labels=sentiment_count.index,
autopct='%1.1f%%', shadow=True, startangle=140)
plt.show()
188
Word Cloud
#Import
pos_tweets = df[df["Label"]=="Positif"]
txt = " ".join(tweet.lower() for tweet in
pos_tweets["Stemming"])
wordcloud = WordCloud().generate(txt)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
189
neg_tweets = df[df["Label"]=="Negatif"]
txt = " ".join(tweet.lower() for tweet in
neg_tweets["Stemming"])
wordcloud = WordCloud().generate(txt)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()