<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ines Halida Hanum Sumbri on Medium]]></title>
        <description><![CDATA[Stories by Ines Halida Hanum Sumbri on Medium]]></description>
        <link>https://medium.com/@hanumsumbri?source=rss-bc2cd97e7950------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*qx7aVw3YZ-adJgUA</url>
            <title>Stories by Ines Halida Hanum Sumbri on Medium</title>
            <link>https://medium.com/@hanumsumbri?source=rss-bc2cd97e7950------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 28 Jun 2026 11:02:31 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@hanumsumbri/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Predicting Amazon Stock Prices: A Machine Learning Approach with Python]]></title>
            <link>https://medium.com/@hanumsumbri/predicting-amazon-stock-prices-a-machine-learning-approach-with-python-13fa3a40b30?source=rss-bc2cd97e7950------2</link>
            <guid isPermaLink="false">https://medium.com/p/13fa3a40b30</guid>
            <category><![CDATA[amazon]]></category>
            <category><![CDATA[predictions]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[stocks]]></category>
            <dc:creator><![CDATA[Ines Halida Hanum Sumbri]]></dc:creator>
            <pubDate>Sun, 30 Jul 2023 09:57:14 GMT</pubDate>
            <atom:updated>2023-07-30T10:08:41.927Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oxyb39dlNAX5QQR95Z0ZwQ.jpeg" /><figcaption>Pengertian Amazon.com Beserta Fungsi dan Kelebihan Amazon.com. <a href="https://www.nesabamedia.com/pengertian-amazon-com/">Source</a></figcaption></figure><p>Dalam dunia pasar keuangan yang dinamis, prediksi harga saham menjadi salah satu hal yang menarik perhatian banyak pihak. Dalam artikel ini, kita akan menjelajahi penerapan teknologi Machine Learning dengan Python untuk memprediksi harga saham Amazon, salah satu perusahaan terbesar dan paling berpengaruh di dunia.</p><p>Amazon, didirikan oleh Jeff Bezos pada tahun 1994, telah tumbuh menjadi salah satu perusahaan e-commerce terbesar di dunia. Dikenal sebagai “Everything Store” (Toko Segala Sesuatu), Amazon menawarkan berbagai produk dan layanan, termasuk e-commerce, cloud computing, media digital, dan kecerdasan buatan. Amazon telah merevolusi cara orang berbelanja dan berbisnis, mengubah lanskap pasar secara drastis.</p><p>Mengingat pentingnya harga saham Amazon bagi para investor, melakukan prediksi harga saham menjadi tantangan yang menarik dan berpotensi menguntungkan. Di sinilah Machine Learning, cabang kecerdasan buatan yang fokus pada pembuatan model dari data, dapat memberikan kontribusi besar. Dengan memanfaatkan algoritma Machine Learning dan Python sebagai bahasa pemrograman yang andal, kita dapat membangun model prediksi harga saham Amazon yang akurat dan berdaya guna.</p><p>Dalam artikel ini, kita akan belajar tentang dasar-dasar Machine Learning dan Python yang diperlukan untuk memahami dan menerapkan model prediksi harga saham. Selain itu, akan diuraikan langkah-langkah praktis dalam mengumpulkan data historis harga saham Amazon, mempersiapkan data untuk pelatihan model, dan mengimplementasikan beberapa teknik Machine Learning yang populer. Semoga artikel ini dapat memberikan wawasan yang berharga dan membantu Anda memahami bagaimana Machine Learning dapat digunakan untuk meramalkan harga saham Amazon dengan lebih percaya diri. Selamat membaca!</p><h4><strong>Importing Libraries</strong></h4><p>Berikut merupakan <em>library </em>yang digunakan</p><ul><li><strong>Pandas</strong> — Library ini membantu memuat bingkai data dalam format susunan 2D dan memiliki beberapa fungsi untuk melakukan tugas analisis sekaligus.</li><li><strong>Numpy </strong>— Array Numpy sangat cepat dan dapat melakukan komputasi besar dalam waktu yang sangat singkat.</li><li><strong>Matplotlib/Seaborn </strong>— Library ini digunakan untuk menggambar visualisasi.</li><li><strong>Sklearn </strong>— Modul ini berisi beberapa library yang memiliki fungsi yang telah diimplementasikan sebelumnya untuk melakukan tugas-tugas mulai dari prapemrosesan data hingga pengembangan dan evaluasi model.</li><li><strong>XGBoost</strong> — Modul ini berisi algoritma pembelajaran mesin eXtreme Gradient Boosting yang merupakan salah satu algoritma yang membantu kita untuk mencapai akurasi yang tinggi dalam prediksi.</li></ul><pre>import numpy as np<br>import pandas as pd<br>import matplotlib.pyplot as plt<br>import seaborn as sb<br> <br>from sklearn.model_selection import train_test_split<br>from sklearn.preprocessing import StandardScaler<br>from sklearn.linear_model import LogisticRegression<br>from sklearn.svm import SVC<br>from xgboost import XGBClassifier<br>from sklearn import metrics<br> <br>import warnings<br>warnings.filterwarnings(&#39;ignore&#39;)</pre><h4><strong>Importing Dataset</strong></h4><p>Dataset yang akan kami gunakan di sini untuk melakukan analisis dan membangun model prediktif adalah data Harga Saham Amazon. Kami akan menggunakan data OHLC (‘Open’, ‘High’, ‘Low’, ‘Close’) dari tanggal 15 Mei 1997 hingga 27 Oktober 2021 selama 24 tahun untuk saham Amazon.</p><p>Anda dapat mengunduhnya pada laman <a href="https://www.kaggle.com/datasets/kannan1314/amazon-stock-price-all-time">berikut.</a> (Anda harus mengganti “-” pada tanggal dengan “/”).</p><p>Pertama, kita lakukan <em>mounting </em>terlebih dahulu sebagai berikut.</p><pre>from google.colab import drive<br>drive.mount(&#39;/content/drive&#39;)</pre><p>Setelah itu, akan dilakukan inputasi data sebagai berikut.</p><pre>df = pd.read_csv(&#39;/content/drive/MyDrive/SEMESTER 6/MPML/Amazon.csv&#39;, sep=&quot;;&quot;)<br>df.head()</pre><p>Akan menghasilkan <em>output</em> sebagai berikut:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/554/1*1V3JWymZwLde2TTXkhEczg.png" /></figure><p>Dari lima baris pertama, kita dapat melihat bahwa data untuk beberapa tanggal tidak ada, alasannya adalah karena pada akhir pekan dan hari libur, Pasar Saham tutup sehingga tidak ada perdagangan yang terjadi pada hari-hari tersebut.</p><p>Untuk melihat dimensi data, kita menggunakan sintaks sebagai berikut.</p><pre>df.shape</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/126/1*zTKfr01_RCpO8ASaksGpYA.png" /></figure><p>Dari sini, kami mengetahui bahwa ada 6155 baris data yang tersedia dan untuk setiap baris, kami memiliki 7 fitur atau kolom yang berbeda.</p><p>Untuk melihat statistika deskriptif, dapat menggunakan perintah sebagai berikut.</p><pre>df.describe()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/682/1*UuKjLPxmBaDOAM0vXBMP7Q.png" /></figure><p>Lalu, untuk meliat informasi dari data, dapat menggunakan perintah sebagai berikut.</p><pre>df.info()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/309/1*CkTnnZzD7Rgv1e8uttKPjg.png" /></figure><h4>Exploratory Data Analysis</h4><p>EDA adalah pendekatan untuk menganalisis data dengan menggunakan teknik visual. Ini digunakan untuk menemukan tren, dan pola, atau untuk memeriksa asumsi dengan bantuan ringkasan statistik dan representasi grafis.</p><p>Saat melakukan EDA pada data Harga Saham Amazon, kami akan menganalisis bagaimana harga saham bergerak selama periode waktu tertentu dan bagaimana akhir kuartal memengaruhi harga saham.</p><p>Pertama, kita akan membuat plot mengenai pergerakan dari saham Amazon dari tahun 1997 hingga 2021.</p><pre>plt.figure(figsize=(15,5))<br>plt.plot(df[&#39;Close&#39;])<br>plt.title(&#39;Amazon Close price.&#39;, fontsize=15)<br>plt.ylabel(&#39;Price in dollars.&#39;)<br>plt.show()</pre><p>Output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ie09kabJK5gf01wfRTk1rA.png" /></figure><p>Harga saham Amazon menunjukkan tren kenaikan seperti yang digambarkan oleh plot harga penutupan saham.</p><p>Selanjutnya, akan ditampilkan 5 data teratas dengan menggunakan perintah sebagai berikut.</p><pre>df.head()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/552/1*ohlY_LfxRi3owBZW440_oA.png" /></figure><p>Jika kita amati dengan seksama, kita dapat melihat bahwa data pada kolom ‘Close’ dan yang tersedia pada kolom ‘Adj Close’ adalah sama, mari kita periksa apakah hal ini terjadi pada setiap baris atau tidak.</p><pre>df[df[&#39;Close&#39;] == df[&#39;Adj Close&#39;]].shape</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/125/1*0sz38-Cv5c9Q_6FMXaV-_w.png" /></figure><p>Dari sini kita dapat menyimpulkan bahwa semua baris dari kolom ‘Close’ dan ‘Adj Close’ memiliki data yang sama. Jadi, memiliki data yang berlebihan di dalam kumpulan data tidak akan membantu, jadi kita akan menghapus kolom ini sebelum melakukan analisis lebih lanjut.</p><pre>df = df.drop([&#39;Adj Close&#39;], axis=1)</pre><p>Sekarang mari kita menggambar plot distribusi untuk fitur kontinu yang diberikan dalam kumpulan data.</p><p>Sebelum melangkah lebih jauh, mari kita periksa nilai nol jika ada yang ada di dalam bingkai data.</p><pre>df.isnull().sum()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/113/1*kg_L3PqNTfnWLXCUtuLSYA.png" /></figure><p>Hal ini mengimplikasikan bahwa tidak ada nilai nol dalam kumpulan data yang disediakan.</p><pre>features = [&#39;Open&#39;, &#39;High&#39;, &#39;Low&#39;, &#39;Close&#39;, &#39;Volume&#39;]<br> <br>plt.subplots(figsize=(20,10))<br> <br>for i, col in enumerate(features):<br>  plt.subplot(2,3,i+1)<br>  sb.distplot(df[col])<br>plt.show()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SKgly8-YUxFkjnFLVNqHBg.png" /></figure><p>Pada plot distribusi data OHLC, kita dapat melihat dua puncak yang berarti data telah bervariasi secara signifikan di dua wilayah. Dan data Volume miring ke kiri. Selanjutnya, akan membuat boxplot sebagai berikut.</p><pre>plt.subplots(figsize=(20,10))<br>for i, col in enumerate(features):<br>  plt.subplot(2,3,i+1)<br>  sb.boxplot(df[col])<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vXCSbs9iWzKpy6-GzDSioA.png" /><figcaption>boxplot</figcaption></figure><p>Dari boxplot di atas, kita dapat menyimpulkan bahwa semua data mengandung pencilan di dalamnya.</p><h4>Feature Engineering</h4><p><em>Feature Engineering </em>membantu untuk mendapatkan beberapa fitur berharga dari fitur yang sudah ada. Fitur-fitur tambahan ini terkadang membantu meningkatkan kinerja model secara signifikan dan tentu saja membantu mendapatkan wawasan yang lebih dalam ke dalam data.</p><pre>splitted = df[&#39;Date&#39;].str.split(&#39;/&#39;, expand=True)<br><br>df[&#39;day&#39;] = splitted[1].astype(&#39;int&#39;)<br>df[&#39;month&#39;] = splitted[0].astype(&#39;int&#39;)<br>df[&#39;year&#39;] = splitted[2].astype(&#39;int&#39;)<br><br>df.head()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/598/1*fsqTaLKa4BEsnYNvpmGRlQ.png" /></figure><p>Sekarang kita memiliki tiga kolom lagi yaitu ‘hari’, ‘bulan’ dan ‘tahun’, ketiganya berasal dari kolom ‘Date’ yang pada awalnya disediakan dalam data.</p><pre>df[&#39;is_quarter_end&#39;] = np.where(df[&#39;month&#39;]%3==0,1,0)<br>df.head()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/948/1*bq0WTLJr3bBkju5RWv-pHg.png" /></figure><p>Kuartal didefinisikan sebagai kelompok yang terdiri dari tiga bulan. Setiap perusahaan menyiapkan hasil kuartalannya dan mempublikasikannya kepada publik sehingga orang dapat menganalisis kinerja perusahaan. Hasil kuartalan ini sangat memengaruhi harga saham, itulah sebabnya kami menambahkan fitur ini karena dapat menjadi fitur yang berguna untuk model pembelajaran.</p><pre>data_grouped = df.groupby(&#39;year&#39;).mean()<br>plt.subplots(figsize=(20,10))<br> <br>for i, col in enumerate([&#39;Open&#39;, &#39;High&#39;, &#39;Low&#39;, &#39;Close&#39;]):<br>  plt.subplot(2,2,i+1)<br>  data_grouped[col].plot.bar()<br>plt.show()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f5c7LjDfNQpNrifcMPb43Q.png" /></figure><p>Dari grafik batang di atas, dapat terlihat bahwa saham cenderung mengalami kenaikan di tiap tahunnya.</p><pre>df.groupby(&#39;is_quarter_end&#39;).mean()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UFEfxhWH1102FupaSBQYJQ.png" /></figure><p>Berikut adalah beberapa pengamatan penting dari data yang dikelompokkan di atas:</p><ul><li>Harga lebih tinggi pada bulan-bulan di akhir kuartal dibandingkan dengan bulan-bulan di luar akhir kuartal.</li><li>Volume perdagangan lebih rendah pada bulan-bulan di akhir kuartal.</li></ul><pre>df[&#39;open-close&#39;] = df[&#39;Open&#39;] - df[&#39;Close&#39;]<br>df[&#39;low-high&#39;] = df[&#39;Low&#39;] - df[&#39;High&#39;]<br>df[&#39;target&#39;] = np.where(df[&#39;Close&#39;].shift(-1) &gt; df[&#39;Close&#39;], 1, 0)</pre><p>Di atas kita telah menambahkan beberapa kolom lagi yang akan membantu dalam pelatihan model kita. Kita telah menambahkan fitur target yang merupakan sinyal untuk membeli atau tidak, dan kita akan melatih model kita untuk memprediksi hal ini saja. Namun sebelum melanjutkan, mari kita periksa apakah targetnya seimbang atau tidak menggunakan diagram lingkaran.</p><pre>plt.pie(df[&#39;target&#39;].value_counts().values,<br>        labels=[0, 1], autopct=&#39;%1.1f%%&#39;)<br>plt.show()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/1*F-g6boyHlXKFyBJFcF_guA.png" /></figure><p>Ketika kita menambahkan fitur ke dataset kita, kita harus memastikan bahwa tidak ada fitur yang berkorelasi tinggi karena fitur-fitur tersebut tidak membantu dalam proses pembelajaran algoritme.</p><pre>plt.figure(figsize=(10, 10))<br> <br># As our concern is with the highly<br># correlated features only so, we will visualize<br># our heatmap as per that criteria only.<br>sb.heatmap(df.corr() &gt; 0.9, annot=True, cbar=False)<br>plt.show()</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/907/1*wZ5IaE2oURK-sSQrQfLX0g.png" /></figure><p>Dari <em>heatmap </em>di atas, kita dapat mengatakan bahwa ada korelasi yang tinggi antara OHLC yang cukup jelas, dan fitur-fitur yang ditambahkan tidak terlalu berkorelasi satu sama lain atau dengan fitur-fitur yang telah disediakan sebelumnya, yang berarti bahwa kita siap untuk membangun model kita.</p><h3>Data Splitting and Normalization</h3><pre>features = df[[&#39;open-close&#39;, &#39;low-high&#39;, &#39;is_quarter_end&#39;]]<br>target = df[&#39;target&#39;]<br><br>scaler = StandardScaler()<br>features = scaler.fit_transform(features)<br><br>X_train, X_valid, Y_train, Y_valid = train_test_split(<br> features, target, test_size=0.2, random_state=2022)<br>print(X_train.shape, X_valid.shape)</pre><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/161/1*xKW63XEOk09lVzW1L4tqWA.png" /></figure><p>Setelah memilih fitur yang akan digunakan untuk melatih model, kita harus menormalkan data karena data yang ternormalisasi akan menghasilkan pelatihan model yang stabil dan cepat. Setelah itu, seluruh data dibagi menjadi dua bagian dengan rasio 80/20, sehingga kita dapat mengevaluasi kinerja model kita pada data yang tidak terlihat.</p><h3>Model Development and Evaluation</h3><p>Sekarang adalah waktunya untuk melatih beberapa model pembelajaran mesin yang canggih (Regresi Logistik, <em>Support Vector Machine</em>, XGBClassifier), dan kemudian berdasarkan kinerjanya pada data pelatihan dan validasi, kami akan memilih model ML mana yang melayani tujuan yang lebih baik.</p><p>Untuk metrik evaluasi, kita akan menggunakan kurva ROC-AUC, tetapi mengapa demikian karena alih-alih memprediksi probabilitas keras yang bernilai 0 atau 1, kita ingin memprediksi probabilitas lunak yang bernilai kontinu antara 0 hingga 1. Dan dengan probabilitas lunak, kurva ROC-AUC umumnya digunakan untuk mengukur keakuratan prediksi.</p><pre>models = [LogisticRegression(), SVC(<br>  kernel=&#39;poly&#39;, probability=True), XGBClassifier()]<br> <br>for i in range(3):<br>  models[i].fit(X_train, Y_train)<br> <br>  print(f&#39;{models[i]} : &#39;)<br>  print(&#39;Training Accuracy : &#39;, metrics.roc_auc_score(<br>    Y_train, models[i].predict_proba(X_train)[:,1]))<br>  print(&#39;Validation Accuracy : &#39;, metrics.roc_auc_score(<br>    Y_valid, models[i].predict_proba(X_valid)[:,1]))<br>  print()</pre><p>Untuk melihat hasil dari beberapa model, dapat diganti pada bagian “for i in range(…)”</p><p>1 -&gt; untuk regresi logistik</p><p>2 -&gt; model <em>Support Vector Machine (SVM)</em></p><p>3 -&gt; model XGBClassifier</p><p><em>Output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/341/1*mVWjgeAFv7OFu3vp_WX3bg.png" /><figcaption><em>Evaluation of the model on training and the testing data.</em></figcaption></figure><p>Di antara ketiga model tersebut, XGBClassifier yang kami latih memiliki kinerja tertinggi tetapi dipangkas menjadi overfitting karena perbedaan antara akurasi pelatihan dan validasi terlalu tinggi.</p><h3>Conclusion:</h3><p>Kita dapat mengamati bahwa akurasi yang dicapai oleh model ML yang canggih tidak lebih baik daripada sekadar menebak dengan probabilitas 50%. Alasan yang mungkin untuk hal ini adalah kurangnya data atau menggunakan model yang sangat sederhana untuk melakukan tugas yang kompleks seperti prediksi Pasar Saham.</p><h4>Reference:</h4><ol><li><a href="https://www.geeksforgeeks.org/stock-price-prediction-using-machine-learning-in-python/">https://www.geeksforgeeks.org/stock-price-prediction-using-machine-learning-in-python/</a></li><li><a href="https://www.kaggle.com/datasets/kannan1314/amazon-stock-price-all-time">https://www.kaggle.com/datasets/kannan1314/amazon-stock-price-all-time</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=13fa3a40b30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Simplifying Object Counting with Artificial Intelligence: Efficient and Accurate Tracking of…]]></title>
            <link>https://medium.com/@hanumsumbri/simplifying-object-counting-with-artificial-intelligence-efficient-and-accurate-tracking-of-cd41f3b61136?source=rss-bc2cd97e7950------2</link>
            <guid isPermaLink="false">https://medium.com/p/cd41f3b61136</guid>
            <category><![CDATA[detection]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[objects]]></category>
            <category><![CDATA[counter]]></category>
            <dc:creator><![CDATA[Ines Halida Hanum Sumbri]]></dc:creator>
            <pubDate>Mon, 17 Jul 2023 15:54:00 GMT</pubDate>
            <atom:updated>2023-07-21T18:34:32.444Z</atom:updated>
            <content:encoded><![CDATA[<h3>Simplifying Object Counting with Artificial Intelligence: Efficient and Accurate Tracking of Objects</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*d9dUaTveEnVMWlTVYB0FQg.png" /></figure><p>Menghitung dan melacak jumlah objek dalam suatu gambar atau video dapat menjadi tugas yang memakan waktu dan rumit. Namun, dengan perkembangan kecerdasan buatan, telah muncul solusi yang efisien dan akurat untuk mengatasi tantangan ini. <em>Artificial Intelligence </em>(AI) dalam bentuk <em>Object Counter</em> memberikan kemampuan untuk mengenali dan menghitung objek dalam waktu nyaris instan.</p><p>Dalam kesempatan kali ini, kita akan menjelajahi konsep dan manfaat dari <em>Object Counter</em>, serta melihat bagaimana teknologi ini dapat diterapkan dalam berbagai bidang, mulai dari pemantauan keamanan hingga analisis data. Siap untuk menjelajahi keajaiban<em> Object Counter</em>? Mari kita mulai!</p><p>Anda dapat menggunakan video mengenai suatu objek dengan jelas, jika belum mempunyai, dapat mengunduh pada laman Youtube sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*ZOrLQvoLqz2iEQ6OI9fFAg.png" /></figure><p>Kemudian, unduh video pertama tersebut lalu simpan dengan nama ’highway.mp4’ (disimpan dalam ekstensi mp4) dalam satu folder baru yang anda buat, misal c:/hitungmobil. Lalu, ikuti langkah selanjutnya sebagai berikut.</p><p>Pertama, membuat script untuk mengambil gambar/video yang akan dihitung objeknya.</p><pre>import numpy as np<br>import cv2cap = cv2.VideoCapture(&#39;highway.mp4&#39;)while(cap.isOpened()):<br> ret, frame = cap.read()<br> try :<br>  cv2.imshow(&#39;Frame&#39;,frame)<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> k = cv2.waitKey(30)&amp; 0xff<br> if k == 27:<br>  breakcap.release()<br>cv2.destroyAllWindows()</pre><p>Lalu, salin kode tersebut dan anda dapat menyimpannya pada Notepad atau Notepad++ dengan nama “pertama.py” (disimpan dalam ekstensi .py) dalam folder c:/hitungmobil, sehingga dalam folder tersebut telah ada dua <em>file</em>, yaitu “highway.mp4” dan “pertama.py”</p><p>Untuk menjalankan kode tersebut, bukalah <em>command prompt </em>lalu ketikan perintah sesuai dengan direktori penyimpanan anda sebagai berikut.</p><pre>c:/hitungmobil/python pertama.py</pre><p>Maka, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IB6gCqZHTjTjRtIKwnuFSQ.png" /></figure><p>Dari program tersebut, akan ditangkap gambar per <em>frame </em>dalam tiap detik (<em>frame per second/fps). </em>Untuk mendapatkan fps dari video, menggunakan <em>script </em>berikut.</p><pre>import cv2<br>vidcap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>success,image = vidcap.read()<br>fps = vidcap.get(cv2.CAP_PROP_FPS)<br>totalframes = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)<br>frame2skip = 5  # num of frames to skip when extracting<br>outputframe = int(totalframes / frame2skip)<br>print(&#39;Video FPS rate is {}&#39;.format(fps))<br>print(&#39;You will get {} frames in total&#39;.format(outputframe))<br>while success:<br>    frameId = int(round(vidcap.get(1)))<br>    success, image = vidcap.read()<br>if frameId % frame2skip == 0:<br>        cv2.imwrite(&#39;frame_%d.jpg&#39; % frameId, image)<br>        print(&#39;Export frame {}: &#39;.format(frameId), success)<br>vidcap.release()<br>print (&#39;Extraction completed!&#39;)</pre><p>Simpan kode di atas dengan nama “cobafps.py”. Lalu, jalankan dengan perintah pada <em>command prompt</em> sebagai berikut.</p><pre>c:/hitungmobil/python cobafps.py</pre><p>Maka, dihasilkan ekspor berbenruk gambar sebagai berikut</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NBwusijxsoFkXdCNf-XM2A.png" /></figure><p>Selanjutnya, dapat dipahami bahwa sistem mengubah setiap gambar menjadi matriks angka-angka, yang mewakili setiap pixel dalam gambar. Matriks ini kemudian digunakan oleh sistem untuk analisis lebih lanjut.</p><pre>import cv2, time<br>video=cv2.VideoCapture(&quot;highway.mp4&quot;)<br>a=0<br>while True:<br> a=a+1<br> check, frame = video.read()<br>print(frame)<br>cv2.imshow(&quot;capturing&quot;, frame)<br> key=cv2.waitKey(1)<br> <br> if key == ord(&#39;q&#39;):<br>  break<br>video.release()<br>cv2.destroyAllWindows()</pre><p>Simpanlah dengan nama “matriks.py”, lalu panggil dan jalankan pada <em>command prompt.</em></p><pre>c:/hitungmobil/python matriks.py</pre><p>Maka, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/825/1*uouHOjTZbRTofj9Au8GL5w.png" /></figure><p>Untuk menghentikan koding tersebut, anda dapat mengeklik “CTRL+C” pada <em>command prompt</em>. Di samping itu, tiap gambar diwakili oleh warna dasar RGB (Red Green Blue) yang bernilai 0–255. Untuk melihatnya, dapat menggunakan <em>script </em>sebagai berikut.</p><pre>import cv2<br>import numpy as np<br> <br>def split_to_RGB(mirror=False): #mirror digunakan untuk camera laptop<br> <br>    cap = cv2.VideoCapture(&quot;highway.mp4&quot;)<br>    cv2.namedWindow(&#39;Split RGB&#39;,cv2.WINDOW_NORMAL)<br>    zeros = None<br>    while True:<br>        ret, frame = cap.read()<br> <br>        if ret == True:<br>          <br>            height, width, layers = frame.shape<br>            matrix0 = np.zeros((height, width), dtype=&quot;uint8&quot;)<br> <br>          <br>            (B, G, R) = cv2.split(frame)<br> <br>          <br>            B = cv2.merge([B, matrix0, matrix0])<br>            G = cv2.merge([matrix0, G, matrix0])<br>            R = cv2.merge([matrix0, matrix0, R])<br>          <br>            final = np.zeros((height * 2, width * 2, 3), dtype=&quot;uint8&quot;)<br> <br>            final[0:height, 0:width] = frame <br>            final[0:height, width:width * 2] = B <br>            final[height:height * 2, 0:width] = G  <br>            final[height:height * 2, width:width * 2] = R  <br> <br>            cv2.imshow(&#39;Split RGB&#39;, final)<br>        else:<br>            break<br> <br>        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):  <br>            break<br>    cap.release()<br>    cv2.destroyAllWindows()<br> <br>def main():<br>    split_to_RGB(mirror=True)<br> <br>if __name__ == &#39;__main__&#39;:<br>    main()</pre><p>Simpan <em>script </em>tersebut dengan nama “splitRGB.py” masih dalam folder c:/hitungmobil. Lalu, jalankan perintah pada <em>command prompt </em>sebagai berikut.</p><pre>c:/hitungmobil/python splitRGB.py</pre><p>Maka, akan terlihat hasilnya sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/671/1*xQQ4W8QdWzxH9_7M_4U7WQ.png" /></figure><p>Selanjutnya, akan dibuat garis pembatas. Pembuatan garis ini menggunakan <em>script </em>yang sama seperti “pertama.py”, namun akan disipkan beberapa koding sebagai berikut.</p><pre>import numpy as np<br>import cv2<br>cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>while(cap.isOpened()):<br> ret, frame = cap.read()<br> try :<br>  cv2.imshow(&#39;Frame&#39;,frame)<br>  frame2 = frame<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> <br> line1 = np.array([[200,400],[700,400],[1000,400]],np.int32).reshape((-1,1,2))<br> line2 = np.array([[50,500],[1200,500]],np.int32).reshape((-1,1,2))<br> frame2 = cv2.polylines(frame2,[line1],False,(255,0,0),thickness=2)<br> frame2 = cv2.polylines(frame2,[line2],False,(0,0,255),thickness=2)<br> cv2.imshow(&#39;Frame 2&#39;,frame2)<br> <br> k = cv2.waitKey(30)&amp; 0xff<br> if k == 27:<br>  break<br>cap.release()<br>cv2.destroyAllWindows()</pre><p>Lalu, panggil lagi menggunakan <em>command prompt</em>.</p><pre>c:/hitungmobil/python pertama.py</pre><p>Dihasilkan gambar sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JdUNfBFbY8G7iR2xYtHPOw.png" /></figure><p>Dapat terlihat dua garis berwarna merah dan biru.</p><p>Metode <em>background substractor </em>digunakan dalam menghitung onjek yang ada di video dengan menggunakan script sebagai berikut.</p><pre>import numpy as np<br>import cv2cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)while(cap.isOpened()):<br> ret, frame = cap.read()<br> fgmask = fgbg.apply(frame)<br> try :<br>  cv2.imshow(&#39;Frame&#39;,frame)<br>  cv2.imshow(&#39;Background Subtraction&#39;,fgmask)<br>  frame2 = frame<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> <br> line1 = np.array([[200,400],[700,400],[1000,400]],np.int32).reshape((-1,1,2))<br> line2 = np.array([[50,400],[1200,500]],np.int32).reshape((-1,1,2))<br> frame2 = cv2.polylines(frame2,[line1],False,(255,0,0),thickness=2)<br> frame2 = cv2.polylines(frame2,[line2],False,(0,0,255),thickness=2)<br> cv2.imshow(&#39;Frame 2&#39;,frame2)<br> <br> k = cv2.waitKey(30)&amp; 0xff<br> if k == 27:<br>  breakcap.release()<br>cv2.destroyAllWindows()</pre><p>Simpanlah koding tersebut dengan nama “kedua.py” dalam folder c:/hitungmobil lalu dijalankan dengan menggunakan perintah berikut.</p><pre>c:/hitungmobil/python kedua.py</pre><p>Maka, akan terlihat tampilan sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mu2AR6TVBXSegU_ObUi5YA.png" /></figure><p>Cara kerja background subtractor adalah frame pada saat k+1, <em>f</em>(<em>k+1</em>) dikurangi dengan frame pada saat k, <em>f</em>(<em>k</em>). Frame pada saat k dianggap sebagai frame dasar atau frame tetap, sehingga perbedaan posisi gambar pada saat k+1 (diwakili oleh nilai-nilai setiap pixel dalam matriks) akan dikurangkan dengan posisi gambar pada saat k (diwakili oleh nilai-nilai setiap pixel dalam matriks).</p><p>Sebagai contoh pada gambar berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/644/1*I5qXy962dgLX7Mjj9UqsuA.png" /><figcaption>Sumber: Object Counter Medium RB Hakim</figcaption></figure><p>Metode ini menggunakan transformasi morfologi untuk memperjelas bentuk objek dengan mempertahankan piksel berwarna putih menjadi putih dan piksel berwarna hitam menjadi hitam. Berikut adalah <em>script</em> untuk melakukan operasi morfologi pada video.</p><pre>import cv2<br>import numpy as np<br>def nothing(x):<br>    pass<br>cap = cv2.VideoCapture(&quot;highway.mp4&quot;)<br>cv2.namedWindow(&quot;Trackbars&quot;)<br>cv2.createTrackbar(&quot;L - H&quot;, &quot;Trackbars&quot;, 0, 179, nothing)<br>cv2.createTrackbar(&quot;L - S&quot;, &quot;Trackbars&quot;, 0, 255, nothing)<br>cv2.createTrackbar(&quot;L - V&quot;, &quot;Trackbars&quot;, 0, 255, nothing)<br>cv2.createTrackbar(&quot;U - H&quot;, &quot;Trackbars&quot;, 179, 179, nothing)<br>cv2.createTrackbar(&quot;U - S&quot;, &quot;Trackbars&quot;, 255, 255, nothing)<br>cv2.createTrackbar(&quot;U - V&quot;, &quot;Trackbars&quot;, 255, 255, nothing)<br>while True:<br>    _, frame = cap.read()<br>    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)<br>    l_h = cv2.getTrackbarPos(&quot;L - H&quot;, &quot;Trackbars&quot;)<br>    l_s = cv2.getTrackbarPos(&quot;L - S&quot;, &quot;Trackbars&quot;)<br>    l_v = cv2.getTrackbarPos(&quot;L - V&quot;, &quot;Trackbars&quot;)<br>    u_h = cv2.getTrackbarPos(&quot;U - H&quot;, &quot;Trackbars&quot;)<br>    u_s = cv2.getTrackbarPos(&quot;U - S&quot;, &quot;Trackbars&quot;)<br>    u_v = cv2.getTrackbarPos(&quot;U - V&quot;, &quot;Trackbars&quot;)<br>    lower_blue = np.array([l_h, l_s, l_v])<br>    upper_blue = np.array([u_h, u_s, u_v])<br>    mask = cv2.inRange(hsv, lower_blue, upper_blue)<br>    kernel = np.ones((5, 5), np.uint8)<br>    erosion = cv2.erode(mask, kernel)<br>    dilation = cv2.dilate(mask, kernel)<br>    opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2)<br>    closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)<br>    result = cv2.bitwise_and(frame, frame, mask=mask)<br>    cv2.imshow(&quot;frame&quot;, frame)<br>    cv2.imshow(&quot;mask&quot;, mask)<br>    cv2.imshow(&quot;erosion&quot;, erosion)<br>    cv2.imshow(&quot;dilation&quot;, dilation)<br>    cv2.imshow(&quot;Opening&quot;, opening)<br>    cv2.imshow(&quot;Closing&quot;, closing)<br>    key = cv2.waitKey(1)<br>    if key == 27:<br>        break<br>cap.release()<br>cv2.destroyAllWindows()</pre><p>Simpanlah kode di atas dengan nama “morfomobil.py” dalam folder “c:/hitungmobil”. Kemudian, jalankan perintah berikut melalui <em>command prompt</em>:</p><pre>c:/hitungmobil/python morfomobil.py</pre><p>Berikut adalah hasilnya:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qwR3NZzluAEuRsWNjiSxJA.png" /></figure><p>Tampilan yang akan muncul nantinya akan mengeluarkan banyak jendela, anda dapat mengatur warna <em>trackbars </em>dengan menggeserkan anak panahnya.</p><p>Pada trackbar, kita dapat mengubah nilai-nilai HSV, yang digunakan sebagai patokan, bukan RGB. Dengan menggunakan proses dilasi, erosi, opening, dan closing pada gambar yang telah mengalami transformasi morfologi, kita akan memperjelas mobil (objek) yang menjadi perhatian kita.</p><p>Selanjutnya, setelah objek telah diidentifikasi dengan benar, kita akan membuat kontur untuk setiap objek tersebut. Berikut adalah kode untuk melakukannya:</p><pre>import numpy as np<br>import cv2<br>cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)<br>kernelOp = np.ones((3,3),np.uint8)<br>kernelCl = np.ones((11,11),np.uint8)<br>while(cap.isOpened()):<br> ret, frame = cap.read()<br> fgmask = fgbg.apply(frame)<br> try:<br>  ret,imBin = cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)<br>  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)<br>  mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)<br> for cnt in contours:<br>  cv2.drawContours(frame,cnt,-1,(0,255,0),2,5)<br>  cv2.imshow(&#39;Frame&#39;,frame)<br> k = cv2.waitKey(30) &amp; 0xff<br> if k == 27:<br>  break<br>cap .release()<br>cv2.destroyAllWindows()</pre><p>Simpan koding tersebut dengan nama “mobilkontur.py” dan simpan dalam folder c:/hitungmobil, lalu jalankan perintah berikut pada <em>command prompt.</em></p><pre>c:/hitungmobil/python mobilkontur.py </pre><p>Maka menghasilkan gambar sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KMrZclBjsMBi5av58FkJew.png" /></figure><p>Lalu, objek tersebut akan dilakukan <em>tracking</em> dengan membuat kotak pada tiap kontur. Dalam metode ini, kita menggunakan pendekatan untuk menentukan posisi terbesar secara horizontal (samping kiri dan kanan) dan vertikal (atas dan bawah). Berikut adalah kode untuk melakukan hal tersebut:</p><pre>import numpy as np<br>import cv2<br>cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)<br>kernelOp = np.ones((6,6),np.uint8)<br>kernelCl = np.ones((11,11),np.uint8)<br>areaTH = 600<br>while(cap.isOpened()):<br> ret, frame = cap.read()<br> fgmask = fgbg.apply(frame)<br> try:<br>  ret,imBin = cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)<br>  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)<br>  mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)<br> for cnt in contours:<br>  cv2.drawContours(frame,cnt,-1,(0,255,0),2,5)<br>  area = cv2.contourArea(cnt)<br>  print(area)<br>  if area&gt;areaTH:<br>   M=cv2.moments(cnt)<br>   cx=int(M[&#39;m10&#39;]/M[&#39;m00&#39;])<br>   cy=int(M[&#39;m01&#39;]/M[&#39;m00&#39;])<br>   x,y,w,h=cv2.boundingRect(cnt)<br>   cv2.circle(frame,(cx,cy),5,(0,0,255),-1)<br>   img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),5)<br>  cv2.imshow(&#39;Frame&#39;,frame)<br> k = cv2.waitKey(30) &amp; 0xff<br> if k == 27:<br>  break<br>cap .release()<br>cv2.destroyAllWindows()</pre><p>Simpanlah <em>script </em>tersebut dengan nama “mobilkotak.py”, lalu dengan cara yang sama, jalankan pada <em>command promt</em>, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UwvnPA_T174mXc0ZCeJ36w.png" /></figure><p>Pada setiap kotak, nilai rata-rata lebar dan tinggi dihitung untuk menemukan pusat kotak. Dengan informasi ini, dilakukan pelacakan (“tracking”) untuk setiap objek menggunakan kode berikut,</p><pre>import numpy as np<br>import cv2<br>import Cars<br>import time<br>cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)<br>kernelOp = np.ones((6,6),np.uint8)<br>kernelCl = np.ones((11,11),np.uint8)<br>font=cv2.FONT_HERSHEY_SIMPLEX<br>persons=[]<br>max_p_age=5<br>pid=1<br>areaTH = 600<br>while(cap.isOpened()):<br> ret, frame = cap.read()<br> fgmask = fgbg.apply(frame)<br> try:<br>  ret,imBin = cv2.threshold(fgmask,240,255,cv2.THRESH_BINARY)<br>  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)<br>  mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)<br> except:<br>  print(&#39;EOF&#39;)<br>  break<br> contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)<br> for cnt in contours:<br>  cv2.drawContours(frame,cnt,-1,(0,255,0),3,5)<br>  area = cv2.contourArea(cnt)<br>  print(area)<br>  if area&gt;areaTH:<br>   M=cv2.moments(cnt)<br>   cx=int(M[&#39;m10&#39;]/M[&#39;m00&#39;])<br>   cy=int(M[&#39;m01&#39;]/M[&#39;m00&#39;])<br>   x,y,w,h=cv2.boundingRect(cnt)<br>   new = True<br>   for i in persons:<br>    if abs(x-i.getX())&lt;=w and abs(y-i.getY())&lt;=h:<br>     new = False<br>     i.updateCoords(cx,cy)<br>     break<br>  if new == True :<br>   p = Cars.MyCar(pid,cx,cy,max_p_age)<br>   cars.append(p)<br>   pid+=1<br>   cv2.circle(frame,(cx,cy),5,(0,0,255),-1)<br>   img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)<br>   cv2.drawContours(frame,cnt,-1,(0,255,0),3)<br>   <br>   for i in cars:<br>    if len(i.getTracks())&gt;=2:<br>     pts=np.array(i.getTracks(),np.int32)<br>     pts=pts.reshape((-1,1,2))<br>     frame=cv2.polylines(frame,[pts],False,i.getRGB())<br>    if i.getId() == 9:<br>     print(str(i.getX()),&#39;,&#39;,str(i.getY()))<br>     #cv2.putText(frame,str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)<br>     cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)<br>     cv2.imshow(&#39;Frame&#39;,frame)<br> k = cv2.waitKey(30) &amp; 0xff<br> if k == 27:<br>  break<br>cap .release()<br>cv2.destroyAllWindows()</pre><p>Simpan koding tersebut dengan nama “mobiltrack.py” lalu jalankan dengan perintah</p><pre>c:/hitungmobil/python mobiltrack.py</pre><p>Dan mendapatkan hasil sebagai berikut</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NprMOnD54z8rX23dPt9KWA.png" /></figure><p>Sehingga setiap mobil sudah memiliki pelacakan (“tracking”) yang akan digunakan sebagai dasar untuk menghitung ketika mobil tersebut telah melewati batas garis yang telah ditentukan. Berikut adalah kode terakhir yang akan diberi nama “itungmobil.py”.</p><pre>import numpy as np<br>import cv2<br>import Cars<br>import time<br>#mendefinisikan input dan output<br>cnt_up   = 0<br>cnt_down = 0<br>#Membuka video<br>cap = cv2.VideoCapture(&#39;highway.mp4&#39;)<br>#Dimensi (properti) video<br>##cap.set(3,160) #Width<br>##cap.set(4,120) #Height<br>#Meletakkan properti video ke setiap frame di video<br>for i in range(19):<br>    print(i), cap.get(i)<br>w = cap.get(3)<br>h = cap.get(4)<br>frameArea = h*w<br>areaTH = frameArea/500<br>print (&#39;Area Threshold&#39;), areaTH<br>#Garis masuk dan keluar<br>line_up = int(1.85*(h/3))<br>line_down   = int(3*(h/4))<br>up_limit =   int(2.65*(h/5))<br>down_limit = int(3.5*(h/4))<br>print (&quot;Red line y:&quot;),str(line_down)<br>print (&quot;Blue line y:&quot;), str(line_up)<br>line_down_color = (255,0,0)<br>line_up_color = (0,0,255)<br>pt1 =  [0, line_down];<br>pt2 =  [w, line_down];<br>pts_L1 = np.array([pt1,pt2], np.int32)<br>pts_L1 = pts_L1.reshape((-1,1,2))<br>pt3 =  [0, line_up];<br>pt4 =  [w, line_up];<br>pts_L2 = np.array([pt3,pt4], np.int32)<br>pts_L2 = pts_L2.reshape((-1,1,2))<br>pt5 =  [0, up_limit];<br>pt6 =  [w, up_limit];<br>pts_L3 = np.array([pt5,pt6], np.int32)<br>pts_L3 = pts_L3.reshape((-1,1,2))<br>pt7 =  [0, down_limit];<br>pt8 =  [w, down_limit];<br>pts_L4 = np.array([pt7,pt8], np.int32)<br>pts_L4 = pts_L4.reshape((-1,1,2))<br>#Background subtractor<br>fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)<br>#Elemen struktural untuk filter morfologi<br>kernelOp = np.ones((3,3),np.uint8)<br>kernelOp2 = np.ones((5,5),np.uint8)<br>kernelCl = np.ones((11,11),np.uint8)<br>#Variabel-variabel<br>font = cv2.FONT_HERSHEY_SIMPLEX<br>cars = []<br>max_p_age = 5<br>pid = 1<br>while(cap.isOpened()):<br>#Membaca gambar dari aliran video<br>    ret, frame = cap.read()<br>for i in cars:<br>        i.age_one() #tandai setiap mobil sebagai satu object<br>#Tahap Pra-pengolahan    <br>    #Penerapan background subtractor<br>    fgmask = fgbg.apply(frame)<br>    fgmask2 = fgbg.apply(frame)<br>#Menggunakan metode binarisasi untuk menghilangkan bayangan (color ke grey)<br>    try:<br>        ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)<br>        ret,imBin2 = cv2.threshold(fgmask2,200,255,cv2.THRESH_BINARY)<br>  <br>        #Proses Opening (erosi-&gt;dilasi) untuk menghilangkan noise<br>        mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp)<br>        mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kernelOp)<br>  <br>        #Proses Closing (dilasi -&gt; erosi) untuk menghilangkan pixel ke putih<br>        mask =  cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kernelCl)<br>        mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernelCl)<br>    except:<br>        print(&#39;EOF&#39;)<br>        print (&#39;UP:&#39;),cnt_up<br>        print (&#39;DOWN:&#39;),cnt_down<br>        break<br>    <br>#Pembuatan Kontur    <br>     <br>    contours, hierarchy = cv2.findContours(mask2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)<br>    for cnt in contours:<br>        area = cv2.contourArea(cnt)<br>        if area &gt; areaTH:<br>    <br>            #   TRACKING <br>            #Pengaturan untuk kondisi mobil yang jamak<br>   <br>            M = cv2.moments(cnt)<br>            cx = int(M[&#39;m10&#39;]/M[&#39;m00&#39;])<br>            cy = int(M[&#39;m01&#39;]/M[&#39;m00&#39;])<br>            x,y,w,h = cv2.boundingRect(cnt)<br>new = True<br>            if cy in range(up_limit,down_limit):<br>                for i in cars:<br>                    if abs(cx-i.getX()) &lt;= w and abs(cy-i.getY()) &lt;= h:<br>                        <br>      #object dekat dengan object yang telah terdeteksi sebelumnya<br>                        new = False<br>                        i.updateCoords(cx,cy)   <br>      #perbaharui koordinat dalam object dalam atur ulang usia (awal penandaan)<br>                        if i.going_UP(line_down,line_up) == True:<br>                            cnt_up += 1;<br>                            print (&quot;ID:&quot;),i.getId(),&#39;crossed going up at&#39;,time.strftime(&quot;%c&quot;)<br>                        elif i.going_DOWN(line_down,line_up) == True:<br>                            cnt_down += 1;<br>                            print (&quot;ID:&quot;),i.getId(),&#39;crossed going down at&#39;,time.strftime(&quot;%c&quot;)<br>                        break<br>                    if i.getState() == &#39;1&#39;:<br>                        if i.getDir() == &#39;down&#39; and i.getY() &gt; down_limit:<br>                            i.setDone()<br>                        elif i.getDir() == &#39;up&#39; and i.getY() &lt; up_limit:<br>                            i.setDone()<br>                    if i.timedOut():<br>      #hapus object (mobil) dari daftar<br>                        index = cars.index(i)<br>                        cars.pop(index)<br>                        del i     #hapus dari memori<br>                if new == True:<br>                    p = Cars.MyCars(pid,cx,cy, max_p_age)<br>                    cars.append(p)<br>                    pid += 1     <br>            <br>            #Gambar<br>            <br>            cv2.circle(frame,(cx,cy), 5, (0,0,255), -1)<br>            img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)            <br>            #cv2.drawContours(frame, cnt, -1, (0,255,0), 3)<br>            <br>    #Akhir cnt dalam kontur<br> <br>    <br>    # Trayektori Gambar <br>    <br>    for i in cars:<br>        cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)<br>str_up = &#39;Keluar: &#39;+ str(cnt_up)<br>    str_down = &#39;Masuk: &#39;+ str(cnt_down)<br>    frame = cv2.polylines(frame,[pts_L1],False,line_down_color,thickness=2)<br>    frame = cv2.polylines(frame,[pts_L2],False,line_up_color,thickness=2)<br>    frame = cv2.polylines(frame,[pts_L3],False,(255,255,255),thickness=1)<br>    frame = cv2.polylines(frame,[pts_L4],False,(255,255,255),thickness=1)<br>    cv2.putText(frame, str_up ,(15,40),font,0.5,(200,200,200),2,cv2.LINE_AA)<br>    cv2.putText(frame, str_up ,(15,40),font,0.5,(0,200,0),1,cv2.LINE_AA)<br>    cv2.putText(frame, str_down ,(15,60),font,0.5,(200,200,200),2,cv2.LINE_AA)<br>    cv2.putText(frame, str_down ,(15,60),font,0.5,(0,0,200),1,cv2.LINE_AA)<br>cv2.imshow(&#39;Frame&#39;,frame)<br>    #cv2.imshow(&#39;Mask&#39;,mask)    <br>    <br>    #klik ESC untuk keluar<br>    k = cv2.waitKey(30) &amp; 0xff<br>    if k == 27:<br>        break<br>#Akhir untuk while(cap.isOpened())<br>    <br>#bersihkan layar<br>cap.release()<br>cv2.destroyAllWindows()</pre><p>Setelah tersimpan, lalu salinlah koding yang dibutuhkan sebagai berikut.</p><pre>from random import randint<br>import time<br>class MyCars:<br> tracks = []<br> def __init__(self, i, xi, yi, max_age):<br>   self.i = i<br>   self.x = xi<br>   self.y = yi<br>   self.tracks = []<br>   self.R = randint(0,255)<br>   self.G = randint(0,255)<br>   self.B = randint(0,255)<br>   self.done = False<br>   self.state = &#39;0&#39;<br>   self.age = 0<br>   self.max_age = max_age<br>   self.dir = None<br> def getRGB(self):<br>  return (self.R,self.G,self.B)<br> def getTracks(self):<br>  return self.tracks<br> def getId(self):<br>  return self.i<br> def getState(self):<br>  return self.state<br> def getDir(self):<br>  return self.dir<br> def getX(self):<br>  return self.x<br> def getY(self):<br>  return self.y<br> def updateCoords(self, xn, yn):<br>  self.age = 0<br>  self.tracks.append([self.x,self.y])<br>  self.x = xn<br>  self.y = yn<br> def setDone(self):<br>  self.done = True<br> def timedOut(self):<br>  return self.done<br> def going_UP(self,mid_start,mid_end):<br>  if len(self.tracks) &gt;= 2:<br>   if self.state == &#39;0&#39;:<br>    if self.tracks[-1][1] &lt; mid_end and self.tracks[-2][1] &gt;= mid_end: #melalui batas<br>     state = &#39;1&#39;<br>     self.dir = &#39;up&#39;<br>     return True<br>   else:<br>    return False<br>  else:<br>   return False<br> def going_DOWN(self,mid_start,mid_end):<br>  if len(self.tracks) &gt;= 2:<br>   if self.state == &#39;0&#39;:<br>    if self.tracks[-1][1] &gt; mid_start and self.tracks[-2][1] &lt;= mid_start: #melalui batas<br>     state = &#39;1&#39;<br>     self.dir = &#39;down&#39;<br>     return True<br>   else:<br>    return False<br>  else:<br>   return False<br> def age_one(self):<br>  self.age += 1<br>  if self.age &gt; self.max_age:<br>   self.done = True<br>  return True<br>class MultiCars:<br>    def __init__(self, cars, xi, yi):<br>        self.cars = cars<br>        self.x = xi<br>        self.y = yi<br>        self.tracks = []<br>        self.R = randint(0,255)<br>        self.G = randint(0,255)<br>        self.B = randint(0,255)<br>        self.done = False</pre><p>Lalu, simpan dengan nama “hitungmobil.py” masih dalam satu folder yang sama, lalu dipanggil sepertib biasa dengan menggunakan <em>command prompt </em>sebagai berikut.</p><pre>c:/hitungmobil/python hitungmobil.py</pre><p>Maka, dapat menghasilkan gambar sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s8COSyrwXT0UmNXjMMvvyw.png" /></figure><p>Dengan begitu, kita dapat menyimpulkan bahwa penggunaan kecerdasan buatan dalam perangkat penghitung objek telah membuka pintu bagi kemajuan luar biasa dalam mengatasi tantangan pemantauan lalu lintas di jalan raya. Kemampuannya untuk menghitung dengan akurat jumlah mobil yang masuk dan keluar dari jalan raya telah membantu meningkatkan keamanan dan efisiensi lalu lintas. Dengan teknologi yang semakin maju, kita dapat berharap bahwa penggunaan kecerdasan buatan akan terus meningkatkan sistem penghitung objek, dan menjadikan lalu lintas di jalan raya menjadi lebih aman dan lancar.</p><p><strong>Referensi</strong></p><p><a href="https://medium.com/@986110101/object-counter-823c0fd84cfb">https://medium.com/@986110101/object-counter-823c0fd84cfb</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd41f3b61136" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Decision Tree Using Iris Dataset]]></title>
            <link>https://medium.com/@hanumsumbri/decision-tree-using-iris-dataset-e78c6841264?source=rss-bc2cd97e7950------2</link>
            <guid isPermaLink="false">https://medium.com/p/e78c6841264</guid>
            <category><![CDATA[iris-dataset]]></category>
            <category><![CDATA[rstudio]]></category>
            <category><![CDATA[decision-tree-classifier]]></category>
            <category><![CDATA[decision-tree]]></category>
            <category><![CDATA[data-analysis]]></category>
            <dc:creator><![CDATA[Ines Halida Hanum Sumbri]]></dc:creator>
            <pubDate>Sun, 09 Jul 2023 18:03:28 GMT</pubDate>
            <atom:updated>2023-07-09T18:03:28.235Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*K_9ruY04We8CwqGoTsRS9A.png" /></figure><h3>Halo!</h3><p>Pada kesempatan kali ini, saya akan sedikit memaparkan materi mengenai aplikasi <em>decision tree </em>dengan menggunakan salah satu <em>dataset </em>sangat populer di kalangan <em>data enthusiast, </em>yaitu Iris <em>dataset.</em></p><h3><strong>Pengertian</strong></h3><p><em>Decision Tree</em> adalah suatu diagram alir yang memiliki bentuk mirip struktur pohon, di mana setiap nod internal mewakili pengujian terhadap suatu atribut, setiap cabang menggambarkan hasil dari pengujian tersebut, dan nod daun mewakili kelas-kelas atau distribusi kelas. Nod teratas disebut sebagai nod akar atau nod utama. Nod akar memiliki beberapa cabang keluar tetapi tidak memiliki cabang masuk, nod internal memiliki satu cabang masuk dan beberapa cabang keluar, sementara nod daun hanya memiliki satu cabang masuk tanpa cabang keluar (Qadrini et al., 2021).</p><h3><strong>Kegunaan</strong></h3><p><em>Decision Tree</em> digunakan untuk mengategorikan suatu sampel data yang tidak diketahui kelasnya ke dalam kelas-kelas yang sudah ada (Qadrini et al., 2021).</p><h3><strong>Studi Kasus</strong></h3><p>Langsung saja, anda dapat melakukan pemasangan paket <em>”party”</em>, jika sudah panggil dengan menggunakan perintah <em>library()</em> sebagai berikut.</p><pre>install.packages(&quot;party&quot;)<br>library(party)<br>search()</pre><p>Maka, akan muncul tampilan sebagai berikut</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/470/1*wD5w2XddFUmSgibFZT9W5g.png" /></figure><p>Dapat terlihat, <em>library() </em>ini telah terlihat terpasang di urutan kedua.</p><p>Untuk melihat fungsi yang terdapat pada <em>library</em> ini, kita dapat menggunakan perintah <em>ls(2)</em>.</p><pre>ls(2)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/1*AU4Uh9sw3U32x6JVZdKyyA.png" /></figure><p>Terlihat pada nomor 6 terdapat fungsi <em>ctree()</em> yang akan digunakan dalam melakukan <em>decision tree </em>kali ini.</p><p>Kemudian, untuk memanggil <em>dataset </em>iris, dapat dipanggil saja Iris, dan dapat dilihat 6 data teratas dengan menggunakan fungsi <em>head()</em>.</p><pre>head(iris)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/455/1*QU36lIlBQLvmsI47U2uCZQ.png" /></figure><p>Dapat terlihat bahwa data iris memiliki 5 variabel, dengan variabel species sebagai data kategorik.</p><p>Selanjutnya, akan dilakukan suatu <em>decision tree </em>dengan menggunakan fungsi <em>ctree()</em> dengan variabel species sebagai variabel respons, dan yang lainnya sebagai prediktor. Hasil dari <em>decision tree </em>tersebut dapat ditampilkan dengan menggunakan fungsi <em>plot().</em></p><pre>hasiltree &lt;- ctree(Species ~ Petal.Length +Petal.Width+ <br>                     Sepal.Width+ Sepal.Length,<br>                   data = iris)<br>plot(hasiltree)</pre><p>Berikut merupakan hasil dari <em>plot decision tree</em> tersebut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/620/1*hKQbBS7FwNLCOS39PCCjjg.png" /></figure><p>Berdasarkan <strong>Gambar 5, </strong>jika diketahui:</p><p>Terdapat satu bunga iris baru dengan sepal length = 7.3 sepal width = 4.3 petal length = 3.8 dan petal width 1.2 maka dengan <em>decision tree</em>, termasuk spesies apakah bunga iris tersebut?</p><p><strong>Jawab:</strong></p><p>Berdasarkan grafik, jika diikuti alurnya, maka spesies bunga tersebut termasuk bunga <strong>Versicolor.</strong> Untuk melihat lebih yakin, dapat digunakan fungsi <em>predict()</em> dengan memasukkan data baru tersebut.</p><p>Sebelum itu, anda dapat membuat objek baru berisi mengenai data yang ada pada soal, sebagai berikut.</p><pre>data_baru &lt;- data.frame(Sepal.Length = 7.3,<br>                        Sepal.Width = 4.3,<br>                        Petal.Length = 3.8,<br>                        Petal.Width = 1.2)</pre><p>Setelah itu, dilanjutkan dengan menggunakan fungsi <em>predict()</em> seperti yang sudah dibilang sebelumnya.</p><pre>prediksi &lt;- predict(hasiltree, newdata = data_baru, type = &quot;response&quot;)<br>prediksi</pre><p>Maka, akan diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/499/1*aN4at_aE50gDQ4MY6IqsOA.png" /></figure><p>Berdasarkan <strong>Gambar 6</strong>, dapat dilihat bahwa hasil prediksi menunjukkan hasil yang sama, yaitu pada bunga dengan spesies versicolor. Jadi, dapat disimpulkan bahwa bunga tersebut merupakan spesies<strong> versicolor.</strong></p><p>Nah, jadi begitu kira-kira contoh sederhana penggunaan <em>decision tree </em>dengan menggunakan <em>dataset Iris.</em> Bagaimana? mudah bukan? selamat mencoba ya! data tersebut dapat diganti menjadi data yang anda inginkan.</p><p>Sekian dari saya, kurang lebihnya mohon maaf karena saya juga masih belajar, hehe</p><p>Terima kasih, <em>see u on the next medium!</em></p><p><strong>Referensi</strong></p><ol><li><a href="https://medium.com/@986110101/decision-tree-2-4dd56891ad16">https://medium.com/@986110101/decision-tree-2-4dd56891ad16</a></li><li>Qadrini, L., Seppewali, A., &amp; Aina, A. (2021). Decision Tree dan ADABOOST pada Klasifikasi Penerima Program Bantuan Sosial. <em>Jurnal Inovasi Penelitian</em>, <em>2</em>(7).</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e78c6841264" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hierarchical Clustering : Pengelompokkan Kabupaten/Kota di Jawa Timur Berdasarkan Indikator…]]></title>
            <link>https://medium.com/@hanumsumbri/hierarchical-clustering-pengelompokkan-kabupaten-kota-di-jawa-timur-berdasarkan-indikator-43b2c1526215?source=rss-bc2cd97e7950------2</link>
            <guid isPermaLink="false">https://medium.com/p/43b2c1526215</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[poverty]]></category>
            <category><![CDATA[rstudio]]></category>
            <category><![CDATA[hierarchical-clustering]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Ines Halida Hanum Sumbri]]></dc:creator>
            <pubDate>Thu, 04 May 2023 16:01:07 GMT</pubDate>
            <atom:updated>2023-07-09T17:02:11.160Z</atom:updated>
            <content:encoded><![CDATA[<h3><em>Hierarchical Clustering</em> : Pengelompokkan Kabupaten/Kota di Jawa Timur Berdasarkan Indikator Pengukuran Tingkat Kemiskinan dan Ketimpangan Ekonomi</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*uaEZIdQlAUqZgasiKjSrnQ.png" /></figure><p>“S<em>uatu masyarakat disebut miskin apabila memiliki pendapatan jauh lebih rendah dari rata-rata pendapatan sehingga tidak banyak memiliki kesempatan untuk mensejahterakan dirinya (Suryawati, 2004)</em>.”</p><p>Halo semuanya, salam kenal! 🙌</p><p>Pada kesempatan perdana kali ini, saya akan coba membahas salah satu implementasi dari klustering<em> </em>hirarki mengenai data pengukuran tingkat kemiskinan dan ketimpangan ekonomi yang ada di Kabupaten/Kota Jawa Timur dengan menggunakan <em>software</em> R. Indikator tersebut dapat digunakan untuk memahami kondisi sosial-ekonomi penduduk suatu wilayah, termasuk tingkat kemiskinan, ketimpangan, dan tingkat kesejahteraan.</p><p>Data dapat diunduh pada laman berikut:</p><p><a href="https://drive.google.com/file/d/1j6_ds7ptxMkLJcnYp0nM0RRtRNr7Ahm3/view?usp=sharing">Data Jatim 2.csv</a></p><p><strong>Variabel yang digunakan</strong></p><p>Berikut merupakan penjelasan mengenai variabel yang digunakan:</p><ol><li>Kab : Kabupaten/Kota yang ada di Jawa Timur</li><li>Density : Kepadatan penduduk</li><li>PddkKota : Persentase penduduk perkotaan</li><li>Depend : Rasio ketergantungan</li><li>Gini : Gini ratio</li><li>Miskin : Persentase penduduk miskin</li><li>KapitaNMkn : Persentase pengeluaran per kapita untuk konsumsi bukan makanan sebulan</li></ol><p>Okey, mari kita mulai!</p><p>Langkah pertama, kalian dapat membuka <em>software </em>R kalian terlebih dahulu. Setelah itu, data akan diinput dengan menggunakan sintaks sebagai berikut. Untuk tempat atau <em>directory </em>dapat disesuaikan dengan tempat masing-masing.</p><pre>data = read.csv(&quot;.....//Data Jatim 2.csv&quot;, <br>                 header = T, sep =&quot;;&quot;)<br>head(data)</pre><p>Setelah data tersebut dimasukkan, maka akan muncul tampilan sebagai berikut.</p><figure><img alt="Data Kab/Kota di Jawa Timur" src="https://cdn-images-1.medium.com/max/485/1*3GIaRm7o0dkV1r5ZOEyshQ.png" /></figure><p><strong>Gambar 1 </strong>menunjukkan enam data teratas dari data yang telah diinputkan. Terdapat tujuh variabel dengan masing-masing nilainya. Mulai dari Kabupaten Pacitan hingga Kabupaten Kediri. Kemudian, untuk pengecekan struktur data dari tiap variabel, praktikan menggunakan perintah str() dan didapatkan hasil sebagai berikut.</p><pre>str(data)</pre><figure><img alt="struktur data" src="https://cdn-images-1.medium.com/max/498/1*t6LR7yfMBcFA6RqbARZsmg.png" /></figure><p>Untuk bentuk atau struktur data tersebut merupakan suatu <em>data frame </em>yang terdiri dari tujuh variabel sebanyak 38 baris. Tipe data untuk variabel Kab adalah <em>chr </em>atau <em>character</em>, variabel <em>density </em>adalah <em>int </em>atau integer, dan sisanya berbentuk numerik.</p><p>Lalu, untuk melihat ringkasan data dari variabel, kalian dapat menggunakan perintah <em>summary()</em> dan diperoleh hasil sebagai berikut.</p><pre>summary(data)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/544/1*7UXh8pAMJekN8oTWkIEjDA.png" /></figure><p>Berdasarkan <strong>Gambar 3</strong>, dapat diketahui hasil statistik deskriptif yang terdiri dari nilai minimum, 1st <em>Quartile</em>, <em>Median</em>, <em>Mean</em>, 3rd <em>Quartile</em>, dan nilai maksimum dari setiap variabel. Akan tetapi, untuk variabel Kab hanya memiliki informasi mengenai <em>length, class, </em>dan<em> mode </em>dikarenakan memiliki tipe data karakter.</p><p>Setelah itu, akan dilakukan uji multikolinieritas. Pengujian ini dilakukan untuk mengetahui ada penyimpangan atau tidak asumsi multikolinearitas yang merupakan hubungan linear antar variabel independen pada model. Salah satu syarat yang harus terpenuhi adalah tidak adanya multikolinearitas yang dapat dilihat dari nilai VIF-nya.</p><pre>### Uji Multikolinearitas ###<br>install.packages(&quot;car&quot;)<br>library(car)<br>attach(data)<br><br>## Multiko dengan nilai VIF<br># VIF Density dengan variabel lainnya<br>multiko.1 = vif(lm(Density~PddkKOta+Depend+Gini+Miskin+KapitaNMkn))<br>multiko.1<br><br># VIF PddkKOta dengan variabel lainnya <br>multiko.2 = vif(lm(PddkKOta~Density+Depend+Gini+Miskin+KapitaNMkn))<br>multiko.2<br><br># VIF Depend dengan variabel lainnya <br>multiko.3 = vif(lm(Depend~PddkKOta+Density+Gini+Miskin+KapitaNMkn))<br>multiko.3<br><br># VIF Gini dengan variabel lainnya <br>multiko.4 = vif(lm(Gini~PddkKOta+Density+Depend+Miskin+KapitaNMkn))<br>multiko.4<br><br># VIF Miskin dengan variabel lainnya <br>multiko.5= vif(lm(Miskin~PddkKOta+Depend+Gini+Density+KapitaNMkn))<br>multiko.5<br><br>#VIF KapitaNMkn dengan variabel lainnya<br>multiko.6 = vif(lm(KapitaNMkn~PddkKOta+Depend+Gini+Miskin+Density))<br>multiko.6</pre><p>Pengujian dilakukan dengan melakukan pemasangan <em>package “car” </em>terlebih dahulu, lalu memanggilnya dengan perintah library(). Setelah itu, dilakukan dengan meng-<em>attach </em>atau menampilkan dataset yang sebelumnya sudah dibuat. Kemudian dilanjutkan dengan pengujian multikolinieritas dengan menggunakan fungsi vif() untuk masing-masing variabel, didapatkan hasil sebagai berikut.</p><figure><img alt="Hasil uji multikolinieritas" src="https://cdn-images-1.medium.com/max/442/1*7uzKKl6O_PdQRHiTcyNgbw.png" /></figure><p>Berdasarkan <strong>Gambar 4 </strong>di atas, diperoleh hasil analisis sebagai berikut:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/584/1*WPuewC-QJ0tmkbK64G0rNw.png" /></figure><p>Lalu, anda dapat melihat plot korelasi multikolinieritas dengan memasang dan memanggil <em>package</em> ”PerformanceAnalytics” terlebih dahulu kemudian menggunakan fungsi chart.correlation() untuk menampilkan plotnya sebagai berikut.</p><pre>## Multiko dengan correlation plot<br>install.packages(&quot;PerformanceAnalytics&quot;)<br>library(PerformanceAnalytics)<br>chart.Correlation(data[,2:7])</pre><p>Berdasarkan <em>script </em>di atas, pada fungsi <em>chart.Correlation(data[,2:7])</em> memiliki arti bahwa akan dibuat plot korelasi dengan menggunakan semua baris, namun hanya pada kolom 2–7 karena berbentuk numerik, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/531/1*MedsMDaSQMMFTTwxLKAJHQ.png" /></figure><p>Berdasarkan <strong>Gambar 5</strong>, dapat terlihat mengenai korelasi antar variabel dan juga plot distribusi masing-masing variabel. Selain itu, anda juga dapat melihat nilai korelasi dengan perintah berikut.</p><pre>korelasi = cor(data[,2:7])<br>View(korelasi)</pre><p>Untuk melihat korelasi antar variabel numerik, hanya menggunakan kolom 2–7 menggunakan fungsi cor() dan diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/523/1*BuuJoW8VtRpTPe4ZiWy4VA.png" /></figure><p>Nilai korelasi yang baik berada di atas nilai 0,8 yaitu korelasi positif antara variabel <em>PddkKota </em>dengan <em>Density</em>. Selanjutnya, anda dapat memulai analisis hierarki dengan membuat data objek baru yang berisikan data numerik saja dengan menggunakan perintah sebagai berikut. Untuk nama objek dapat disesuaikan masing-masing.</p><pre>##Analisis Kluster Hirarki<br>uts_mpml=data[,2:7]</pre><p>Lalu, dilakukan analisis kelompok hirarki. Anda dapat melakukan analisis kluster hirarki dengan membuatnya dalam bentuk dendogram menggunakan beberapa metode di antaranya sebagai berikut.</p><pre>#Average Linkage<br>metode_al&lt;-hclust(dist(scale(uts_mpml)),method=&quot;ave&quot;)<br>plot(metode_al)<br><br>#single Linkage<br>metode_sl&lt;-hclust(dist(scale(uts_mpml)), method = &quot;single&quot;)<br>plot(metode_sl)<br><br>#Complete Linkage<br>metode_cl&lt;-hclust(dist(scale(uts_mpml)), method=&quot;complete&quot;)<br>plot(metode_cl)<br><br>#Ward<br>metode_ward&lt;-hclust(dist(scale(uts_mpml)),method=&quot;ward.D&quot;)<br>plot(metode_ward)</pre><ol><li><strong>Average Linkage</strong></li></ol><p>Analisis yang dilakukan pertama adalah dengan menggunakan metode <em>average linkage</em>. Pengelompokan dengan metode ini yang dibentuk berdasarkan nilai rata — rata jarak individu dalam satu kelompok dengan rata -rata seluruh dan kelompok lainnya. Maka, ditampilkan <em>output</em> seperti pada <strong>Gambar 7 </strong>berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/456/1*fGUEx-B4drSLgy5ihIOgLg.png" /></figure><p>Untuk metode ini, terdapat tiga <em>cluster </em>besar dan satu <em>cluster </em>kecil dengan jumlah yang terlihat kurang tersebar merata.</p><p><strong>2. Single Linkage</strong></p><p>Metode <em>single linkage</em> merupakan metode pengelompokan <em>agglomerative</em> yang didasarkan pada jarak minimum atau jarak terdekat antar objek, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/476/1*bUKA2fWnOamwfdqXH1xa_Q.png" /></figure><p><strong>3. Complete Linkage</strong></p><p><em>Complete linkage</em> merupakan metode pengelompokan <em>agglomerative</em> yang didasarkan pada jarak maksimum atau jarak terjauh antar objek. Maka, ditampilkan <em>output</em> seperti pada <strong>Gambar 9 </strong>berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/469/1*O65oo7QtNeLbJHR4iyS4hA.png" /></figure><p><strong>4. Wards Method</strong></p><p><em>Wards method</em> merupakan pengelompokan mengunakan jumlah kuadrat antar dua <em>cluster</em> untuk seluruh variabel. Maka, ditampilkan <em>output</em> seperti pada <strong>Gambar 10 </strong>berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/408/1*drZdufQa-XxRX81UblXDaw.png" /></figure><p><strong>Menentukan Banyaknya Kluster</strong><br>Kluster yang baik adalah kluster yang memiliki kedekatan jarak di dalam kelompoknya dan memiliki jarak yang jauh antar kelompok, hal ini dapat dilihat dari dendogram metode ward’s memberikan hasil yang baik. Dari beberapa hasil klustering di atas, yang memiliki hasil yang baik adalah metode Wards dengan jumlah kluster sebanyak 4 kelompok.</p><p>Berikut merupakan sintaks untuk membuat garis bantu dalam menentukan empat kelompok tersebut. Terdapat beberapa cara untuk mengukur akurasi banyaknya jumlah kelompok yang dibentuk, pada kali ini contohnya menggunakan <em>stability measure</em>.</p><pre>install.packages(&quot;clValid&quot;)<br>library(clValid)<br><br>#Stabilitas measure<br>stability &lt;- clValid(uts_mpml, nClust = 3:4,<br>                     clMethods = &quot;agnes&quot;,<br>                     validation = &quot;internal&quot;,<br>                     metric = &quot;euclidean&quot;,<br>                     method = &quot;complete&quot;)<br>#Hanya menampilkan skor optimal<br>optimalScores(stability)</pre><p>Maka, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/333/1*S0WaojdJh9LeScXv07OGPg.png" /></figure><p>Berdasarkan <strong>Gambar 11</strong>, penentuan kluster dapat dilakukan dengan 3 atau 4 kelompok dengan mayoritas di 4 bagian kelompok. Untuk memudahkan pembagian, dapat dilakukan dengan memberikan garis merah pada kluster dendogram sebagai berikut.</p><pre>rect.hclust(metode_ward,4)</pre><p>Lalu, diperoleh hasil pembagian kelompok sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/454/1*mH666KZSBDjS4fz0qnigPg.png" /></figure><p>Berdasarkan <strong>Gambar 12</strong>, dapat terlihat bahwa adanya garis merah mempermudah dalam bayangan untuk membagi kelompok. Selanjutnya, akan dilakukan pengelompokkan ke dalam <em>data frame</em> dengan menggunakan sintaks sebagai berikut.</p><pre>#Mengelompokkan data dalam format data frame<br>anggota &lt;- cutree(metode_ward,4)<br>tabel &lt;- data.frame(data,anggota)<br>tabel</pre><p>Maka, diperoleh hasil sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/457/1*vOjdtMUepsWicBlu4lLuEg.png" /></figure><p>Untuk melakukan profilisasi, anda dapat meng<em>import</em> <em>data frame </em>tersebut ke dalam bentuk .csv dengan menggunakan sintaks sebagai berikut.</p><pre>write.csv(tabel, &quot;...// Output Profilisasi Data Jatim 2.csv&quot;)</pre><p>Profilisasi dilakukan dengan cara mengurutkan nilai anggota, biasanya menggunakan filter <em>sorts </em>dari terkecil ke terbesar. Kemudian, mencari perhitungan rata — rata berdasarkan tiap variabel dengan menggunakan <em>MS. Excel</em>. Hasilnya dapat dilihat sebagai berikut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/484/1*cGmELok3xEO3iWsJEke-AQ.png" /></figure><p>Berdasarkan <strong>Gambar 14</strong>, dapat diketahui terdapat empat kelompok atau klaster. Untuk masing-masing variabel, terdapat nilai tertinggi hingga terendah yang dilabeli dengan warna dari yang tua hingga muda, menunjukkan urutan nilai dari yang terbesar hingga terkecil.</p><p>Untuk variabel <em>density</em>, kelompok yang memiliki nilai tertinggi di antara kelompok yang lain yaitu kluster 3. Untuk variabel <em>PddkKota</em>, yang memiliki nilai tertinggi pertama dipegang oleh kelompok 3, begitu pula dengan variabel lain dan urutan yang sesuai dengan warna yang telah tertera.</p><p>Beberapa Kabupaten/Kota yang berada pada masing-masing kelompok dapat dilihat hasilnya <a href="https://docs.google.com/spreadsheets/d/1ZwiGngRj6BkUJssVAt7El6VUAQ36GGpi/edit?usp=sharing&amp;ouid=117026477282809025732&amp;rtpof=true&amp;sd=true">di sini.</a></p><p><strong>Kesimpulan</strong></p><p>Hasil pengelompokkan dan pengkategorian untuk kabupaten/kota di Jawa Timur bisa menjadi saran bagi pemerintah agar lebih memperhatikan Kabupaten/Kota yang memiliki hasil pengukuran tingkat kemiskinan dan ketimpangan ekonomi yang tinggi sehingga dapat perhatian lebih mengenai pemerataan fasilitas pada tiap daerah untuk membangun provinsi yang baik dan membangun bangsa yang lebih baik.</p><p>Sekian ulasan singkat mengenai salah satu implementasi analisis kluster hirarki. Beberapa teori mungkin dapat dikembangkan dan di asah lebih lanjut hingga menghasilkan hasil yang lebih akurat.</p><p>Kritik dan saran sangat diperlukan untuk berkembangnya tulisan ini, terima kasih, <em>See you on the next post!</em></p><blockquote>I will be glad if you use references and include the address of this website in your research — writer</blockquote><p><strong>Referensi</strong></p><p>Muhammad Muhajir, S. M. (2021). MODUL PRAKTIKUM STATISTIKA MULTIVARIAT TERAPAN. Yogyakarta: UII.</p><p>Statistik Inferensial, “Hierarchical Clustering (Agglomerative Clustering) dengan Metode Complete Linkage”, <a href="https://youtu.be/e0R8BGJLRb0">https://youtu.be/e0R8BGJLRb0</a>, retrivied at 4 May 2023</p><p>Suryawati, Chriswardani, 2004, “Memahami Kemiskinan Secara Multidimensional”, Jurnal Manajemen Pembangunan dan Kebijakan, Volume 08, №03, Edisi September (121–129).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=43b2c1526215" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>