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%}')
📊 결론
- 대기일수가 길수록 노쇼 증가 📈
- 알림 메시지 미허용 시 5일 이상 대기하면 노쇼 가능성 증가 ⚠️
- 성별과 노쇼의 연관성 존재 🤔
📌 No-show 줄이기 위한 아이디어! 💡
✅ 대기 시간이 길어지지 않도록 예약 시스템 최적화
✅ 알림 메시지를 적극 활용해 방문 유도 📩
✅ 예약 후 일정 리마인드 기능 추가 🔔
✅ 노쇼 가능성이 높은 환자들에게 별도 안내 제공 📢