ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2월 3주차-2/21]😊 병원 노쇼 환자 분석 🏥
    Why Not SW CAMP 5기/수업 기록 2025. 2. 24. 09:20

    📌 문제 정의

     한 병원에서는 예약한 환자들이 오지 않아 진료가 원활히 이루어지지 않는 일이 종종 발생

    문제를 해결하기 위해 

    • 예약하고 오지 않는 환자들의 특징을 파악하고,
    • 'No Show' 발생률을 줄일 수 있는 아이디어를 제시!!!

    📊 데이터 설명

    속성 값 형태 설명

    PatientID number 환자ID
    AppointmentID number 예약ID
    Gender F or M 성별
    ScheduledDay date 병원 예약을 한 날 📅
    AppointmentDay date 실제 병원에 방문하는 날 🏥
    Age number 나이 👶👴
    Neighbourhood string 병원 위치 📍
    SMS_received 0 or 1 메시지 수락 여부 📩
    No-show Yes or No 노쇼 여부 🚫

    📊 데이터 전처리 및 분석 

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.read_csv('data/medical.csv')
    df.head(3)
    

    1️⃣ 데이터 확인 🧐

    df.isnull().sum()
    df.info()
    df.describe()
    

    2️⃣ 이상치 제거 및 데이터 변환 ✍️

    # Age에 이상치 제거
    🚨 df = df[df.Age>=0]
    df = df[df.Age<=110]
    
    # No-show 데이터 타입 변경
    🔄 df['No-show'] = df['No-show'].map({'Yes': 1, 'No':0})
    
    # datetime으로 타입 변경
    🕒 df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
    df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])
    

    3️⃣ 대기 기간 변수 추가 및 분석 🔎

    df['waiting_day'] = df['AppointmentDay'].dt.dayofyear - df['ScheduledDay'].dt.dayofyear
    df = df[df.waiting_day >= 0]
    

    📉 대기 기간이 길수록 노쇼 발생률 증가!

    📊 노쇼와 관련된 데이터 시각화 🔍

    1️⃣ 노쇼 발생 여부 📊

    sns.countplot(x='No-show', data=df)
    plt.title('노쇼 발생 횟수')
    plt.show()

    2️⃣ 성별에 따른 노쇼 차이 분석 👫

    sns.countplot(x='Gender', hue='No-show', data=df)
    plt.title('성별에 따른 노쇼 여부')
    plt.show()

    3️⃣ 대기 기간과 노쇼 관계 📅

    plt.figure(figsize=(10,5))
    sns.histplot(df[df['No-show']==1]['waiting_day'], bins=30, color='red', label='No-show', alpha=0.7)
    sns.histplot(df[df['No-show']==0]['waiting_day'], bins=30, color='blue', label='Show', alpha=0.3)
    plt.legend()
    plt.title('대기일과 노쇼 발생 관계')
    plt.show()

    4️⃣ 알림 메시지 허용 여부와 노쇼 📩

    sns.barplot(x='SMS_received', y='waiting_day', hue='No-show', data=df)
    plt.title('알림 메시지 여부와 노쇼 발생')
    plt.show()

    5️⃣ 노쇼 비율 비교 📊

    a = len(df[(df['SMS_received']==0) & (df['No-show']==1)])
    b = len(df[(df['SMS_received']==0) & (df['No-show']==0)])
    c = len(df[(df['SMS_received']==1) & (df['No-show']==1)])
    d = len(df[(df['SMS_received']==1) & (df['No-show']==0)])
    
    print(f'알림 메시지 미허용 노쇼율: {a / (a+b):.2%}')
    print(f'알림 메시지 허용 노쇼율: {c / (c+d):.2%}')

    📊 결론

    1. 대기일수가 길수록 노쇼 증가 📈
    2. 알림 메시지 미허용 시 5일 이상 대기하면 노쇼 가능성 증가 ⚠️
    3. 성별과 노쇼의 연관성 존재 🤔

    📌 No-show 줄이기 위한 아이디어! 💡

    ✅ 대기 시간이 길어지지 않도록 예약 시스템 최적화

    ✅ 알림 메시지를 적극 활용해 방문 유도 📩

    ✅ 예약 후 일정 리마인드 기능 추가 🔔

    ✅ 노쇼 가능성이 높은 환자들에게 별도 안내 제공 📢


Designed by Tistory.