기본 콘텐츠로 건너뛰기

9월, 2024의 게시물 표시

[data analysis] 특징(변수) 선택

[data analysis] 특징(변수) 선택

특징 선택(Feature selection) 특징(변수)선택은 추정에 기여하는 정도의 순서로 변수들을 자동으로 선택하는 과정입니다. 특징이 적을수록 회귀분석과 기계 학습 알고리즘을 더 효율적(공간 또는 시간 복잡성 감소)으로 실행할 수 있습니다. 일부 모델이나 기계 학습 알고리즘은 관련 없는 특징으로 인해 오도되어 예측 성능이 저하될 수 있습니다. 특징선택의 다음의 장점들에 의해 모델을 개선할 것입니다. 과적합 감소: 중복 데이터가 적다는 것은 노이즈를 기반으로 결정을 내릴 기회가 적다는 것을 의미합니다. 그러므로 모델의 일반화 가능성을 개선할 수 있습니다. 정확도 향상: 영향이 적은 데이터의 감소로 추정결과와 실제값 사이의 오차범위의 감소가 일어날 수 있으며 이러한 결과는 모델링 정확도의 향상을 가져옵니다. 훈련 시간 감소: 데이터가 적을수록 알고리즘이 더 빠르게 훈련됩니다. 변수 즉, 특징 선택을 위해 sklean 패키지 는 다양한 알고리즘을 위한 클래스를 제공합니다. 분산에 의한 선택 일변량 선택(Univariate Selection) 재귀적 특징 제거(Recursive Feature Elimination, RFE) Information value

[data analysis] 설명변수 선택의 기준

설명변수 선택의 기준 결정계수와 수정결정계수 잔차평균제곱합(MSE) Mallow’s Cp 통계량 AIC와 BIC 최소자승법(OLS)에 의한 모형의 구축에는 충족되어야 하는 기본 조건들이 있습니다. 그 기본 가정들 중 하나인 설명변수의 독립성은 대부분의 현실 자료에서 충족시키기는 어렵습니다. 일반적으로 회귀모델은 반응변수에 영향을 주는 요인들을 설명변수로 하기 때문에 그들 사이에 어느 정도 상관성이 존재할 것입니다. 그러나 설명변수의 수 증가와 그들 사이의 높은 상관성은 모형 구축에 사용되는 데이터들에 대한 충실도가 증가하여 각 변수의 새로운 값들에 대한 추정의 정확도를 감소시키는 부작용을 발생시킬 수 있습니다. 이러한 현상을 과적합(over fitting) 이라 합니다. 이 문제는 다중 공선성(multicollinearity) 의 핵심적인 결과로서 추정의 신뢰성을 저하시킬 수 있습니다. 그러므로 반응변수 추정에 영향력을 가진 설명변수들을 적절하게 선택하는 것이 모형 생성에 중요한 부분이 됩니다. 결정계수와 수정결정계수 식 1에서 나타낸 것과 같이 결정계수 R 2 는 모형으로 추정된 값들에 내재하는 총 변동에 대한 회귀계수에 의한 변동의 비율을 나타냅니다( 회귀모형의 평가 참조 ). 즉, 회귀계수에 의한 변동이 증가한다면 추정값에 대한 회귀계수의 영향이 증가하는 것으로 모형의 신뢰성이 증가한다는 것을 의미합니다. 그러나 결정계수는 설명변수의 수에 비례하는 경향을 보입니다. 이러한 결정계수의 변화는 모델에 영향력이 큰 변수의 첨가 이후에는 안정한 상태로 유지됩니다. 그 부분이 변수를 선택하는 결정기준이 됩니다. \begin{align}R^2&= \frac{\text{SSReg}}{\text{SST}}\\ & = \frac{\text{SST}-\text{SSE}}{\text{SST}}\\& = 1- \frac{\text{SSE}}{\text{SST}}\\& =1-\frac{\sum^n_{i=1}

[data analysis] 설명변수의 거듭제곱의 영향

설명변수의 거듭제곱의 영향 다음은 특정기간의 kospi 자료로 Open을 설명변수로 Close를 반응변수로 회귀모델을 생성한 것입니다. import numpy as np import pandas as pd from sklearn import preprocessing from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error import yfinance as yf import matplotlib.pyplot as plt st=pd.Timestamp(2024,1, 10) et=pd.Timestamp(2024, 5, 30) kos=yf.download("^KS11",st, et)[["Open","Close"]] kos.head(3) Open Close Date 2024-01-10 2563.969971 2541.979980 2024-01-11 2543.030029 2540.270020 2024-01-12 2536.550049 2525.050049 위 자료의 설명변수를 표준화하고 sklearn.linear_model.LinearRegression() 클래스를 적용하여 회귀모델을 생성합니다. ind=kos.iloc[:-1, [0]] de=kos.iloc[1:, 1] scale=preprocessing.StandardScaler().fit(ind) indN=scale.transform(ind) indN[:3] array([[-0.99893096], [-1.24235095],

[data analysis] 다중 회귀모형의 진단

다중 회귀모형의 진단 내용 정규성(normality) 과 이상치(outlier) 평가 독립성 선형성과 자기상관 등분산성 단순회귀모형과 같이 회귀분석은 몇 가지 가정 을 전제한 상태에서 모형을 구축합니다. 그러므로 그 가정의 충족되지 않은 자료들에서 생성된 모형의 경우 적용과 적합성에 문제가 발생됩니다. 예를 들어 데이터가 정규분포를 따르지 않는 상태에서 구축된 회귀모형의 예측 범위는 매우 넓어질 수 있으므로 그 자체의 의미가 감소됩니다. 또한 변수들의 독립성에 문제가 있는 경우 반응변수에 대한 설명변수들의 선택에서 발생하는 오류는 실제와 다른 결과를 가져올 수 있습니다. 이 원인들은 모두 회귀모형의 신뢰도를 악화시키며 예측정도를 빈약하게 만들 수 있습니다. 정규성(normality) 과 이상치(outlier) 평가 예 1) 다음 코드에 의해 생성된 자료 코스피지수(kos), 코스탁지수(kq), kodex 레버리지(kl), kodex 인버스(ki), 그리고 원달러환율(WonDol)의 일일 종가들을 설명변수로 사용하여 삼성전자(sam)의 일일 종가를 추정하는 회귀모델을 구축해 봅니다. (이 자료에서 설명변수는 반응변수보다 1일 앞선 데이터 입니다.) import numpy as np import pandas as pd import yfinance as yf st=pd.Timestamp(2023,1, 10) et=pd.Timestamp(2024, 5, 30) code=["^KS11", "^KQ11", "122630.KS", "114800.KS","KRW=X","005930.KS"] nme=["kos","kq","kl", "ki", "WonDol","sam" ] da={} for i, j in zip(nme,c

[Linear Algebra] 변환(Transform): 핵 그리고 치역(Kernel and Range)

핵과 치역(Kernel and Range) 변환은 어떤 수 x를 식에 대입하여 그 값에 대응하는 결과인 y를 반환하는 함수를 의미합니다. 다시 말하면 어떤 값들에 함수를 적용하여 변환된 결과가 생성되는 과정을 변환(transforamtion) 이라 합니다. 이 과정에서 함수를 기준으로 입력된 데이터의 범위를 정의역(domain) 이라하며 이에 대응하는 가능한 모든 결과물들의 범위를 공역(codomain) 이라고 합니다. 예로서 python에서 함수 int() 는 실수를 정수로 만들기 위해 사용합니다. 이 경우 정의역은 실수이지만 공역(codomain)은 정수가 될것입니다. x=3.24 y=int(x) y 3 공역 중 함수의 결과를 상(image) 이라 하며 이 상들의 집합을 치역(range) 이라고 합니다. 치역(range)은 공역의 부분집합이 됩니다. 식 1의 선형결합은 표준행렬에 의해 변수벡터의 변환된 결과를 나타내는 것으로 위에서 소개한 변환과정으로 나타낼 수 있습니다. 즉, 변수벡터와 결과는 각각 정의역과 치역이 되며 이들의 매개가 되는 표준행렬은 함수로 간주할 수 있습니다. \begin{align}\begin{bmatrix}-2& -1\\0& 4 \end{bmatrix}\begin{bmatrix}3\\1\end{bmatrix}&=\begin{bmatrix}-7\\-4\end{bmatrix}\\ F(\text{정의역})&=\text{상}\end{align} (식 1) 식 1의 표준행렬을 함수 F()로 표시하였습니다. 일반적으로 위와 같은 결합에서 함수는 Transform의 접두어를 적용하여 T()로 나타냅니다. 그림 1은 정의역, 공역, 그리고 치역을 나타낸 것입니다. 그림 1. 정의역(domain), 공역(codomain), 그리고 치역(range). 함수에 의한 정의역과 공역의 대응은 그림 2와 같이 정의할 수 있습니다. 그림 2. 정의역과 공역의 대응방식. 변환의

[data analysis] Hat 행렬

Hat 행렬 관련된 내용 회귀모형에서 이상치(outlier) 파악 레버리지(Leverage) 스튜던트 잔차(rstudent) Cook's Distance(D) hat 행렬(H) 은 회귀모델을 적용하여 $\hat{y}$을 추정하는 과정에서 설명변수의 영향을 나타내기 위해 작성합니다. 식 1과 같이 최소제곱 방법에 의한 회귀계수를 적용한 추정치의 추정 과정에서 설명변수만으로 구성된 부분을 hat 행렬(P)이라 합니다. \begin{align}\hat{y} & = Xb\\&=X(X^TX)^{-1}X^Ty\\& = Py\\ H&= X(X^TX)^{-1}X^T\\& = P\end{align} (식 1) 이상치는 그 데이터가 보이는 일반적인 경향을 따르지 않는 값(들)을 의미합니다. 회귀분석시 일반적으로 이상치는 반응변수 값의 측면에서 고려되지만 설명변수 측면에서 극단의 값(x값)을 가진다면 그 데이터 지점은 높은 레버리지(leverage) 를 가진다고 말합니다. 이 레버리지 즉, 각 샘플의 설명변수의 영향은 hat 행렬의 대각요소 의 값으로 나타낼 수 있습니다. hat 행렬은 이상치를 판단하기 위한 기본 값들로 이를 기준으로 여러 지표를 계산할 수 있습니다. statsmodel.api.OLS()에 의해 생성되는 모델의 get_influence() 메소드는 이상치 판단을 위한 여러 지표들의 결과를 나타냅니다. 이 결과는 .summary_frame() 메소드로 확인할 수 있습니다. 기사 회귀모형에서 이상치(outlier) 파악 편에서 구축한 회귀모델 reg에 대해 이 메소드들을 실행하면 다음과 같습니다. import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt import FinanceDataReader

[data analysis] Cook's Distance(D)

Cook's Distance(D i ) 관련된 내용 회귀모형에서 이상치(outlier) 파악 Hat 행렬 레버리지(Leverage) 스튜던트 잔차(rstudent) 잔차들 중의 이상치는 잔차의 크기가 이상적으로 크거나 작은 경우에 해당되며 이는 레버리지와 잔차 자신의 크기가 모두 관계됩니다. 이 둘의 영향을 모두 반영하는 기준이 Cook’s distance(D) 이며 식1과 같이 정의 됩니다. \begin{align}D_i& = \frac{(y_i-\hat{y_{(i)}})^2}{(p+1)\text{MSE}}\cdot \frac{h_{ii}}{(1-h_{ii})^2}\\ & y_{(i)}:\; x_i\text{를 제외한 자료로부터 구현된 모델을 적용한 추정치}\\ & p:\;\text{설명변수의 수} \end{align} (식 1) 식 1에서 Cook’s distance(D)는 잔차(첫번째항)와 레버리지(두번째항)에 의해 결정됩니다. 즉, 각 샘플의 설명변수(X)와 반응변수(y) 모두를 고려합니다. 그러므로 D i 값이 크다면 추정값들 사이의 차이가 크다는 것으로 모델에 가하는 영향이 크다는 것을 의미하며 결정수준보다 크다면 왜곡된 모형을 생성할 가능성이 증가할 것입니다. 이 지표의 결정수준으로 다음을 사용합니다. D i > 0.5: i번째 데이터 포인트가 영향을 미칠 수 있으므로 추가 조사 필요 D i > 1: i번째 데이터 포인트가 영향을 미칠 가능성이 높음 Cook's distance를 해석하는 다른 방법은 측정값을 F(k+1, n-k-1) 분포와 연관시키고 해당 백분위수 값을 찾는 것입니다. 이 백분위수가 약 10% 또는 20% 미만이면 케이스가 적합치에 거의 영향을 미치지 않는 것입니다. 반면에 50%에 가깝거나 그 이상이면 해당하는 샘플(들)이 큰 영향을 미칩니다. 요소들의 평균값을 기준으로

[data analysis] 다중회귀모델의 생성

회귀모델 생성 1개 이상의 설명변수들과 1개의 반응변수를 가진 선형모델 역시 statsmodels.api.OLS() 클래스와 sklearn.linear_model() 클래스를 적용하여 구축할 수 있습니다. 이 모델의 구축과정과 평가방법은 단순회귀분석(Simple regression) 과 같습니다. 예 1) 코스피지수(kos), 코스탁지수(kq), kodex 레버리지(kl), kodex 인버스(ki), 그리고 원달러환율(WonDol)의 일일 종가들을 설명변수로 사용하여 삼성전자(sam)의 일일 종가를 추정하는 회귀모델을 구축해 봅니다. (이 자료에서 설명변수는 반응변수보다 1일 앞선 데이터 입니다.) kos kq kl ki WonDol sam Date 2023-01-10 2351.0 696.0 14440.0 4885.0 1239.0 60400.0 2023-01-11 2360.0 710.0 14525.0 4875.0 1240.0 60500.0 2023-01-12 2365.0 711.0 14580.0 4860.0 1242.0 60500.0 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 다음은 위 자료들을 호출하고 분석에 적합하게 조절하기 위한 코드들입니다. import numpy as np import pandas as p

[data analysis] 결측치 조정

내용 무한값 처리 결측치와 무한값 처리 기존 값 적용 where, mask 결측치와 무한값 처리 결측치 무한값 찾기에서 소개한 것과 같이 무한값과 결측치는 데이터 분석에 에러의 요인이 될 수 있습니다. 이들을 처리하는 방법을 알아봅니다. 무한값 처리 import math import numpy as np import pandas as pd np.random.seed(3) x=np.random.rand(4, 3) x[1,2]=float("inf") print(x) [[0.5507979 0.70814782 0.29090474] [0.51082761 0.89294695 inf] [0.12558531 0.20724288 0.0514672 ] [0.44080984 0.02987621 0.45683322]] 객체 x에서 무한값의 인덱스를 결정하기 위해 각 요소에 대한 무한값의 여부를 True/False로 반환하는 np.isinf() 와 조건에 부합하는 인덱스를 반환하는 np.where(조건) 함수를 사용할 수 있습니다. infId=np.where(np.isinf(x)) infId (array([1], dtype=int64), array([2], dtype=int64)) 위의 결과와 같이 행과 열의 인덱스를 별도로 반환 됩니다. x[infId] array([inf]) np.delete(x, index, axis=None) x: 객체 index: 제거할 행 또는 열 인덱스로 기준축에 따라 행 또는 열이 결정됩니다. axis: 기준 축 객체 x의 무한값의 인덱스는 [1, 2]입니다. 다음 코드는 0축 즉, 행축을 기준으로 1행을 제거하는 것입니다. print(np.delete(x, 1, 0)) [[0.5507979 0.70814782 0.29090474] [0.12558531 0.20724288

[Linear Algebra] 고유벡터(Eigenvector)와 고유값(Eigenvalue) 연습

고유벡터(Eigenvector)와 고유값(Eigenvalue) 연습 관련된 내용 고유벡터(Eigenvector)와 고유값(Eigenvalue) 예 1) 행렬 A의 특성 방정식과 고유값을 계산해봅니다. $$ \left[\begin{matrix}1 & 3 & -1.5\\9 & - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2}\end{matrix}\right]$$ 행렬 A의 고유값 r을 가정하여 표현한 특성방정식(det(A − λI))은 다음과 같습니다. 다음 코드의 sympy.rational() 함수를 분수를 표시하기 위해 적용한 것입니다. r=symbols('r', real=True) A=Matrix([[1, 3, -1.5],[9, -Rational("27/2"), 4.5],[7, -Rational("39/2"), Rational("15/2")]]) cheqM=A-r*eye(3) cheqM $\left[\begin{matrix}1 - r & 3 & -1.5\\9 & - r - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2} - r\end{matrix}\right]$ cheq=det(cheqM)#특성방정식 expand(cheq) -r 3 - 5r 2 +36.0r sol=solve(cheq, r) [sp.N(i, 3) for i in sol] [-9.00, 0, 4.00] numpy.linalg.eigvals() 함수를 사용하여 고유값을 확인해 봅니다. eigVal=la.eigvals(np.array(A, dtype=float)) print(np.around(eigVal, 3)) [-9. 4. -0.] 예 2) 행렬 A에 대해 벡터 v가 고유 벡터인지를 결

[Linear Algebra] 고유벡터(Eigenvector)와 고유값(Eigenvalue)

고유벡터(Eigenvector)와 고유값(Eigenvalue) 고유 벡터(eigenvector) 는 정방 행렬의 선형 변환이 일어난 후에도 방향이 변하지 않는 영벡터(zero vector)가 아닌 벡터들을 의미합니다. 즉, n차원 공간에서 임의의 벡터를 표현할 수 있는 기준이 되는 벡터인 기저(basis) 벡터 를 의미합니다. 그러므로 행렬 A의 고유벡터 v 사이에는 식 1의 관계가 성립합니다. Av = λv (식 1) (A − λ)v = 0 조건) λ ≠ 0 식 1에서 A는 가역행렬이고 λ는 스칼라로서 고유값(eigenvalue) 이라고 합니다. 예 1) 행렬 A와 두 벡터 u, v의 관계를 조사해 봅니다. $$A=\begin{bmatrix}3&-2\\1&0\end{bmatrix}, \quad u=\begin{bmatrix}-1\\1\end{bmatrix}, \quad v=\begin{bmatrix}2\\1\end{bmatrix}$$ 행렬 A와 미지의 벡터 x와 선형결합한 결과 벡터가 각각 u, v일 경우 선형독립인지를 결정합니다. 선형독립일 경우 A는 기저행렬이 됩니다. A=np.array([[3,-2],[1,0]]) u=np.array([-1,1]) v=np.array([2,1]) Au=np.c_[A, u] print(Au) [[ 3 -2 -1] [ 1 0 1]] Matrix(Au).rref() (Matrix([ [1, 0, 1], [0, 1, 2]]), (0, 1)) Av=np.c_[A, v] print(Av) [[ 3 -2 2] [ 1 0 1]] Matrix(Av).rref() (Matrix([ [1, 0, 1], [0, 1, 1/2]]), (0, 1)) 행렬 A와 벡터 u, v를 결합한 확대행렬 Au, Av의 기약행 사다리꼴 형태 (rref) 을 검사한 결과는 A의 모든 열이 피봇열이므로 행렬 A의 급수(Rank) 가 2임을 나타냅니다. 이 행렬의 급수는 numpy.

[python] 다형성(polymorphism)

다형성(polymorphism) 다형성은 한 형태가 다른 형태로 발생하는 조건을 의미합니다. 이 다형성은 프로그래밍에서 매우 중요한 개념으로 단일 유형의 연산자, 개체등을 다른 조건이나 시나리오에서 다른 형태로 사용하는 것을 의미합니다. 예를 들어 덧셈 연산자인 + 는 숫자형 뿐만 아니라 문자형에서도 사용될 수 있으며 각 사용처에 따라 그 용도 역시 차이가 납니다. 숫자 : 덧셈 문자 : 연결 x, y=2, 3 x+y 5 str1="pyhton" str2="polymorphism" str1+" "+str2 'pyhton polymorphism' 위와 같이 동일 대상의 사용의 차이를 다형성(polymorphism)이라고 합니다. 거의 모든 python 객체에서 사용되는 len() 함수는 대상의 길이를 반환합니다. 그러나 그 함수의 대상이 되는 인수가 문자열, 리스트, 사전에 따라 반환하는 결과에 차이를 나타냅니다. 11 y=[1, 2,"apple", "computer"] #리스트를 구성하는 원소 수를 반환 len(y) 4 z={"computer": 2, "apple":1} #사전 형식의 key:value의 pair의 수를 반환 len(z) 2 위와같이 다형성은 함수를 다양한 조건에서 사용할 수 있게 합니다. 이러한 용도는 클래스로 확대할 수 있습니다. class staff1: def __init__(self, name, age, grade): self.name=name self.age=age self.grade=grade def info(self): print(f"성명: {self.name}") print(f"나이: {self.age}") print(

[data analysis] yahoo finantical 자료 호출

yahoo finantial의 금융자료 호출 패키지 yfinance를 사용하여 야후금융에서 제공하는 다양한 자료를 호출할 수 있습니다. 다음은 이 패키지의 Ticker() 함수를 적용하여 필라델피아 반도체 지수인 ^sox의 정보를 입수합니다. import numpy as np import pandas as pd import yfinance as yf sox=yf.Ticker("^sox") sox_info=sox.info print(sox_info) {'maxAge': 86400, 'priceHint': 2, 'previousClose': 4742.42, 'open': 4698.784, 'dayLow': 4507.676, 'dayHigh': 4701.0874, 'regularMarketPreviousClose': 4742.42, 'regularMarketOpen': 4698.784, 'regularMarketDayLow': 4507.676, 'regularMarketDayHigh': 4701.0874, 'fiftyTwoWeekLow': 3151.0, 'fiftyTwoWeekHigh': 5931.83, 'fiftyDayAverage': 5177.1367, 'twoHundredDayAverage': 4747.4033, 'currency': 'USD', 'exchange': 'NIM', 'quoteType': 'INDEX', 'symbol': '^SOX', 'underlyingSymbol': '^SOX', 'shortName': 'PHLX Semiconductor', 

[python] 클래스의 상속(Inheritance)

상속(Inheritance) 상속 은 기존의 클래스를 재이용하기 위해 현재 클래스내에 그 객체(클래스)를 호출하여 적용하는 것입니다. 식 1에 나타낸 것과 같이 클래스1은 클래스2의 속성과 메소드들을 사용할 수 있습니다. class 클래스1(클래스2): 내 용 (식 1) 식 1의 클래스2는 상속의 대상되는 클래스로 부모 클래스, 수퍼 클래스, 또는 기본 클래스(parent, super, or base class) 라고 하며 클래스1은 클래스2를 사용하는 주체로 자식클래스, 파생클래스, 또는 하위 클래스(child, derived, or subclass) 라고 합니다. 자식 클래스는 부모 클래스의 속성이나 메서드를 사용할 수 있습니다. 또한 자식클래스는 클래스2의 속성이나 메서드를 수정하여 사용할 수 있습니다. 이와 같이 상속받는 객체를 수정하여 다시 정의하는 것을 재정의(overriding) 라고 합니다. 다음 클래스 Book 은 속성으로 책 제목과 종류를 받아 그 제목을 출력하는 메서드를 가지고 있습니다. class Book: tax=0.05 def __init__(self, title, kind, price): self.title=title self.kind=kind self.price=price def Intro(self): print(f'이책의 제목은 "{self.title}" 입니다.') def Price(self): return self.price+self.price*Book.tax py=Book('Python', 'IT', 27000) py.Intro() 이책의 제목은 "Python" 입니다. py.Price() 28350.0 다음은 소설에 대한 클래스( Fiction )로서 클래스 Book 을 상속받는 자식 클래스입니다. 그러므