카테고리 없음

선형회귀분석

R.U.s.t.y 2021. 7. 12. 17:37

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# GD를 사용해서 기울기를 계산하는 선형관계 모듈
from sklearn.linear_model import LinearRegression


import matplotlib.font_manager

plt.rcParams["font.family"] = "NanumGothicCoding"
plt.rcParams["font.size"] = 12

X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]
# 모델 선정한 후에 기계학습 시키기전에 vector로 변경하는 작업
train_X = np.array(X)
train_Y = np.array(Y)

# 1행 x 10열 =>  10 x 1
train_x = train_X.reshape(-1,1)

# 모델을 생성
lrmodel = LinearRegression()
# 모델을 지도학습 훈련
lrmodel.fit(train_x, train_Y)

# Loss 가 최소가 되는 직선의 기울기, 절편을 계산
beta_0 = lrmodel.coef_[0] # 직선의 기울기값
beta_1 = lrmodel.intercept_ #직선의 y의 절편
print('beta_0 : %f'%beta_0)
print('beta_1 : %f'%beta_1)
print('Loss : %f'%loss(X,Y,beta_0,beta_1))

# 그래프 시각화
plt.scatter(X,Y)
plt.plot([0,10],[beta_1, 10 * beta_0 + beta_1], c='r')
plt.xlim(0,10)
plt.ylim(0,10)
plt.show()

beta_0 : 0.430781  / beta_1 : 2.506181  / Loss : 3.721640

 

 

## 선형회귀분석  ​

### 회귀분석   

- 회귀 분석(Regression analysis)이란 통계적으로 데이터를 분석하는 방법 중 하나  

- 입력에 대해서 연속적인 값을 대응시키는 문제   

- 회귀 분석이란 한 개 이상의 변수를 다룰 때 특정 변수가 다른 변수와 어떤 관계를 맺는지 분석하고, 

  이를 바탕으로 모델을 정의해 값을 예측하는 기법이다.  

- 단순 선형회귀분석 : stats.linregress(x,y)    

- 상관 분석(Correleation Analysis)   : 상관관계의 값을 파악할 수 있는 정도의 값을 상관 계수    

  범위 -1 ~ 1 사이

 

# pandas_datareader 패키지의 DataReader라는 함수는

   웹 상의 데이터를 DataFrame 객체로 만드는 기능을 제공합니다.

# yfinance 는 야후에서 제공하는 api로 과거부터 현재까지 주가정보를

  조회 및 다운로드 할 수 있는 라이브러리 입니다.

 

!pip install pandas_datareader
!pip install yfinance

from pandas_datareader import data as pdf
import yfinance as yf
yf.pdr_override()

dow = pdf.get_data_yahoo('^DJI','2001-01-01')
kospi = pdf.get_data_yahoo('^KS11','2020-01-01')

print(dow.shape)
print(kospi.shape)
(5162, 6)
(379, 6)

import pandas as pd
df = pd.DataFrame({'DOW':dow['Close'],'KOSPI':kospi['Close']})

df.isnull().sum()
DOW        13
KOSPI    4796
dtype: int64
# 바로 뒤의 값을 NaN 에 적용해 줌
df = df.fillna(method='bfill')
# 바로 앞의 값을 NaN 에 적용해 줌
df = df.fillna(method='ffill')
# 상관계수 비교해 보기
df.corr()
from scipy import stats
regr = stats.linregress(df['DOW'],df['KOSPI'])

X = df['DOW']
Y = df['KOSPI']

import matplotlib.pyplot as plt
plt.scatter(df['DOW'],df['KOSPI'],marker='.')
plt.plot(X,regr.slope * X + regr.intercept,'r')
plt.xlabel('Dow Jonse Industrial Average')
plt.ylabel('KOSPI')
plt.show()

 

# 1. 회귀분석 : 1. 전기생산량과 소비량
# 독립변수(전기 생산량), 종속변수(전기소비량)
# 독립변수가 1개 이므로 단순회구분석(선형회귀분석)을 사용한다.
# 귀무가설 : 전기 생산량과 전기소비량 간에 상관관계가 없다.
# 대립가설 : 전기 생산량과 전기소비량 간에 상관관계가 있다.
####################################################################
# 월별 전기생산 금액(억원)을 변수 x, 
x = [3.52, 2.58, 3.31, 4.07, 4.62, 3.98, 4.29, 4.83, 3.71, 4.61, 3.90, 3.20]
# 이 때 전기 사용량(백만 Kw) 을 y로 한다
y = [2.48, 2.27, 2.47, 2.77, 2.98, 3.05, 3.18, 3.46, 3.03, 3.25, 2.67, 2.53]
####################################################################

 

# 산점도를 출력해서 상관관계를 보자.

plt.scatter(x,y)
plt.grid(True)

# <반환값>
# slope : 기울기, intercept : 절편, rvalue : 상관계수, pvalue : 예측기준(0.05)

slope, intercept, r_value, p_value, stderr = stats.linregress(x,y)
print('stderr[에러 표준편차] : ',stderr)
stderr[에러 표준편차] :  0.07901935226531728

 

# 0.89 값으로 두 변수 간에 양의 상관관계를 가진다.
# 통계학적으로 유의미한 관계

print('r_value (상관계수) : ',r_value)
r_value (상관계수) :  0.8929235125385305

# 0.05 보다 적으면 유의미 하다라고 판단

print('p_value : ',p_value)
p_value :  9.238421943157891e-05

# 결론 : 전기생산량과 전기소비량 간에 상관관계가 있다.
# 상관분석 : 두 변수간에 어떤 선형적인 관계가 있는지 분석하는 것.

 

# 시각화
import numpy as np
%matplotlib inline
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_xlim([2.5,5.0])
ax.set_ylim([2.0,3.7])
plt.grid(True)
plt.scatter(x,y)
x1 = np.array(x)
plt.plot(x1, slope*x1 + intercept, c="red")
plt.title('단순선형회구 예제')
plt.xlabel('전기생산량')
plt.ylabel('전기사용량')
plt.savefig('test.png')
plt.show()