기본 콘텐츠로 건너뛰기

8월, 2024의 게시물 표시

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

[Linear Algebra] 대칭행렬(Symmetric matrix)

대칭행렬(Symmetric matrix) 식 1와 같이 행렬의 대각 요소들을 기준으로 양쪽의 요소가 동일한 정방 행렬을 의미합니다. \begin{bmatrix}{\color{red}a_{11}} & b & c\\ b & {\color{red}a_{22}} & d\\c & d & {\color{red}a_{33}}\end{bmatrix} (식 1) 대칭 행렬은 다음 코드와 같이 삼각 행렬과 그 전치행렬과의 합으로 생성할 수 있습니다. np.random.seed(4) x=np.random.randint(-10, 10, (3,3)) y=np.random.randint(-10, 10, (3,3)) A=np.triu(x)+np.triu(x).T print(A) [[ 8 -5 -9] [-5 -4 8] [-9 8 6]] B=np.tril(y)+np.tril(y).T print(B) [[ -4 2 -7] [ 2 -8 -10] [ -7 -10 -2]] 대칭행렬의 특성 대칭 행렬 A, B과 스칼라 k 사이에 다음의 관계가 성립합니다. A = A T , 즉, 대칭 행렬과 그 행렬의 전치 행렬은 같습니다. 두 대칭행렬 A ± B는 대칭 행렬입니다. 대칭행렬의 스칼라 곱 역시 대칭 행렬입니다. (AB) T = B T A T print(A==A.T) [[ True True True] [ True True True] [ True True True]] print(A+B) [[ 4 -3 -16] [ -3 -12 -2] [-16 -2 4]] print(3*A) [[ 24 -15 -27] [-15 -12 24] [-27 24 18]] 일반적으로 대칭 행렬인 A와 B의 곱은 대칭 행렬이 되지 않습니다. 그러나 두 대칭 행렬의 곱의 교환 법칙이 성립하는 경우 즉, AB = BA인 경우 다음 식이 성립하며 그 곱 역시 대칭행렬이 됩니다(

[Linear Algebra] 삼각 행렬(Triangular matrix)

삼각 행렬(Triangular matrix) 식 1과 같이 삼각 행렬은 대각요소를 기준으로 그 요소들을 포함하여 윗 부분 또는 아래 부분의 요소들이 0이 아닌 값으로 구성된 행렬입니다. 0이 아닌 값들이 아랫 부분을 구성하는 경우는 하삼각 행렬(lower triangular matrix), 반대의 경우는 상삼각 행렬(upper triangular matrix)이 됩니다. \begin{align}\text{하삼각행렬}:\; \begin{bmatrix}{\color{red}a_{11}} & 0 & 0\\ a_{21} & {\color{red}a_{22}} & 0\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\\ \text{상삼각행렬}:\; \begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\0& {\color{red}a_{22}} & a_{23}\\0 & 0 & {\color{red}a_{33}}\end{bmatrix} \end{align} (식 1) 하삼각행렬(lower triangular matrix) 대각 요소들을 기준으로 그 위 부분이 모두 0인 행렬 np.tril(x, k=0) 함수 사용. 이 함수의 인수 x는 배열 객체이며 k는 행렬의 대각요소들의 위치를 지정합니다. k의 기본값 0은 인덱스[0,0]을 기준으로하는 대각요소들을 의미합니다. 상삼각 행렬(upper triangular matrix) 대각 요소들을 기준으로 그 아래 부분이 모두 0인 행렬. np.triu(x, k=0) 함수 사용. np.random.seed(2) x=np.random.randint(1, 10, 9).reshape((3,3)) print(x) [[9 9 7] [3 9 8] [3 2 6]] print(np.triu(x)) [[9 9 7] [0 9 8] [0

[Linear Algebra] 항등 행렬 (Identity Matrix) 과 대각행렬(Diagonal matix)

항등 행렬 (Identity Matrix) 과 대각행렬(Diagonal matix) 항등 행렬 (Identity Matrix) 대각행렬(Diagonal matix) 항등 행렬 (Identity Matrix) 항등 행렬은 정방 행렬 중 대각 원소가 모두 1이고 그 외 모든 원소들은 0인 행렬이며 I n 으로 나타냅니다. n은 행 또는 열의 수를 나타냅니다. 항등 행렬과의 행렬 곱은 그 행렬 자신이 됩니다(식 1). AI = A (식 1) I: 항등행렬 np.eye(n) 함수로 n×n 차원의 항등행렬을 생성할 수 있습니다. np.random.seed(1) A=np.random.randint(1,10, (3,3)) print(A) [[6 9 6] [1 1 2] [8 7 3]] I=np.eye(3) print(I) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] print(A@I) [[6. 9. 6.] [1. 1. 2.] [8. 7. 3.]] 대각행렬(Diagonal matix) 식 2와 같이 정방 행렬의 주 대각 요소들을 제외한 다른 요소들이 0인 행렬을 대각 행렬이라 합니다. 주 대각 요소를 포함하여 모든 요소가 0인 영행렬, 그리고 항등 행렬은 대표적인 대각 행렬입니다. $$\begin{bmatrix}{\color{red}a_{11}} & 0 & 0\\ 0 & {\color{red}a_{22}} & 0\\0 & 0 & {\color{red}a_{33}}\end{bmatrix}$$ (식 2) 대각 행렬은 np.diag() 함수를 사용하여 생성할 수 있습니다. print(np.diag([1,2,3])) [[1 0 0] [0 2 0] [0 0 3]]

[Linear Algebra] 정방 행렬 (Square matrix)과 트레이스(Trace)

정방 행렬 (Square matrix)과 트레이스(Trace) 내용 정방 행렬 (Square matrix) 트레이스(Trace) 정방 행렬 (Square matrix) 식 1의 행렬 A와 같이 열과 행의 갯수가 동일한 행렬을 정방 행렬 이라 하고 이 정방 행렬의 전치 행렬($A^T$)은 식 1과 같이 주 대각(main diagonal) 외 요소들의 대칭적 교환으로 이루어집니다. $$A=\begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\ a_{21} & {\color{red}a_{22}} & a_{23}\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\;\Rightarrow\; A^T= \begin{bmatrix}{\color{red}a_{11}} & a_{21} & a_{31}\\ a_{12} & {\color{red}a_{22}} & a_{32}\\a_{13} & a_{23} & {\color{red}a_{33}}\end{bmatrix}$$ (식 1) 위 식의 붉은 색이 주 대각 요소들입니다. A=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(A) [[1 2 3] [4 5 6] [7 8 9]] print(A.T) [[1 4 7] [2 5 8] [3 6 9]] 트레이스(Trace) 정방 행렬에서 대각 요소들의 합을 그 행렬의 트레이스라고 하며 tr(A) 라고 나타냅니다(식 2). $$A=\begin{bmatrix}{\color{red}a_{11}} & a_{12} & a_{13}\\ a_{21} & {\color{red}a_{22}} & a_{23}\\a_{31} & a_{32} & {\color{red}a_{33}}\end{bmatrix}\;\Rightarro

[Linear Algebra] 전치행렬(Transposed matrix)

전치 행렬(Transposed matrix) m×n 형태의 행렬 A의 행과 열을 교환한 행렬을 A의 전치 행렬이라 하며 A T 로 나타냅니다. 그 전치 행렬의 형태는 n×m 입니다. 행렬 A와 전치 행렬 사이에 식 1의 관계가 성립합니다. A i,j = A T j,i (식 1) 전치 행렬은 numpy array 객체의 속성 .T 또는 함수 transpose() 를 사용하여 생성할 수 있습니다. A=np.array([[2, 4, 9], [3, 6, 7]]) print(A) [[2 4 9] [3 6 7]] print(np.transpose(A)) [[2 3] [4 6] [9 7]] print(A.T) [[2 3] [4 6] [9 7]] 식 2와 같이 전치 행렬을 다시 전치시키면 원시행렬(original matrix)이 됩니다. (A T ) T = A (식 2) print(A.T.T==A) [[ True True True] [ True True True]] 두 행렬의 행렬곱의 전치 행렬은 식 3과 같이 계산됩니다. (A·B) T = B T ·A T (식 3) 다음 코드에서 임의의 행렬 객체를 생성하기 위해 numpy.random 모듈의 randint() 함수를 사용하였습니다. 생성된 랜덤수의 재현성을 위해 numpy.random.seed() 함수를 사용하였습니다. np.random.seed(0) B=np.random.randint(-10, 10, (3,3)) print(B) [[ 2 5 -10] [ -7 -7 -3] [ -1 9 8]] # A·B AB=A@B # BT·AT BtAt=np.dot(B.T, A.T) print(np.equal(AB.T, BtAt)) [[ True True] [ True True] [ True True]]

[linear algebra] 벡터와 행렬(vector & Matrix)

벡터와 행렬(vector & Matrix) 벡터(vector) 행렬(Matrix) 파이썬에서 벡터, 행렬 등은 numpy.array() 함수를 사용하여 생성합니다. 또한 각 객체는 차원(dimension) 을 갖습니다. 벡터(vector) A = (3,1), B = (2,3)는 두 개 축 위에 표시되는 좌표(점)로 나타낼 수 있습니다. 각 점은 어떤 기준에 대한 크기만을 가집니다. 예를 들어 원점 O(0,0)를 기준으로 A 또는 B의 거리는 식 1과 같이 계산할 수 있습니다. \begin{align}\Vert \overline{OA}\Vert &=\sqrt{(3-0)^2+(1-0)^2}=\sqrt{10}\\ \Vert \overline{OB}\Vert &=\sqrt{(2-0)^2+(3-0)^2}=\sqrt{13}\end{align} (식 1) 식 1의 $\overline{OA}$는 점 O와 점 A 사이의 거리를 계산한 것입니다. 이 거리를 점 O를 시작하여 A 까지의 거리로 표현한다면 이동 방향이 고려된 것입니다. 이와 같이 거리 즉, 이동 크기에 방향을 함께 고려한 량을 벡터(Vector) 라고 하고 식 2와 같이 화살표를 첨가하여 나타냅니다. 일반적으로 출발점이 원점(O)인 경우 출발점을 생략하며 벡터 표시인 화살표 없이 단순히 알파벳 소문자로 표시합니다. 벡터의 관점에서 보면 식 1은 벡터 a와 벡터 b의 길이(크기)를 계산한 것으로 놈(Norm) 이라고 합니다. 벡터는 행과 열을 구분할 수 없습니다. 일반적으로 식 2와 같이 한 행으로 표시하지만 많은 경우 세로로 정렬됨을 의미 합니다. 이러한 표시를 열벡터 라고 하지만 실제로는 행과 열로 구성된 행렬입니다. 또한 행렬(Matrix) 의 경우는 대문자 알파벳으로 나타내며 벡터, 행렬을 구성하는 각각의 수를 요소(element)라고 합니다. \begin{align}&\overrightarrow{oa}=\vec{a}=\begin{bmatr

[Linear Algebra] 외적(Outer product)

외적(Outer product) 3차원 공간에서 임의의 두 벡터들과 수직인 벡터는 외적(outer product, cross product) 에 의해 산출됩니다. 3차원의 두 벡터 a, b의 외적은 식 1와 같이 산출합니다. 두 벡터의 외적은 " × " 기호로 나타냅니다. a = [a 1   a 2   a 3 ] b = [b 1   b 2   b 3 ] (식 1) a×b = [a 2 b 3 − a 3 b 2   a 3 b 1 − a 1 b 3   a 1 b 2 − a 2 b 1 ] 식 1과 같이 벡터들의 외적은 벡터입니다. 이 식의 계산은 식 2와 같이 소행렬식과 여인수 를 사용하여 계산할 수 있습니다. \begin{align}\begin{bmatrix}a_1& a_2& a_3\\ b_1& b_2& b_3\end{bmatrix}&=\begin{bmatrix} \begin{vmatrix} a_2& a_3\\ b_2& b_3\end{vmatrix} & \begin{vmatrix}a_3& a_1\\ b_3& b_1 \end{vmatrix} & \begin{vmatrix} a_1& a_2\\ b_1& b_2\end{vmatrix}\end{bmatrix}\\&=\begin{bmatrix} a_2b_3-a_3b_2& a_3b_1-a_1b_3& a_1b_2-a_2b_1 \end{bmatrix}\end{align} (식 2) 벡터의 외적은 numpy.cross() 함수를 사용하여 계산합니다. 예 1) 두 벡터 a, b의 외적을 계산합니다. a = [2  1  -1]  b = [-3  4  1] a=np.array([2,1, -1]) b=np.array([-3, 4, 1]) print(np.cross(a, b)) [ 5 1 11] 위 결과 벡터는 그림 1에서 나타낸 것과 같이 벡터 a, b에

[Linear Algebra]직교벡터(Orthogonal vectors)

직교벡터(Orthogonal vectors) 식 1에 의하면 두 벡터의 사잇각이 직각일 경우 정사영 의 노름(norm)은 0이 됩니다. 즉, 내적은 0으로 식 2와 같이 나타낼 수 있습니다. \begin{align}u\cdot v & = \Vert{u}\Vert \Vert{v}\Vert \cos(\theta)\\ \cos(\theta) &= \frac{u\cdot v}{\Vert{u}\Vert \Vert{v}\Vert}\end{align} (식 1) \begin{align}x·y &= \Vert{x}\Vert \Vert{y}\Vert \cos(90°)\\ &= 0\end{align} (식 2) 식 2가 성립하는 두 벡터들은 서로 직교벡터(Orthogonal vectors) 이며 직교성(orthogonality )을 가진다고 합니다. 그림 1에서 벡터 u 와 v , 그리고 벡터 u 와 -v 는 모두 직각관계를 나타냅니다. 그림 1. 직교벡터 fig, ax=plt.subplots(figsize=(2,2)) ax.arrow(0,0, 1,0,color="r", lw=2, head_width=0.05) ax.arrow(0,0, -1,0, color="b", lw=2, head_width=0.05) ax.arrow(0,0, 0, 1, color="g", lw=2, head_width=0.05) ax.arrow(-1, 0, 1, 1, ls="-.", color="b",alpha=0.3) ax.arrow(1, 0, -1, 1, ls="-.", color="r",alpha=0.3) ax.spines['left'].set_position(("data", 0)) ax.spines['bottom'].set_position(("data&q

[Linear Algebra] 내적(inner product)

내적(Inner product) a, b 두 벡터의 내적(inner product, dot product) 은 식 1과 같이 정의합니다. \begin{align}a&=\begin{bmatrix} a_1\\a_2\end{bmatrix}\; b=\begin{bmatrix} b_1\\b_2\end{bmatrix}\\ a\cdot b& = a_1\times b_1 + a_2\times b_2\end{align} (식 1) 식 1의 결과와 같이 두 벡터의 내적은 스칼라입니다. 같은 인덱스를 가진 성분들사이의 곱들의 총합으로 식 2와 같이 나타낼 수 있습니다. 행렬은 두 개 이상의 벡터들로 구성된 객체로 두 행렬 사이에 내적을 계산할 수 있습니다. 행렬들 사이에 이루어지는 내적을 행렬곱(matrix product) 라고 하지만 구분없이 닷곱, 내적곱이라고 명명합니다. \begin{align}\text{dot prodcut}:&\;\begin{bmatrix} a_1& a_2\end{bmatrix}\begin{bmatrix} b_1\\b_2\end{bmatrix}= a_1 b_1 + a_2 b_2\\\text{matrix product}:&\; \begin{bmatrix} a_{11}& a_{12}\\a_{21}& a_{22}\end{bmatrix}\begin{bmatrix} b_{11}& b_{12}\\b_{21}& b_{22}\end{bmatrix}=\begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22} \\a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}\end{align} (식 2) 식 2의 두 행렬의 내적 연산은 앞 객체의 행과 뒤 객체의 열의 사이에서 연산이 이루어집니다. 행렬의 행

[Linear Algebra] 코시-슈바르츠와 삼각부등식

코시-슈바르츠와 삼각부등식 코시-슈바르츠 부등식(Cauchy-Schwarz Inequality) 삼각 부등식(triangle inequality) 코시-슈바르츠 부등식(Cauchy-Schwarz Inequality) 임의의 두 벡터 a와 b의 곱의 크기는 각 벡터의 노름(norm)의 곱보다 크지 않습니다. 이 관계를 코시-슈바르츠 부등식(Cauchy-Schwarz Inequality) 이라 하며 식 1과 같이 나타낼 수 있습니다. $$\vert {a^Tb}\vert \le \Vert{a}\Vert \Vert{b}\Vert$$ (식 1) 식 1을 벡터의 요소별로 풀어 쓰면 식 2와 같습니다. $$\vert {a_1b_1+\cdots + a_nb_n}\vert \le \sqrt{a_1^2+\cdots+a_n^2}\sqrt{b_1^2+\cdots+b_n^2}$$ (식 2) 식 2에서 두 벡터가 a, b 모두 0일 경우에만 등호가 성립합니다. 그러므로 두 벡터 모두 0이 아닌 조건에서 코시-슈바르츠 부등식을 증명할 수 있습니다(식 3). \begin{align} \text{가정}:&\;a\ne 0, \; b\ne 0, \;\alpha=\Vert {a} \Vert,\; \beta=\Vert{b}\Vert \\ 0&\le \Vert {\beta a - \alpha a} \Vert^2\\ & = \Vert {\beta a} \Vert^2 - 2(\beta a)^T \alpha b +\Vert {\alpha b} \Vert^2\\ & = \beta^2\Vert { a} \Vert^2 - 2\alpha \beta (a^Tb) +\alpha^2\Vert { b} \Vert^2\\ & = \Vert { b} \Vert^2\Vert { a} \Vert^2 - 2\Vert {a} \Vert \Vert { b} \Vert (a^Tb) +\Vert { a} \Vert^2\Vert { b} \Vert

[data analysis] 분산분석 (Analysis of variance)의 개요

분산분석 (Analysis of variance)의 개요 관련된 내용 분산분석의 개요 일원분산분석(one-way ANOVA) 사후분석(Post-hoc test) 이원분산분석(two-way ANOVA) 두 개이상 여러 집단의 비교는 각 그룹의 분포를 비교하는 것과 같습니다. 분포의 비교는 평균이나 분산 등을 기준으로 평가할 수 있습니다. z 검정 또는 t 검정이 평균을 비교 대상으로 한 것과 같이 그 대상을 각 분포의 분산으로 지정할 수 있습니다. 이 경우 사용하는 방법론을 분산 분석(ANOVA) 이라고 합니다. 예를 들어 두 개 이상의 집단에서 각 집단내의 변동과 집단간 변동을 비교하여 모든 집단의 평균이 동일하다는 귀무가설을 검정하는 통계방법입니다. 두 개 집단의 가설검정을 위해 정규분포 또는 t 분포를 적용하였지만 그 이상의 집단을 비교하기 위해서는 집단 간의 변동성의 정도를 비교하는 F분포 를 사용합니다. 분산분석을 위한 자료는 비교 대상이 되는 명목변수인 요인변수 (factor, 설명변수) 와 각 요인에 따른 값들 즉, 반응변수(respond variable, 종속변수) 로 구성됩니다. 각 요인은 몇 개의 소집단으로 분류될 수 있으며 이 소집단의 요인들을 처리 (treatment, 요인수준) 라고 합니다. 요인 수준에 대응하는 반응변수가 한 개인 경우의 분석을 일원분산분석 (one-way anova) 라고 하며 여러 개인 경우를 다변량분산분석 (manova) 라고 합니다. 표 1은 한개의 요인에 따른 분리된 실험군에 대한 두 개의 처리효과를 포함합니다. 이 경우 각 처리에 대한 관측치 수는 같으므로 균형 설계(balanced design) 라고 하며 표본 크기가 설계의 셀 전체에서 같지 않으면 불균형 설계(unbalanced design) 라고 합니다. 표 1 그룹 간 일원 분산 분석 treatment(factor) group1 group2 s1 s6 s2 s7 s3 s8 s4 s9 s5 s10

[data analysis] Breusch-Pegan 검정

Breusch-Pegan 검정 Breusch-Pegan 검정은 회귀모델에서 발생하는 잔차의 이분산성을 검정합니다. 귀무가설과 대립가설은 다음과 같습니다. ( 회귀분석 에 대한 지식이 필요합니다. ) H0: 등분산입니다.(Homoscedasticity) H1: 이분산이 존재합니다.(Heteroscedasiticity) 이 방법은 다음 과정으로 실현됩니다. 회귀모델 생성 모델의 잔차 제곱을 계산 반응변수로서 잔차 제곱을 사용하여 새로운 회귀모델을 생성 nR 2 new 를 통계량으로 χ 2 검정 실시(자유도는 설명변수의 수) n: 데이터 크기, R 2 new : 잔차 제곱을 반응변수로 설정한 회귀모델의 결정계수 이 검정은 statsmodels.stats.diagnostic.het_breuschpagan(잔차, 설명변수) 함수를 사용합니다. 이 함수는 라그랑쥬 승수 통계량(Lagrange multiplier statistic)과 p-value, f-통계량과 p-value를 반환합니다. ( 회귀분석 참조 )

[data analysis] Levene Test

Levene Test 관련된 내용 Bartlett 검정 Fligner 검정 Levene Test Breusch-Pegan 검정 Levene 테스트는 k 샘플(그룹)들의 등분산성을 검정하기 위해 사용합니다. 일부 통계 테스트(예: 분산 분석)에서는 분산이 그룹 또는 샘플 간에 동일하다고 가정하며 회귀분석에서는 다양한 회귀모델들로 계산되는 오차 분포의 분산이 동일하다고 가정합니다. Levene 테스트를 사용하여 이러한 가정을 확인할 수 있습니다. Levene 검정은 Bartlett 검정의 대안으로 자료의 정규성이 불확실한 경우 선호됩니다. 그러나 데이터가 실제로 정규 분포 또는 거의 정규 분포에서 나왔다는 강력한 증거가 있다면 Bartlett의 검정이 더 나은 성능을 보입니다. Levene 검정의 귀무가설과 대립가설은 일반적으로 다음과 같이 기술할 수 있습니다. H0: σ 1 = σ 2 = … = σ k H1: 최소한 한 그룹의 분산이 다름 Levene 검정 통계량(W)은 식 1와 같이 정의됩니다. \begin{align} W&=\frac{N-k}{k-1}\frac{\sum^k_{i=1}n_i(Z_{i.}-Z_{..})^2}{\sum^k_{i=1}\sum^{n_i}_{j=1}(Z_{ij}-Z_{i.})^2}\\ Z_i & =\frac{1}{n_i}\sum^{n_i}_{j=1}Z_{ij}\\ Z_{..} & =\frac{1}{N}\sum^k_{i=1}\sum^{n_i}_{j=1}Z_{ij}\\ & k: \,\text{그룹의 수} \\ & n_i: \,\text{i번째 그룹에 속하는 샘플의 수} \\ & N: \,\text{총 샘플 수} \\ & Z_{ij}:\, \text{i번째 그룹의 j번째 관측값}\, y_{ij}\text{과}\, \hat{y_i}\text{의} L_1 \text{norm입니다.}\end{align} (식 1) Z ij 는 식 2와 같이 계

[pandas] pd.Timestamp

pd.Timestamp Timestamp는 한 시점을 나타내기 위해 사용됩니다. pd.Timestamp(x, unit, tz, year, month, day, hour) x를 timstamp로 전환 x: str, int 등의 자료형으로 날짜 또는 시간 unit: x의 단위로, 초 “s”, 일 “d”등 tz: 시간대 지정 x대신 year, month, day, hour를 각각 지정할 수 있슴, str 또는 int 등 x=pd.Timestamp(2019, 12, 25);x Timestamp('2019-12-25 00:00:00') type(x) pandas._libs.tslibs.timestamps.Timestamp pd.Timestamp(year=2019, month=1, day=2, tz="Asia/Seoul") Timestamp('2019-01-02 00:00:00+0900', tz='Asia/Seoul') pd.Timestamp(year=2019, month=1, day=2, tz="US/Pacific") Timestamp('2019-01-02 00:00:00-0800', tz='US/Pacific')

[pandas] pd.date_range

date_range pd.date_range() 함수를 사용하여 일정기간의 시계열을 생성할 수 있습니다. pd.date_range(start, end, periods, freq, normalize=False) start, end: 시작일, 마지막일 period: 작성할 날짜 수열의 크기 freq: 간격을 지정하는 것으로 다음 표에 제시한 지표를 사용 normalize: 시간 수열을 작성하기 전에 시작/끝을 midnight으로 표준화 Alias Description D 1일간격 B business day(월 ~금) 간격 W week의 첫날(일요일)의 날짜를 반환, 시작일이 주중에 있으면 다음 주의 첫날부터 반환 W-Mon week의 첫날(월요일)의 날짜를 반환 M 월 간격, 월의 마지막 일을 반환 MS 월 간격, 월의 첫 일을 반환 SM 15일 간격, 매월 15 마지막일 순으로 반환 BM 각 월의 평일중 마지막날 BMS 각 월의 평일중 첫날 WOM-2THU 각 달의 두번째 목요일 Q 1년을 분기로 구분하여 분기의 마지막일을 반환 A, Y 년 간격, 연당 마지막일을 반환 AS, YS 년 간격, 연당 시작일을 반환 BH business hour( 900~16:00) 간격 H 1시간 간격 T, min 분간격 S 초간격 pd.date_range("2024-01-06", periods=3, freq="H") DatetimeIndex(['2024-01-06 00:00:00', '2024-01-06 01:00:00', '2024-01-06 02:00:00'], dtype='datetime64[ns]', freq='H') pd.date_range(start="2024-01-06&qu

[pandas] pandas.to_datetime

DatetimeIndex 시계열 자료는 인덱스가 날짜 또는 시간인 데이터를 의미합니다. Pandas에서 시계열을 조정하기 위한 4개 개념과 그에 따른 클래스를 사용합니다. Class 설명 type 주요 메서드 DateTimes timezone를 가진 특정한 시간 DateTimeIndex to_datetime, pd.date_range Time delta 절대시간 TimedeltaIndex to_timedelta, timedelta_range Time span 시점과 연관된 주기를 가진 시간 간격 PeriodIndex Period, Period_range Date offset 달력 산술을 위한 상대시간기간 none DateOffset pandas에서 시계열 자료를 생성하기 위해서는 인덱스를 DateTimeIndex 자료형으로 만들어야 합니다. DateTimeindex는 특정한 순간에 기록된 타임스탬프( Timestamp ) 형식의 시계열 자료를 다루기 위한 인덱스입니다. 타임스탬프의 간격이 일정할 필요는 없습니다. DateTimeIndex 인덱스는 다음 함수를 사용합니다. pd.to_datetime(x, dayfirst=False, yearFirst=False, unit=None, origin='unix', utc=False) 날짜/시간을 나타내는 문자열을 자동으로 datetime 자료형으로 바꾼후 DateTimeIndex 자료형 인덱스를 생성합니다. x: integer, float, string, datetime, list, tuple, 1-d array, Series (날짜 데이터) dayfirst=True: 10/11/12 → 2012-11-10 yearfirst=True: 10/11/12 → 2010-11-12 unit: 시계열의 표시 단위(D, s, ms, um, ns)

[data analysis] Fligner 검정

Fligner 검정 관련된 내용 Bartlett 검정 Fligner 검정 Levene Test Breusch-Pegan 검정 데이터의 정규성을 파악할 수 없는 경우 비모수 방법인 Fligner 검정으로 등분산성을 검정할 수 있습니다. Fligner-Killeen 중앙값 검정은 정규성에서 벗어나는 자료들에 대해 분산의 동질성에 대한 검정입니다(Conover et al.(1981), [CON1]). 즉, 데이터의 순위를 이용하여 검정하는 것으로 검정통계량은 식 1과 같이 정의됩니다. \begin{align}FK &= \frac{\sum^k_{j=1} n_j(\bar{a_j}-\bar{a})}{s^2} \\& k: \,\text{비교할 그룹(변수)의 수} \\& \bar{a_j} : \,\text{j 그룹의 표준점수의 평균} \\& \bar{a}: \,\text{모든 표준점수의 평균} \\& s^2: \,\text{모든 표준점수의 분산} \end{align} (식 1) 식 1의 FK 검정통계량은 자유도 k-1의 χ 2 분포를 따릅니다. 즉, 표준정규분포에 부합하는 각 변수들의 제곱에 대한 분포를 따른다면 분산은 같습니다. 그러므로 이 분석의 귀무가설과 대립가설은 다음과 같습니다. 귀무가설(H0): 집단들의 분산이 같다. 대립가설(Ha): 최소한 두 집단간의 분산이 다르다. stats.fligner() 함수를 사용합니다. 예 1) 일정기간의 코스피지수, 코스탁지수, 다우존스지수, 원-달러 환율의 일일 종가의 변화율 자료들의 Fligner 등분산성 검정을 실시합니다. kos kq dj WonDol 1 0.016 0.008 0.006 0.002 2 -0.007 -0.004 0.014 -0.000 3 0.021 0.008 0.007 0.000 4 0.040 -0.001 0.002 0.006 5 -0.001 -0.01

[data analysis] Bartlett 검정

Bartlett 검정 관련된 내용 Bartlett 검정 Fligner 검정 Levene Test Breusch-Pegan 검정 Bartlett 검정은 집단(표본)간 분산에 대해 등분산성을 검정합니다. 이 검정은 두 집단 이상의 자료형식에서도 적용할 수 있으므로 t-검정 또는 일원분산분석 에 적용할 자료의 등분산성 가정을 위한 검정에 사용합니다. 이 검정은 정규분포에 부합하는 k개의 그룹에 대한 자유도 k-1인 카이자승(χ 2 ) 분포를 기반으로 합니다. 결정기준인 검정 통계량은 식 1과 같이 계산됩니다. χ 2 분포를 기반으로 하기 때문에 표본이 정규분포를 따르는 것을 전제조건으로 합니다. 만약 표본이 비정규 분포에서 추출된 표본의 경우 이 검정은 단순히 분포의 비정규성을 검정하는 것일 수 있습니다. \begin{align}T&=\frac{(N-k)\ln(s^2_p)-\sum^k_{i=1}(N_i-1)\ln(s^2_i)}{1+\frac{1}{3(k-1)}\left(\left(\sum^k_{i=1}\frac{1}{n_i-1}\right)-\frac{1}{N-k} \right)}\\& s^2_i:\, \text{i 레벨(그룹)의 분산}\\& N: \,\text{자료의 크기} \\& k: \,\text{레벨(집단)의 수} \\& s^2_p: \,\text{합동분산(pooled variance)} \end{align} (식 1) 합동표준편차(pooled standard deviation) 참조 $$s^2_p=\sum^k_{i=1} \frac{N_i-1}{N-k}s^2_i$$ (식 2) 검정의 가설은 다음과 같습니다. 귀무가설(H0): 집단들의 분산이 같다. 대립가설(Ha): 최소한 두 집단간의 분산이 다르다. Bartlett 검정은 scipy.stats.bartlett(smaples...) 함수를 사용할 수 있습니다. 이 함수는 통계량과 유의확률(p-value)를

[data analysis] Jarque-Bera Test

Jarque-Bera Test 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test 정규분포는 모수 μ, σ에 상관없이 분포의 형태적인 특성을 가집니다( 확률과 주요통계량: 왜도(skewness)와 첨도(kurtosis) 참조 ). 왜도(skewness, 3차 모멘트)는 pdf의 대칭정도를 나타내는 지표로 표준정규분포의 왜도는 0. 첨도(kuitosis, 4차 모멘트)는 평균 주위에 데이터의 밀집정도를 나타내는 것으로 표준정규분포의 첨도는 3. Jarque-Bera(JB) 검정은 왜도와 첨도를 사용하여 정규성을 추정합니다. 그러므로 왜도와 첨도에 민감한 시계열 데이터나 회귀모델로 생성되는 오차 분석에 주로 적용됩니다. 또한 이 검정은 기준이되는 분포와의 비교가 아니므로 표준화등의 조정이 없는 원시데이터를 직접 적용합니다. 이 검정의 귀무가설(H0)과 대립가설(H1)은 다음과 같습니다. H0: 정규분포를 따릅니다. H1: 정규분포를 따르지 않습니다. 이 검정의 검정통계량은 식 1과 같이 계산됩니다. \begin{align}\text{jb}&=n\left(\frac{S^2}{6}+\frac{(K-3)^2}{24} \right)\\ & S:\, \text{왜도},\; K:\, \text{첨도}\end{align} (식 1) 이 검정통계량은 자유도 2인 χ 2 분포를 따릅니다. 그러므로 이 분포에 적용하여 계산된 검정통계량에 대응하는 p-value를 결정할 수 있습니다. 정규분포의 경우 S=0, K=3 ⇒ JB 통계량은 0입니다. 이 검정은 statsmodels.stats.stattools.jarque_bera() 또는 scipy.stats.jarque_bera() 함수를 사용합니다. 첫번째 함수의 경우는 통계량과 p-value, 왜도와 첨도를 반환하지만 두번째 함수

[data analysis]Anderson-Darling(AD) 검정

Anderson-Darling(AD) 검정 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test KS 검정은 표본의 분포와 특정분포를 비교하여 표본의 분포를 결정하기 위해 실시합니다. Anderson-Darling(AD) 검정은 KS 검정을 수정한 것으로 꼬리 부분에 더 많은 가중치를 부여합니다. 또한 KS 검정의 검정량 D는 비교하는 두 분포의 거리차로 특정한 분포를 가정하지 않습니다. 반면이 AD 검정은 임계값을 계산할 떄 정규, 균일, 지수등의 특정분포를 사용합니다. 그러므로 민감한 검정이 가능합니다. 각 분포에 대한 임계값 D를 계산하는 것이 가능하지만 일반적으로 다양한 통계 프로그램에서 제공됩니다.이 검정은 scipy.stats.ansderson(x, dist="norm") 함수에 의한 결과로 판단할 수 있습니다. Anderson-Daring(AD) 검정의 귀무가설과 통계량을 식 1과 같습니다. H0: 데이터는 특정 분포를 따릅니다. (식 1) 검정 통계량 A 2 = -N − S $$S=\sum^N_{i=1}\frac{2i-1}{N}\left[\ln F(y_i) + \ln(1-F(y_{N+1-i})\right]$$ 식 1에서 F(y)는 특정분포의 누적분포 함수이고 y i 는 정렬된 데이터(ordered data)입니다. 예 1) 다음은 일정한 기간의 kospi 지수와 kosdaq 지수의 일일 종가 자료입니다. kospi kosdaq 0 2669.8 878.9 1 2607.3 871.6 2 2587.0 866.2

[data analysis]Kolmogorov-Smirnov Test

Kolmogorov-Smirnov Test 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test Kolmogorov-Smirnov 검정 (K-S test)은 표본이 특정 분포를 가진 모집단에서 추출되었는지 결정하는 데 사용됩니다. 즉, 자료의 분포가 특정한 분포와의 일치정도를 정량화하여 검정하는 방법입니다. 분석대상 자료의 분포를 알 수 없으므로 식 1에 의해 생성된 경험적 분포 함수 (Emperical distribution fucntion, ECDF) 와 특정분포를 비교합니다. $$ECDF =\frac{n(i)}{N}$$ (식 1) 식 1의 n(i)는 데이터를 오름차순으로 정렬한 경우의 각 요소의 위치이며 분모인 N은 전체 자료수입니다. 자료가 오름차순으로 정렬되면 각 값까지의 누적확률은 그것이 위치하는 순서에 의존됩니다. 예를 들어 총 20개의 데이터 중의 2번째의 값의 누적확률은 0.1(2/20)이 됩니다. 전체적으로 각 데이터마다 1/20씩 증가하는계단함수가 됩니다. 이것을 경험적 누적분포함수라고 하며 이 함수가 정규분포의 누적함수와의 일치 정도로 자료의 정규성을 검정합니다. 그림 1은 100개의 랜덤 샘플에 대한 경험적 누적분포함수와 정규누적분포함수를 작성한 것입니다. np.random.seed(3) N=100 da=np.sort(np.random.randn(N)) ecdf=[i/N for i in range(1, N+1)] nCdf=stats.norm.cdf(da) plt.figure(figsize=(4,2)) plt.plot(da, ecdf, color="blue", label="ECDF") plt.plot(da, nCdf, color="red", label="normCDF") plt.legend(loc=

[data analysis]shapiro-Wilk test

shapiro-Wilk test 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test 표본 x 1 , x 2 , …, x n 이 정규분포에 부합성 여부를 검정하기 위해 식 1과 같이 계산되는 shapiro-Wilk통계량인 W 를 사용하여 귀무가설(H0: 정규분포를 따릅니다.) 검정을 실시합니다. \begin{align}W&=\frac{\left(\sum^m_{i=1}a_ix_{(i)} \right)^2}{\sum^n_{i=1}(x_i-\bar{x})^2}\\x_{(i)}&=x_{n+1-i}-x_i\\ & n: \text{표본의 크기}\\ & m=\begin{cases}\frac{n}{2}&\text{for}\;n=\text{짝수}\\\frac{n-1}{2}&\text{for}\;n=\text{홀수} \end{cases}\end{align} (식 1) 식 1에서 a i 는 두 값 차이에 대한 가중치입니다. 그 가중치들은 정렬된 자료의 평균, 표준편차 등 통계량을 기준으로 산출된 상수로서 shapiro-Wilk table에서 결정할 수 있습니다. 식 1의 x (i) 를 나타내는 i는 [0, m] 사이의 정수값입니다. 즉 W값은 전체 퍼짐의 정도에서 각각의 작은값과 큰값의 차이의 비를 나타낸 값입니다. Shapiro-Wilk 검정의 W는 다음 과정으로 계산합니다. data 정렬 SS 계산 $SS=\sum^n_{i=1}(x_i-\bar{x})^2$ W의 분자인 b를 계산 $b=\sum^m_{i=1} a_i(x_{n+1-i}-x_i)$ 검정 통계량(W)계산 $W=\frac{b^2}{SS}$ shapiro-Wilk table를 기준으로 p-value를 산출 shapiro-Wilk table은 샘플수에 대한 가중치(a i )와 특정 유

[data analysis] Q-Q plot

Q-Q plot 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test Q-Q(사분위수) plot은 두 자료들을 분위수로 구분한 후 동일한 분위수 값들에 대해 작성한 도표로서 두 그룹의 분포를 비교하는 방법으로 역누적분포에 의해 설명됩니다. 역누적분포 (Inverse cumulative distribution) 는 누적분포의 역함수입니다. 예를 들어 표준정규분포의 누적분포와 역누적분포는 그림 1과 같이 나타낼 수 있습니다. 그림 1. 표준정규분포의 (a) pdf, cdf와 (b)역누적확률분포. x=np.linspace(-3, 3,1000) pdf=stats.norm.pdf(x) cdf=stats.norm.cdf(x) q=np.linspace(0, 1, 1000) ppf=stats.norm.ppf(q) plt.figure(figsize=(8, 5)) plt.subplots_adjust(wspace=0.3) plt.subplot(1,2,1) plt.plot(x, pdf, color="blue", label="PDF") plt.plot(x, cdf, color="red", label="CDF") plt.xlabel("x") plt.ylabel("probability") plt.legend(loc="best") plt.title("(a)", loc="left") plt.subplot(1,2,2) plt.plot(q, ppf, color="green", label="Inverse CDF") plt.xlabel("probaility(q)") plt.ylabel("I(q)") plt.leg

[data analysis]정규성검정(Normality Test)

정규성검정(Normality Test) 관련된 내용 Q-Q plot shapiro-Wilk test Kolmogorov-Smirnov Test Anderson-Darling 검정 Jarque-Bera test 중심극한정리 에 의해 자료의 샘플 수가 증가할수록 정규분포에 근접합니다. 특히 표본평균들의 분포인 표본분포는 정규분포에 부합합니다. 그러나 평균이 아닌 원시데이터(raw data)의 경우 정규분포에 부합여부가 중요한 경우가 있습니다. 예를 들어 회귀분석의 경우 관찰값과 회귀 모형에 의한 예측값들의 차이를 잔차(residuals) 라고 하는데 잔차가 정규분포에 부합한다는 가정하에 실시됩니다. 그 가정에 부합하는가의 여부가 성립된 모형의 적합도를 결정할 판단근거가 됩니다. 정규성 검정은 다음 방법을 사용합니다. Quantile-Quantile plot: 시각적 분석에 의한 결정 Shaprio-Wilks test: 표본수(n < 2000)인 경우에 주로 사용 Kolmogoroves-Smrinov test: n > 2000인 경우에 사용 Jarque-Bera Test

[data analysis] 정규분포(Normal Distribution)

정규분포(Normal (Gaussian) Distribution) 여러 현상들에 대해 큰 규모의 자료를 조사하면 그림 1과 같이 평균에서 가장 높은 확률을 보이며 그 평균을 중심으로 양쪽으로 같은 정도로 확률 감소를 보이는 종 모양의 형태를 보입니다. 이러한 분포를 정규분포(normal Distribution) 라고 합니다. 특히 큰 규모의 확률변수들에 대한 분포는 그 변수들의 조건에 상관없이 정규분포에 근접하기 때문에 데이터들의 여러 특성들을 연구하는데 중심이 되는 분포입니다. 그림 1. 정규분포에서 확률과 표준편차의 관계. x=np.linspace(-4, 4, 100) p=stats.norm.pdf(x) nme=[r"-2.56$\sigma$", r"-1.96$\sigma$", r"$\sigma$", r'$\mu$', r"$\sigma$", r"1.96$\sigma$", r"2.56$\sigma$"] x1=np.linspace(-1, 1, 100) x21=np.linspace(-1.96, -1, 100) x22=np.linspace(1, 1.96, 100) x31=np.linspace(-2.56, -1.96, 100 ) x32=np.linspace(1.96, 2.56, 100) fig, ax=plt.subplots(figsize=(9,3)) ax.plot(x, p, color="r") ax.fill_between(x1, stats.norm.pdf(x1), color="g", alpha=0.3, label="68%") ax.fill_between(x21, stats.norm.pdf(x21), color="b", alpha=0.3, label="95%") ax.fill_between(x22, stats.norm.pdf(x22), color