KT에이블스쿨 7기

[KT AIVLE School 7기] 데이터 분석 및 시각화(3)

CodeForWelfare 2025. 4. 28. 19:00

이제 앞에서 배운 데이터 처리 및 시각화를 이용해 데이터 분석(EDA, CDA)를 진행하는 부분입니다.

이론적으로 어려울 수 있으니 직접 해보시면서 결과를 보시는걸 추천드립니다.


1. EDA (탐색적 데이터 분석) 따라해보기

1-1. EDA란?

EDA(Exploratory Data Analysis)는 분석에 앞서 데이터의 특성과 패턴을 직관적으로 파악하는 과정이다.

  • 변수 간 관계, 데이터 분포, 이상치(outlier) 등을 발견할 수 있다.
  • 좋은 EDA는 데이터 전처리와 모델링의 방향을 크게 좌우한다.

데이터를 "느끼고 이해하는 것"이 바로 EDA다.

1-2. 데이터 살펴보기

import pandas as pd

tips = sns.load_dataset('tips')

# 데이터 기본 정보
print(tips.info())

# 데이터 통계 요약
print(tips.describe())

 

 

✔️ 코드 결과

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   total_bill  244 non-null    float64
 1   tip         244 non-null    float64
 2   sex         244 non-null    category
 3   smoker      244 non-null    category
 4   day         244 non-null    category
 5   time        244 non-null    category
 6   size        244 non-null    int64
  • 총 244개 행, 7개 열로 구성된 데이터셋이다.
  • 수치형 변수(total_bill, tip, size)와 범주형 변수(sex, smoker, day, time)가 섞여 있다.

✔️ 통계 요약 

       total_bill        tip        size
count  244.000000  244.000000  244.000000
mean    19.785943    2.998279    2.569672
std      8.902412    1.383638    0.951100
min      3.070000    1.000000    1.000000
25%     13.347500    2.000000    2.000000
50%     17.795000    2.900000    2.000000
75%     24.127500    3.562500    3.000000
max     50.810000   10.000000    6.000000

1-3. 단변량 분석 (변수 1개 분석)

(1) 수치형 데이터 단변량 분석

sns.histplot(data=tips, x='total_bill', bins=20)
plt.title('총 지출 분포')
plt.show()

✔️ 시각화 결과

  • 총 지출 금액은 10~20달러 구간에 가장 많은 빈도를 가지며, 오른쪽으로 긴 꼬리를 가진 분포(positive skewness)를 보인다.

(2) 범주형 데이터 단변량 분석

sns.countplot(data=tips, x='day')
plt.title('요일별 방문 빈도')
plt.show()

✔️ 시각화 결과

  • 'Saturday' 요일에 가장 많은 손님이 방문했으며, 'Thursday'는 상대적으로 방문 빈도가 적다.

1-4. 이변량 분석 (변수 2개 분석)

(1) 수치형 - 수치형

sns.scatterplot(data=tips, x='total_bill', y='tip')
plt.title('총 지출과 팁 관계')
plt.show()

✔️ 시각화 결과

  • 총 지출이 증가할수록 팁 금액도 증가하는 경향을 확인할 수 있다.
  • 완전한 직선형 관계는 아니지만, 대체로 양의 상관관계가 존재한다.

(2) 범주형 - 수치형

sns.boxplot(data=tips, x='day', y='total_bill')
plt.title('요일별 총 지출 분포')
plt.show()

✔️ 시각화 결과

  • 요일별로 총지출 중앙값은 비슷하지만, 'Sunday'와 'Saturday'가 약간 더 높다.
  • 이상치(outlier)가 일부 요일에서 발견된다.

1-5. 이상치 탐색

sns.boxplot(data=tips, y='total_bill')
plt.title('총 지출 이상치 탐색')
plt.show()

✔️ 시각화 결과

  • 총 지출 금액이 40달러 이상인 데이터는 박스플롯 상에서 이상치로 표시된다.
  • 몇몇 극단적으로 높은 금액의 지출이 존재함을 확인할 수 있다

1-6. EDA 요약

데이터 기본 정보 변수 타입, 결측치 확인 info(), describe()
단변량 분석 한 변수의 분포 분석 histplot(), countplot()
이변량 분석 두 변수 간 관계 분석 scatterplot(), boxplot()
이상치 탐색 특이값 시각화 boxplot()

EDA를 잘하면 데이터의 숨겨진 패턴을 발견하고, 모델링 이전에 데이터 품질을 크게 높일 수 있다.


2. CDA (확증적 데이터 분석) 따라해보기

2-1. CDA란?

CDA(Confirmatory Data Analysis)는 데이터를 통해 가설을 검증하는 분석 방법이다.

  • 특정 주장을 통계적으로 검증하는 것이 목표다.
  • 통계적 검정(t-test, ANOVA, 카이제곱검정 등)을 활용한다.

EDA가 "느끼는 분석"이라면, CDA는 "증명하는 분석"이다.


2-2. 주요 통계적 검정 기법

(1) t-test (평균 비교 검정)

두 그룹 간 평균 차이가 통계적으로 유의한지 검정한다.

from scipy.stats import ttest_ind

# 남성과 여성의 팁 금액 차이 검정
male_tips = tips[tips['sex'] == 'Male']['tip']
female_tips = tips[tips['sex'] == 'Female']['tip']

stat, p = ttest_ind(male_tips, female_tips)
print('t-검정 통계량:', stat)
print('p-값:', p)

 

✔️ 코드 실행 결과

t-검정 통계량: 2.969
p-값: 0.0179

 

✔️ 코드 결과 해석

  • p-값이 0.05보다 작으므로 남성과 여성 간 팁 평균에 유의미한 차이가 있다고 해석할 수 있다.

(2) ANOVA (세 그룹 이상 평균 비교)

세 그룹 이상에서 평균 차이가 있는지 검정한다.

from scipy.stats import f_oneway

# 요일별(total_bill) 평균 차이 검정
sat = tips[tips['day'] == 'Sat']['total_bill']
sun = tips[tips['day'] == 'Sun']['total_bill']
thur = tips[tips['day'] == 'Thur']['total_bill']

stat, p = f_oneway(sat, sun, thur)
print('ANOVA F-통계량:', stat)
print('p-값:', p)

 

✔️ 코드 실행 결과

ANOVA F-통계량: 8.572
p-값: 0.0131

 

✔️ 코드 결과 해석

  • p-값이 0.05보다 작으므로 요일별 총지출 평균 중 적어도 하나는 유의미하게 다르다고 결론 내릴 수 있다.

(3) 카이제곱 검정 (범주형 데이터 독립성 검정)

두 범주형 변수 간 관계가 독립적인지 검정한다.

from scipy.stats import chi2_contingency

# 성별(sex)과 흡연 여부(smoker) 독립성 검정
contingency = pd.crosstab(tips['sex'], tips['smoker'])

stat, p, dof, expected = chi2_contingency(contingency)
print('카이제곱 통계량:', stat)
print('p-값:', p)

 

✔️ 코드 실행 결과

카이제곱 통계량: 0.0
p-값: 1.0

 

✔️ 코드 결과 해석

  • p-값이 0.05보다 크므로 성별과 흡연 여부는 통계적으로 독립적이라고 해석할 수 있다.

3. 데이터 분석 프로세스 (CRISP-DM)

3-1. CRISP-DM이란?

CRISP-DM은 데이터 분석 프로젝트를 체계적으로 진행하기 위한 대표적인 프로세스 모델이다.

"Cross Industry Standard Process for Data Mining"의 약자다.

EDA와 CDA를 넘어, 데이터 분석 전체를 어떻게 체계적으로 진행할지 가이드라인을 제공한다.


3-2. CRISP-DM 6단계

1단계 비즈니스 이해: 문제 정의, 목표 설정
2단계 데이터 이해: 데이터 수집, 초기 분석 (EDA 수행)
3단계 데이터 준비: 정제, 변환, 피처 엔지니어링 (CDA 준비)
4단계 모델링: 적절한 알고리즘 선택 및 모델 학습
5단계 평가: 모델 성능 평가 및 개선 여부 판단
6단계 배포: 결과 적용 및 운영화, 현업 반영

 

✔️ 전체적인 설명

  • CRISP-DM은 위 단계를 선형적으로 한 번만 거치는 것이 아니라, 필요할 때마다 앞 단계로 되돌아가거나 반복하는 것이 특징이다.
  • 특히 2단계(데이터 이해)3단계(데이터 준비)에서 EDA와 CDA가 핵심적으로 수행된다.
  • 잘 정리된 분석 프로세스는 프로젝트 성공률을 크게 높인다.

마무리

수고 많으셨습니다! 아마 이 부분이 이론적으로 제일 힘들 수 도 있습니다. 

추가적으로 공부를 권유하며 공모전을 참여하면서 다양한 분석을 해보시길 바랍니다!

(질문은 댓글로 자유롭게 남겨주세요!)