공부중 .../데이터과학개론

Python으로 데이터 분석하고 Numpy 사용하기

Chelsey 2022. 12. 8. 23:57
728x90

아래는 주식 데이터를 분석하는데 고려해야할 리스트들이다.

  • 주당순이익(EPS, earning per share)과 주가는 선형적인 관계를 가지는가?
  • 주당순이익이 발표된 달의 다음 한 달 동안의 종가 평균을 구해서 비교해 보자
  • 데이터를 월별로 묶어서 평균을 구할 필요가 있음
  • groupby와 agg함수(aggregate:집계)를 사용

이러한 고려사항들을 python을 이용해 그룹화해서 값을 구할 수 있다.

# 월별로 그룹화
price.groupby(by="month")[["open","close"]].agg(open_mean=("open","mean"), 
			close_mean=("close","mean")).reset_index()
            
# agg에 딕셔너리를 넘기는 경우
price.groupby(by="month").agg({"open":"mean","close":"mean"}).reset_index()

# rename으로 열 이름을 변경
# axis=1로 column속성임을 지명해줘야 한다
price_mean.rename(
	{"open":"open_mean", "close":"close_mean"},
    axis=1,
    inplace=True)

 

agg에 인자로 줄 수 있는 함수들

mean, sum, min, max, median, std 표준편차, var, count 그룹에 속한 샘플 수

data.groupby(by="month")[["open","close"]].mean()

만약 reset_index=False라면 index값은 by로 지정한 값이 될 것이다.

 

시계열 데이터 - 회사를 분석할 때 아래와 같이 생각할 수 있다.

  • 1년간 주당순이익의 합 -> 특정 분기의 계절적인 영향을 배제한 기업의 이익을 고려할 수 있음
  • 분기당 1번씩 주당순이익이 발표되기 때문에 최근 4개의 주당순이익 값을 한 칸씩 이동하면서 계산해야함
  • 특정 크기의 윈도를 한 칸 씩 이동시키며 원하는 계산을 적용하는 일이 시계열 데이터에서는 자주 필요
  • Pandas에서는 rolling 함수를 이용할 수 있음

rolling 함수

earning_sample["epsactual"].solling(window=4)
earning_sample["eps_ttm"]=roll.sum().shift(-3)

roll.sum() 의 값이 행 인덱스 0, 1, 2, 3의 결과가 인덱스 3번부터 기록되므로 행 인덱스 0, 1, 2의 earning_sample["eps_ttm"]의 값은 NaN으로 나온다. 이를 해결하기위해 shift를 사용하게되며 인덱스 0 부터 기록되게 해준다.

"""
defferencing
인접한 두 값 사이의 차이를 계산 """
earning_sample["eps_ttm_diff"]=earning_sample["eps_ttm"].rolling(window=2)
				.apply(np.diff)
                                .shift(-1) * (-1) # 결과값을 양수로 만들어 사용하기 위함

 

데이터 프레임을 병합해보자

merge

  • dataframe을 합친다
  • database table join 같은거임
join_data = pd.merge(data1, data2, on="stand_col", how="left")
"""
left 를 기준으로 - data1을 기준으로 합친다
data1은 그대로 다 가져오고, data2 중 data1에 있는 column만 합쳐준다
stand_col을 기준으로 행을 정리해준다.
"""
  • how = "inner" 교집합인 것만 합친다.
  • how = "outer" 합집합인 것 모두 합친다. 존재하지 않는 값은 NaN처리된다.

 

데이터 분석해보기

describe와 시각화해서 분석하는 방법

df.describe() # 기초통계보기

# 시각적으로 확인하고 분석할 수 있다
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix

scatter_matrix(data[["col1","col2","col3","col4"]], 
				alpha=0.8, figsize=(8,8), diagonal="hist")
                # alpha 투명도
plt.show()

 

상관계수

corr()

df.corr()

디폴트값으로 피어슨 상관계수임

 

선형 회귀 linear regression Model

ols (ordinary least squares)

R과 유사한 선형회귀 분석을 한다

import statsmodels.api as sm
from statmodels.formula api import ols

model=ols("y ~ x + col1 +col2", data=df).fit()
model.summary()

P<|t| : summary를 통해 p-value를 확인할 수 있다. 귀무가설이 참이라고 가정했을 때(x값들과 y가 상관관계가 없다는 가정을 했을 때) 관측값이 나올 수 있는 확률. 0.05보다 작다면 귀무가설을 기각하게 된다. 

# p-value값이 0이 나오는 x값을 이용해본다.
model=ols("y ~ x", data=df).fit()

R-squared, Adj.R-squared : x를 많이 쓰면 패널티가 들어간다. 상관관계가 있는 x하나만 사용하면 값이 더 높아질 수 있다.

 

잔차(residual) 분석

residual plot = y - y_hat = actual_value - fitted_value

  • 아래처럼 예측값과 실제값을 x와 y값으로 시각화하고, 그 결과 그래프에서 어떻게 분포하는지 확인하며 분석할 수 있다.
x = model.fittedvalues
y = model.resid
fig, ax = plt.subplots(figsize=(10,7))
ax.scatter(x, y)
ax.axhline(y=0, color="black", linestyle="solid")
ax.set(xlabel="fitted Value", ylabel="Residual")
plt.show()
  • 음수와 양수에 비슷하게 - 데이터가 균일하게 분포되어 있으면 회귀분석의 조건 중 등분산성과 선형성을 만족한다고 할 수 있다.

 

정규성 가정을 확인하기 위한 시각화

  • residual들이 정규분포임으로 가정하고 - 그려둔 선에 가깝게 위치하면 -> 정규성 가정이 만족된다.
residuals = model.resid
pplot = sm.ProbPlot(residuals)
fig = pplot.pplot(line="45")
plt.show()

 

numpy

  • pandas : 데이터를 database table과 비슷하게 dataframe으로 사용할 수 있게하는 라이브러리
  • Numpy : 데이터를 행렬, 벡터로 배열에 담아 사용할 수 있는 라이브러리
  • 선형대수 linear algebra 연산이 가능하다

transpose

x.transpose()
# 행과 열을 바꿔준다

matmul 행렬의 곱

np.matmul(arr1, arr2)

 

앞서 사용했던 ols를 실제 Numpy만 가지고도 만들 수 있다.

X_t = X.transpose()
X_t_X = np.matmul(X_t, X)
X_t_X_inv = np.linalg.inv(X_t_x)
X_t_X_inv_X_t = np.matmul(X_t_x_inv, X_t)
coef = np.matmul(X_t_X_inv_X_t, y)

여기서 coef를 출력해보면 ols를 사용해서 출력한 coef의 값과 같은 것을 확인할 수 있다.

그리고, np.mean, np.var는 

np.mean(X, axis=0)
np.var(X, axis=0)
# 각 열에 대한 평균과 분산값이 나온다. axis=0으로 했으므로.

# 인덱스값을 이용해서도 가능하다
np.mean(X[:,1])

 

broadcasting

  • shape가 다른 두 numpy array에 이항연산 binary operation 이 필요할 때 특정 규칙을 적용해줘서 연산이 가능하도록 해준다.
  • 예를 들어 np.array( ... ) + 1 에서 1은 shape가 다르지만 앞선 np.array( ... )와 shape가 같은 배열로 만들어서 연산이 되도록 해주는 것이다.

centering이란? X의 각 원소에서 열의 평균값만큼 차감하는 것

X_centering = X - X.mean

표준화(standardization)

np.std(X, axis=0) # 표준편차. 이것을 이용해서 표준화한다.

(X - X.mean) / np.std(X, axis=0) # 표준화하는 공식이다.
X_centering / np.std(X, axis=0)

 

728x90