Table of Contents
▼- Mengapa Sistem Rekomendasi Penting untuk Bisnis Online?
- 3 Jenis Algoritma Sistem Rekomendasi yang Perlu Anda Ketahui
- Implementasi Sistem Rekomendasi Sederhana dengan PHP
- Optimasi Performa untuk Traffic Tinggi
- Menambahkan Content-Based Filtering untuk Hasil Lebih Baik
- Menggabungkan Collaborative dan Content-Based (Hybrid)
- Mengintegrasikan dengan Frontend Website
- Tracking dan Analisis Efektivitas Rekomendasi
- A/B Testing untuk Optimasi Berkelanjutan
- Tips Implementasi untuk UMKM dengan Budget Terbatas
- Common Pitfalls yang Harus Dihindari
- Kesimpulan
Pernahkah Anda bertanya-tanya kenapa Tokopedia atau Shopee selalu tahu produk apa yang Anda inginkan? Rahasianya ada pada sistem rekomendasi produk yang bekerja di balik layar.
Sistem ini bukan hanya untuk raksasa e-commerce saja. Toko online UMKM pun bisa memanfaatkannya untuk meningkatkan penjualan hingga 35% menurut riset McKinsey.
Di artikel ini, saya akan membongkar cara membangun sistem rekomendasi produk yang efektif, mulai dari algoritma sederhana hingga implementasi yang bisa langsung Anda terapkan.
Mengapa Sistem Rekomendasi Penting untuk Bisnis Online?
Bayangkan pelanggan masuk ke toko online Anda dengan 500 produk. Tanpa panduan, mereka akan bingung dan akhirnya pergi tanpa membeli.
Sistem rekomendasi bertindak seperti sales assistant pintar yang memahami preferensi setiap pelanggan.
Data dari Salesforce menunjukkan 56% konsumen lebih loyal terhadap brand yang memberikan pengalaman personal.
Untuk bisnis Indonesia, ini berarti peluang emas meningkatkan repeat order dan customer lifetime value.
3 Jenis Algoritma Sistem Rekomendasi yang Perlu Anda Ketahui
1. Collaborative Filtering (Rekomendasi Berbasis Perilaku Pengguna)
Algoritma ini bekerja dengan prinsip "orang yang mirip dengan Anda juga menyukai ini".
Misalnya, jika User A dan User B sama-sama membeli produk X dan Y, lalu User A membeli produk Z, sistem akan merekomendasikan produk Z ke User B.
Ada dua tipe collaborative filtering:
- User-based: Mencari kesamaan antar pengguna
- Item-based: Mencari kesamaan antar produk
Item-based lebih scalable untuk toko dengan produk banyak karena pola produk lebih stabil dibanding perilaku user.
2. Content-Based Filtering (Rekomendasi Berbasis Karakteristik Produk)
Metode ini menganalisis fitur produk seperti kategori, brand, harga, atau deskripsi.
Jika pelanggan sering membeli baju hijab warna pastel, sistem akan merekomendasikan produk serupa.
Keunggulannya: tidak butuh data interaksi pengguna lain, cocok untuk produk baru (cold start problem).
3. Hybrid Approach (Kombinasi Keduanya)
Sistem modern biasanya mengkombinasikan collaborative dan content-based untuk akurasi maksimal.
Netflix dan Amazon menggunakan pendekatan hybrid ini untuk memberikan rekomendasi yang lebih personal dan akurat.
Implementasi Sistem Rekomendasi Sederhana dengan PHP
Mari kita mulai dengan implementasi collaborative filtering sederhana menggunakan item-based approach.
Persiapan Database
Pertama, kita butuh tabel untuk menyimpan data transaksi:
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id),
INDEX idx_product (product_id)
);
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
category VARCHAR(100),
price DECIMAL(10,2),
description TEXT
);
Struktur sederhana ini cukup untuk memulai sistem rekomendasi Anda.
Menghitung Product Similarity
Kita akan menggunakan Jaccard Similarity untuk mengukur kemiripan antar produk berdasarkan pembeli yang sama:
<?php
class ProductRecommendation {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
}
// Hitung similarity antar produk
public function calculateSimilarity($productA, $productB) {
// Ambil user yang membeli produk A
$usersA = $this->getUsersByProduct($productA);
// Ambil user yang membeli produk B
$usersB = $this->getUsersByProduct($productB);
// Hitung intersection (user yang beli A dan B)
$intersection = count(array_intersect($usersA, $usersB));
// Hitung union (user yang beli A atau B)
$union = count(array_unique(array_merge($usersA, $usersB)));
// Jaccard similarity = intersection / union
return $union > 0 ? $intersection / $union : 0;
}
private function getUsersByProduct($productId) {
$stmt = $this->pdo->prepare(
"SELECT DISTINCT user_id FROM orders WHERE product_id = ?"
);
$stmt->execute([$productId]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
}
?>
Jaccard similarity memberikan score 0-1, dimana 1 berarti produk sangat mirip berdasarkan pembeli yang sama.
Menghasilkan Rekomendasi
Setelah similarity dihitung, kita bisa generate rekomendasi untuk user tertentu:
<?php
public function getRecommendations($userId, $limit = 5) {
// Ambil produk yang sudah dibeli user
$purchasedProducts = $this->getUserPurchases($userId);
if (empty($purchasedProducts)) {
// Jika belum ada pembelian, return produk populer
return $this->getPopularProducts($limit);
}
$recommendations = [];
// Untuk setiap produk yang sudah dibeli
foreach ($purchasedProducts as $productId) {
// Cari produk similar yang belum dibeli
$similar = $this->getSimilarProducts($productId, $purchasedProducts);
foreach ($similar as $simProduct) {
$score = $this->calculateSimilarity($productId, $simProduct['id']);
if (!isset($recommendations[$simProduct['id']])) {
$recommendations[$simProduct['id']] = [
'product' => $simProduct,
'score' => 0
];
}
$recommendations[$simProduct['id']]['score'] += $score;
}
}
// Sort by score descending
usort($recommendations, function($a, $b) {
return $b['score'] <=> $a['score'];
});
return array_slice($recommendations, 0, $limit);
}
private function getUserPurchases($userId) {
$stmt = $this->pdo->prepare(
"SELECT DISTINCT product_id FROM orders WHERE user_id = ?"
);
$stmt->execute([$userId]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
private function getSimilarProducts($productId, $excludeIds) {
$placeholders = str_repeat('?,', count($excludeIds) - 1) . '?';
$stmt = $this->pdo->prepare("
SELECT DISTINCT p.*
FROM products p
INNER JOIN orders o ON p.id = o.product_id
WHERE o.user_id IN (
SELECT user_id FROM orders WHERE product_id = ?
)
AND p.id NOT IN ($placeholders)
LIMIT 20
");
$stmt->execute(array_merge([$productId], $excludeIds));
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
private function getPopularProducts($limit) {
$stmt = $this->pdo->prepare("
SELECT p.*, COUNT(o.id) as order_count
FROM products p
INNER JOIN orders o ON p.id = o.product_id
GROUP BY p.id
ORDER BY order_count DESC
LIMIT ?
");
$stmt->execute([$limit]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
?>
Sistem ini sudah bisa memberikan rekomendasi yang relevan berdasarkan pola pembelian.
Optimasi Performa untuk Traffic Tinggi
Sistem rekomendasi bisa lambat jika menghitung similarity real-time untuk ribuan produk.
Strategi Caching yang Efektif
Pre-calculate similarity matrix dan simpan di cache:
<?php
public function buildSimilarityMatrix() {
$products = $this->getAllProducts();
$matrix = [];
foreach ($products as $i => $prodA) {
foreach ($products as $j => $prodB) {
if ($i < $j) { // Avoid duplicate calculations
$similarity = $this->calculateSimilarity(
$prodA['id'],
$prodB['id']
);
if ($similarity > 0.1) { // Only store meaningful similarities
$matrix[$prodA['id']][$prodB['id']] = $similarity;
$matrix[$prodB['id']][$prodA['id']] = $similarity;
}
}
}
}
// Simpan ke Redis atau cache file
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('product_similarity_matrix', serialize($matrix));
$redis->expire('product_similarity_matrix', 3600 * 24); // 24 jam
return $matrix;
}
?>
Jalankan script ini via cron job setiap malam saat traffic rendah.
Database Indexing yang Tepat
Pastikan query rekomendasi berjalan cepat dengan index yang optimal:
CREATE INDEX idx_orders_user_product ON orders(user_id, product_id);
CREATE INDEX idx_orders_product_user ON orders(product_id, user_id);
CREATE INDEX idx_orders_created ON orders(created_at);
Dengan indexing ini, query bisa 10x lebih cepat pada database dengan jutaan transaksi.
Menambahkan Content-Based Filtering untuk Hasil Lebih Baik
Collaborative filtering punya kelemahan: cold start problem untuk produk atau user baru.
Solusinya adalah menambahkan content-based filtering berdasarkan atribut produk:
<?php
public function getContentBasedRecommendations($productId, $limit = 5) {
// Ambil detail produk target
$product = $this->getProductById($productId);
// Cari produk dengan kategori sama
$stmt = $this->pdo->prepare("
SELECT *,
(CASE
WHEN category = ? THEN 3
ELSE 0
END) +
(CASE
WHEN ABS(price - ?) < ? * 0.2 THEN 2
ELSE 0
END) as content_score
FROM products
WHERE id != ?
ORDER BY content_score DESC, RAND()
LIMIT ?
");
$stmt->execute([
$product['category'],
$product['price'],
$product['price'],
$productId,
$limit
]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
?>
Sistem ini memberikan score lebih tinggi untuk produk dengan kategori sama dan range harga mirip.
Menggabungkan Collaborative dan Content-Based (Hybrid)
Untuk hasil terbaik, kombinasikan kedua metode dengan weighted scoring:
<?php
public function getHybridRecommendations($userId, $limit = 5) {
// Ambil rekomendasi collaborative
$collaborative = $this->getRecommendations($userId, $limit * 2);
// Ambil produk yang user sering lihat
$recentlyViewed = $this->getRecentlyViewedProducts($userId);
$hybrid = [];
// Combine collaborative results
foreach ($collaborative as $rec) {
$productId = $rec['product']['id'];
$hybrid[$productId] = [
'product' => $rec['product'],
'score' => $rec['score'] * 0.7 // 70% weight for collaborative
];
}
// Add content-based for recently viewed
foreach ($recentlyViewed as $viewedId) {
$contentBased = $this->getContentBasedRecommendations($viewedId, 5);
foreach ($contentBased as $product) {
$productId = $product['id'];
if (!isset($hybrid[$productId])) {
$hybrid[$productId] = [
'product' => $product,
'score' => 0
];
}
// 30% weight for content-based
$hybrid[$productId]['score'] += $product['content_score'] * 0.3;
}
}
// Sort and limit
usort($hybrid, function($a, $b) {
return $b['score'] <=> $a['score'];
});
return array_slice($hybrid, 0, $limit);
}
?>
Hybrid approach ini memberikan rekomendasi yang seimbang antara akurasi dan coverage.
Mengintegrasikan dengan Frontend Website
Setelah backend siap, tampilkan rekomendasi di berbagai tempat strategis:
1. Product Detail Page
<?php
// Di halaman detail produk
$recommendation = new ProductRecommendation($pdo);
$similar = $recommendation->getContentBasedRecommendations($currentProductId, 4);
?>
<div class="similar-products">
<h3>Produk Serupa</h3>
<div class="product-grid">
<?php foreach ($similar as $product): ?>
<div class="product-card">
<img src="<?= $product['image'] ?>" alt="<?= $product['name'] ?>">
<h4><?= $product['name'] ?></h4>
<p class="price">Rp <?= number_format($product['price'], 0, ',', '.') ?></p>
<a href="/product/<?= $product['id'] ?>" class="btn">Lihat Detail</a>
</div>
<?php endforeach; ?>
</div>
</div>
2. Homepage Personalized
<?php
// Di homepage untuk user yang sudah login
if (isset($_SESSION['user_id'])) {
$personalized = $recommendation->getHybridRecommendations($_SESSION['user_id'], 8);
?>
<section class="recommended-for-you">
<h2>Rekomendasi Untuk Anda</h2>
<!-- Tampilkan produk rekomendasi -->
</section>
<?php } ?>
3. Cart dan Checkout Page
Cross-sell dengan menampilkan "Pelanggan lain juga membeli":
<div class="frequently-bought-together">
<h3>Sering Dibeli Bersamaan</h3>
<!-- Produk komplementer -->
</div>
Butuh jasa pembuatan website profesional? KerjaKode menyediakan layanan pembuatan website berkualitas tinggi dengan harga terjangkau. Kunjungi jasa pembuatan website KerjaKode untuk konsultasi gratis dan wujudkan website impian Anda.
Tracking dan Analisis Efektivitas Rekomendasi
Sistem rekomendasi perlu dimonitor untuk memastikan efektivitasnya:
Metric yang Perlu Dipantau
- Click-Through Rate (CTR): Berapa persen user yang klik rekomendasi
- Conversion Rate: Berapa persen yang akhirnya beli
- Average Order Value: Apakah rekomendasi meningkatkan nilai transaksi
- Coverage: Persentase produk yang pernah direkomendasikan
- Diversity: Variasi kategori dalam rekomendasi
Implementasi Tracking
CREATE TABLE recommendation_logs (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
recommended_product_id INT,
source_product_id INT,
recommendation_type VARCHAR(50), -- collaborative, content-based, hybrid
position INT,
clicked BOOLEAN DEFAULT FALSE,
purchased BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Log setiap rekomendasi yang ditampilkan dan track apakah di-klik atau dibeli:
<?php
public function logRecommendation($userId, $recommendedProductId, $type, $position) {
$stmt = $this->pdo->prepare("
INSERT INTO recommendation_logs
(user_id, recommended_product_id, recommendation_type, position)
VALUES (?, ?, ?, ?)
");
$stmt->execute([$userId, $recommendedProductId, $type, $position]);
return $this->pdo->lastInsertId();
}
public function trackClick($logId) {
$stmt = $this->pdo->prepare("
UPDATE recommendation_logs SET clicked = TRUE WHERE id = ?
");
$stmt->execute([$logId]);
}
public function trackPurchase($userId, $productId) {
$stmt = $this->pdo->prepare("
UPDATE recommendation_logs
SET purchased = TRUE
WHERE user_id = ?
AND recommended_product_id = ?
AND created_at > DATE_SUB(NOW(), INTERVAL 7 DAY)
");
$stmt->execute([$userId, $productId]);
}
?>
A/B Testing untuk Optimasi Berkelanjutan
Jangan asumsikan satu algoritma cocok untuk semua. Lakukan A/B testing untuk menemukan yang terbaik:
<?php
public function getRecommendationsWithABTest($userId, $limit = 5) {
// Assign user to test group based on user_id
$testGroup = $userId % 3;
switch ($testGroup) {
case 0: // Control: collaborative only
$recommendations = $this->getRecommendations($userId, $limit);
$algorithm = 'collaborative';
break;
case 1: // Variant A: content-based only
$recentProducts = $this->getRecentlyViewedProducts($userId);
$recommendations = [];
foreach ($recentProducts as $productId) {
$recs = $this->getContentBasedRecommendations($productId, $limit);
$recommendations = array_merge($recommendations, $recs);
}
$algorithm = 'content_based';
break;
case 2: // Variant B: hybrid
$recommendations = $this->getHybridRecommendations($userId, $limit);
$algorithm = 'hybrid';
break;
}
// Log untuk analysis
foreach ($recommendations as $i => $rec) {
$this->logRecommendation(
$userId,
$rec['product']['id'],
$algorithm,
$i + 1
);
}
return $recommendations;
}
?>
Jalankan test minimal 2 minggu untuk mendapat data statistik yang valid.
Tips Implementasi untuk UMKM dengan Budget Terbatas
Tidak semua bisnis butuh machine learning kompleks. Mulai dengan yang sederhana:
Level 1: Rule-Based Recommendations (Paling Mudah)
- Produk populer di kategori yang sama
- Produk dengan harga range serupa
- Bundle produk manual yang Anda tentukan
Level 2: Basic Collaborative Filtering
- Implementasi sederhana seperti contoh di atas
- Pre-calculate similarity matrix setiap malam
- Fallback ke rule-based jika data kurang
Level 3: Advanced Machine Learning
- Matrix factorization dengan SVD
- Deep learning untuk feature extraction
- Real-time personalization dengan streaming data
Untuk toko dengan <1000 produk dan <10.000 transaksi per bulan, Level 1-2 sudah sangat cukup.
Common Pitfalls yang Harus Dihindari
1. Filter Bubble
Jangan hanya rekomendasikan produk yang sangat mirip. Tambahkan element randomness untuk diversity:
<?php
// Inject 20% random popular products
$recommendations = $this->getHybridRecommendations($userId, $limit * 0.8);
$random = $this->getPopularProducts($limit * 0.2);
$final = array_merge($recommendations, $random);
shuffle($final);
return array_slice($final, 0, $limit);
?>
2. Mengabaikan Freshness
Produk baru atau trending butuh exposure. Berikan boost untuk produk fresh:
// Add recency boost
$daysSinceLaunch = (time() - strtotime($product['created_at'])) / 86400;
if ($daysSinceLaunch < 14) {
$score *= 1.2; // 20% boost untuk produk <14 hari
}
3. Not Testing on Real Users
Jangan deploy langsung ke semua user. Mulai dengan 10% traffic dulu, monitor hasilnya.
Kesimpulan
Sistem rekomendasi produk bukan lagi teknologi eksklusif untuk raksasa e-commerce.
Dengan implementasi yang tepat, toko online UMKM bisa memberikan pengalaman berbelanja personal yang meningkatkan konversi dan customer satisfaction.
Mulai dengan algoritma sederhana seperti collaborative filtering, track metricnya, lalu optimize secara berkelanjutan.
Yang terpenting: fokus pada value buat customer, bukan hanya metrik teknis. Rekomendasi yang relevan akan natural meningkatkan penjualan.
Selamat mencoba, dan semoga toko online Anda makin sukses dengan sistem rekomendasi yang powerful!