1  Klasifikasi Varietas Kismis Menggunakan Model Logistic Regression

1.1 Business Understanding

1.1.1 Determine Business Objective (Menentukan Objek Bisnis)

1.1.1.1 Background

Kismis sebagai produk makanan khas Turki, memiliki peran penting dalam produksi kismis global. Penilaian kualitas kismis saat ini memerlukan waktu dan dapat tidak konsisten. Penelitian ini bertujuan untuk memanfaatkan ekstraksi fitur morfologis dari dataset kismis untuk mengembangkan model Logistic Regression (LR) yang dapat mengklasifikasikan varietas Kecimen dan Besni.

1.1.1.2 Business Objectives

  1. Membangun model Logistic Regression untuk mengklasifikasikan raisin berdasarkan fitur morfologis.
  • Model Logistic Regression dipilih karena sederhana dan dapat memberikan hasil yang baik.
  • Fokus pada efisiensi dan kecepatan evaluasi kualitas raisin.
  1. Menyediakan solusi evaluasi kualitas raisin yang cepat dan konsisten.
  • Meningkatkan kecepatan dan konsistensi dalam menilai kualitas raisin.
  1. Eksplorasi potensi penerapan model pada produk-produk lain di Turki.
  • Memaksimalkan hasil dan manfaat model pada produk-produk serupa.

1.1.1.3 Business Success Criteria

  • Kemampuan model atau analisis untuk membedakan dengan baik antara varietas Kecimen dan Besni berdasarkan 7 fitur morfologi yang diekstrak.
  • Minimal 80% akurasi dalam mengklasifikasikan varietas raisin.
  • Reduksi waktu penilaian kualitas raisin dari metode tradisional.
  • Model dapat diadaptasi untuk produk-produk serupa dengan tingkat akurasi minimal 80%.

1.1.2 Asses Situation

1.1.2.1 Inventory of Resources

  1. Personel
  • Independen, menggabungkan peran sebagai data analyst, ahli bisnis, dan dukungan teknis.
  1. Data
  • Terdapat 900 butir kismis, dengan 450 butir dari varietas Kecimen dan 450 dari varietas Besni.
  • Data gambar telah mengalami tahap pra-pemrosesan dan ekstraksi fitur, menghasilkan 7 fitur morfologi.
  1. Sumber Daya Komputasi
  • Google Colab digunakan sebagai platform untuk menjalankan algoritma data mining.
  • Scikit-learn library digunakan untuk eksekusi algoritma.
  1. Perangkat Lunak * Antarmuka pengguna diimplementasikan menggunakan Streamlit

1.1.2.2 Requirements, Assumptions & Constraints

  1. Persyaratan Proyek
  1. Asumsi Proyek
  1. Kendala Proyek

1.1.2.3 Risks and Contingencies

  1. Risiko Proyek
  • Kualitas data yang rendah atau tidak sesuai.
  1. Kontinjensi
  • Pengembangan rencana untuk mengatasi risiko kualitas data dengan Data cleaning dan preprocessing tambahan.

1.1.2.4 Terminology

  1. Glosarium Istilah Bisnis
  • Varietas Kecimen dan Besni: Jenis kismis yang tumbuh di Turki.
  • Morfologi: Karakteristik fisik dan bentuk dari gambar raisin.
  • Proses pra-pemrosesan: Tahapan awal dalam persiapan data untuk analisis.
  • Evaluasi kualitas: Proses penilaian untuk menilai sejauh mana hasil analisis atau model memenuhi standar atau kriteria tertentu, melibatkan aspek seperti akurasi, relevansi, dan keberhasilan terhadap tujuan bisnis.
  1. Glosarium Istilah Data Mining
  • Ekstraksi Fitur Morfologi: Proses mengidentifikasi dan mengekstrak fitur-fitur penting dari gambar raisin.
  • Algoritma Data Mining: Metode matematis dan statistik untuk menghasilkan model dari dataset.
  • Evaluasi Model: Proses penilaian terhadap kinerja model data mining, mencakup pengukuran akurasi, presisi, recall, dan metrik lainnya untuk menentukan sejauh mana model dapat diandalkan dan efektif dalam menyelesaikan tugas yang dihadapi.

1.1.2.5 Costs and Benefits

Analisis Biaya-Manfaat * Biaya proyek: Terbatas pada upaya manusia, pelatihan, dan pemeliharaan. * Manfaat bisnis: Diukur dari potensi peningkatan efisiensi produksi, evaluasi kualitas raisin, dan potensi penggunaan model pada produk serupa.

1.1.3 Determine Data Mining Goals

1.1.3.1 Data Mining Goals

  • Menganalisis dataset raisin untuk mengidentifikasi perbedaan morfologi antara varietas Kecimen dan Besni.
  • Membangun model data mining yang dapat memprediksi varietas kismis berdasarkan fitur morfologi.
  • Mengembangkan model Logistic Regression untuk mengklasifikasikan varietas raisin berdasarkan fitur morfologis.
  • Mengevaluasi performa model berdasarkan kriteria keberhasilan teknis.

1.1.3.2 Data Mining Success Criteria

  • Akurasi prediksi model data mining mencapai akurasi minimal 80%.
  • Kemampuan model untuk mengidentifikasi dan memahami perbedaan morfologi yang signifikan.
  • Keterpenuhan persyaratan teknis dan jadwal penyelesaian proyek.

1.1.4 Produce Project Plan

1.1.4.1 Project Plan

1.1.4.2 Initial Assessment of Tools, and Techniques

  • Memilih Python sebagai bahasa pemrograman utama.
  • Menggunakan scikit-learn library untuk implementasi Logistic Regression.

1.2 Data Understanding

1.2.1 Collect Initial Data

from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# Baca dataset ke dalam DataFrame
data = pd.read_excel('/content/drive/MyDrive/psd/raisin/Raisin_Dataset.xlsx')

1.2.1.1 Initial Data Collection Report

  • Sumber data: Dataset raisin diperoleh dari sumber penelitian yang melakukan ekstraksi fitur morfologi terhadap foto 900 butir kismis (450 dari varietas Kecimen dan 450 dari varietas Besni) dengan melakukan image processing.
  • Lokasi dataset: Turki.
  • Metode perolehan data: Pengunduhan dataset dari UCI Machine Learning (https://archive.ics.uci.edu/dataset/850/raisin).
  • Masalah yang dihadapi: Tidak ada masalah yang dihadapi selama perolehan data.

1.2.2 Describe Data

Raisin dataset diperoleh dari hasil Computer Vision System (CVS) dari gambar varietas kismis Kecimen dan Besni yang tumbuh di Turki. Sebanyak 900 butir kismis digunakan, dimana terdapat 450 butir dari setiap varietas tersebut. Gambar-gambar ini telah menjalani berbagai tahap pra-pemrosesan dan ekstraksi fitur yang menghasilkan 7 fitur morfologi.

1.2.2.1 Data Description Report

  • Total 900 baris (450 Kecimen, 450 Besni), dengan 7 kolom atribut morfologis.
  • Atribut meliputi Area, Perimeter, MajorAxisLength, MinorAxisLength, Eccentricity, ConvexArea, dan Extent.
  • Data berupa nilai numerik yang mencerminkan atribut morfologis.

1.2.3 Explore Data

# Loop melalui setiap kolom dan membuat histogram untuk kolom numerik
for column in data.columns:
    if data[column].dtype != 'O':  # Filter kolom numerik
        plt.subplot(2, 2, 1)  # Ganti angka ini sesuai kebutuhan
        plt.hist(data[column], bins=20, edgecolor='black')
        plt.title(f'Histogram of {column}')
        plt.tight_layout()
        plt.show()
        print("")

1.2.3.1 Data Exploration Report

1.2.4 Verify Data Quality

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 8 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Area             900 non-null    int64  
 1   MajorAxisLength  900 non-null    float64
 2   MinorAxisLength  900 non-null    float64
 3   Eccentricity     900 non-null    float64
 4   ConvexArea       900 non-null    int64  
 5   Extent           900 non-null    float64
 6   Perimeter        900 non-null    float64
 7   Class            900 non-null    object 
dtypes: float64(5), int64(2), object(1)
memory usage: 56.4+ KB

1.2.4.1 Missing Values

# Mengecek missing value pada suatu kolom
koloms = ['Area','MajorAxisLength','MinorAxisLength','Eccentricity','ConvexArea','Extent','Perimeter']
for kolom in koloms:
  if data[kolom].isnull().any():
      print(f'Terdapat missing value pada kolom {kolom}')
      # Menampilkan baris yang memiliki missing value
      baris_missing = data[data[kolom].isnull()].index
      print(f'Baris yang memiliki missing value: {baris_missing}')
  else:
      print(f'Tidak terdapat missing value pada kolom {kolom}')
Tidak terdapat missing value pada kolom Area
Tidak terdapat missing value pada kolom MajorAxisLength
Tidak terdapat missing value pada kolom MinorAxisLength
Tidak terdapat missing value pada kolom Eccentricity
Tidak terdapat missing value pada kolom ConvexArea
Tidak terdapat missing value pada kolom Extent
Tidak terdapat missing value pada kolom Perimeter

1.2.4.2 Outliers

# Loop melalui setiap kolom dan membuat box plot untuk kolom numerik
for column in data.columns:
    if data[column].dtype != 'O':  # Filter kolom numerik
        plt.subplot(2, 2, 1)  # Ganti angka ini sesuai kebutuhan
        sns.boxplot(x=data[column])
        plt.title(f'Boxplot of {column}')
        plt.tight_layout()
        plt.show()

import pandas as pd
import numpy as np
from scipy.stats import zscore

# Menentukan kolom yang akan diperiksa
columns_to_check = ['Area', 'MajorAxisLength', 'MinorAxisLength', 'Eccentricity', 'ConvexArea', 'Extent', 'Perimeter']

# Menghitung Z-Scores hanya untuk kolom-kolom yang diinginkan
z_scores = zscore(data[columns_to_check])

# Menentukan threshold Z-Score (misalnya, 3)
threshold = 3

# Mendeteksi outlier
outliers = (np.abs(z_scores) > threshold).any(axis=1)

# Menampilkan informasi tentang outlier
outlier_info = {
    'values': data[outliers].values.tolist(),
    'indices': data[outliers].index.tolist(),
    'total': sum(outliers)
}

print(f"Outliers:")
print(f"Indices: {outlier_info['indices']}")
print(f"Values: {outlier_info['values']}")
print(f"Total outliers: {outlier_info['total']}")
Outliers:
Indices: [13, 23, 34, 43, 85, 106, 156, 192, 197, 235, 251, 253, 290, 316, 356, 459, 483, 487, 490, 498, 506, 507, 536, 552, 579, 580, 581, 616, 668, 682, 694, 708, 769, 802, 804, 812, 829, 836, 866, 880]
Values: [[76792, 338.8575454, 291.3592017, 0.510583813, 78842, 0.772322237, 1042.77, 'Kecimen'], [61251, 301.5077895, 273.6599414, 0.419753707, 64732, 0.643595671, 971.769, 'Kecimen'], [46427, 253.8420284, 235.9068241, 0.369212459, 48275, 0.684219059, 844.312, 'Kecimen'], [92384, 368.4062138, 320.7145792, 0.492086934, 93772, 0.749006827, 1135.662, 'Kecimen'], [180898, 843.9566534, 323.1905688, 0.923770364, 221396, 0.454188929, 2253.557, 'Kecimen'], [48945, 269.3704112, 239.1621656, 0.460121209, 51456, 0.711244478, 872.289, 'Kecimen'], [45962, 251.1333844, 235.3680757, 0.348729642, 47173, 0.742280362, 810.195, 'Kecimen'], [37569, 232.4278475, 208.1520065, 0.44495009, 38874, 0.794371379, 734.102, 'Kecimen'], [86545, 350.1278744, 315.7195205, 0.432307345, 87512, 0.785886818, 1070.062, 'Kecimen'], [39716, 243.0382802, 210.1140569, 0.502579995, 40598, 0.779432833, 737.468, 'Kecimen'], [45598, 259.8962651, 225.6562198, 0.496118267, 47266, 0.741286253, 813.276, 'Kecimen'], [39439, 246.7636115, 212.635393, 0.507423663, 42795, 0.646827284, 793.005, 'Kecimen'], [136340, 722.8539172, 311.3413551, 0.902489762, 176818, 0.529774048, 2098.263, 'Kecimen'], [55746, 280.3131243, 254.6003304, 0.418381972, 56989, 0.730654294, 875.659, 'Kecimen'], [58460, 290.7535562, 258.3843539, 0.458544698, 60254, 0.774756149, 908.357, 'Kecimen'], [83107, 507.3808994, 233.1538498, 0.8881652, 93706, 0.491002009, 1367.331, 'Besni'], [92188, 374.7201638, 324.3025616, 0.500990716, 95920, 0.747599585, 1190.813, 'Besni'], [210923, 984.0454912, 367.2795321, 0.927737116, 278217, 0.507352075, 2697.753, 'Besni'], [171256, 531.3732054, 412.3828168, 0.630646744, 174277, 0.70191488, 1559.214, 'Besni'], [116406, 612.665318, 251.8328267, 0.911615194, 125638, 0.526259635, 1480.951, 'Besni'], [182160, 997.2919406, 271.8723954, 0.96212444, 221527, 0.379856115, 2303.69, 'Besni'], [208264, 675.0983445, 395.5792906, 0.810341407, 212813, 0.771748314, 1755.167, 'Besni'], [81604, 528.5858925, 204.7395131, 0.921939284, 87172, 0.491460095, 1299.386, 'Besni'], [204864, 596.6398018, 440.4971275, 0.674476207, 209457, 0.751009036, 1726.246, 'Besni'], [130868, 613.1726145, 273.1819147, 0.895270971, 134139, 0.536784249, 1513.352, 'Besni'], [206720, 713.4725493, 373.6425439, 0.851905369, 210114, 0.780576219, 1866.091, 'Besni'], [205497, 632.7276067, 414.1883255, 0.755968807, 209486, 0.76928865, 1736.839, 'Besni'], [199015, 615.4172359, 413.9274732, 0.740009433, 201464, 0.768569796, 1687.866, 'Besni'], [206689, 746.145341, 355.3006855, 0.879346962, 212569, 0.745808887, 1876.028, 'Besni'], [106923, 591.1158376, 234.8233464, 0.917708543, 111428, 0.522278775, 1425.109, 'Besni'], [172783, 820.724022, 352.1936798, 0.903244833, 219952, 0.496936979, 2289.889, 'Besni'], [222915, 731.5594062, 389.9466998, 0.84609325, 227170, 0.770542973, 1876.307, 'Besni'], [195281, 609.8297259, 408.5356188, 0.742435528, 197426, 0.769656124, 1639.103, 'Besni'], [71502, 490.4334789, 189.4429399, 0.922383026, 75157, 0.500546035, 1182.852, 'Besni'], [223075, 694.2475503, 411.810369, 0.805073466, 225916, 0.764940471, 1812.569, 'Besni'], [235047, 772.956877, 388.201507, 0.864734549, 239093, 0.711672732, 1942.05, 'Besni'], [127292, 639.8506348, 258.3819447, 0.914840211, 129101, 0.534714521, 1496.062, 'Besni'], [181126, 949.6626718, 293.386698, 0.951082244, 225592, 0.414153748, 2352.029, 'Besni'], [225043, 740.0037432, 390.3008576, 0.849597917, 229195, 0.744187354, 1853.893, 'Besni'], [218459, 571.2892031, 492.2752785, 0.507431838, 228259, 0.731973651, 1947.46, 'Besni']]
Total outliers: 40

1.2.4.3 Balance Data

# Menghitung jumlah data per kelas pada kolom target
class_counts = data['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    450
Besni      450
Name: Class, dtype: int64
import matplotlib.pyplot as plt

# Menampilkan bar plot jumlah data per kelas
plt.figure(figsize=(8, 6))
class_counts.plot(kind='bar', color='skyblue')
plt.title('Jumlah Data per Kelas')
plt.xlabel('Kelas')
plt.ylabel('Jumlah Data')
plt.show()

1.2.4.4 Data Quality Report

  • Data lengkap: Data mencakup 900 butir kismis.
  • Missing values: Tidak ada nilai yang hilang dalam data.
  • Outliers: Terdapat 40 baris outlier dalam data.
  • Balance Data: Jumlah data setiap varietas sama besar sebanyak 450 data.

1.3 Data Preparation

1.3.0.1 Dataset

Dataset yang dihasilkan oleh fase persiapan data telah melalui serangkaian langkah pemahaman untuk digunakan dalam pemodelan menggunakan Logistic Regression.

1.3.0.2 Dataset Description

  1. Area: Memberikan jumlah piksel dalam batas kismis.
  2. Keliling: Mengukur lingkungan dengan menghitung jarak antara batas kismis dan piksel di sekitarnya.
  3. Panjang Sumbu Utama: Memberikan panjang sumbu utama, yaitu garis terpanjang yang dapat digambar di atas kismis.
  4. Panjang Sumbu Minor: Memberikan panjang sumbu kecil, yaitu garis terpendek yang dapat digambar di atas kismis.
  5. Eksentrisitas: Memberikan ukuran eksentrisitas elips, yang memiliki momen yang sama dengan kismis.
  6. Luas Cembung: Memberikan jumlah piksel dari cangkang cembung terkecil dari wilayah yang dibentuk oleh kismis.
  7. Keluasan: Memberikan rasio wilayah yang dibentuk oleh kismis terhadap total piksel dalam kotak pembatas.
  8. Kelas: Kismis Kecimen dan Besni.

1.3.1 Tipe Data fitur:

  1. Area: Rasio (Ratio) - Data ini memiliki titik nol yang bermakna (karena area tidak dapat negatif), dan perbandingan antara dua nilai area memiliki arti yang jelas.

  2. Keliling: Rasio (Ratio) - Seperti area, keliling juga memiliki titik nol yang bermakna, dan perbandingan antara dua nilai keliling memiliki arti yang jelas.

  3. Panjang Sumbu Utama: Rasio (Ratio) - Panjang sumbu utama memiliki titik nol yang bermakna, dan perbandingan antara dua nilai panjang sumbu utama memiliki arti yang jelas.

  4. Panjang Sumbu Minor: Rasio (Ratio) - Panjang sumbu minor memiliki titik nol yang bermakna, dan perbandingan antara dua nilai panjang sumbu minor memiliki arti yang jelas.

  5. Eksentrisitas: Interval - Eksentrisitas memiliki rentang tertentu (biasanya antara 0 dan 1), tetapi tidak memiliki titik nol yang bermakna. Ini dianggap sebagai data interval karena dapat diukur dan diurutkan, tetapi perbandingan nilai mungkin tidak selalu bermakna.

  6. Luas Cembung: Rasio (Ratio) - Seperti area, luas cembung memiliki titik nol yang bermakna, dan perbandingan antara dua nilai luas cembung memiliki arti yang jelas.

  7. Keluasan: Rasio (Ratio) - Seperti area, keluasan memiliki titik nol yang bermakna, dan perbandingan antara dua nilai keluasan memiliki arti yang jelas.

  8. Kelas: Nominal - Kelas adalah data kategorikal tanpa tingkat ordinalitas atau urutan yang dapat diatribusikan ke kategori tersebut.

  • Rasio: Area, Keliling, Panjang Sumbu Utama, Panjang Sumbu Minor, Luas Cembung, Keluasan
  • Interval: Eksentrisitas
  • Nominal: Kelas

1.3.2 Select Data

# Pisahkan data menjadi fitur (X) dan label (y)
X = data.drop('Class', axis=1)
y = data['Class']

1.3.2.1 Pemilihan Fitur (Feature Selection) - Information Gain

import pandas as pd
from sklearn.feature_selection import mutual_info_classif
import matplotlib.pyplot as plt
%matplotlib inline

# Menghitung mutual information
importances = mutual_info_classif(X, y)

# Membuat Series dari hasil perhitungan mutual information
feat_importances = pd.Series(importances, index=X.columns)

# Plot bar chart
feat_importances.plot(kind='barh', color='teal')
plt.xlabel('Mutual Information')
plt.show()

for i, feature in enumerate(X.columns):
  print(f"Mutual Information for {feature}: {importances[i]}")
Mutual Information for Area: 0.2779525852508964
Mutual Information for MajorAxisLength: 0.34834107401237
Mutual Information for MinorAxisLength: 0.13486920234749755
Mutual Information for Eccentricity: 0.12911725093005044
Mutual Information for ConvexArea: 0.2975680307534163
Mutual Information for Extent: 0.029344123584051918
Mutual Information for Perimeter: 0.3585072377567762
data_dropExtent = data.drop('Extent', axis=1)
data_dropEccent = data_dropExtent.drop('Eccentricity', axis=1)
data_dropMinor = data_dropEccent.drop('MinorAxisLength', axis=1)
data_dropExtent.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 7 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Area             900 non-null    int64  
 1   MajorAxisLength  900 non-null    float64
 2   MinorAxisLength  900 non-null    float64
 3   Eccentricity     900 non-null    float64
 4   ConvexArea       900 non-null    int64  
 5   Perimeter        900 non-null    float64
 6   Class            900 non-null    object 
dtypes: float64(4), int64(2), object(1)
memory usage: 49.3+ KB
data_dropEccent.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 6 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Area             900 non-null    int64  
 1   MajorAxisLength  900 non-null    float64
 2   MinorAxisLength  900 non-null    float64
 3   ConvexArea       900 non-null    int64  
 4   Perimeter        900 non-null    float64
 5   Class            900 non-null    object 
dtypes: float64(3), int64(2), object(1)
memory usage: 42.3+ KB
data_dropMinor.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 5 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Area             900 non-null    int64  
 1   MajorAxisLength  900 non-null    float64
 2   ConvexArea       900 non-null    int64  
 3   Perimeter        900 non-null    float64
 4   Class            900 non-null    object 
dtypes: float64(2), int64(2), object(1)
memory usage: 35.3+ KB

1.3.2.2 Rationale for Inclusion/Exclusion

  • Inklusi: Seluruh dataset raisin termasuk karena relevan dengan tujuan data mining dan memiliki kualitas yang baik. Dipilih semua atribut morfologis yang relevan untuk klasifikasi raisin (Area, Perimeter, MajorAxisLength, MinorAxisLength, Eccentricity, ConvexArea, Extent).
  • Eksklusi: Tidak ada eksklusi data karena dataset lengkap dan relevan. Tidak ada data yang dihapus; hanya beberapa nilai yang hilang diatasi dengan pengisian nilai rata-rata.

1.3.3 Clean Data

1.3.3.1 Mengatasi Outlier

1.3.3.1.1 Menghapus Outlier
# Menghapus baris yang mengandung outlier
data_dropOutlier = data[~outliers]
data_dropExtent_dropOutlier = data_dropExtent[~outliers]
data_dropEccent_dropOutlier = data_dropEccent[~outliers]
data_dropMinor_dropOutlier = data_dropMinor[~outliers]
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    435
Besni      425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_dropOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    435
Besni      425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_dropOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    435
Besni      425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropEccent_dropOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    435
Besni      425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropMinor_dropOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    435
Besni      425
Name: Class, dtype: int64
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropOutlier = data_dropOutlier.drop('Class', axis=1)
y_dropOutlier = data_dropOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropExtent_dropOutlier = data_dropExtent_dropOutlier.drop('Class', axis=1)
y_dropExtent_dropOutlier = data_dropExtent_dropOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropEccent_dropOutlier = data_dropEccent_dropOutlier.drop('Class', axis=1)
y_dropEccent_dropOutlier = data_dropEccent_dropOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropMinor_dropOutlier = data_dropMinor_dropOutlier.drop('Class', axis=1)
y_dropMinor_dropOutlier = data_dropMinor_dropOutlier['Class']
1.3.3.1.2 Mengganti Outlier Dengan Nilai Median
data_revalueOutlier = data
columns = (data_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
    median_value = data[column].median()
    data_revalueOutlier.loc[outliers, column] = median_value
data_dropExtent_revalueOutlier = data_dropExtent
columns = (data_dropExtent_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
    median_value = data[column].median()
    data_dropExtent_revalueOutlier.loc[outliers, column] = median_value
data_dropEccent_revalueOutlier = data_dropEccent
columns = (data_dropEccent_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
    median_value = data[column].median()
    data_dropEccent_revalueOutlier.loc[outliers, column] = median_value
data_dropMinor_revalueOutlier = data_dropMinor
columns = (data_dropMinor_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
    median_value = data[column].median()
    data_dropMinor_revalueOutlier.loc[outliers, column] = median_value
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_revalueOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    450
Besni      450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_revalueOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    450
Besni      450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropEccent_revalueOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    450
Besni      450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropMinor_revalueOutlier['Class'].value_counts()

# Menampilkan hasil
print(class_counts)
Kecimen    450
Besni      450
Name: Class, dtype: int64
# Pisahkan data menjadi fitur (X) dan label (y)
X_revalueOutlier = data_revalueOutlier.drop('Class', axis=1)
y_revalueOutlier = data_revalueOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropExtent_revalueOutlier = data_dropExtent_revalueOutlier.drop('Class', axis=1)
y_dropExtent_revalueOutlier = data_dropExtent_revalueOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropEccent_revalueOutlier = data_dropEccent_revalueOutlier.drop('Class', axis=1)
y_dropEccent_revalueOutlier = data_dropEccent_revalueOutlier['Class']
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropMinor_revalueOutlier = data_dropMinor_revalueOutlier.drop('Class', axis=1)
y_dropMinor_revalueOutlier = data_dropMinor_revalueOutlier['Class']

1.3.3.2 Data Cleaning Report

  • Pembersihan data melibatkan penanganan masalah kualitas data yang diidentifikasi sebelumnya.
  • Tidak ada nilai yang hilang, dan data cukup bersih; oleh karena itu, tindakan pembersihan minimal diperlukan.
  • Normalisasi nilai-nilai atribut untuk memastikan konsistensi interpretasi. Pengisian nilai rata-rata untuk mengatasi nilai yang hilang.
  • Dampak Potensial: Meningkatkan kualitas data dan mengurangi potensi distorsi hasil akibat ketidakseimbangan atau nilai yang hilang.

1.3.4 Construct Data

1.3.4.1 Derived Attributes

Tidak ada atribut turunan yang dibangun dalam fase ini karena fitur morfologi awal sudah cukup untuk analisis.

1.3.4.2 Generated Records

Tidak ada rekaman sepenuhnya baru yang dibuat dalam fase ini karena data awal cukup representatif.

1.3.5 Integrate Data

1.3.5.1 Merged Data

Data raisin tidak memerlukan penggabungan dari beberapa tabel atau rekaman karena dataset raisin awal sudah mencakup informasi yang dibutuhkan. Oleh karena itu, tahap ini tidak diperlukan.

1.3.6 Format Data

1.3.6.1 Normalisasi Z-score

Rumus Normalisasi menggunakan StandardScaler:

\([ X_{\text{normalized}} = \frac{X - \mu}{\sigma} ]\)

Keterangan: - \(X_{\text{normalized}}\) : Data yang telah dinormalisasi - \(X\) : Data asli - \(\mu\) : Rata-rata dari (X) - \(\sigma\) : Deviasi standar dari (X)

from sklearn.preprocessing import StandardScaler
# Normalisasi Z-Score
scaler_standard_dO = StandardScaler()
scaler_standard_dEx_dO = StandardScaler()
scaler_standard_dEc_dO = StandardScaler()
scaler_standard_dMi_dO = StandardScaler()

scaler_standard_rO = StandardScaler()
scaler_standard_dEx_rO = StandardScaler()
scaler_standard_dEc_rO = StandardScaler()
scaler_standard_dMi_rO = StandardScaler()
1.3.6.1.1 Menggunakan Data Tanpa Outlier dengan menghapus outlier tersebut
X_dropOutlier_standard_normalized = scaler_standard_dO.fit_transform(X_dropOutlier)
X_dropExtent_dropOutlier_standard_normalized= scaler_standard_dEx_dO.fit_transform(X_dropExtent_dropOutlier)
X_dropEccent_dropOutlier_standard_normalized= scaler_standard_dEc_dO.fit_transform(X_dropEccent_dropOutlier)
X_dropMinor_dropOutlier_standard_normalized= scaler_standard_dMi_dO.fit_transform(X_dropMinor_dropOutlier)
1.3.6.1.2 Menggunakan Data tanpa outlier dengan mengganti nilai outlier menjadi median
X_revalueOutlier_standard_normalized = scaler_standard_rO.fit_transform(X_revalueOutlier)
X_dropExtent_revalueOutlier_standard_normalized= scaler_standard_dEx_rO.fit_transform(X_dropExtent_revalueOutlier)
X_dropEccent_revalueOutlier_standard_normalized= scaler_standard_dEc_rO.fit_transform(X_dropEccent_revalueOutlier)
X_dropMinor_revalueOutlier_standard_normalized= scaler_standard_dMi_rO.fit_transform(X_dropMinor_revalueOutlier)

1.3.6.2 Normalisai Minmax

from sklearn.preprocessing import MinMaxScaler
# Normalisasi Minmax

scaler_minmax_dO = MinMaxScaler()
scaler_minmax_dEx_dO = MinMaxScaler()
scaler_minmax_dEc_dO = MinMaxScaler()
scaler_minmax_dMi_dO = MinMaxScaler()

scaler_minmax_rO = MinMaxScaler()
scaler_minmax_dEx_rO = MinMaxScaler()
scaler_minmax_dEc_rO = MinMaxScaler()
scaler_minmax_dMi_rO = MinMaxScaler()
1.3.6.2.1 Menggunakan Data Tanpa Outlier dengan menghapus outlier tersebut
X_dropOutlier_minmax_normalized = scaler_minmax_dO.fit_transform(X_dropOutlier)
X_dropExtent_dropOutlier_minmax_normalized= scaler_minmax_dEx_dO.fit_transform(X_dropExtent_dropOutlier)
X_dropEccent_dropOutlier_minmax_normalized= scaler_minmax_dEc_dO.fit_transform(X_dropEccent_dropOutlier)
X_dropMinor_dropOutlier_minmax_normalized= scaler_minmax_dMi_dO.fit_transform(X_dropMinor_dropOutlier)
1.3.6.2.2 Menggunakan Data tanpa outlier dengan mengganti nilai outlier menjadi median
X_revalueOutlier_minmax_normalized = scaler_minmax_rO.fit_transform(X_revalueOutlier)
X_dropExtent_revalueOutlier_minmax_normalized= scaler_minmax_dEx_rO.fit_transform(X_dropExtent_revalueOutlier)
X_dropEccent_revalueOutlier_minmax_normalized= scaler_minmax_dEc_rO.fit_transform(X_dropEccent_revalueOutlier)
X_dropMinor_revalueOutlier_minmax_normalized= scaler_minmax_dMi_rO.fit_transform(X_dropMinor_revalueOutlier)

1.3.6.3 Reformatted Data

Tidak ada perubahan format data yang diperlukan karena struktur dataset sudah sesuai dengan kebutuhan pemodelan.

1.4 Modeling

1.4.1 Select Modeling Techniques

1.4.1.1 Modeling Technique

Pemilihan teknik pemodelan yang sesuai adalah menggunakan algoritma Logistic Regression untuk klasifikasi varietas kismis.

1.4.1.2 Modeling Assumptions

1.4.2 Generate Test Design

Dataset akan dibagi menjadi dua bagian: set pelatihan (80% dari data) dan set uji (20% dari data). Model akan dilatih pada set pelatihan dan diuji pada set uji untuk mengevaluasi kinerja dan generalisasi.

from sklearn.model_selection import train_test_split

1.4.2.1 Z-score

# Pisahkan data menjadi set pelatihan dan set pengujian
X_dO_std_train, X_dO_std_test, y_dO_std_train, y_dO_std_test = train_test_split(X_dropOutlier_standard_normalized, y_dropOutlier, test_size=0.2, random_state=42)
X_dEx_dO_std_train, X_dEx_dO_std_test, y_dEx_dO_std_train, y_dEx_dO_std_test = train_test_split(X_dropExtent_dropOutlier_standard_normalized, y_dropExtent_dropOutlier, test_size=0.2, random_state=42)
X_dEc_dO_std_train, X_dEc_dO_std_test, y_dEc_dO_std_train, y_dEc_dO_std_test = train_test_split(X_dropEccent_dropOutlier_standard_normalized, y_dropEccent_dropOutlier, test_size=0.2, random_state=42)
X_dMi_dO_std_train, X_dMi_dO_std_test, y_dMi_dO_std_train, y_dMi_dO_std_test = train_test_split(X_dropMinor_dropOutlier_standard_normalized, y_dropMinor_dropOutlier, test_size=0.2, random_state=42)
# Pisahkan data menjadi set pelatihan dan set pengujian
X_rO_std_train, X_rO_std_test, y_rO_std_train, y_rO_std_test = train_test_split(X_revalueOutlier_standard_normalized, y_revalueOutlier, test_size=0.2, random_state=42)
X_dEx_rO_std_train, X_dEx_rO_std_test, y_dEx_rO_std_train, y_dEx_rO_std_test = train_test_split(X_dropExtent_revalueOutlier_standard_normalized, y_dropExtent_revalueOutlier, test_size=0.2, random_state=42)
X_dEc_rO_std_train, X_dEc_rO_std_test, y_dEc_rO_std_train, y_dEc_rO_std_test = train_test_split(X_dropEccent_revalueOutlier_standard_normalized, y_dropEccent_revalueOutlier, test_size=0.2, random_state=42)
X_dMi_rO_std_train, X_dMi_rO_std_test, y_dMi_rO_std_train, y_dMi_rO_std_test = train_test_split(X_dropMinor_revalueOutlier_standard_normalized, y_dropMinor_revalueOutlier, test_size=0.2, random_state=42)

1.4.2.2 Minmax

# Pisahkan data menjadi set pelatihan dan set pengujian
X_dO_mmx_train, X_dO_mmx_test, y_dO_mmx_train, y_dO_mmx_test = train_test_split(X_dropOutlier_minmax_normalized, y_dropOutlier, test_size=0.2, random_state=42)
X_dEx_dO_mmx_train, X_dEx_dO_mmx_test, y_dEx_dO_mmx_train, y_dEx_dO_mmx_test = train_test_split(X_dropExtent_dropOutlier_minmax_normalized, y_dropExtent_dropOutlier, test_size=0.2, random_state=42)
X_dEc_dO_mmx_train, X_dEc_dO_mmx_test, y_dEc_dO_mmx_train, y_dEc_dO_mmx_test = train_test_split(X_dropEccent_dropOutlier_minmax_normalized, y_dropEccent_dropOutlier, test_size=0.2, random_state=42)
X_dMi_dO_mmx_train, X_dMi_dO_mmx_test, y_dMi_dO_mmx_train, y_dMi_dO_mmx_test = train_test_split(X_dropMinor_dropOutlier_minmax_normalized, y_dropMinor_dropOutlier, test_size=0.2, random_state=42)
# Pisahkan data menjadi set pelatihan dan set pengujian
X_rO_mmx_train, X_rO_mmx_test, y_rO_mmx_train, y_rO_mmx_test = train_test_split(X_revalueOutlier_minmax_normalized, y_revalueOutlier, test_size=0.2, random_state=42)
X_dEx_rO_mmx_train, X_dEx_rO_mmx_test, y_dEx_rO_mmx_train, y_dEx_rO_mmx_test = train_test_split(X_dropExtent_revalueOutlier_minmax_normalized, y_dropExtent_revalueOutlier, test_size=0.2, random_state=42)
X_dEc_rO_mmx_train, X_dEc_rO_mmx_test, y_dEc_rO_mmx_train, y_dEc_rO_mmx_test = train_test_split(X_dropEccent_revalueOutlier_minmax_normalized, y_dropEccent_revalueOutlier, test_size=0.2, random_state=42)
X_dMi_rO_mmx_train, X_dMi_rO_mmx_test, y_dMi_rO_mmx_train, y_dMi_rO_mmx_test = train_test_split(X_dropMinor_revalueOutlier_minmax_normalized, y_dropMinor_revalueOutlier, test_size=0.2, random_state=42)

1.4.2.3 Test Design

1.4.3 Build Model

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

1.4.3.1 Parameter Settings

1.4.3.2 Models

1.4.3.2.1 Menggunakan Data Yang Telah Dibuang Outliernya
1.4.3.2.1.1 Z-Score
# Membuat model Regresi Logistik
LR_dO_std = LogisticRegression()

# Melatih model
LR_dO_std.fit(X_dO_std_train, y_dO_std_train)

# Melakukan prediksi
y_dO_std_pred = LR_dO_std.predict(X_dO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dO_std_test, y_dO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.813953488372093
# Membuat model Regresi Logistik
LR_dEx_dO_std = LogisticRegression()

# Melatih model
LR_dEx_dO_std.fit(X_dEx_dO_std_train, y_dEx_dO_std_train)

# Melakukan prediksi
y_dEx_dO_std_pred = LR_dEx_dO_std.predict(X_dEx_dO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dEx_dO_std_test, y_dEx_dO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dEc_dO_std = LogisticRegression()

# Melatih model
LR_dEc_dO_std.fit(X_dEc_dO_std_train, y_dEc_dO_std_train)

# Melakukan prediksi
y_dEc_dO_std_pred = LR_dEc_dO_std.predict(X_dEc_dO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dEc_dO_std_test, y_dEc_dO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dMi_dO_std = LogisticRegression()

# Melatih model
LR_dMi_dO_std.fit(X_dMi_dO_std_train, y_dMi_dO_std_train)

# Melakukan prediksi
y_dMi_dO_std_pred = LR_dMi_dO_std.predict(X_dMi_dO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dMi_dO_std_test, y_dMi_dO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8023255813953488
# Membuat model Regresi Logistik
LR_rO_std = LogisticRegression()

# Melatih model
LR_rO_std.fit(X_rO_std_train, y_rO_std_train)

# Melakukan prediksi
y_rO_std_pred = LR_rO_std.predict(X_rO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_rO_std_test, y_rO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEx_rO_std = LogisticRegression()

# Melatih model
LR_dEx_rO_std.fit(X_dEx_rO_std_train, y_dEx_rO_std_train)

# Melakukan prediksi
y_dEx_rO_std_pred = LR_dEx_rO_std.predict(X_dEx_rO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dEx_rO_std_test, y_dEx_rO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEc_rO_std = LogisticRegression()

# Melatih model
LR_dEc_rO_std.fit(X_dEc_rO_std_train, y_dEc_rO_std_train)

# Melakukan prediksi
y_dEc_rO_std_pred = LR_dEc_rO_std.predict(X_dEc_rO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dEc_rO_std_test, y_dEc_rO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dMi_rO_std = LogisticRegression()

# Melatih model
LR_dMi_rO_std.fit(X_dMi_rO_std_train, y_dMi_rO_std_train)

# Melakukan prediksi
y_dMi_rO_std_pred = LR_dMi_rO_std.predict(X_dMi_rO_std_test)

# Evaluasi model
accuracy = accuracy_score(y_dMi_rO_std_test, y_dMi_rO_std_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8333333333333334
1.4.3.2.1.2 Minmax
# Membuat model Regresi Logistik
LR_dO_mmx = LogisticRegression()

# Melatih model
LR_dO_mmx.fit(X_dO_mmx_train, y_dO_mmx_train)

# Melakukan prediksi
y_dO_mmx_pred = LR_dO_mmx.predict(X_dO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dO_mmx_test, y_dO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dEx_dO_mmx = LogisticRegression()

# Melatih model
LR_dEx_dO_mmx.fit(X_dEx_dO_mmx_train, y_dEx_dO_mmx_train)

# Melakukan prediksi
y_dEx_dO_mmx_pred = LR_dEx_dO_mmx.predict(X_dEx_dO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dEx_dO_mmx_test, y_dEx_dO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8023255813953488
# Membuat model Regresi Logistik
LR_dEc_dO_mmx = LogisticRegression()

# Melatih model
LR_dEc_dO_mmx.fit(X_dEc_dO_mmx_train, y_dEc_dO_mmx_train)

# Melakukan prediksi
y_dEc_dO_mmx_pred = LR_dEc_dO_mmx.predict(X_dEc_dO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dEc_dO_mmx_test, y_dEc_dO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.813953488372093
# Membuat model Regresi Logistik
LR_dMi_dO_mmx = LogisticRegression()

# Melatih model
LR_dMi_dO_mmx.fit(X_dMi_dO_mmx_train, y_dMi_dO_mmx_train)

# Melakukan prediksi
y_dMi_dO_mmx_pred = LR_dMi_dO_mmx.predict(X_dMi_dO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dMi_dO_mmx_test, y_dMi_dO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_rO_mmx = LogisticRegression()

# Melatih model
LR_rO_mmx.fit(X_rO_mmx_train, y_rO_mmx_train)

# Melakukan prediksi
y_rO_mmx_pred = LR_rO_mmx.predict(X_rO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_rO_mmx_test, y_rO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8444444444444444
# Membuat model Regresi Logistik
LR_dEx_rO_mmx = LogisticRegression()

# Melatih model
LR_dEx_rO_mmx.fit(X_dEx_rO_mmx_train, y_dEx_rO_mmx_train)

# Melakukan prediksi
y_dEx_rO_mmx_pred = LR_dEx_rO_mmx.predict(X_dEx_rO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dEx_rO_mmx_test, y_dEx_rO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEc_rO_mmx = LogisticRegression()

# Melatih model
LR_dEc_rO_mmx.fit(X_dEc_rO_mmx_train, y_dEc_rO_mmx_train)

# Melakukan prediksi
y_dEc_rO_mmx_pred = LR_dEc_rO_mmx.predict(X_dEc_rO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dEc_rO_mmx_test, y_dEc_rO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dMi_rO_mmx = LogisticRegression()

# Melatih model
LR_dMi_rO_mmx.fit(X_dMi_rO_mmx_train, y_dMi_rO_mmx_train)

# Melakukan prediksi
y_dMi_rO_mmx_pred = LR_dMi_rO_mmx.predict(X_dMi_rO_mmx_test)

# Evaluasi model
accuracy = accuracy_score(y_dMi_rO_mmx_test, y_dMi_rO_mmx_pred)
print(f'Akurasi: {accuracy}')
Akurasi: 0.8333333333333334

1.4.3.3 Model Description

\[\begin{equation} P(Y=1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_n X_n)}} \end{equation}\]


  • \(P(Y=1)\) adalah probabilitas bahwa variabel dependen \(Y\) sama dengan 1.

  • \((\beta_0, \beta_1, \beta_2, \ldots, \beta_n)\) adalah parameter yang akan diestimasi.

  • \((X_1, X_2, \ldots, X_n)\) adalah variabel independen.

Model Logistic Regression menghasilkan parameter berikut: koefisien untuk setiap atribut, intercept, dan fungsi logistik yang menggambarkan probabilitas.

1.4.4 Assess Model

1.4.4.1 Model Assessment

  • Model dievaluasi menggunakan beberapa metrik kualitas seperti akurasi, presisi, recall, dan F1-score.
  • Akurasi:
  • Presisi:
  • Recall:
  • F1-score:

1.4.4.2 Revised Parameter Settings

1.5 Evaluation

1.5.1 Evaluate Results

1.5.1.1 Assessment of Data Mining Results

  • Model Logistic Regression berhasil mencapai akurasi 84%, memenuhi target minimal 80% sesuai dengan kriteria keberhasilan bisnis.
  • Temuan tambahan termasuk identifikasi faktor-faktor yang paling berpengaruh dalam prediksi.

1.5.1.2 Approved Models

Model yang memenuhi kriteria keberhasilan bisnis dianggap sebagai model yang disetujui. Sehingga, model Logistic Regression dengan parameter hasil terbaik dianggap disetujui.

import joblib
# Menyimpan scaler ke dalam file
joblib.dump(scaler_minmax_rO, '/content/drive/MyDrive/psd/raisin/scaler.pkl')
import joblib
# Simpan model ke dalam file
joblib.dump(LR_rO_mmx, '/content/drive/MyDrive/psd/raisin/LR_model.pkl')

1.5.2 Review Process

1.5.2.1 Review of Process

Proses pemodelan dan evaluasi telah dilaksanakan sesuai rencana proyek. Semua aktivitas dilakukan sesuai dengan pedoman data mining yang berlaku. Tidak ada isu kualitas yang signifikan yang terlewat selama proses.

1.5.3 Determine Next Steps

1.5.3.1 List of Possible Actions

  • Menyusun rencana implementasi model yang disetujui ke dalam lingkungan produksi, yaitu Streamlit.
  • Mengevaluasi kembali model secara berkala untuk memastikan konsistensi performa.
  • Menyiapkan laporan final proyek untuk disajikan.

1.5.3.2 Decision

  • Berdasarkan evaluasi hasil dan tinjauan proses, maka diputuskan untuk melanjutkan ke tahap implementasi model ke dalam Streamlit.
  • Evaluasi model secara berkala akan diintegrasikan ke dalam proses operasional untuk pemantauan performa yang berkelanjutan.

1.6 Deployment

1.6.1 Plan Deployment

1.6.1.1 Deployment Plan

Implementasi model Logistic Regression akan dilakukan dengan menyertakan kode implementasi dalam lingkungan produksi, yaitu Streamlit.

  • Implementasi model akan dilakukan secara bertahap, dimulai dengan meminta input user untuk variabel yang dibutuhkan dalam memprediksi .

1.6.2 Plan Monitoring and Maintenance

1.6.2.1 Monitoring and Mainenance Plan

  • Proses pemantauan akan mencakup pemantauan kinerja model, mendeteksi perubahan perilaku data, dan mengukur dampak model pada keputusan bisnis.
  • Pemeliharaan akan melibatkan pembaruan model secara berkala sesuai dengan perubahan dalam data atau tujuan bisnis dan penanganan masalah yang mungkin muncul.

1.6.3 Produce Final Report

1.6.3.1 Final Report

Laporan akhir berisi rangkuman menyeluruh tentang proyek, metode yang diterapkan, hasil evaluasi model, dan rekomendasi untuk implementasi serta pemeliharaan berkelanjutan, yang akan disajikan melalui website POSIT dengan penjelasan mendalam pada setiap tahapan proses data mining.

Website POSIT: teks link

1.6.4 Review Project

1.6.4.1 Experience Documentation

  • Evaluasi Proyek:
  • Kesalahan yang ditemui:
  • Saran untuk perbaikan di masa depan: