Why Not SW CAMP 5기/수업 기록

[2월 3주차-2/21]😊 병원 노쇼 환자 분석 🏥

rubii 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 줄이기 위한 아이디어! 💡

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

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

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

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