Belajar Merekomendasikan Produk dengan Layanan IBM Bluemix Tradeoff Analytics

Yana Permana 20 Januari 2017

Belajar Merekomendasikan Produk dengan Layanan IBM Bluemix Tradeoff Analytics

Melanjutkan seri tutorial "Menggunakan Bluemix untuk Development", kali ini kita akan membahas tentang Tradeoff Analytics. Tradeoff Analytics merupakan layanan yang berguna dalam membantu seseorang dalam mengambil keputusan ketika banyak faktor dan perlu diseimbangkan agar mencapai tujuan diinginkan. Ketika Anda membuat keputusan, pastinya banyak faktor yang dipertimbangkan? Bagaimana Anda mengidentifikasi pilihan terbaik? Dengan layanan Tradeoff Analytics, Anda dapat menghindari daftar pilihan terbatas dan menentukan pilihan yang tepat dengan mempertimbangkan beberapa tujuan lainnya.

Baiknya Layanan IBM Bluemix Tradeoff Analytics digunakan untuk apa saja sih?

Layanan Tradeoff Analytics menggunakan teknik filtering secara matematis yang biasa disebut Optimization Pareto. Optimization Pareto memungkinkan pengguna untuk menjelajahi timbal balik (feedback) ketika mempertimbangkan beberapa kriteria untuk memperoleh keputusan tunggal. Layanan Tradeoff Analytics berguna untuk membangun aplikasi yang dapat membantu:

  • Analis bank atau investor dalam memilih strategi investasi yang terbaik
  • E-commerce dalam merekomendasikan produk yang paling cocok dengan preferensi konsumen
  • Dokter dalam menemukan pengobatan yang paling cocok berdasarkan beberapa kriteria atau gejala pasien

Input yang diperlukan Layanan Tradeoff IBM Bluemix itu apa saja sih?

Masalah keputusan dengan tujuan dan pilihan. Misalnya, Anda ingin membeli mobil yang terbaik berdasarkan tipe, harga, dan efisiensi bahan bakar.

Output yang dihasilkan Layanan Tradeoff IBM Bluemix bentuknya apa sih?

Objek JSON yang merepresentasikan pilihan keputusan yang optimal dan menyoroti trade-off antar pilihan yang didefinisikan pada Input. Layanan Tradeoff Analytics merekomendasikan keputusan yang terbaik melalui output yang dihasilkan. Selanjutnya bisa ditampilkan dengan antarmuka yang bagus dengan menggunakan library klien agar dapat melakukan visualisasi terhadap output JSON.

Contoh sederhananya, Bagaimana sih?

Ketika Anda berbelanja smartphone, Anda biasanya mempertimbangkan kelebihan dan kekurangannya. Mulai dari harga, ukuran layar, baterai dan berat. Dengan menyesuaikan satu set timbangan yang terkoordinasi untuk setiap faktor (harga, ukuran layar, dll), Anda dapat mengeksplorasi pilihan terbaik dan membuat keputusan antar masing-masing faktor.

Baca juga: Belajar Menganalisa Karakter Seseorang dengan IBM Bluemix Watson Personal Insights

Penggunaan Layanan IBM Bluemix Tradeoff Analytics ada yang gratis nggak sih?

Standar pelayanan yang diberikan umumnya diberikan secara cuma-cuma. Pertama mendaftar akun Bluemix, Anda akan mendapatan call API seribu per bulan secara gratis. Termasuk kemampuan untuk menggunakan bahasa Inggris, Jerman, Spanyol, Perancis, Italia, Jepang, Korea, Portugis (Brasil), Cina, dan Cina Taiwan. Jika sudah melewati batas tiap bulannya, call API tambahan akan dikenakan sebesar $0.03 per panggilan.

Saya seorang Developer dan ingin tahu cara kerja Layanan IBM Bluemix Tradeoff Analytics, Bagaimana? Ribet nggak sih?

Anda dapat mengakses kemampuan layanan Tradeoff Analytics melalui request HTTP dengan (REST) API. SDK juga tersedia untuk memudahkan pengembangan aplikasi dalam berbagai bahasa. Bagian selanjutnya akan dijelaskan mengenai gambaran pengembangan aplikasi dengan layanan Tradeoff Analytics.

Saya suka pemrograman, Bagaimana penggunaan Layanan IBM Tradeoff Analytics jika dikombinasikan dengan coding ?

Untuk menggunakan layanan Tradeoff Analytics, Anda dapat mengirimkan input berupa decision problem melalui API dengan HTTP method POST dilemma. Anda dapat merepresentasikan decision problem sebagai objek JSON. Dibawah ini merupakan contoh yang menunjukkan bagaimana merepresentasikan decision problem yang sederhana.

Image

Pada contoh objek JSON terdapat dua objek yang dispesifikasikan melalui parameter columns dengan key obj1 dan obj2. Masing-masing memiliki full_names yang menggambaran objek, type untuk numerik, dan parameter boolean is_objective diatur menjadi true untuk mengindikasikan bahwa layanan bisa mengevaluasi setiap opsi. Adapun goal pada objek pertama menspesifikasikan bahwa objek tersebut dapat diminimalkan (min), sedangkan objek kedua mengindikasikan bahwa objek tersebut dapat dimaksimalkan (max).

Lebih rinci, objek JSON menspesifikasikan dua opsi melalui parameter option. Masing-masing memiliki key dan name termasuk value pada kedua objective. Gambar diatas menunjukkan bagaimana objective dan opsi dispesifikasikan dalam JSON.

Jika request HTTP berhasil, Anda akan mendapatkan response Dilemma dalam bentuk objek JSON yang berisi dua construct: 1) decision problem sebelumnya; 2) resolution dari problem tersebut. resolution berisi solusi-solusi yang menggambarkan bahwa opsi menumpuk pada kedua objective. resolution juga terdiri dari map dengan parameter yang dibutuhkan untuk merepresentasikan masalah dan solusinya pada dua dimensi visualisasi dalam antarmuka grafis pada layanan Tradeoff.

Objek tersebut dapat divisualisasikan dengan antarmuka klien yang tersedia melalui library JavaScript yang menyediakan klien web yang kuat dimana pengguna dapat menjelajahi dan menganalisis pilihan di antara pilihan yang tersedia. Library, direferensikan sebagai widget Tradeoff Analytics, yang dapat merekomendasikan pilihan terbaik dengan memanfaatkan output layanan.

Penggunaan antarmuka interaktif bersifat opsional, aplikasi tetap dapat menghubungi layanan tanpa melibatkan antarmuka tersebut. Layanan dapat mengembalikan hasil analisis tanpa parameter yang diperlukan untuk antarmuka dan visualisasinya. Untuk informasi lebih lanjut tentang penggunaan antarmuka interaktif, Anda bisa melihat dokumentasi antarmuka dan widget.

Baca juga: Belajar Menggunakan Layanan IBM Bluemix Cloudant NoSQL

Tutorial

Tutorial berbasis cURL ini dapat membantu Anda memulai dengan cepat penggunaan layanan Tradeoff Analytics. Contoh dibawah ini akan menunjukkan cara memanggil layanan ini dengan request HTTP POST dilemma baik dengan visualisasi maupun tidak.

Prasyarat

Anda perlu mendaftar ke IBM Bluemix dan memilih layanan Tradeoff Analytics.

Tahap 1: Daftar Akun Bluemix

Jika anda belum memiliki akun, silahkan daftar melalui website resmi IBM Bluemix. Pilih Start Free in Bluemix dan isi form yang tersedia.

Image

Periksa inbox email anda untuk verifikasi akun.

Image

Tahap 2: Login ke IBM Bluemix

Kunjungi halaman Login IBM Bluemix, kemudian masukan identitas akun anda.

Image

Anda akan diarahkan ke halaman dasbor IBM Bluemix. Pilih Create Services.

Image

Anda akan diarahkan pada halaman katalog IBM Bluemix. Pilih Tradeoff Anayltics.

Image

Isi Services Name dan Credential Name dengan nama yang anda inginkan. Pilih Create.

Image

Anda akan diarahkan ke halaman manajemen akun Service Tradeoff Analytics.

Image

Anda bisa mengambil identitas akun Anda pada tab Service Credentials.

Image

Klik pada View Credentials, Anda bisa melihat username dan password akun milik Anda.

Image
{
  "url": "https://gateway.watsonplatform.net/tradeoff-analytics/api",
  "password": "IFfKvnMMkWR1",
  "username": "35029396-bade-40ca-9e8c-f5b9b78b0d31"
}

Menggunakan decision problem sebagai Input

Anda bisa menggunakan cURL dengan opsi --data untuk mengunggah berkas JSON problem.json ke layanan Tradeoff Analytics. Isi berkas problem.json merepresentasikan decision problem. Field subject menjelaskan decision problem yang akan dikirim ke layanan Tradeoff Analytics, misal tentang phones.

{
  "subject": "phones",
  . . .
}

Field columns menyediakan berbagai objective array untuk properti dan atribut smartphones. Tiap field menspesifikasikan 4 kolom: price, weight, brand, dan rData (tanggal rilis). Hanya tiga pertama yang didefinisikan sebagai objective yang diatur dengan is_objective menjadi true, sedangkan yang ke-4 hanya tambahan informasi saja.

Tiga kolom yang merupakan objective dapat mengatur field goal ke field min. Sedangkan price dan weightberguna mendefinisikan preferensi nilai terendah. Adapun brand yang berguna menunjukkan urutan nilai-nilai yang tercantum dalam field preferensi yang lebih disukai: Nilai di awal daftar lebih disukai dibanding urutan terakhir.

Input mendefinisikan rentang nilai yang diijinkan untuk kolom price dan brand. Input juga menyediakan format untuk presentasi price, weight, dan kolom rData ketika ditampilkan melalui klien widget Tradeoff Analytics.

{
  . . .
  "columns": [
    {
      "key": "price",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Price",
      "range": {
        "low": 0,
        "high": 400
      },
      "format": "number:2"
    },
    {
      "key": "weight",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Weight",
      "format": "number:0"
    },
    {
      "key": "brand",
      "type": "categorical",
      "goal": "min",
      "is_objective": true,
      "full_name": "Brand",
      "range": [
        "Apple",
        "HTC",
        "Samsung",
        "Sony"
      ],
      "preference": [
        "Samsung",
        "Apple",
        "HTC"
      ]
    },
    {
      "key": "rDate",
      "type": "datetime",
      "goal": "max",
      "full_name": "Release Date",
      "format": "date: 'MMM dd, yyyy'"
    }
  ],
  . . .
}

Field options menyediakan array phones yang berhubungan dengan masalah. Masing-masing opsi diidentifikasikan dengan key yang unik dan masing-masing memiliki values untuk setiap objective pada masalah. Layanan Tradeoff Analytics akan membandingkan pilihan terhadap kedua objective dan dibandingkan satu sama lain untuk menentukan kandidat dengan tujuh teratas terbaik.

{
  . . .
  "options": [
    {
      "key": "1",
      "name": "Samsung Galaxy S4",
      "values": {
        "price": 249,
        "weight": 130,
        "brand": "Samsung",
        "rDate": "2013-04-29T00:00:00Z"
      }
    },
    {
      "key": "2",
      "name": "Apple iPhone 5",
      "values": {
        "price": 349,
        "weight": 112,
        "brand": "Apple",
        "rDate": "2012-09-21T00:00:00Z"
      }
    },
    {
      "key": "3",
      "name": "HTC One",
      "values": {
        "price": 299,
        "weight": 112,
        "brand": "HTC",
        "rDate": "2013-03-01T00:00:00Z"
      }
    },
    {
      "key": "4",
      "name": "Samsung Galaxy S5",
      "values": {
        "price": 349,
        "weight": 135,
        "brand": "Samsung",
        "rDate": "2014-04-29T00:00:00Z"
      }
    },
    {
      "key": "5",
      "name": "Apple iPhone 6",
      "values": {
        "price": 399,
        "weight": 118,
        "brand": "Apple",
        "rDate": "2013-09-21T00:00:00Z"
      }
    },
    {
      "key": "6",
      "name": "Apple iPhone 7",
      "values": {
        "price": 499,
        "weight": 118,
        "brand": "Apple",
        "rDate": "2014-09-21T00:00:00Z"
      }
    },
    {
      "key": "7",
      "name": "Sony Xperia",
      "values": {
        "price": 199,
        "weight": 120,
        "brand": "Sony",
        "rDate": "2014-08-21T00:00:00Z"
      }
    }
  ]
}

Contoh pertama, dimulai dengan mengunggah berkas problem.json dengan method POST dilemmas dengan mengatur generate_visualization menjadi false sehingga layanan akan mengembalikan objek Resolution tanpa objek Map yang biasa digunakan pada widget klien Tradeoff Analytics. Pada contoh, atur header Content-type ke application/json yang berguna untuk semua method.

Anda bisa mulai menggunakannya dengan berkas problem.json yang merupakan dilemma problem yang akan dianalisis untuk mendapatkan solusinya. Unduh berkas problem.json terlebih dahulu.

$ sudo wget -c https://www.ibm.com/watson/developercloud/doc/tradeoff-analytics/example/problem.json
Image
curl -X POST --user <username>:<password>
--header "Content-Type: application/json"
--data @problem.json
"https://gateway.watsonplatform.net/tradeoff-analytics/api/v1/dilemmas?generate_visualization=false"

Layanan akan mengembalikan objek JSON Dilemma yang terdiri dari field problem. Field ini akan berlipat ganda sesuai dengan objek Problem yang dikirimkan melalui requests.

{
  "problem": {
    "columns": [
      {
        "type": "numeric",
        "key": "price",
        "full_name": "Price",
        "range": {
          "low": 0,
          "high": 400
        },
        "format": "number:2",
        "goal": "min",
        "is_objective": true
      },
      {
        "type": "numeric",
        "key": "weight",
        "full_name": "Weight",
        "format": "number:0",
        "goal": "min",
        "is_objective": true
      },
      {
        "type": "categorical",
        "key": "brand",
        "full_name": "Brand",
        "range": [
          "Apple",
          "HTC",
          "Samsung",
          "Sony"
        ],
        "goal": "min",
        "preference": [
          "Samsung",
          "Apple",
          "HTC"
        ],
        "is_objective": true
      },
      {
        "type": "datetime",
        "key": "rDate",
        "full_name": "Release Date",
        "format": "date: 'MMM dd, yyyy'",
        "goal": "max",
        "is_objective": false
      }
    ],
    "subject": "phones",
    "options": [
      {
        "key": "1",
        "name": "Samsung Galaxy S4",
        "values": {
          "price": 249,
          "weight": 130,
          "brand": "Samsung",
          "rDate": "2013-04-29T00:00:00Z"
        }
      },
      {
        "key": "2",
        "name": "Apple iPhone 5",
        "values": {
          "price": 349,
          "weight": 112,
          "brand": "Apple",
          "rDate": "2012-09-21T00:00:00Z"
        }
      },
      {
        "key": "3",
        "name": "HTC One",
        "values": {
          "price": 299,
          "weight": 112,
          "brand": "HTC",
          "rDate": "2013-03-01T00:00:00Z"
        }
      },
      {
        "key": "4",
        "name": "Samsung Galaxy S5",
        "values": {
          "price": 349,
          "weight": 135,
          "brand": "Samsung",
          "rDate": "2014-04-29T00:00:00Z"
        }
      },
      {
        "key": "5",
        "name": "Apple iPhone 6",
        "values": {
          "price": 399,
          "weight": 118,
          "brand": "Apple",
          "rDate": "2013-09-21T00:00:00Z"
        }
      },
      {
        "key": "6",
        "name": "Apple iPhone 7",
        "values": {
          "price": 499,
          "weight": 118,
          "brand": "Apple",
          "rDate": "2014-09-21T00:00:00Z"
        }
      },
      {
        "key": "7",
        "name": "Sony Xperia",
        "values": {
          "price": 199,
          "weight": 120,
          "brand": "Sony",
          "rDate": "2014-08-21T00:00:00Z"
        }
      }
    ]
  },
  "resolution": {
    . . .
  }
}

Selanjutnya, Anda bisa menggunakan cURL untuk mengirimkan requests ke layanan Tradeoff Analytics. Ganti username dan password pada perintah dibawah ini menggunakan akun Anda,

$ sudo curl -s -X POST --user <username>:<password> \
--header "Content-Type: application/json" \
--data @problem.json "https://gateway.watsonplatform.net/tradeoff-analytics/api/v1/dilemmas?generate_visualization=false" | \
python -m json.tool > result.json

Baca juga: Belajar Menganalisis Sentimen Netizen dengan IBM Bluemix Twitter Insights

Misal,

$ sudo curl -s -X POST --user "35029396-bade-40ca-9e8c-f5b9b78b0d31":"IFfKvnMMkWR1" \
--header "Content-Type: application/json" \
--data @problem.json "https://gateway.watsonplatform.net/tradeoff-analytics/api/v1/dilemmas?generate_visualization=false" | \
python -m json.tool > result.json
Image

Pada perintah tersebut, Anda telah mengirimkan requests dengan method POST, dengan mengunggah berkas problem.json, kemudian dirapikan dengan JSON prettifier milik Python, selanjutnya disimpan dalam result.json. Ini dia isi berkas result.json:

{
    "problem": {
        "columns": [
            {
                "format": "number:2",
                "full_name": "Price",
                "goal": "min",
                "is_objective": true,
                "key": "price",
                "range": {
                    "high": 400.0,
                    "low": 0.0
                },
                "type": "numeric"
            },
            {
                "format": "number:0",
                "full_name": "Weight",
                "goal": "min",
                "is_objective": true,
                "key": "weight",
                "type": "numeric"
            },
            {
                "full_name": "Brand",
                "goal": "min",
                "is_objective": true,
                "key": "brand",
                "preference": [
                    "Samsung",
                    "Apple",
                    "HTC"
                ],
                "range": [
                    "Apple",
                    "HTC",
                    "Samsung",
                    "Sony"
                ],
                "type": "categorical"
            },
            {
                "format": "date: 'MMM dd, yyyy'",
                "full_name": "Release Date",
                "goal": "max",
                "is_objective": false,
                "key": "rDate",
                "type": "datetime"
            }
        ],
        "options": [
            {
                "key": "1",
                "name": "Samsung Galaxy S4",
                "values": {
                    "brand": "Samsung",
                    "price": 249,
                    "rDate": "2013-04-29T00:00:00Z",
                    "weight": 130
                }
            },
            {
                "key": "2",
                "name": "Apple iPhone 5",
                "values": {
                    "brand": "Apple",
                    "price": 349,
                    "rDate": "2012-09-21T00:00:00Z",
                    "weight": 112
                }
            },
            {
                "key": "3",
                "name": "HTC One",
                "values": {
                    "brand": "HTC",
                    "price": 299,
                    "rDate": "2013-03-01T00:00:00Z",
                    "weight": 112
                }
            },
            {
                "key": "4",
                "name": "Samsung Galaxy S5",
                "values": {
                    "brand": "Samsung",
                    "price": 349,
                    "rDate": "2014-04-29T00:00:00Z",
                    "weight": 135
                }
            },
            {
                "key": "5",
                "name": "Apple iPhone 6",
                "values": {
                    "brand": "Apple",
                    "price": 399,
                    "rDate": "2013-09-21T00:00:00Z",
                    "weight": 118
                }
            },
            {
                "key": "6",
                "name": "Apple iPhone 7",
                "values": {
                    "brand": "Apple",
                    "price": 499,
                    "rDate": "2014-09-21T00:00:00Z",
                    "weight": 118
                }
            },
            {
                "key": "7",
                "name": "Sony Xperia",
                "values": {
                    "brand": "Sony",
                    "price": 199,
                    "rDate": "2014-08-21T00:00:00Z",
                    "weight": 120
                }
            }
        ],
        "subject": "phones"
    },
    "resolution": {
        "solutions": [
            {
                "solution_ref": "1",
                "status": "FRONT"
            },
            {
                "solution_ref": "2",
                "status": "FRONT"
            },
            {
                "solution_ref": "3",
                "status": "FRONT"
            },
            {
                "excluded_by": [
                    {
                        "objectives": [
                            {
                                "difference": 100.0,
                                "key": "price"
                            },
                            {
                                "difference": 5.0,
                                "key": "weight"
                            }
                        ],
                        "solution_ref": "1"
                    }
                ],
                "solution_ref": "4",
                "status": "EXCLUDED"
            },
            {
                "excluded_by": [
                    {
                        "objectives": [
                            {
                                "difference": 50.0,
                                "key": "price"
                            },
                            {
                                "difference": 6.0,
                                "key": "weight"
                            }
                        ],
                        "solution_ref": "2"
                    }
                ],
                "solution_ref": "5",
                "status": "EXCLUDED"
            },
            {
                "solution_ref": "6",
                "status": "INCOMPLETE",
                "status_cause": {
                    "error_code": "RANGE_MISMATCH",
                    "message": "A column of a option is out of range. Option \"6\" has a value in column \"price\" which is:\"499\" while the column range\" is: [0.0,400.0]",
                    "tokens": [
                        "price",
                        "499",
                        "[0.0,400.0]"
                    ]
                }
            },
            {
                "solution_ref": "7",
                "status": "DOES_NOT_MEET_PREFERENCE",
                "status_cause": {
                    "error_code": "DOES_NOT_MEET_PREFERENCE",
                    "message": "Option \"7\" has a value that does not meet preference for column \"brand\"",
                    "tokens": [
                        "brand"
                    ]
                }
            }
        ]
    }
}

Objek Dilemma terdiri dari field Resolution yang menyediakan hasil evaluasi layanan dari tujuh pilihan yang ada. Field solution memberikan array objek Solution dengan hasil untuk setiap pilihan. Untuk setiap elemen dari array, field solution_ref mengidentifikasi kunci dari sebuah pilihan, dan field status menunjukkan disposisi pilihan dalam resolusi:

  • Tiga pilihan pertama memiliki status FRONT untuk menunjukkan bahwa pilihan tersebut adalah salah satu kandidat terbaik.
  • Dua pilihan berikutnya memiliki status EXCLUDED (dikecualikan). Ini berarti bahwa ada satu pilihan atau lebih yang unggul untuk setiap opsi. Untuk kedua pilihan, output mencakup field excluded_by yang berisi daftar pilihan superior dan menjelaskan nilai-nilai opsi yang lebih baik dibandingkan opsi yang bersangkutan.
  • Opsi 6 memiliki status INCOMPLETE (tidak lengkap). Field status_cause menunjukkan bahwa pilihan memiliki RANGE_MISMATCH dengan kolom price: Harganya melebihi jangkauan maksimum objective tersebut.
  • Opsi 7 memiliki status DOES_NOT_MEET_PREFERENCE. Field status_cause menunjukkan bahwa pilihan tidak sesuai dengan kebutuhan.

Penggunaan layanan IBM Bluemix Tradeoff Analytics lebih lanjut, bisa Anda terapkan dalam membangun berbagai aplikasi yang berhubungan dengan rekomendasi, diantaranya:

  • Aplikasi pencari sekolah, berdasaran kepribadian anak, lihat demo.
  • Aplikasi pencari rumah, berdasaran harga, lokasi, tempat tidur, kamar mandi dan sebagainya, lihat demo.
  • Aplikasi investment Advisor, lihat demo
  • Aplikasi pencari mobil, berdasarkan harga, mesin, mpg dan sebagainya, lihat demo
  • Dan lain-lain.

Buat kamu yang ingin belajar dan mengenal lebih banyak tentang Bluemix, kamu bisa mengikuti Akademi Dicoding Belajar Membangun Aplikasi Android dengan IBM Bluemix atau bisa juga melalui tutorial-tutorial di Dirakit. Semoga bermanfaat. Selamat belajar.