Sunday, December 16, 2018

Mencari Perbedaan Citra Dengan OpenCV dan Python (Structural Similarity Index Measurement)

Tulisan berikut akan membahas bagaimana membedakan dua gambar yang hampir identik. Sebagai contoh terdapat uang kertas Rp.50.000,- seperti tampak di bawah ini:
Gambar 1. Uang Asli Rp. 50.000,-
Gambar 2. Uang Asli Rp. 50.000,- Dengan Perubahan

Dari dua gambar di atas terdapat 3 perbedaan, ayo coba cari! mungkin Anda membutuhkan waktu sebentar untuk mengetahuinya atau mungkin lama....

Mencari perbedaan gambar diperlukan untuk menentukan apakah suatu gambar itu asli atau tidak. Dengan ketrampilan seorang editor gambar yang semakin halus dan menawan dalam mengedit gambar tentu akan menyulitkan bagi kita untuk membedakan gambar asli dan gambar yang telah diedit dnegan photoshop.

Kita akan memanfaatkan teknik pengolahan citra digital dengan OpenCV dan Python untuk mendeteksi perbedaan dari dua gambar tersebut. So...lanjut....

Projek ini saya terapkan pada environment Google Colab, sedangkan data gambar dan lain-lain saya ambil dan letakkan di Google Drive Saya. Editor yang digunakan adalah Jupiter Notebook versi Colab. Semuanya dikerjakan secara remote.

Adapun keuntungan dari Google Colab banyak, antara lain:
  • Bisa mendapatkan GPU dengan performa tinggi.
  • Pre instal library dan program pendukung yang lengkap.
  • Anda bisa menginstal library baru ke colab dengan cara cloning (pip command), 
  • Penggunaannya gratis dan praktis, apalagi jika Anda memiliki google drive yang berafiliasi dengan pendidikan, space yang diperoleh unlimited.

Bagaimana teknik instalasinya google colab? silahkan kunjungi http://doditsuprianto.blogspot.com/2018/05/memnafaatkan-google-colabs-dan-google.html.

Baik sekarang dibahas potongan-potongan programnya:

# impor library yang diperlukan
from matplotlib import pyplot as plt
from skimage.measure import compare_ssim
import imutils
import cv2

# Load citra dari google drive
# Path sesuaikan dengan punya Anda
imageA = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_asli.jpg')
imageB = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_palsu.jpg')

# Konvert citra asli menjadi keabuan
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

Potongan kode program pertama, kita meng-impor library yang dibutuhkan, antara lain matplotlib, scikit, imutils dan opencv. Selanjutnya kita loading citra/gambar dari google drive yang terdiri dari dua gambar yaitu "uang50rb_asli.jpg" dan "uang50rb_palsu.jpg". Untuk alamat path silahkan sesuaikan dengan kondisi environment masing-masing. Selanjutnya dari citra yang di-load diubah menjadi citra grayscale atau keabuan untuk mengurangi kedalaman warna dan mempercepat komputasi.

# Hitung Structural Similarity Index (SSIM) antara dua citra
# pastikan bahwa perbeddan citra dikembalikan nilainya
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {} Rentang nilai -1 s/d 1 (nilai mendekati 1 berarti antar citra hampir sempurna sama)".format(score))

Potongan kode program kedua, adalah untuk menghitung perbedaan antar dua citra dengan menggunakan metode SSIM atau Structural Similarity Index Measurement.

Penggunaan fungsi compare_ssim dari scikit-image untuk menghitung score dan perbedaan citra diff.

score mewakili structural similirity index antara dua input citra. Nilai ini mempunyai rentang [-1, 1] dimana nilai satu mengindikasikan bahwa dua citra tersebut "hampir sama sempurna".

diff citra berisi perbedaan citra sesungguhnya antara dua citra input yang akan divisualisasikan. Perbedaan citra saat ini diwakili  sebgai data bertipe floating point dengan rentang [0, 1] sehingga harus dikonversikan menjadi array 8-bit unsigned integer dengan rentang [0, 255] sebelum  diproses lebih lanjut dengan OpenCV.

# threshold perbedaan citra, diikuti dengan pencarian kontur
# memperoleh area yang berbeda dari dua input citra
thresh = cv2.threshold(diff, 0, 255,
 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

Potongan kode program ketiga, kita melakukan threshold terhadap citra diff menggunakan cv2.THRESH_BINARY_INV dan cv2.THRESH_OTSU, kedua metode threshold tersebut diaplikasikan diwaktu yang sama dengan menggunakan simbol "OR" atau "|". Penjelasan detil pengaturan bimodal thresholding silahkan dibaca di OpenCV documentation.

Kemudian kita menemukan kontur dari thresh yang dinyatakan pada baris pernyataan cnts = imutils.grab_contours(cnts).

Gambar di bawah ini dengan jelas mengungkapkan ROI (Region of Interest) dari gambar yang telah dimanipulasi:
Sekarang kita memiliki kontur yang disimpan dalam daftar, mari gambar persegi panjang di sekitar wilayah yang berbeda pada setiap gambar, perhatiakan potongan kode program keempat berikut:

# perulangan pada kontur
for c in cnts:
 # menghitung batas kotak dari kontur dan menggambar
 # batas kotak pada citra input untuk mewakili dua citra yang berbeda
 (x, y, w, h) = cv2.boundingRect(c)
 cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
 cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

# tampilkan citra
plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageA, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- ASLI')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageB, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(diff)
plt.title('Perbedaan')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(thresh)
plt.title('Threshold')
plt.show()

Kita melakukan perulangan kontur, cnts. Pertama, kita menghitung batas kotak di sekitar kontur menggunakan fungsi cv2.boundingRect. Kita menyimpan koordinat (x,y) yang relevan sebagai x dan y sekaligus lebar dan tinggi  kotak sebagai w dan h. Kemudian kita menggunakan nilai tersebut untuk menggambar kotak warna merah pada setiap citra dengan fungsi cv2.rectangle. Terakhir, kita menampilkan perbandingan citra dengan ditandai kotak untuk bagian yang berbeda.

Berikut ini kode program secara utuh:

# impor library yang diperlukan
from matplotlib import pyplot as plt
from skimage.measure import compare_ssim
import imutils
import cv2

# Load citra dari google drive
# Path sesuaikan dengan punya Anda
imageA = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_asli.jpg')
imageB = cv2.imread('drive/Deep_Learning_Latihan/Perbedaan_Gambar/uang50rb_palsu.jpg')

# Konvert citra asli menjadi keabuan
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

plt.xticks([]), plt.yticks([])
plt.imshow(grayA)
plt.title('Uang Kertas Rp. 50.000,- ASLI - Grayscale')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(grayB)
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN - Grayscale')
plt.show()

# Hitung Structural Similarity Index (SSIM) antara dua citra
# pastikan bahwa perbeddan citra dikembalikan nilainya
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM: {} Rentang nilai -1 s/d 1 (nilai mendekati 1 berarti antar citra hampir sempurna sama)".format(score))

# threshold perbedaan citra, diikuti dengan pencarian kontur
# memperoleh area yang berbeda dari dua input citra
thresh = cv2.threshold(diff, 0, 255,
 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

# perulangan pada kontur
for c in cnts:

 # menghitung batas kotak dari kontur dan menggambar
 # batas kotak pada citra input untuk mewakili dua citra yang berbeda
 (x, y, w, h) = cv2.boundingRect(c)
 cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
 cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)

# tampilkan citra
plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageA, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- ASLI')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(cv2.cvtColor(imageB, cv2.COLOR_BGR2RGB))
plt.title('Uang Kertas Rp. 50.000,- PERUBAHAN')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(diff)
plt.title('Perbedaan')
plt.show()

plt.xticks([]), plt.yticks([])
plt.imshow(thresh)
plt.title('Threshold')
plt.show()

Hasilnya sebagai berikut:

Kode program dapat di download di https://drive.google.com/open?id=1z_7OtBNUCrNJ35CkSvTZ9EavZQ5Dd1Gl dan https://colab.research.google.com/drive/1LkQBUd3ETB5OSsW9hQ-1hWM9GJ4AyBx1

Ilustrasi Google Colab:







-----------------  SEMOGA BERMANFAAT -----------------

Sunday, December 2, 2018

Project Management Life Cycle Model


1. Project Definition (Pendefinisian Proyek)
Mendefinisikan tujuan proyek dan faktor-faktor yang harus dipertimbangkan agar proyek yang dilaksanakan tersebut berhasil dengan kualitas yang diinginkan.

2. Project Initiation (Inisialisasi Proyek)
Perencanaan awal terhadap sumber daya yang akan digunakan sebelum suatu proyek dimulai.

3. Project Planning (Perencanaan Proyek)
Menguraikan dengan jelas bagaimana sebuah proyek harus dijalankan. Pada project planning ini, akan terlihat dengan jelas pentingnya segitiga manajemen proyek yaitu waktu, biaya, dan ruang lingkup suatu proyek.

4. Project Execution (Pelaksanaan Proyek)
Melakukan pekerjaan agar proyek yang dimaksud tersebut berhasil sesuai dengan keinginan.

5. Project Monitoring & Control (Pemantauan dan Pengendalian Proyek)
Pengambilan langkah-langkah yang diperlukan sehingga pengoperasian proyek berjalan dengan lancar.

6. Project Closure (Penutupan Proyek)
Menerima hasil akhir dari proyek dan menghentikan semua penggunaan sumber daya. 


1. Project Initiation
Dalam tahapan ini, Unit Bisnis atau Departemen dalam suatu organisasi mulai mengusulkan dan mengajukan proyek mereka yang berhubungan dengan penggunaan SI/TI kepada Divisi/ Departemen TI. Pengajuan proyek dilakukan secara resmi dengan mengisi dokumen yang telah ditentukan standarnya. Dokumen ini dikenal dengan istilah Business Case Document (BCD) atau Business Requirement Document (BRD). Dalam dokumen tersebut dijelaskan goal, objektif, ruang lingkup, risiko, dan alternatif opsi yang akan digunakan. BCD seharusnya dibuat dan dikerjakan oleh Unit Bisnis atau Departemen yang mengajukannya. Tetapi dalam praktiknya, ini lebih sering dilakukan oleh Project Management Officer (PMO) maupun Tim di Divisi/Departemen TI untuk mempercepat proses pengajuannya. Akibatnya, pengguna tidak terlalu mengerti apa yang mereka ajukan sehingga mereka juga tidak mengetahui apa yang menjadi kebutuhan dasar mereka. Hal ini tentu akan mempersulit dalam menentukan kriteria keberhasilan proyek. Padahal, selain sebagai bukti otentik pengajuan suatu proyek, fungsi lain dari pembuatan BCD ini adalah untuk meningkatkan rasa kepemilikan dan komitmen antara Divisi/Departemen TI dengan pengguna atau pemilik proyek dalam menjalankan proyeknya hingga selesai.Ketika BCD diserahkan kepada Divisi/Departemen TI, biasanya disertai dengan Job Request Form (JRF) yang menandakan bahwa usulan proyek dari unit bisnis/departemen lainnya sudah diserahkan ke Divisi/Departemen TI. JRF berisikan data yang mengajukan proyek serta nama dan deskripsi singkat proyek. Selanjutnya, Tim TI akan melakukan analisis terhadap pengajuan usulan tersebut berkenaan dengan ketersediaan resource di internal mereka seperti jumlah SDM yang tersedia, kemampuan SDM, kebutuhan perangkat keras, kebutuhan perangkat lunak(apakah memutuskan menggunakan software COTS atau membangun sendiri), dll.Penentuan project sponsor, project controller, dan project manager dapat dilakukan pada tahap ini. Project sponsor adalah orang yang mendanai dan mendukung proyek ini secara penuh. Biasanya yang bertindak sebagai project sponsor adalah Presiden Direktur/Direktur Utama/Direktur dari unit bisnis atau divisi terkait. Project controller adalah orang yang akan melakukan kontrol dan pengawasan terhadap jalannya proyek. Biasanya yang bertindak sebagai Project Controller adalah General Manager/Deputy General Manager/Kepala Divisi. Sedangkan project manager adalah orang yang ditunjuk untuk mengelola jalannya proyek. Project manager tidak harus seorang manajer, siapa pun bisa menjadi Project Manager.

2. Project Planning
Dalam tahapan ini, perencanaan dilakukan dengan membuat Tim inti proyek terlebih dahulu. Setelah itu membuat Work Breakdown Structure (WBS) berupa susunan pekerjaan-pekerjaan yang akan dilakukan dalam menyelesaikan proyek yang disajikan secara detail tanpa memperhatikan urutan pekerjaan. Setelah membuat WBS, Tim Proyek dapat membuat jadwal pekerjaan dalam bentuk Gantt Chart atau timeline, pemetaan SDM, dan perencanaan bujet. Kesemuanya itu dituangkan ke dalam dokumen project charter.Sebelum mengisi dokumen project charter, sejumlah pertemuan disusun untuk menyamakan persepsi dan mengetahui kebutuhan-kebutuhan bisnis secarai detail. Setiap pertemuan harus menghasilkan Minutes Of Meeting (MOM) yang mana merupakan rangkuman terhadap hasil pertemuan. MOM ini juga menjadi landasan dalam pengisian dokumen project charter. Jika membutuhkan bantuan pihak ketiga dalam pengerjaan ini baik untuk kebutuhan software maupun tenaga pengembang software, maka mekanisme tender juga dilakukan pada tahapan ini.Untuk memulai sebuah proyek, biasanya ditandai dengan Kick-off meeting. Pada saat kick-off meeting, project sponsor, dan project controller seharusnya hadir sebagai bentuk dukungan dan memotivasi tim dalam bekerja. Termasuk pihak ketiga yang dilibatkan dalam proyek. Dokumen project charter harus sudah selesai sebelum melakukan kick-off meeting karena pada saat pertemuan tersebut dokumen project charter harus disetujui. Dokumen project charter merupakan panduan dalam mengerjakan proyek. MOM Kick-off meeting juga dilampirkan bersama dokumen project charter.

3. Project Execution
Dalam tahapan ini, eksekusi dilakukan oleh Tim TI yang membangun dan mengembangkan aplikasi/sistem informasi dengan konsep SDLC.

a. Planning, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan perencanaan meliputi analisis kebutuhan bisnis untuk memastikan bahwa Tim Pengembang maupun Analis Sistem sudah mengerti terhadap permintaan dalam dokumen project charter. Selain itu, penentuan penggunaan bahasa pemrograman, database, ketersediaan server, dan tools lainnya juga mulai disiapkan dalam tahapan ini. Jika kebutuhan perangkat belum tersedia, maka perlu dilakukan pengadaan barang untuk pemenuhan kebutuhan tersebut. Karena proses pengadaan barang membutuhkan waktu yang tidak sedikit.

b. Analysis, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan analisis meliputi analisis dampak terhadap bisnis, mengidentifikasi potensial risiko yang mungkin ada, celah keamanan data, dan konsep High Availability (HA) jika diperlukan.

c. Design, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan desain meliputi perancangan database, pembuatan Entity Relationship Diagram (ERD), pembuatan pseudocode, pembuatan Data Flow Diagram (DFD), pembuatan Use Case Diagram, pembuatan Activity Diagram (AD), HIPO diagram, desain theme, desain form, dll. Setelah proses desain selesai, Software Architecture Document (SAD) juga harus selesai dibuat. Pembuatan SAD dapat dicicil pada tahapan Analisis pada SDLC.

d. Implementation, dalam proses eksekusi pengembangan sistem yang termasuk kegiatan implementasi meliputi pembuatan code, pengujian, deploy, dan Go-Live. Pada tahapan implementasi, Test Scenario Document (TSD), Manual Guidance, dan Technical Document harus ada.
Dalam proses eksekusi ini akan menghasilkan aplikasi/sistem informasi yang diinginkan.





Berikut overview Software Kanbanchi, Trello dan Bitrix24




Saturday, September 22, 2018

TCS3200 Color Sensor Fritzing Library




If you need the TCS3200 color sensor module fritzing library, here I provide the TCS3200 library file (TCS3200.fzpz). The quality is not good because it is still learning to draw it, but enough to represent the real object.

You can download it here https://drive.google.com/open?id=1NPp0c0kTrIbQndZ8QuabhfLsY-8_B7W6

Tuesday, June 12, 2018

Visualisasi Matplotlib - Visualizing Errors

Untuk setiap pengukuran ilmiah, perhitungan akurat untuk kesalahan hampir sama pentingnya, jika tidak lebih penting, daripada pelaporan akurat dari angka itu sendiri. Sebagai contoh, bayangkan bahwa saya menggunakan beberapa pengamatan astrofisika untuk memperkirakan Konstan Hubble, pengukuran lokal tingkat ekspansi alam semesta. Saya tahu bahwa literatur saat ini menunjukkan nilai sekitar 71 (km / s) / Mpc, dan saya mengukur nilai 74 (km / s) / Mpc dengan metode saya. Apakah nilai-nilai itu konsisten? Satu-satunya jawaban yang benar, mengingat informasi ini, adalah ini: tidak ada cara untuk mengetahuinya.

Misalkan saya menambah informasi ini dengan ketidakpastian yang dilaporkan: literatur saat ini menunjukkan nilai sekitar 71 ± 2,5 (km / s) / Mpc, dan metode saya telah mengukur nilai 74 ± 5 (km / s) / Mpc. Sekarang, apakah nilai-nilainya konsisten? Itu adalah pertanyaan yang dapat dijawab secara kuantitatif.

Dalam visualisasi data dan hasil, menunjukkan kesalahan ini secara efektif dapat membuat plot menyampaikan informasi yang jauh lebih lengkap.

Untuk kode program silahkan dosenload di sini https://drive.google.com/open?id=1QCmzedWE03OHi0-NOXGNTfNv7Zzbqe3H

Basic Errorbars
Errorbars dasar dapat dibuat dengan satu panggilan fungsi Matplotlib:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

x = np.linspace(0, 10, 50)
dy = 0.8
y = np.sin(x) + dy * np.random.randn(50)

plt.errorbar(x, y, yerr=dy, fmt='.k');
Di sini, fmt adalah kode format yang mengontrol tampilan garis dan titik, dan memiliki sintaksis yang sama dengan singkatan yang digunakan dalam plt.plot, yang diuraikan dalam Line Plots dan Scatter Plots.

Selain opsi dasar ini, fungsi errorbar memiliki banyak opsi untuk menyempurnakan output. Menggunakan opsi tambahan ini Anda dapat dengan mudah menyesuaikan estetika plot kesalahan Anda. Saya sering merasa berguna, terutama dalam plot yang padat, untuk membuat errorbar lebih terang daripada titiknya:

plt.errorbar(x, y, yerr=dy, fmt='o', color='black',
             ecolor='lightgray', elinewidth=3, capsize=0);
Selain opsi ini, Anda juga dapat menentukan horizontal errorbars (xerr), one-side errorbars, dan banyak varian lainnya. Untuk informasi lebih lanjut tentang opsi yang tersedia, lihat doctring plt.errorbar.

Continuous Errors
Dalam beberapa situasi, diinginkan untuk menunjukkan errorbars pada kuantitas terus menerus. Meskipun Matplotlib tidak memiliki rutinitas bawaan yang terintegrasi untuk aplikasi jenis ini, namun relatif mudah untuk menggabungkan cara primitif seperti plt.plot dan plt.fill_between untuk hasil yang bermanfaat.

Di sini kita akan melakukan regresi proses Gaussian sederhana, menggunakan API Scikit-Learn. Ini adalah metode pemasangan fungsi non-parametrik yang sangat fleksibel untuk data dengan ukuran ketidakpastian yang terus menerus. Kami tidak akan menyelidiki rincian regresi proses Gaussian pada titik ini, tetapi akan berfokus pada bagaimana Anda dapat memvisualisasikan pengukuran kesalahan kontinu seperti itu:



lanjut lain waktu ....

Monday, June 11, 2018

Visualisasi Matplotlib - Plot Scatter Sederhana

Tipe plot lain yang biasa digunakan adalah plot scatter/sebar sederhana, sepupu dekat dari plot line/garis. Alih-alih titik yang digabung dengan segmen garis, di sini titik diwakili secara individual dengan titik, lingkaran, atau bentuk lainnya.

Untuk script Python materi plot scatter dapat di download di https://drive.google.com/open?id=1pZ3-RGGUMSKHkeI5A1ErlFlA4ERTbdDS

Kami akan mulai dengan menyiapkan notebook untuk merencanakan dan mengimpor fungsi yang akan kami gunakan:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

Plot Scatter Dengan plt.plot
Di bagian sebelumnya, kami melihat plt.plot / ax.plot untuk membuat plot garis. Ternyata fungsi yang sama ini bisa menghasilkan plot scatter juga:

x = np.linspace(0, 10, 30)
y = np.sin(x)

plt.plot(x, y, 'o', color='black');
Argumen ketiga dalam pemanggilan fungsi adalah karakter yang mewakili jenis simbol yang digunakan untuk plotting. Anda juga dapat menentukan opsi seperti '-', '--' untuk mengontrol model garis, model penanda memiliki kumpulan kode string singkatnya sendiri. Daftar lengkap simbol yang tersedia dapat dilihat dalam dokumentasi plt.plot, atau dalam dokumentasi online Matplotlib. Sebagian besar kemungkinannya cukup intuitif, dan kami akan menampilkan sejumlah yang lebih umum di sini:

rng = np.random.RandomState(0)
for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']:
    plt.plot(rng.rand(5), rng.rand(5), marker,
             label="marker='{0}'".format(marker))
plt.legend(numpoints=1)
plt.xlim(0, 1.8);
Untuk lebih banyak kemungkinan, kode-kode karakter ini dapat digunakan bersama dengan kode garis dan warna untuk memplot titik-titik bersama dengan garis yang menghubungkannya:

plt.plot(x, y, '-ok');
Argumen kata kunci tambahan untuk plt.plot menentukan berbagai properti garis dan marker:

plt.plot(x, y, '-p', color='gray',
         markersize=15, linewidth=4,
         markerfacecolor='white',
         markeredgecolor='gray',
         markeredgewidth=2)
plt.ylim(-1.2, 1.2);
Fleksibilitas jenis ini dalam fungsi plt.plot memungkinkan berbagai kemungkinan opsi visualisasi. Untuk keterangan lengkap tentang opsi yang tersedia, lihat dokumentasi plt.plot.

Plot Scatter Dengan plt.scatter
Metode kedua yang lebih powerful untuk membuat plot scatter adalah fungsi plt.scatter, yang penggunaannya sangat mirip dengan fungsi plt.plot:

plt.scatter(x, y, marker='o');
Perbedaan utama plt.scatter dari plt.plot adalah ia dapat digunakan untuk membuat plot scatter di mana property setiap titik individual (ukuran, warna wajah, warna tepi, dll.) Dapat dikontrol secara individual atau dipetakan ke data.

Mari kita tunjukkan ini dengan membuat plot scatter acak dengan banyak warna dan ukuran. Untuk lebih baik melihat hasil yang tumpang tindih, kami juga akan menggunakan kata kunci alpha untuk menyesuaikan tingkat transparansi:

rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)

plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,
            cmap='viridis')
plt.colorbar();  # show color scale
Perhatikan bahwa argumen warna secara otomatis dipetakan ke skala warna (diperlihatkan di sini oleh perintah colorbar()), dan bahwa argumen ukuran diberikan dalam piksel. Dengan cara ini, warna dan ukuran poin dapat digunakan untuk menyampaikan informasi dalam visualisasi, untuk memvisualisasikan data multidimensi.

Sebagai contoh, kita dapat menggunakan data Iris dari Scikit-Learn, di mana setiap sampel adalah salah satu dari tiga jenis bunga yang memiliki ukuran kelopak dan sepal yang diukur dengan hati-hati:

from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data.T

plt.scatter(features[0], features[1], alpha=0.2,
            s=100*features[3], c=iris.target, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1]);
Kita dapat melihat bahwa plot pencar ini telah memberi kita kemampuan untuk secara simultan mengeksplorasi empat dimensi data yang berbeda: lokasi (x, y) dari setiap titik sesuai dengan panjang dan lebar sepal, ukuran titik terkait dengan kelopak lebar, dan warnanya terkait dengan spesies bunga tertentu. Multi warna dan plot scatter multi fitur seperti ini dapat berguna baik untuk eksplorasi dan penyajian data.

---*** SEMOGA BERMANFAAT ***---

Sunday, June 10, 2018

Visualisasi Matplotlib - Plot Line Sederhana

Visualisasi grafis pada data scientist sangatlah penting dan jika kita bekerja dengan Python maka sudah dapat dipastikan untuk memvisualisasi data digunakan library Matplotlib. Oleh karena itu kali ini kita akan belajar penggunaan matplotlib tingkat dasar (tenang saya juga pemula....😅).

Untuk coding full menggunakan Jupyter Notebook bisa di download di sini  https://drive.google.com/open?id=1AfmlgAEZbmDodg_08F8X5gVpP5VKFKbA

Plot Garis Sederhana (Simple Plot Lines)
Mungkin yang paling sederhana dari semua plot adalah visualisasi dari satu fungsi y = f (x). Di sini kita membuat plot sederhana dari jenis ini. Kita akan mulai dengan menyiapkan notebook untuk merencanakan dan mengimpor paket yang akan kita gunakan:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

Untuk semua plot Matplotlib, kita mulai dengan membuat figur dan sumbu. Dalam bentuk yang paling sederhana, figur dan sumbu dapat dibuat sebagai berikut:

fig = plt.figure()
ax = plt.axes()
Di Matplotlib, gambar (contoh kelas plt.Figure) dapat dianggap sebagai wadah tunggal yang berisi semua objek yang mewakili sumbu, grafik, teks, dan label. Sumbu (contoh kelas plt.Axes) adalah apa yang kita lihat di atas: kotak pembatas dengan titik dan label, yang pada akhirnya akan berisi elemen plot yang membentuk visualisasi. Sepanjang buku ini, kita umumnya akan menggunakan nama variabel fig untuk merujuk ke contoh gambar, dan ax untuk merujuk ke instance sumbu atau grup instance sumbu.

Setelah kami membuat axes/sumbu, kita dapat menggunakan fungsi ax.plot untuk merencanakan beberapa data. Mari kita mulai dengan sinusoid sederhana:

fig = plt.figure()
ax = plt.axes()

x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x));
Sebagai alternatif, kita dapat menggunakan antarmuka pylab dan membiarkan figur dan sumbu dibuat untuk kita di latar belakang:

plt.plot(x, np.sin(x));

Jika kita ingin membuat gambar tunggal dengan banyak baris, kita cukup memanggil fungsi plot beberapa kali:

plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x));
Demikianlah untuk merencanakan fungsi sederhana di Matplotlib! Kami sekarang akan menyelami beberapa detail lebih lanjut tentang cara mengontrol tampilan sumbu dan garis.

Menyesuaikan Plot: Warna Garis dan Gaya
Penyesuaian pertama yang mungkin ingin Anda lakukan pada plot adalah mengontrol warna dan gaya garis. Fungsi plt.plot() membutuhkan argumen tambahan yang dapat digunakan untuk menentukan ini. Untuk menyesuaikan warna, Anda dapat menggunakan keyword warna, yang menerima argumen string yang mewakili hampir semua warna yang bisa dibayangkan. Warnanya dapat ditentukan dalam berbagai cara:

plt.plot(x, np.sin(x - 0), color='blue')        # specify color by name
plt.plot(x, np.sin(x - 1), color='g')           # short color code (rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75')        # Grayscale between 0 and 1
plt.plot(x, np.sin(x - 3), color='#FFDD44')     # Hex code (RRGGBB from 00 to FF)
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # RGB tuple, values 0 to 1
plt.plot(x, np.sin(x - 5), color='chartreuse'); # all HTML color names supported
Jika tidak ada warna yang ditentukan, Matplotlib akan secara otomatis menggilir satu set warna default untuk beberapa baris.

Demikian pula, gaya garis dapat disesuaikan menggunakan kata kunci linestyle:

plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted');

# For short, you can use the following codes:
plt.plot(x, x + 4, linestyle='-')  # solid
plt.plot(x, x + 5, linestyle='--') # dashed
plt.plot(x, x + 6, linestyle='-.') # dashdot
plt.plot(x, x + 7, linestyle=':');  # dotted
Jika Anda ingin menjadi sangat singkat, linestyle dan kode warna ini dapat digabungkan menjadi satu argumen non-keyword ke fungsi plt.plot():

plt.plot(x, x + 0, '-g')  # solid green
plt.plot(x, x + 1, '--c') # dashed cyan
plt.plot(x, x + 2, '-.k') # dashdot black
plt.plot(x, x + 3, ':r');  # dotted red
Kode warna satu karakter ini mencerminkan singkatan standar dalam sistem warna RGB (Merah / Hijau / Biru) dan CMYK (Cyan / Magenta / Kuning / blacK), umumnya digunakan untuk grafis warna digital.

Ada banyak argumen kata kunci lain yang dapat digunakan untuk menyempurnakan tampilan plot; untuk lebih jelasnya, saya sarankan melihat docstring fungsi plt.plot () menggunakan alat bantu IPython (Lihat Bantuan dan Dokumentasi dalam IPython).

Menyesuaikan Plot: Batas Sumbu
Matplotlib melakukan pekerjaan yang layak untuk memilih batas sumbu default untuk plot Anda, tetapi terkadang bagus untuk memiliki kontrol yang lebih baik. Cara paling dasar untuk menyesuaikan batas sumbu adalah dengan menggunakan metode plt.xlim () dan plt.ylim ():

plt.plot(x, np.sin(x))

plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5);
Jika karena alasan tertentu Anda ingin salah satu poros ditampilkan terbalik, Anda dapat membalik urutan argumen:

plt.plot(x, np.sin(x))

plt.xlim(10, 0)
plt.ylim(1.2, -1.2);
Metode terkait yang bermanfaat adalah plt.axis() (perhatikan di sini potensi kebingungan antara axes dengan e, dan axis dengan i). Metode plt.axis() memungkinkan Anda menetapkan batas x dan y dengan satu panggilan, dengan meneruskan daftar yang menetapkan [xmin, xmax, ymin, ymax]:

plt.plot(x, np.sin(x))
plt.axis([-1, 11, -1.5, 1.5]);
Metode plt.axis () bahkan melampaui hal ini, memungkinkan Anda melakukan hal-hal seperti memperketat batas secara otomatis di sekitar plot saat ini:

plt.plot(x, np.sin(x))
plt.axis('tight');
Hal ini memungkinkan spesifikasi tingkat yang lebih tinggi, seperti memastikan rasio aspek yang sama sehingga pada layar Anda, satu unit dalam x sama dengan satu unit dalam y:

plt.plot(x, np.sin(x))
plt.axis('equal');
Untuk informasi lebih lanjut tentang batas sumbu dan kemampuan lain dari metode plt.axis, lihat plt.axis docstring.

Labeling Plots
Sebagai bagian terakhir dari bagian ini, kita akan secara singkat melihat pelabelan plot: judul, label sumbu, dan legenda sederhana.

Judul dan label sumbu adalah label paling sederhana — ada metode yang dapat digunakan untuk mengaturnya dengan cepat:

plt.plot(x, np.sin(x))
plt.title("A Sine Curve")
plt.xlabel("x")
plt.ylabel("sin(x)");
Posisi, ukuran, dan gaya label ini dapat disesuaikan menggunakan argumen opsional ke fungsi tersebut. Untuk informasi lebih lanjut, lihat dokumentasi Matplotlib dan dokumentasi dari masing-masing fungsi ini.

Ketika beberapa garis ditampilkan dalam satu sumbu, dapat berguna untuk membuat legenda plot yang menandai setiap jenis garis. Sekali lagi, Matplotlib memiliki cara built-in untuk menciptakan legenda dengan cepat. Hal ini dilakukan melalui metode (plt.legend). Meskipun ada beberapa cara yang valid untuk menggunakan ini, saya merasa paling mudah untuk menentukan label setiap baris menggunakan kata kunci label dari fungsi plot:

plt.plot(x, np.sin(x), '-g', label='sin(x)')
plt.plot(x, np.cos(x), ':b', label='cos(x)')
plt.axis('equal')

plt.legend();
Seperti yang Anda lihat, fungsi plt.legend () melacak gaya dan warna garis, dan mencocokkannya dengan label yang benar. Informasi lebih lanjut tentang menentukan dan memformat legenda plot dapat ditemukan di plt.legend docstring; Selain itu, kami akan membahas beberapa opsi legenda lanjutan dalam Menyesuaikan Legenda Plot.

---*** SEMOGA BERMANFAAT ***---