# ---ADVANCED INTERACTIVE DASHBOARD (REAL DATA) --- import gradio as gr import plotly.express as px import pandas as pd # Load ulang data untuk memastikan aman di fungsi Gradio df = pd.read_csv('diabetes_dataset.csv') df['Diabetes_Label'] = df['diabetes'].map({0: 'Negative', 1: 'Positive'}) def update_dashboard(age_start, age_end, selected_smoking, selected_gender): # 1. Filter Data (Aman & Anti-Error) if age_start > age_end: age_start, age_end = age_end, age_start if not selected_smoking: selected_smoking = df['smoking_history'].unique().tolist() if not selected_gender: selected_gender = df['gender'].unique().tolist() filtered_df = df[(df['age'] >= age_start) & (df['age'] <= age_end) & (df['smoking_history'].isin(selected_smoking)) & (df['gender'].isin(selected_gender))] # Handle jika data kosong setelah difilter if filtered_df.empty: empty_fig = px.scatter(title="⚠️ Tidak ada data pasien dengan kriteria ini.") return empty_fig, empty_fig, empty_fig, "### ⚠️ Data Kosong. Silakan ubah filter." # 2. GRAFIK 1: SCATTER PLOT INTERAKTIF fig_scatter = px.scatter(filtered_df, x='hbA1c_level', y='blood_glucose_level', color='Diabetes_Label', size='bmi', hover_data=['age', 'gender'], color_discrete_map={'Negative': '#636EFA', 'Positive': '#EF553B'}, title=f"🩺 Indikator Klinis (Usia {age_start} - {age_end})", template="plotly_white") fig_scatter.add_vline(x=6.5, line_dash="dash", line_color="red", annotation_text="Batas HbA1c") # 3. GRAFIK 2: PIE CHART (Rasio Diabetes) diabetes_counts = filtered_df['Diabetes_Label'].value_counts().reset_index() diabetes_counts.columns = ['Status', 'Count'] fig_pie = px.pie(diabetes_counts, values='Count', names='Status', color='Status', color_discrete_map={'Negative': '#636EFA', 'Positive': '#EF553B'}, title="📊 Rasio Positif vs Negatif", hole=0.4, template="plotly_white") # 4. GRAFIK 3: HISTOGRAM (Distribusi BMI) fig_hist = px.histogram(filtered_df, x='bmi', color='Diabetes_Label', barmode='overlay', title="👥 Distribusi Obesitas (BMI)", color_discrete_map={'Negative': '#636EFA', 'Positive': '#EF553B'}, template="plotly_white") # 5. RINGKASAN EKSEKUTIF total_patients = len(filtered_df) positive_cases = len(filtered_df[filtered_df['diabetes'] == 1]) prevalence = (positive_cases / total_patients) * 100 if total_patients > 0 else 0 summary = f""" ### 📋 Executive Summary * **Populasi Terfilter:** **{total_patients:,}** pasien * **Kasus Positif:** **{positive_cases:,}** pasien * **Prevalensi Risiko:** **{prevalence:.1f}%** """ return fig_scatter, fig_pie, fig_hist, summary # --- UI GRADIO --- with gr.Blocks(title="Diabetes Risk Dashboard") as app: gr.Markdown("# 🩸 Advanced Diabetes Risk Analytics") gr.Markdown("Eksplorasi profil pasien menggunakan dataset riil untuk mengidentifikasi korelasi medis.") with gr.Row(): with gr.Column(scale=2): in_smoking = gr.Dropdown(choices=df['smoking_history'].unique().tolist(), value=['never', 'current', 'former'], multiselect=True, label="Riwayat Merokok") in_gender = gr.Dropdown(choices=df['gender'].unique().tolist(), value=df['gender'].unique().tolist(), multiselect=True, label="Gender") with gr.Column(scale=2): with gr.Row(): in_age_start = gr.Slider(0, 100, value=20, step=1, label="Umur (Min)") in_age_end = gr.Slider(0, 100, value=80, step=1, label="Umur (Max)") with gr.Column(scale=1): btn = gr.Button("🔄 Analisis Data", variant="primary") with gr.Row(): out_summary = gr.Markdown() with gr.Row(): out_scatter = gr.Plot() with gr.Row(): out_pie = gr.Plot() out_hist = gr.Plot() btn.click(update_dashboard, inputs=[in_age_start, in_age_end, in_smoking, in_gender], outputs=[out_scatter, out_pie, out_hist, out_summary]) app.load(update_dashboard, inputs=[in_age_start, in_age_end, in_smoking, in_gender], outputs=[out_scatter, out_pie, out_hist, out_summary]) app.launch()