File size: 4,699 Bytes
18dfcb9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# ---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()