Database 5 min read

Mengatasi Cold Start & Data Enrichment pada Dataset Skincare: Studi Kasus ForgeMoist

Bagaimana melakukan web scraping, pembersihan data kotor, dan pengayaan metadata produk kosmetik agar siap digunakan oleh mesin rekomendasi.

0 views

Saat Anda membangun sistem rekomendasi, kualitas rekomendasi Anda sepenuhnya bergantung pada kebersihan dan kelengkapan data masukan (Garbage In, Garbage Out).

Dalam proyek ForgeMoist, tantangan terbesar saya bukanlah merancang tampilan kuisnya, melainkan bagaimana menjinakkan dataset kosmetik mentah yang tidak lengkap, tidak konsisten, dan memiliki banyak nilai kosong (cold start problem).

Berikut adalah strategi pemrosesan data (data engineering pipeline) yang saya terapkan untuk menghasilkan dataset yang kaya dan siap pakai.


Tantangan 1: Pembersihan Data Mentah (Data Cleaning)

Dataset awal diimpor dari file CSV publik (dataset.csv) yang berisi informasi merek, nama produk, tipe kulit, dan daftar komposisi bahan kimia. Namun, ada banyak ketidakkonsistenan seperti:

  • Penggunaan karakter khusus yang rusak akibat encoding file.
  • Penulisan tipe kulit yang acak (misalnya: "Sensitve", "Dry Skin", "Oily").
  • Penulisan nama bahan aktif dengan huruf kapital tidak seragam.

Saya menulis skrip Node.js (fix_special_products.js) untuk mendeteksi anomali ini secara massal, menormalkannya ke standar huruf kecil (lowercase), dan memetakan string tipe kulit ke dalam array standar:

const cleanSkinTypes = (rawTypes: string): string[] => {
  const list = rawTypes.toLowerCase();
  const types: string[] = [];
  if (list.includes('oily') || list.includes('berminyak')) types.push('Berminyak');
  if (list.includes('dry') || list.includes('kering')) types.push('Kering');
  if (list.includes('normal')) types.push('Normal');
  if (list.includes('combination') || list.includes('kombinasi')) types.push('Kombinasi');
  if (list.includes('sensitive') || list.includes('sensitif')) types.push('Sensitif');
  return types;
};

Tantangan 2: Mengatasi Rating Kosong (Web Scraping dengan Puppeteer)

Banyak produk baru atau produk lokal di dataset tidak memiliki informasi rating bintang maupun jumlah ulasan. Tanpa data ini, algoritma pembobotan popularitas (25% dari total skor) tidak akan bekerja secara adil.

Untuk mengatasinya, saya membuat modul scraper otomatis menggunakan Puppeteer (scrape_missing_ratings.js):

  1. Skrip membaca dataset JSON yang sudah dibersihkan.
  2. Untuk setiap produk dengan rating kosong, skrip melakukan pencarian otomatis di portal review kecantikan ternama (seperti Female Daily).
  3. Mengambil nilai rating desimal (misalnya 4.5) dan jumlah ulasan (misalnya 1,250 reviews).
  4. Menyimpan data tersebut kembali ke memori untuk diproses lebih lanjut.

Tantangan 3: Pengayaan Bahan Aktif (Data Enrichment)

Sistem rekomendasi perlu mengetahui produk mana saja yang mengandung bahan aktif utama seperti Niacinamide atau Ceramide. Melakukan pencarian string secara naif (substring matching) pada daftar bahan yang panjangnya ratusan kata sangat tidak efisien dan tidak akurat.

Solusinya, saya membuat skrip pengayaan (enrich.js) untuk mengekstrak bahan aktif secara cerdas:

  • Skrip memindai teks daftar komposisi (ingredients list) untuk mencocokkan kata kunci bahan aktif utama.
  • Menambahkan properti array baru ingredients dan concerns ke setiap objek produk.
  • Menghasilkan file dataset final bernama enriched_dataset.json.

Hasil Akhir: Performa Sub-Milidetik

Dengan memproses seluruh dataset mentah di awal (offline compilation) menjadi satu file JSON terstruktur yang kaya data, rute API ForgeMoist tidak perlu melakukan query database yang lambat atau melakukan join tabel relasional saat pengguna menjalankan kuis.

Cukup muat file enriched_dataset.json ke dalam memori aplikasi saat server pertama kali menyala, dan API rekomendasi siap menyajikan hasil yang akurat dalam waktu kurang dari 5 milidetik!