EDA & CDA
- 그래서 우리는 다음의 사항을 알아야 함 ① (언제, 어떤) 그래프 그리고 (어떻게) 해석 ② (언제, 어떤) 기초 통계량을 구하고 (어떻게) 해석 ③ (언제, 어떤) 가설 검정 방법을 사용하고 (어떻게) 해석
- 보통 다음의 순서대로 진행함 ① 개별 변수(feature + target)의 분포를 살펴봄 ② feature와 target 간의 관계를 살펴봄 (가설을 확인하는 단계) ③ feature들 간의 관계를 살펴봄
단변량 분석
수치형과 범주형

숫자로 저장된 자료지만 범주형 일 수 있음 - Outcome
수치형 데이터의 수치화는 최솟값, 최댓값, 평균값, 표준편차, 사분위수로 분석하는거고
시각화는 분포를 보는 것
수치화
- 수치형 변수를 수치화해 분석할 때는 평균, 중앙값, 최빈값, 4분위수 등 대푯값을 사용
- describe() 메소드를 사용해 수치형 변수의 통계 정보를 쉽게 확인 가능
대푯값 ( mean(), median(), mode(), describe()
1. 평균
- mean() 메소드로 평균을 구함
diabetes['BMI'].mean()
2. 중앙값(median)
- median() 메소드로 중앙값을 구함
diabetes['BMI'].median()
3. 최빈값(데이터 중에서 가장 빈번하게 나타나는 값, 즉 빈도가 가장 높은 값을 최빈값이라고 함)
- mode() 메소드로 최빈값을 확인
- 같은 빈도의 값이 여럿 존재할 수 있으므로 최빈값은 여러 개 존재 할 수 있음
diabetes['BMIStatus'].mode()
0 Obese
Name: BMIStatus, dtype: object
'Obese'
실제 최빈값은 다음과 같이 인덱스를 사용해 조회
4. 4분위수
- describe() 메소드로 4분위수를 확인할 수 있음
count 757.000000
mean 32.457464
std 6.924988
min 18.200000
25% 27.500000
50% 32.300000
75% 36.600000
max 67.100000
Name: BMI, dtype: float64
기술통계 정보 - 수치형 데이터 확인 describe()
- 변수 하나에 대한 기술통계 정보를 describe() 메소드로 확인



🔍 해석
- BMI는 체질량지수를 의미
- 전체 데이터는 768건
- 전체 768건 중 BMI 값이 확인된 것은 757건 / 나머지는 결측치 / 결측치 有
- BMI 범위는 최소 18.2에서 최대 67.1까지이며, 일부 이상치 존재
- 평균 BMI는 32.46으로, WHO 기준상 ‘비만’ 범주
- BMI의 25%, 50%, 75% 분위값은 각각 27.5, 32.3, 36.6
- BMI가 25 이상인 과체중/비만 인원이 전체의 상당 비율을 차지

🔍 해석
- 768건 모두 나이 정보를 보유함 (결측치 없음)
- 나이 범위는 최소 21세부터 최대 81세까지
- 평균 나이는 약 33.24세로 비교적 젊은 연령대 중심
- 표준편차가 약 11.76으로 연령 분포에 다양성이 있음
- 나이 중앙값(50%)은 29세로 절반의 환자가 29세 이하
- 사분위수 25%: 24세 이하, 75%: 41세 이하
- 24세~41세 구간에 전체의 절반이 위치
수치형 데이터의 시각화
제일 기본적인 시각화 방법 : Histogram
- Matplotlib의 hist() 함수로 Histogram을 그린다
plt.hist(x='BMI', data=diabetes)
plt.hist(x='BMI', data=diabetes, bins=20,
alpha=0.7(투명도), edgecolor='k'(테두리색)) 이렇게 바꾸면 밑에 sns랑 비슷해 보임
plt.xlabel('BMI')
plt.ylabel('Frequency')
plt.show()
- Seaborn의 histplot() 함수로 Histogram을 그린다 [bins 옵션을 사용해 구간 개수를 적절히 지정]
sns.histplot(x='BMI', data=diabetes ,bins=20)
plt.show()
Seaborn은 알아서 예쁘게 되는데 Matplotlib은 필요하면 알아서 꾸며야함
Density Plot(밀도 함수)
- Histogram은 빈즈에 의해 모양이 바뀌지만 kde플롯은 바뀌지 않음
1. Pandas가 제공하는 plot() 메소드에 kind='kde' 를 지정해
Density Plot을 쉽게 그릴 수 있음
diabetes['BMI'].plot(kind='kde')
plt.show()
2. Seaborn의 kdeplot() 함수를 사용해 Density Plot을 그림
sns.kdeplot(x='BMI', data=diabetes)
plt.show()
📌 확률 밀도 함수
셀 수 있는 값의 분포, 즉 이산 확률 분포는 표로 표현 할 수 있음
(예를 들면 주사위를 던져 1 ~ 6이 나올 수 있는 확률)
반면에 셀 수 없는 값의 분포, 즉 연속 확률 분포는 대상 값이 너무 많아 표로 표현할 수 없다
그래서 연속 확률 분포는 함수(=그래프), 즉 그래프로 표현
(예 예를 들어 키가 140~180 사이인 학생들의 키 분포)
Box Plot (교안 / 질문이 중요하다고 했던 박스플롯 박사)
- Box Plot은 이해하기가 다소 어렵지만, 데이터 분포를 확인하는 유익한 시각화 도구
- Matplotlib의 boxplot() 함수를 사용해 Box Plot을 그린다
plt.boxplot(x='BMI', data=diabetes[diabetes['BMI'].notna()]) 결측치는 제외하고
plt.show()
- 주의: 결측치가 있으면 그래프가 그려지지 않는다
Seaborn의 boxplot() 함수를 사용해 Box Plot 그리기
sns.boxplot(x='BMI', data=diabetes[diabetes['BMI'].notna()])
sns.boxplot(x='BMI', data=diabetes)**Seaborn**은 결측치가 있어도 그려짐
plt.show()
쓰고 싶은거 쓰면 됨

IQR : 25%와 75% 사이의 차이
만약 75% 가 20이고 25% 가 5라면 IQR은 15
**Q3에서 IQR*1.5만큼 쭈욱 가보면 어느 경계가 나오지만 이 경계는 박스플롯에 나타나지 않음
**Q1에서 IQR*1.5만큼 쭈욱 가봐도 어느 경계가 나오지만 이 경계는 박스플롯에 나타나지 않음
이 선들을 넘어 서는 값들은 이상치
이상치 제외 최댓값과 최솟값과 **갔을때 경계 사이에는 값이 없음

시계열 데이터 시각화
Matplotlib의 plot() 함수를 사용해 Line Plot
air['Date'] = pd.to_datetime(air['Date'])
plt.plot('Date', 'Ozone', data=air, label='Ozone')
plt.plot('Date', 'Temp', data=air, label='Temp')
plt.xlabel('Date')
plt.legend()
plt.show()
Seaborn의 lineplot() 함수를 사용해 Line Plot
sns.lineplot(x='Date', y='Ozone', data=air, label='Ozone')
sns.lineplot(x='Date', y='Temp', data=air, label='Temp')
plt.legend()
plt.show()
'KT 에이블스쿨 8기 > 데이터분석' 카테고리의 다른 글
| 이변량 분석 ③ - 범주형 → 범주형 (0) | 2025.11.25 |
|---|---|
| 이변량 분석 ② - 범주형 → 수치형 (1) | 2025.11.25 |
| 단변량 분석 ② - 범주형 (0) | 2025.11.25 |
| 시각화라이브러리 ② - Seaborn (0) | 2025.11.25 |
| 시각화라이브러리 ① - Matplotlib (0) | 2025.11.25 |