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()