import streamlit as st import pandas as pd import plotly.express as px # Load and clean the dataset @st.cache_data def load_data(): df = pd.read_csv("hospital_readmissions.csv") # Clean missing values df['medical_specialty'] = df['medical_specialty'].replace('Missing', 'Unknown') df['diag_1'] = df['diag_1'].replace('Missing', 'Unknown_Diagnosis') df['diag_2'] = df['diag_2'].replace('Missing', 'Unknown_Diagnosis') df['diag_3'] = df['diag_3'].replace('Missing', 'Unknown_Diagnosis') # Extract numerical age from range df['age'] = df['age'].str.extract(r'\[(\d+)-').astype(float) return df df = load_data() # Sidebar for navigation st.sidebar.title("Navigation") page = st.sidebar.radio("Go to", ["Overview", "Factors Influencing Readmissions", "Hospital Stay and Procedures", "Patient Health Insights", "Recommendations"]) # Filters for interactivity st.sidebar.header("Filters") age_group = st.sidebar.multiselect("Select Age Group", options=sorted(df['age'].unique()), default=sorted(df['age'].unique())) diagnosis = st.sidebar.multiselect("Select Diagnosis", options=df['diag_1'].unique(), default=["Circulatory", "Diabetes"]) # Filter the data based on user selection filtered_df = df[df['age'].isin(age_group) & df['diag_1'].isin(diagnosis)] # Page 1: Overview if page == "Overview": st.title("Hospital Readmissions Overview") # Total Patients and Readmission Rate total_patients = len(filtered_df) readmission_rate = filtered_df['readmitted'].value_counts(normalize=True).get('yes', 0) * 100 col1, col2 = st.columns(2) col1.metric("Total Patients", total_patients) col2.metric("Readmission Rate (%)", f"{readmission_rate:.2f}%") # Age Distribution st.subheader("Age Distribution of Patients") fig_age = px.histogram(filtered_df, x='age', nbins=10, title="Age Distribution", labels={'age': 'Age Group', 'count': 'Number of Patients'}) fig_age.update_layout(showlegend=False) st.plotly_chart(fig_age, use_container_width=True) # Page 2: Factors Influencing Readmissions elif page == "Factors Influencing Readmissions": st.title("Factors Influencing Readmissions") # Readmission by Medical Specialty st.subheader("Readmission Rates by Medical Specialty") specialty_readmission = filtered_df.groupby('medical_specialty')['readmitted'].value_counts(normalize=True).unstack().fillna(0) specialty_readmission = specialty_readmission.sort_values(by='yes', ascending=False).head(10) fig_specialty = px.bar(specialty_readmission, y='yes', title="Top Specialties with High Readmission Rates", labels={'index': 'Medical Specialty', 'yes': 'Readmission Rate (%)'}) fig_specialty.update_layout(yaxis_tickformat=".0%") st.plotly_chart(fig_specialty, use_container_width=True) # Page 3: Hospital Stay and Procedures elif page == "Hospital Stay and Procedures": st.title("Hospital Stay and Procedures") # Hospital Stay Duration by Readmission Status st.subheader("Hospital Stay Duration by Readmission Status") fig_stay = px.box(filtered_df, x='readmitted', y='time_in_hospital', title="Hospital Stay Duration by Readmission Status", labels={'readmitted': 'Readmitted', 'time_in_hospital': 'Hospital Stay (Days)'}) st.plotly_chart(fig_stay, use_container_width=True) # Page 4: Patient Health Insights elif page == "Patient Health Insights": st.title("Patient Health Insights") # Diabetes and Readmissions st.subheader("Diabetes Medication and Readmissions") diabetes_readmission = filtered_df.groupby('diabetes_med')['readmitted'].value_counts(normalize=True).unstack().fillna(0) fig_diabetes = px.bar(diabetes_readmission, barmode='group', title="Readmission Rates by Diabetes Medication", labels={'index': 'Diabetes Medication', 'yes': 'Readmission Rate (%)'}) fig_diabetes.update_layout(yaxis_tickformat=".0%") st.plotly_chart(fig_diabetes, use_container_width=True) # Page 5: Recommendations elif page == "Recommendations": st.title("Recommendations to Reduce Readmissions") st.markdown(""" ### Key Risk Factors for Readmission: - **Age Group**: Older patients (70-90) have higher readmission rates. - **Medical Specialty**: Certain specialties like Cardiology and Internal Medicine show higher readmission rates. - **Diagnosis**: Circulatory and Respiratory conditions are common among readmitted patients. - **Medication Changes**: Patients with medication changes are more likely to be readmitted. ### Tips to Reduce Readmissions: - **Adhere to Medications**: Ensure patients take prescribed medications consistently. - **Follow-Up Appointments**: Schedule regular follow-ups after discharge. - **Monitor Chronic Conditions**: Pay special attention to patients with diabetes or circulatory issues. - **Emergency Visits**: Address underlying issues for patients with frequent emergency visits. """) # Interactive Widget st.subheader("Personalized Risk Factors") selected_age = st.selectbox("Select Age Group", sorted(filtered_df['age'].unique())) selected_diagnosis = st.selectbox("Select Diagnosis", filtered_df['diag_1'].unique()) personalized_df = filtered_df[(filtered_df['age'] == selected_age) & (filtered_df['diag_1'] == selected_diagnosis)] readmission_rate_personalized = personalized_df['readmitted'].value_counts(normalize=True).get('yes', 0) * 100 st.metric("Readmission Rate for Selected Group", f"{readmission_rate_personalized:.2f}%")