Spaces:
No application file
No application file
| import streamlit as st | |
| import joblib | |
| import pandas as pd | |
| import shap | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| from datetime import time, datetime | |
| # Muat model dan scaler | |
| def load_model_and_scaler(): | |
| model = joblib.load('../model/best_model.joblib') | |
| scaler = joblib.load('../model/scaler.joblib') | |
| return model, scaler | |
| model, scaler = load_model_and_scaler() | |
| # Fitur yang digunakan oleh model | |
| model_features = ['SamplingNC', 'SamplingChek', 'QTY', 'TimeProduce', 'Years'] | |
| # Fungsi untuk melakukan prediksi dan SHAP analysis | |
| def predict_and_explain(features): | |
| features_scaled = scaler.transform(features) | |
| prediction = model.predict(features_scaled) | |
| explainer = shap.TreeExplainer(model) | |
| shap_values = explainer.shap_values(features_scaled) | |
| return prediction, shap_values, explainer | |
| # UI Streamlit | |
| st.title('Prediksi NC dengan Analisis SHAP') | |
| # Input fields untuk fitur yang digunakan model | |
| input_data = {} | |
| for col in model_features: | |
| if col == 'TimeProduce': | |
| time_input = st.time_input(f"Pilih {col}", value=time(0, 0)) | |
| input_data[col] = time_input.hour + time_input.minute / 60.0 | |
| elif col == 'Years': | |
| input_data[col] = st.number_input(col, min_value=2000, max_value=2100, value=2000) | |
| else: | |
| input_data[col] = st.number_input(col, min_value=0, value=0) | |
| if st.button('Prediksi dan Analisis'): | |
| features = pd.DataFrame([input_data]) | |
| prediction, shap_values, explainer = predict_and_explain(features) | |
| st.write(f'Prediksi NC %: {prediction[0]:.2f}%') | |
| # Menampilkan data input yang digunakan | |
| st.write("Data Input:") | |
| display_features = features.copy() | |
| display_features['TimeProduce'] = time(int(features['TimeProduce']), int((features['TimeProduce'] % 1) * 60)).strftime("%H:%M") | |
| st.write(display_features) | |
| # Visualisasi SHAP (Beeswarm plot) | |
| st.write("Analisis SHAP (Pengaruh Fitur):") | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| shap.summary_plot(shap_values, features, plot_type="bar", show=False) | |
| plt.title("Pengaruh Fitur terhadap Prediksi") | |
| plt.xlabel("Rata-rata dampak pada prediksi") | |
| plt.tight_layout() | |
| st.pyplot(fig) | |
| st.write("Interpretasi: Panjang bar menunjukkan seberapa besar pengaruh fitur terhadap prediksi. " | |
| "Warna merah menunjukkan pengaruh positif (meningkatkan NC %), " | |
| "sedangkan warna biru menunjukkan pengaruh negatif (menurunkan NC %).") | |
| # Waterfall plot untuk feature importance | |
| st.write("Kontribusi Fitur untuk Prediksi Ini:") | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| shap.plots._waterfall.waterfall_legacy(explainer.expected_value, shap_values[0], features.iloc[0], max_display=10, show=False) | |
| plt.title("Kontribusi Setiap Fitur terhadap Prediksi") | |
| plt.tight_layout() | |
| st.pyplot(fig) | |
| st.write("Interpretasi: Plot ini menunjukkan bagaimana setiap fitur berkontribusi terhadap prediksi akhir. " | |
| "Batang merah menunjukkan peningkatan NC %, sedangkan batang biru menunjukkan penurunan NC %. " | |
| "Nilai awal adalah rata-rata prediksi, dan nilai akhir adalah prediksi untuk input ini.") |