Instruksi Tugas untuk fakultas FIKTI dan FTI (kecuali jurusan yang
dituliskan diatas)
Buatlah laporan akhir yang menjelaskan langkah-langkah serta penjelasan tahapan yang
Anda lakukan pada praktikum ini, yang didalamnya menjawab beberapa pertanyaan
sebagai berikut
1. Rubahlah fitur cement menjadi fitur target class yang ingin Anda prediksi, dengan
nilai fitur > 281 merupakan kelas 1 dan < 281 menjadi nilai 0. Berapa akurasi model
dan nilai k untuk skenario ini?
2. Pada hasil diagram heatmap, terlihat banyak konfigurasi warna dan nilai yang
ditampilkan. Jelaskan arti kolom berwarna merah pada hasil diagram heatmap yang
dihasilkan! Pasangan variabel apa saja yang bernilai merah?
3. Apa yang terjadi jika, nilai test set diganti menjadi 0.3 kemudian 0.2 dan 0,1 ?
4. Buatlah tabel yang berisi hasil pengujian Anda dan sertakan berapa nilai k dan nilai
akurasi untuk masing-masing skenario uji.
5. Apakah terjadi perbedaan nilai akurasi model? Jika Ya, jelaskan pendapat Anda
mengapa hal tersebut bisa terjadi.
6. Berapa nilai presisi dan recall dari masing-masing model yang Anda coba serta
jelaskan arti dari nilai tersebut.
strength
0 29.89
1 23.51
2 29.22
3 45.85
4 18.29
Review Dataset
# Lihat deskripsi dari tiap kolom
data.describe()
(1030, 9)
Dataset preparation
# Buat salinan dataframe
df = data.copy(deep = True)
# mengubah/convert nilai "?" nilai ke bentuk Na / NaN untuk diproses
lebih lanjut
for col in data.columns:
df[[col]] = data[[col]].replace('?',np.NaN)
# temukan nilai null untuk semua atribut dan jumlahkan total nilai
null
null_data.isnull().sum()
cement 0
slag 471
ash 566
water 0
superplastic 379
coarseagg 0
fineagg 0
age 0
dtype: int64
cement 0
slag 0
ash 0
water 0
superplastic 0
coarseagg 0
fineagg 0
age 0
dtype: int64
StandardScaler adalah class dari sklearn untuk melakukan normalisasi data agar data yang
digunakan tidak memiliki penyimpangan yang besar.
# Import library standard scaler
Mengapa Menskalakan data untuk KNN? Ketika Anda menggunakan algoritma berbasis
jarak seperti KNN, proses penyesuaian skala data sangatlah penting karena akan
mempengaruhi nilai dari proses perhitungan jarak dilakukan dengan skala yang sama.
Sebagai ilustrasi perhitungan jarak menggunakan dua fitur yang besaran/rentangnya
sangat bervariasi dengan menggunakan perhitungan jarak eucledian. Jarak Euclidean =
[(100000–80000)^2 + (30–25)^2]^(1/2)
fitur dengan jangkauan yang lebih besar akan mendominasi atau mengecilkan fitur yang
lebih kecil sepenuhnya dan ini akan berdampak pada kinerja semua model berbasis jarak
karena akan memberikan bobot yang lebih tinggi pada variabel yang memiliki nilai yang
lebih tinggi.¶
# import library Ordinal Encoder dari package library
sklearn.preprocessing
from sklearn.preprocessing import OrdinalEncoder
ord_enc = OrdinalEncoder()
# enconde fitur kategoris/categorical features menjadi fitur
numerik/numerical features
for col in df_fe.columns[:]:
if df_fe[col].dtype == "object":
df_fe[col] = ord_enc.fit_transform(df_fe[[col]])
tentukan kolom cement sebagai kolom 'target' yang ingin di prediksi dengan threshold(batas
ambang) dari sebuah campuran semen yang di nilai kuat adalah yang memiliki nilai cement >
281.
Sehingga, selanjutnya kita akan melakukan proses encoding untuk kolom fitru cement,
dimana nilai yang > 281 akan diubah menjadi nilai 1 (yang berarti kuat) dan nilai <281
diubah menjadi nilai 0 (yang berarti kategori kurang kuat)
# Melakukan proses encoding untuk mengubah fitur cement menjadi nilai
biner.
df_cl["cement"] = np.where(df_cl["cement"]<281, 0, 1)
df_cl.head(10)
cement
1 0
9 0
10 0
14 0
15 0
23 0
29 0
35 0
37 0
39 0
(225, 2)
(225, 8)
(225, 2)
cement
0 0
1 0
2 0
3 0
4 0
Visualization
p = df_final.hist(figsize = (20,20))
Scatter matrix plot adalah plot yang digunakan untuk membuat sekumpulan scatter plot
dari beberapa pasang variabel. Hal ini sangat bermanfaat terutama ketika ingin
menganalisis bagaimana bentuk hubungan antar variabel. Plot ini sangat bermanfaat untuk
digunakan untuk data yang ukurannya tidak terlalu besar. Untuk menggunakan scatter
matrix kita harus memanggil fungsi scatter_matrix dari pandas.plotting
from pandas.plotting import scatter_matrix
p=scatter_matrix(df_final,figsize=(25, 25))
2. Penjelasan Diagram Heatmap
# Buat visualisasi korelasi data dengan heatmap
import seaborn as sns
import matplotlib.pyplot as plt
# plot heatmap
plt.figure(figsize=(12,10))
p=sns.heatmap(df_final.corr(), annot=True,cmap ='RdYlGn')
Koefisien Korelasi Pearson:
Koefisien pearson mambantu kita mengetahui keterhubungan antara dua fitur atau
variable. Nilai Koefisien Korelasi Pearson dapat berkisar antara -1 sampai +1. 1 berarti
sangat berkorelasi dan 0 berarti tidak ada korelasi.
Heatmap diatas merupakan hasil visualisasi representasi informasi dua dimensi dengan
bantuan gradasi warna untuk mempermudah interpretasi hasil.
Penjelasan:
• Warna merah pada diagram heatmap di atas adalah penunjuk untuk Nilai Koefisien
Korelasi Pearson yang paling kecil, atau nilai negatif terbesar mendekati -1. Hal ini
menunjukkan adanya hubungan linier negatif yang kuat antara dua variabel.
Artinya, jika satu variabel meningkat, maka variabel lainnya cenderung menurun
secara konsisten.
0 0
1 0
2 0
3 0
4 0
Name: cement, dtype: int64
for k in lrange:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_03, y_train_03.ravel())
y_pred = knn.predict(X_test_03)
scores.append(metrics.accuracy_score(y_test_03, y_pred))
knn = KNeighborsClassifier(13)
knn.fit(X_train_03, y_train_03)
accuracy_03 = knn.score(X_test_03, y_test_03)
print("Skor akurasi KNN pada test set 0.3 adalah: %.2f" % accuracy_03)
for k in lrange:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_02, y_train_02.ravel())
y_pred = knn.predict(X_test_02)
scores.append(metrics.accuracy_score(y_test_02, y_pred))
knn = KNeighborsClassifier(13)
knn.fit(X_train_02, y_train_02)
accuracy_02 = knn.score(X_test_02, y_test_02)
print("Skor akurasi KNN pada test set 0.2 adalah: %.2f" % accuracy_02)
for k in lrange:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_01, y_train_01.ravel())
y_pred = knn.predict(X_test_01)
scores.append(metrics.accuracy_score(y_test_01, y_pred))
knn = KNeighborsClassifier(13)
knn.fit(X_train_01, y_train_01)
accuracy_01 = knn.score(X_test_01, y_test_01)
print("Skor akurasi KNN pada test set 0.1 adalah: %.2f" % accuracy_01)
hasil_uji = {
'Test Set': ['0.3', '0.2', '0.1'],
'Nilai k KNN Optimal': [optimal_k_03, optimal_k_02, optimal_k_01],
'Skor Akurasi KNN': [accuracy_03, accuracy_02, accuracy_01]
}
+----+------------+-----------------------+--------------------+
| | Test Set | Nilai k KNN Optimal | Skor Akurasi KNN |
|----+------------+-----------------------+--------------------|
| 0 | 0.3 | 1 | 0.911765 |
| 1 | 0.2 | 1 | 0.888889 |
| 2 | 0.1 | 1 | 0.869565 |
+----+------------+-----------------------+--------------------+
Penjelasan:
• Dalam semua skenario pengujian, nilai k yang optimal adalah 1.
• Skor akurasi yang diperoleh untuk masing-masing skenario adalah 0.911765 untuk
test set 0.3, 0.888889 untuk test set 0.2, dan 0.869565 untuk test set 0.1.
Kesimpulan:
• Hasil pengujian tersebut menunjukkan bahwa model KNN dengan nilai k=1
memberikan hasil yang cukup baik dalam melakukan prediksi pada dataset yang
diuji, dengan skor akurasi yang relatif tinggi pada semua skenario pengujian.
• Semakin besar test set, semakin besar pula skor akurasi yang didapat.
accuracy 0.93 68
macro avg 0.91 0.90 0.91 68
weighted avg 0.93 0.93 0.93 68
Penjelasan:
• Model memiliki akurasi sebesar 93% pada test set 0.3.
• Model memiliki presisi yang tinggi untuk kedua kelas, yaitu 94% untuk kelas 0 dan
89% untuk kelas 1. Ini berarti sebagian besar prediksi positif adalah benar.
• Recall untuk kelas 0 adalah 96%, yang menunjukkan kemampuan model dalam
mengidentifikasi dengan benar sebagian besar data dengan label 0. Namun, recall
untuk kelas 1 adalah 84%, yang menunjukkan bahwa model sedikit lebih rendah
dalam mengidentifikasi dengan benar data dengan label 1. Keduanya masih
termasuk dalam kategori recall yang baik.
• Skor F1 untuk kedua kelas juga cukup baik, yaitu 0.95 untuk kelas 0 dan 0.86 untuk
kelas 1.
Secara keseluruhan, model menunjukkan kinerja yang baik dalam mengklasifikasikan data
# Test set 0.2
y_pred = knn.predict(X_test_02)
cnf_matrix = metrics.confusion_matrix(y_test_02, y_pred)
p = sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu",
fmt='g')
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
print(classification_report(y_test_02, y_pred))
accuracy 0.89 45
macro avg 0.87 0.85 0.86 45
weighted avg 0.89 0.89 0.89 45
Penjelasan:
• Model memiliki akurasi sebesar 89% pada test set 0.2.
• Presisi untuk kedua kelas adalah 91% untuk kelas 0 dan 83% untuk kelas 1. Ini
menunjukkan bahwa sebagian besar prediksi positif adalah benar.
• Recall untuk kelas 0 adalah 94%, yang menunjukkan kemampuan model dalam
mengidentifikasi dengan benar sebagian besar data dengan label 0. Namun, recall
untuk kelas 1 adalah 77%, yang menunjukkan bahwa model sedikit lebih rendah
dalam mengidentifikasi dengan benar data dengan label 1. Keduanya masih
termasuk dalam kategori recall yang baik.
• Skor F1 untuk kedua kelas juga cukup baik, yaitu 0.92 untuk kelas 0 dan 0.80 untuk
kelas 1.
Secara keseluruhan, model masih memiliki kinerja yang baik, meskipun sedikit lebih
rendah dibandingkan dengan test set sebelumnya.
# Test set 0.1
from sklearn import metrics
import seaborn as sns
import matplotlib.pyplot as plt
y_pred = knn.predict(X_test_01)
cnf_matrix = metrics.confusion_matrix(y_test_01, y_pred)
p = sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu",
fmt='g')
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
print(classification_report(y_test_01, y_pred))
accuracy 0.87 23
macro avg 0.84 0.80 0.82 23
weighted avg 0.87 0.87 0.87 23
Penjelasan:
• Model memiliki akurasi sebesar 87% pada test set 0.1.
• Presisi untuk kedua kelas adalah 89% untuk kelas 0 dan 80% untuk kelas 1. Ini
menunjukkan bahwa sebagian besar prediksi positif adalah benar.
• Recall untuk kelas 0 adalah 94%, yang menunjukkan kemampuan model dalam
mengidentifikasi dengan benar sebagian besar data dengan label 0. Namun, recall
untuk kelas 1 adalah 67%, yang menunjukkan bahwa model memiliki sedikit
kesulitan dalam mengidentifikasi dengan benar data dengan label 1. Keduanya
masih termasuk dalam kategori recall yang baik.
• Skor F1 untuk kedua kelas juga cukup baik, yaitu 0.91 untuk kelas 0 dan 0.73 untuk
kelas 1.
Meskipun kinerja model sedikit menurun dibandingkan dengan test set sebelumnya, model
masih mampu melakukan klasifikasi dengan baik.