Numpy에는 배열 요소의 분산 계산해주는 np.var()가 준비되어 있다. 이 포스팅에서는 이 함수의 사용법과 주의법에 대해 설명하고자 한다.
또한, 동일한 기능을 하는 ndarray.var도 있는데 옵션이 완전히 동일하므로, np.var에 대해서 설명하도록 하겠다. 더욱이, np.nanvar이라는 함수가 있는데, 보통의 np.var의 경우 대상이 되는 배열에 결손값 nan이 포함되어 있는 경우, nan이 반환된다. 그러나 np.nanvar으로는 결손값 nan을 무시하고 그외의 배열 요소의 분산을 계산한다. 이 차이는 기억해두면 좋을 것이다.
기본 서식
np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>)
인수 | 데이터 형 | 해설 |
a | array_like | 여기에 전달된 요소의 분산을 계산한다. |
axis* | None or int or tuple or ints | 분산의 계산 대상이될 차원 축을 지정한다. 기본은 None로 모든 요소가 분산 대상이 된다. |
dtype* | dtype | 분산 데이터형을 지정하고 싶을 경우에 사용한다. 기본적으로는 배열 a의 요소가 int 형인 경우는 float 64, 배열a의 요소가 float형인 경우 동일한 데이터형으로 반환한다. |
out* | ndarray | 이 함수 출력 결과로, 기존 배열에 덮어쓰고 싶을 경우에 지정한다. 출력 결과와 덮어쓰기 대상 배열의 shape가 일치되어 있을 필요가 있다. |
ddof* | int | 델타의 자유도 |
keepdims* | bool | 이 옵션을 True를 하면, 분산 배열 차원수가 원래 배열 a와 동일하게 된다. |
반환값은 ndarray이다.
np.var을 통해 얻어지는 결과는 표본 분산이다. 통계학에서 일반적으로 자주 사용되는 불편 분산이 아니다. 불편 분산을 구하고 싶은 경우는 옵션 인수를 ddof=1을 지정할 필요가 있다.
구체적으로 말하자면, 기본적으로 ddof = 0으로 np.var이 계산하는 분산 값은 var = mean(abs(x – x.mean())**2)이 된다. 즉, 표본 분산이 된다. 여기서 평균(mean)은 x.sum()/len(x)로 계산된다. 반대로 ddof=1를 지정하면, 평균이 추정 통계에서 일반적으로 사용하는 x.sum()/(len(x)-1) 으로 계산된다.
반복되는 설명이지만, np.var은 기본적으로 표본 분산을 계산한다. 통계학에서는 일반적으로 불편 분산이 사용되고 이를 계산하도록 하기 위해서는 옵션 인수로 ddof=1를 지정할 필요가 있다.
샘플 코드
샘플 코드로 np.var의 사용법을 확인해보자.
1. 1차원 배열의 경우
import numpy as np
rng = np.random.default_rng()
a = rng.integers(35, 101, (5, ))
a
array([70, 53, 79, 58, 59])
이렇게 만든 배열을 np.var에 전달하면, 기본적으로 표본 분산 결과를 얻을 수 있다.
# 표본 분산
np.var(a)
88.56
앞서 말했지만, 일반적으로 추정 통계에 사용하는 불편 분산은 ddof=1로 지정해야한다.
2. 2차원 배열의 경우
2차원 배열의 경우도 살펴보자. 아래의 배열을 예로 살펴 볼 것이다.
# 2차원 배열
a = rng.integers(35, 101, (3, 5))
a
array([[56, 61, 40, 84, 47],
[42, 67, 75, 54, 54],
[92, 74, 64, 46, 55]])
기본적으로 다차원 배열의 경우 모든 요소가 계산 대상이 된다.
np.std(a, ddof=1)
15.308572139568765
옵션 인수 axis로 분산을 구할 차원 축을 지정하는 것이 가능하다.
# 1차원 축(가로축)
np.std(a, axis=-1, ddof=1)
array([16.83151805, 12.81795616, 17.78201338])
# 2차원축(세로축)
np.std(a, axis=0, ddof=1)
array([25.79405616, 6.5064071 , 17.89785834, 20.0333056 , 4.35889894])
옵션 인수 keepdims=Ture를 지정하면, 원래 차원 a와 동일한 차원수를 유지하게 된다. 이로 인해, 원래 차원 배열 a에 대해 캐스트하는 것도 가능한 형태가 된다.
# keepdims
np.std(a, axis=-1, keepdims=True, ddof=1)
array([[16.83151805],
[12.81795616],
[17.78201338]])
# keepdims
np.std(a, axis=0, keepdims=True, ddof=1)
array([[25.79405616, 6.5064071 , 17.89785834, 20.0333056 , 4.35889894]])
참고자료
'IT > 언어' 카테고리의 다른 글
[python] 오브젝트의 속성을 조작하는 delattr/getattr/hasattr/setattr (0) | 2022.01.13 |
---|---|
[python/OpenCV] cv2.Canny():Canny방법을 이용하여 물체의 외곽선(엣지) 추출하기 (2) | 2022.01.04 |
[python/Numpy] Numpy 요소 바꾸는 함수 (0) | 2021.11.28 |
[python] 문자열에서 특정(일부) 문자만 삭제하는 방법들 (0) | 2021.11.17 |
[python/OpenCV] OpenCV를 이용한 픽셀 논리연산 - AND, OR, XOR, NOT (0) | 2021.11.15 |