개요
이전 편에서 데이터의 시각화를 통해 데이터에 대한 어느 정도의 인사이트를 얻었다.
데이터를 보고 시각화 등의 기법을 통해, 데이터를 다각도로 살펴보고 의미있는 방점들을 찾아내는 것을
보통 EDA(Exploratory Data Analysis)라고 한다. 전처리 후엔 EDA를 수행한다.
이번 편에는 데이터의 이상치를 제거한 후, sklearn에서 제공하는 여러 모델들을 통해 간단하게 주식 예측 모델 학습과 평가를 해볼 것이다.
이상치
plt.figure(figsize = (5,3))
sns.boxplot(data = df)
plt.show()
이상치 확인은 여러 방식으로 할 수 있지만, 박스플롯이 가장 직관적이기에 좋다.
가격들은 비교적 안정적인 반편, 거래량은 가끔씩 껑충 뛰어오를 때가 있나보다. 이상치(흰 점)가 있는 모습.
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
lb = Q1 - 1.5*IQR
ub = Q3 + 1.5*IQR
filter = ((df >= lb) & (df <= ub))
df_clean = df[filter.all(axis=1)]
중요한 코드다. 주의할 점도 있다. 일단 퍼센타일과 IQR을 구해서 상방과 하방을 만드는 건 쉽다.
6번째 줄 코드에 있는 조건문을 데이터프레임에 넣는 논리에서 all이라는 코드가 사용되었다.
- df객체를 사용하고 있기 때문에, lb와 ub 역시 여러 열을 가진다.
- 그렇기 때문에, filter 뒤에 all(모든 열이 조건에 충족되어야 참)을 넣는다. (axis=1은 열을 의미.)
plt.figure(figsize = (5,3))
sns.boxplot(df_clean)
모델 학습
from sklearn.model_selection import train_test_split
X = df_clean.drop('Open',axis=1)
y = df_clean['Open']
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)
사실 모든 가격 종류에 대해 학습은 가능하지만, 시가로 골랐다.
데이터 나눠주고, 분리까지 바로 수행.
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, AdaBoostRegressor
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
필요한 모델 및 평가치를 import 해준다. 사실상 연속형 변수를 예측할 수 있는 대부분의 모델을 사용했다.
선형회귀, 릿지, 라쏘, 의사결정나무, 랜덤포레스트, GBR, Adaboost, 서포트벡터, KNN까지!
개념이나 이해는 유튜브, 사이킷런 공식 홈페이지, ChatGPT 등 다양한 곳에서 도움을 받았다..
models = {
'LinearRegression' : LinearRegression(),
'Ridge' : Ridge(),
'Lasso' : Lasso(),
'DecisionTreeRegressor' : DecisionTreeRegressor(),
'RandomForestRegressor' : RandomForestRegressor(),
'GradientBoostingRegressor' : GradientBoostingRegressor(),
'AdaBoostRegressor' : AdaBoostRegressor(),
'SVR' : SVR(),
'KNeighborsRegressor' : SVR()
}
보통은 하나의 모델을 학습한 후에 그 모델에 대한 평가가 이루어지지만, 많은 모델을 배우고 나서 드는 생각은,
각각의 데이터에 적합한 모델을 찾아줘야 한다는 것이다. 모든 모델이 모든 데이터에 적합할 수 없다.
딕셔너리에 모델의 이름과 모델 함수를 쌍으로 넣은 후, for문을 통해 모두 학습시켜 평가하면
각각의 모델을 비교할 수 있다.
result = []
for name,model in models.items() :
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
r2 = r2_score(y_pred,y_test)
mse = mean_squared_error(y_pred,y_test)
mae = mean_absolute_error(y_pred,y_test)
scores = {
'model' : name,
'r2_score' : r2,
'mse' : mse,
'mae' : mae
}
result.append(scores)
result = pd.DataFrame(result)
- models.items : 딕셔너리 객체 뒤에 items를 붙이게 되면, key와 value를 튜플 형태로 반환한다.
- result 라는 빈 리스트에 scores라는 딕셔너리를 append(추가)한다.
- 딕셔너리가 있는 리스트에 pd.DataFrame을 수행하게 되면, key가 열이 되고, value가 행이 된다.
우리의 목적은 모델별로 각각의 수치를 막대 그래프로 나타내는 것이다.
"모델별" 이라는 것은 X = 'model' 으로 할 수 있지만, "각각의 수치" 는 Seaborn의 hue 옵션이 필요하다.
hue는 하나의 열을 기준으로 수행하기 때문에, melt를 통해 행/열 변환을 수행한다.
result_melted = result.melt(id_vars='model', var_name = 'metric', value_name = 'score')
- id_vars : 행/열 변환에서 변하지 않는 기준점.
- var_name : 열(r2_score, mse, mae)이 변환되어 만들어질 범주형 변수의 열 이름.
- value_name : 기존 연속형 변수들이 포함될 열에 붙일 열 이름.
plt.figure(figsize = (10,5))
result_melted.iloc[2,2] = 0
sns.barplot(data = result_melted, x = 'model', y = 'score', hue = 'metric', palette = 'hls')
plt.xticks(rotation=90)
plt.title('NVDA Stock Price : Scores of Regression Models')
plt.show()
result_melted 의 값 중 하나가 0으로 지정되는 코드가 있는데, 저 변수는 라쏘 모델의 r2_score 이다.
막대그래프 코드의 경우, 하나의 값이 매우 극단적이면 상대적으로 일반적인 다른 변수들은
거의 볼 수 없게 만들어진다. 그래서 0으로 치환하여 표현하기도 한다.
평가 최종 결과
후기
사실 가격 간의 선형성은 크게 엇나가지 않는 한 모델 학습의 결과가 좋을 수 밖에 없다.
그렇기 때문에, 다음 편에서는 특정 산업군의 여러 주식을 비교하거나, ETF 등 파생상품 등을 비교해서
더욱 의미있는 분석을 해보고 싶다!
관련 포스팅
[파이썬] 엔비디아 주가 분포 & 추세 분석하기 (시각화 편)
개요이전 편에서 야후 금융 데이터를 받아서 필요한 전처리를 모두 수행했다. 올바른 데이터가 모두 갖춰졌다면 분석을 통해서 인사이트를 얻고, 그것을 직관적인 형태로 보고까지 해야한다."
skrrdevlog.tistory.com
[파이썬] 야후 주식API와 파이썬으로 엔비디아 주가분석 (전처리/스케일링 편)
개요데이터분석에 대한 기본 개념과 파이썬이라는 언어에 익숙해졌다면, 여러 종류의 데이터를 가지고 연습을 해봐야실력이 늘기 마련이다. 여러 도메인 (경제, 사회, 자연어, 정치 등) 에 대한
skrrdevlog.tistory.com
[파이썬/Python] Seaborn + Matplotlib 으로 시각화 총정리 (1)
개요파이썬의 시각화 라이브러리 하면 Matplotlib 이지만, 코드가 너무 자유로운 탓에 다양한 시각화를 하기엔코드가 길어질 수 있다. Heatmap, Grid 등 유용한 플롯들을 코드 한두줄로 작성할 수 있는
skrrdevlog.tistory.com
'Project > 주식 & 비트코인 분석' 카테고리의 다른 글
[파이썬/Python] AI 반도체 주식 분석하기!📉📈(이동평균 & 수익률) (3) | 2025.01.28 |
---|---|
[파이썬/Python] 나스닥 AI 반도체 주요 기업들 주식 분석하기!📉📈(주가 편) (10) | 2025.01.25 |
[파이썬] 엔비디아 주식 분포 & 추세 분석하기 (시각화 편) (16) | 2025.01.21 |
[파이썬] 야후 주식API와 파이썬으로 엔비디아 주가분석 (전처리/스케일링 편) (2) | 2025.01.19 |