이변량 분석은 원인과 결과가 있을때 원인의 개수가 2개가 존재한다는 의미임.
데이터를 분석할 때 데이터는 크게 숫자형과 범주형이 있기에 존재하는 경우의 수는 총 4가지이며,
아래 방법에 따라 사용되는 함수의 종류는 달라짐.
숫자 | 범주 | |||
그래프 | 통계량 | 그래프 | 통계량 | |
숫자 | scatter | 상관분석 | boxplot Histogram Densityplot |
|
범주 | 평균비교 barplot |
T검정 분산분석 |
Barplot Mosaic |
카이제곱검사 |
또한, 위에 표처럼 분석한 것을 나타낼 때는 시각적으로 보여주는 그래프와, 수치적으로 보여주는 통계량이 있음
1. 숫자 - 숫자 이변량 분석
그래프로 나타내기 - scatter
- 두 숫자형 변수의 관계를 점으로 나타내는 그래프를 산점도라고 함
- 산점도 그래프를 볼때 중요한 관점은 점들을 이은 직선(Linearity)임
문법
- scatter를 사용하기 위한 방법에는 2가지가 있음
- matplotlib
- plt.scatter(x축 값, y축 값)
- plt. scatter('x변수', 'y변수', data = df)
- seaborn
- sns.scatterplot('x변수, 'y변수', data = df)
- matplotlib
plt.scatter(air['Temp'], air['Ozone'])
plt.show()
# plt.scatter('Temp', 'Ozone', data = air)
# sns.scatterplot('Temp', 'Ozone', data = air)
- 위처럼 Temp와 Ozone의 산점도 그래프를 그려봤는데, 예를 들어 원인이 Temp고 Ozone이 결과라고 한다면 위 그래프가 유의미한 그래프일까?
- 또한, 유의미한 그래프 = 강한 관계를 가진그래프 인데, 확실한 직선이 안보인다면 한계가 있으며, 관계가 있다고 하더라도 큰 관계를 가지지는 않을 수도 있음
- 따라서 이를 수치적으로 나타내는것을 상관분석이라고 한다.
수치로 나타내기 - 상관분석
위 공식으로 상관계수인 r을 도출 할수 있는데, 파이썬에서 scipy.stats모듈로 r을 나타낼수 있음
import scipy.stats as spst
spst.pearsonr(air['Temp'], air['Ozone'])
>>(0.6833717861490115, 2.197769800200214e-22)
위 함수를 사용하여 상관관계를 나타내보았는데 튜플형태로 2개의 값이 나옴
>> (상관계수 값, p-value)
상관계수 r | p - value | ||||
0.5 < |r| <=1 | 강함 | p < 0.05 | 관계가 있다 | ||
0.2 < |r| <=0.5 | 중간 | ||||
0.1 < |r| <=0.2 | 약함 | p >= 0.05 | 관계가 없다 | ||
0 < |r| <=0.1 | 없음 |
위 표는 대략적인 기준으로 r과 p에 대한 값을 나타낸 값이다.
2. 숫자 - 범주 이변량 분석
sns.kdeplot()을 이용해서 시각화 한다
그래프로 나타내기
sns.kdeplot(x='Age', data = titanic, hue ='Survived'
, multiple = 'fill')
plt.axhline(titanic['Survived'].mean(), color = 'r')
plt.show()
3. 범주 - 숫자 이변량 분석
그래프로 그리기 - bar
sns.barplot(x = 'Survived", y='Age', data = titanic)
plt.grid()
plt.show()
Survived가 0일때의 평균, 1일때의 평균을 그려줌
위의 검은색 직선은 오차범위 = 신뢰구간 을 나타내줌
0과 1의 두 신뢰구간이 차이가 클수록 연관이 있다는 의미임
얼마나연관이 있는지 알아보는법
t-test // anova
t-test는 두개의 평균을 비교할때 사용한다
anova는 분산분석이라고 하며, 셋이상의 평균을 비교할때 사용한다.
t-test
문법
died = temp.loc[temp['Survived']==0, 'Age']
survived = temp.loc[temp['Survived']==1, 'Age']
# 2) t-test
spst.ttest_ind(died, survived)
>>Ttest_indResult(statistic=2.06668694625381,
pvalue=0.03912465401348249)
anova
P_1 = temp.loc[temp.Pclass == 1, 'Age']
P_2 = temp.loc[temp.Pclass == 2, 'Age']
P_3 = temp.loc[temp.Pclass == 3, 'Age']
# 2) 분산분석
spst.f_oneway(P_1, P_2, P_3)
>>lt
F_onewayResult(statistic=57.443484340676214,
pvalue=7.487984171959904e-24)
4. 범주 - 범주 이변량 분석
범주와 범주간의 분석은 교차표를 만드는 것부터 시작한다.
교차표를 만드는것은 파이썬에서 pandas를 이용하여 변경할 수 있다.
문법
pd.crosstab(titanic['Survived'], titanic['Sex'], normalize = '')
# pd.crosstab(행, 열, normalize = 'columns') # 열 기준 100%
# pd.crosstab(행, 열, normalize = 'index') # 행 기준 100%
# pd.crosstab(행, 열, normalize = 'all') # 전체 기준 100%
- normalize = 비율이라고 생각하면 되고 srosstab이 아니라 다른곳에서 나와도 비율이라고 생각해도 됨
- normalize의 옵션에 대해서는 아래에서 설명함
위 함수로 교차표를 만들었다면 그래프와 수치형으로 나타내보자
그래프로 나타내기 - mosaic
문법
mosaic(titanic, [ 'Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r')
plt.show()
- 범주 - 범주를 그래프로 나타내려면 mosaic를 쓴다. 근데 mosaic는 crosstab을 안써줘도 알아서 교차표로 바꾼후 값을 그래프로 그려주는 함수임
ax = 축
h = 수평(v = 수직)
1 - titanic['Survived'].mean 타이타닉 생존자들의 평균에서 1뺀값 = 1을 안뺏다면 빨간색 라인이 아래에 위치할 텐데 가독성을 위해 1을 빼줌
수치로 나타내기 - 카이제곱 검정
# 1) 먼저 교차표 만들기
table = pd.crosstab(titanic['Survived’], titanic['Pclass'])
print(table)
print('-' * 50)
# 2) 카이제곱검정
spst.chi2_contingency(table)
카이제곱검정을 하려면 우선 교차표를 만들고, spst.chi2_contigency(table)함수를 이용한다.
① 카이제곱 통제량
② p - value - 0.05보다 작으면 신뢰성이 있다.
③ 자유도 - ③ < ①*2 일때 관련이 있다.
④ 기대 빈도
'데이터 프레임 시각화' 카테고리의 다른 글
[데이터프레임 분석] 단변량 분석 (0) | 2023.02.10 |
---|---|
산점도 분석 (0) | 2023.02.09 |