흡연여부 데이터분석 (개인 분석)

김현희·2026년 4월 27일

오늘부터 3일 동안 프로젝트를 시작한다.
내일 오전까지 개인이 흡연여부에 대한 데이터를 보면서 먼저 분석을 하고
내일 오후부터는 배정된 팀원들과 다시 한번 분석을 시행할 예정이다.

흡연자와 비흡연자 간의 생체·건강 지표 차이를 검증하려는 프로젝트

분석 전 준비과정

import pandas as pd ➡️ 데이터 준비
import matplotlib.pyplot as plt ➡️ 그래프 그리기
import seaborn as sns ➡️ 그래프를 더 쉽게 + 예쁘게


다운받은 파일 등록하기


1. 기본 정보 확인 및 데이터 정제

  • 각 컬럼의 데이터 타입, Non-null 값 개수 등을 확인

💡 a. .apply() 한 줄 정의

  • 각 데이터 하나씩 꺼내서 함수에 넣어주는 것
  • for문을 쓰지 않아도 깔끔하게 출력할 수 있음

    health_data['체중상태'] = health_data['BMI'].apply(checkbmi)
    : BMI에 저장된 값을 하나씩 꺼내서 check_bmi 돌리고 '체중상태'라는 새 열에 결과를 저장하라는 말

1-1. 결측치 분석


➡️ 시력 140, 공복혈당 140, 혈압 140, 중성지방 140개의 결측치가 있음을 확인할 수 있음.

‼️ 결측치가 있을 때 생기는 문제

1️⃣ 분석 결과가 왜곡될 수 있음.
: 평균, 합계 같은 통계값을 계산하면 실제보다 값이 작거나 크게 나올 수 있다.
2️⃣ 데이터 개수가 줄어들어 신뢰도가 떨어짐
3️⃣ 에러가 발생할 수 있음
: NaN이 포함되면 예상과 다른 결과가 나오거나 일부 함수는 아예 오류 발생할 수 있음.
➡️ 해결 방법:평균값(mean) / 중간값 (median) /최빈값 (mode)로 채우기
또는 별도 처리 (예: “Unknown”)

fillna()란?

💡 b. .fillna(값) : 비어있는 값(NaN)을 다른 값으로 채우는 함수

  • 평균값 : df['BMI'].fillna(df['BMI'].mean())
    : 가장 무난한 방법으로 데이터 전체 흐름 유지, 대신 극단값에 약함
  • 중앙값 : df['BMI'].fillna(df['BMI'].median())
    : 이상치(outlier) 많을 때 더 좋음
  • 최빈값 : df['성별'].fillna(df['성별'].mode()[0])
    : 범주형 데이터에 사용

💡 c..transform() = 그룹별 계산 결과를 원래 데이터 크기에 맞춰 다시 뿌려주는 것

health_data.groupby('나이대 구분')['중성 지방'].transform('mean')

: '나이대 구분'을 기준으로 그룹을 설정하고, 각 그룹 내 평균값으로 NaN 결측치를 채우하는 말.

[결측값들이 모두 사리진 것을 확인할 수 있음.]


2. 데이터 분석하기

  • label = 0(비흡연자), label = 1(흡연자)
  • 흡연과 관련성이 높아 보이는 지표들('BMI', '혈압', '중성 지방', '헤모글로빈','간 효소율','공복 혈당','콜레스테롤)을 선정해서 평균값을 계산해봤다.

💡d. 표를 시각화해서 만들 기 전 한글을 입력했을 때 깨지지 않도록 설정하기

#colab의 경우 폰트 설치후 런타임 재시작
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
.
#'NanumGothic' 폰트를 기본 폰트로 설정
plt.rc('font', family='NanumBarunGothic')
#마이너스 기호가 깨지는 현상 방지
plt.rcParams['axes.unicode_minus'] = False

  1. 흡연과 BMI ➡️ 유의한 차이는 보기 힘드나 양의 관계를 갖는 것을 확인

  2. 흡연과 헤모글로빈 ➡️ 흡연자 그룹에서 헤모글로빈 수치가 더 높음을 확인

  3. 흡연과 혈압 ➡️ 관계성이 적음을 확인

  4. 흡연과 중성지방 ➡️ 흡연자 그룹과 가장 큰 양의 관계를 가지고 있음을 확인

  5. BMI와 간 효소율 ➡️ 관계성이 거의 없음을 확인

  6. 중성지방과 BMI ➡️ 미세하게 양의 관계를 가지고 있음을 확인

‼️ 간단히 관계성만 확인함. 자세한 자료 해석은 이변량 분석에서

[자료 분석 전 세운 가설]

1️⃣ BMI와 간 효소 수치(AST, ALT, GGT)는 양의 관계를 갖는다.
2️⃣ 중성지방과 BMI는 양의 관계를 갖는다.
3️⃣ 따라서 흡연자는 비흡연자와 비교 시 높은 중성지방과 간효소 수치를 가질 것이다.
‼️ 간 효소율과 BMI간의 관계 산점도를 봤을 때 관련이 없는 것을 확인하고 위 가설이 틀렸음을 확인함.

[새로 세운 가설]

1️⃣ 흡연하는 환자의 중성지방 수치가 비흡연자보다 더 높다.
2️⃣ 흡연하는 환자의 헤모글로빈 수치는 더 높다.
3️⃣ 흡연하는 환자의 BMI수치가 더 높다.

  1. 헤모글로빈과 중성지방 ➡️ 양의 관계를 갖는 것을 확인

  2. 헤모글로빈과 BMI ➡️ 유의하지는 않지만 양의 관계를 갖는 것을 확인

2-1. 단변량 분석

  • 각 변수(컬럼)의 특성을 개별적으로 탐색하는 과정으로 데이터의 전반적인 이해도를 높이고, 이상치나 결측값 등의 문제점을 파악

[단변량 분석 목적]

  • 데이터 품질 확인: 결측값, 이상치 등의 존재 여부를 파악
  • 변수 유형 이해: 각 변수가 숫자형인지 범주형인지 구분하고, 데이터의 특성을 파악
  • 기초 통계량 확인: 평균, 중앙값, 표준편차 등 핵심 통계치를 통해 데이터의 중심 경향과 퍼짐 정도를 파악
  • 분포 시각화: 히스토그램, 박스 플롯 등을 통해 변수의 분포 형태를 시각적으로 확인
  • 전처리 필요성 판단: NaN 값 처리, 가변수(Dummy Variable) 생성 등 추가 전처리 필요성을 결정
  • 비즈니스 인사이트 도출: 각 변수가 어떤 의미를 가지며, 어떤 비즈니스적 함의를 갖는지 정리
  • 추가 분석 아이디어 발굴: 단변량 분석 결과로부터 더 깊이 탐색할 만한 주제나 관계를 도출

BMI (체질량지수) 분석

  • 히스토그램: 약 23~25 사이에 가장 많은 데이터가 밀집해 있는 정규분포에 가까운 형태
  • 박스플롯: 중앙값(Median)이 24 근처에 위치함. 즉 전체적으로 과체중 경계선에 데이터가 많이 모여 있는 것을 확인 가능
  • 이상치(Outliers): 박스플롯의 오른쪽(상한선 밖)에 많은 점이 찍혀 있는 것으로 보아 BMI가 33 이상인 고도비만군 데이터가 존재함을 의미
  • 전반적으로 건강하거나 약간의 과체중 범위에 속하는 데이터가 주를 이루지만, 우측으로 꼬리가 긴 형태를 보여 고비만 인원이 일부 포함되어 있음을 확인 가능

중성 지방(Triglycerides) 분석

  • 히스토그램: 왼쪽으로 치우치고 오른쪽으로 아주 길게 늘어진 오른쪽 꼬리 분포(Right-skewed) 형태
  • 박스플롯: 중앙값은 100~110 부근에 형성되어 있으나, 히스토그램을 보면 100 이하의 빈도가 압도적으로 높음
  • 이상치(Outliers): 박스플롯 상한선(약 290)을 넘어 400에 육박하는 데이터가 매우 많음
  • 대다수는 정상 범위 내에 있으나, 중성 지방 수치가 비정상적으로 높은 고위험군의 편차가 매우 큼

헤모글로빈(Hemoglobin) 분석

  • 히스토그램: 왼쪽으로 약간 긴 꼬리(Left-skewed)를 가진 형태로 14~16 사이의 빈도가 가장 높음.
  • 박스플롯: 중앙값이 15 근처에 위치하며, 데이터가 특정 구간에 매우 조밀하게 모여 있어 변동성이 상대적으로 적다는 것을 알 수 있음
  • 이상치(Outliers): 박스플롯의 왼쪽(하한선 밖)에 이상치가 발견됨. 이는 수치가 10 이하로 낮은 빈혈 의심군 데이터가 일부 존재함을 나타냄.
  • 전체적으로는 정상 수치 범위 내에 안정적으로 분포하고 있으나, 수치가 낮은 하위 이상치들에 대한 확인이 필요해

2-2. 이변량 분석

  • 두 변수 간의 관계를 탐색하는 과정으로 이를 통해 변수들이 서로 어떻게 영향을 주고받는지 파악하고, 주요 예측 변수를 선별할 수 있음

이변량 분석의 목적

  • 변수 간 관계 탐색: 원인-결과 관계 또는 상호 연관성을 파악
  • 주요 영향 요인 도출: 어떤 변수가 목표 변수(예: 흡연 여부)에 가장 큰 영향을 미치는지 확인
  • 예측 모델 Feature 선별: 향후 예측 모델 구축 시 중요한 특성(Feature) 후보를 선별
  • 수립한 가설들을 검정하기 위해 변수 유형에 따라 다음 통계 검정 방법을 활용

➡️ 유의수준 : 일반적으로 5% (0.05)를 기준으로 합니다.

  • 숫자형 변수 vs 숫자형 변수 : 상관분석 (Correlation Analysis)
  • 범주형 변수 vs 범주형 변수 : 카이제곱 검정 (Chi-squared Test)
    *범주형 변수 vs 숫자형 변수 : t-검정 (t-test), 분산 분석 (ANOVA)
  • 숫자형 변수 vs 범주형 변수 : 로지스틱 회귀모형을 통해, 회귀계수의 P-value로 검정 수행

1. 흡연여부 vs 중성 지방 (Triglycerides)

  • 세 변수 중 흡연여부에 따른 차이가 가장 두드러짐
  • 흡연자 그룹이 비흡연자 그룹보다 중성 지방 수치의 중앙값(Median)이 훨씬 높고, 박스의 위치(IQR 범위)도 상단에 형성되어 있음
    특히 흡연자 그룹에서 300~400 사이의 고농도 수치가 더 빈번하게 관찰됨
  • 따라서 중성 지방 수치는 흡연자와 관련이 있음을 확인할 수 있음.

2. 흡연여부 vs BMI

  • 어느 정도의 차이가 존재하지만, 중성 지방만큼 극명하지는 않음
  • 흡연자 그룹의 중앙값이 비흡연자 그룹보다 미세하게 높음
  • 박스의 전체적인 위치가 조금 더 위쪽에 치우쳐 있어, 흡연자 그룹의 체질량지수가 전반적으로 높은 경향을 보임
  • 두 그룹 모두 상단에 이상치가 많으므로, BMI가 매우 높은 사람들은 두 그룹 모두에 존재함 확인 가능
    * BMI와 label 사이에는 양(+)의 관계가 있어 보이지만, 두 분포가 많이 겹쳐 있어(Overlap) BMI 단독으로는 흡연여부와의 관계를 완벽히 구분하기 어려움.

3. 흡연여부 vs 헤모글로빈 (Hemoglobin)

  • 비교적 명확한 중앙값의 차이가 관찰됨.
  • 흡연자 그룹이 비흡연자 그룹보다 헤모글로빈 수치가 전반적으로 높게 형성됨.
  • 비흡연자 그룹에서 수치가 매우 낮은(약 10 이하) 이상치가 더 많이 발견됨.
  • 헤모글로빈 수치 역시 흡연 여부에 따라 유의미한 차이를 보이며, 특히 비흡연자 그룹에서 낮은 수치가 더 자주 나타나는 특징이 있습니다.

2-3. 변수 간 상관관계 분석

💡 d. 상관 계수 해석 기준:

  • 1에 가까울수록 ➡️ 강한 양의 상관관계
  • -1에 가까울수록 ➡️ 강한 음의 상관관계
  • 0에 가까울수록 ➡️ 약한 상관관계
    .
  • 각 값에서 평균을 빼고 두 변수의 움직임을 비교해서 얼마나 같이 움직이는지 계산하는 것
  • ‼️ 주의!!) 같이 움직인다고 해서 원인이 아님 (ex) 여름철 아이스크림 판매량과 선풍기 판매량
  • ⭐️ corr() 결과는 숫자가 가득한 표 형태라 한눈에 들어오지 않기 때문에 히트맵을 사용해 시각화하는 것이 일반적


  • 강한 관계를 보이는 변수: 중성지방 / BMI
  • 약한 관계를 보이는 변수: 헤모글로빈 / BMI, 헤모글로빈 / 중성지방

⬇️ 놓친 부분이 있을까 궁금해서 추가로 조사해본 히트맵 ⬇️

💡 e. 히트맵(Heatmap)

  • 데이터의 값을 “색상”으로 표현하는 시각화 방법으로 숫자를 그대로 보는 대신 색의 진하기와 색깔로 크기를 표현함
  • 패턴을 한번에 확인하기 쉬움
  • 대각선 = 항상 1 (자기 자신과의 상관관계)
  • 데이터에 아주 극단적인 값(이상치)이 몇 개 섞여 있으면, 실제로는 별 관계가 없는데도 상관계수가 높게 계산되어 히트맵 색이 진해질 수 있음
  • 그래서 히트맵에서 색이 진하면 둘 사이에 연결고리가 있다는 판단만 하고 산점도나 박스플롯으로 함께 보는 것이 중요

3. 결론 및 인사이트 도출


💡 f. from scipy import stats

  • 파이썬에서 '통계 검정(Statistical Test)'이라는 강력한 도구를 꺼내 쓰기 위함
  • 관찰된 차이가 진짜 의미 있는 차이인지 숫자로 증명(통계)해주는 역할로 p-value(유의 확률)라는 값을 계산해 줌.
  • ttest_ind() (T-검정): * 두 그룹(예: 흡연자 vs 비흡연자)의 평균값 차이가 진짜인지 확인할 때 씁니다.

[차이 비교]
➡️ Pandas: 데이터를 정리하는 '장부'
➡️ Matplotlib/Seaborn: 데이터를 보여주는 '슬라이드'
➡️ Scipy.stats: 그 데이터가 믿을만한지 판정해주는 '심판'

💡g. T-검증 (‼️가장 정확한 수단은 아님‼️)

  • 데이터가 정규분포에 가까고 두 집단의 분산이 비슷해야 신뢰도가 올라감
  • 이상치에 민감하여 몇 개 튀는 값 때문에 결과 왜곡될 가능성 있음
  • 두 그룹만 비교 가능
  • 차이의 크기는 알려주지 않음, 유의미하다고 해서 중요한 차이는 아닐 수 있음
  • T-검정의 결과는 보통 p-value로 해석함

💡h. p-value 기준

  • p < 0.05 : 우연이라고 보기 어려움 → 차이 있음
  • p ≥ 0.05 : 유의하지 않음, “우연일 가능성 있음 → 차이 없음

어떤 요인이 흡연 여부와 관련성이 높을까?

1️⃣ 흡연자와 비흡연자 간 중성지방 수치는 통계적으로 유의한 차이를 보였다(p < 0.001).
2️⃣ 헤모글로빈 수치 또한 두 그룹 간 유의한 차이를 보였다(p < 0.001).
3️⃣ BMI 역시 통계적으로 유의한 차이가 확인되었다(p < 0.001).

[결론]
➡️ 중성지방과 BMI - 양의 상관관계 : 흡연은 중성지방 증가를 유발하고 이는 BMI 증가시킨다.
➡️ BMI와 헤모글로빈 - 양의 상관관계 : 체중이 높으면 체내 산소 요구량이 증가하고, 혈액 점성도가 높아져 헤모글로빈 수치가 상승할 가능성이 높음(흡연은 교감신경을 활성화하고 내장 지방을 축적시켜 혈중 중성지방을 증가시킨다.)
➡️ 복부비만 환자들의 허리둘레가 증가할수록 헤모글로빈 수치도 함께 상승하는 경향(+)
➡️ 따라서 흡연은 중성지방의 증가를 유발하고, 이는 BMI 증가와 헤모글로빈 증가를 야기한다.

profile
AI 헬스케어 공부하는 간호사

0개의 댓글