Ditulis oleh:
Rio Nur Arifin
Data Scientist at Telkomsel
https://www.linkedin.com/in/rionurarifin/
Dalam era teknologi yang semakin berkembang pesat, kemampuan untuk membuat keputusan berdasarkan data menjadi krusial. Setiap hari, miliaran data baru dihasilkan, dan perusahaan serta peneliti berlomba-lomba untuk mengekstraksi informasi berharga dari tumpukan data tersebut. Namun, mengekstraksi kebenaran dari data bukanlah tugas yang mudah. Ini memerlukan pendekatan yang cerdas dan efisien, salah satunya adalah dengan menggunakan metode optimasi.
Optimasi telah lama menjadi bagian integral dari berbagai disiplin ilmu, mulai dari rekayasa hingga ekonomi. Dalam konteks data science, optimasi sering digunakan untuk menemukan parameter terbaik yang dapat meningkatkan kinerja model atau algoritma. Namun, tantangan yang muncul adalah ketika ruang pencarian parameter sangat besar atau ketika evaluasi fungsi tujuan (objective function) memerlukan waktu yang lama. Dalam situasi seperti ini, metode optimasi tradisional mungkin tidak efisien.
Bayesian Optimization muncul sebagai solusi untuk permasalahan tersebut. Sebagai teknik optimasi berbasis probabilitas, Bayesian Optimization menggabungkan prinsip-prinsip statistika Bayesian untuk memberikan pendekatan yang lebih cerdas dalam pencarian solusi optimal. Daripada mencari solusi dengan cara mencoba setiap kemungkinan kombinasi (seperti dalam pencarian grid) atau mengandalkan gradient dari fungsi (seperti dalam metode gradient descent), Bayesian Optimization memanfaatkan model probabilitas untuk memprediksi di mana solusi optimal mungkin berada.
Salah satu kelebihan utama dari Bayesian Optimization adalah kemampuannya untuk mempertimbangkan ketidakpastian. Ketika mengevaluasi suatu solusi, alih-alih hanya mempertimbangkan nilai fungsi tujuannya, Bayesian Optimization juga mempertimbangkan seberapa yakin kita tentang prediksi tersebut. Hal ini memungkinkan teknik ini untuk mengeksplorasi ruang pencarian dengan lebih efisien, sering kali dengan memerlukan lebih sedikit evaluasi fungsi tujuan dibandingkan dengan metode optimasi lainnya.
Selain itu, Bayesian Optimization juga sangat berguna dalam situasi di mana evaluasi fungsi tujuan mahal dari segi waktu atau sumber daya. Misalnya, dalam tuning hyperparameter dari deep learning model yang memerlukan waktu pelatihan yang lama, atau dalam optimasi desain eksperimental di mana setiap evaluasi memerlukan percobaan fisik yang mahal.
Pengenalan Tentang Bayesian
Bayesian merupakan salah satu pendekatan dalam statistika yang mengambil nama dari Thomas Bayes, seorang pendeta dan matematikawan Inggris yang hidup pada abad ke-18. Meskipun karyanya pada awalnya tidak mendapatkan pengakuan yang luas, prinsip-prinsip yang dia kembangkan telah menjadi dasar dari banyak teknik statistika modern dan memiliki dampak mendalam pada berbagai bidang, mulai dari sains hingga teknologi.
Sejarah Singkat
Konsep dasar Bayesian berasal dari teorema yang sekarang dikenal sebagai Teorema Bayes. Teorema ini menghubungkan probabilitas bersyarat, probabilitas marjinal, dan probabilitas bersama untuk memberikan cara memperbarui keyakinan kita berdasarkan data baru. Meskipun ide ini mungkin terdengar sederhana, implikasinya sangat mendalam dan memberikan dasar bagi pendekatan inferensia yang berbeda dengan pendekatan statistika klasik.
Konsep Dasar Bayesian
Bayesian berfokus pada konsep “probabilitas sebagai ukuran keyakinan”. Dalam pendekatan ini, probabilitas digunakan tidak hanya untuk menggambarkan variasi acak (seperti dalam lemparan koin atau lemparan dadu), tetapi juga untuk menggambarkan ketidakpastian atau ketidakpastian tentang suatu pernyataan.
Dalam konteks inferensi statistik, ini berarti bahwa parameter dari model statistik — yang dalam pendekatan klasik dianggap sebagai nilai tetap yang tidak diketahui — dalam pendekatan Bayesian dianggap sebagai variabel acak dengan distribusi probabilitas tertentu. Distribusi ini, yang dikenal sebagai distribusi prior, menggambarkan keyakinan kita sebelum melihat data. Setelah data diamati, distribusi prior ini diperbarui untuk menjadi distribusi posterior, yang menggabungkan informasi dari data dengan keyakinan awal kita.
Penerapan Bayes dalam Berbagai Bidang
Pendekatan Bayesian telah diterapkan dalam berbagai bidang dengan sukses. Dalam bidang kedokteran, Bayesian digunakan untuk menginterpretasikan hasil tes diagnostik, memberikan probabilitas bahwa pasien memiliki penyakit tertentu setelah mempertimbangkan hasil tes dan prevalensi penyakit tersebut di populasi. Dalam bidang keuangan, model Bayesian digunakan untuk mengestimasi risiko dan mengembangkan strategi perdagangan. Di era teknologi informasi saat ini, teknik Bayesian digunakan dalam berbagai aplikasi, mulai dari filtrasi spam hingga sistem rekomendasi.
Bayesian vs. Frequentist
Pendekatan Bayesian seringkali dibandingkan dengan pendekatan frequentist, yang merupakan paradigma statistika yang lain. Sementara pendekatan frequentist berfokus pada estimasi parameter berdasarkan frekuensi relatif dari suatu peristiwa dalam sampel berulang-ulang, pendekatan Bayesian berfokus pada pembaruan keyakinan berdasarkan data yang diamati. Meskipun kedua pendekatan ini memiliki kelebihan dan kekurangan masing-masing, penting untuk dipahami bahwa mereka bukanlah lawan, tetapi lebih sebagai dua cara berbeda untuk melihat dunia probabilitas dan inferensi.
Optimasi: Konsep dan Permasalahan
Dalam dunia matematika, ilmu komputer, dan rekayasa, optimasi menduduki peran penting. Konsep dasar dari optimasi adalah upaya untuk mencari solusi terbaik dari sejumlah kemungkinan solusi, berdasarkan kriteria tertentu. Dalam konteks yang lebih luas, optimasi dapat ditemui di hampir setiap aspek kehidupan, dari perancangan produk yang hemat energi hingga strategi bisnis yang menguntungkan.
Definisi dan Arti Penting Optimasi
Optimasi secara formal didefinisikan sebagai proses mencari nilai maksimum atau minimum dari suatu fungsi tujuan, yang bisa dibatasi oleh satu atau lebih kondisi batasan. Fungsi tujuan ini biasanya merepresentasikan suatu kinerja atau biaya yang ingin dioptimalkan. Dalam banyak aplikasi praktis, optimasi memungkinkan individu atau organisasi untuk membuat keputusan yang lebih tepat, efisien, dan berdampak.
Jenis-jenis Optimasi
Berdasarkan berbagai kriteria, optimasi dapat diklasifikasikan menjadi beberapa jenis:
- Optimasi Kontinu vs. Diskrit: Pada optimasi kontinu, variabel keputusan dapat mengambil nilai dalam suatu rentang yang kontinu. Sementara pada optimasi diskrit, variabel keputusan hanya dapat mengambil nilai dari sekumpulan nilai tertentu.
- Optimasi Deterministik vs. Stokastik: Optimasi deterministik melibatkan situasi di mana semua parameter dan variabel diketahui dengan pasti. Di sisi lain, dalam optimasi stokastik, ketidakpastian ada dalam beberapa parameter atau fungsi tujuan.
- Optimasi Tanpa Batasan vs. Dengan Batasan: Terkadang, solusi optimal harus memenuhi kriteria atau batasan tertentu, seperti anggaran atau sumber daya yang tersedia. Dalam hal ini, optimasi dengan batasan diperlukan.
Permasalahan dalam Optimasi
Meskipun optimasi menawarkan solusi yang menarik untuk berbagai masalah, ada beberapa tantangan yang perlu dihadapi:
- Kompleksitas Masalah: Banyak masalah optimasi yang kompleks dan memerlukan algoritma yang canggih untuk menemukan solusi yang optimal atau mendekati optimal.
- Ketidakpastian dan Variabilitas: Dalam banyak situasi dunia nyata, data yang digunakan untuk optimasi mungkin tidak pasti atau berubah-ubah, yang menambah kompleksitas pada proses optimasi.
- Keterbatasan Komputasi: Terkadang, meskipun solusi optimal ada, keterbatasan komputasi dapat mencegah individu atau organisasi dari menemukannya dalam waktu yang wajar.
Optimasi dalam Data Science
Dalam konteks Data Science, optimasi memainkan peran kunci dalam berbagai aspek, seperti pemilihan fitur, pelatihan model, dan tuning hyperparameter. Dengan meningkatnya kompleksitas model dan ukuran dataset, kebutuhan akan teknik optimasi yang efisien dan efektif semakin meningkat. Salah satu contohnya adalah ketika mencari kombinasi hyperparameter terbaik untuk model pembelajaran mesin, di mana proses optimasi dapat memastikan bahwa model tersebut memberikan kinerja terbaik.
Gaussian Processes
Gaussian Processes (GP) mungkin terdengar seperti istilah teknis yang rumit, namun mari kita coba jelajahi konsep ini dengan pendekatan yang lebih sederhana dan intuitif.
Apa itu Gaussian Processes?
Bayangkan seseorang ingin memprediksi harga rumah berdasarkan luas tanah. Bisa jadi ada banyak rumah dengan luas tanah yang berbeda dan harga yang bervariasi. Namun, kita mungkin belum memiliki data untuk setiap luas tanah. Di sinilah GP masuk.
Gaussian Processes adalah teknik yang memungkinkan kita untuk membuat prediksi tentang hal-hal yang kita belum tahu berdasarkan apa yang kita ketahui. Dalam konteks matematika, GP memberi kita cara untuk “menebak” fungsi berdasarkan data yang ada, tanpa harus mendefinisikan bentuk pasti dari fungsi tersebut.
Bagaimana Cara Kerjanya?
Dua komponen utama dalam GP adalah mean function dan covariance function (atau yang sering disebut “kernel”).
- Mean Function (m(x)):
Ini seperti rata-rata atau titik tengah dari prediksi kita. Dalam banyak kasus, kita hanya asumsikan rata-rata ini adalah 0, agar semuanya menjadi lebih sederhana. - Covariance Function (Kernel, k(x,x′)):
Ini adalah bagian yang menarik. Kernel memberi tahu kita seberapa “dekat” dua titik data, berdasarkan input mereka. Jika kita berbicara tentang luas tanah, dua rumah dengan luas tanah yang mirip mungkin akan memiliki harga yang mirip juga. Kernel inilah yang memberi tahu kita seberapa mirip harga rumah berdasarkan luas tanahnya.
Ada banyak jenis kernel, tetapi salah satu yang paling populer adalah “Squared Exponential Kernel”, yang dinyatakan dengan rumus:
Tanpa terlalu teknis, rumus di atas basically mengatakan bahwa jika dua rumah memiliki luas tanah yang mirip (x dan x′ dekat satu sama lain), maka nilai kernel akan mendekati 1, yang berarti harga rumahnya mungkin mirip.
Gaussian Processes dalam Bayesian Optimization
Bayesian Optimization adalah teknik yang menggunakan GP untuk menemukan solusi terbaik dari suatu masalah dengan secepat mungkin. Karena GP memberi kita cara untuk memprediksi hasil berdasarkan data yang kita miliki, kita dapat menggunakan prediksi tersebut untuk memutuskan di mana kita harus mencari selanjutnya. Ini sangat berguna, misalnya, ketika mencoba menemukan setting terbaik untuk mesin atau algoritma tanpa harus mencoba setiap kemungkinan kombinasi.
Definisi dan Konsep Dasar
Apa Itu Bayesian Optimization?
Bayesian Optimization adalah teknik pencarian yang cerdas. Daripada mencoba setiap kemungkinan solusi satu per satu (yang bisa memakan waktu lama!), teknik ini mencoba menebak di mana solusi terbaik mungkin berada berdasarkan informasi yang sudah diketahui. Intinya, Bayesian Optimization adalah tentang memanfaatkan data yang ada untuk membuat keputusan yang lebih baik tentang di mana harus mencari selanjutnya.
Bagaimana Cara Kerjanya?
Bayesian Optimization bekerja dengan dua langkah utama yang diulang-ulang:
- Membuat Model dari Data: Pertama, kita menggunakan data yang kita miliki untuk membuat model prediksi. Ini sering disebut sebagai “Surrogate Model”. Salah satu pendekatan populer untuk ini adalah dengan menggunakan Gaussian Processes, yang telah kita bahas sebelumnya. Model ini memberi kita ide tentang bagaimana solusi mungkin tampak berdasarkan apa yang sudah kita ketahui.
- Memutuskan Di Mana Harus Mencari Selanjutnya: Setelah memiliki model, kita perlu memutuskan di mana harus mencari selanjutnya. Untuk ini, kita menggunakan sesuatu yang disebut “Acquisition Function”. Fungsi ini memberi tahu kita di mana poin berikutnya yang paling menjanjikan berdasarkan model kita. Poin ini mungkin adalah di mana model kita berpikir solusi terbaik berada, atau mungkin di mana model kita paling tidak yakin dan ingin mendapatkan lebih banyak informasi.
Use Case 1: Optimasi Kombinasi Paket di Aplikasi Perusahaan Telco
Latar Belakang:
Perusahaan telekomunikasi (telco) saat ini berlomba-lomba untuk memenangkan hati pelanggan dengan berbagai penawaran paket layanan. Dalam era digital saat ini, aplikasi mobile menjadi salah satu kanal utama untuk pelanggan dalam membeli dan mengatur layanan mereka. Oleh karena itu, menampilkan kombinasi paket yang tepat di aplikasi sangat penting untuk meningkatkan kepuasan dan loyalitas pelanggan.
Tujuan:
Dalam use case ini, tujuan utamanya adalah untuk menemukan kombinasi paket yang paling optimal untuk ditampilkan di aplikasi perusahaan telco. Optimal di sini didefinisikan berdasarkan dua kriteria: “take up rate” (seberapa sering paket tersebut dipilih oleh pelanggan) dan “revenue” (pendapatan yang dihasilkan dari penjualan paket tersebut).
Kondisi Data:
Data yang dimiliki berupa data sintetis yang mencerminkan tiga segmen pelanggan utama: Remaja, Pekerja Kantoran, dan Pelajar. Untuk setiap segmen, kita memiliki data historis mengenai “take up rate” dari tiga kombinasi paket yang berbeda: MWD (Monthly, Weekly, Daily), MMW (Monthly, Monthly special, Weekly), dan WMD (Weekly, Monthly, Daily). Selain itu, kita juga memiliki informasi mengenai harga dari setiap jenis paket: Monthly adalah yang paling mahal, diikuti oleh Weekly, dan Daily adalah yang termurah.
Metodologi:
Untuk mencapai tujuan tersebut, kita akan menggunakan teknik Bayesian Optimization. Teknik ini memungkinkan kita untuk memanfaatkan data historis yang kita miliki untuk membuat keputusan yang lebih tepat tentang kombinasi paket mana yang kemungkinan besar akan memberikan hasil terbaik di masa depan. Bayesian Optimization akan mempertimbangkan kedua kriteria (take up rate dan revenue) untuk menemukan solusi yang paling optimal.
Mari kita mulai dengan pembuatan data sintetis.
1. Data Sintetis
Segment Pelanggan:
- Remaja
- Pekerja Kantoran
- Pelajar
Jenis Paket:
- MWD (Monthly, Weekly, Daily)
- MMW (Monthly, Monthly special, Weekly)
- WMD (Weekly, Monthly, Daily)
Harga Paket:
- Monthly: $30
- Monthly special: $25
- Weekly: $10
- Daily: $3
Take Up Rate Historis dan Revenue Historis: Diasumsikan berdasarkan preferensi masing-masing segmen.
2. Script Membuat Data Sintetis
import pandas as pd
# Data sintetis take up rate
take_up_rates = {
'Remaja': {'MWD': 0.15, 'WMD': 0.2, 'DMW': 0.6, 'MMW':0.05},
'Pekerja Kantoran': {'MWD': 0.5, 'MMW': 0.3, 'WMD': 0.15, 'DMW':0.05},
'Pelajar': {'MWD': 0.1, 'MMW': 0.2, 'WMD': 0.4, 'DMW':0.3}
}
Take up rate adalah proporsi taker dari setiap segment dengan untuk masing-masing tampilan kombinasi paket. Misal segment Remaja yang tampilan kombinasi paketnya adalah MWD memiliki take up rate 0.15.
# Data total revenue per bulan jika user berlangganan paket M atau W atau D
total_price_per_month = {
'MWD': [100000, 120000, 80000],
'MMW': [100000, 100000, 120000],
'WMD': [120000, 100000, 80000],
'DMW': [80000, 100000, 120000],
}
Total price per month adalah total revenue dari setiap subscriber paket dalam 1 bulan secara rata-rata, biasanya paket Weekly (W) memiliki PPMB (price per mega byte) lebih tinggi sehingga jika diakumulasi dalam 1 bulan justru memiliki revenue yang lebih tinggi dari paket Monthly (M). Paket Daily memiliki PPMB yang lebih tinggi lagi namun di dalam data sintetis ini saya asumsikan total revenue dalam 1 bulan tetap lebih rendah dari paket Monthly atau Weekly karena mungkin mereka lebih hemat dan memaksimalkan validity bahkan bisa beberapa hari tanpa paket data.
# Menghitung revenue historis
revenues = {}
for segment, packages in take_up_rates.items():
segment_revenues = {}
for package, rate in packages.items():
segment_revenues[package] = rate * sum(prices[package])
revenues[segment] = segment_revenues
df_revenue = pd.DataFrame(revenues).T
df_revenue
Output:
3. Bayesian Optimization
Kita akan menggunakan Bayesian Optimization untuk menentukan kombinasi segmen pelanggan dan urutan paket yang memiliki revenue tertinggi.
#!pip install scikit-optimize
from skopt import gp_minimize
# Data sintetis take up rate dan harga paket tetap seperti sebelumnya
# Fungsi objektif untuk Bayesian Optimization
def objective_for_segment(params, segment):
package_order = params[0]
rate = take_up_rates[segment][package_order]
# Menghitung rata-rata harga dari paket dalam kombinasi
avg_price = sum(total_price_per_month[package_order]) / len(total_price_per_month[package_order])
revenue = rate * avg_price
return -revenue # Kita ingin memaksimalkan revenue, oleh karena itu kita return negatif
results = []
# Jalankan Bayesian Optimization untuk setiap segmen
for segment in take_up_rates.keys():
space_for_segment = [list(take_up_rates[segment].keys())]
result = gp_minimize(lambda params: objective_for_segment(params, segment), space_for_segment, n_calls=50, random_state=0)
best_package_order = result.x[0]
best_revenue = -result.fun
results.append([segment, best_package_order, best_revenue])
# Mengubah hasil menjadi DataFrame yang human readable
df_results = pd.DataFrame(results, columns=[‘Segmen Pelanggan’, ‘Paket Terbaik’, ‘Revenue Maksimal (IDR)’])
# Tampilkan DataFrame
df_results
Output:
Penjelasan setiap steps biar kamu lebih paham proses dibaliknya:
- Pendefinisian Fungsi Tujuan: Fungsi tujuan kita, f(x), adalah fungsi yang ingin kita maksimalkan. Dalam konteks ini, f(x) mengembalikan revenue negatif dari kombinasi paket tertentu, x, berdasarkan “take up rate” dan total harga per bulan dari kombinasi paket tersebut.
- Matematis: f(x)=−rate(x)×total_price_per_month(x)
- Menghitung Revenue Potensial untuk Setiap Kombinasi Paket: Dengan menggunakan fungsi tujuan, kita dapat menghitung revenue potensial untuk setiap kombinasi paket.
- Optimasi dengan Bayesian Optimization: Dengan Bayesian Optimization, kita ingin menemukan kombinasi paket x yang memaksimalkan f(x). Selama proses ini, kita menggunakan Gaussian Process untuk memodelkan fungsi tujuan dan memilih kombinasi selanjutnya yang paling mungkin memaksimalkan expected improvement.
- Evaluasi Fungsi Tujuan: Setelah memilih kombinasi berikutnya, kita mengevaluasi fungsi tujuan pada kombinasi tersebut, mendapatkan revenue potensial, dan memperbarui model Gaussian Process dengan informasi baru.
- Ulangi Langkah 2–4: Proses ini diulangi hingga kondisi berhenti tertentu terpenuhi, seperti jumlah iterasi maksimum yang ditentukan dalam parameter
n_calls
. - Hasil Akhir: Setelah semua iterasi selesai, kita akan memiliki daftar kombinasi paket dengan revenue potensial terbaik untuk setiap segmen.
Sebagai contoh, untuk segmen “Remaja”:
- Kita mulai dengan kombinasi paket ‘DMW’.
- Menggunakan data yang Anda berikan, “take up rate” untuk ‘DMW’ adalah 0.6.
- Rata-rata harga per bulan untuk ‘DMW’ adalah 80000+100000+1200003=100000380000+100000+120000=100000.
- Revenue potensial untuk ‘DMW’ adalah 0.6×100000=60,0000.6×100000=60,000.
Dengan mengulangi proses ini untuk semua kombinasi paket lainnya, kita dapat menentukan kombinasi mana yang memberikan revenue potensial terbaik untuk segmen “Remaja”.
Use Case 2: Optimasi Kombinasi Paket dan Harga di Aplikasi Perusahaan Telco pada segment ARPU
Latar Belakang:
Perusahaan telekomunikasi berusaha memaksimalkan pendapatan dari layanannya dengan menawarkan berbagai paket kepada pelanggannya. Pelanggan memiliki profil berbeda berdasarkan rata-rata pengeluaran mereka setiap bulan (ARPU — Average Revenue Per User). ARPU berfungsi sebagai indikator untuk mengetahui kemampuan belanja pelanggan. Perusahaan ingin mengetahui kombinasi harga paket yang optimal untuk setiap profil pelanggan berdasarkan ARPU mereka.
Tujuan:
- Menentukan kombinasi harga paket yang optimal untuk setiap segmen ARPU, sehingga dapat memaksimalkan pendapatan.
- Menyesuaikan penawaran dengan perilaku belanja pelanggan, meningkatkan tingkat adopsi paket, dan meningkatkan kepuasan pelanggan.
Proses:
- Pengelompokan Pelanggan: Pelanggan dikelompokkan berdasarkan ARPU mereka ke dalam beberapa kategori: “0–25K”, “25K-50K”, “50K-75K”, “75K-100K”, “100K-150K”, “>150K”.
- Penentuan Kombinasi Paket: Ada beberapa kombinasi paket yang ditawarkan kepada pelanggan, seperti “MWD”, “MDW”, “WMD”, dan seterusnya. Ini menunjukkan prioritas tampilan paket kepada pelanggan, misalnya “MWD” berarti paket Bulanan ditampilkan pertama kali, diikuti oleh Mingguan, dan Harian.
- Data Harga: Setiap paket memiliki rentang harga. Misalnya, paket Bulanan berkisar antara 50K hingga 200K.
- Simulasi Pendapatan: Dengan mempertimbangkan ARPU dan kombinasi paket, kita melakukan simulasi untuk memperkirakan pendapatan yang dihasilkan berdasarkan kombinasi harga paket.
- Optimasi Pendapatan: Menggunakan metode Bayesian Optimization, kita mencari kombinasi harga yang dapat memaksimalkan pendapatan untuk setiap kombinasi ARPU dan paket.
- Hasil: Dari proses optimasi, kita mendapatkan kombinasi harga yang optimal untuk setiap segmen ARPU dan kombinasi paket.
import numpy as np
from skopt import gp_minimize
from skopt.space import Real, Categorical
from skopt.utils import use_named_args
# Definisi ARPU Bands
ARPU_bands = ["0-25K", "25K-50K", "50K-75K", "75K-100K", "100K-150K", ">150K"]
# Definisi kombinasi paket yang ditampilkan
package_combinations = ["MWD", "MDW", "WMD", "WDM", "DMW", "DWM"]
# Definisi harga untuk setiap paket
price_M = list(range(50_000, 201_000, 10_000))
price_W = list(range(10_000, 81_000, 10_000))
price_D = [3_000, 5_000, 7_000, 10_000, 15_000]
def simulated_revenue(arpu_band, package_combination, price_M, price_W, price_D):
# Mengubah ARPU band menjadi range nilai numerik
arpu_min, arpu_max = 0, float('inf') # default untuk ">150K"
if arpu_band != ">150K":
arpu_min, arpu_max = arpu_band.split('-')
arpu_min, arpu_max = int(arpu_min.replace('K', '000')), int(arpu_max.replace('K', '000'))
# Mendapatkan nilai dasar revenue berdasarkan kombinasi paket
optimal_revenue_order = {
'0-25K': ['D', 'W', 'M'],
'25K-50K': ['W', 'M', 'D'],
'>50K': ['M', 'W', 'D'], # untuk semua band di atas 50K
}
# Penentuan urutan kombinasi paket yang optimal
for key in optimal_revenue_order:
if arpu_min >= 50000 or (arpu_min == 0 and key == '0-25K') or (arpu_min == 25000 and key == '25K-50K'):
optimal_order = optimal_revenue_order[key]
break
# Penentuan nilai revenue
revenue = 0
for i, package_type in enumerate(package_combination):
if package_type == 'M':
# Jika harga melebihi ARPU maksimal, revenue berkurang
revenue += price_M if price_M <= arpu_max+arpu_max*0.2 else -price_M*((price_M-arpu_max)/arpu_max)
elif package_type == 'W':
revenue += price_W if price_W <= arpu_max+arpu_max*0.2 else -price_W*((price_W-arpu_max)/arpu_max)
elif package_type == 'D':
revenue += price_D if price_D <= arpu_max+arpu_max*0.2 else -price_D*((price_D-arpu_max)/arpu_max)
# Mengalikan dengan faktor berdasarkan urutan yang optimal
revenue *= optimal_order.index(package_type) + 1
if revenue<=0:
revenue = 0
return revenue/3
# Mendefinisikan ruang parameter
space = [Categorical(price_M, name='price_M'),
Categorical(price_W, name='price_W'),
Categorical(price_D, name='price_D')]
# Mendefinisikan fungsi objektif baru yang hanya mempertimbangkan rata-rata harga sebagai target untuk dioptimalkan
def objective(params, arpu_band, package_comb):
p_M, p_W, p_D = params
# Menggunakan simulated_revenue untuk menghitung revenue yang diharapkan
revenue = simulated_revenue(arpu_band, package_comb, p_M, p_W, p_D)
return -revenue # Kita ingin memaksimalkan revenue, jadi return negatif
results = {}
# Melakukan optimasi untuk setiap ARPU Band dan kombinasi paket
for arpu_band in ARPU_bands:
results[arpu_band] = {}
for package_comb in package_combinations:
res = gp_minimize(lambda x: objective(x, arpu_band, package_comb), space, n_calls=50, random_state=0)
results[arpu_band][package_comb] = {
'price_M': res.x[0],
'price_W': res.x[1],
'price_D': res.x[2],
'max_revenue': -res.fun
}
# Convert the nested dictionary to a flat dictionary
flattened_data = []
for arpu_band, packages in results.items():
for package_comb, details in packages.items():
flattened_data.append({
'ARPU Band': arpu_band,
'Package Combination': package_comb,
'Price M': details['price_M'],
'Price W': details['price_W'],
'Price D': details['price_D'],
'Max Revenue per User': details['max_revenue']
})
# Convert the flat dictionary to a DataFrame
df_results = pd.DataFrame(flattened_data)
df_results
Output:
Penjelasan Script:
1. Inisialisasi Data Awal
- ARPU Bands: Ini adalah segmen berdasarkan rata-rata pengeluaran bulanan pelanggan (ARPU). Ada enam segmen yang didefinisikan: “0–25K”, “25K-50K”, “50K-75K”, “75K-100K”, “100K-150K”, dan “>150K”.
- Kombinasi Paket: Ada enam kombinasi paket yang didefinisikan, yang menunjukkan prioritas tampilan paket kepada pelanggan.
- Harga Paket: Harga untuk setiap jenis paket (Bulanan, Mingguan, Harian) didefinisikan dalam rentang tertentu.
2. Fungsi Simulated Revenue (nantinya gunakan revenue aktual)
- Fungsi
simulated_revenue
didefinisikan untuk mensimulasikan pendapatan berdasarkan kombinasi harga paket dan profil ARPU pelanggan. - Fungsi ini mempertimbangkan pengurangan multiplier berdasarkan kenaikan harga untuk setiap paket.
- Selain itu, fungsi ini juga mempertimbangkan prioritas paket berdasarkan segmen ARPU dan kombinasi paket yang dipilih.
- Total pendapatan dihitung berdasarkan kombinasi harga dan multiplier yang diperoleh.
3. Ruang Parameter
- Ruang pencarian untuk optimasi didefinisikan dengan
space
. Ini mencakup semua kombinasi harga untuk paket Bulanan, Mingguan, dan Harian.
4. Fungsi Tujuan (Objective Function)
- Fungsi
objective
didefinisikan untuk menghitung pendapatan yang diharapkan berdasarkan kombinasi harga paket. - Fungsi ini menggunakan
simulated_revenue
untuk menghitung pendapatan. - Tujuan dari optimasi adalah untuk memaksimalkan pendapatan, oleh karena itu kita mengembalikan negatif dari pendapatan yang dihasilkan untuk memastikan bahwa algoritma mencari maksimum.
5. Optimasi
- Untuk setiap kombinasi segmen ARPU dan paket, kita melakukan optimasi menggunakan
gp_minimize
. Ini adalah metode optimasi berbasis Gaussian Process. n_calls=50
menunjukkan bahwa proses optimasi akan mencoba 50 kombinasi yang berbeda dari ruang pencarian untuk mencari kombinasi harga yang optimal.random_state=0
digunakan untuk memastikan hasil yang dapat direproduksi.
Namun, penting untuk diingat bahwa Bayesian Optimization, seperti metode optimasi lainnya, memiliki keterbatasan dan sangat bergantung pada kualitas data yang digunakan. Oleh karena itu, selalu penting untuk memperbarui model dengan data terbaru dan terus melakukan validasi kinerja model untuk memastikan keakuratannya.