|
|
|
|
|
import streamlit as st |
|
|
import pandas as pd |
|
|
import plotly.express as px |
|
|
|
|
|
|
|
|
@st.cache_data |
|
|
def load_data(): |
|
|
df = pd.read_csv("hospital_readmissions.csv") |
|
|
|
|
|
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') |
|
|
|
|
|
df['age'] = df['age'].str.extract(r'\[(\d+)-').astype(float) |
|
|
return df |
|
|
|
|
|
df = load_data() |
|
|
|
|
|
|
|
|
st.sidebar.title("Navigation") |
|
|
page = st.sidebar.radio("Go to", ["Overview", "Factors Influencing Readmissions", |
|
|
"Hospital Stay and Procedures", "Patient Health Insights", |
|
|
"Recommendations"]) |
|
|
|
|
|
|
|
|
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"]) |
|
|
|
|
|
|
|
|
filtered_df = df[df['age'].isin(age_group) & df['diag_1'].isin(diagnosis)] |
|
|
|
|
|
|
|
|
if page == "Overview": |
|
|
st.title("Hospital Readmissions Overview") |
|
|
|
|
|
|
|
|
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}%") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
elif page == "Factors Influencing Readmissions": |
|
|
st.title("Factors Influencing Readmissions") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
elif page == "Hospital Stay and Procedures": |
|
|
st.title("Hospital Stay and Procedures") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
elif page == "Patient Health Insights": |
|
|
st.title("Patient Health Insights") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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. |
|
|
""") |
|
|
|
|
|
|
|
|
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}%") |
|
|
|