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

 

diabetes['BMIStatus'].mode()[0]
'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()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts