👾 따로따로 공부하다보면 이게 어떻게 연결이 되는건지 감이 잘 안오기도 하는데
코딩 샘플로 쭈욱 플로우를 보다 보니 이해가 훨씬 더 쉬워서 올리는,
우선 비즈니스 이해부터 하는게 가장 중요한데 이번에 해본 코딩은 '주식' 관련 샘플 데이터를 다운받아 Close column, 즉 주식이 종료되는 시점 주가를 예측하는 작업이다
👉 전체적으로 데이터 파일csv을 다운받고, 데이터를 불러오고, 데이터를 확인한 다음
👉 EDA 분석을 하고
👉 matplot 호출을 통해 그림 / 그래프를 그려보고
👉 학습을 위해 학습 데이터와 평가 데이터를 나눈뒤
👉 Linear Regression 모델을 학습시켜서 평가까지 진행한다
👉 추가로 MinMaxScaler도 이용하여 범위 조정 후 다시 모델 학습을 진행해본다
📌 주식 Close 때의 값 예측하기
#stock.csv를 이용하여 종가(close column)를 예측해보자
import pandas as pd
#데이터 불러오기
df = pd.read_csv("stock.csv")
#데이터 확인하기
df.head()
df.tail()

✔️ 아, df.tail() output으로 나온 데이터를 확인해보니 column이 5개가 있구나
Open, High, Low, Volume, Close.. 주식이 오픈했을 때 가격, 최고가, 최저가, 그리고 Close는 마지막 끝났을 때 가격이겠고 Volume은 뭔지는 잘 모르겠다 가격 range가 가장 크군
df.shape
#output) (732, 5)
✔️ pandas Dataframe shape을 보니까 732줄로 되어 있고 column이 5개라는 거구나
기본적으로 데이터가 어떤 shape을 갖고 있는지 확인하는 건 중요
#EDA 분석해보기, 평균, 최소최댓값, 표준편차 등
df.describe()

✔️ describe()은 우선 pd. Dataframe에만 사용가능하며 numpy에 이용하려하면 에러가 나더라
describe()을 통해 나온 데이터들을 보니까 Open, High, Low는 비슷하고 Volume은 굉장히 수가 다른거에 비해 크네
#matplot 호출하기
import matplotlib.pyplot as plt
#그림판 그리기
plt.figure(figsize = (15,5))
#boxplot 그리기
plt.boxplot( df["Open"] )
plt.show()
#scatterplot 그리기
plt.scatter( df["High"], df["Low"] )
plt.show()

✔️ boxplot에서 맨위 맨아래 검은 선 두개는 max, min이며 가운데 주황선은 mean, 네모칸은 IQR로 75% 25%

✔️ High랑 Low를 그려본건데 직선처럼 나오는걸 보니 두개는 비례관계인가보다
👉 이제 데이터가 어떻게 생겼는지 대충 확인했으니 학습을 위한 준비가 필요하다
#학습을 위해 학습데이터와 test 데이터 나누기
#train_test_split을 어디서 불러오는 거인지 찾아보기 -> sklearn.model_selection임
from sklearn.model_selection import train_test_split
#예측하려고하는 종가인 Close 빼고 Open~Volume 까지 x로 놓는다
x = df.loc[ :, "Open":"Volume"]
#Close 값이 예측하려는 값이므로 Close만 y에 넣기
y = df.loc[ :, "Close"]
✔️ 데이터를 나누기 위해서 x값과 y값에 column을 나누어서 넣어주어야 한다
우리가 구하고자, 예측하고자 하는 타겟 column은 'Close'이므로 'Close'만 y에 넣고 나머지는 x에다가 넣는다
#x와 y로 나눈 뒤로 shape혹 head, tail()을 통해 잘 나눠진 것인지 확인
x.shape
#output) (732, 4)
y.head()
#output)
0 831.659973
1 828.070007
2 824.159973
3 818.979980
4 820.450012
Name: Close, dtype: float64
✔️ x와 y가 잘 나누어졌는지 shape과 head()를 통해 확인해보았다. 잘 나누어졌다
#학습/평가 데이터 나누기
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, shuffle = True)
✔️ test_size=0.2로 해서 학습 데이터 80%, 평가 데이터 20%로 잡았으며 shuffle을 True로 섞어줌으로써 데이터를 한번 섞고 나서 데이터를 골고루 나누어 주었다
#x와 y shape 확인을 통해 잘 나뉘어졌는지 확인
x_train.shape, x_test.shape
#output) ((585, 4), (147, 4))
y_train.shape, y_test.shape
#output) ((585,), (147,))
✔️ 학습 데이터와 평가 데이터가 잘 나누어졌는지 확인해보니 585줄, 147줄로 약 8:2로 잘 나누어진듯하다
이제 LinearRegression 모델 학습을 시킬거다
#LinearRegression 모델 학습 위해 호출해오기
from sklearn.linear_model import LinearRegression
model = LinearRegression()
#학습하기
model.fit( x_train, y_train )
✔️ model.fit을 통해 학습을 시켰으면 이제 평가를 해서 잘 학습이 되었는지 확인해본다
#평가하기 (학습데이터)
model.score( x_train, y_train )
#output) 0.9989816461489236
#평가하기 (평가데이터)
model.score( x_test, y_test )
#output) 0.9989168683991834
✔️ train data와 test data모두 0.998...로 거의 1에 가깝다
output으로 1에 가깝게 나오면 실제값이 완전 동일하게 예측한 것이기 때문에 train data외 test data까지 1이면 완벽한 모델이라고 판정
#model에 대한 coef라서 model이 지금 위에서 train data를 이용하여 했기 때문에 이미 학습된 train data로 coefficient구해보기
model.coef_
#output) array([-5.82384018e-01, 7.48675131e-01, 8.32368148e-01, -4.06641439e-08])
Open | High | Low | Volume |
-5.82384018e-01 | 7.48675131e-01 | 8.32368148e-01 | -4.06641439e-08 |
✔️ 위와 같이 coef가 나온다는 말인데 해석을 해보면,
시작가 -5 ... Close 값을 내리는 영향을 준다
최고가에 0.7, 최저가에 0.8을 곱했으니 양수이기 때문에 Close 값을 감소시키는게 아니라 + 영향을 준다는 뜻이다
👉 df.describe()으로 다시 확인해보자
df.describe()

✔️ 확인해보면 Open,High,Low 숫자의 range가 비슷하고 Volume은 크기가 커서 Open,High,Low와 비교가 어려움
👉 그럼 MinMaxScaler를 이용하여 0~1로 숫자 range를 다 맞춰주고 진행해보자
#MinMaxScaler 호출하기
from sklearn.preprocessing import MinMaxScaler
scaled_x = MinMaxScaler().fit_transform(x)
pd.DataFrame(scaled_x).describe()

✔️ 수가 이제 column에 상관없이 0-1사이로 조정되었다. scaling이 잘 되었군
👉 다시 LinearRegression 모델을 학습시키고 평가해본다
#학습/평가 데이터로 나누기.. test_size=0.2이므로 80% 20%로
#순서대로 A_분리1, A_분리2, B_분리1, B_분리2
x_train, x_test, y_train, y_test = train_test_split(scaled_x, y, test_size=0.2, shuffle=True)
x_train.shape, x_test.shape
#output) ((585, 4), (147, 4))
#model링 방법 정하기
model = LinearRegression()
#학습시키기
model.fit( x_train, y_train )
#평가하기 (학습 데이터)
model.score( x_train, y_train )
#output) 0.9989226950149593
#평가하기 (평가 데이터)
model.score( x_test, y_test )
#output) 0.9991343827080426
✔️ train, test data 둘다 score output이 굉장히 좋다 거의 1에 가깝다
거의 실제값에 동일하게 예측한 것이므로 완벽한 모델이라고 판정
model.coef_
#output) array([-192.79578298, 244.76987773, 291.22644364, 1.23184372])
Open | High | Low | Volume |
-192.79578298 | 244.76987773 | 291.22644364 | 1.23184372 |
✔️ 나온 coefficient값을 해석해보면
4번째 값 거래량은 1.23..으로 작기 때문에 크게 영향을 미치지 않는구나 -> 무시해도 됨
1번째 값 Open은 음수이기 때문에 종가 Close 값에 음의 영향을 미침
2번째 3번째 값 High와 Low는 양수이기 때문에 종가 Close 값에 양의 영향을 미침
👉 시각화를 해보면 더 와닿는다

시각화를 하면 더 안다 Volume은 정말 무시해도 될만한 계수이구나..
👾 여기까지 찬찬히 플로우를 살펴보면서 진행해보았다
실제로 전체적인 모습을 보면서 코딩해보니 이해가 훨 잘 되었단
오늘은 이만 자야지! 👾
'CDS' 카테고리의 다른 글
Machine Learning [Linear Regression] (0) | 2021.11.16 |
---|---|
Machine Learning [Scaling] (0) | 2021.11.15 |
Machine Learning [K-NN] (0) | 2021.11.15 |
Machine Learning [Scikit-Learn] (0) | 2021.11.15 |
Machine Learning Overview (0) | 2021.11.15 |