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 durationterhadap 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()


numberofword-vs-engagementrate

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)


wordcloud

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()


duration-vs-engagementrate

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()


createtime-vs-engagementrate

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.