PYTHON/데이터 분석

[PYTHON] 이변량 분석

G허니 2024. 3. 25. 23:17

데이터 분석의 핵심 단계 중 하나는 이변량 분석입니다. 이변량 분석을 통해 두 변수 간의 관계를 파악하고, 이를 바탕으로 데이터에서 숨겨진 인사이트를 발견할 수 있습니다. 이변량 분석은 크게 네 가지 유형으로 나눌 수 있으며, 각각의 유형에 따라 다양한 시각화 기법과 수치화 방법이 사용됩니다.

 

숫자 -> 숫자

  • 시각화: 산점도(scatter plot)는 두 수치형 변수 간의 관계를 시각적으로 표현하는 데 사용됩니다. 이를 통해 변수들 사이의 상관성을 직관적으로 파악할 수 있습니다.
  • 수치화: 상관분석은 두 변수 간의 선형적 상관 관계를 수치로 표현합니다. 상관계수는 -1에서 1 사이의 값을 가지며, 이는 변수 간의 관계의 방향과 강도를 나타냅니다.
  • 한계: 상관분석은 선형 관계만을 고려합니다. 따라서 변수 간의 비선형 관계는 이 방법으로 파악하기 어렵습니다.

scatter plot 그리기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

air = pd.read_csv('air.csv')

plt.figure(figsize=(3,6))
plt.subplot(3,1,1)
sns.scatterplot(x = 'Temp', y ='Ozone', data=air)
plt.subplot(3,1,2)
sns.scatterplot(x = 'Temp', y ='Wind', data=air)
plt.subplot(3,1,3)
sns.scatterplot(x = 'Temp', y ='Solar.R', data=air)

plt.tight_layout()
plt.show()

 

상관계수와 p-value 구하기

import scipy.stats as spst
spst.pearsonr(air['Temp'], air['Ozone'])

 

한번에 상관계수 구하기

# 한번에  상관계수 구하기
air.corr()

 

범주 -> 숫자

  • 시각화: 평균 비교(barplot)는 범주형 변수의 각 범주에 따른 수치형 변수의 평균을 비교하는 데 사용됩니다. 이는 범주 간의 차이를 시각적으로 파악하기 용이합니다.
  • 수치화: t-test는 두 범주 간의 평균 차이를 검정하는 데 사용되며, ANOVA(분산분석)는 세 개 이상의 범주 간 평균 차이를 검정합니다.
  • 한계: 이러한 테스트는 데이터가 정규 분포를 따른다는 가정 하에 수행됩니다. 이 가정이 만족되지 않을 경우, 결과의 신뢰성이 떨어질 수 있습니다. 또, 분산분석은 전체 평균대비 각 그룹간 차이가 있는 지만 알려줍니다. 어느 그룹 간에 차이가있는지는 알 수 없습니다. 그래서, 보통 사후분석을 진행합니다.

bar plot & box plot 그리기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as spst

titanic = pd.read_csv('titanic.csv')

# barplot
sns.barplot(x="Survived", y="Age", data=titanic)
plt.grid()
plt.show()

# boxplot
sns.boxplot(x='Survived', y = 'Age', data = titanic)
plt.show()

 

t-test

# 먼저 NaN이 있는지 확인해 봅시다.
titanic.isna().sum()

# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]

# 두 그룹으로 데이터 저장
died = temp.loc[temp['Survived']==0, 'Age']
survived = temp.loc[temp['Survived']==1, 'Age']

spst.ttest_ind(died, survived)
spst.ttest_ind(survived, died)

 

ANOVA

# 분산 분석을 위한 데이터 만들기
# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]
# 그룹별 저장
P_1 = temp.loc[temp.Pclass == 1, 'Age']
P_2 = temp.loc[temp.Pclass == 2, 'Age']
P_3 = temp.loc[temp.Pclass == 3, 'Age']

spst.f_oneway(P_1, P_2, P_3)

 

범주 -> 범주

  • 시각화: 모자이크 플롯(mosaic plot)은 두 범주형 변수 간의 관계를 시각적으로 표현합니다. 각 범주의 비율을 비교하여 변수 간의 관계를 파악할 수 있습니다.
  • 수치화: 카이제곱 검정은 두 범주형 변수 간의 독립성을 검정합니다. 이를 통해 변수 간의 관련성 여부를 파악할 수 있습니다.

교차표

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as spst

titanic = pd.read_csv('titanic.csv')

# 두 범주별 빈도수를 교차표
pd.crosstab(titanic['Survived'], titanic['Sex'])

 

mosaic plot 그리기

# Pclass별 생존여부를 mosaic plot으로 그려 봅시다.
mosaic(titanic, [ 'Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r')
plt.show()

 

카이제곱 검증

pd.crosstab(titanic['Survived'], titanic['Pclass'])

# 1) 먼저 교차표 집계- normalize 하면 안 됨
table = pd.crosstab(titanic['Survived'], titanic['Pclass'])
print(table)
print('-' * 50)

# 2) 카이제곱검정
spst.chi2_contingency(table)

 

 

숫자 -> 범주

  • 시각화: KDE plot과 히스토그램은 수치형 변수의 분포를 범주형 변수와 함께 시각적으로 표현합니다. 이를 통해 수치형 변수가 범주형 변수에 따라 어떻게 변화하는지 파악할 수 있습니다.
  • 수치화: KDE plot의 수치화는 gaussian_kde 함수를 사용하여 2D KDE를 계산하는 방법으로, 변수의 전체 범위에 대한 누적 분포를 계산합니다

histplot 그리기

import pandas as pd
import numpy as np
# import random as rd

import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.mosaicplot import mosaic      #mosaic plot!

import scipy.stats as spst

titanic = pd.read_csv('titanic.csv')

sns.histplot(x='Age', data = titanic, hue = 'Survived')
plt.show()

 

kde plot 그리기

sns.kdeplot(x='Age', data = titanic, hue ='Survived')
# 주황색 면적 + 파랑색 면적 = 1
plt.show()