Machine Learning With Python For Beginner
Machine Learning With Python For Beginner
Dadan Dahman W.
Feb 14, 2021
·
Membekali anda untuk memahami hal dasar terkait machine learning, baik teori maupun prosedur dalam membuat model
machine learning sederhana, serta contoh aplikasinya dalam penyelesaian permasalahan di Industri.
Photo by Katarzyna Pe on Unsplash
Membekali anda untuk memahami hal dasar terkait machine learning, baik teori maupun prosedur dalam membuat model machine
learning sederhana, serta contoh aplikasinya dalam penyelesaian permasalahan di Industri.
Prerequisites: Tidak ada persyaratan khusus dalam modul ini, tetapi sangat disarankan untuk memiliki pengetahuan dasar terkait
Data Manipulation with Pandas, Visualization with Matplotlib, Exploratory Data Analysis (EDA), dan statistik.
Ada beberapa modul yang akan kita pelajari pada artikel ini, diantaranya :
Baiklah, kita akan masuk modul pertama mengenai pengenalan machine learning.
TRAINING DATASET digunakan untuk membuat/melatih model machine learning, sedangkan TEST DATASET digunakan untuk
menguji performa/akurasi dari model yang telah dilatih/di-training.
Teknik atau pendekatan yang digunakan untuk membangun model disebut ALGORITHM seperti Decision Tree, K-NN, Linear
Regression, Random Forest, dsb. dan output atau hasil dari proses melatih algorithm dengan suatu dataset disebut MODEL.
Umumnya dataset disajikan dalam bentuk tabel yang terdiri dari baris dan kolom. Bagian Kolom
adalah FEATURE atau VARIABEL data yang dianalisa, sedangkan bagian baris adalah DATA
POINT/OBSERVATION/EXAMPLE.
Hal yang menjadi target prediksi atau hal yang akan diprediksi dalam machine learning disebut LABEL/CLASS/TARGET. Dalam
statistika/matematika, LABEL/CLASS/TARGET ini dinamakan dengan Dependent Variabel, dan FEATURE adalah Independent
Variabel.
Penting untuk diingat bahwa tidak ada ML algorithm yang cocok atau fit untuk diaplikasikan di semua problem. Oleh karena itu,
proses ini terkadang memerlukan trial & error seperti research, bahkan experienced data scientist pun tidak akan tahu apakah
algorithm itu akan tepat atau tidak jika tidak mencoba. Biasanya, data scientist akan mencoba beberapa algorithm dan
membandingkan performansi dari algorithm — algorithm tersebut. Algorithm dengan performansi yang paling baiklah yang dipilih
sebagai model.
Selain itu untuk supervised learning, jika LABEL dari dataset kalian berupa numerik atau kontinu variabel seperti harga, dan jumlah
penjualan, kita memilih metode REGRESI dan jika bukan numerik atau diskrit maka digunakan metode KLASIFIKASI. Untuk
unsupervised learning, seperti segmentasi customer, kita menggunakan metode CLUSTERING.
Eksplorasi Data & Data Pre-processing
Pertama, kita check dimensi data kita terlebih dahulu, silahkan load datanya dan gunakan .shape, .head(), .info(),
dan .describe() untuk mengeksplorasi dataset secara berurut. Dataset ini adalah data pembeli online yang mengunjungi website
dari suatu e-commerce selama setahun, yaitu ‘https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/
online_raw.csv'
import pandas as pd
dataset = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/online_raw.csv')
print('Shape dataset:', dataset.shape)
print('\nLima data teratas:\n', dataset.head())
print('\nInformasi dataset:')
print(dataset.info())
print('\nStatistik deskriptif:\n', dataset.describe())
Data eksplorasi tidaklah cukup dengan mengetahui dimensi data dan statistical properties saja, tetapi kita juga perlu sedikit
menggali tentang hubungan atau korelasi dari setiap feature, karena beberapa algorithm seperti linear regression dan logistic
regression akan menghasilkan model dengan performansi yang buruk jika kita menggunakan feature/variabel saling dependensi
atau berkorelasi kuat (multicollinearity). Jadi, jika kita sudah tahu bahwa data kita berkorelasi kuat, kita bisa menggunakan
algorithm lain yang tidak sensitif terhadap hubungan korelasi dari feature/variabel seperti decision tree.
dataset_corr = dataset.corr()
print('Korelasi dataset:\n', dataset.corr())
print('Distribusi Label (Revenue):\n', dataset['Revenue'].value_counts())
# Tugas praktek
print('\nKorelasi BounceRates-ExitRates:', dataset_corr.loc['BounceRates', 'ExitRates'])
print('\nKorelasi Revenue-PageValues:', dataset_corr.loc['Revenue', 'PageValues'])
print('\nKorelasi TrafficType-Weekend:', dataset_corr.loc['TrafficType', 'Weekend'])
output :
Korelasi dataset:
Administrative ... Revenue
Administrative 1.000000 ... 0.138631
Administrative_Duration 0.601466 ... 0.093395
Informational 0.376782 ... 0.095085
Informational_Duration 0.255757 ... 0.070250
ProductRelated 0.430832 ... 0.158280
ProductRelated_Duration 0.373647 ... 0.152130
BounceRates -0.223474 ... -0.150621
ExitRates -0.316192 ... -0.206886
PageValues 0.098771 ... 0.492569
SpecialDay -0.095054 ... -0.082305
OperatingSystems -0.006459 ... -0.014668
Browser -0.025243 ... 0.023984
Region -0.005680 ... -0.011595
TrafficType -0.033748 ... -0.005113
Weekend 0.026404 ... 0.029295
Revenue 0.138631 ... 1.000000
[16 rows x 16 columns]
Distribusi Label (Revenue):
False 10422
True 1908
Name: Revenue, dtype: int64
Misalnya kita ingin melihat distribusi label dalam bentuk visual, dan jumlah pembelian saat weekend. Kita dapat
memanfaatkan matplotlib library untuk membuat chart yang menampilkan perbandingan jumlah yang membeli (1) dan tidak
membeli (0), serta perbandingan jumlah pembelian saat weekend.
contoh :
output :
Tugas Praktek
Buatlah visualisasi berupa histogram yang menggambarkan jumlah customer untuk setiap Region. Dalam membuat visualisasi ini
aku akan menggunakan dataset[‘region’] untuk membuat histogram, dan berikan judul ‘Distribution of Customers’ pada title,
‘Region Codes’ sebagai label axis-x dan ‘Count Users’ sebagai label axis-y.
output :
Handling Missing Value
Setelah kita melakukan eksplorasi data, kita akan melanjutkan ke tahap data pre-processing. Seperti yang saya jelaskan
sebelumnya, raw data kita belum tentu bisa langsung digunakan untuk pemodelan. Jika kita memiliki banyak missing value, maka
akan mengurangi performansi model dan juga beberapa algorithm machine learning tidak dapat memproses data dengan missing
value. Oleh karena itu, kita perlu mengecek apakah terdapat missing value dalam data atau tidak. Jika tidak, maka kita tidak perlu
melakukan apa-apa dan bisa melanjutkan ke tahap berikutnya. Jika ada, maka kita perlu melakukan treatment khusus untuk
missing value ini.
contoh :
output :
Ada beberapa metode yang dapat kita lakukan untuk menangani missing value, menghapus data adalah salah satunya. Tetapi,
metode ini tidak dapat serta merta diimplementasikan. Kita juga perlu menganalisis penyebaran missing value, dan berapa persen
jumlah missing value dalam data kita.
Metode ini dapat diterapkan jika tidak banyak missing value dalam data, sehingga walaupun data point ini dihapus, kita masih
memiliki sejumlah data yang cukup untuk melatih model Machine Learning. Tetapi jika kita memiliki banyak missing value dan
tersebar di setiap variabel, maka metode menghapus missing value tidak dapat digunakan. Kita akan kehilangan sejumlah data
yang tentunya mempengaruhi performansi model. Kita bisa menghapus data point yang memiliki missing value dengan
fungsi .dropna( ) dari pandas library. Fungsi dropna( ) akan menghapus data point atau baris yang memiliki missing value.
#Drop rows with missing value
dataset_clean = dataset.dropna()
print('Ukuran dataset_clean:', dataset_clean.shape)Output :Ukuran dataset_clean: (12316, 18)
Kita bisa menggunakan metode impute missing value, yaitu mengisi record yang hilang ini dengan suatu nilai. Ada berbagai
teknik dalam metode imputing, mulai dari yang paling sederhana yaitu mengisi missing value dengan nilai mean, median, modus,
atau nilai konstan, sampai teknik paling advance yaitu dengan menggunakan nilai yang diestimasi oleh suatu predictive model.
contoh :
print("Before imputation:")
# Checking missing value for each feature
print(dataset.isnull().sum())
# Counting total missing value
print(dataset.isnull().sum().sum())print("\nAfter imputation:")
# Fill missing value with mean of feature value
dataset.fillna(dataset.mean(), inplace = True)
# Checking missing value for each feature
print(dataset.isnull().sum())
# Counting total missing value
print(dataset.isnull().sum().sum())
output :
Before imputation:
Administrative 14
Administrative_Duration 14
Informational 14
Informational_Duration 14
ProductRelated 14
ProductRelated_Duration 14
BounceRates 14
ExitRates 14
PageValues 0
SpecialDay 0
Month 0
OperatingSystems 0
Browser 0
Region 0
TrafficType 0
VisitorType 0
Weekend 0
Revenue 0
dtype: int64
112
After imputation:
Administrative 0
Administrative_Duration 0
Informational 0
Informational_Duration 0
ProductRelated 0
ProductRelated_Duration 0
BounceRates 0
ExitRates 0
PageValues 0
SpecialDay 0
Month 0
OperatingSystems 0
Browser 0
Region 0
TrafficType 0
VisitorType 0
Weekend 0
Revenue 0
dtype: int64
0
Scaling
Setelah berhasil menangani missing value, sekarang kita akan mempelajari tahapan preprocessing selanjutnya. Rentang nilai dari
setiap feature cukup bervariasi. Misalnya, ProductRelated_Duration vs BounceRates. ProductRelated_Duration memiliki rentang
nilai mulai dari 0–5000; sedangkan BounceRates rentang nilainya 0–1
Beberapa machine learning seperti K-NN dan gradient descent mengharuskan semua variabel memiliki rentang nilai yang sama,
karena jika tidak sama, feature dengan rentang nilai terbesar misalnya ProductRelated_Duration otomatis akan menjadi feature
yang paling mendominasi dalam proses training/komputasi, sehingga model yang dihasilkan pun akan sangat bias. Oleh karena
itu, sebelum memulai training model, kita terlebih dahulu perlu melakukan data rescaling ke dalam rentang 0 dan 1, sehingga
semua feature berada dalam rentang nilai tersebut, yaitu nilai max = 1 dan nilai min = 0. Data rescaling ini dengan mudah dapat
dilakukan di Python menggunakan .MinMaxScaler( ) dari Scikit-Learn library.
Kenapa ke range 0–1, tidak menggunakan range yang lain? Karena rumus dari rescaling adalah :
dengan rumus ini, nilai max data akan menjadi 1 dan nilai min menjadi 0; dan nilai lainnya berada di rentang keduanya. Rumus ini
tidak memungkinkan adanya rentang nilai selain 0–1
Proses scaling hanya bisa dilakukan untuk feature dengan tipe numerik, ketika terdapat feature dengan tipe string atau karakter
dan categorical, seperti Month, VisitorType, Region. Maka kita perlu menyeleksi feature — feature dari dataset yang bertipe
numerik.
contoh :
output :
min max
Administrative 0.0 1.0
Administrative_Duration 0.0 1.0
Informational 0.0 1.0
Informational_Duration 0.0 1.0
ProductRelated 0.0 1.0
ProductRelated_Duration 0.0 1.0
BounceRates 0.0 1.0
ExitRates 0.0 1.0
PageValues 0.0 1.0
contoh :
import numpy as np
from sklearn.preprocessing import LabelEncoder
# Convert feature/column 'Month'
LE = LabelEncoder(
dataset['Month'] = LE.fit_transform(dataset['Month'])
print(LE.classes_)
print(np.sort(dataset['Month'].unique()))
print('')# Convert feature/column 'VisitorType'
LE = LabelEncoder()
dataset['VisitorType'] = LE.fit_transform(dataset['VisitorType'])
print(LE.classes_)
print(np.sort(dataset['VisitorType'].unique()))
output :
['Aug' 'Dec' 'Feb' 'Jul' 'June' 'Mar' 'May' 'Nov' 'Oct' 'Sep']
[0 1 2 3 4 5 6 7 8 9]
contoh :
Perbandingan lain yang biasanya digunakan adalah 75:25. Hal penting yang perlu diketahui adalah scikit-learn tidak dapat
memproses dataframe dan hanya mengakomodasi format data tipe Array. Tetapi kalian tidak perlu khawatir,
fungsi train_test_split( ) dari Scikit-Learn, otomatis mengubah dataset dari dataframe ke dalam format array.
contoh :
True Negative (TN): Jika user diprediksi tidak (Negatif) membeli dan aktualnya user tersebut memang (True) membeli.
False Positive (FP): Jika user diprediksi Positif membeli, tetapi ternyata tidak membeli (False).
False Negatif (FN): Jika user diprediksi tidak membeli (Negatif), tetapi ternyata sebenarnya membeli.
Untuk menampilkan confusion matrix cukup menggunakan fungsi confusion_matrix() dari Scikit-Learn.
Tidak perlu menghitung nilai ini secara manual. Cukup gunakan fungsi classification_report() untuk memunculkan hasil
perhitungan metrik — metrik tersebut.
# classification report
print('\nClassification report:')
cr = classification_report(y_test, y_pred)
print(cr)
Dalam suatu problem, jika lebih memilih False Positif lebih baik terjadi daripada False Negatif, misalnya: Dalam kasus Fraud/Scam,
kecenderungan model mendeteksi transaksi sebagai fraud walaupun kenyataannya bukan, dianggap lebih baik, daripada transaksi
tersebut tidak terdeteksi sebagai fraud tetapi ternyata fraud. Untuk problem ini sebaiknya menggunakan Recall.
Sebaliknya, jika lebih menginginkan terjadinya True Negatif dan sangat tidak menginginkan terjadinya False Positif, sebaiknya
menggunakan Precision.
Contohnya adalah pada kasus klasifikasi email SPAM atau tidak. Banyak orang lebih memilih jika email yang sebenarnya SPAM
namun diprediksi tidak SPAM (sehingga tetap ada pada kotak masuk email kita), daripada email yang sebenarnya bukan SPAM
tapi diprediksi SPAM (sehingga tidak ada pada kotak masuk email).
Contoh continuous value adalah harga rumah, harga saham, suhu, dsb; dan contoh dari categorical value adalah prediksi SPAM or
NOT SPAM (1 dan 0) atau prediksi customer SUBSCRIBE atau UNSUBSCRIBED (1 dan 0).
Umumnya Logistic Regression dipakai untuk binary classification (1/0; Yes/No; True/False) problem, tetapi beberapa data scientist
juga menggunakannya untuk multiclass classification problem. Logistic regression adalah salah satu linear classifier, oleh karena
itu, Logistik regression juga menggunakan rumus atau fungsi yang sama seperti linear regression yaitu:
Output dari Logistic Regression adalah 1 atau 0; sehingga real value dari fungsi logit ini perlu ditransfer ke nilai di antara 1 dan 0
dengan menggunakan fungsi sigmoid.
Jadi, jika output dari fungsi sigmoid bernilai lebih dari 0.5, maka data point diklasifikasi ke dalam label/class: 1 atau YES; dan
kurang dari 0.5, akan diklasifikasikan ke dalam label/class: 0 atau NO.
Note : Logistic Regression hanya dapat mengolah data dengan tipe numerik. Pada saat preparasi data, pastikan untuk mengecek
tipe variabel yang ada dalam dataset dan pastikan semuanya adalah numerik, lakukan data transformasi jika diperlukan.
Kemudian, model yang sudah ditraining ini bisa digunakan untuk memprediksi output/label dari test dataset sekaligus
mengevaluasi model performance dengan fungsi score(), confusion_matrix() dan classification_report().
Decision Node paling atas dalam decision tree dikenal sebagai akar keputusan, atau feature utama yang menjadi asal mula
percabangan. Jadi, decision tree membagi data ke dalam kelompok atau kelas berdasarkan feature/variable input, yang dimulai
dari node paling atas (akar), dan terus bercabang ke bawah sampai dicapai cabang akhir atau leaf.
Misalnya ingin memprediksi apakah seseorang yang mengajukan aplikasi kredit/pinjaman, layak untuk mendapat pinjaman
tersebut atau tidak. Dengan menggunakan decision tree, dapat membreak-down kriteria-kriteria pengajuan pinjaman ke dalam
hierarki seperti gambar berikut :
Seumpama, orang yang mengajukan berumur lebih dari 40 tahun, dan memiliki rumah, maka aplikasi kreditnya dapat diluluskan,
sedangkan jika tidak, maka perlu dicek penghasilan orang tersebut. Jika kurang dari 5000, maka permohonan kreditnya akan
ditolak. Dan jika usia kurang dari 40 tahun, maka selanjutnya dicek jenjang pendidikannya, apakah universitas atau secondary.
Nah, percabangan ini masih bisa berlanjut hingga dicapai percabangan akhir/leaf node.
Seperti yang sudah dilakukan dalam prosedur pemodelan machine learning, selanjutnya dapat dengan mudah melakukan
pemodelan decision tree dengan menggunakan scikit-learn module, yaitu DecisionTreeClassifier.
Contoh :
Dengan menggunakan dataset online_raw.csv dan diasumsikan sudah melakukan EDA dan pre-processing, kita akan membuat
model machine learning dengan menggunakan decision tree :
Adapun model regresi yang paling umum digunakan adalah Linear Regression.
Linear regression digunakan untuk menganalisis hubungan linear antara dependent variabel (feature) dan independent variabel
(label). Hubungan linear disini berarti bahwa jika nilai dari independen variabel mengalami perubahan baik itu naik atau turun,
maka nilai dari dependen variabel juga mengalami perubahan (naik atau turun). Rumus matematis dari Linear Regression adalah:
untuk multiple linear regression dengan, y adalah target/label, X adalah feature, dan a,b adalah model parameter (intercept dan
slope).
Perlu diketahui bahwa tidak semua problem dapat diselesaikan dengan linear regression. Untuk pemodelan dengan linear
regression, terdapat beberapa asumsi yang harus dipenuhi, yaitu :
1. Terdapat hubungan linear antara variabel input (feature) dan variabel output(label). Untuk melihat hubungan linear feature dan
label, dapat menggunakan chart seperti scatter chart. Untuk mengetahui hubungan dari variabel umumnya dilakukan pada
tahap eksplorasi data.
2. Tidak ada multicollinearity antara features. Multicollinearity artinya terdapat dependency antara feature, misalnya saja hanya
bisa mengetahui nilai feature B jika nilai feature A sudah diketahui.
3. Tidak ada autocorrelation dalam data, contohnya pada time-series data.
Pemodelan Linear regression menggunakan scikit-learn tidaklah sulit. Secara prosedur serupa dengan pemodelan logistic
regression. Cukup memanggil LinearRegression dengan terlebih dahulu meng-import fungsi tersebut :
Contoh :
1. Pisahkan dataset ke dalam Feature dan Label, gunakan fungsi .drop(). Pada dataset ini, label/target adalah variabel MEDV
2. Checking dan print jumlah data setelah Dataset pisahkan ke dalam Feature dan Label, gunakan .shape()
3. Bagi dataset ke dalam Training dan test dataset, 70% data digunakan untuk training dan 30% untuk testing, gunakan
fungsi train_test_split() , dengan random_state = 0
4. Checking dan print kembali jumlah data dengan fungsi .shape()
5. Import LinearRegression dari sklearn.linear_model
6. Deklarasikan LinearRegression regressor dengan nama reg
7. Fit regressor ke training dataset dengan .fit(), dan gunakan .predict() untuk memprediksi nilai dari testing dataset.
#load dataset
import pandas as pd
housing = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/housing_boston.csv')
#Data rescaling
from sklearn import preprocessing
data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
housing[['RM','LSTAT','PTRATIO','MEDV']] = data_scaler.fit_transform(housing[['RM','LSTAT','PTRATIO','MEDV']])
# getting dependent and independent variables
X = housing.drop(['MEDV'], axis = 1)
y = housing['MEDV']
# checking the shapes
print('Shape of X:', X.shape)
print('Shape of y:', y.shape)# splitting the data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
# checking the shapes
print('Shape of X_train :', X_train.shape)
print('Shape of y_train :', y_train.shape)
print('Shape of X_test :', X_test.shape)
print('Shape of y_test :', y_test.shape)##import regressor from Scikit-Learn
from sklearn.linear_model import LinearRegression
# Call the regressor
reg = LinearRegression()
# Fit the regressor to the training data
reg = reg.fit(X_train,y_train)
# Apply the regressor/model to the test data
y_pred = reg.predict(X_test)
Semakin kecil nilai MSE, RMSE, dan MAE, semakin baik pula performansi model regresi. Untuk menghitung nilai MSE, RMSE dan
MAE dapat dilakukan dengan menggunakan fungsi mean_squared_error () , mean_absolute_error () dari scikit-
learn.metrics dan untuk RMSE sendiri tidak terdapat fungsi khusus di scikit-learn tapi dapat dengan mudah kita hitung dengan
terlebih dahulu menghitung MSE kemudian menggunakan numpy module yaitu, sqrt() untuk memperoleh nilai akar kuadrat dari
MSE.
Tugas Praktek
Kalau kita sudah paham evaluasi performa model regresi, sekaligus kita coba hitung nilai MSE, MAE, dan RMSE dari linear
modelnya.
Unsupervised Learning adalah teknik machine learning dimana tidak terdapat label atau output yang digunakan untuk melatih
model. Jadi, model dengan sendirinya akan bekerja untuk menemukan pola atau informasi dari dataset yang ada. Metode
unsupervised learning yang dikenal dengan clustering. Sesuai dengan namanya, Clustering memproses data dan
mengelompokkannya atau mengcluster objek/sample berdasarkan kesamaan antar objek/sampel dalam satu kluster, dan
objek/sample ini cukup berbeda dengan objek/sample di kluster yang lain. Contohnya pada gambar berikut:
Pada awalnya kita tidak mengetahui bagaimana pola dari objek/sample, termasuk juga tidak mengetahui bagaimana kesamaan
maupun perbedaan antara objek yang satu dengan objek yang lain. Setelah dilakukan clustering, baru dapat terlihat bawah
objek/sample tersebut dapat dikelompokkan ke dalam 3 kluster. Untuk menjelaskan tentang metode Clustering, kita akan
menggunakan metode clustering yang sangat populer, yaitu K-Means Algorithm yang akan kita praktikkan nanti.
K-Means Clustering
K-Means merupakan tipe clustering dengan centroid based (titik pusat). Artinya kesamaan dari objek/sampel dihitung dari
seberapa dekat objek itu dengan centroid atau titik pusat. Untuk menghitung kedekatan, digunakan perhitungan jarak antar 2 buah
data atau jarak Minkowski.
xi , xj adalah dua buah data yang akan dihitung jaraknya, dan p = dimensi/jumlah dari data
Untuk menentukan centroid, pada awalnya kita perlu mendefinisikan jumlah centroid (K) yang diinginkan, semisalnya kita
menetapkan jumlah K = 3; maka pada awal iterasi, algorithm akan secara random menentukan 3 centroid. Setelah itu,
objek/sample/data point yang lain akan dikelompokkan sebagai anggota dari salah satu centroid yang terdekat, sehingga terbentuk
3 cluster data.
Iterasi selanjutnya, titik-titik centroid diupdate atau berpindah ke titik yang lain, dan jarak dari data point yang lain ke centroid yang
baru dihitung kembali, kemudian dikelompokkan kembali berdasarkan jarak terdekat ke centroid yang baru. Iterasi akan terus
berlanjut hingga diperoleh cluster dengan error terkecil, dan posisi centroid tidak lagi berubah.
Contoh :
Dataset ini merupakan data customer suatu mall dan berisi basic informasi customer berupa : CustomerID, age, gender, annual
income, dan spending score. Adapun tujuan dari clustering adalah untuk memahami customer — customer mana saja yang sering
melakukan transaksi sehingga informasi ini dapat diberikan kepada marketing team untuk membuat strategi promosi yang sesuai
dengan karakteristik customer. Kita akan melakukan segmentasi customer, dengan memanfaatkan fungsi KMeans dari Scikit-
Learn.cluster
Jawab :
#import library
import pandas as pd
from sklearn.cluster import KMeans#load dataset
dataset = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/mall_customers.csv')#selecting
features
X = dataset[['annual_income','spending_score']]#Define KMeans as cluster_model
cluster_model = KMeans(n_clusters = 5, random_state = 24)
labels = cluster_model.fit_predict(X)
Jika sudah membuat cluster, kemudian visualisasikan hasil dari clustering yang telah di lakukan sebelumnya.
Jawab :
#import library
import matplotlib.pyplot as plt#convert dataframe to array
X = X.values
#Separate X to xs and ys --> use for chart axis
xs = X[:,0]
ys = X[:,1]
# Make a scatter plot of xs and ys, using labels to define the colors
plt.scatter(xs,ys,c=labels, alpha=0.5)# Assign the cluster centers: centroids
centroids = cluster_model.cluster_centers_
# Assign the columns of centroids: centroids_x, centroids_y
centroids_x = centroids[:,0]
centroids_y = centroids[:,1]# Make a scatter plot of centroids_x and centroids_y
plt.scatter(centroids_x,centroids_y,marker='D', s=50)
plt.title('K Means Clustering', fontsize = 20)
plt.xlabel('Annual Income')
plt.ylabel('Spending Score')
plt.show()
Output :
Measuring Cluster Criteria
Clustering yang baik adalah cluster yang data point-nya saling rapat/sangat berdekatan satu sama lain dan cukup berjauhan
dengan objek/data point di cluster yang lain. Jadi, objek dalam satu cluster tidak tersebut berjauhan.
Inertia sendiri mengukur seberapa besar penyebaran object/data point data dalam satu cluster, semakin kecil nilai inertia maka
semakin baik. Kita tidak perlu bersusah payah menghitung nilai inertia karena secara otomatis, telah dihitung oleh KMeans( ) ketika
algorithm di fit ke dataset. Untuk mengecek nilai inertia cukup dengan print fungsi .inertia_ dari model yang sudah di fit ke dataset.
Meskipun suatu clustering dikatakan baik jika memiliki inertia yang kecil tetapi secara praktikal in real life, terlalu banyak cluster
juga tidak diinginkan. Adapun rule untuk memilih jumlah cluster yang optimal adalah dengan memilih jumlah cluster yang terletak
pada “elbow” dalam intertia plot, yaitu ketika nilai inertia mulai menurun secara perlahan. Jika dilihat pada gambar maka jumlah
cluster yang optimal adalah K = 3.
Contoh :
Buatlah inertia plot untuk melihat apakah K = 5 merupakan jumlah cluster yang optimal.
1. Pertama — tama, buatlah sebuah list kosong yang dinamakan ‘inertia’. List ini akan kita gunakan untuk menyimpan nilai inertia
dari setiap nilai K.
2. Gunakan for untuk membuat looping dengan range 1–10. Sebagai index looping gunakan k
3. Di dalam fungsi looping, deklarasikan KMeans() dengan nama cluster_model dan gunakan n_cluster = k, dan random_state =
24
4. Gunakan fungsi .fit() dari cluster_model pada ‘X’
5. Dari dari cluster_model yang sudah di-fit ke dataset, dapatkan nilai inertia menggunakan inertia_ dan deklarasikan
sebagai inertia_value
6. Append inertia_value ke dalam list ‘inertia’
7. Setelah iterasi/looping selesai plotlah list ‘inertia’ tadi sebagai ordinat-nya dan absica-nya adalah range(1, 10).
Jawab :
#import library
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt#Elbow Method - Inertia plot
inertia = []
#looping the inertia calculation for each k
for k in range(1, 10):
#Assign KMeans as cluster_model
cluster_model = KMeans(n_clusters = k, random_state = 24)
#Fit cluster_model to X
cluster_model.fit(X)
#Get the inertia value
inertia_value = cluster_model.inertia_
#Append the inertia_value to inertia list
inertia.append(inertia_value)
##Inertia plot
plt.plot(range(1, 10), inertia)
plt.title('The Elbow Method - Inertia plot', fontsize = 20)
plt.xlabel('No. of Clusters')
plt.ylabel('Inertia')
plt.show()
Output :
Mini Quiz
“Ini saya baru dapat kiriman data dari e-commerce kita. Divisi e-commerce kita ingin memprediksi apakah user- user yang sedang
mengunjungi halaman website yang baru akan mengklik banner promo (ads) di halaman tersebut atau tidak berdasarkan feature
yang ada. Tolong buatkan machine learning model untuk menyelesaikan permasalahan dari e-commerce kita ini ya.”
1. ‘Daily Time Spent on Site’ : lama waktu user mengunjungi site (menit)
2. ‘Age’ : usia user (tahun)
3. ‘Area Income’ : rata — rata pendapatan di daerah sekitar user
4. ‘Daily Internet Usage’ : rata — rata waktu yang dihabiskan user di internet dalam sehari (menit)
5. ‘Ad Topic Line’ : topik/konten dari promo banner
6. ‘City’ : kota dimana user mengakses website
7. ‘Male’ : apakah user adalah Pria atau bukan
8. ‘Country’ : negara dimana user mengakses website
9. ‘Timestamp’ : waktu saat user mengklik promo banner atau keluar dari halaman website tanpa mengklik banner
10. ‘Clicked on Ad’ : mengindikasikan user mengklik promo banner atau tidak (0 = tidak; 1 = klik).
Di proyek ini, aku diharapkan untuk membuat machine learning model sesuai dengan prosedur machine learning yang sudah
disharing sebelumnya. Jadi, tahap — tahap yang perlu dilakukan adalah (langkah ke-1) terlebih dahulu
Jawab :
#import library
import pandas as pd# Baca data 'ecommerce_banner_promo.csv'
data = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/ecommerce_banner_promo.csv')#1.
Data eksplorasi dengan head(), info(), describe(), shape
print("\n[1] Data eksplorasi dengan head(), info(), describe(), shape")
print("Lima data teratas:")
print(data.head())
print("Informasi dataset:")
print(data.info())
print("Statistik deskriptif dataset:")
print(data.describe())
print("Ukuran dataset:")
print(data.shape)
2. Data eksplorasi dengan dengan mengecek korelasi dari setiap feature menggunakan fungsi corr()
Jawab :
#2. Data eksplorasi dengan dengan mengecek korelasi dari setiap feature menggunakan fungsi corr()
print("\n[2] Data eksplorasi dengan dengan mengecek korelasi dari setiap feature menggunakan fungsi corr()")
print(data.corr())#3. Data eksplorasi dengan mengecek distribusi label menggunakan fungsi groupby() dan size()
print("\n[3] Data eksplorasi dengan mengecek distribusi label menggunakan fungsi groupby() dan size()")
print(data.groupby('Clicked on Ad').size())
Jumlah user dibagi ke dalam rentang usia menggunakan histogram (hist()), gunakan bins = data.Age.nunique() sebagai
argumen. nunique() adalah fungsi untuk menghitung jumlah data untuk setiap usia (Age).
Gunakan pairplot() dari seaborn modul untuk menggambarkan hubungan setiap feature.
Jawab :
#import library
import matplotlib.pyplot as plt
import seaborn as sns# Seting: matplotlib and seaborn
sns.set_style('whitegrid')
plt.style.use('fivethirtyeight')#4. Data eksplorasi dengan visualisasi
#4a. Visualisasi Jumlah user dibagi ke dalam rentang usia (Age) menggunakan histogram (hist()) plot
plt.figure(figsize=(10, 5))
plt.hist(data['Age'], bins = data.Age.nunique())
plt.xlabel('Age')
plt.tight_layout()
plt.show()#4b. Gunakan pairplot() dari seaborn (sns) modul untuk menggambarkan hubungan setiap feature.
plt.figure()
sns.pairplot(data)
plt.show()
Case Study: Promos for our e-commerce — Part 4
Di bagian proyek (langkah ke-5) ini kita akan mengecek apakah terdapat missing value dari data, jika terdapat missing value dapat
dilakukan treatment seperti didrop atau diimputasi dan jika tidak maka dapat melanjutkan ke langkah berikutnya.
Jawab :
6. Lakukan pemodelan dengan Logistic Regression, gunakan perbandingan 80:20 untuk training vs testing :
1. Deklarasikan data ke dalam X dengan mendrop feature/variabel yang bukan numerik, (type = object) dari data (Logistic
Regression hanya dapat memproses numerik variabel). Assign Target/Label feature dan assign sebagai y
2. Split X dan y ke dalam training dan testing dataset, gunakan perbandingan 80:20 dan random_state = 42
3. Assign classifier sebagai logreg, kemudian fit classifier ke X_train dan predict dengan X_test. Print evaluation score.
Jawab :
#import library
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression#6.Lakukan pemodelan dengan Logistic Regression, gunakan perbandingan
80:20 untuk training vs testing
print("\n[6] Lakukan pemodelan dengan Logistic Regression, gunakan perbandingan 80:20 untuk training vs testing")
#6a.Drop Non-Numerical (object type) feature from X, as Logistic Regression can only take numbers, and also drop Target/label,
assign Target Variable to y.
X = data.drop(['Ad Topic Line','City','Country','Timestamp','Clicked on Ad'], axis = 1)
y = data['Clicked on Ad']#6b. splitting the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 42)#6c. Modelling
# Call the classifier
logreg = LogisticRegression()
# Fit the classifier to the training data
logreg = logreg.fit(X_train,y_train)
# Prediksi model
y_pred = logreg.predict(X_test)#6d. Evaluasi Model Performance
print("Evaluasi Model Performance:")
print("Training Accuracy :", logreg.score(X_train, y_train))
print("Testing Accuracy :", logreg.score(X_test, y_test))
Jawab :
# Import library
from sklearn.metrics import confusion_matrix, classification_report#7. Print Confusion matrix dan classification report
print("\n[7] Print Confusion matrix dan classification report")#apply confusion_matrix function to y_test and y_pred
print("Confusion matrix:")
cm = confusion_matrix(y_test, y_pred)
print(cm)#apply classification_report function to y_test and y_pred
print("Classification report:")
cr = classification_report(y_test, y_pred)
print(cr)
Baiklah, sekian untuk materi ini, pada tahap selanjutnya saya akan berbagi ilmu dan pengalaman mengenai Data Visualization
menggunakan Library Python Matplotlib.