기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

결측치와 무한값찾기

내용

결측치와 무한값찾기

이터 처리 과정에서 누락된 값이나 계산과정에서 무한값을 얻게되는 경우가 있는데 이러한 값들은 이어진 계산과정에서 에러를 발생하는 경우가 많습니다. 그러므로 분석 전 또는 분석 동안 이들의 처리 과정이 중요하며 그 일환으로 먼저 그들의 인식과정을 먼저 살펴봅니다.

결측값과 무한값 생성

numpy의 속성값인 np.nan으로 결측치(nan(Not Any Number))를 인위적으로 생성할 수 있습니다.또한 무한값은 내장함수인 float()를 사용하여 생성할 수 있습니다.

import math
import numpy as np
import pandas as pd
x=np.random.rand(20)
x
array([0.44245459, 0.8178457 , 0.19687037, 0.54456459, 0.2971784 ,
       0.9188978 , 0.37880048, 0.10845443, 0.84552398, 0.73500799,
       0.8996776 , 0.38032666, 0.15925506, 0.70421241, 0.46348431,
       0.76245393, 0.25619259, 0.92892586, 0.11489276, 0.51422256])
# 특정한 요소들을 nan 또는 infinity로 치환
x[3]=np.nan #nan
x[9]=np.nan
x[7]=float('inf') #inifinity
x[16]=float('-inf') #-infintiy
np.around(x, 4)
array([0.4425, 0.8178, 0.1969,    nan, 0.2972, 0.9189, 0.3788,    inf,
       0.8455,    nan, 0.8997, 0.3803, 0.1593, 0.7042, 0.4635, 0.7625,
         -inf, 0.9289, 0.1149, 0.5142])

결측값과 무한값 결정

위의 자료에서 naninf, -inf를 결정합니다.

  • math.isfinite(값): 객체의 각 요소 단위로 NaN 또는 Infinity가 아닐 경우 True를 반환한다.
  • np.isfinite(array객체): 객체 또는 요소에 위의 math.isfinite와 같은 결과를 반환
math.isfinite(x[3])
False
np.isfinite(x[3])
False
x1=np.isfinite(x)
x1
array([ True,  True,  True, False,  True,  True,  True, False,  True,
       False,  True,  True,  True,  True,  True,  True, False,  True,
        True,  True])

위의 객체에서 False 부분이 nan과 infinity이므로 이들의 인덱스를 알아보기 위해 np.where(condition)를 적용합니다. 이 함수는 배열객체 또는 DataFrame, Series 객체에 대해 지정한 조건에 맞는 부분의 인덱스를 반환 합니다.

np.where(x1==False)
(array([ 3,  7,  9, 16]),)

무한값 결정

  • math.isinf(x): 원소단위 infinity일 경우 True
  • np.isinf(array 객체): 객체의 각 원소를 판단하여 infinity일 경우 True
x2=[math.isinf(i) for i in x]
print(x2, end="")
[False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, False, False, False]

위 객체 x2는 리스트이므로 .index(인수) 메서드를 사용하여 대상의 인덱스를 찾을 수 있다. 그러나 이 함수는 객체 중 대상과 일치하는 첫부분만을 반환한다.

x2.index(True)
7

대상에 적합한 모든 값들을 찾기 위해서는 배열 객체로 전환한 후 np.where()를 적용합니다.

p.isinf(x)
array([False, False, False, False, False, False, False,  True, False,
       False, False, False, False, False, False, False,  True, False,
       False, False])
np.where(np.isinf(x))
(array([ 7, 16]),)

numpy 모듈은 양의 무한값(positive infinity)와 음의 무한값(negative infinity)를 구별한다.

  • np.isposinf(array객체 또는 원소): 양의 무한값이면 True
  • np.isneginf(array객체 또는 원소): 음의 무한값이면 True
np.where(np.isposinf(x)) # = np.inf
(array([7]),)
np.where(np.isneginf(x)) # = -np.inf
(array([16]),)

Nan 결정

결측값 nan은 다음 함수로 결정할 수 있습니다.

  • math.isnan():요소 단위로 nan이면 True를 반환
  • np.isnan(): 객체의 전체와 요소별로 nan인 경우 True를 반환
x3=[math.isnan(i) for i in x]
print(x3, end="")
[False, False, False, True, …, False, False, False, False]
x3.index(True)
3
np.isnan(x)
array([False, False, False,  True, False, False, False, False, False,
        True, False, False, False, False, False, False, False, False,
       False, False])
np.where(np.isnan(x))
(array([3, 9]),)

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...