본문 바로가기
대학공부/데이터과학

선형 회귀를 이용한 예측과 그 응용

by 진진리 2024. 3. 25.
728x90

1. 상관계수와 상관분석의 기초

두 변량의 상관관계는? 상관계수

  • Pearson Correlation Coefficient
    • 두 변수 사이에 존재하는 선형적인 상관관계를 수치로 나타낸 것
    • 크기는 -1 ~ +1으로, 값이 0일 경우 상관관계가 없는 것임
    • 부호가 (+)이면 양의 상관관계, 부호가 (-)이면 음의 상관관계를 의미

 

DataFrame 내에서의 상관계수 도출

  • english.csv : TOEIC, TEPS, TOEFL의 점수 파일
import pandas as pd
df = pd.read_csv('english.csv')

df_corr = df.corr(method = 'pearson')
df_corr

TOEIC과 TEPS는 매우 강한 양의 상관, TOEIC과 TOEFL은 선형적 상관을 찾기 힘들다.

 

  • 주어진 데이터 중 결측치가 부분적으로 존재할 때 pandas는 어떻게 상관계수를 계산?
    • 해당 데이터 쌍을 계산에서 무시

 

상관계수 해석에서의 유의점

  1. Pearson 상관계수는 선형적인 상관관계를 나타내는 지표이다
    • Y = X^2일 때 Pearson 상관계수로는 상관관계를 찾아내기 어려울 수 있음
    • 극복 방법? 루트Y와 X의 상관관계를 살펴보기
  2. 큰 상관계수가 인과관계를 보장하는 것은 아니다
    • 예시) 모기 개체수와 아이스크림 판매량은 0.88로 강한 양의 상관관계
  3. 상관계수의 크기기울기를 혼동해서는 안된다.

 

값이 아닌 순위를 기준으로

  • 순위에 따른 Spearman 상관계수의 도출
import pandas as pd
df = pd.read_csv('english.csv')

df_corr = df.corr(method = 'spearman')
df_corr
  • 순위 기반 상관계수 도출이 Pearson 상관계수 도출보다 유리한 상황은?
    • 높은 상관관계를 가지고 있음에도 선형적 상관관계를 가지고 있지 않을 때 유용
  • Spearman과 대비되는 Kendall 상관계수의 특징은?

 

네가 오르면 나도 오른다, Kendall

concordant: 조화, discordant: 비조화

  • 전체 데이터가 가질 수 있는 순서쌍
    • ex. 6개의 행이 있을 때 6C2 = 15쌍
  • concordant 순서쌍: A 속성이 더 높은 사람이 B 속성도 더 높은 순서쌍
  • 모든 순서쌍은 concordant 순서쌍이거나 discordant 순서쌍 둘 중에 하나에 해당함
    • 속성의 값이 같을 경우에는 무시함 
  • concordant 순서쌍 - discordant 순서쌍으로 빼주는 이유? 전체 scale이 -1 ~ +1이기 위해서

 

2. 선형 회귀의 뜻과 그 실제

사용할 DataFrame

예측을 위한 선형 회귀 모형의 식은?

  • 학년별 내신 평균 등급과 모의고사 원점수 총점으로 수능 원점수 총점 예측

0: 상수항, 1~3: 학년별 내신 평균 등급, 4~5: 모의고사 원점수 총점

  • 위 식에서 궁금한 것은 θ 값 여섯 개 -> 결정하는 기준은? MSE 최소화

 

선형 회귀의 궁극적 목표, MSE 최소화

  • MSE(Mean Squared Error, 평균제곱오차)
  • MSE를 최소화하는 방향으로 선형 회귀가 이루어짐

 

선형 회귀 구현을 위한 라이브러리

  • 필수 라이브러리 불러오기
import pandas as pd # csv 파일을 dataframe으로
import matplotlib.pyplot as plt # 데이터 시각화

from sklearn.model_selection import train_test_split # 데이터 분리
from sklearn.linear_model import LinearRegression # 선형 회귀
  • 데이터를 불러온 뒤 독립 변수와 종속 변수를 분리
df = pd.read_csv('score.csv')

df_x = df[['1st', '2nd', '3rd', '6mo', '9mo']] # 독립 변수 x
df_y = df['suneung'] # 종속 변수 y
  • 학습용 데이터와 검증용 데이터를 분리
    • 20%는 validation에, 80%는 train에 사용
    • 데이터를 분리할 때 편향되지 않도록 주의해야 함
x_train, x_valid, y_train, y_valid = train_test_split(df_x, df_y, random_state = 0, test_size = 0.20)
  • 선형 회귀 모형 생성하기
reg = LinearRegression()
  • 학습 데이터로 선형 회귀 식에서의 계수 결정
reg.fit(x_train, y_train)
  • 상수항과 선형 회귀 계수 출력
print(reg.coef_) # 회귀 계수
print(reg.intercept_) # 상수항
  • 선형 회귀 모형 생성하기
y_pred = reg.predict(x_valid) # train으로 학습, validation으로 검증

y_pred

 

데이터가 적다면, K-Fold

  • K-fold validation을 위한 Python 라이브러리
from sklearn.model_selection import KFold