nan + nan = 2nan

[ML][210909] 선형회귀분석 본문

Statistics/Machine Learning

[ML][210909] 선형회귀분석

2nan 2021. 9. 9. 18:02
728x90

머신러닝

  • 기계 학습 : 기계를 가르친다
  • 기계를 어떻게 가르칠 것인가? 에 따라 두가지 형태로 나눠 생각한다.
  • Supervised Learning(지도 학습)
  • Unsupervised Learning(비지도 학습)

 

지도학습 (Supervised Learning)

  • 데이터에 Label(정답)이 미리 정해져 있을 때 가능
  • 프로그램에 입력 값을 주면 출력 값을 기계가 알아서 예측해서 출력해주는 형태
  • 지도 학습은 또 다시 Regression (회귀) 와 Classification (분류) 로 세분화
    • Regression (회귀) : 연속된 값, 수치, 즉 '얼마나'를 예측
    • Classification (분류) : 연속적이지 않은 값, '무엇'을 예측

 

비지도학습 (Unsupervised Learning)

  • 레이블이 정해져 있지 않은 데이터를 기반으로 데이터의 고유한 구조나 패턴을 익히는 것
    • Clustering(군집화) : 데이터에서 패턴과 구조를 찾아 그룹을 지어줌

 

선형회귀 (LinearRegression)

  • 시험 성적은 공부 시간이 늘어날 수록 잘 나온다
  • 생선의 길이가 길면, 무게는 높아진다.
  • 다른 변수에 영향을 주는 값 (독립변수) => X와 변수 X에 의해 종속적으로 변하는 값 (종속변수) => y로 구성
  • x를 독립 변수, y를 종속 변수
  • 선형 회귀는 한 개 이상의 독립 변수 x와 y의 선형 관계를 모델링
  • 독립 변수 X가 1개라면, 단순 선형회귀
  • 독립 변수 X가 2개 이상이라면, 다중 선형회귀

단순선형 회귀모델 [Simple linear regression]

  • Independent variable (독립변수) x에 따라 Dependent variable (종속변수) y가 변함
  • 종속변수 y와 한 개의 독립변수 x와의 선형 상관 관계를 모델링하는 회귀분석 기법
  • y = wx + b

 

Import and create the model

 

- 선형회귀분석을 위해 import 하고, 해당 모델링을 이용해서 예측 값을 알아가는 과정이다.

from sklearn.linear_model import LinearRegression
your_model = LinearRegression()

your_model.fit(x_trainig_data, y_training_data)  # 학습모델 생성 => 이를 통해 예측

your_model.coef_ : contains thecoefficients   # 계수를 나타냄. 기울기
your_model.intercept_ : contains the intercept  # 절편

predictions = your_model.predict(your_x_data)
your_model.score() = returns the coefficient of determination R(예측 결과)

 

 

Part.1) 모집단과 표본집단의 분산 / 표준편차 계산

 

import numpy as np
import pandas as pd

x = [20, 25, 30, 34, 40]


# np.var(x) / std(x) => 옵션으로 ddof = 0 (기본 값 / 모집단), ddot = 1 (표본집단)
print('---- Numpy 를 이용한 모집단 분산 / 표준편차 -----')

print(np.var(x))    # 분산
print(np.std(x))    # 표준편차

print('---- Numpy 를 이용한 표본집단 분산 / 표준편차 -----')

print(np.var(x, ddof = 1))   # 분산
print(np.std(x, ddof = 1))    # 표준편차

numpy와 pandas를 이용해본다.

우선 Numpy 사용할 때, 분산과 표준편차를 구하는 방법이다.

해당 데이터 리스트 변수 뒤에 .var(해당 변수) / .std(해당 변수) 로 출력 가능하다.

 

이는 모집단과 표본집단, 2가지 방법으로 나뉜다.

앞서 말했던 방법은 모집단에 해당하는 데이터의 분산과 표준편차를 구하는 방법이고,

표본집단을 구하고 싶다면, 변수 뒤에 ddof = 1 을 넣어주면

각 집단에 해당하는 분산과 표준편차를 출력 가능하다.

## print 내용
---- Numpy 를 이용한 모집단 분산 / 표준편차 -----
48.160000000000004
6.939740629158989
---- Numpy 를 이용한 표본집단 분산 / 표준편차 -----
60.2
7.758865896508329

 

Pandas를 이용하는 방법도 크게 다르지 않다. 우선, DataFrame 내에 변수를 설정해주고

동일한 방법으로 사용 가능하다. 단, Pandas는 표본집단이 기본 값으로 설정이 되어있기 때문에,

모집단 값을 출력할 때 ddof를 0으로 설정해주면 동일한 내용으로 출력 가능하다.

 

df = pd.DataFrame({"x" : x})

print('---- Pandas 를 이용한 모집단 분산 / 표준편차 -----')
print(df.var(ddof = 0))
print(df.std(ddof = 0))   # Pandas 는 표본집단이 기본 값, ddof = 0으로 설정 시 모집단으로 설정 가능 / Numpy는 모집단

print('---- Pandas 를 이용한 표본집단 분산 / 표준편차 -----')
print(df.var())
print(df.std())

## print 내용
---- Pandas 를 이용한 모집단 분산 / 표준편차 -----
x    48.16
dtype: float64
x    6.939741
dtype: float64
---- Pandas 를 이용한 표본집단 분산 / 표준편차 -----
x    60.2
dtype: float64
x    7.758866
dtype: float64

 

 

Part2) 상관계수 R 값 계산

  • 상관 관계의 정도를 파악하는 상관계수

 

x = [20, 25, 30, 34, 40]
y = [26, 30, 40, 48, 66]

import pandas as pd
import numpy as np


df = pd.DataFrame({'x':x, 'y':y})

display(df)


display(df.corr()) 
display(df.corr(method='pearson'))   # 같은 값. 생략 가능
print()
print(df['x'].corr(df['y']))

std = df['x'].std(), df['y'].std()
mean = df['x'].mean(), df['y'].mean()

df['계산 x'] = (df['x']-mean[0]) / std [0]
df['계산 y'] = (df['y']-mean[1]) / std [1]
df['곱셈'] = df['계산 x'] * df['계산 y']
display(df)

r = (df['곱셈'].sum()) / (len(df['계산 y']) - 1)
print('상관계수 R은 %.3f입니다.' %r )

 

part.3) 기울기 구하기

방법 1) 상관계수를 구하고 기울기 구하기

방법 2) 기울기를 구하고 상관계수를 구하기

기울기 = 상관계수 * 표준편차 y / 표준편차 x

#방법 1) 
## W = R * Sy / Sx


### 기울기
w = r * std [1] / std [0]
print(w)   

### 절편
b = mean[1] - (mean[0] * w)
print(b) 

### 선형회귀 공식을 이용한 차트 작성  y_hat
df['lr'] = w * df['x'] + b
display(df) 


## 해당 값들을 산점도와 직선 그래프로 나타냄
import matplotlib.pyplot as plt

plt.plot(df['x'], df['y'], 'ro')
plt.plot(df['x'], df['lr'])

plt.show()

# 예측 함수를 만들어 값 도출
def prediction(newX):
    print(w * newX + b)
    
prediction(25)

 

 

####sklearn을 이용한 선형회귀식 적용
%matplotlib inline
from sklearn.linear_model import LinearRegression

model = LinearRegression()

x = df['x'].values.reshape(-1, 1)
y = df['y'].values.reshape(-1, 1)

model = model.fit(x, y)

### x 값 대입 시 반드시 2차원
print(model.predict([[20]]))     

print(model.coef_)  # w (기울기)
print(model.intercept_) # b (절편)

-------------------------------------------------

# MSE (평균제곱오차) = (실제값 - 예측값) ^2 / 크기
# 오답에 가까울수록  큰 값 출력
# 정답에 가까울수록 작은 값 출력

from sklearn.metrics import mean_squared_error
                            # 평균제곱오차
y_hat = model.predict(x)
mean_squared_error(y, y_hat)

-------------------------------------------------

plt.plot(x, y, 'ro')
plt.plot(x, model.predict(x))

plt.show()

 

싸이킷런을 이용했을 때와 손코딩 했을 때의 그래프 값이 동일하다.

손코딩은 싸이킷런 내 함수들이 어떻게 작동하는지 알아보기 위함이다.

선형회귀식이 앞으로 시작하는 머신러닝에서 많이 적용된다고 하니,

책을 보면서도 한 번 제대로 익혀봐야겠다.

통계 지식은 1학년 때 들었던 경영통계가 전부이자 마지막이었던 것 같다...

 

하루 하루 치이면서 어제보다 하나라도 더 배운 놈이 되자.

 


 

Comments