시각화 - 산점도(Scatter Plot)

  • 두 변수 간의 상관관계를 시각화 하는 가장 기본적인 방법
  • 그래프(시각화)만으론 판단이 어려워서 수치화(분석)가 필요함
Seaborn의 scatterplot() 함수로 산점도 그리기

sns.scatterplot(x='Wind', y='Ozone', data=air, s=30, ec=None)
 s=30 점 크기 ec=None 점 테두리 색
plt.show()

Joint plot 으로도 표현 가능

  • Seaborn의 jointplot() 함수는 두 개의 변수 사이의 관계를 시각화하기 위한 유용한 도구
  • 기본적으로 산점도를 그려주고, 히스토그램으로 각 변수의 분포를 보여줌
  • KDE(Kernel Density Estimation) 그래프를 추가하여 밀도 추정 결과도 확인할 수 있다
  • kind 매개변수를 사용하여 reg, hex, kde 등 다양한 형태의 그래프를 그릴 수 있음
sns.jointplot(x='Solar.R', y='Ozone', data=air, kind='hex'
, marginal_kws=dict(bins=20))
plt.show()

결과분석

  • 산점도에서 또렷한 패턴이 보인다면, 강한 관계(특히, 직선의 패턴이 보인다면)

수치화(분석) - 상관분석(Correlation Analysis)

  • 두 변수 간의 선형 상관관계를 수치화해서 파악하는 방법
  • 0에 가까울수록 상관관계가 없음을 나타냄
  • 상관관계를 나타내는 두 가지 숫자: 공분산, 상관계수
    • 둘 다 얼마나 직선으로 값들이 모여 있는지를 수치화한 것
    • 공분산으로 단순히 상관관계의 방향은 알 수 있으나 상관관계 정도는 알 수 없음

상관계수r (pearsonr 피어슨 r)

  • scipy 패키지
    • 두 변수로부터 상관계수 구하기
      • 결과: (상관계수, p-value)

 

  • 경험에 의한 대략의 기준(절대적인 기준이 절대 아님)
    • 강한: 0.5 < 𝑟 ≤ 1 중간: 0.2 < 𝑟 ≤ 0.5 약한: 0.1 < 𝑟 ≤ 0.2 (거의)없음: 𝑟 ≤ 0.1

상관계수 0.68은 강하다고 볼 수 있음

상관계수가 강하다고 볼 수 있을까? 를 뒷받침해주는게 p-vlue

p-value가 작을수록 귀무가설이 틀릴 수 있다(0.5 보다 작을 수록 더 강하다 우리 주장을 내세울 수 있다)

 

수치화(분석) - 상관분석(Correlation Analysis)

  • 수치형 → 수치형 관계를 수치화해 비교하고자 한다면 상관분석을 수행
  • 상관계수와 p-value를 사용해 두 변수의 상관관계를 확인할 수 있다
  • scipy.stats 라이브러리의 pearsonr() 함수로 상관계수를 확인
result = spst.pearsonr(air['Temp'], air['Ozone'])

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

PearsonRResult(statistic=np.float64(0.6833717861490116)

, pvalue=np.float64(2.1977698002001854e-22))

  • 상관계수: 0.6833717861490116
  • p-value: 2.1977698002001854e-22

강한 상관관계가 있다. 귀무가설을 재검토할 필요가 있음

  • 주의: 결측치가 있으면 계산되지 않습니다. 반드시 .notnull()로 제외하고 수행해야 함
air2 = air.loc[air['Solar.R'].notnull()] 결측치 제거
result = spst.pearsonr(air2['Solar.R'], air2['Ozone'])

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

PearsonRResult(statistic=np.float64(0.2800681334905376)

, pvalue=np.float64(0.000617587878856653))

  • 상관계수: 0.2800681334905376
  • p-value: 0.000617587878856653

p-value가 작음 = 상관관계가 있다

p-value 0.05로 봄(5퍼센트)

상관계수확인 corr()

air.corr(numeric_only=**True**)

numeric_only=True 상관계수는 수치형 데이터니까

참고 : (배경색 표시하기) 히트맵처럼

air.corr(numeric_only=True).style.background_gradient(cmap='Blues')

  • Seaborn의 heatmap() 함수로 상관계수를 시각화
plt.figure(figsize=(6, 6))
sns.heatmap(air.corr(numeric_only=True),
            annot=True, -> 숫자로 표현
            fmt='.3f', -> 소숫점 세자리까지
            cmap='Blues', -> 시원한 색깔
            vmin=-1, -> 색상을 -1부터 1까지
            vmax=1,
            square=True, -> 정사각형으로
            cbar=False) -> 위에 vmin어쩌고 그거 색상 바 없애기
plt.show()

상관계수의 한계


정리

CRISP-DM을 보며

비즈니스 문제 - 문제를 파악하고

마지막에는 문제가 해결되었나?를 파악해야함

가설수립

가설에 대한 추가 설명

우리가 가지고 있는 표본(CSV)를 가지고 모집단을 예측해야해

그래서 우린 가설을 세우지(모집단에 대한 가설)

X → Y

BMI → Outcome (BMI가 Outcome에 영향이 있을 것이다)

대립가설 - 상관계수 0.87 일때

vs

귀무가설 (영향이 없을 것이다) 0.87이 모집단에서 발생할 수 있는 확률이 0.0000003 (희귀)

이 정도면 우리가 귀무가설말고 대립가설을 선택해야하지 않을까?

대립가설의 뒷받침 근거가 되는 것이 p-value

→ 모집단에 대한 가설이기 때문에 뭐가 좋다 나쁘다 우리가 정할 순 없지만

통계 수치를 보고 무엇이 더 나을지 판단할 수는 있음

= 모집단(미래 데이터)에 대한 가설을 수립하고

우리가 가지고 있는 표본(과거 데이터)

표본을 가지고 최대한 모집단을 확인하고 싶은거고

나아가 모집단을 예측하고 싶어 - 머신러닝

덴시티플롯 - 확률분포함수

를 쓰냐면 우리가 가지고 있는 수치형 데이터는 너무 많기 때문에 개별적으로 함수를 풀어

정리할 수 없어서 그래프로 정리한 것

그래프는 함수에 의해 그려지는 것

 

 

 

+ Recent posts