티스토리 뷰

오늘은 데이터 전처리병원 노쇼(No-show) 데이터 분석을 진행했습니다. 데이터 분석의 정확도를 높이기 위해서는 데이터의 품질을 향상시키는 것이 필수적이며, 이를 위해 다양한 전처리 기법을 학습했습니다. 이후 실제 의료 데이터를 활용하여 환자의 예약 패턴과 노쇼 발생 원인을 분석했습니다.


1. 데이터 전처리 과정

1.1 데이터 타입 일관성 유지

  • 데이터 타입의 불일치는 모델 성능 저하의 주요 원인 중 하나입니다.
  • 예를 들어, 숫자형 데이터가 문자열로 저장되어 있을 경우, 이를 적절한 숫자형으로 변환해야 합니다.
import pandas as pd

# 데이터프레임 생성
data = pd.DataFrame({
    'A': ['1', '2', '3'],
    'B': ['4', '5', '6'],
    'C': ['7', '8', '9']
})

# 데이터 타입 확인
print(data.info())

# 데이터 타입 변환
data = data.astype({'A': 'int', 'B': 'int', 'C': 'int'})

# 변환 후 데이터 타입 확인
print(data.info())

1.2 결측치 처리

  • 결측치는 데이터 분석의 정확도를 저하시킬 수 있으므로 적절한 처리가 필요합니다.
  • 결측치를 처리하는 방법에는 제거대체가 있습니다.
import pandas as pd

# 결측치가 포함된 데이터프레임 생성
data = pd.DataFrame({
    'A': ['1', '2', '3', None],
    'B': ['4', None, '5', '6'],
    'C': [None, '7', '8', '9']
})

# 결측치가 있는 행 제거
data_dropna = data.dropna()
print(data_dropna)

# 결측치를 0으로 대체
data_fillna_zero = data.fillna('0')
print(data_fillna_zero)

# 결측치를 각 열의 평균값으로 대체
data = data.astype({'A': 'float', 'B': 'float', 'C': 'float'})
data_fillna_mean = data.fillna(data.mean())
print(data_fillna_mean)

1.3 이상치 탐지 및 처리

  • 이상치는 데이터의 분포를 왜곡시켜 분석 결과에 악영향을 미칠 수 있습니다.
  • 박스플롯(Boxplot)을 활용하여 이상치를 시각적으로 탐지할 수 있습니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 데이터프레임 생성
df = pd.DataFrame(np.random.randn(8, 3), columns=['C1', 'C2', 'C3'])

# 이상치 추가
df.loc[1, 'C1'] = 11
df.loc[3, 'C3'] = -10

# 박스플롯 시각화
plt.boxplot([df['C1'], df['C3']])
plt.xticks([1, 2], ['C1', 'C3'])
plt.show()

1.4 목적에 맞는 변수 추출

  • 변수 간의 상관관계를 분석하여 중요한 변수를 추출하는 것이 중요합니다.
  • 히트맵(Heatmap)을 활용하여 변수 간의 상관관계를 시각화할 수 있습니다.
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 데이터프레임 생성
df = pd.DataFrame(np.random.randn(8, 3), columns=['C1', 'C2', 'C3'])

# 상관계수 행렬 계산
corr_matrix = df.corr()

# 히트맵 시각화
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.show()

2. 병원 노쇼(No-show) 데이터 분석

2.1 문제 정의

A 병원에서는 예약한 환자들이 방문하지 않아 진료 일정이 원활하지 않은 문제가 발생하고 있습니다. 이를 해결하기 위해:

  • 노쇼(No-show) 환자의 특징을 분석
  • 노쇼 발생을 줄일 수 있는 방법 도출

2.2 데이터 로드 및 전처리

import pandas as pd

# 데이터 로드
df = pd.read_csv('medical.csv')

# 데이터 정보 확인
df.info()
  • isnull().any()를 사용해 결측치 확인
df.isnull().any(axis=0)
  • 나이(Age)가 0 이상인 데이터만 유지하여 이상치 제거
df = df[df.Age >= 0]
  • No-show 컬럼을 0과 1로 변환 (Yes → 1, No → 0)
df['No-show'] = df['No-show'].map({'Yes': 1, 'No': 0})
  • 날짜 데이터 변환 (ScheduledDay, AppointmentDay → datetime 형식)
df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])

2.3 노쇼 분석

1) 대기일수(waiting_day)와 노쇼 비율

  • 방문 당일 예약한 환자는 노쇼 확률이 낮음
df['waiting_day'] = (df['AppointmentDay'] - df['ScheduledDay']).dt.days

# 대기일수 10일 이하 환자의 노쇼 여부 비교
import matplotlib.pyplot as plt

no_show = df[df['No-show'] == 1]
show = df[df['No-show'] == 0]

no_show[no_show['waiting_day'] <= 10]['waiting_day'].hist(alpha=0.7, label='No-show')
show[show['waiting_day'] <= 10]['waiting_day'].hist(alpha=0.3, label='Show')
plt.legend()
plt.show()

2) 예약 날짜와 노쇼 비율

no_show['ScheduledDay'].hist(alpha=0.7, label='No-show')
show['ScheduledDay'].hist(alpha=0.3, label='Show')
plt.legend()
plt.show()

3) 재방문 환자의 노쇼 패턴

df.PatientId.value_counts().iloc[:500].hist()
plt.show()

4) 알림(SMS) 허용 여부와 노쇼 관계

import seaborn as sns

sns.barplot(x='SMS_received', y='waiting_day', hue='No-show', data=df)
plt.show()

 


5) 성별과 노쇼 비율

sns.countplot(x='Gender', hue='No-show', data=df)
plt.show()

3. 노쇼 예방을 위한 해결방안

  1. 대기기간을 짧게 유지 → 예약 후 방문까지의 기간이 길어질수록 노쇼 발생 가능성 증가
  2. 알림(SMS) 시스템 강화 → 특히, 대기일수가 긴 환자에게는 추가적인 리마인드 필요
  3. 재방문 패턴 분석 및 관리 → 특정 환자가 반복적으로 예약을 잡고 방문하지 않는 패턴 분석 후 조치 필요

오늘 배운 데이터 전처리 기법과 병원 노쇼 데이터 분석을 통해 실전에서 데이터를 다룰 때 고려해야 할 점들을 학습할 수 있었습니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함