Python

10 Teknik pada Pandas yang Jarang Orang Ketahui

Halo sobat Exsight, gimana nih kabarnya? Pada artikel kali ini, aku diberikan kesempatan lagi nih oleh tim Exsight untuk menjadi penulis tamu. Terima kasih banyak untuk tim Exsight atas kesempatan yang diberikan yah. Buat kalian yang penasaran dengan artikel aku sebelumnya di Exsight, kalian bisa cek artikel aku di link ini yah https://exsight.id/blog/2024/02/24/membuat-mood-tracking-dengan-python/. Di artikel sebelumnya, aku membahas bagaimana caraku melakukan tracking mood dan mengubahnya ke dalam bentuk visualisasi data menggunakan Python.

Nah di artikel kali ini, aku akan bahas 10 teknik pada Pandas yang jarang orang ketahui atau gunakan. Sebagai seseorang yang bekerja di dunia data, pasti familiar dong dengan apa itu library Pandas? Buat yang belum tahu apa itu Pandas, Pandas adalah sebuah library di Python yang sangat terkenal dalam kemudahan penggunaannya untuk memanipulasi ataupun menganalisis data karena memiliki banyak sekali fitur atau fungsi pengolahan data.  Karena banyaknya fungsi dan fitur yang tersedia di Pandas, ada banyak “hidden gem” serta tips dan trik menarik yang jarang dibahas atau digunakan, yang sebenarnya bisa meningkatkan level analisis data kita. Tanpa berlama-lama, mari kita masuk ke teknik yang pertama!

1. Fungsi at dan iat

Sebenarnya, Pandas sudah menyediakan dua fungsi yang sangat efisien dan cepat untuk mengakses sebuah value di cell tertentu pada data frame, yaitu at dan iat. Berbeda dengan fungsi loc dan iloc, yang membutuhkan angka untuk mengakses indeks kolom dan baris tertentu, fungsi at dan iat secara langsung bisa mengakses suatu cell berdasarkan nama/indeks kolom dan indeks suatu baris. Hal ini tentu saja sangat berguna dan efisien ketika sobat Exsight ingin menganalisis suatu data dengan jumlah yang besar. Berikut ini adalah contoh code untuk penggunaan beserta output nya:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df.at[0, 'A'])
print(df.iat[1, 1])
import pandas

Nah, seperti yang sobat Exsight bisa lihat dari contoh code yang pertama, aku ingin mengambil nilai cell yang ada pada baris pertama di kolom A dengan menggunakan fungsi at. Dari contoh tersebut, dengan menggunakan fungsi at, maka sobat Exsight hanya perlu menuliskan indeks barisnya (baris dengan indeks 0) dan juga nama kolomnya (kolom A). 

Contoh selanjutnya, dengan menggunakan fungsi iat, aku ingin mengambil nilai cell yang ada pada baris kedua di kolom B. Maka, dengan menggunakan fungsi iat, sobat Exsight cukup menuliskan indeks barisnya (baris dengan indeks 1) dan juga indeks dari kolom yang ada pada tabel (kolom B memiliki indeks kolom 1). Bagaimana sobat Exsight? Lebih gampang bukan?

2. Data Kategorikal menggunakan astype()

Ketika sobat Exsight yang berhadapan dengan kolom yang memiliki nilai kategorikal, pasti sering dong menggunakan metode str untuk mengonversi kolom nya dari tipe objek menjadi kategorikal? Nah, pada Pandas, sebenarnya sudah tersedia fitur yang lebih efisien untuk mengonversi tipe data kolom ke tipe kategori dengan menggunakan astype("category"). Di bawah ini adalah contoh code penggunaanya:

import pandas as pd

df = pd.DataFrame({'Category': ['Cat', 'Dog', 'Fish'], 'Amount': [2, 5, 3]})
df['Category'] = df['Category'].astype('category')
df.info()

Dari code dan output di atas, dapat dilihat bahwa dengan penggunaan fungsi ini, kolom Category pada dataframe sekarang memiliki tipe data category.

3. Fungsi query()

Selain fungsi loc dan iloc untuk memfilter data, ada fungsi lain yang sudah tersedia di Pandas untuk memfilter data secara ringkas dan efisien, yaitu query(). Dengan menggunakan fungsi ini, sobat Exsight hanya perlu memasukkan query expression saja untuk data yang akan difilter. Lebih mudah bukan? Berikut ini adalah contoh penggunaan dari fungsi query().

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
filtered = df.query('A > 1 and B < 6')

Seperti yang sobat Exsight bisa lihat dari contoh code di atas, aku ingin mendapatkan/filter data dengan kriteria: kolom A memiliki nilai lebih dari 1 dan kolom B memiliki nilai kurang dari 6. Nah, dari kriteria tersebut, sobat Exsight hanya perlu menuliskan query expression-nya seperti pada gambar di atas ("A > 1 and B < 6"). Hal ini tentu saja bisa mempersingkat waktu yang dibutuhkan sobat Exsight untuk memfilter data yang diinginkan, apalagi kalau data yang tersedia cukup besar. Gampang sekali bukan?

4. Fungsi Regex pada str.replace()

Buat sobat Exsight yang sering menggunakan Pandas, pasti sudah sangat familiar dengan fungsi str.replace(). Nah, fungsi ini sangat berguna untuk mengganti suatu string yang ada pada suatu teks atau kolom. Namun, tahukah sobat Exsight, bahwa sebenarnya, fungsi ini juga bisa menerima pola regex loh! Karena fungsi ini bisa menerima pola regex, maka sobat Exsight bisa lebih mudah dan cepat dalam menghandle string yang tidak diinginkan pada suatu teks atau kolom. Di bawah ini adalah contoh code penggunaanya:

import pandas as pd

df = pd.DataFrame({'Text': ['Hello, World!', 'Goodbye, World!']})
df['Text'] = df['Text'].str.replace(r'[^a-zA-Z\s]', '')

Dari gambar di atas, sobat Exsight bisa lihat nih, value pada data frame yang sebelumnya mengandung simbol-simbol seperti “,” atau “!”, bisa dihilangkan dengan menggunakan pola regex pada fungsi str.replace(). Jadi, sobat Exsight tidak perlu menuliskan satu per satu simbol-simbol yang akan di ganti nantinya, hanya perlu menuliskan pola regex yang akan digunakan untuk menghapus karakter yang tidak diinginkan. Gimana sobat Exsight? Pastinya sangat bermanfaat dong kombinasi antara fungsi str.replace() dan pola regex ini?

5. Indeks Baris dengan isin() dan index()

Pada Pandas, fungsi isin() biasanya digunakan untuk memfilter baris berdasarkan beberapa nilai dalam kolom. Tapi tahukah sobat Exsight, fungsi ini juga dapat digunakan untuk mengekstrak baris berdasarkan nilai indeks loh! Tentu saja hal ini sangat berguna untuk menangani data-data dengan multi-indeks. Di bawah ini adalah contoh code penggunaanya:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3]}, index=['x', 'y', 'z'])
selected_rows = df[df.index.isin(['x', 'z'])]

Dari contoh di atas, aku ingin mendapatkan baris yang memiliki indeks “x” dan “z” pada data frame. Nah, sobat Exsight bisa lihat nih dari contoh code di atas, dengan menggunakan kombinasi fungsi index() dan isin(), sobat Exsight hanya perlu menuliskan nama indeks yang akan dicari, dan voilà, baris yang memiliki indeks yang dicari akan langsung dengan gampang ter-filter deh.

6. Konversi Zona Waktu dengan dt.tz_localize() & dt.tz_convert()

Ketika kita berhadapan data-data timestamp, perbedaan zona waktu dari timestamp dapat menjadi tantangan tersendiri dalam pengolahannya. Nah pada Pandas, kedua fungsi ini, yaitu dt.tz_localize() dan dt.tz_convert() bisa menjadi fungsi yang sangat berguna nih bagi sobat Exsight dalam menangani data-data timestamp yang sensitif terhadap zona waktu. Sobat Exsight hanya perlu memasukkan nama zona waktu yang ingin dikonversi. Berikut ini adalah code cara penggunaanya:

import pandas as pd

df = pd.DataFrame({'Timestamp': pd.date_range('2023-08-01', periods=3, tz='UTC')})
df['Timestamp'] = df['Timestamp'].dt.tz_convert('US/Eastern')

Nah, dari code di atas, aku ingin mengubah zona waktu pada kolom Timestamp yang ada pada dataframe menjadi zona waktu di US/Eastern. Dengan menggunakan fungsi dt.tz_convert(), sobat Exsight bisa langsung menuliskan nama zona waktu nya di dalam fungsi tersebut. Hasilnya, dapat dilihat juga pada gambar di atas bahwa zona waktu pada kolom Timestamp sekarang sudah berubah, yang awalnya +00:00, sekarang sudah menjadi -04:00, sesuai dengan timestamp UTC. Sobat Exsight juga bisa melihat daftar zona waktu dan timestamp UTC yang lain selain “US/Eastern” di link berikut ini yah: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.

7. Fungsi cut() untuk Binning

Umumnya, fungsi cut() digunakan untuk mengelompokkan data-data kontinyu ke dalam bentuk interval. Namun ternyata, fungsi ini juga bisa digunakan untuk data-data non-numerik, sehingga memungkinkan sobat Exsight untuk membuat binning khusus untuk kolom kategorikal.

import pandas as pd

df = pd.DataFrame({'Age': [25, 32, 45, 18, 67]})
df['AgeGroup'] = pd.cut(df['Age'], bins=[0, 18, 30, 60, float('inf')], labels=['Teen', 'Young Adult', 'Adult', 'Senior'])

Dari contoh di atas, aku ingin mengelompokan data umur yang ada pada data frame tersebut ke dalam beberapa kelompok umur. Kelompok umur tersebut ada “Teen” (umur 0-18 tahun), “Young Adult” (umur 18-30 tahun), “Adult” (umur 30-60), dan “Senior” (umur 60 tahun ke atas). Untuk itu, dengan menggunakan fungsi cut(), maka kita hanya perlu menuliskan list angka-angka yang menjadi batas umur untuk suatu kelompok umur dengan list label kelompok umur. Fungsi cut() akan membaca angka pertama sebagai batas bawah dari suatu kelompok, dan angka selanjutnya sebagai batas atas untuk kelompok tersebut, dan begitu seterusnya. Nah, seperti yang sobat Exsight bisa lihat juga pada gambar di atas, data-data umur telah sesuai digolongkan ke dalam kelompok umur yang diinginkan.

8. Fungsi read_fwf()

Ketika mengolah data, seringkali data yang kita gunakan datang dalam format fwf (fixed-width formats) dimana data dan kolom tidak dipisahkan oleh delimiter. Untuk mengatasi data dengan format seperti ini, Pandas menyediakan fungsi read_fwf() yang bisa membantu sobat Exsight dalam menentukan lebar kolom dan mengurai datanya secara lebih efisien. Di bawah ini adalah contoh data dan cara penggunaan fungsi tersebut:

"""
> Berikut ini adalah contoh data yang akan digunakan. Data ini akan disimpan ke dalam file bernama "data.txt".
Datanya:

Spark 15000 Day3
Pandas 20000 Day4
Python 25000 Day6
"""

import pandas as pd

col_specs = [(0, 6), (6, 12), (12, 17)]
df = pd.read_fwf('data.txt', colspecs=col_specs, names=['A', 'B', 'C'])

Nah, dari contoh di atas sobat Exsight bisa lihat nih, hanya dengan menentukan lebar kolom berdasarkan posisi/indeks karakter di variabel col_specs, serta memberikan list nama kolom, data-data yang ada dalam file TXT telah terpisahkan dengan benar.

9. Seleksi Indeks menggunakan nlargest() dan nsmallest()

Mungkin sebagian dari sobat Exsight pasti baru pertama kali nih mendengar kedua fungsi ini, yaitu nlargest() dan nsmallest(). Jadi, fungsi nlargest() ini berguna sekali untuk menunjukkan banyaknya baris pertama (sejumlah n) dengan nilai terbesar dari suatu kolom, dalam urutan menurun. Sedangkan fungsi nsmallest() adalah sebaliknya, dimana fungsi ini menunjukkan banyaknya baris pertama (sejumlah n) dengan nilai terkecil dari suatu kolom, dalam urutan menaik. Berikut ini adalah contoh dari penggunaan fungsi nlargest() beserta outputnya.

import pandas as pd

df = pd.DataFrame({'Category': ['A', 'B', 'C', 'D'], 'Value': [10, 25, 15, 30]})
top_2 = df.nlargest(2, 'Value')

Pada contoh di atas, aku ingin mencari 2 data yang memiliki angka terbesar pada kolom “Value” di data frame. Nah, dengan menggunakan fungsi nlargest(), sobat Exsight hanya perlu menentukan berapa baris yang akan dicari pada data frame beserta nama kolom yang akan diurutkan. Dari contoh tersebut, sobat Exsight tinggal menuliskan 2 sebagai jumlah barisnya, dan kolom “Value” sebagai kolom yang akan diurutkan. Mudah bukan?

10. Kegunaan lain dari merge()

Kalau fungsi ini, aku yakin sobat Exsight pasti sering gunakan kalau ingin menggabungkan dua data frame menjadi satu data frame. Namun, ternyata fungsi merge() pada Pandas tidak hanya bisa menggabungkan kedua data frame saja loh! Sobat Exsight juga bisa melakukan operasi yang lebih rumit seperti menggabungkan beberapa kolom dan menggabungkan nama kolom berbeda di dua data frame. Di bawah ini adalah contoh code cara penggunaanya:

import pandas as pd

df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [1, 2, 3], 'D': [7, 8, 9]})
merged_df = df1.merge(df2, left_on='A', right_on='C')

Nah, pada contoh di atas, aku ingin menggabungkan data frame pertama (df1) dengan data frame kedua (df2). Dengan menggunakan fungsi merge(), maka sobat Exsight dapat menspesifikasikan lebih detail lagi bagaimana proses penggabungan antara kedua data frame ini dilakukan. Pada contoh di atas, aku menggunakan parameter left_on, dimana kolom dari data frame pertama untuk digunakan sebagai kunci, dan juga right_on, dimana kolom dari data frame kedua digunakan sebagai kunci. Nah, dengan begitu, dengan menggunakan kolom A pada data frame pertama sebagai kunci untuk parameter left_on, dan kolom C pada data frame kedua sebagai kunci untuk parameter right_on, maka hasil dari proses penggabungannya dapat dilihat pada gambar di atas.

Penutup

Jadi itulah 10 teknik pada Pandas yang mungkin orang jarang ketahui atau gunakan. Dari ke 10 teknik tadi, kira-kira mana nih yang sobat Exsight merasa paling berguna atau baru tahu? Kalian bisa langsung komen di bawah ya! Oh ya, jika kalian tahu teknik-teknik lain selain 10 teknik di atas, kita juga bisa berdiskusi bareng di kolom komentar juga yah!

Itu aja yang aku bisa sharing ke sobat Exsight buat artikel kali ini. Kalian bisa follow atau connect LinkedIn aku di https://www.linkedin.com/in/caesarmario/ jika kalian ingin tahu informasi-informasi terbaru dari project-project data yang aku buat. Stay tuned terus di website https://exsight.id/blog/ agar tidak ketinggalan artikel-artikel menarik lainnya. Sampai jumpa!

Referensi

10 Teknik pada Pandas yang Jarang Orang Ketahui Read More »

Analisis Sentimen dengan Python

Hai hai sobat Exsight, masih ingat gak nih pada beberapa artikel sebelumnya, kita pernah membahas penjelasan terkait Analisis Sentimen: Definisi, Langkah-Langkah dan Penerapannya pada Data Twitter. Nah melanjutkan dari artikel sebelumnya, pada artikel kali ini, kita akan berfokus pada tutorial analisis sentimen menggunakan software Python secara lebih detail. Tanpa berlama- lama lagi, yuk yuk simak artikel ini dengan seksama yaa!

Analisis sentimen adalah proses untuk mengidentifikasi, mengekstrak, dan memahami pendapat, perasaan, atau sikap yang terkandung dalam teks atau data lainnya. Tujuan utama dari analisis sentimen adalah untuk mengevaluasi opini atau persepsi orang terhadap suatu topik, produk, layanan, merek, atau entitas lainnya dalam rangka mendapatkan wawasan yang berharga untuk pengambilan keputusan.

Studi Kasus Analisis Sentimen

Studi kasus yang akan kita gunakan dalam hal ini berkaitan dengan Analisis Sentimen kebijakan tentang Covid-19 di Indonesia. Kita akan melihat bagaimana opini masyarakat, khususnya para pengguna aplikasi Twitter, terkait kebijakan Covid-19 di Indonesia. Terlebih dahulu, kita lakukan crawling data atau mengumpulkan data dari aplikasi Twitter menggunakan Application Programming Interface (API). Namun dalam artikel ini, untuk mempersingkat waktu, sobat Exsight dapat langsung mengakses data hasil crawling twitter pada link di sini.

analisis sentimen

Load Library Python

Tahapan paling awal sebelum melakukan running syntax di Python yaitu melakukan load library. Apabila sobat Exsight masih belum memiliki library untuk analisis sentimen, maka dapat menginstall terlebih dahulu dengan cara.

pip install (nama library nya)

Adapun beberapa library yang digunakan terdiri atas:

import pandas as pd
import numpy as np
import tweepy
import matplotlib.pyplot as plt

# Machine Learning imports
import nltk
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import GridSearchCV
import joblib
from nltk.corpus import stopwords

import string
import re
from string import punctuation
from collections import Counter

Load Data

Tahapan selanjutnya yaitu melakukan load data di Python. Data yang diinput diberi nama sebagai data yang berasal dari file corona. Data corona, bisa diakses pada link berikut. Perlu diperhatikan untuk jenis file data yang diinput dalam format CSV, hal ini dengan tujuan untuk mempermudah pengguna. Syntax yang digunakan untuk load data adalah sebagai berikut.

data = pd.read_csv('corona.csv')
data.head()
sentimen
Gambar 1. Data Corona

Berdasarkan Gambar 1. ditampilkan 5 baris data teratas pada file data Corona. Data terdiri atas 15 variabel. Tahapan berikutnya, berdasarkan data awal corona, kita akan membuat data frame baru yang berisikan hanya 3 variabel meliputi:
Variabel Id
Variabel Mentions
Variabel Sentiment

data=data[["Id","Mentions","Sentiment"]]
data['Mentions']=data.Mentions.astype('str')

Sebagai catatan, untuk kolom variabel Mentions, pastikan variabel menggunakan tipe data String, sesuai syntax Python di atas.

Tahapan selanjutnya, kita perhatikan pada kolom variabel Sentimen, dimana pada kolom tersebut terdiri atas 3 (tiga) kategori yang terdiri atas: Positive, Neutral, dan Negative. Analisis sentimen mengklasifikasikan pendapat atau perasaan seseorang terhadap suatu topik menjadi tiga kategori: Positive, Neutral, dan Negative. Berikut adalah perbedaan antara ketiganya:

  1. Sentimen Positive
    Pendapat atau perasaan yang mendukung atau menggambarkan kepuasan, kegembiraan, atau kebaikan terhadap suatu topik. Contohnya adalah ulasan yang memuji kualitas produk, layanan yang sangat baik, atau pengalaman yang menyenangkan.
  2. Sentimen Neutral
    Pendapat atau perasaan yang tidak menunjukkan kecenderungan positif atau negatif secara signifikan. Netral biasanya digunakan untuk menggambarkan situasi di mana orang tidak memiliki opini yang kuat atau tidak ada perasaan emosional yang khusus terhadap topik tersebut.
  3. Sentimen Negative
    Pendapat atau perasaan yang mengekspresikan ketidakpuasan, kekecewaan, atau ketidaknyamanan terhadap suatu topik. Contohnya adalah ulasan yang mengkritik kualitas produk yang buruk, layanan yang tidak memuaskan, atau pengalaman yang tidak menyenangkan.

Dalam analisis sentimen, tujuannya adalah untuk mengidentifikasi dan mengklasifikasikan pendapat atau perasaan menjadi salah satu dari tiga kategori ini untuk memahami umpan balik atau persepsi yang dimiliki orang terhadap suatu topik atau entitas tertentu. Selanjutnya, kita bisa lihat jumlah masing-masing dari tiap sentimen baik dari segi sentimen Positive, sentimen Neutral, dan sentimen Negative dengan menggunakan Syntax sebagai berikut.

data['Sentiment'].value_counts()
sentimen
Gambar 2. Kategori pada Variabel Sentimen

Berdasarkan Gambar 2. diketahui bahwa kategori dengan jumlah paling banyak pada variabel Sentimen yaitu Sentimen Positive sebesar 889. Hal ini menunjukkan bahwa sebagian besar netizen atau masyarakat pengguna aplikasi Twitter berpendapat setuju serta puas terkait adanya kebijakan Covid-19 di Indonesia.

Pre-Processing Data

Pre-processing data pada analisis sentimen melibatkan serangkaian langkah untuk membersihkan dan mempersiapkan teks mentah hasil crawling data agar sesuai untuk analisis sentimen. Beberapa langkah umum dalam Pre-processing data analisis sentimen adalah sebagai berikut.

  1. Menghapus data yang tidak berhubungan dengan topik.
  2. Menghapus HTML link, mention, username, hastag, retweet, angka, tanda baca, spasi berlebih, hyperlink, serta menghapus kata dengan huruf kurang dari 2 huruf.
  3. Case Folding
    Menyeragamkan huruf menjadi non kapital.
  4. Stemming dan Lemmatization
    Merubah kata-kata dalam tweet menjadi bentuk standar atau kata dasar.
    *Stemming berfokus pada menghilangkan awalan atau akhiran kata untuk mengembalikan kata ke bentuk dasarnya yang disebut “kata dasar” atau “akar kata”. Contohnya, kata-kata seperti “berlari”, “lari”, dan “lari-lari” akan diubah menjadi “lar”.
    *Lemmatization berfokus pada mengurangi kata-kata ke bentuk dasarnya berdasarkan kamus atau aturan bahasa. Berbeda dengan stemming, lemmatisasi mempertimbangkan konteks kata dalam kalimat dan berusaha untuk menghasilkan kata dasar yang benar secara gramatikal. Contohnya, kata-kata seperti “berjalan”, “jalan”, dan “jalan-jalan” akan diubah menjadi “jalan”.
  5. Stopword
    Menghapus kata pada tweet yang terkandung di dalam stopwords. Daftar kata stopwords adalah daftar kata umum yang biasanya muncul dalam jumlah besar dan dianggap tidak memiliki makna.
  6. Tokenization
    Proses untuk membagi teks yang dapat berupa kalimat, paragraf atau dokumen menjadi token-token/kata-kata.
  7. Bag of Words (BoW)
    Bag of Words (BoW) merupakan cara yang digunakan untuk mengekstrak fitur dari teks. BoW mengubah teks menjadi matriks kemunculan kata-kata dalam dokumen.
  8. TF-IDF (Term Frequency-Inverse Document Frequency)
    TF-IDF digunakan untuk mengekstraksi fitur-fitur penting dari teks yang akan dianalisis. Cara kerja TF-IDF yaitu dengan menghitung bobot kata dalam sebuah dokumen. Kata-kata yang memiliki bobot TF-IDF tinggi adalah kata-kata yang muncul sering dalam sebuah dokumen tertentu, tetapi jarang muncul dalam koleksi dokumen secara keseluruhan, sehingga dianggap penting untuk dokumen tersebut.
# helper function to clean tweets
def processTweet(tweet):
    # Remove HTML special entities (e.g. &amp;)
    tweet = re.sub(r'\&\w*;', '', tweet)
    # Remove @username
    tweet = re.sub('@[^\s]+','',tweet)
    # Remove tickers
    tweet = re.sub(r'\$\w*', '', tweet)
    # To lowercase
    tweet = tweet.lower()
    # Remove hyperlinks
    tweet = re.sub(r'https?:\/\/.*\/\w*', '', tweet)
    # Remove hashtags
    tweet = re.sub(r'#\w*', '', tweet)
    # Remove Punctuation
    tweet = re.sub(r'[' + punctuation.replace('@', '') + ']+', ' ', tweet)
    # Remove words with 2 or fewer letters
    tweet = re.sub(r'\b\w{1,2}\b', '', tweet)
    # Remove whitespace (including new line characters)
    tweet = re.sub(r'\s\s+', ' ', tweet)
    # Remove single space remaining at the front of the tweet.
    tweet = tweet.lstrip(' ') 
    # Remove characters beyond Basic Multilingual Plane (BMP) of Unicode:
    tweet = ''.join(c for c in tweet if c <= '\uFFFF') 
    return tweet
# clean dataframe's text column
df['Mentions'] = df['Mentions'].apply(processTweet)
# preview some cleaned tweets
df['Mentions'].head()
sentimen
Gambar 3. Hasil Pre-Processing pada Kolom Variabel Mentions

Apabila kita perhatikan pada Gambar 3, untuk hasil Pre-Processing pada kolom variabel Mentions, untuk 5 data teratas masih terdapat kalimat yang sama persis (duplicate), maka dari itu kita perlu melakukan penghapusan data duplicate dengan syntax sebagai berikut. Sebelum itu juga dilakukan penghapusan stopword menggunakan stopword deafult yang terdapat pada library Sastrawi.

pip install Sastrawi
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory

factory = StopWordRemoverFactory()
stopword = factory.create_stop_word_remover()
tweet=[]
for i, kalimat in enumerate (df['Mentions']):
    stop = stopword.remove(kalimat)
    tweet.append(stop)
df['Mentions']=tweet
# drop duplicates
df = df.drop_duplicates('Mentions')
df.shape
df['Sentiment'].unique()

Adapun ekstraksi fitur menggunakan BoW dan TF-IDF akan dilakukan secara langsung pada pipeline pemodelan.

Pemodelan

Tahapan berikutnya, setelah dilakukan pre-processing yaitu melakukan pemodelan pada analisis sentimen. Dalam hal ini pemodelan yang dilakukan menggunakan algoritma klasifikasi Multinomial Naive Bayes. Saat melakukan pemodelan, terlebih dahulu dilakukan pembagian data training dan data testing, dimana data training sebesar 80% dan data testing sebesar 20%. Pada tahapan ini juga dilakukan tuning parameter menggunakan GridSearchCV dengan cv = 3 untuk menghemat waktu komputasi.

X_train, X_test, y_train, y_test = train_test_split(df['Mentions'], df['Sentiment'], test_size=0.2)


# create pipeline
pipeline = Pipeline([
    ('bow', CountVectorizer(strip_accents='ascii',
                            lowercase=True)),  # strings to token integer counts
    ('tfidf', TfidfTransformer()),  # integer counts to weighted TF-IDF scores
    ('classifier', MultinomialNB()),  # train on TF-IDF vectors w/ Naive Bayes classifier
])

# this is where we define the values for GridSearchCV to iterate over
parameters = {'bow__ngram_range': [(1, 1), (1, 2) , (1,3), (1,4), (1,5)],
              'bow__min_df':(3,4,5),
              'tfidf__use_idf': (True, False),
              'classifier__alpha': (5e-1, 1e-1, 5e-2, 1e-2, 1e-3),
               }

# do 3-fold cross validation for each of the 6 possible combinations of the above params
grid = GridSearchCV(pipeline, cv=3, param_grid=parameters, verbose=0)
grid.fit(X_train,y_train)

# summarize results
print("\nBest Model: %f using %s" % (grid.best_score_, grid.best_params_))
print('\n')
means = grid.cv_results_['mean_test_score']
stds = grid.cv_results_['std_test_score']
params = grid.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("Mean: %f Stdev:(%f) with: %r" % (mean, stdev, param))
sentimen
Gambar 5. Pemodelan dengan Naive Bayes

Evaluasi Model

Tahapan berikutnya yaitu melakukan evaluasi model Multinomial Naive Bayes pada analisis sentimen menggunakan model terbaik yang disimpan dalam variabel grid dan dikonversi ke dalam file twitter_sentiment.pkl . Evaluasi model dalam hal ini menggunakan beberapa pengukuran diantaranya accuracy score, confusion matrix, precision, recall, f1-score, dan support. Syntax yang digunakan untuk evaluasi model adalah sebagai berikut.

# save best model to current working directory
joblib.dump(grid, "twitter_sentiment.pkl")
# load from file and predict using the best configs found in the CV step
model_NB = joblib.load("twitter_sentiment.pkl" )

# get predictions from best model above
y_preds = model_NB.predict(X_test)

print('accuracy score: ',accuracy_score(y_test, y_preds))
print('\n')

#Menampilkan Hasil Evaluasi Model
print('confusion matrix: \n',confusion_matrix(y_test,y_preds))
print('\n')
print(classification_report(y_test, y_preds))
sentimen
Gambar 6. Evaluasi Model

Berdasarkan hasil evaluasi model pada Gambar 6. diketahui bahwa:
Accuracy score yaitu sebesar 0,865. Accuracy score mengukur sejauh mana model klasifikasi berhasil memprediksi kelas yang benar dari seluruh sampel. Nilai 0,865 sudah cukup tinggi, dimana dapat dikatakan dengan kinerja model ini sudah cukup baik dalam melakukan prediksi.

Referensi

Materi Webinar Exsight Analytics dengan tema Twitter Sentiment Analysis with Python : Indonesian Public Perceptions of COVID-19 oleh Akbar Maulana – 31 Juli 2021

Sekian penjelasan tentang Tutorial Analisis Sentimen pada software Python. Jika masih ada yang dibingungkan bisa langsung saja ramaikan kolom komentar atau hubungi admin melalui tombol bantuan di kanan bawah. Stay tuned di website https://exsight.id/blog/ agar tidak ketinggalan artikel-artikel menarik lainnya.

Analisis Sentimen dengan Python Read More »

Membuat Mood Tracking dengan Python

Halo sobat Exsight, salam kenal semua! Pada artikel kali ini, aku diberikan kesempatan oleh tim Exsight untuk menjadi penulis tamu nih. Di kesempatan kali ini, aku akan membahas salah satu episode “Data Slices” yang terakhir kubuat tentang Mood Tracking menggunakan Python. 

Jadi “Data Slices” adalah sebuah series data visualisasi yang aku buat, dimana aku membuat data visualisasi yang menarik dari data-data random yang aku temukan menggunakan beberapa libraries yang ada di Python (seperti Matplotlib atau Seaborn) dan Jupyter notebook. Buat kalian yang penasaran dengan series “Data Slices” yang aku buat, kalian bisa langsung mengunjungi GitHub repo nya di sini.

Nah, di episode terakhir “Data Slices”, aku membuat dua buah visualisasi, dimana aku menampilkan emosi (mood) yang aku rasakan sepanjang harinya selama tahun 2023 dan report (rangkuman) dari mood yang aku catat sepanjang tahun tersebut. Di artikel ini, aku akan membahas background story project, teknik pengumpulan data, code overview dari data visualisasi yang aku buat, hingga hal-hal yang aku pelajari dari project ini. Aku pun juga sudah mencantumkan gambar data visualisasi yang aku sebutkan di bawah paragraf ini yah. Tanpa berlama-lama lagi, yuk simak artikel ini dengan seksama!

Figur “Mood Report”

Background Story

Pastinya sobat Exsight familiar dong dengan yang namanya resolusi tahun baru? Nah, buat sebagian orang, resolusi tahun baru sangatlah penting buat mereka yang ingin mencapai sesuatu yang diinginkan ataupun yang ingin berubah menjadi lebih baik di tahun yang akan datang. Dan, waktu yang tepat untuk memikirkan hal-hal tersebut adalah di akhir tahun, dimana akhir tahun memperbolehkan kita untuk merefleksikan apa yang sudah berlalu di tahun itu dan juga menetapkan tujuan-tujuan baru yang ingin dicapai dalam jangka waktu setahun yang akan datang. Salah satu orang yang selalu membuat resolusi di tahun baru tersebut adalah aku hehehe. 

Jadi, pada akhir tahun 2022 kemarin, dan sebagai persiapan dalam menyambut tahun 2023, aku pun juga ikut mulai memikirkan hal-hal dan kebiasaan baru apa saja yang ingin kucoba dan tekuni, sekaligus kebiasaan buruk yang ingin ditinggalkan di tahun tersebut.

 

Habit plan ku di tahun 2023

Ketika aku menentukan habit baru apa saja yang ingin kucoba, ada satu habit yang cukup menarik perhatianku untuk dicoba, yaitu journaling. Kenapa journaling? Karena ketika aku melakukan research terkait itu, aku menemukan beberapa hal bermanfaat yang bisa aku dapatkan, baik secara emosional maupun personal, contohnya lebih memahami emosi yang dirasakan di hari itu, latihan bersyukur, refleksi diri (apa yang baik terjadi di hari itu, apa yang dapat diperbaiki/ditingkatkan, apa yang tidak berjalan sesuai harapan), peningkatan produktivitas, dan sebagainya.

Nah, karena salah satu manfaat dari journaling ini adalah mengenali emosi yang dirasakan, aku pun akhirnya juga berencana untuk membuat suatu mood tracker, dimana aku mencatat emosi yang aku rasakan setiap harinya sembari melakukan journaling secara manual di buku tulis pribadi. Rencananya juga, mood tracker yang bakalan aku buat ini nantinya akan ditampilkan sebagai salah satu episode dari series “Data Slices”, dimana visualisasi yang bakalan dibuat akan berupa kalender yang memperlihatkan naik turunnya emosi yang aku rasakan setiap harinya sepanjang tahun 2023.

Pengumpulan Data

Karena project kali ini tidak hanya mencatat mood harian tetapi juga mencatat habit yang akan dibentuk selama tahun 2023, maka aku memutuskan untuk mencatatnya di sebuah spreadsheet menggunakan Google sheet. Tampilan dari spreadsheet-nya bisa kalian lihat pada gambar di bawah ini yah. Jadi, untuk mempermudah proses pencatatan data setiap harinya dan untuk memastikan tidak ada data kotor/anomali, aku memutuskan untuk membuat semacam dropdown button di setiap kolom habit dan mood, agar value yang terekam di spreadsheet akan terus konsisten setiap saat. 

Spreadsheet yang aku buat juga mencatat nama hari, tanggal, dan juga bulan untuk mempermudah filtering data ketika melakukan proses pencatatan mood dan habit pada hari dan bulan tertentu. Nah, buat kalian yang ingin melihat spreadsheet lengkapnya, kalian bisa melihatnya disini.

 

Spreadsheet untuk mencatat mood setiap harinya

Kemudian, untuk pengumpulan data mood ini mau tidak mau harus aku lakukan secara manual setiap harinya, yang dimana terkadang proses pengumpulan data ini cukup membuat aku tersiksa hahaha. Tetapi, untuk menjadikan proses pengumpulan data ini menjadi lebih mudah dan bisa konsisten setiap harinya, maka aku pun mendapatkan ide untuk mengubah settingan di browser, dimana setiap kali aku membuka browser maka browser akan otomatis membuka tab baru ke spreadsheet yang telah aku buat. Settingan ini memperbolehkan aku untuk terus ingat dalam mencatat mood dan habit setiap harinya, sehingga tidak ada data yang missing ketika akan dibuat visualisasi nantinya.

 

Browser settings untuk mencatat mood setiap harinya

Code Overview

Pada bagian code overview ini, aku akan menjelaskan secara singkat flow code dari kedua visualisasi yang telah disebutkan sebelumnya. Karena ada dua tipe visualisasi yang aku buat, maka bagian ini aku akan pecah menjadi dua sub-bagian, yang pertama adalah “Emotional Journey” (visualisasi kalender) dan yang kedua adalah “Summary Report” (visualisasi rangkuman). Secara umum, library yang aku gunakan untuk membuat kedua visualisasi tersebut adalah sebagai berikut

# Importing Libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import emoji
import math

Nah setelah mengimport library yang akan digunakan, tahapan selanjutnya adalah mengimport dataset nya. Dataset dapat di download dari spreadsheet yang sudah aku lampirkan sebelumnya sebagai file CSV dan di import menggunakan Pandas di Python atau Jupyter notebook. Aku pun juga melakukan sedikit processing menggunakan Pandas, sehingga value yang akan ditampilkan di gambar nanti akan lebih mudah dipahami oleh audiens yang melihatnya.

# Importing Dataset
df = pd.read_csv("mood_tracker_2023.csv")

 

# Change Categorical to Numerical (Score based)
mood_dict = {
    "EMPTY": 0
    , "Awful": 1
    , "Bad": 2
    , "Below Average": 3
    , "Average": 4
    , "Above Average": 5
    , "Good": 6
    , "Great": 7
}
df["Mood"]=df["Mood"].replace(mood_dict)

Emotional Journey

Secara garis besar, langkah pertama untuk membuat figure yang menyerupai kalender tahunan adalah membuat dua array matriks kosong. Array matriks pertama adalah array yang akan berisikan tanggal, dan array kedua yang berisikan value 0 untuk diisi nantinya. Kedua array ini akan dibentuk berdasarkan tahun yang diinput dan disesuaikan bentuknya berdasarkan timestamp pada Pandas. Berikut adalah code untuk membuat kedua array tersebut.

def split_months(df, year):
    # Empty Matrices
    a = np.empty((6, 7))
    a[:] = np.nan
    day_nums = {m:np.copy(a) for m in range(1,13)}
    day_vals = {m:np.copy(a) for m in range(1,13)}
    # Shape Datatimes to Matrices in Calendar Layout
    date = pd.Timestamp(year=year, month=1, day=1) # Create timestamp based on year
    oneday = pd.Timedelta(1, unit='D') # Day +1
    while date.year == year:
        # If Value not Exist, Assign 0
        try:
            value=df[date]
        except KeyError:
            value=0
        # Get day and month number
        day, month = date.day, date.month
        # Sunday: +1; Saturday: no need
        col = (date.dayofweek+1) % 7
        if date.is_month_start:
            row = 0
        # Assign Day Number and Day Value to Empty Matrices
        day_nums[month][row, col] = day  # Day number (0-30/31)
        day_vals[month][row, col] = value # Value 
        if col == 6:
            row += 1
        date = date + oneday
    return day_nums, day_vals

Setelah membuat dua matriks tersebut, langkah selanjutnya adalah membuat figure-nya menggunakan Matplotlib. Disini, aku akan membuat terlebih dahulu variabel-variabel yang berisi value minimum dan maximum yang akan ditampilkan di Matplotlib. Selanjutnya, menggunakan Matplotlib, aku akan membuat kalender setiap bulannya dengan susunan kalender 3 kolom dengan 4 rows. Matriks yang berisi tanggal tadi akan di for loop dan ditampilkan menggunakan Matplotlib.

# --- Variables ---
vmin = df.min()
vmin = vmin if vmin < 0 else 0
vmax = df.max() 
day_nums, day_vals = split_months(df, year)
# --- Calendar Figure ---
fig, ax = plt.subplots(4, 3, figsize=(8.5, 11))
for i, axes in enumerate(ax.flat):
    # Creating Heatmap Figure
    axes.imshow(day_vals[i+1], cmap=color_map, vmin=vmin, vmax=vmax)

Agar bentuk kalender lebih terlihat proporsional, selanjutnya aku akan menambahkan nama bulan, nama hari, dan menghapus elemen-elemen yang tidak akan ditampilkan pada figure.

# --- Date Variables ---
WEEKS_IN_MONTH = 6
DAYS_IN_WEEK = 7
DAY_LABELS = ['S', 'M', 'T', 'W', 'T', 'F', 'S']
MONTH_LABELS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
# Month Title
axes.set_title(MONTH_LABELS[i], fontsize=9, fontweight=600)
# Labels
axes.set_xticks(np.arange(DAYS_IN_WEEK))
axes.set_xticklabels(DAY_LABELS, font=font_alt, fontsize=7)
axes.set_yticklabels([])
# Tick Marks
axes.tick_params(axis="both", which="both", length=0) 
axes.xaxis.tick_top()
# Modify Tick Locations
axes.set_xticks(np.arange(-0.5, 6, 1), minor=True)
axes.set_yticks(np.arange(-0.5, 5, 1), minor=True)
axes.grid(False)
# Despine
for spine in axes.spines.values(): spine.set_color("None")

Nah, sekarang figure yang ditampilkan formatnya sudah hampir menyerupai kalender nih. Agar lebih terlihat mirip kalender, disini aku akan menambahkan tanggal harian di pojok kanan atas setiap kotak hari nya dengan for loop.

# Annotate
for w in range(WEEKS_IN_MONTH):
    for d in range(DAYS_IN_WEEK):
        day_num = day_nums[i+1][w, d]
        # Add Annotation if Day Number is Valid Calendar Day
        if not np.isnan(day_num):
           day_num_text = axes.text(d+0.45, w-0.31, f"{int(day_num)}", ha="right", va="center", fontsize=5, alpha=0.8, color=color_line)

Kalian juga bisa menambahkan opsi-opsi lain yang tersedia di Matplotlib seperti Polygon, path effects, legend, atau judul, sehingga tampilan kalender nya akan lebih menarik lagi.

Summary Report

Sebelum masuk ke code flow untuk membuat gambar kedua, aku akan menjelaskan alasan pemilihan chart yang digunakan. Jadi, figure kedua ini adalah gabungan dari beberapa subplot yang kemudian digabung menjadi satu figure besar. Pada figure kedua ini, terdapat empat tipe subplot, yaitu:

    1. Gauge chart
      Gauge chart dipilih karena menurut aku tipe chart ini terbaik dalam menunjukkan progress dan metriks mood yang aku alami selama setahun penuh dibandingkan hanya menunjukkan nilai rata-rata.
    2. Stacked bar chart
      Sebenarnya, ada banyak pilihan dalam menampilkan persentase dari setiap kategori mood, contohnya histogram atau pie chart. Namun, menurut aku stacked bar chart akan lebih sesuai dalam menunjukan persentase setiap mood-nya, dikarenakan value dari chart ini dapat digolongkan ke satu kategori saja.
    3. Bar chart
      Bar chart dipilih karena chart ini cocok untuk menunjukkan progress mood dari awal hingga akhir tahun setiap bulannya. Selain itu, karena kategori yang ada di chart ini cukup sedikit, bar chart akan lebih cocok dibandingkan dengan line chart dikarenakan akan lebih gampang untuk melakukan komparasi nilai dari bulan yang satu ke yang lainnya.
    4. Line chart
      Untuk tipe ini, sama dengan poin sebelumnya, yaitu ingin menunjukkan progress dari awal hingga akhir tahun. Tetapi, karena kategori di chart ini lebih banyak dibandingkan chart sebelumnya, menurutku line chart akan lebih cocok digunakan dikarenakan chart ini cocok dalam menampilkan data point yang selalu berubah-ubah setiap saat.

Setelah memahami tipe-tipe chart dan alasan pemilihan visualisasi yang digunakan, selanjutnya aku akan membahas sedikit code yang akan digunakan untuk membuat masing-masing chart yang telah disebutkan.

Gauge Chart

Cara membuat gauge chart sebenarnya sama dengan cara membuat bar chart pada umumnya di Matplotlib. Namun, ketika akan menampilkan bar chart ini dalam subplot, perlu ditambahkan parameter “projection” agar bar chart yang ditampilkan nanti melengkung sehingga menyerupai gauge chart. Setelah bar dari gauge chart terbentuk, kalian bisa menambahkan arrow untuk menjelaskan rating atau value-nya. Berikut adalah code untuk membuat bar chart dan cara menampilkannya di dalam subplot:

# --- Figure Props ---
arrowkw = dict(arrowstyle="wedge, tail_width=0.4", facecolor=emoji_color, linewidth=1.5, edgecolor="white")
# --- Create Bar Chart ---
ax_meter.bar(x=x_axis_vals, width=0.5, height=0.5, bottom=2, linewidth=3.5, color=list_mood_color[::-1], edgecolor=face_color, align="edge")
ax_meter.annotate(" ", xytext=(0, 0), xy=(int(avg_mood)*0.22, 2.2), fontsize=60, arrowprops=arrowkw)
ax_text(x=0, y=0, s=f"{emojis}n<{avg_mood}/7>", ax=ax_meter, size=44, ha="center", va="center", font=font_emoji, color=emoji_color, highlight_textprops=highlight_prop)
# --- Showing Bar Chart in Semi-Circle Format (Gauge) ---
ax_meter = fig.add_subplot(gs[0, :1], projection="polar")

Stacked Bar Chart

Cara pembuatan stacked bar chart cukup sederhana, yaitu dengan cara membuat bar chart pada umumnya di Matplotlib. Agar tampilan dari bar chart tergabung menjadi satu kategori/menumpuk, kalian dapat menambahkan parameter “stacked” dengan value “True”. Kalian dapat menggunakan “barh” agar tampilan bar chart terlihat horizontal. Berikut adalah code untuk membuat stacked bar chart menggunakan Matplotlib:

# --- Creating Stacked Bar Chart ---
df_dist.plot.barh(stacked=True, ax=ax, legend=False, edgecolor=face_color, linewidth=2, color=dist_colors[1::])sd

Bar Chart

Untuk pembuatan bar chart, cara pembuatannya hampir mirip dengan code stacked bar seperti yang ditampilkan sebelumnya. Kalian hanya perlu mengurangi parameter “stacked” agar bar chart terlihat tidak menumpuk dan menggunakan “bar” agar tampilan bar chart terlihat vertikal.

# --- Plot ---
ax.bar(df_monthly["Month"], df_monthly["Avg Mood"], color=monthly_clr_list, **bar_prop)

Line Chart

Untuk line chart yang aku buat ini, terdiri dari 2 gabungan chart, yaitu scatter plot chart dan line chart itu sendiri. Scatter plot berfungsi sebagai markers dari line chart yang dibuat, agar lebih mudah dibaca. Jadi, langkah pertama untuk membuat gabungan chart ini adalah membuat line chart terlebih dahulu. Setelah line chart terbentuk, scatter plot akan diposisikan berada “diatas” line chart sehingga membentuk markers dari line chart. Berikut adalah code untuk membuat scatter dan line plot seperti di gambar:

# --- Line Plot ---
l0 = LineCollection(segment
                    , colors=df_weekly["Color"].str.lower()
                    , array=df_weekly["Color"].cat.codes
                    , linewidth=1)
ax.add_collection(l0)
ax.autoscale_view()
# --- Scatter Plot ---
l1 = ax.scatter(df_weekly["Week Number"], df_weekly["Mood"]
                      , color="white"
                      , marker="o"
                      , s=25
                      , edgecolor=df_weekly["Color"]
                      , zorder=3)

Oh ya, untuk kalian yang penasaran dengan code lengkapnya, kalian bisa mengunjungi Jupyter notebook yang ada di GitHub dengan mengklik link ini. Akupun juga sudah pernah menjelaskan project ini secara lebih detail lagi di video livestream yang ada di channel YouTube HaloTech Academy, replay video-nya bisa kalian lihat disini yah. Kalau kalian masih kebingungan, kalian bisa langsung menanyakan pertanyaan kalian di kolom komentar di bawah juga.

Insights

Figur “Mood Calendar”
Figur “Mood Report”

Dari visualisasi yang kubuat ini, aku bisa menyimpulkan bahwa dilihat dari rata-rata skor mood nya, tahun lalu (2023) adalah tahun yang cukup baik buat diriku. Jika dilihat dari distribution setiap kategori moodnya, ternyata di satu tahun terakhir itu mood yang aku alami tidak hanya “Above average” atau “Good” saja, tetapi ada juga “Great”, “Below Average”, ataupun “Bad”, walaupun persentase kategori mood ini tidak sebesar “Above Average” ataupun “Good”. 

Selain itu, perbedaan nilai mood antara hari satu dengan hari lainnya ternyata cukup signifikan walaupun perbedaannya hanya angka desimal. Contohnya, pada hari Senin dengan hari Sabtu atau Minggu. Walaupun sama-sama “Above Average”, tetapi ungkapan “I hate Monday” terbukti ada benarnya buat diriku di tahun lalu hahaha. Kesimpulan lainnya lagi adalah, bulan Desember adalah bulan paling menyenangkan buat diriku di tahun lalu. Hal ini karena nilai rata-rata mood di bulan Desember dan nilai rata-rata per minggunya lebih tinggi dibandingkan minggu-minggu dan bulan lainnya. Mungkin karena musim liburan kali yah, makanya skor mood nya bagus? Hehehe.

Hal-hal lain yang aku pelajari adalah, aku juga bisa lebih mengenali emosi yang kurasakan, karena dengan mencatat mood setiap hari ini, memperbolehkan aku untuk merefleksikan pola-pola mood tertentu sepanjang tahun serta lebih memahami kejadian apa yang paling mempengaruhi mood di hari itu. Contohnya, aku lebih memahami bulan-bulan di mana aku cenderung merasa lebih bahagia atau lebih stres. 

Selain itu, aku juga lebih memahami hari-hari dalam seminggu yang secara konsisten membuat mood aku lebih baik atau lebih buruk. Aku pun juga lebih memahami kejadian-kejadian, aktivitas, ataupun kebiasaan yang menyebabkan ups and downs nya emosi aku secara lebih detail lagi, serta mengetahui apa yang perlu diperbaiki atau ditingkatkan. Aku pun juga merasa lebih produktif dalam melakukan habit yang sudah kurencanakan di akhir tahun 2022.

Itu aja yang aku bisa sharing ke sobat Exsight terkait project yang aku buat. Jika kalian penasaran dengan visualisasi-visualisasi lain yang aku buat selain visualisasi diatas, kalian bisa langsung mengunjungi GitHub repository nya “Data Slices” disini

Kalau kalian tidak mau ketinggalan dengan visualisasi yang akan aku buat selanjutnya, kalian bisa langsung memfollow social media aku yang ada di https://linktr.ee/caesarmario_ atau men-star repository nya “Data Slices” disini. Stay tuned di website https://exsight.id/blog/ agar tidak ketinggalan artikel-artikel menarik lainnya. Bye bye!

Membuat Mood Tracking dengan Python Read More »

Hubungi Admin
Halo, selamat datang di Exsight! 👋

Hari ini kita ada DISKON 20% untuk semua transaksi. Klaim sekarang!