## Peramalan Penjualan Sediaan Farmasi Menggunakan Long Short-term Memory: Studi Kasus pada Apotik Suganda
Maulana Ichwan Anshory *1 , Yusuf Priyandari 2 , dan Yuniaristanto 3
1,2,3 Program Studi Teknik Industri, Fakultas Teknik, Universitas Sebelas Maret, Jl. Ir. Sutami No.36 A, Surakarta, 57126, Indonesia Email: maulanaia@outlook.com 1 , priyandari@ft.uns.ac.id 2 , yuniaristanto@staff.uns.ac.id 3
DOI: 10.20961/performa.19.2.45962

## Abstrak
Peramalan data penjualan berperan penting dalam optimasi persediaan produk pada bisnis retail. Apotek adalah  satu  bentuk  bisnis  retail  yang  menjual  sediaan  farmasi  (obat,  bahan  obat,  obat  tradisional  dan kosmetik),  alat  kesehatan,  dan  bahan  medis  habis  pakai. Apotek  Suganda  yang  berlokasi  di  Kabupaten Sragen,  melakukan  penentuan  rencana  pengisian  kembali  (pembelian)  sediaan  farmasi  dengan  manual berbasis  kebiasaan  semata.  Mekanisme  tersebut  terkadang  menyebabkan  terjadinya  kekurangan persediaan obat. Oleh karena itu, untuk memperbaiki perencanaan pembelian, perlu dilakukan peramalan permintaan  sediaan  farmasi.  Beberapa  metode  diujikan  untuk  melakukan  peramalan  permintaan,  salah satunya  menggunakan  metode  Long  Short-term  Memory  (LSTM),  yakni  suatu  metode  berbasis  machine learning.  Bersama  dengan  metode-metode  lainnya  yakni  Least  Square,  Single  exponential  Smoothing, Double  exponential  Smoothing,  Triple  Exponential  Smoothing,  Winter  Exponential  Smoothing,  Weight Moving  Average,  dan  ARIMA,  peramalan  penjualan  sediaan  farmasi  dilakukan.  Hasil  pengujian menunjukkan bahwa peramalan penjualan sediaan farmasi secara mingguan yang menggunakan LSTM memiliki Mean Absolute Percentage Error (MAPE) yang paling rendah dibanding metode lainnya. Dengan demikian,  implementasi  peramalan  penjualan  berbasis  machine  learning  perlu  dimanfaatkan,  salah satunya dengan membuat modul peramalan untuk diintegrasikan dengan aplikasi penjualan yang dimiliki oleh apotek tersebut.

## Kata kunci: peramalan penjualan, sediaan farmasi, Long Short-term memory, machine learning

## Abstract
Sales data forecasting plays an important role in optimization of retail business inventory. Pharmacy is a retail business that sells pharmaceutical products (medicines, medicinal ingredients, traditional medicines and cosmetics), medical devices, and consumable medical materials.  Apotek Suganda, which is located in Sragen Regency, determines order quantity based on rule of thumb. This mechanism sometimes causes a shortage of drugs. Therefore, to improve purchasing planing, it is necessary to forecast the demand. Several methods  have  been  tested  to  perform  demand  forecasting,  one  of  it  uses  the  Long  Short-term  Memory (LSTM) method, which is a machine learning-based method.  Together with other methods, namely Least Square,  Single  exponential  Smoothing,  Double  exponential  Smoothing,  Triple  Exponential  Smoothing, Winter Exponential Smoothing, Weight Moving Average, and ARIMA, sales forecasting  were carried out. The test shows that the forecasting of weekly sales using LSTM has the lowest Mean Absolute Percentage Error (MAPE) compare to other methods. Thus, the implementation of sales forecasting based on machine learning needs to be utilized by creating a forecasting module which can be integrated in a sales application in the Apotek Suganda,
Keywords: Sales forecasting, pharmaceutical products, Long Short-term memory, machine learning

## 1. Pendahuluan
Peramalan  merupakan  metode  untuk  memprediksi  kejadian  di  masa  yang  akan  datang dengan menggunakan data masa lampau. Bagi perusahaan, peramalan adalah salah satu bentuk usaha  untuk  mendukung  sebuah  pengambilan  keputusan  (Kotler  &  Keller,  2009).  Peramalan penjualan  atau  permintaan  produk  merupakan  aktivitas  yang  perlu  dilakukan  oleh  perusahaan ritel, salah satu tujuannya untuk menghindari terjadi kekurangan persediaan ( shortage ). Apotek Suganda  yang  berlokasi  di  Kabupaten  Sragen,  selama  ini  melakukan  perencanaan  pembelian
sediaan  farmasi  (obat,  bahan  obat,  obat  tradisional  dan  kosmetika)  berdasarkan  pengalaman praktis semata. Akibatnya, terkadang apotek kekurangan persediaan untuk memenuhi permintaan penjualan. Di sisi lain, penyediaan sediaan farmasi secara berlebihan tentunya menimbulkan biaya persediaan  atau  penimbunan  modal.  Oleh  karena  itu,  Apotek  Suganda  perlu  memprediksi permintaan penjualan menggunakan metode yang lebih baik.
Ada tiga klasifikasi metode peramalan secara umum yakni metode kualitatif, time series dan kausal (Render, Stair Jr, & Hanna, 2012). Metode peramalan time series dibagi menjadi dua yaitu metode statistik dan machine learning (Makridakis, Spiliotis, & Assimakopoulos, 2018). Metode statistik  menggunakan  pendekatan  statistik,  contohnya  seperti regresi  linier ,  dan exponential smoothing (Abraham  &  Ledolter,  2009).  Beberapa  metode  peramalan  statistik  yang  telah digunakan untuk peramalan penjualan obat adalah Least Square (Kumalasari & Rochmah, 2016; Rahmawati  &  Wijanarko,  2019), Single  Exponential  Smoothing (Fachrurrazi,  2019), Triple Exponential  Smoothing (Aprilianto  &  Fauzi,  2016), Winter  Exponential  Smoothing (Affandi, Pradibta, & Habibi, 2018), Weight Moving Average (Hendriani, Yamin, & Dewi, 2016) dan Auto- Regressive Integrated Moving Average (ARIMA) (Zahra, 2019). Metode machine  learning adalah  algoritma  yang  memungkinkan  pengguna  untuk menemukan dan menggambarkan pola struktur dalam data, sehingga dengan menggunakan pola struktur dalam data tersebut, machine learning melakukan peramalan data masa yang akan datang (Witten  &  Frank,  2002).  Dibandingkan  dengan  metode  statistik  tradisional,  metode machine learning melakukan peramalan lebih baik karena dapat mengakomodasi hubungan non-linier dan kompleks antara input dan output (Friedman, Hastie, & Tibshirani, 2001). Deep learning adalah salah  satu  bagian  dari machine  learning (Guo  et  al.,  2016).  Kemudian  salah  satu  metode peramalan time series dari kelompok deep learning adalah Long Short-Term Memory (LSTM) yang berbasis Recurrent Neural Network (RNN) dengan akurasi yang baik. Beberapa penelitian telah menggunakan metode LSTM sebagai metode peramalan time series , sebagai contoh untuk peramalan  kunjungan  wisata  (Sugiartawan,  Permana,  &  Prakoso,  2018),  harga  saham  (Arfan, 2019) dan nilai tukar mata uang (Hastomo & Satyo, 2019).
Pada  studi  kasus  peramalan  permintaan  sediaan  farmasi  di  Apotek  Suganda,  diujikan metode-metode tersebut. Metode yang memberikan akurasi yang baik, nantinya dipertimbangkan untuk digunakan sebagai komponen di dalam modul peramalan pada aplikasi penjualan di apotek tersebut.

## 2. Metodologi Penelitian
Tahapan  penelitian  menggunakan  prinsip  pengolahan  data  pada  metodologi data  analytic (Erl, Khattak, & Buhler, 2016). Tahapan tersebut yakni analisis proses bisnis, identifikasi data, pengumpulan  dan  penyaringan  data,  validasi  dan  pembersihan  data  dan  analisis  data.  Proses- proses  pengolahan  data  menggunakan  bahasa  pemrograman  Python  dengan  aplikasi  Jupyter Notebook sebagai antarmukanya dan menggunakan library pendukung seperti pandas, numpy, keras, statsmodel, scipy, mysql dan math.
Pada tahapan analisis proses bisnis, dilakukan observasi mengenai bagaimana pihak apotek melakukan  proses  peramalan  permintaan  produk  yang  dijadikan  landasan  untuk  pemesanan kepada  pemasok.  Tahapan  selanjutnya,  yakni  identifikasi  data,  dilakukan  identifikasi  data  dan sumber  data  untuk  peramalan  permintaan.  Setelah  itu,  dilakukan  tahapan  akuisisi  data,  yang dilanjutkan dengan tahapan validasi data dan pembersihan data. Validasi dan pembersihan data digunakan untuk mengidentifikasi kemungkinan data yang tidak relevan atau bahkan data hilang pada  proses  akuisisi.  Teknik  visualisasi  data  juga  dilakukan  pada  tahapan  tersebut  untuk membantu  menganalisis  kondisi  data  yang  tersedia.  Proses  interpolasi  data  dipertimbangkkan untuk digunakan jika ada data hilang, atau akan digunakan teknik-teknik lain sesuai kondisi data yang diperoleh.
Tahapan terakhir adalah analisis data. Pada tahapan ini diujikan beberapa metode peramalan yakni Least  Square , Single  Exponential  Smoothing , Double  Exponential  Smoothing , Triple Exponential Smoothing , Winter Exponential Smoothing , Weight Moving Average , ARIMA, dan terakhir LSTM. Oleh karena pengolahan menggunakan library yang telah tersedia pada Python, deskripsi rumusan pada setiap metode tidak dijelaskan detail pada artikel ini, tetapi dapat merujuk pada  referensi-referensi  utama  yang  berkaitan  dengan  metode-metode  tersebut.  Artikel  ini mengfokuskan  pada  penyajian  hasil  pengolahan  peramalan  yang  diperoleh  pada  antarmuka aplikasi  Jupyter  Notebook.  Tidak  semua  data  dianalisis,  tetapi  dipilih  secara  acak  salah  satu produk sediaan farmasi. Diasumsikan bahwa setiap jenis produk memiliki pola permintaan yang tidak  berbeda.  Parameter-parameter  yang  digunakan  pada  masing-masing  metode  peramalan adalah parameter yang menghasilkan Mean Absolute Percentage Error (MAPE) terkecil.
Validasi hasil peramalan dilakukan menggunakan metode one-step-ahead forecasting atau peramalan satu langkah ke depan. Secara umum, one-step ahead forecasting dilakukan dengan memanfaatkan nilai saat ini dan nilai yang diamati dari variabel tertentu untuk memperkirakan nilai yang diharapkan untuk langkah waktu berikutnya. Memprediksi dua atau lebih langkah ke depan dianggap sebagai masalah multi-step ahead forecasting , yang sering dilambangkan dengan prediksi h- langkah di depan, di mana h sesuai dengan horizon prediksi (ElMoaqet, Tilbury, & Ramachandran, 2016).

## 3. Hasil dan Pembahasan
Berikut ini disajikan hasil-hasil analitika data penjualan sediaan farmasi pada studi kasus di Apotek Suganda.
3.1 Analisis proses bisnis
Pihak Apotek Suganda tidak secara khusus melakukan prediksi penjualan. Kuantitas pesan yang  dilakukan  kepada  pemasok  didasarkan  pada  kebiasaan  pembelian  sebelumnya,  atau berdasarkan  pertimbangan  tertentu  yang  menjadi  wewenang  pemilik  apotek.  Saat  observasi dilakukan,  juga  sedang  berlangsung  proses  implementasi  aplikasi  penjualan  secara terkomputerisasi.  Aplikasi  penjualan  yang  digunakan  belum  memiliki  modul  untuk  peramalan permintaan produk.
Berdasarkan  diskusi  dengan  pegawai  apotek,  diketahui  bahwa  ternyata  ada  kalanya persediaan  obat  habis.  Potensi  kehilangan  penjualan  tersebut  tidak  selalu  diatasi  dengan penambahan  kuantitas  pemesanan  pada  periode  berikutnya  karena  pemilik  apotek  juga mempertimbangkan  jumlah  sediaan  yang tidak  terlalu  banyak.  Persediaan yang banyak berarti melakukan penimbunan modal usaha dan menimbulkan kemungkinan adanya sediaan kadaluarsa. Proses pemesanan kepada pemasok biasanya dilakukan setiap ada pegawai dari pedagang besar obat  yang  datang  ke  apotek.  Waktunya  beragam  dan  tidak  tentu,  bisa  seminggu  sekali  hingga sebulan  sekali.  Masing-masing  pedagang  besar  obat,  biasanya  memasok  jenis  sediaan  farmasi tertentu (spesifik), atau ada juga jenis sediaan yang bisa dipasok dari beberapa pemasok. Kondisi ini  menjadikan  mekanisme  peramalan  permintaan  yang  lebih  baik  perlu  digunakan  untuk memprediksi kuantitas pesan yang lebih optimal.

## 3.2 Identifikasi data dan sumber data
Data yang bisa diberikan oleh pihak apotek untuk penelitian adalah data lama, yakni data tahun  2019.  Diperoleh  data  penjualan  dan  pembelian  antara  tanggal  1  Juni  2019  hingga  30 September 2019. Data tersebut pada awalnya masih berbentuk catatan penjualan dan pembelian obat yang terekam dalam buku. Data tersebut kemudian dimasukkan ke dalam aplikasi penjualan atau point of sales (PoS) dan kemudian dipindahkan ke dalam spreadsheet .

## 3.3 Akuisisi data, validasi dan pembersihan
Dilakukan  penarikan  data  ( retrieve )  berupa  data  sediaan  farmasi  atau  selanjutnya  disebut data  produk,  data  pemasok  (biasanya  berupa  pedagang  besar  obat  atau  produsen  obat),  data transaksi  pemesanan  ( order ),  data  penerimaan  ( receiving )  dan  detail  kuantitas  penerimaan produk, data transaksi penjualan ( sales ) dan detail kuantitas penjualan produk.  Program python dan GUI Jupyter Notebook digunakan untuk menarik data. Selanjutnya data disimpan dalam file berekstensi *.csv untuk kemudahan pengolahan data lanjutan. Gambar 1 menampilkan tabel data produk di Apotek Suganda, kemudian gambar 2 data pemasok.
Gambar 1. Data sediaan farmasi (produk)
Gambar 2. Data pemasok
Gambar 3 (a) menampilkan data transaksi pemesanan produk kepada pemasok dan gambar 3  (b)  data  transaksi  penerimaan  produk.  Kedua  data  tersebut  menginformasikan  bahwa  pada tanggal 26 Mei 2019 dilakukan transaksi pemesanan, yang kemudian terjadi penerimaan pada 1 Juni  2019  atau  ada  lead  time  dari  saat  pemesanan  sampai  terjadi  penerimaan  produk.  Adapun detail kuantitas produk yang diterima, terdapat dalam tabel lain yang tidak disajikan di sini.
(a) (b)
Gambar 3. Data transaksi ( a) pemesanan produk, dan (b) penerimaan produk dari pemasok
(a) (b)
Gambar 4. Data (a) transaksi penjualan; (b) detail kuantitas penjualan produk
Gambar 4 (a) menyajikan data transaksi penjualan dan (b) detail kuantitas penjualan. Sebagai contoh, pada tanggal 1 Juni 2019 terdapat transaksi penjualan dengan produk-produk terjual yakni produk  1  sebanyak  3  satuan,  produk  14  sebanyak  2  satuan,  produk  15  sebanyak  3 satuan,  dan seterusnya. Relasi kedua tabel tersebut menghasilkan data time series penjualan produk.
Tahap validasi dan pembersihan data merupakan proses yang panjang dan dilakukan secara bertahap. Validasi menurut (Essnet Validat Foundation, 2016) ada beberapa level, pada tahapan ini  hanya  dilakukan  pengecekan  level  0  yakni  memastikan  data  yang  dipanggil  ( query ) menghasilkan data set yang sesuai. Pembersihan data lanjutan tidak menemukan data duplikasi pada  item  sediaan  farmasi.  Beberapa  kesalahan  pengetikan  pada  nama  produk  dan  satuan
ditemukan dan dilakukan perbaikan. Meskipun demikian, diasumsikan bahwa hal tersebut tidak berpengaruh terhadap proses peramalan pemintaan sediaan farmasi.
Selanjutnya  dilakukan  beberapa  visualisasi  data.  Pertama  visualisasi  distribusi  penjualan seperti gambar  5. Diperoleh informasi bahwa 59% kuantitas penjualan antara 1 sampai 3 unit, kemudian  21%  kuantitas  penjualan  antara  3  sampai  6  unit.  Dengan  kata  lain,  bahwa  80% penjualan antara 1 sampai 6 unit selama horizon data penjualan yang diolah.
Gambar 5. Distribusi penjualan per item produk
Gambar 6. Visualisasi rata-rata penjualan per- produk
Gambar 7. Visualisasi rata-rata penjualan untuk 100 produk pertama
Gambar 6 memberikan visualisasi rata-rata kuantitas penjualan untuk seluruh produk, yakni sebanyak 1229 item produk. Adapun gambar  7 menunjukkan grafik batang rata-rata penjualan untuk 100 item produk pertama (berdasarkan kode atau item_id produk). Sebagai contoh, produk dengan nomor (item_id) 40 memiliki rata-rata penjualan sebesar 19,3 unit.
Gambar 8. Visualisasi 10% produk dengan rata-rata kuantitas penjualan yang besar
Visualisasi pada gambar 8 menampilkan informasi sepuluh persen produk atau sebanyak 125 item  produk  dengan  rata-rata  kuantitas  penjualan  tinggi.  Visualisasi-visualisasi  tersebut menunjukkan bahwa pada produk nomor 40, memiliki rata-rata penjualan 19,3 unit satuan. Hasil verifikasi terhadap item produk nomor 40 seperti disajikan pada gambar 9. Jika dirata-rata pada atribut clean_sale, kuantitas penjualan sebesar 19,3 unit satuan.
Gambar 9. Verifikasi sample data penjualan produk dengan nomor item_id 40
Tentunya, tidak setiap hari terjadi transaksi penjualan obat, sehingga apabila menggunakan data mentah dari basis data, kuantitas penjualan produk bernilai Null . Hal tersebut menyebabkan data time series seolah-olah terputus. Pembersihan data dilakukan dengan mengubah nilai Null menjadi angka 0 atau melakukan interpolasi data untuk memberikan nilai tertentu. Grafik time series penjualan produk nomor 40 pada gambar 10, dan beberapa item produk pada gambar 11.
Gambar 11. Time series penjualan beberapa item produk

## 3.4 Analisis data
Oleh karena banyaknya produk sediaan farmasi pada apotek, di dalam artikel ini disajikan satu contoh hasil pengolahan data peramalan menggunakan metode-metode yang diujikan. Proses peramalan menggunakan program Python dan library yang diperlukan. Setiap metode dilihat nilai Mean Absolute Percentage Error (MAPE). Berikut ini pada tabel 1, disajikan hasil pengolahan peramalan permintaan harian pada untuk bulan September 2019 menggunakan Least Square . Tabel 1. Peramalan Piroxicam KF 20mg menggunakan Metode Least Square. Tanggal Penjualan Peramalan APE (%) 08-06-2019 30 29,8571 0,4762 09-06-2019 40 29,1667 27,0833 10-06-2019 47 33,6944 28,3097 ... ... ... ... 29-09-2019 43 35,1020 18,3674 30-09-2019 35 35,3781 1,0803
Tabel 2. Peramalan Piroxicam KF 20mg menggunakan Single Exponential Smoothing Tanggal Penjualan Peramalan APE (%) 07-06-2019 35 - - 08-06-2019 30 35,0000 16,6667 09-06-2019 40 34,5000 13,7500 ... ... ... ... 28-09-2019 41 34,8467 15,0081 29-09-2019 43 35,4620 17,5302 30-09-2019 35 36,2158 3,4737
Tabel 3. Peramalan Piroxicam KF 20mg menggunakan Metode Double Exponential Smoothing Tanggal Penjualan Single Exponential Double Exponential a b Peramalan APE (%) 06-06-2019 27 - - - - - 07-06-2019 35 27,0000 - - - - 08-06-2019 30 27,8000 27,0000 28,6000 0,0889 28,6889 10,0000 09-06-2019 40 28,0200 27,0800 28,9600 0,1044 29,0644 32,3000 ... ... ... ... ... ... ... ... 28-09-2019 41 35,1629 35,2780 34,4152 -0,0479 34,3673 13,9560 29-09-2019 43 34,8466 35,2349 35,6890 0,0252 35,7142 18,0584 30-09-2019 35 36,2158 35,2576 37,1739 0,1065 37,2804 0,7360
Tabel 4. Peramalan Piroxicam KF 20mg menggunakan Metode Triple Exponential Smoothing Tanggal Pen- jualan Single Exponential Double Exponential Triple Exponential a b c Pera- malan APE (%) 05-06-2019 25 - - - - - - - - 06-06-2019 27 25 - - - - - - - 07-06-2019 35 25.2000 25,0000 - - - - - - 08-06-2019 30 26.1800 25.0200 25,0000 28,48 3,15 1,14 32,20 7,34 09-06-2019 40 26.5620 25.1360 25.0020 29,28 2,67 1,29 33,60 16,00 10-06-2019 47 27.9058 25.2786 25.0154 32,90 6,73 2,36 40,82 13,16 11-06-2019 23 29.8152 25.5413 25.0417 37,86 10,8 3,77 50,58 119,9 ... ... ... ... ... ... ... ... 26-09-2019 32 35.5143 35.2658 34.7134 35,46 -0,3 -0,30 34,97 9,28 27-09-2019 32 35.1629 35.2906 34.7686 34,39 -1,3 -0,64 32,74 2,32 28-09-2019 41 34.8466 35.2778 34.8208 33,52 -2,1 -0,88 31,05 24,26 29-09-2019 43 35.4619 35.2347 34.8665 35,55 -0,1 -0,14 35,42 17,62 30-09-2019 35 36.2157 35.2574 34.9033 37,78 1,98 0,604 40,06 14,45 Tabel 5. Peramalan Piroxicam KF 20mg menggunakan Weighted Moving Average Tanggal Penjualan Peramalan APE (%) 08-06-2019 30 31,25 4,17 09-06-2019 40 30,82 22,95 10-06-2019 47 33,07 29,64 11-06-2019 23 36,79 59,94 12-06-2019 38 33,82 10,99 ... ... ... ... 26-09-2019 32 35,64 11.39 27-09-2019 32 34,54 7,92 28-09-2019 41 33,71 17,77 28-09-2019 43 35,36 17,77 30-09-2019 35 37,43 6,94 Tabel 6. Peramalan Piroxicam KF 20mg menggunakan ARIMA
Parameter APE (%) p d Q 0 0 0 15,159 0 0 1 15,639 0 0 2 15,103 0 1 0 18,334 0 1 1 15,403 ... ... ... 10 0 2 16,565 10 1 0 17,224 10 1 1 17,023 10 1 2 17,115 10 2 0 18,782 Tabel 7. Peramalan Piroxicam KF 20mg menggunakan LSTM Tanggal Penjualan Peramalan APE (%) 08-06-2019 30 29,4021 3,9567 09-06-2019 40 40,7857 5,5460 10-06-2019 47 46,4783 0,7334 11-06-2019 23 25,6039 1,9931 12-06-2019 38 38,6903 1,9643 ... ... ... ... 26-09-2019 32 29,0310 9,2782 27-09-2019 32 30,3765 5,0734 28-09-2019 41 37,3916 8,8009 28-09-2019 43 40,6898 5,3727 30-09-2019 35 31,5497 9,8579
Tabel 8. Rekapitulasi nilai MAPE Peramalan MAPE (%) Least Square 15,9124 Single Exponential Smoothing 15,6719 Double Exponential Smoothing 16,2871 Triple Exponential Smoothing 23,2503 Moving Average 16,0739 ARIMA 14,6210 LSTM 4,6151
Tabel  8  menampilkan  rekapitulasi  nilai  MAPE  untuk  seluruh  metode  yang  diujikan. Berdasarkan  informasi  yang  diperoleh,  metode  LSTM  memiliki  nilai  MAPE  terendah  sebesar 4,6151%. Dengan hasil tersebut, dilanjutkan penggunaan metode LSTM untuk peramalan harian dan  peramalan  mingguan  untuk  produk-produk  sediaan  farmasi  di  apotek.  Produk  yang diramalkan permintaannya adalah produk kategori A sesuai prinsip dasar pada klasifikasi ABC, yakni produk-produk yang secara kumulatif berkontribusi terhadap 80% nilai penjualan (Rupiah). Terdapat 546 produk sediaan farmasi pada kategori A seperti diilustrasikan rekapitulasinya pada gambar 12. Obat pada Kategori A tersebut adalah obat dengan penjualan 80% dari total penjualan seluruh obat di Apotek Suganda.
Gambar 12. Data produk kategori A
Gambar 13. Grafik peramalan produk nomor 40 (Ambroxol Tablet 30mg 100s)
Gambar  13  menyajikan  ilustrasi  data  latih  ( training) selama  tiga  bulan  dari  Juni  sampai Agustus. Kemudian data uji ( testing ) di bulan September 2019 dan data prediksi untuk September 2019. Paremeter yang digunakan adalah n_steps 6 dan epoch 100. Hasil itu menujukkan secara umum bahwa LSTM cukup baik melakukan estimasi.
Hasil  peramalan  harian  menggunakan  metode  LSTM  terhadap  produk  pada  kategori  A ditampilkan  pada  gambar  16.(a)  dan  hasil  peramalan  mingguan  pada  gambar  16.(b).  Pada peramalan harian didapatkan nilai MAPE terendah 0.8743%, nilai MAPE tertinggi 7.9201% dan nilai  MAPE  rata-rata  4.6541%.  Pada  peramalan  mingguan  didapatkan  nilai  MAPE  terendah 0,0032%, nilai MAPE tertinggi 13,5276% dan nilai MAPE rata-rata 4,7109%. Secara umum dapat dilihat bahwa nilai MAPE untuk peramalan harian dan peramalan mingguan tidak jauh berbeda.
(a)
(b)
Gambar 14. Peramalan permintaan (a) harian dan (b) mingguan menggunakan LSTM pada produk
kategori A
Metode LSTM membutuhkan pengaturan parameter berupa n_steps dan epochs. Parameter n_steps  adalah  jumlah  data  yang  dijadikan sebagai  masukan  ke  dalam neuron atau  syaraf  dari LSTM  untuk  kemudian  dilakukan  peramalan  satu step di  depan  data  sepanjang  jumlah  data tersebut. Epochs adalah banyaknya jumlah iterasi yang digunakan untuk penghitungan peramalan LSTM.  Nilai  n_steps  dicari  antara  2  hingga  9 menggunakan walk-forward  validation .  Adapun parameter epochs yang digunakan adalah 100 dan 500. Hasil dari pencarian  parameter n_steps pada epochs 100 dan 500 ditampilkan pada Tabel 9.
Tabel 9. Hasil pencarian n_steps ideal pada Epoch 100 dan 500
n_steps MAPE Perbulan Epoch 100 MAPE Perbulan Epoch 500 Juni Juli Agustus Rata-rata Juni Juli Agustus Rata-rata 2 5,90% 2,63% 4,12% 4,22% -4,13% 2,89% 4,41% 3,81% 3 4,87% 3,13% 3,42% 3,81% -1,60% 1,77% 5,28% 2,89% 4 4,47% 2,23% 3,48% 3,39% -1,02% 1,43% 1,77% 1,41% 5 17,89% 2,94% 3,86% 8,23% 19,09% 1,84% 8,17% 9,70% 6 12,46% 3,71% 2,26% 6,15% 10,25% 5,67% 6,60% 7,51% 7 4,08% 6,30% 6,02% 5,47% 6,46% 3,74% 3,52% 4,58% 8 3,17% 8,11% 5,48% 5,59% -5,60% 11,16% 7,80% 8,18% 9 0,12% 6,02% 4,38% 3,51% 2,20% 9,26% 6,25% 5,90%
Berdasarkan informasi dari tabel 9, parameter n_steps pada epochs 100 dan 500, diketahui bahwa n_steps 4 memiliki nilai MAPE terendah. Pada epochs 100, nilai MAPE n_steps 4 adalah 3,39%  dan  pada  epochs  500,  nilai  MAPE  n_steps  4  adalah  1,41%.  Dengan  demikian,  n_steps sebesar 4 dipakai untuk mencari pengaruh epoch terhadap hasil peramalan LSTM.
Tabel 10. Hasil pengujian LSTM untuk menentukan epoch ideal
epoch MAPE Perbulan MAPE Waktu rata-rata Juni Juli Agustus Rata-rata (detik) 100 5,23% 3,24% 2,63% 3,70% 8,15 200 -4,00% 1,08% 2,41% 2,50% 14,58 300 -1,81% 1,13% 2,83% 1,92% 24,90 400 2,77% -2,41% 0,10% 1,76% 33,92 500 -8,22% 0,00% 1,11% 3,11% 43,24
Tabel  10  menampilkan  rata-rata  MAPE  untuk  beberapa  parameter  yakni  epoch  100,  200, hingga  500.  Secara  umum  dapat  dilihat  bahwa  mulai  dari  epoch  100  ke  epoch  400  terjadi penurunan MAPE, namun ketika epoch diperbesar menjadi 500, nilai MAPE ternyata naik tajam menjadi 3,11%. Oleh karena epoch merupakan jumlah iterasi dalam proses pembentukan model LSTM menggunakan data training , maka semakin besar nilai epoch semakin lama proses iterasi dilakukan.
LSTM dengan parameter n_steps sebesar 4 dan epoch sebesar 400 dapat dapat digunakan untuk membentuk model LSTM menggunakan data training dan melakukan proses prediksi atau peramalan.  Selanjutnya,  metode  tersebut  idealnya  dibuatkan  menjadi  sebuah  modul  program peramalan untuk aplikasi penjualan (PoS) yang dimiliki oleh Apotek Suganda. Namun demikian, perlu juga dipertimbangkan waktu training karena untuk setiap produk, dibentuk model LSTM sendiri-sendiri sehingga bisa diestimasikan berapa waktu yang dibutuhkan untuk training saja. Jika ada 546 produk (kategori A), sedangkan waktu yang dibutuhkan untuk training selama 33,92 detik untuk tiap produk, maka total dibutuhkan waktu sekitar 18520,32 detik atau sekitar 5,1445 jam. Waktu tersebut belum termasuk waktu untuk prediksi atau peramalan.
Pada  penelitian  ini,  diasumsikan  bahwa  setiap  jenis  produk  memiliki  pola  dan  tren permintaan  yang  tidak  berbeda.  Idealnya,  dilakukan  terlebih  dahulu  proses  pengelompokan produk berdasarkan karakter data time series penjualan, tidak semata didasarkan nilai penjualan sebagaimana klasifikasi ABC tradisional yang diilustrasikan pada artikel ini. Hal ini karena nilai kontribusi penjualan tidak mempertimbangkan pola dan tren data time series . Pola ( pattern ) dan tren atau kecenderungan data ( trend ) pada data time series sangat berpengaruuh terhadap kualitas peramalan.  Dengan  demikian,  pemilihan  parameter  untuk  suatu  metode  peramalan  bisa dipengaruhi kedua hal tersebut.

## 4. Simpulan
Penggunaan  LSTM  untuk  peramalan  penjualan  sediaan  farmasi  pada  Apotek  Suganda ternyata cukup akurat yang ditunjukkan oleh nilai rata-rata persentasi kesalahan peramalan atau nilai  MAPE  sekitar  4%.  Tidak  ada  perbedaan  signifikan  antara  nilai  MAPE  untuk  peramalan permintaan produk secara harian maupun mingguan, yakni berturut-turut 4.6541% dan 4,7109%. Parameter  n_steps  ideal  yang  digunakan  untuk  peramalan  adalah  sebesar  4  sedangkan  epoch sebesar 100.
Namun demikian, di dalam implementasinya untuk pembuatan modul program peramalan yang akan diintegrasikan pada aplikasi penjualan, perlu dipertimbangkan waktu yang diperlukan untuk  proses  pembentukan  model  LSTM  menggunakan  data  training.  Ternyata  waktu  yang dibutuhkan untuk training cukup lama sekitar 5,14 jam untuk data sebanyak 546 produk saja.

## Ucapan Terima Kasih
Terima kasih kepada LPPM Universitas Sebelas Maret yang memberikan kesempatan untuk melakukan Riset Mandiri pada tahun 2020 (Nomor Kontrak 124/UN27.21/HK/2020).

## Daftar Pustaka
Abraham, B., & Ledolter, J. (2009). Statistical methods for forecasting (Vol. 234): John Wiley & Sons.
Affandi,  L.,  Pradibta,  H.,  &  Habibi,  M.  I.  (2018).  PERAMALAN  STOK  OBAT  DI PUSKESMAS  GENDING  PROBOLINGGO  MENGUNAKAN  METODE WINTER’S EXPONENTIAL SMOOTHING. Jurnal Informatika Polinema, 4 (4), 274-274.
Aprilianto, T., & Fauzi, I. (2016). Perancangan Sistem Peramalan Penjualan Barang Pada UD Achmad Jaya Dengan Metode Triple Exponential Smoothing. Jurnal Ilmiah Teknologi Informasi Asia, 10 (2), 73-86. Arfan,  A.  (2019). Prediksi  Harga  Saham  Di  Indonesia  Menggunakan  Algoritma  Long Short-Term Memory . Paper presented at the Prosiding SeNTIK. Brownlee. [online]. https://machinelearningmastery.com/how-to-develop-lstm-models- for-time-series-forecasting/ (Diakses 21 Januari 2020)
ElMoaqet,  H.,  Tilbury,  D.  M.,  &  Ramachandran,  S.  K.  (2016).  Multi-Step  Ahead Predictions for Critical Levels in Physiological Time Series. IEEE Trans Cybern, 46 (7), 1704-1714. doi:10.1109/tcyb.2016.2561974 Erl, T., Khattak, W., & Buhler, P. (2016). Big Data Fundamentals: Concepts, Drivers, and Techniques : Prentice Hall. Essnet Validat Foundation. (2016). Methodology for data validation 1.0.
Fachrurrazi,  S.  (2019).  Peramalan  Penjualan  Obat  Menggunakan  Metode  Single
Exponential  Smoothing  Pada  Toko  Obat  Bintang  Geurugok. TECHSI-Jurnal Teknik Informatika, 7 (1), 19-30. Friedman, J., Hastie, T., & Tibshirani, R. (2001). The elements of statistical learning (Vol. 1): Springer series in statistics New York.
Guo, Y., Liu, Y., Oerlemans, A., Lao, S., Wu, S., & Lew, M. (2016). Deep learning for visual understanding: a review. J Neurocompt, 187 ( 6), 27–48. Hastomo, W., & Satyo, A. (2019). Long Short Term Memory Machine Learning Untuk Memprediksi  Akurasi  Nilai  Tukar  IDR  Terhadap  USD .  Paper  presented  at  the Prosiding SeNTIK.
Hendriani,  T.,  Yamin,  M.,  &  Dewi,  A.  P.  (2016).  Sistem  Peramalan  Persediaan  Obat Dengan  Metode  Weight  Moving  Average  Dan  Reorder  Point  (Studi  Kasus: Puskesmas Soropia). semanTIK, 2 (2).
Kotler, P., & Keller, K. L. (2009). Manajemen Pemasaran Edisi 13, Jilid I, Jakarta . Kumalasari,  A.,  &  Rochmah,  T.  N.  (2016).  Pengendalian  Persediaan  Obat  Generik Dengan  Metode  MMSL  (Minimum-Maximum  Stock  Level)  di  Unit  Farmasi Rumah  Sakit  Islam  Surabaya. Jurnal  Manajemen  Kesehatan  Yayasan  RS.  Dr. Soetomo, 2 (2), 143-152.
Makridakis,  S.,  Spiliotis,  E.,  &  Assimakopoulos,  V.  (2018).  Statistical  and  Machine Learning forecasting methods: Concerns and ways forward. PLoS ONE, 13 (3), 1– 26. doi:10.1371/journal.pone.0194889
Rahmawati,  I.,  &  Wijanarko,  R.  (2019).  Implementasi  Prediksi  Penjualan  Obat Menggunakan  Metode  Least  Square  Pada  Apotek  Demak  Farma  Jaya. Jurnal Informatika dan Rekayasa Perangkat Lunak, 1 (1). Render,  B.,  Stair  Jr,  R.  M.,  &  Hanna,  M.  E.  (2012). Quantitative  Analysis  For Management .
Sugiartawan,  P.,  Permana,  A.  A.  J.,  &  Prakoso,  P.  I.  (2018).  Forecasting  Kunjungan Wisatawan Dengan Long Short Term Memory (LSTM). Jurnal Sistem Informasi dan Komputer Terapan Indonesia (JSIKTI), 1 (1), 43-52.
Witten,  I.  H.,  &  Frank,  E.  (2002).  Data  mining:  practical  machine  learning  tools  and techniques with Java implementations. Acm Sigmod Record, 31 (1), 76-77. Zahra, I. A. (2019). Analisis Perbandingan Teknik Peramalan Kebutuhan Obat Dengan Metode  Arima  Dan  Single  Eksponensial  Smoothing  Studi  Kasus:  Rsud Indramayu. Jurnal Tata Kelola dan Kerangka Kerja Teknologi Informasi, 9 (1).

## Lampiran 1 Kode untuk melakukan peramalan dengan LSTM (Brownlee, 2020)
import pandas as pd import csv import mysql.connector as sql import numpy as np from keras.models import Sequential from keras.layers import LSTM from keras.layers import Dense from keras.layers import Bidirectional import time db = sql.connect(host='localhost', user='root', passwd='', database='phppos') cur = db.cursor() # mendapatkan data penjualan semua produk cur.execute('SELECT * FROM modul_clean_sales') result = cur.fetchall() head =[h[0] for h in cur.description] sales_items = pd.DataFrame(result, columns=head) # mengambil data penjualan id 964 def get_data(item_id): product = sales_items.copy() product = product.loc[product['item_id']==item_id] # membersihkan data penjualan 0 sale = [x for x in product['clean_sale']] date = [x for x in product['time']] data = [(x, y) for x, y in zip(date, sale)] clean_sales = pd.DataFrame(data, columns=['time','sales']) clean_sales.replace(0, np.nan, inplace=True) clean_sales['time'] = pd.to_datetime(clean_sales['time']) clean_sales = clean_sales.set_index(['time']) # melakukan imputasi terhadap data penjualan if((np.array(clean_sales['sales'])[0])>0): clean_sales['clean'] = clean_sales['sales'].interpolate(method='time').apply(lambda x: round(x)) else: clean_sales['sales'][0]=0 clean_sales['clean'] = clean_sales['sales'].interpolate(method='time').apply(lambda x: round(x)) return clean_sales def split_sequence(sequence, n_steps): X, y = list(), list() for i in range(len(sequence)): end_ix = i + n_steps if end_ix > len(sequence)-1: break seq_x, seq_y = sequence[i:end_ix], sequence[end_ix] X.append(seq_x) y.append(seq_y) return np.array(X), np.array(y) def forecast(len_data, e, item_id): p = [x for x in get_data(item_id)['clean']] n_steps = 4 raw_seq = np.array(p)[0:len_data+n_steps] actual = np.array(p)[len_data+n_steps] X, y = split_sequence(raw_seq, n_steps) n_features = 1 X = X.reshape((X.shape[0], X.shape[1], n_features)) model = Sequential() model.add(Bidirectional(LSTM(50, activation='relu'), input_shape=(n_steps, n_features))) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse') model.fit(X, y, epochs=e, verbose=0) x_input = raw_seq[len_data:] x_input = x_input.reshape((1, n_steps, n_features)) yhat = model.predict(x_input, verbose=0) return [actual, yhat[0][0]] result = [] fn = ['train_size', 'n_steps', 'actual', 'forecast']
es = [100] its = np.load('kelasx.npy')[1:] for k in its: for i in es: for j in range(4, 118): start_time = time.time() temp = np.array(forecast(j, i, k)) #forecast data training hari ke 0 sampai hari ke j, dengan n_step sebanyak i if(j>=118): p.append(temp[1]) print(k,j) result.append(temp) with open("forecast.txt", "a") as file_object: file_object.write(str(k)+';'+str(i)+';'+str(temp[0])+';'+str(temp[1])+';'+str(time.time()-start_time)+'\n') else: result.append(temp) print(k,j) with open("forecast.txt", "a") as file_object: file_object.write(str(k)+';'+str(i)+';'+str(temp[0])+';'+str(temp[1])+';'+str(time.time()-start_time)+'\n')

## Lampiran 2 Tabel data penjualan di Apotek Suganda (telah dibersihkan)
Date 39 40 41 961 962 963 964 965 966 1261 1262 6/1/2019 1 23 5 0 2 25 35 0 0 0 2 6/2/2019 0 16 8 0 3 26 32 0 0 0 3 6/3/2019 2 25 10 0 2 25 28 0 0 0 2 6/4/2019 0 22 5 1 3 16 40 0 1 0 1 6/5/2019 1 19 5 1 2 18 25 0 0 0 2 6/6/2019 0 20 6 1 1 18 27 0 0 0 0 6/7/2019 1 20 9 0 3 25 35 0 0 0 0 6/8/2019 0 22 7 3 2 18 30 0 0 1 3 6/9/2019 0 27 4 1 1 24 40 0 0 0 4 6/10/2019 1 21 4 3 4 24 47 0 0 1 0 6/11/2019 0 26 5 2 3 17 23 0 1 0 2 6/12/2019 0 25 9 0 2 22 38 0 0 1 2 6/13/2019 2 16 5 0 2 45 0 0 0 1 2 6/14/2019 2 18 5 1 2 20 0 0 0 0 3 6/15/2019 0 0 4 0 2 13 35 1 0 0 2 6/16/2019 0 0 4 0 2 31 19 0 0 0 4 6/17/2019 0 0 3 2 3 23 31 0 0 0 4 6/18/2019 1 0 2 2 3 24 45 0 0 0 2 6/19/2019 0 0 0 2 3 22 36 0 0 0 1 6/20/2019 0 26 0 2 2 23 43 0 0 1 4 6/21/2019 0 23 0 3 2 21 44 0 0 2 1 6/22/2019 2 21 0 4 2 0 37 0 0 3 1 6/23/2019 1 21 0 2 2 0 40 0 0 0 4 6/24/2019 0 19 5 0 3 21 40 0 1 0 1 6/25/2019 0 18 9 0 3 19 25 1 0 0 2 6/26/2019 0 25 4 0 3 16 36 0 0 1 2 6/27/2019 0 29 7 0 3 14 22 1 0 0 2 6/28/2019 2 21 7 0 3 20 29 0 0 1 1 6/29/2019 2 26 11 1 3 22 33 0 0 0 3 6/30/2019 2 19 5 0 3 24 36 0 0 0 0 7/1/2019 0 20 6 2 3 26 40 1 0 1 0 7/2/2019 1 24 8 1 2 22 22 0 0 1 0 7/3/2019 1 21 3 0 3 17 37 0 0 1 0 7/4/2019 0 21 8 0 3 13 33 0 0 0 1 7/5/2019 0 20 4 1 3 28 38 0 0 0 3 7/6/2019 0 28 4 0 3 16 35 0 0 1 3 7/7/2019 0 18 1 3 1 20 28 0 0 0 2 7/8/2019 1 20 4 1 2 19 31 0 0 0 1 7/9/2019 0 29 4 0 2 21 29 0 0 0 2 7/10/2019 0 28 5 1 3 28 36 0 0 0 3 7/11/2019 1 23 2 2 2 25 49 0 0 1 1 7/12/2019 0 0 13 0 3
16 40 0 0 0 3 7/13/2019 1 0 6 1 2 28 36 0 0 1 2 7/14/2019 1 0 0 1 2 18 37 0 0 0 3 7/15/2019 1 0 6 2 3 23 38 0 0 1 2 7/16/2019 1 20 1 2 3 18 32 0 0 1 0 7/17/2019 1 26 2 1 3 33 33 0 1 1 3 7/18/2019 2 21 7 1 2 14 32 0 0 1 1 7/19/2019 2 18 3 4 2 24 23 1 0 0 2 7/20/2019 2 20 4 1 4
22
0 0 0 0 1 7/21/2019 1 20 7 0 3
19
0 0 0 0 4 7/22/2019 1 22 4 1 2 32 0 0 0 1 3 7/23/2019 0 18 5 0 2 29 0 0 1 0 1
Date 39 40 41 961 962 963 964 965 966 1261 1262 7/24/2019 1 24 8 0 3 23 0 0 0 0 2 7/25/2019 0 29 9 1 2 21 0 0 0 1 3 7/26/2019 1 14 4 1 2 25 0 0 0 0 2 7/27/2019 0 12 5 1 3 23 0 0 0 0 1 7/28/2019 2 25 5 1 2 28 0 0 0 0 2 7/29/2019 0 20 5 0 1 24 37 1 0 2 2 7/30/2019 1 25 6 0 2 18 35 0 1 0 7 7/31/2019 0 17 0 0 3 19 43 0 0 0 0 8/1/2019 1 21 2 0 3 27 27 1 0 0 1 8/2/2019 1 23 7 0 2 21 43 0 2 0 2 8/3/2019 0 17 6 0 3 24 29 0 0 1 3 8/4/2019 0 23 8 0 4 29 29 0 0 0 3 8/5/2019 2 26 4 3 2 26 37 0 0 1 2 8/6/2019 0 17 6 0 2 19 40 0 0 1 1 8/7/2019 0 21 3 2 3 19 41 0 0 1 0 8/8/2019 0 15 7 0 2 29 28 0 0 0 2 8/9/2019 1 22 3 2 3 28 24 0 0 2 1 8/10/2019 1 25 8 2 2 20 30 1 0 0 4 8/11/2019 1 26 5 1 2 12 35 0 0 0 0 8/12/2019 1 20 10 2 2 14 30 0 0 0 3 8/13/2019 3 35 4 3 2 31 30
0 0 0 1 8/14/2019 0 32 8 1 3 20 39
0 0 0 2 8/15/2019 3 19 3 2 3 21 41
0 0 0 2 8/16/2019 0 22 9 2 3 24 32
0 0 0 3 8/17/2019 2 21 4 2 2 25 32
0 0 0 1 8/18/2019 1 18 6 3 2 16 46
0 1 0 1 8/19/2019 2 17 4 1 3 25 37
0 0 1 2 8/20/2019 0 33 9 0 2 25 31
0 0 0 2 8/21/2019 1 18 5 2 1 17 36
0 0 1 3 8/22/2019 1 14 2 2 2 20 40
0 0 0 0 8/23/2019 1 18 0 0 2 0 33
1 0 0 3 8/24/2019 1 20 0 0 2 0 26
0 0 1 2 8/25/2019 0 17 0 0 2 0 38
1 0 2 0 8/26/2019 0 21 0 0 2 0 30
0 0 1 4 8/27/2019 0 28 0 0 3 0 29
0 0 1 1 8/28/2019 3 24 11 2 2 0 30
0 0 0 1 8/29/2019 0 26 2 1 2 0 30 0 0 0 3 8/30/2019 0 18 1 1 2 0 27 0 0 0 1 8/31/2019 1 22 5 0 2 0 40 0 0 1 0 9/1/2019 0 29 4 0 2 0
33 0 0 0 4 9/2/2019 0 29 7 0 2 21
37 0 0 1 2 9/3/2019 1 20 3 4 1 15
30 0 0 0 0 9/4/2019 0 16 10 0 2 19 39 0 0 0 0 9/5/2019 0 17 4 3 1 23
51 0 0 0 0 9/6/2019 0 20 5 0 2 23
28 0 0 0 0 9/7/2019 0 31 4 0 2 23
39 0 0 1 0 9/8/2019 0 27 7 0 2 18
37 0 0 0 0 9/9/2019 0 23 6 0 2 17 45 0 0 0 3 9/10/2019 0 30 7 1 2 21 31 0 0 0 1 9/11/2019 0 16 7 0 2 17 37 0 0 0 1 9/12/2019 3 17 7 0 3 25 27 0 0 1 3 9/13/2019 1 15 7 2 2 19 37 0 0 2 2 9/14/2019 1 0 3 1 2 25 33 0 0 1 1 9/15/2019 1 0 0 2 2 17 42 0 1 0 5 9/16/2019 0 0 0 0 2 20 42 0 0 0 2 9/17/2019 2 0 0 0 2 23 25 0 0 0 1 9/18/2019 0 0 0 2 3 25 32 0 0 0 0 9/19/2019 0 14 0 0 2 15 40 0 0 0 5 9/20/2019 0 23 0 2 2 18 38 0 0 1 4 9/21/2019 2 19 6 2 2 23 39 0 0 1 0 9/22/2019 1 21 9 1 3 17 30 1 0 1 2 9/23/2019 0 27 7 2 2 21
37 0 0 0 0 9/24/2019 0 23 6 1 3 24 37
0 0 0 1 9/25/2019 0 23 7 2 1 20 34
0 0 0 2 9/26/2019 0 19 7 1 0 24 32
0 0 0 4 9/27/2019 0 27 6 2 0 23 32 2 0 0 2 9/28/2019 1 26 5 1 0 26 41 0 0 0 3 9/29/2019 0 20 4 1 0 16
43
0 0 0 5 9/30/2019 0 19 8 2 0 22 35 0 0 0 0 10/1/2019 1 14 8 0 0 0 33 0 0 3
1