데이터 분석
▽ 단변량 분석에서는 변수가 숫자인지, 범주인지에따라 방법이 달라진다.
단별량 분석
(1) 숫자형 변수일 경우
기초통계량 구하고(수치화) 분포를 확인한다(시각화).
→ 변수가 많아지면 편의를 위해 두가지를 한번에 할 수 있는 함수를 만드는게 편하다.
# 단별량 분석(숫자형)
def eda1_n(data, var, bins=20):
display(data[[var]].describe().T)
plt.figure(figsize = (6,8))
plt.subplot(2,1,1)
sns.histplot(x = var, data=data , bins = bins, kde= True )
plt.subplot(2,1,2)
sns.boxplot(x = var, data = data)
plt.tight_layout()
plt.show()
(2) 범주형 변수일 경우
마찬가지로 기초통계량 구하고(수치화) 분포를 확인한다(시각화).
하지만 숫자형 변수와 다르게 범주별 빈도수와 비율을 이용해 기초 통계량을 구하고 sns.countplot으로 시각화한다.
#단별량 분석 (범주형)
def eda2_n(data, var):
display(data[var].value_counts())
display(data[var].value_counts() / data[var].shape[0])
sns.countplot(data[var])
plt.show()
sns.countplot(data[var], order = [' ' , ' ' , ' '])
order사용해서 원하는 순서대로 표를 만들 수 있다.
이변량 분석
도구(수치화, 시각화)에는 한계가 있다
→ 보이는게 전부가 아니다 !
(1) 숫자 - 숫자
▽ 시각화
산점도
: 두 숫자형 변수의 관계를 나타내는 그래프 / 직선이 중요 ! (얼마나 직선에 모여있는가)
① matplotlib
- plt.scatter(x축값, y축값)
- plt.scatter('x변수', 'y변수', data = df)
② seaborn
- sns.scatterplot(x = 'x변수', y= 'y변수', data = df)
- sns.pairplot(dataframe)
▽ 수치화
(직선)관계를 수치화 → 상관계수
상관계수가 유의미한지를 검정 → 상관분석
상관계수 ' r '
- -1~1사이의 값
- 상관계수끼리 비교 가능
- -1,1에 가까울 수록 강한 상관관계
① scipy.stats
- spst.pearsonr : 피어슨 상관분석 함수 (NaN 없어야 함)
- spst.pearsonr(A, B)
→ NaN 찾는 방법
data.isna().sum()
② df.corr()
: 모든 숫자형 변수들 상호간에 상관계수 계산
p-value (유의확률)
: 관계를 수치화 한 값이 유의미한 지 판단하는 숫자
0.05보다 작으면 두 변수 간에 관계가 있고, 크거나 같다면 관계가 없다고 본다.
(2) 범주 - 숫자
▽ 시각화
① sns.barplot(x = 'x변수', y= 'y변수', data = df)
: 평균 값을 비교 (그냥 막대그래프 아님!!)
데이터가 많을수록, 편차가 적을수록 신뢰구간은 좁아짐
두 평균의 차이가 크고, 신뢰구간은 겹치지 않을 , 대립가설이 맞다고 볼 수 있다.
▽ 수치화
범주가 두개일 때와 세 개 이상일때 평균을 비교하는 방법이 달라진다.
① T-test → 범주 2개 일 때
: 두 그룹간 평균에 차이가 있는가?
spst.ttest_ind( B, A, equal_var = False)
: A와 비교할 때 B의 평균이 큰가?
t통계량
: 두 평균의 차이를 표준오차로 나눈값, 두 평균의 차이로 이해해도 좋다.
t통계량 < -2 | t통계량 > 2 인 경우 차이가 있다고 본다.
② ANOVA (분산 분석 ANalysis Of VAriance) → 범주 3개 일 때
: 전체 평균과 각 그룹 평균에 차이가 있는가?
spst.f_oneway( A, B, C)
: 전체 평균과 A, B, C 각각의 평균은 차이가 있는가?
f통계량 = 집단 간 분산 / 집단 내 분산
: 값이 대략 2~3이상이면 차이가 있다고 판단한다.
분산 분석은 각 그룹간 차이가 있는지만 알 수 있고 어느 그룹 간에 차이가 있는지는 알 수 없다 !
→ 사후분석 필요 !
(3) 범주 - 범주
교차표(crosstab) 집계
- pd.crosstab(행,열, normalize= )

normalize : 비율로 변환해주는 옵션
- normalize= 'columns' : 열 기준 100%
- normalize= 'index' : 행 기준 100%
- normalize= 'all' : 전체 기준 100%
▽ 시각화
mosaic plot

x축: 성별 비율
y축 : 사망, 생존 비율
※ 빨간선: 전체 평균
▽ 수치화
카이제곱검정
- spst.chi2_contingency(table)
- 기대빈도 : 아무런 관련이 없을 때 나올 수 있는 빈도수
- 실제 데이터 : 관측된 값들
카이제곱검정시 크로스테이블 만들기 해줘야함!! ※테이블 만들때 normalize 절대 하지 말것!

기대빈도와 실제 데이터의차이
→ 카이제곱 통계량
- 클수록 기대빈도로부터 실제 값에 차이가 큼
- 범주의 수가 늘어날 수록 값이 커짐
- 자유도의 약 2배보다 크면 차이가 있다고 봄 (p-value가 0.05보다 작으면 관계가 있다고 판단)

범주형 변수의 자유도
: 범주의 수 -1
카이제곱 검정에서 자유도 게산하기
: (x변수의 자유도) X (y변수의 자유도)
(4) 숫자 - 범주
▽ 시각화
sns.kdeplot()
- common_norm = False : 각각 kde plot 그리기
- multiple = 'fill' : 모든 구간에 대한 100%비율로 kde plot 그리기
# 나이와 이직여부의 관계
feature = 'Age'
target = 'Attrition'
# 1
sns.kdeplot(x= feature, data = data, hue = target,
common_norm = False)
# 2
sns.kdeplot(x= feature, data = data, hue = target
, multiple = 'fill')
plt.axhline(data[target].mean(), color = 'r')
plt.show()

나이에 따라서 이직 여부가
관련이(차이) 조금 있다고 볼 수 있다!

#1에서 그래프가 만나는 부분이 두군데 있다.
#2의 빨간선은 전체 평균 이직율
→ 겹치는 부분은 전체 평균과 같은 지점이다 !
'AIVLE' 카테고리의 다른 글
| Web Crwaling ② - 네이버 주가 데이터 수집 (1) | 2023.02.17 |
|---|---|
| Web Crwaling ① - basic (0) | 2023.02.17 |
| 데이터 처리 (0) | 2023.02.07 |
| Python 라이브러리 (0) | 2023.02.06 |
| Python 프로그래밍 (0) | 2023.02.03 |