데이타 관점에서 정의하면 NaN은 '빈칸(결측치)' 또는 '값이 없다'를 의미한다. 이 내용을 시각적으로 정의하면, 엑셀 cell이 하얗게 비여 있는 상태를 의미한다.
1. NaN(Not a Number)
1.1 왜? 이것을 '빈칸'이라고 하지 않지 않고, NaN이라고 할까?
제 짐작으로는 프로그래밍 언어의 데이타 타입에 따라 다르게 인식하기 때문일듯하다.
1) 숫자 상태에서 빈칸: NaN(float로 취급)
2) 객체 상태에서 빈칸: None
3) 문자열에서 빈칸:""(Empty String, 이건 내용이 없는것이지 NaN이 아니다!)
위와 같이 데이타 타입에 따라 의미하는 바가 다르기때문에 NaN이라는 것을 만들어 낸듯하다.
1.2. NaN의 특징
1) 연상 불능: NaN에 숫자를 더하거나 곱해도 무조건 NaN이 됨
2) 자기 자신 비교 불가
- if NaN == NaN 은 언제나 False이다.그래서, df == np.nan 대신 반드시 df.isna()를 사용해야함
2. inf(Infinity:무한대)
- 단순히 '엄청나게 큰 수'가 아닌, 계산이 불가능할 정도로 커진 상태 의미
- 수학에서 말하는 무한대 개념을 컴퓨터에 적용하기 위해서 만들어 냄
2.1 언제 발생
- 숫자를 0으로 나눌때 발생
print(10 / 0) # 일반 파이썬에선 ZeroDivisionError 발생
print(np.array([10]) / 0) # 넘파이/판다스에선 [inf] 발생
- 양의 무한대 (inf): $10 / 0$ 처럼 양수를 0으로 나눴을 때
- 음의 무한대 (-inf): $-10 / 0$ 처럼 음수를 0으로 나눴을 때
2.2 inf 특징
1) 전염성: inf에 어떤 숫자를 더하거나 곱해도 결과 inf
2) 통계 파괴자: 이게 제일 중요함
데이터에 inf가 단 하나라도 섞여 있으면, 해당 컬럼의 평균(mean) 또는 합계(sum)를 구했을 때 결과가 무조건 inf로 나옵니다.
분석 데이터가 통째로 망가짐
3. NaN vs Inf
| NaN | Inf | |
| 의미 | 데이터가 없음 (빈칸) | 숫자가 너무 커서 측정 불가 (무한대) |
| 발생 원인 | 데이터 누락, 잘못된 연산 (0/0) | 0으로 나누기, 지수 함수 폭발 등 |
| 데이타 타입 | 실수형(float) | 실수형(float) |
4. 실무적인 작업
판다스의 많은 기능(fillna, dropna 등)은 기본적으로 NaN을 기준으로 설계되어 있음. 그래서, inf를 NaN으로 먼저 바꿔놓아야 함.
그렇지 않으면 데이타가 망가짐
(실무예)
df = df.replace([np.inf, -np.inf, 'inf', '-inf'], np.nan)
"무한대(inf)라는 계산 불가능한 값들을 일단 '비어있는 칸(NaN)'으로 만들어버리자. 그러면 나중에 한꺼번에 0으로 채우든 지우든 처리하기 편하니까!"
