Data analysis/데이터 분석 및 시각화

[데이터 분석 및 시각화] 5. 이변량분석 - (수치형 -> 수치형)

endingo 2025. 4. 5. 00:46

상관 분석은 수치형 변수 x에 대한 수치형 변수 y의 관계를 분석할 때 사용

상관 분석은 산점도를 사용해 시각화

 

두 수치형 변수 x와 y가 어떤 관계를 보이는지, 얼마나 강한 관계인지 판단하는데 중요한 관점이 직선이다.

 

★ 수치형 vs 수치형 시각화는 산점도(Scatter Plot, Pair Plot, Joint Plot) 사용

★ 수치형 vs 수치형 수치화는 상관계수(상관 있냐/없냐?), p-value(이 대립가설 신뢰 할 만해?) 사용

★ 귀무가설 vs 대립가설 개념

 

1. 시각화

 

1) 산점도

산점도는 두 변수간의 관계를 나타내는 그래프

 

- Matplotlib 사용 

scatter()

 

plt.scatter(x='Temp', y='Ozone', data=air)
plt.xlabel('Temp')
plt.ylabel('Ozone')
plt.show()

 

plt.scatter(x='Wind', y='Ozone', data=air)
plt.xlabel('Wind')
plt.ylabel('Ozone')
plt.show()

 

 

 

 

- Seaborn 사용

scatterplot()

sns.scatterplot(x='Temp', y='Ozone', data=air)
plt.show()

 

 

sns.scatterplot(x='Wind', y='Ozone', data=air, s=30, ec=None)
plt.show()

 

 

두 변수는 상관관계를 가지는 것으로 보인다.

 

2) Pair Plot

 

pairplot(): 모든 숫자형 변수의 쌍에 대한 산점도와 히스토그램을 같이 그려준다.

 

※ 시간이 많이 걸린다.

sns.pairplot(air)
plt.show()

 

3) Joint Plot

 

jointplot(): 두 개의 변수 사이의 관계를 시각화하기 위한 유용한 도구

 

sns.jointplot(x='Temp', y='Ozone', data=air)
plt.show()

 

sns.jointplot(x='Wind', y='Ozone', data=air, kind='scatter')
plt.show()

 

hex로 나타내기

sns.jointplot(x='Solar.R', y='Ozone', data=air, kind='hex', marginal_kws=dict(bins=20))
plt.show()

2. 수치화

 

수치형 vs 수치형 관계를 수치화하려면 상관분석

상관계수와 p-value를 사용해 두 변수의 상관관계를 확인할 수 있다.

 

상관계수는 두 수치형 변수간의 선형 관계의 강도와 방향을 나타낸다.

 

상관계수 관계도

1) 상관 계수 확인

 

- scipy.stats 라이브러리 사용

pearsonr(): 상관계수 확인

 

result = spst.pearsonr(air['Temp'], air['Ozone'])

print(result)
print('* 상관계수:', result[0])
print('* p-value:', result[1])

 

=> 대립가설 채택(상관관계 많이 있다.)

 

 

 

2) 귀무가설 vs 대립가설

 

※ 귀무가설: 상관 관계가 없다.(대중 - 상관관계는 0이다.)

※ 대립가설: 상관 관계가 있다.(나의 도전 - 상관관계가 0이 아니다.)

 

귀무가설은 상관관계가 없다고 믿고 있고, 계속 그렇게 믿어왔거나 아예 관계가 있는 사실조차 모르는 상태이다.

대립가설은 내가 상관관계가 있다고 전제를 깔아놓고 실험, 도전을 하는 것이다.

그래서 내가 도전(상관관계 여부)을 했을 때 만약 상관계수가 0.5 < |r| <=1 이고 p-value가 0.5 이하이면 대립가설 채택이다.

=> 대립가설 채택(상관관계 많이 있다.)

=> 대립가설 채택(상관관계 조금은 있다.)

 

=> 대립가설 채택(상관관계 조금은 있다.)

 

=> 대립가설 채택(상관관계 조금은 있다.)

 

=> 대립가설 채택(상관관계 아주 조금은 있다.)

 

※ 결측치 있으면 .notnull() 해줘야된다.

예) air2 = air.loc[air['Solar.R'].notnull()]

 

 

 

 

3) 상관계수 한번에 확인

 

- Pandas 사용

corr(): 모든 상관계수 확인

 

air.corr(numeric_only=True)

 

- Seaborn 사용

heatmap(): 예쁘게 표현

 

plt.figure(figsize=(6, 6))
sns.heatmap(air.corr(numeric_only=True),
            annot=True,
            fmt='.3f',
            cmap='Blues',
            vmin=-1,
            vmax=1,
            square=True,
            cbar=False)
plt.show()

 

상관관계 뭐가 제일 높나?

Ozone, Temp

 

상관관계 뭐가 제일 낮나?

Wind, Solar.R

 

3. 상관계수의 한계

 

수치화해서 하나의 숫자로 요약하는 데에는 많은 장점이 있지만 수치형 데이터 간의 상관관계가 명확하지 않은경우의 한계가 발생한다. 상관계수가 0인 경우에도 육안으로는 상관관계가 있어보이기에 단순히 0으로 표현하는 점이 한계인 것이다.