RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (117)
    • Study Note (80)
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (26)
      • Machine Learning (16)
      • Streamlit (9)
      • Django (1)
      • Deep Learning (12)
      • dbt (2)
      • SQL (3)
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/Streamlit

의료 데이터 분석, 웹으로 띄우기 (기초편)

2025. 12. 29. 13:42

지금까지 주피터 노트북에서만 보던 그래프를, 이제는 클릭 가능한 웹 대시보드로 만들어봅시다.

데이터를 불러오고(Load), 보여주고(Display), 그리는(Plot) 3단계면 충분합니다.

시나리오: 고혈압 환자 관리 대시보드

환자의 나이, BMI, 혈압(Blood Pressure), 재입원 여부를 분석하는 대시보드를 만들어보겠습니다.

import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import seaborn as sns
import matplotlib.pyplot as plt

# 1. 페이지 기본 설정
st.set_page_config(page_title="고혈압 환자 분석기", page_icon="🩺", layout="wide")

# 2. 가상의 의료 데이터 생성 (300명)
def get_medical_data():
    np.random.seed(42)
    n = 300
    df = pd.DataFrame({
        'Patient_ID': range(1, n+1),
        'Age': np.random.randint(30, 80, n),
        'BMI': np.random.normal(25, 4, n).round(1),
        'Blood_Pressure': np.random.randint(90, 160, n), # 수축기 혈압
        'Risk_Group': np.random.choice(['Low', 'Medium', 'High'], n),
        'Readmitted': np.random.choice([0, 1], n, p=[0.7, 0.3]) # 0:정상, 1:재입원
    })
    return df

st.title("고혈압 환자 데이터 분석 대시보드")
st.markdown("환자의 임상 지표와 재입원율의 관계를 시각적으로 분석합니다.")

# 데이터 불러오기
df = get_medical_data()

# 3. 데이터 및 상관관계 분석
col1, col2 = st.columns([1, 2]) # 화면 분할 (1:2 비율)

with col1:
    st.subheader("환자 데이터셋")
    st.dataframe(df.head(10)) # 상위 10개 행만 표시
    
    st.markdown("---")
    st.subheader("상관관계 분석")
    # 상관관계 히트맵 (Age, BMI, Blood_Pressure)
    numeric_df = df[['Age', 'BMI', 'Blood_Pressure', 'Readmitted']]
    corr = numeric_df.corr()
    
    fig_corr, ax = plt.subplots(figsize=(5, 4))
    sns.heatmap(corr, annot=True, fmt=".2f", cmap='coolwarm', ax=ax)
    st.pyplot(fig_corr)

with col2:
    st.subheader("위험군별 혈압 분포")
    # Plotly를 이용한 인터랙티브 차트
    fig_bp = px.box(df, x="Risk_Group", y="Blood_Pressure", color="Readmitted",
                    title="위험군(Risk Group)에 따른 혈압 분포와 재입원 여부")
    st.plotly_chart(fig_bp, use_container_width=True)

 

 

핵심 포인트:

  • st.dataframe(): 엑셀처럼 데이터를 보여줍니다.
  • st.columns(): 화면을 좌우로 나누어 레이아웃을 잡습니다.
  • st.pyplot() & st.plotly_chart(): 맷플롯립과 플로틀리 그래프를 웹에 띄웁니다.

 

'Study Note > Streamlit' 카테고리의 다른 글

"내 앱은 왜 자꾸 까먹을까?" : Session State와 Caching 완벽 해부  (0) 2025.12.29
속도는 올리고 코드는 깔끔하게  (0) 2025.12.29
머신러닝 모델 연동: "재입원 확률, AI에게 물어보세요"  (0) 2025.12.29
EDA 대시보드: 가상의 의료 데이터 생성 및 시각화  (0) 2025.12.29
데이터 분석가를 위한 웹 개발: 3분 만에 내 노트북을 웹으로 띄우기  (0) 2025.12.29
    'Study Note/Streamlit' 카테고리의 다른 글
    • "내 앱은 왜 자꾸 까먹을까?" : Session State와 Caching 완벽 해부
    • 속도는 올리고 코드는 깔끔하게
    • 머신러닝 모델 연동: "재입원 확률, AI에게 물어보세요"
    • EDA 대시보드: 가상의 의료 데이터 생성 및 시각화
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바