AIVLE

데이터 분석 및 의미 찾기

민주82 2023. 2. 9. 17:29

데이터 분석

 

▽ 단변량 분석에서는 변수가 숫자인지, 범주인지에따라 방법이 달라진다.

 

 

단별량 분석

(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

 

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

#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