Blue Spinning Frozen Snowflake Vidi Fitriansyah Hidarlan's Blog: Mei 2020
WELCOME TO MY BLOG :: Share Tips & Trik Tutorial Gadget dan Tugas Kuliah :: "Indahnya Berbagi"

Rabu, 27 Mei 2020

Prediksi Kasus Penyebaran COVID-19 Menggunakan Sigmoid Logistic Function dengan Python

        Assalamu'alaikum Wr. Wb. Pada postingan ini saya akan membagikan cara memprediksi penyebaran kasus COVID-19 di Indonesia menggunakan Logistic Sigmoid Function dengan Bahasa Pemrograman Python pada Google Colab. Metode ini dilakukan dengan cara memetakan (fitting) kurva jumlah kasus penyebaran ke dalam fungsi logistik sigmoid sehingga dapat diperoleh hasil prediksi dari kurva sigmoid yang parameternya dimasukkan ke persamaan Logistic Function. Persamaan yang digunakan dalam perhitungan dengan metode tersebut yaitu:
Bentuk kurva dari fungsi sigmoid dapat dilihat pada gambar di bawah.
Fungsi Sigmoid
        Namun pada postingan ini tidak akan dijelaskan secara rinci bagaimana cara perhitungannya. Jika Anda ingin mengetahuinya dapat mengunjungi link berikut.
        Sedangkan untuk persamaan dan parameter yang digunakan sebagai pemodelan pada program ini dapat dilihat pada link berikut.
  1. Unduh dataset penyebaran COVID-19 per hari (format *.csv) di Indonesia di sini:
  2. Buka file-nya pada Ms. Excel kemudian hapus baris kedua kemudian Save untuk mempermudah dalam pemrograman sehingga tidak perlu dihapus pada DataFrame-nya.
  3. Setelah disimpan, upload dataset tersebut ke Github. Jika tidak memiliki akun Github Anda dapat menyimpan dataset tersebut pada direktori penyimpanan sementara yang disediakan oleh Google Colab. Caranya cukup mudah dan hanya mengubah sedikit kode seperti pada gambar berikut.
  4. Selanjutnya buka Google Colab dan masukkan sourcecode untuk import library yang dibutuhkan di bawah ini.
    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. import plotly.express as px
    5. from scipy.optimize import curve_fit
    6. from datetime import datetime, timedelta
  5. Untuk mengambil dataset yang telah di-upload ke Github, tambahkan kode berikut.
    1. !apt-get install subversion > /dev/null

    2. !svn export https://github.com/Vidi005/COVID-19-Prediction-Indonesia/trunk/datasets > /dev/null
  6. Selanjutnya ubah nama header tabel dan tampilkan tabelnya untuk mempermudah dalam pengecekan.
    1. data=pd.read_csv("datasets/Daily-Update IDN-COVID19 - Sheet5.csv")
    2. data=data.rename(columns={"Date": "Tanggal",                                                     
    3.                           "New_case_per_day": "Terkonfirmasi",
    4.                           "Death_cases_perDay": "Meninggal",
    5.                           "Recovered-cases_perDay": "Sembuh",
    6.                           "Treatment_cases_perDay": "Aktif",
    7.                           "Recovered_cases": "Jumlah Sembuh",
    8.                           "Total_death": "Jumlah Meninggal",
    9.                           "Patient_under_treatment": "Jumlah Aktif",
    10.                           "Cumulative_cases": "Jumlah Kasus"})
    11. data.head(-1)
  7. Tampilkan juga visualisasi data kasus per harinya dalam bentuk grafik garis agar mudah dilihat perkembangannya.
    1. fig = plt.figure(figsize=(7, 4))
    2. fig.set_figheight(10)
    3. fig.set_figwidth(15)

    4. plt.subplot(2, 2, 1)
    5. plt.plot(data.aggregate("Terkonfirmasi",axis=0), marker="o", color="orange")
    6. plt.xlabel("Hari ke-n")
    7. plt.ylabel("Terinfeksi")
    8. plt.title("Terkonfirmasi per-hari", size=15)
    9. plt.grid(zorder = 0)

    10. plt.subplot(2, 2, 2)
    11. plt.plot(data.aggregate("Meninggal",axis=0), marker="o", color="black")
    12. plt.xlabel("Hari ke-n")
    13. plt.ylabel("Meninggal")
    14. plt.title("Kematian per-hari", size=15)
    15. plt.grid(zorder = 0)

    16. plt.subplot(2, 2, 3)
    17. plt.plot(data.aggregate("Sembuh",axis=0), marker='o')
    18. plt.xlabel("Hari ke-n")
    19. plt.ylabel("Pasien Sembuh")
    20. plt.title("Sembuh per-hari", size=15)
    21. plt.grid(zorder = 0)

    22. plt.subplot(2, 2, 4)
    23. plt.plot(data.aggregate("Aktif",axis=0), marker='o', color="purple")
    24. plt.xlabel("Hari ke-n")
    25. plt.ylabel("Pasien Aktif")
    26. plt.title("Dalam Pengobatan per-hari", size=15)
    27. plt.grid(zorder = 0)
    28. plt.show()
  8. Hasil output-nya akan seperti ini.
  9. Tampilkan juga grafik perkembangan dari jumlah kasusnya.
    1. fig = plt.figure(figsize = (10, 7))
    2. fig.set_figheight(10)
    3. fig.set_figwidth(15)

    4. plt.subplot(2, 2, 1)
    5. plt.plot(data.aggregate("Jumlah Kasus",axis=0), marker="o", color="red")
    6. plt.xlabel("Hari ke-n")
    7. plt.ylabel("Jumlah Pasien")
    8. plt.title("Total Terkonfirmasi", size=15)
    9. plt.grid(zorder = 0)

    10. plt.subplot(2, 2, 2)
    11. plt.plot(data.aggregate("Jumlah Meninggal",axis=0), marker="o", color="chocolate")
    12. plt.xlabel("Hari ke-n")
    13. plt.ylabel("Jumlah Pasien")
    14. plt.title("Total Kematian", size=15)
    15. plt.grid(zorder = 0)

    16. plt.subplot(2, 2, 3)
    17. plt.plot(data.aggregate("Jumlah Sembuh",axis=0), marker="o", color="lime")
    18. plt.xlabel("Hari ke-n")
    19. plt.ylabel("Jumlah Pasien")
    20. plt.title("Total Sembuh", size=15)
    21. plt.grid(zorder = 0)

    22. plt.subplot(2, 2, 4)
    23. plt.plot(data.aggregate("Jumlah Aktif",axis=0), marker="o", color="pink")
    24. plt.xlabel("Hari ke-n")
    25. plt.ylabel("Jumlah Pasien")
    26. plt.title("Total Aktif", size=15)
    27. plt.grid(zorder = 0)
    28. plt.show()
  10. Setelah program dijalankan output-nya akan seperti ini.
  11. Kemudian buat fungsi kurva fungsi logistik untuk memetakan grafik penyebaran jumlah kasusnya pada fungsi sigmoid.
    1. def plot_predict(case, future_days):
    2.     def avg_err(pcov):
    3.         return np.round(np.sqrt(np.diag(pcov)).mean(), 2)

    4.     # function to be minimized
    5.     def f_sigmoid(x, a, b, c):
    6.         # a = sigmoid midpoint
    7.         # b = curve steepness (logistic growth)
    8.         # c = max value
    9.         return (c / (1 + np.exp(-b*(x-a))))

    10.     inception = 0    
    11.     graph = data.groupby("Tanggal")[["Jumlah Kasus", "Jumlah Meninggal", "Jumlah Sembuh"]].sum().reset_index()[inception:]
    12.     y = graph[case]
    13.     x = np.arange(len(y))

    14.     # fitting the data on the logistic function
    15.     popt_sig, pcov_sig = curve_fit(f_sigmoid, x, y, method="dogbox", bounds=([12., 0.001, y.mean()],[120., 2.5, 10*y.max()]))
    16.     print(popt_sig)
    17.     peakday = datetime.strftime(datetime.strptime(graph["Tanggal"][inception], "%Y-%m-%d")+timedelta(days=int(popt_sig[0])), "%Y-%m-%d")
    18.     plt.figure(figsize=(14,7))

    19.     x_m = np.arange(len(y)+future_days)
    20.     y_m = f_sigmoid(x_m, *popt_sig)

    21.     print("Prediksi:")
    22.     for i in range(1,90):
    23.         pday = datetime.strftime(datetime.strptime(graph["Tanggal"][inception], "%Y-%m-%d")+timedelta(days=len(y)+i-1), "%Y-%m-%d")
    24.         print("%s: %d" % (pday, y_m[len(y)+i-1]))    
    25.         plt.plot(x[-1]+i, y_m[len(y)+i-1], marker="o", c="g")        
    26.     plt.plot(x, y, c="g", marker="o", label="Prediksi")    

    27.     # creating the matplotlib visualization
    28.     plt.plot(x_m, y_m, c="gray", marker="x", label="Sigmoid | error: "+str(avg_err(pcov_sig))) 
    29.     plt.text(x_m[-1]+.5, y_m[-1], str(int(y_m[-1])), size = 10)
    30.     
    31.     plt.plot(x, y, c="r", marker="o", label = case)
    32.     plt.xlabel("Hari ke- ")
    33.     plt.ylabel("Jumlah Terinfeksi")
    34.     plt.legend(prop={"size": 15})
    35.     plt.title("Prediksi Penyebaran COVID-19 Indonesia", size=15)
    36.     plt.axvline(x[-1])
    37.     plt.text(x[-1]-.5, y_m[-1], str(graph["Tanggal"][len(y)+inception-1]), size = 10)
    38.     plt.axvline(int(popt_sig[0]))
    39.     plt.text(int(popt_sig[0]), 1, "Puncak: Hari ke - " + str(int(popt_sig[0])) + " (" + peakday + ")", size = 10)   
    40.     plt.grid(zorder = 0) 
    41.     plt.show()
  12. Setelah itu tambahkan kode berikut untuk menampilkan hasil prediksinya.
    1. plot_predict("Jumlah Kasus", 90)
  13. Output-nya akan seperti ini.

    Dapat dilihat dari hasil prediksi tersebut bahwa terdapat error yang cukup besar, hal itu disebabkan masih fluktuatifnya kurva dari jumlah kasus terkonfirmasi per harinya sehingga masih sulit untuk diprediksi. Hasil prediksi dengan metode ini akan semakin akurat jika kurva perkembangan kasusnya sudah mulai menurun dan tidak terjadi lagi peningkatan jumlah kasus per harinya. Sehingga perlunya pembaruan dataset kembali jika kurvanya masih fluktuatif. Untuk puncak kasus tersebut merupakan nilai tengah dari hari ke-n.
    Program tersebut diatur untuk memprediksi sampai 90 hari ke depan, Anda dapat mengubahnya sesuai keinginan dengan syarat prediksi jumlah kasus tidak boleh melebihi kurva fungsi sigmoid yang ditentukan.

    Angka 120 pada fungsi tersebut yang ditandai digunakan untuk panjang rentang kurva sigmoid.

    Sedangkan angka 90 digunakan untuk menampilkan hasil prediksi selama 90 hari. Hasil prediksi pertama diperoleh lebih rendah dari kasus sebelumnya dikarenakan adanya error pada sigmoid sebesar 505,88. Hal itu disebabkan hasil prediksi hanya mengikuti bentuk dari kurva sigmoid yang di-fit-kan ke dalam kurva penyebaran kasusnya.
  14. Buat fungsi baru pada baris kode baru untuk menampilkan hasil per harinya.
    1. def plot_predict(case, future_days):
    2.     def avg_err(pcov):
    3.         return np.round(np.sqrt(np.diag(pcov)).mean(), 2)

    4.     # function to be minimized
    5.     def f_sigmoid(x, a, b, c):
    6.         # a = sigmoid midpoint
    7.         # b = curve steepness (logistic growth)
    8.         # c = max value
    9.         return (c / (1 + np.exp(-b*(x-a))))

    10.     day = 0    
    11.     graph_day = data.groupby("Tanggal")[["Jumlah Kasus", "Meninggal", "Sembuh"]].sum().reset_index()[day:]    
    12.     y = graph_day[case]
    13.     x = np.arange(len(y))

    14.     popt_sig, pcov_sig = curve_fit(f_sigmoid, x, y, method="dogbox", bounds=([12., 0.001, y.mean()],[120., 2.5, 10*y.max()]))
    15.     print(popt_sig)    
    16.     peakday = datetime.strftime(datetime.strptime(graph_day["Tanggal"][day], "%Y-%m-%d")+timedelta(days=int(popt_sig[0])), "%Y-%m-%d")
    17.     plt.figure(figsize=(14,7))

    18.     x_m = np.arange(len(y)+future_days)
    19.     y_m = f_sigmoid(x_m, *popt_sig)
    20.     
    21.     for i in range(1,90):
    22.         pday = datetime.strftime(datetime.strptime(graph_day["Tanggal"][day], "%Y-%m-%d")+timedelta(days=len(y)+i-1), "%Y-%m-%d")          
    23.         plt.plot(x[-1]+i, (y_m[len(y)+i])-(y_m[len(y)+i-1]), marker="o", c="g")
    24.     
    25.     #plt.plot(x_m, (y_m-y_m[i-1]), c="gray", marker="x")
    26.     plt.plot(data.aggregate("Terkonfirmasi",axis=0), marker="o", color="orange", label="Kasus per hari")            
    27.     plt.axvline(x[-1])
    28.     plt.text(x[-1]-.5, y_m[0], str(graph_day["Tanggal"][len(y)+day-1]), size = 10)
    29.     plt.axvline(int(popt_sig[0]))
    30.     plt.text(int(popt_sig[0]), 1, "Puncak: Hari ke - " + str(int(popt_sig[0])) + " (" + peakday + ")", size = 10)
    31.     plt.xlabel("Hari ke-n")
    32.     plt.ylabel("Terinfeksi")
    33.     plt.title("Prediksi Penyebaran per-hari", size=15)
    34.     plt.plot(x[-1]+i, (y_m[len(y)+i])-(y_m[len(y)+i-1]), c="g", marker="o", label="Prediksi")
    35.     plt.legend(prop={"size": 15})
    36.     plt.grid(zorder=0)
    37.     plt.show
  15. Terakhir, tampilkan hasil prediksinya.
    1. plot_predict("Jumlah Kasus", 90)
  16. Hasilnya seperti di bawah ini.
        Dari hasil prediksi tersebut belum tentu dipastikan kebenarannya karena adanya kemungkinan parameter yang digunakan oleh negara lain tidak sesuai dengan kondisi penyebaran kasus COVID-19 di Indonesia. Prediksi kasus penyebaran virus dengan metode tersebut mungkin dapat digunakan sebagai edukasi saja bagaimana cara memprediksinya secara matematis dan menerapkannya pada bahasa pemrograman PythonSelamat mencoba.

Program yang sudah jadi dapat dilihat di sini.

Catatan:
Dataset yang digunakan pada postingan ini menggunakan dataset telah yang diperbaharui pada 28 Mei 2020. Untuk memperbarui dataset-nya dapat dilakukan kembali langkah 1-3 dan jalankan kembali programnya.

Jumat, 22 Mei 2020

Memindahkan Data obb Game Android ke SD Card dengan Taichi & Modul XInternalSD Tanpa Root

        Assalamu'alaikum Wr. Wb. pada kesempatan kali ini saya akan memberikan tutorial bagaimana cara memindahkan data obb pada suatu aplikasi/game Android ke penyimpanan eksternal/SD card menggunakan aplikasi Taichi dan XInternalSD tanpa perlu melakukan rooting pada perangkat kalian. Postingan ini saya buat karena banyak yang mengeluh tidak dapat memasang aplikasi yang berukuran sangat besar datanya pada memori internal karena pada perangkat Android saat ini sudah tidak bisa memasang dan menyimpan data aplikasinya pada SD Card secara default.
        Pada postingan ini saya akan memindahkan data obb dari game GTA SA ke SD Card. Sebelum mengikut langkah-langkah pastikan kalian telah :
  • Memasang aplikasi Taichi dan XInternalSD, aplikasinya dapat di-download di sini.
  • Memiliki aplikasi/game beserta data obb-nya yang sudah di-download/di-install.
  • Memiliki ruang kosong yang cukup pada SD Card.
Okee, setelah semuanya terpenuhi mari ikuti langkah-langkahnya:
  1. Buka aplikasi TaiChi yang sudah dipasang sebelumnya.
  2. Klik ikon gambar 4 panah, kemudian pilih "Manage Modules".
  3. Selanjutnya beri centang pada Modul "XInternalSD" yang dipasang.
  4. Kemudian kembali ke halaman awal TaiChi kemudian pilih "Create App".
  5. Setelah itu pilih aplikasi/game yang ingin dipindahkan datanya ke SD Card. Jika tidak ada maka dapat memasang file ".apk"nya dengan klik ikon (+).
  6. Selanjutnya cari lokasi file *.apk yang ingin dipasang kemudian pilih.
  7. Tunggu sampai prosesnya selesai. Lamanya proses tergantung pada ukuran aplikasi dan tergantung kecepatan prosesor dari smartphone.
  8. Kemudian akan terbuka secara otomatis lalu pasang aplikasinya.
  9. Buka App XInternalSD dan atur lokasi memori eksternalnya. Nama SD Card dapat berbeda di setiap perangkat Android.
  10. Selanjutnya klik menu "Enable for apps" seperti pada gambar.
  11. Pilih dan tandai aplikasi/game-nya kemudian klik OK.
  12. Langkah terakhir adalah memindahkan data obb dari aplikasi/game tersebut ke dalam direktori SD Card/Android/obb/(di sini).
  13. Selamat mencoba.
Jika masih bingung bisa dilihat caranya pada video di bawah ini.

Kamis, 21 Mei 2020

Simulasi Lampu Lalu Lintas pada PLC Omron dengan HMI

        Assalamualaikum Wr. Wb. di postingan kali ini saya akan membagikan tutorial membuat simulasi program lalu lintas pada PLC Omron beserta HMI-nya. PLC (Programmable Logic Controller) merupakan piranti elektronik yang digunakan sebagai pengontrol peralatan input untuk mengubah kondisi output sesuai dengan keinginan programmer. Pada PLC Omron kita dapat memprogramnya menggunakan Ladder Diagram. Pembuatan Ladder Diagram pada PLC OMRON ini menggunakan software CX-Programmer sedangkan untuk membuat HMI-nya menggunakan CX-Designer.
        Simulasi Lampu Lalu Lintas yang dibuat yaitu menggunakan sistem 4 simpang 2 jalur dan adanya tombol stop untuk mengubah kondisi lampu hijau atau kuning menjadi merah kembali agar mempermudah dan mempercepat pejalan kaki untuk menyebrang. Berikut langkah-langkah pembuatannya.
  1. Buka aplikasi CX-Designer kemudian klik ikon "New" atau tekan Ctrl+N.
  2. Pada jendela "Change PLC" ubah pengaturannya seperti pada gambar berikut.
  3. Sebelum membuat ladder diagram lampu lalu lintas tersebut kita perlu tahu bagaimana cara membuat beberapa simbol dan instruksi yang terkait pada project tersebut. Pertama membuat kontak relai NO (Normally Open) dengan alamat inputnya sebagai berikut.

  4. Untuk membuat relai kontak NC (Normally Close) klik gambar ikon "New Closed Contact".
  5. Kemudian klik "New Coil" untuk membuat relai output-nya.
  6. Kemudian hubungkan antara contact dan coil-nya dengan garis vertical, horizontal, atau "Line Connect Mode" seperti pada gambar di bawah.
  7. Selanjutnya klik "New PLC Instruction" untuk membuat sebuah instruksi PLC.
  8. Setelah itu klik pada bagian output dan ketik perintah "TIM" untuk membuat timer countdown tipe BCD, kemudian masukkan alamat timer-nya (0000 untuk T0000) dan masukkan nilainya yang selalu diawali dengan tanda pagar # (160 menandakan 16 detik).

  9. Untuk membuat instruksi Date Comparison ikuti langkah-langkahnya seperti pada gambar di bawah. Perintah ">=DT" digunakan untuk membandingkan nilai waktu lebih besar sama dengan dari waktu RTC (Real Time Clock) pada PLC. #38 merupakan nilai Hex untuk date. A351 merupakan lokasi memori tanggal dan waktu. D0 merupakan memori yang digunakan untuk menyimpan waktu yang dibandingkan (di sini lebih besar dari pukul 23.00).


  10. Kemudian untuk menyimpan nilai waktunya lakukan caranya seperti berikut.
  11. Selanjutinya terdapat juga instruksi "SET" dan "RESET". Instruksi SET digunakan untuk menyimpan nilai 1 bit agar nilai keluarannya selalu aktif. Sedangkan instruksi RSET digunakan untuk me-reset kembali nilai 1 bit yang tersimpan menjadi 0 atau digunakan untuk mematikan output SET.

  12. Setelah mengetahui cara membuat contact relay, coil, dan beberapa instruksi dengan ladder diagram maka kita akan membuat ladder diagram untuk simulasi lampu lalu lintasnya seperti pada gambar-gambar berikut.





  13. Sesudah semua ladder diagram-nya dibuat maka kita dapat melakukan simulasinya untuk mengetahui apakah ladder diagram yang dibuat sudah berjalan sesuai yang dinginkan dengan cara klik "Work Online Simulator".
  14. Saat simulasi sedang dilakukan kita juga dapat mengisi nilai waktu yang diinginkan yaitu 23 pada alamat memori D0 dan 5 pada alamat D10 dengan cara seperti ini.


  15. Selanjutnya kembali ke ladder diagram dan aktifkan tombol "PB. Start" untuk menjalankan program lampu lalu lintasnya seperti pada gambar.

  16. Untuk mengecek apakah instruksi RTC untuk date comparison sudah berjalan dengan benar kita dapat mengubah waktunya pada PLC clock. Pada program ini data comparison digunakan untuk mengaktifkan hanya lampu warna kuning yang berkedip pada pukul 23.00 sampai 05.00. Jika aktif maka coil akan berwarna hijau.


  17. Selanjutnya untuk simulasi pada tombol penyeberangan dilakukan cara yang sama pada tombol start, jika sudah diberi input 1 maka selanjutnya langsung diberi input 0 untuk menguji apakah instruksi SET dapat menyimpan nilai yang diberikan.


  18. Selesai untuk pembuatan ladder dan simulasi pada CX-Programmer. Selanjutnya membuat HMI (Human Machine Interface) pada CX-Designer.
  19. Buka aplikasi CX-Designer kemudian klik "New Project".
  20. Pada jendela "New Project" pilih model, versi sistem, isi nama project sesuai keinginan, dan atur lokasi penyimpanannya kemudian klik OK.
  21. Setelah itu lakukan cara berikut untuk mengubah warna latar belakangnya.

  22. Buat obyek persegi dengan cara klik "Rectangle" kemudian drag pada sheet. Kita juga dapat memodifikasikannya dengan klik ganda pada obyek tersebut.

  23. Klik ikon PB untuk membuat push button start dan stop seperti berikut.





  24. Buat juga tombol push button stop dengan cara yang sama.
  25. Kemudian buat sebuah clock display untuk memonitor waktu pada PLC.

  26. Buat lampu lalu lintasnya dengan menggunakan "Bit Lamp" seperti berikut.


  27. Buat juga untuk lampu lalu lintas lainnya dengan hanya mengganti warna dan alamat yang berbeda sesuai dengan output pada CX-Programmer.
  28. Setelah itu bua juga tombol STOP untuk pada setiap lampu lalu lintasnya.


  29. Berikut alamat dan label tombol stop-nya pada setiap jalur 2,3, dan 4 yang dibuat.
  30. Anda juga dapat membuat label yang terpisah dari obyeknya untuk memberi keterangan pada setiap obyek yang sudah dibuat dengan klik ikon "LABEL".
  31. Jika semuanya sudah dibuat maka tahap yang terakhir melakukan pengujian pada HMI yang telah dibuat dengan klik menu "Tools" → "Test".
  32. Pada jendela pop up "Test" ubah pengaturannya seperti pada gambar di bawah ini.
  33. Selamat anda sudah berhasil membuat simulasi lampu lalu lintas dengan CX-Programmer dan CX-Designer. Pada postingan ini hanya mensimulasikan lampu lalu lintas 4 simpang dengan 2 jalur yang masing-masing lampu hijau menyala selama 16 detik, lampu kuning 4 detik, dan lampu merah 20 detik yang merupakan jumlah dari lampu hijau dan kuning serta dilengkapi tombol stop pada masing-masing jalurnya untuk menyalakan lampu merah selama 6 detik. Anda dapat memodifikasinya sendiri seperti 4 simpang dengan 4 jalur, dll.
File ladder diagram dan HMI-nya dapat diunduh di sini.
Video simulasinya dapat dilihat di bawah ini.

Atas