rafhiromadoni's picture
Rename app_diabetes.py to app.py
5da3de1 verified
# ---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()