Menganalisis Data dari TikTok
Pada artikel ini, kita akan melanjutkan proses setelah mendapatkan data dari TikTok berdasarkan artikel Mengambil Data TikTok dengan Python. Artikel ini akan memberikan panduan tentang apa yang dapat dilakukan dengan data tersebut. Seperti analisis data, visualisasi, atau pemrosesan lanjutan menggunakan Python.
Selain itu, artikel ini juga akan menyajikan contoh kode dan penjelasan tentang bagaimana menerapkan teknik-teknik analisis data dan visualisasi tertentu pada data TikTok yang telah diperoleh. Hal ini dapat memberikan panduan praktis untuk memanfaatkan data TikTok secara lebih mendalam dan mendapatkan wawasan yang lebih luas.
Pratinjau Data
Berdasarkan hasil sebelumnya, kita akan memiliki data seperti berikut.
no | video_id | like_count | share_count | comment_count | view_count | create_time | desc | duration | url | engagement_rate |
---|---|---|---|---|---|---|---|---|---|---|
52 | 7005179217025518875 | 7 | 0 | 0 | 572 | 2021-09-07 20:13:06 | #fyp #toyota #ae92 #corolla #twincam #gti | 7 | https://www.tiktok.com/@yudopr/video/7005179217025518875 | 1.2237762237762237 |
53 | 6965476624628305153 | 12 | 0 | 1 | 546 | 2021-05-23 20:26:48 | Derita gak punya garasi atau carport… | 8 | https://www.tiktok.com/@yudopr/video/6965476624628305153 | 2.380952380952381 |
54 | 6959200138430532865 | 6 | 0 | 1 | 516 | 2021-05-06 22:30:50 | 11 | https://www.tiktok.com/@yudopr/video/6959200138430532865 | 1.3565891472868217 |
Pada data yang sudah kita dapatkan, informasi pada kolom like_count
, share_count
, comment_count
, dan view_count
sudah diproses menjadi satu metrik yaitu engagement_rate
sehingga kolom yang dapat kita analisis lebih lanjut adalah create_time
, desc
, duration
, dan engagement_rate
.
Jika kita adalah seorang influencer yang ingin menganalisis data video dengan tujuan meningkatkan atau mempertahankan metrik engagement_rate
, maka kita akan menganalisis hubungan create_time
, desc
, dan duration
terhadap engagement_rate
.
Untuk tutorial kali ini, kita akan menggunakan data yang sudah saya ambil terhadap akun TikTok saya. Unduh di sini.
Impor Pustaka Python
Untuk analisis data, kita akan menggunakan pustaka sebagai berikut:
- matplotlib
- numpy
- pandas
- scikit-learn
- scipy
- wordcloud
Jika kalian belum pernah menginstall pustaka di atas, silakan jalan perintah di bawah ini di terminal komputer kalian.
pip install numpy pandas scikit-learn scipy wordcloud
Apabila semua pustaka di atas sudah terinstall kalian dapat mengimpor pustaka-pustaka yang perlukan menggunakan kode di bawah ini.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.stats import pearsonr, spearmanr, kendalltau
import math
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
Di sini kita akan menggunakan pandas
untuk membaca file csv, matplotlib
dan wordcloud
untuk membuat grafik, scikit-learn
untuk membuat garis regresi dan pembobotan teks menjadi vektor, dan scipy
untuk menghitung korelasi.
Preparasi Data
Kita akan membaca file csv dan mengolah data dengan sederhana sebelum masuk ke proses analisis.
# Membaca file csv
data = pd.read_csv("async.csv")
# Mengisi kolom deskripsi yang null
data["desc"].fillna('', inplace=True)
# Mengubah create_time menjadi format datetime
data['create_time'] = pd.to_datetime(data['create_time'])
Pada kode di atas, kita melakukan dua hal preparasi sebelum masuk analisis seperti mengisi kolom desc
yang null dengan ""
agar kolom desc
dapat diproses menjadi vektor. Yang terakhir, kita mengubah kolom create_time
yang awalnya berformat string menjadi format datetime.
Selanjutnya, kita hanya akan mengambil bagian time pada create_time
karena informasi tanggal tidak terlalu diperlukan. Namun, jam video dibuat atau diunggah sangat dibutuhkan karena jika kita mengunggah video di jam tepat seperti jam di saat banyak user sedang aktif akan memengaruhi engagement_time
.
# Mengambil time dari datetime dan mengelompokkannya dalam interval 1 jam
def categorize_time(row):
time = row.time()
hour = math.floor(time.hour) # Membulatkan jam ke bawah
interval_start = pd.to_datetime(f'{row.date()} {hour:02d}:00:00') # Batas bawah interval
interval_end = interval_start + pd.DateOffset(hours=1) # Batas atas interval
return f'{interval_start.strftime("%H:%M")} - {interval_end.strftime("%H:%M")}'
data['create_time_interval'] = data['create_time'].apply(categorize_time)
Setelah mengambil bagian time, kita akan mengelompokkannya ke dalam interval waktu. Sebagai contoh, misal 18:40
akan masuk ke dalam kelompok 18:00 - 19:00
dan seterusnya.
Menganalisis Data
Banyak Kata pada Deskripsi vs Engagement Rate
Analisis pertama yang akan kita lakukan adalah melihat hubungan banyak kata pada deskripsi (num_words
) terhadap engagement rate
. Kita juga akan menggambar garis regresinya menggunakan regresi nonlinear yaitu berderajat 3. Derajat 3 dipilih karena paling mengikuti pola dari scatter plot num_words
terhadap engagement_rate
. Kalian bisa mengubah derajat sesuka kalian dan pilih derajat yang paling tepat menurut kalian.
Selain menggambar garis regresi, kita juga menghitung korelasi num_words
terhadap engagement_rate
dengan menggunakan tiga metrik yaitu korelasi pearson, korelasi spearman, dan korelasi kendall-tau sebagai informasi tambahan mengapa garis regresi kita tidak terlalu mengikuti trend data.
# Menghitung banyak kata pada deskripsi
num_words = data['desc'].apply(lambda x: len(x.split()))
# Mengurutkan duration_minutes dan engagement_rate berdasarkan duration_minutes secara ascending
sorted_indices = np.argsort(num_words)
num_words_sorted = num_words.iloc[sorted_indices]
engagement_rate_sorted = data['engagement_rate'].iloc[sorted_indices]
# Membuat garis regresi
poly_features = PolynomialFeatures(degree=3)
X_poly = poly_features.fit_transform(num_words_sorted.values.reshape(-1, 1))
regressor = LinearRegression()
regressor.fit(X_poly, engagement_rate_sorted)
# Menghitung korelasi
pearson_corr_word, ppw = pearsonr(num_words_sorted, engagement_rate_sorted)
spearman_corr_word, psw = spearmanr(num_words_sorted, engagement_rate_sorted)
kendall_corr_word, pkw = kendalltau(num_words_sorted, engagement_rate_sorted)
# Menggambar grafik
plt.scatter(num_words_sorted, engagement_rate_sorted)
plt.xlabel('Number of Words in Description')
plt.ylabel('Engagement Rate')
plt.title('Number of Words in Description vs Engagement Rate')
plt.text(0.95, 0.95, 'Correlation', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.9, f'Pearson: {pearson_corr_word:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.85, f'Spearman: {spearman_corr_word:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.8, f'Kendall: {kendall_corr_word:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.plot(num_words_sorted, regressor.predict(X_poly), color='red', linewidth=2, label='Non-linear Regression Line')
plt.legend()
plt.show()

Pada grafik di atas, kita mendapatkan bahwa korelasi num_words
terhadap engagement_rate
berkisar pada rentang [0.206, 0.273]
. Dapat kita lihat bahwa titik-titik berkumpul sekitar daerah num_word
pada rentang [10, 30]
dan engagement_rate
pada rentang [5, 7]
.
Dengan menjaga banyak kata pada deskripsi video sebanyak 10 sampai 30 kata dapat menjaga atau mungkin meningkatkan engagement_rate
dari sebuah video.
Peringkat 100 Kata Teratas pada Deskripsi
Kedua, kita akan coba mencari 100 kata teratas dari setiap korelasi pearson, korelasi spearman, dan korelasi kendall-tau. Informasi ini dapat berguna untuk melihat kata yang mungkin dapat mempertahankan atau meningkatan engagement_rate
suatu video. Selain itu, kita juga mencari kata-kata yang terdapat pada tiga himpunan 100 kata teratas dari setiap korelasi.
Pada kode di bawah ini dapat kalian ubah menjadi lebih baik lagi dengan menggunakan stopwords dan stemming kata (mengubah kata menjadi kata dasar) sebelum membuat vektornya atau menggunakan metode lain untuk memvektorisasi kata.
# Word cloud peringkat 100 kata teratas pada setiap korelasi
vectorizer = TfidfVectorizer(token_pattern=r'#?\w+')
desc_vectorized = vectorizer.fit_transform(data['desc'])
correlations = []
words = vectorizer.get_feature_names_out()
for i, word in enumerate(words):
word_vector = desc_vectorized[:, i].toarray().flatten()
pearson_corr, _ = pearsonr(word_vector, data['engagement_rate'])
spearman_corr, _ = spearmanr(word_vector, data['engagement_rate'])
kendall_corr, _ = kendalltau(word_vector, data['engagement_rate'])
correlations.append((word, pearson_corr, spearman_corr, kendall_corr))
correlation_labels = ['Pearson', 'Spearman', "Kendall's Tau"]
intersection_words = []
# Membuat word cloud untuk peringkat 100 kata teratas dengan korelasi positif untuk setiap korelasi
for metric in correlation_labels:
# Mendapatkan 100 kata teratas dengan korelasi positif untuk setiap korelasi
top_words = sorted(correlations, key=lambda x: x[correlation_labels.index(metric) + 1], reverse=True)[:100]
positive_words = [word for word, corr, _, _ in top_words if corr > 0]
# Membuat word cloud
word_cloud_data = dict(zip(positive_words, [1] * len(positive_words)))
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(word_cloud_data)
# Menggambar word cloud
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title(f'Top 100 Words ({metric} Correlation) - Word Cloud')
plt.show()
# Menyimpan 100 kata teratas setiap korelasi dalam list
intersection_words.append(set(positive_words))
# Mencari irisan kata yang ada pada setiap himpunan 100 kata teratas dari tiga metrik korelasi
common_words = set.intersection(*intersection_words)
common_words = sorted(list(common_words))
print(common_words)

Dapat kita lihat dengan sekilas dari ketiga word cloud di atas bahwa, kata yang memuat “sql” selalu berada di peringkat 100 teratas. Sedangkan untuk kata-kata yang selalu ada pada ketiga himpunan 100 kata teratas adalah sebagai berikut.
['#analyst', '#bigquery', '#businessintelligence', '#dataanalyst', '#dataanlyst',
'#database', '#dataengineering', '#datascience', '#developer', '#facebook',
'#google', '#interview', '#kenikmatanhakikiramadan', '#linkedin', '#postgresql',
'#query', '#rdbms', '#sql', '#study', '#studysql', '#tiktokinterview', '5',
'adalaha', 'agar', 'avg', 'baca', 'baris', 'belajar', 'berguna', 'bertipe',
'cara', 'casting', 'challenge', 'concat', 'confirmation', 'dan', 'data', 'day',
'di', 'digunakan', 'dilakukan', 'dua', 'erd', 'fixed', 'full', 'fungsi', 'gue',
'gunanya', 'hanya', 'ini', 'inner', 'join', 'journey', 'juga', 'kali', 'kolom',
'kueri', 'lebih', 'left', 'menggabungkan', 'mengubah', 'menurut', 'menyamakan',
'metacritic', 'mudah', 'operator', 'optimasi', 'pada', 'panduessentials', 'sama',
'satu', 'sebelumnya', 'second', 'selama', 'serta', 'sisi', 'soal', 'software',
'sql', 'string', 'sum', 'tempat', 'terakhir', 'tipe', 'tnnz', 'user', 'website',
'where', 'yang']
Kata-kata pada list di atas dapat menjadi acuan sebagai kata yang sebaiknya ada dalam deskripsi untuk menjaga atau mungkin meningkatkan engagement_rate
sebuah video.
Durasi vs Engagement Rate
Ketiga, kita akan melihat hubungan durasi video (duration
) terhadap engagement_rate
. Pada data awal, kolom duration
dalam satuan detik tapi kita akan ubah ke dalam satuan menit untuk memudahkan membaca.
Sama seperti banyak kata dalam deskripsi (num_words
) terhadap engagement_rate
, kita akan membuat garis regresi dan juga menghitung korelasinya.
# Mengubah detik menjadi menit
duration_minutes = data['duration'] / 60 # Convert duration to minutes
# Mengurutkan duration_minutes dan engagement_rate berdasarkan duration_minutes secara ascending
sorted_indices = np.argsort(duration_minutes)
duration_minutes_sorted = duration_minutes.iloc[sorted_indices]
engagement_rate_sorted = data['engagement_rate'].iloc[sorted_indices]
# Membuat garis regresi
poly_features = PolynomialFeatures(degree=3, include_bias=False)
X_poly = poly_features.fit_transform(duration_minutes_sorted.values.reshape(-1, 1))
regressor = LinearRegression()
regressor.fit(X_poly, engagement_rate_sorted)
# Menghitung korelasi
pearson_corr_dur, ppd = pearsonr(duration_minutes_sorted, engagement_rate_sorted)
spearman_corr_dur, psd = spearmanr(duration_minutes_sorted, engagement_rate_sorted)
kendall_corr_dur, pkd = kendalltau(duration_minutes_sorted, engagement_rate_sorted)
# Menggambar grafik
plt.scatter(duration_minutes_sorted, engagement_rate_sorted)
plt.xlabel('Duration (minutes)')
plt.ylabel('Engagement Rate')
plt.title('Duration vs Engagement Rate')
plt.text(0.95, 0.95, 'Correlation', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.9, f'Pearson: {pearson_corr_dur:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.85, f'Spearman: {spearman_corr_dur:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.text(0.95, 0.8, f'Kendall: {kendall_corr_dur:.3f}', transform=plt.gca().transAxes, va='top', ha='right')
plt.plot(duration_minutes_sorted, regressor.predict(X_poly), color='red', linewidth=2, label='Non-linear Regression Line')
plt.legend()
plt.show()

Pada grafik di atas, kita mendapatkan bahwa korelasi duration
terhadap engagement_rate
berkisar pada rentang [0.375, 0.508]
, relatif lebih besar dibandingkan korelasi num_words
dengan engagement_rate
.
Apabila kita lihat dari garis regresi, engagement_rate
meningkatan seiring meningkatnya duration
. Namun setelah duration
bernilai 4, nilai engagement_rate
menjadi menurun dan stagnan.
Dengan menetapkan minimal durasi adalah 1 menit dan maksimal durasi video adalah 4 menit dapat membantu menjaga engagement_rate
. Ada kemungkinan dengan membuat video berdurasi sekitar 2 menit sampai 4 menit dapat meningktan engagement_rate
.
Create Time vs Engagement Rate
Terakhir, kita akan melihat hubungan waktu unggah (create_time
) terhadap engagement_rate
. Kali ini, kita akan menghitung rata-rata engagement_rate
video pada setiap kelompok interval dengan grafik batang dan diurutkan berdasarkan rata-rata engagement_time
terbesar hingga terendah.
# Mengurutkan interval create_time berdasarkan engagement_rate secara descending
sorted_intervals = data.groupby('create_time_interval')['engagement_rate'].mean().sort_values(ascending=False)
plt.bar(sorted_intervals.index, sorted_intervals)
plt.xlabel('Create Time Interval')
plt.ylabel('Engagement Rate')
plt.title('Create Time Interval vs Engagement Rate (Sorted)')
plt.xticks(rotation=90)
plt.show()

Berdasarkan grafik di atas, dapat dilihat bahwa create_time
pada interval 17:00 - 18:00
memiliki video dengan rata-rata engagement_time
paling tinggi. Di urutan kedua ada interval 04:00 - 05:00
dan 18:00 - 19:00
Dengan mengunggah video di selang pukul 17:00 hingga 19:00 berkemungkinan untuk mendapatkan engagement_time
yang tinggi.
Kesimpulan
Analisis data TikTok menggunakan Python dapat memberikan insight yang berharga bagi seorang influencer TikTok untuk memahami tren dan faktor-faktor yang mempengaruhi kesuksesan sebuah video miliknya.
Pada kasus ini, akun TikTok saya dapat menjaga engagement rate atau bahkan meningkatkannya dengan melakukan hal-hal sebagai berikut:
- Menjaga banyak kata pada deskripsi video sebanyak 10 sampai 30 kata.
- Menggunakan kata-kata yang muncul pada peringkat 100 kata teratas untuk dimasukkin dalam deskripsi video.
- Membuat video dengan durasi minimal 1 menit dan maksimal 4 menit.
- Mengunggah video pada pukul 17:00 hingga 19:00.
Kita telah menunjukkan bahwa analisis data TikTok dapat memberikan insight berharga bagi seorang influencer untuk meningkatkan kesuksesan video mereka dalam hal ini engagement rate dan memperluas jangkauan konten mereka di platform TikTok.