728x90
SMALL
- 해당 글에서는 전에 진행되었던 심부전 데이터로 분석했던 내용들을 정리해보고자 합니다.
🏥 심부전 데이터 분석 프로젝트
🩺 심부전 데이터셋 변수 파악
변수명 | 변수 설명 |
Age | 나이 |
Sex | 성별 |
ChestPainType | 흉통 유형 |
RestingBP | 안정된 상태에서 측정된 혈압 |
Cholesterol | 혈액 내 콜레스테롤 농도 |
FastingBS | 공복 상태에서 측정된 혈당 |
RestingECG | 안정된 상태에서 측정된 심전도 |
MaxHR | 최대 심박수 |
ExerciseAngina | 운동 시 협심증을 경험했는지 여부 |
HeartDisease | 심장병 보유 여부 |
🩺 심부전 데이터셋 필터링
- 심장병이 있는 사람들의 데이터만 추출하는 방법은 논리형 인덱싱을 사용하면 간단하게 해결할 수 있습니다.
H = heart[heart['HeartDisease'] == 1]
- 위와 같이 True 값인 행만 추출하는 논리형 인덱싱으로 심장병이 있는 사람들의 데이터를 선별할 수 있습니다.
🩺 심부전 데이터셋 결측치 처리
- 데이터의 결측치는 넷플릭스 데이터에서도 처리했듯 발생 비율에 따라 다르게 처리해야 합니다.
for i in heart.columns:
mv_rate = heart[i].isna().sum() / len(heart) * 100
if mv_rate > 0:
print(f'{i}에서 결측치가 {mv_rate:.2f}% 발생하였습니다!')
# 출력값
# RestingBP에서 결측치가 2.94% 발생하였습니다!
# FastingBS에서 결측치가 9.91% 발생하였습니다!
# HeartDisease에서 결측치가 0.22% 발생하였습니다!
- 결측치는 각 컬럼의 비율마다 아래와 같이 처리되었습니다.
- RestingBP(혈압): 중앙값으로 대체 (데이터의 왜곡 방지)
- FastingBS(공복 혈당): 0으로 대체 (결측의 의미가 없는 경우)
- HeartDisease(심장병 여부): 결측치 비율이 0.22%로 낮아 해당 행 삭제
🩺 심부전 데이터셋 통계값 확인
💉 1. 심박수의 평균 및 중앙값
print(heart['MaxHR'].mean()) # 평균
print(heart['MaxHR'].median()) # 중앙값
- 확인해 본 결과, 평균값과 중앙값이 비슷하여 이상치가 적고 데이터가 고르게 분포됨을 확인할 수 있었습니다.
💉 2. 흉통 유형(ChestPainType) 빈도 분석
- 흉통 유형 중 무증상이 가장 많아 심장병 판단 시 무증상 유형에 주의할 필요가 있습니다.
- 무증상(ASY): 496건 (대다수)
- 비협심증(NAP): 202건
- 비전형적 협심증(ATA): 172건
- 전형적 협심증(TA): 46건
💉 3. 주요 변수들의 통계 요약
- 나이(Age): 평균 53.53세 → 50대 초반이 다수인 것을 확인할 수 있었습니다.
- 콜레스테롤 수치(Cholesterol): 평균 196, 표준편차 109
- 최대 심박수(MaxHR): 최소 심박수 60, 최대 심박수 202
💉 4. 그룹별 분석
- 심장병 여부에 따라로 변수들의 평균을 비교해본 결과는 다음과 같았습니다.
구분 | 나이 | 심박수 | 콜레스테롤 수치 |
정상인 | 54.69 | 150.5 | 222.73 |
심장병 환자 | 55.00 | 144.5 | 186.7 |
- 확인해보니 심장병이 있는 그룹에서가 평균적으로 나이가 많고 심박수가 낮은 것을 확인할 수 있었습니다.
- 또한, 성별에 따른 혈압 차이도 살펴봤는데, 성별에 따른 혈압 차이는 크지 않은 것을 보아
- 성별에 따른 건강 관리보다 개인별 건강 관리가 더 중요할 수 있다는 결론도 나왔습니다.
- 추가적으로 연령대 그룹화, 고혈압·고콜레스테롤·고혈당 환자의 위험도 분석, 운동이 심장에 미치는 영향 분석 등의 심화 분석도 가능합니다. 추후에 시간이 날 때 진행해보겠습니다!
🩺 심부전 데이터셋 시각화
🎨 심부전 데이터셋 색상
🎨 흉통 유형 비율 시각화
- 무증상(ASY) 흉통이 대부분이기 때문에 심장병 판단 시 주된 고려 요인이라고 볼 수 있습니다.
🎨 심부전증 여부에 따른 흉통 유형 막대 그래프
- 위 차트를 그리기 위해 plt에서 제공하는 tight_layout() 함수를 사용했는데, 이 함수는 막대 그래프에서 막대끼리 겹치지 않도록 최소한의 여백을 만들어주는 역할을 합니다.
- 심장병이 있는 사람들은 무증상이 대부분이라, 심장 질환과 흉통 유형 간의 강한 관련성을 가지게 됩니다.
- 심장병이 심각한 단계에 이를 때까지 증상이 나타나지 않을 수 있기 때문에
- 무증상 환자들에 대한 모니터링을 강화해야하고, 조기 검진을 통한 조기 발견이 중요하다고 봅니다.
- 반면, 심장병이 없는 사람들에게서는 비전형적인 흉통이 대부분입니다.
- 비환자들에게도 심장 건강에 대한 경각심을 일깨워주고, 심장 검진을 자주 받을 수 있게 국가에서 독려해줘야 합니다.
🎨 심부전 여부별 연령 분포 그래프
- 나이에 따른 심부전 여부를 수치화 후에 fill_between() 함수로 그래프의 영역 채우도록 실습했습니다.
- 여기서 쓰이는 fill_between() 함수의 주요 옵션들은 아래와 같습니다.
- x: 곡선을 정의하는 노드의 x 좌표
- y1: 첫번째 곡선을 정의하는 노드의 y 좌표
- y2: 두번째 곡선을 정의하는 노드의 y 좌표
- alpha: 투명도
- label: 범례에 표시할 문자열 입력
plt.fill_between(x=heart_age[0].index, y1=0, y2=heart_age[0],
color='#003399', alpha=1, label='Normal')
plt.fill_between(x=heart_age[1].index, y1=0, y2=heart_age[1],
color='#0099FF', alpha=0.7, label='Abnormal')
- 위와 같이 작성하게 되면 y1(0)부터 y2(해당 데이터)까지 영역을 채워달라는 뜻이 됩니다 !
🎨 심부전 범주형 산점도 그래프
- 하나의 figure에 두 가지 plot을 그리려면 add_subplot() 함수가 요구됩니다.
- 먼저, 그래프 객체를 각각 생성해주고, (figure에 2개의 subplot(ax1, ax2) 생성)
- sns.swarmplot()의 ax 옵션에 해당 객체들을 설정해주면 됩니다.
- sns.swarmplot() 함수는 범주형 변수에 들어 있는 각 범주별 데이터의 분포를 확인하게 해주는 차트입니다.
🎨 심부전 관련 논문 제목 워드 클라우드
- 마지막으로 위 워드 클라우드는 Pubmed 사이트의 심부전 관련 논문의 제목 데이터를 가지고 진행했고,
- 여기서는 heart failure(심부전), patient(환자), ejection fraction(박출 계수) 등의 단어가 자주 등장함을 확인할 수 있었습니다.
728x90
LIST
'Projects > LG U+' 카테고리의 다른 글
[Data Analysis] 국내 항공기 운항 데이터 (4) | 2025.03.10 |
---|---|
[Data Analysis] 병원 No-Show 데이터 (0) | 2025.03.10 |
[Data Analysis] 한국복지패널 데이터 (13) | 2025.03.09 |
[Data Analysis] 야후 파이낸스 주식 데이터 (4) | 2025.03.05 |
[Data Analysis] 미국 항공기 운항 데이터 (4) | 2025.03.02 |