Perkembangan dunia digital yang semakin kompetitif merubah cara website bersaing di mesin pencari. Kehadiran AI Overview, algoritma yang semakin cerdas, serta perubahan user behavior membuat strategi Search Engine Optimization (SEO) tidak lagi cukup hanya mengandalkan optimasi manual dan intuisi saja. Di era modern, website tidak hanya berkompetisi dengan sesama kompetitor website lain, namun juga sistem kecerdasan buatan yang mampu menampilkan jawaban instant kepada pengguna dalam hasil pencarian informasi.
Kecepatan perubahan digital ini menuntut sebuah pendekatan yang berbasis data. Praktik SEO modern kini tidak lagi sekadar berfokus pada penggunaan keyword atau peningkatan jumlah backlink semata, melainkan bagaimana memahami pola algoritma mesin pencari serta analisis data yang lebih mendalam. Dalam dunia marketing kita banyak sekali menemui variabel SEO yang saling berkaitan dan berubah secara dinamis.
Salah satu metriks SEO yang sering kita jumpai adalah SEO Off-Page. SEO Off-Page adalah faktor-faktor eksternal website seperti backlink, domain authority, social share, brand mentions, hingga spam score. Variabel ini memiliki pengaruh besar terhadap performa dan ranking website di mesin pencari. Namun, banyaknya variabel yang saling berkaitan membuat proses analisis SEO menjadi semakin sulit dipahami.
Machine Learning memiliki kemampuan untuk dapat mengubah data SEO menjadi wawasan strategis. Dengan bantuan bahasa pemrograman Python dan library seperti Scikit-learn, Pandas, serta Matplotlib, data SEO yang bersifat dianalisis secara lebih mendalam untuk menemukan pola tersembunyi.
Berikut adalah sebuah implementasi sederhana machine learning untuk SEO menggunakan algoritma Decision Tree Classifier yang dapat digunakan untuk mengklasifikasikan ranking website berdasarkan faktor SEO Off-Page. Melalui pendekatan Machine Learning, proses evaluasi SEO tidak lagi hanya berdasarkan asumsi
Disclaimer
Implementasi Machine Learning dalam penelitian ini masih bersifat simulasi awal dan jauh dari kata sempurna. Dataset yang digunakan masih terbatas sehingga diperlukan integrasi data real-time melalui API tools SEO agar hasil analisis lebih akurat dan relevan. Selain itu, perubahan algoritma mesin pencari yang terus berkembang sangat mempengaruhi hasil model. Oleh karena itu, penelitian ini masih memerlukan penyempurnaan lebih lanjut, baik dari sisi dataset, feature engineering, maupun pengembangan algoritma agar mampu menghasilkan prediksi yang lebih optimal.
# ==========================================================
# 1. IMPORT LIBRARY
# ==========================================================
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# ==========================================================
# 2. MEMBUAT DATASET
# ==========================================================
np.random.seed(42)
n = 300
data = pd.DataFrame({
"Backlinks": np.random.randint(100, 5000, n),
"Domain_Authority": np.random.randint(10, 100, n),
"Referring_Domains": np.random.randint(5, 500, n),
"Social_Share": np.random.randint(50, 5000, n),
"Guest_Post": np.random.randint(0, 50, n),
"Brand_Mention": np.random.randint(10, 1000, n),
"Influencer_Backlink": np.random.randint(0, 30, n),
"Spam_Score": np.random.randint(1, 20, n),
})
seo_score = (
(data["Backlinks"] * 0.002) +
(data["Domain_Authority"] * 0.6) +
(data["Referring_Domains"] * 0.05) +
(data["Social_Share"] * 0.003) +
(data["Guest_Post"] * 0.5) +
(data["Brand_Mention"] * 0.01) +
(data["Influencer_Backlink"] * 1.5) -
(data["Spam_Score"] * 2)
)
conditions = [
seo_score >= 120,
(seo_score >= 80) & (seo_score < 120),
seo_score < 80
]
ranking = ["High", "Medium", "Low"]
data["SEO_Rank"] = np.select(
conditions,
ranking,
default="Low"
)
data.to_csv("seo_offpage_dataset.csv", index=False)
print(data.head())
# ==========================================================
# 3. DATA UNDERSTANDING
# ==========================================================
print(data.head())
print(data.info())
print(data.describe())
# ==========================================================
# 4. VISUALISASI DISTRIBUSI TARGET
# ==========================================================
data["SEO_Rank"].value_counts().plot(kind='bar')
plt.title("Distribusi SEO Rank")
plt.show()
# ==========================================================
# 5. MENENTUKAN FITUR DAN TARGET
# ==========================================================
X = data.drop("SEO_Rank", axis=1)
y = data["SEO_Rank"]
# ==========================================================
# 6. TRAIN-TEST SPLIT
# ==========================================================
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42
)
# ==========================================================
# 7. TRAINING MODEL DECISION TREE
# ==========================================================
model = DecisionTreeClassifier(max_depth=5, random_state=42)
model.fit(X_train, y_train)
# ==========================================================
# 8. PREDIKSI DATA TESTING
# ==========================================================
y_pred = model.predict(X_test)
# ==========================================================
# 9. EVALUASI MODEL
# ==========================================================
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
# ==========================================================
# 10. CONFUSION MATRIX
# ==========================================================
cm = confusion_matrix(y_test, y_pred)
print(cm)
# ==========================================================
# 10. CONFUSION MATRIX
# ==========================================================
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
# Membuat confusion matrix
cm = confusion_matrix(y_test, y_pred)
# Membuat visualisasi confusion matrix
plt.figure(figsize=(8,6))
plt.imshow(cm, interpolation='nearest', cmap='viridis')
plt.title('Confusion Matrix - Decision Tree', fontsize=20)
# Menampilkan color bar
plt.colorbar()
# Label kelas
classes = ['High', 'Medium', 'Low']
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, fontsize=14)
plt.yticks(tick_marks, classes, fontsize=14)
# Menampilkan angka di dalam kotak
for i in range(len(classes)):
for j in range(len(classes)):
plt.text(
j,
i,
cm[i, j],
ha="center",
va="center",
color="yellow",
fontsize=16
)
# Label sumbu
plt.ylabel('True label', fontsize=16)
plt.xlabel('Predicted label', fontsize=16)
plt.tight_layout()
plt.show()
# ==========================================================
# 11. FEATURE IMPORTANCE
# ==========================================================
importance = pd.DataFrame({
"Feature": X.columns,
"Importance": model.feature_importances_
}).sort_values(by="Importance", ascending=False)
print(importance)
# ==========================================================
# 11. FEATURE IMPORTANCE
# ==========================================================
# Mengambil nilai feature importance
importance = pd.DataFrame({
'Feature': X.columns,
'Importance': model.feature_importances_
})
# Mengurutkan dari terbesar
importance = importance.sort_values(
by='Importance',
ascending=True
)
# Menampilkan data importance
print(importance)
# Membuat grafik feature importance
plt.figure(figsize=(10,6))
plt.barh(
importance['Feature'],
importance['Importance']
)
# Judul grafik
plt.title(
'Faktor Yang Mempengaruhi Ranking SEO OFF PAGE',
fontsize=18
)
# Label sumbu
plt.xlabel('Nilai Importance', fontsize=14)
plt.ylabel('Faktor SEO OFF PAGE', fontsize=14)
# Menampilkan nilai di samping bar
for index, value in enumerate(importance['Importance']):
plt.text(
value,
index,
f'{value:.2f}',
va='center',
fontsize=12
)
plt.tight_layout()
plt.show()
# ==========================================================
# 12. SIMULASI PREDIKSI
# ==========================================================
sample = pd.DataFrame({
"Backlinks": [4500],
"Domain_Authority": [85],
"Referring_Domains": [400],
"Social_Share": [3500],
"Guest_Post": [25],
"Brand_Mention": [800],
"Influencer_Backlink": [20],
"Spam_Score": [3]
})
prediction = model.predict(sample)
print("Prediksi SEO Rank:", prediction)