
Pernahkah Anda bertanya-tanya bagaimana Gmail tahu bahwa email yang menjanjikan $10 juta adalah spam? Atau bagaimana cara menangkap pesan “Anda memenangkan iPhone gratis!” sebelum mencapai inbox Anda?
Dalam tutorial ini, Anda akan membuat classifier email spam sendiri dari awal menggunakan algoritma Naive Bayes. Pada akhirnya, Anda akan memiliki model yang berfungsi dengan akurasi lebih dari 97%—dan Anda akan memahami dengan tepat bagaimana cara kerjanya.
Apa yang Akan Anda Pelajari
- Bagaimana filter spam email sebenarnya bekerja
- Intuisi di balik algoritma Naïve Bayes
- Teknik preprocessing teks untuk machine learning
- Cara mengevaluasi model klasifikasi
- Membangun pipeline deteksi spam lengkap dengan Python
Prasyarat
Anda harus memiliki pemahaman dasar tentang Python dan beberapa pemahaman tentang konsep fundamental machine learning. Jangan khawatir jika Anda masih belajar—saya akan menjelaskan semuanya seiring berjalannya waktu.
Mengapa Naive Bayes untuk Deteksi Spam?
Sebelum kita menyelami kode, mari pahami mengapa Naive Bayes sangat cocok untuk tugas ini.
Bayangkan Anda menerima email yang berisi kata-kata seperti “gratis,” “pemenang,” “klik di sini,” dan “penawaran waktu terbatas.” Otak Anda langsung menandai ini sebagai mencurigakan. Algoritma Naive Bayes melakukan sesuatu yang serupa—algoritma ini menghitung probabilitas bahwa sebuah email adalah spam berdasarkan kata-kata yang dikandungnya.
Algoritma ini disebut “naive” (naif) karena membuat asumsi penyederhanaan: memperlakukan setiap kata sebagai independen dari kata lainnya. Pada kenyataannya, kombinasi kata penting (pikirkan “uji coba gratis” vs “uang gratis”), tetapi penyederhanaan ini bekerja dengan sangat baik dalam praktik.
Mengapa Memilih Naive Bayes?
- Kecepatan: Melatih dengan sangat cepat, bahkan pada dataset besar
- Efisiensi: Membutuhkan data pelatihan minimal untuk menghasilkan hasil yang andal
- Kesederhanaan: Mudah diimplementasikan dan diinterpretasikan
- Performa: Meskipun sederhana, sering mengungguli algoritma yang lebih kompleks untuk klasifikasi teks
Menyiapkan Lingkungan
Pertama, instal library yang diperlukan:
%pip install regex wordcloud numpy pandas seaborn matplotlib scikit-learn
Berikut ringkasan singkat tentang apa yang dilakukan setiap library:
- regex / re — untuk membersihkan teks menggunakan pencocokan pola
- wordcloud — untuk memvisualisasikan kata-kata yang paling sering muncul
- numpy & pandas — untuk pemuatan dan manipulasi data
- seaborn & matplotlib — untuk bagan dan visualisasi
- scikit-learn — menyediakan classifier Naive Bayes, vectorizer, dan alat evaluasi
Setelah instalasi selesai, impor semua library:
# Manipulasi dan analisis data
import pandas as pd
import numpy as np
# Visualisasi data
import seaborn as sns
import matplotlib.pyplot as plt
# Pemrosesan bahasa alami
import nltk
import re
from nltk.corpus import stopwords
# Machine learning
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
# Visualisasi word cloud
from wordcloud import WordCloud
Memuat dan Menjelajahi Dataset
Kami akan menggunakan dataset email yang berlabel. Anda dapat mengunduhnya dari Kaggle.
message_dataset = pd.read_csv('emails.csv')
message_dataset.head()
Dataset berisi 5.728 email dengan dua kolom: text (konten email) dan spam (1 untuk spam, 0 untuk email yang sah).
Memvisualisasikan Distribusi Data
plt.rcParams["figure.figsize"] = [8, 10]
message_dataset.spam.value_counts().plot(kind="pie", autopct="%1.0f%%")

Sekitar 24% email dalam dataset adalah spam, sementara 76% adalah email sah.
Menganalisis Pola Kata dengan Word Clouds
stop = stopwords.words("english")
message_dataset["text_without_sw"] = message_dataset["text"].apply(
lambda x: " ".join([item for item in x.split() if item not in stop])
)
Word Cloud Email Spam:

Word Cloud Email Sah:

Observasi Utama:
- Email spam: “free,” “money,” “offer,” “click,” “please”
- Email sah: “company,” “time,” “thanks”
Preprocessing Data Teks
def clean_text(doc):
document = re.sub('[^a-zA-Z]', ' ', doc)
document = re.sub(r'\s+[a-zA-Z]\s+', ' ', document)
document = re.sub(r'\s+', ' ', document)
return document
Mengonversi Teks ke Fitur Numerik
Kita menggunakan TF-IDF (Term Frequency-Inverse Document Frequency):
vectorizer = TfidfVectorizer(
max_features=2500,
min_df=5,
max_df=0.7,
stop_words=stopwords.words('english')
)
X = vectorizer.fit_transform(X_sentences).toarray()
Melatih Classifier Naive Bayes
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.20,
random_state=42
)
spam_detector = MultinomialNB()
spam_detector.fit(X_train, y_train)
Evaluasi Performa Model
y_pred = spam_detector.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
Hasil:
Akurasi Model: 97.82%
| Predicted: Sah | Predicted: Spam | |
|---|---|---|
| Actual: Sah | 849 (TN) | 7 (FP) |
| Actual: Spam | 18 (FN) | 272 (TP) |
Menguji Email Individual
print(spam_detector.predict(vectorizer.transform([X_sentences[56]])))
Output: [1] ✅ Model dengan benar mengidentifikasi email promosi sebagai SPAM!
Kesimpulan
Anda telah membangun classifier email spam yang mencapai lebih dari 97% akurasi menggunakan algoritma Naïve Bayes. Di sepanjang jalan, Anda belajar tentang:
- ✅ Preprocessing teks
- ✅ Ekstraksi fitur dengan TF-IDF
- ✅ Teknik evaluasi model
Langkah Selanjutnya
- Bereksperimen dengan vectorizer berbeda: Coba CountVectorizer atau word embeddings (Word2Vec, GloVe)
- Tangani ketidakseimbangan kelas: Gunakan teknik seperti SMOTE atau sesuaikan class weights
- Feature engineering: Tambahkan fitur seperti panjang email, jumlah link, atau domain pengirim
- Coba algoritma lain: Bandingkan dengan SVM, Random Forest, atau gradient boosting
- Deploy model: Bangun API sederhana menggunakan Flask atau FastAPI
Sumber: freeCodeCamp – Diterjemahkan ke Bahasa Indonesia


























