티스토리 뷰

오늘은 주가 데이터를 활용하여 군집화를 하는 예제를 소개하려고 합니다. 이를 위해  PCA(주성분 분석, Principal Component Analysis)를 사용하겠습니다. 

먼저 필요한 라이브러리들을 임포트합니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

주어진 데이터셋을 pandas를 이용해 불러옵니다. 여기서는 구글 주가 데이터(GOOG-year.csv)를 사용합니다.

GOOG-year.csv
0.02MB

df = pd.read_csv('dataset/GOOG-year.csv', index_col=0, parse_dates=True)

주가 데이터를 numpy 배열로 변환하고, 표준화를 위해 StandardScaler를 사용합니다.

X = df.iloc[:, 1:].dropna().values
X_std = StandardScaler().fit_transform(X)

다음으로, 공분산 행렬(covariance matrix)을 계산합니다.

mean_vec = np.mean(X_std, axis=0)
cov_mat = np.cov(X_std.T)

이제 공분산 행렬로부터 고유값과 고유벡터를 구합니다.

eig_vals, eig_vecs = np.linalg.eig(cov_mat)

고유값-고유벡터 쌍을 고유값이 큰 순서대로 정렬합니다.

eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))]
eig_pairs.sort(key=lambda x: x[0], reverse=True)

설명 가능한 분산의 비율과 누적 설명 가능한 분산을 계산하고 시각화합니다.

tot = sum(eig_vals)
var_exp = [i / tot * 100 for i in sorted(eig_vals, reverse=True)]
cum_var_exp = np.cumsum(var_exp)

fig, ax = plt.subplots(figsize=(10, 5))

ax.bar(range(len(var_exp)), var_exp, alpha=0.3, label='individual explainable variance', color='g')
ax.step(range(len(var_exp)), cum_var_exp, label='cumulative explainable variance', where='mid', color='r')

plt.show()

 

PCA를 이용하여 주성분을 2개로 설정하고 데이터를 변환합니다.

data = pd.DataFrame(X_std)
pca = PCA(n_components=2)
pca_transformed_data = pca.fit_transform(data)
pca_np_scaled = StandardScaler().fit_transform(pca_transformed_data)

K-means 알고리즘을 사용하여 군집화를 수행합니다. 이를 위해 PCA를 적용한 데이터와 원래 데이터에 각각 K-means를 적용합니다.

origin_np_scaled = data.values

from sklearn.cluster import KMeans

kmeans_pca = KMeans(n_clusters10).fit(pca_np_scaled)
kmeans_origin = KMeans(n_clusters=10).fit(origin_np_scaled)

 

PCA와 원래 데이터에 대해 얻어진 군집 레이블을 데이터 프레임에 추가합니다. 

df['cluster_pca'] = kmeans_pca.predict(pca_np_scaled)
df['cluster_origin'] = kmeans_origin.predict(origin_np_scaled)

데이터 프레임의 인덱스를 재설정하고, 주성분 특성을 추가합니다.

df = df.reset_index()
df['principal_feature1'] = pca_np_scaled[:, 0]
df['principal_feature2'] = pca_np_scaled[:, 1]

각 군집의 개수를 출력하고, 주성분을 기준으로 산점도를 그립니다.

print(f"pca component cluster\n{df['cluster_pca'].value_counts()}")
print(f"original cluster\n{df['cluster_origin'].value_counts()}")

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(df['principal_feature1'], df['principal_feature2'], c=df['cluster_pca'])
plt.show()

이제 주가 데이터를 PCA와 K-means를 사용하여 군집화하였습니다. 이를 통해 주성분 분석을 통한 차원 축소를 통해 더 명확한 패턴이나 구조를 확인할 수 있습니다. 이 방법을 다양한 데이터셋에 적용하여 데이터의 특성을 더 잘 이해할 수 있습니다.

모든 코드입니다. 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

df = pd.read_csv('dataset/GOOG-year.csv', index_col=0, parse_dates=True)

X = df.iloc[:, 1:].dropna().values  # as numpy array
X_std = StandardScaler().fit_transform(X)

mean_vec = np.mean(X_std, axis=0)  # 열평균, 결과는 (컬럼수,)
# mean_vec2 = np.mean(X_std)  # 전체 평균

cov_mat = np.cov(X_std.T)
# cov_mat2 = np.cov(X_std)

eig_vals, eig_vecs = np.linalg.eig(cov_mat)

eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))]
eig_pairs.sort(key=lambda x: x[0], reverse=True)

tot = sum(eig_vals)
var_exp = [i / tot * 100 for i in sorted(eig_vals, reverse=True)]
cum_var_exp = np.cumsum(var_exp)

# 그래프
fig, ax = plt.subplots(figsize=(10, 5))

ax.bar(range(len(var_exp)), var_exp, alpha=0.3, label='individual explainable variance', color='g')
ax.step(range(len(var_exp)), cum_var_exp, label='cumulative explainable variance', where='mid', color='r')
# ax.step(range(len(var_exp)), cum_var_exp, label='cumulative explainable variance', where='pre', color='b')
ax.set_xlabel('Principal component')
ax.set_ylabel('explainable variance')
plt.show()

# using largest 2 component of pca

data = pd.DataFrame(X_std)  # why?
pca = PCA(n_components=2)
pca_transformed_data = pca.fit_transform(data)
pca_np_scaled = StandardScaler().fit_transform(pca_transformed_data)

origin_np_scaled = data.values

from sklearn.cluster import KMeans

kmeans_pca = KMeans(n_clusters=10).fit(pca_np_scaled)
kmeans_origin = KMeans(n_clusters=10).fit(origin_np_scaled)

df['cluster_pca'] = kmeans_pca.predict(pca_np_scaled)
df['cluster_origin'] = kmeans_origin.predict(origin_np_scaled)

df = df.reset_index()
df['principal_feature1'] = pca_np_scaled[:, 0]
df['principal_feature2'] = pca_np_scaled[:, 1]
print(f"pca component cluster\n{df['cluster_pca'].value_counts()}")
print(f"original cluster\n{df['cluster_origin'].value_counts()}")

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(df['principal_feature1'], df['principal_feature2'], c=df['cluster_pca'])
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
plt.show()

더 해볼만한 연습

  1. "주가 데이터를 이용한 시계열 예측: LSTM을 활용한 딥러닝 기반 접근 방법" 이 예제에서는 주가 데이터를 기반으로 시계열 예측을 수행하는 방법을 소개합니다. 딥러닝의 한 종류인 LSTM(Long Short-Term Memory) 모델을 사용하여 주가의 향후 추세를 예측하고, 이를 시각화하여 결과를 분석하는 과정을 다룹니다.
  2. "주가 데이터에 대한 상관관계 분석: 다양한 기업 간의 상호 작용 파악하기" 이 예제에서는 여러 기업의 주가 데이터를 활용하여 서로간의 상관관계를 분석합니다. 주가 데이터를 전처리한 후, 각 기업 간의 상관계수를 계산하고 이를 히트맵으로 시각화합니다. 이를 통해 다양한 기업 간의 상호 작용 및 영향력을 파악할 수 있습니다.
728x90
반응형
댓글
250x250
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함
공지사항