Python
[Pandas]데이터 분석하기
zzheng
2024. 6. 12. 21:29
파이썬의 판다스 라이브러리를 사용하여 데이터를 확인해보겠습니다.
이를 위해, 먼저 데이터를 다운 받아보겠습니다. 아래의 사이트에 이동해서 데이터를 다운받아서 알집을 풀어준 후, 원하시는 경로에 저장하면 됩니다. 아래 데이터는 의료데이터 입니다.
https://physionet.org/content/mimiciii-demo/1.4/#files-panel
MIMIC-III Clinical Database Demo v1.4
physionet.org
그다음, 먼저 판다스를 import합니다.
import pandas as pd
PATH에 데이터를 저장한 경로를 작성한 다음, 아래와 같이 데이터프레임으로 불러옵니다.
PATH = '/content/drive/MyDrive/data/mimic-iii-clinical-database-demo-1.4/'
patients = pd.read_csv(PATH+"PATIENTS.csv" )
admissions = pd.read_csv(PATH+"ADMISSIONS.csv" )
diagnoses_icd = pd.read_csv(PATH+"DIAGNOSES_ICD.csv" )
icustays = pd.read_csv(PATH+"ICUSTAYS.csv" )
d_icd_diagnoses = pd.read_csv(PATH+"D_ICD_DIAGNOSES.csv" )
chartevents = pd.read_csv(PATH+"CHARTEVENTS.csv" )
이제 판다스를 이용해서 데이터를 분석해보겠습니다.
- 정보보기
patients.info()
patients.nunique()
patients.gender.value_counts()
patients.subject_id
- patients 테이블 정보 확인 및 부분 정보 추출
patients.loc[:, 'subject_id':'dob']
- 질환명 데이블 정보 확인
diagnoses_icd.info()
diagnoses_icd.columns
d_icd_diagnoses.info()
- 환자의 진단명 알아보기
pd.merge(diagnoses_icd, d_icd_diagnoses, on='icd9_code', how='left')
df1 =pd.merge(diagnoses_icd, d_icd_diagnoses, on='icd9_code', how='left')[['subject_id', 'hadm_id', 'seq_num', 'icd9_code', 'short_title']]
df1
- 어느 진단명의 환자가 많았을까?
df1.short_title.value_counts()
- 20개정도 보기
df1.short_title.value_counts()[:20]
- 각 환자는 몇 번씩 입원했나?
g = df1.groupby(['subject_id'])
g.count()
g.hadm_id.count()
- 환자별로 입원시 진단명 확인
for p_id, df in g:
print(f'subject_id: {p_id}')
print(df.short_title.values)
print()
- 환자 정보 중 성별 정보와 입원 정보 추출
d2 = pd.merge(patients, admissions, on='subject_id', how='left')
d2 = d2[['subject_id', 'gender', 'hadm_id', 'insurance', 'diagnosis', \
'admittime', 'admission_type', 'admission_location']]
d2
- 환자는 어떻게 입원했는가? 보험은?
d2.admission_type.value_counts()
d2.insurance.value_counts()
- 각 보험별로 질환별 환자는 몇 명인가?
d2.groupby(['insurance', 'diagnosis']).count()
- 어떤 보험의 어떤 질환이 가장 많았을까?
d2.groupby(['insurance', 'diagnosis']).subject_id.count()
d2.groupby(by=['insurance', 'diagnosis']).count().index[0:2]
d2.groupby(['insurance', 'diagnosis']).subject_id.count().max()
d2.groupby(['insurance', 'diagnosis']).subject_id.count().argmax()
d2.groupby(by=['insurance', 'diagnosis']).count().index[61]
- 환자의 집중치료실 입원정보
#환자 정보를 집중치료실 입원정보와 결합
d3 = pd.merge(d2, icustays, on=['subject_id', 'hadm_id'])
d3
d3.subject_id.value_counts()
- 환자별 집중치료실 입원횟수와 입퇴원 날짜 시간 알아보기
g = d3.groupby('subject_id')
for p_id, df in g:
print(f'subject_id: {p_id} ({len(df)}회')
print(df[['first_wardid', 'last_wardid', 'intime', 'outtime']])
print()
for p_id, df in g:
print(f'subject_id: {p_id} ({len(df)}회')
print(df[['icustay_id','first_wardid', 'last_wardid', 'intime', 'outtime']])
print('-'*70)
d3[d3.subject_id ==41976][['icustay_id', 'first_wardid', 'last_wardid', 'intime', 'outtime']]
- 질환별로 집중치료실 사용상태 알아보기
d3.columns
g = d3.groupby('diagnosis')
g.count().subject_id.value_counts()
for d_id, df in g:
print(f'질환명: {d_id} ({len(df)}회')
print(df[['subject_id', 'intime', 'outtime']])
print('-'*70)