Notebook Bab 1 - Dari Data Mentah ke Representasi Model
Open In Colab
Notebook Bab 1 ini punya dua bagian. Bagian Demo tinggal Anda jalankan lalu amati keluarannya; bagian Mini Project berisi soal dan data yang Anda kerjakan sendiri.
Demo memakai snapshot UCI Online Retail. Tiap baris awal adalah baris produk dalam invoice. Kita mengubah log peristiwa itu menjadi matriks fitur per pelanggan pada index_time, lalu memakai logistic regression sebagai penggaris tetap untuk membandingkan representasi agregat dengan satu baris mentah terakhir.
Persiapan
from pathlib import Pathimport numpy as npimport pandas as pdfrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinefrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, roc_auc_scoreRANDOM_STATE =42rng = np.random.default_rng(RANDOM_STATE)from pathlib import Pathimport jsonimport urllib.requestimport urllib.parseDATA_BASE_URL ='https://raw.githubusercontent.com/muhammad-zainal-muttaqin/NulisBuku/main/website/notebooks/data/section1'def section_data_dir(name):"""Folder data Bagian 1: pakai salinan lokal bila ada; jika tidak (mis. di Google Colab), unduh berkas dari repo GitHub sesuai manifest."""for base in (Path('data/section1'), Path('../data/section1')):if (base / name).exists():return base / name cache = Path('_nb_data') / nameifnot (cache /'manifest.json').exists(): cache.mkdir(parents=True, exist_ok=True) base_url = DATA_BASE_URL +'/'+ name manifest = json.loads(urllib.request.urlopen(base_url +'/manifest.json').read().decode('utf-8'))for rel in manifest: dest = cache / rel dest.parent.mkdir(parents=True, exist_ok=True)ifnot dest.exists(): url = base_url +'/'+'/'.join(urllib.parse.quote(seg) for seg in rel.split('/')) urllib.request.urlretrieve(url, dest) (cache /'manifest.json').write_text(json.dumps(manifest), encoding='utf-8')return cacheDATA_DIR = section_data_dir('ch01_online_retail')print(f'Setup selesai. Data: {DATA_DIR}')
Section 1 - Demo: Dari Log Transaksi ke Matriks Fitur
Log invoice mentah
Dataset awal berupa event log: satu invoice dapat punya banyak baris produk, dan satu pelanggan dapat muncul berkali-kali sepanjang waktu. Ini adalah bentuk mentah yang belum menjadi satu baris belajar.
baris_invoice_produk 406829
pelanggan_unik 4372
invoice_unik 22190
tanggal_awal 2010-12-01
tanggal_akhir 2011-12-09
Contoh baris mentah:
InvoiceNo CustomerID StockCode Quantity InvoiceDate UnitPrice Country
536365 17850 85123A 6 2010-12-01 08:26:00 2.55 United Kingdom
536365 17850 71053 6 2010-12-01 08:26:00 3.39 United Kingdom
536365 17850 84406B 8 2010-12-01 08:26:00 2.75 United Kingdom
536365 17850 84029G 6 2010-12-01 08:26:00 3.39 United Kingdom
536365 17850 84029E 6 2010-12-01 08:26:00 3.39 United Kingdom
Agregasi ke matriks fitur per pelanggan
Fungsi berikut membuat tabel belajar pada sebuah index_time. Fitur hanya memakai invoice sebelum waktu itu. Target melihat 30 hari setelahnya: apakah pelanggan melakukan pembelian lagi dalam horizon tersebut?
Model, target, dan protokol waktunya kita tahan tetap. Yang dibedakan hanya representasi: matriks fitur agregat per pelanggan dibandingkan dengan satu baris transaksi terakhir per pelanggan.
representasi akurasi roc_auc
Agregat riwayat pelanggan 0.758 0.741
Satu baris transaksi terakhir 0.712 0.509
🔎 Amati. Matriks fitur agregat membawa riwayat pelanggan sebelum index_time: frekuensi invoice, total belanja, ragam produk, pembatalan, dan recency. Satu baris transaksi terakhir membuang sebagian besar konteks itu. Model yang sama, target yang sama, dan batas waktu yang sama memberi hasil berbeda karena representasi yang masuk ke model berbeda.
Section 2 - Mini Project
Soal
Anda menerima log klik (clickstream) sebuah situs, satu baris per klik, dengan kolom id_sesi, menit, halaman, dan durasi_detik. Tujuannya memprediksi konversi (1 = sesi berakhir dengan pembelian).
Tugas:
Ubah log peristiwa menjadi matriks fitur per sesi (minimal 5 fitur turunan, misalnya jumlah klik, total durasi, ragam halaman, durasi rata-rata).
Latih satu baseline classifier pada matriks itu.
Bandingkan dengan prediksi dari satu peristiwa mentah saja.
Luaran: kode agregasi, akurasi kedua pendekatan, dan 2-3 kalimat kesimpulan.
Kriteria penilaian: (a) agregasi benar ke tingkat sesi; (b) minimal 5 fitur turunan; (c) evaluasi pada data uji terpisah.
# DATA AWAL (jangan diubah) - clickstream: satu baris per klik.n_sesi =400konversi_sesi = {s: int(rng.random() <0.35) for s inrange(1, n_sesi +1)}baris = []for s inrange(1, n_sesi +1):for _ inrange(int(rng.integers(1, 20))): menit =round(float(rng.exponential(2.0)), 2) halaman = rng.choice(['home', 'produk', 'keranjang', 'promo', 'akun']) durasi =int(rng.integers(3, 120) + (30if konversi_sesi[s] else0)) baris.append((s, menit, halaman, durasi))clicks = pd.DataFrame(baris, columns=['id_sesi', 'menit', 'halaman', 'durasi_detik'])clicks['konversi'] = clicks['id_sesi'].map(konversi_sesi)print('Clickstream:', clicks.shape, '| sesi:', clicks['id_sesi'].nunique())clicks.head()
Clickstream: (4095, 5) | sesi: 400
id_sesi
menit
halaman
durasi_detik
konversi
0
1
0.04
promo
62
1
1
1
2.42
akun
51
1
2
1
3.86
produk
41
1
3
1
1.28
promo
89
1
4
1
1.09
produk
135
1
# Kerjakan di sini.# Petunjuk: clicks.groupby('id_sesi').agg(...) untuk membuat matriks fitur per sesi.