본문 바로가기
Bigdata/Energy Bigdata

[빅데이터] 결측치, 이상치 분석

by 겨울 빛 2020. 10. 6.

결측치 분석에 앞서 cmd창의 가상공간에서 missingno 패키지를 깔고

import missingno as msno 로 불러온다

 

 

 

 

그 후, 데이터에 임의로 난값을 추가한 뒤 결측치 분석을 시작하겠다.

#numpy 임포트
# - 산술 연산, 행렬 연산
import numpy as np
#난값(NaN, Not a Number) 발생
from numpy import nan as NA

 

 

#임의로 난값 추가
df2.iloc[1,1]=NA
df2.head()

1,1에 난값 추가

 

 

NaN

 


 

아예 난값이 있는 행과 열을 제거해보겠다.

#결측치 삭제: 행 삭제
df2.dropna().head()

 

 

난수가 존재하는 2016-01-02의 행이 통째로 사라진 것을 확인 할 수 있다.

 

#결측치 삭제: 열 삭제
df2.dropna(axis=1).head()

 

 

1시의 전력소비량이 아예 통으로 사라졌다.

 

하지만, 비어있는 값을 제거하는 대신 다른 값으로 메꿀 수도 있다.

 

 


 

 

1. 결측치 보간법: NaN 자리를 0으로 채우기

 

fillna() 함수를 사용하여, 난값에 0을 넣을 수 있다.

#결측치 채우기: 0값으로 채우기
df2.fillna(0).head()

 

 

NaN으로 되어있던 2016년 1월 2일 1시의 전력 데이터가 0으로 바뀐것을 확인할 수 있다. 

 

 

하지만, 실제 결측치가 0일 확률은 거의 없다.

결측치에 이전 값들과 유사한 값이 들어가는 것이 훨씬 가능성 있는 상황이다.


2. 결측치 보간법: NaN 자리에 전 열의 값을 넣기

#결측치 채우기: 보간법. 열 기준, 전날 같은 시간의 전력 소비량으로 대치
df2.fillna(method='ffill').head()

fillna 와, ffill이라는 매개변수를 이용하여 코드를 작성한 후 확인해보면

결측치 자리가 1월 1일의 전력량과 같은 0.60Wh로 채워졌음을 확인할 수 있다.

 

 

 

 


 

3. 결측치 보간법: NaN 자리에 전 행의 값을 넣기

#결측치 채우기: 보간법, 행 기준, 같은날 이전 시간의 전력 소비량으로 대치
df2.fillna(method='ffill', axis=1).head()

 

 

결측치 자리가 같은날 0시의 값과 동일한 값으로 채워짐을 확인할 수 있다.

 


 

4. 결측치 보간법: 선형 보간

#결측치 채우기: 선형 보간
df2.interpolate(method='linear').head()

선형보간이란, 값이 모두 선형으로 되어있다고 가정하여 직선의 특정 값에 해당하는 NaN값을 추측하여 넣는 것이다.

 

발그림 ㅈㅅ

 

 

이런 것임ㅇㅇ.. 

뭐 엄밀히 따지자면 두 값 사이의 평균값이라 할 수도 있겠다.

 

 


5. 결측치 보간법: 다항식 보간

#결측치 채우기: 다항식 보간
df2.interpolate(method='polynomial',order=2).head()

 

 

선형 보간과 유사하게  2차 다항식을 이용하여 값을 근사할 수 있다.

 

 

 

 


이번에는 이상치 분석을 해보겠다.

 

분석을 위해 임의로 이상치를 넣어준다.

#이상치 값을 임의로 추가
df2.iloc[1,2]=-999
df2.head()

눈에 보기 쉽게 완전 이상한 값을 넣어보았다.

전력 소모량인데 -999Wh면 전력을 공급한건가....?

 

 

 

 

(1,2)의 혼자만 눈에 띄는 값 ㅋㅋㅋㅋㅋ

 

여기서는 이상치가 눈에 잘 띄지만 정말 Big!Big!!!!!데이터에선 이상한 값이 있어도 잘 찾기 힘들것이다

그럴때 표를 작성하거나 그래프를 그리면 이상치의 위치를 찾을 수 있다.

왜? 표에서 혼자 특이한 통계량을 나타낸다던가 그래프에서 혼자 삐죽 튀어나온 부분이 생길테니께 ㅇㅇ

 

 

1. 이상치 찾기: 표 작성

이상치 점검을 위한 describe 함수-> 평균, 최댓값, 최솟값, 표준편차,... 온갖 통계값을 보여준다.

#이상치 점검
df2.describe()

 

mean= 평균/std= 표준편차/min= 최솟값

 

 

 

 

각종 통계값을 다 보니 주변 값들과 훨씬 차이나는 값들이 발견된다.

유일하게 마이너스인 평균과 다른애들은 0.0xx인데 혼자 100이 넘는 표준편차 등.... 누가봐도 이상한 값

이렇게 이상치를 검거(?) 할 수 있다

=> 이상치는 2열에 있음


2. 이상치 찾기: 임계값 이용

#이상치 찾기: 임계값에 의한 방법
np.abs(df2)>100

abs() 는 절대값을 구하는 함수이다.

모든 주어진 값의 절대값을 취했을때, 그 값이 100이 넘을 때만 참이다.

 

 

0.xx사이 혼자 존재하는 999만 True 값이다.


2. 이상치 찾기: 임계값 구한 후 NA로 치환

#이상치를 NaN으로 변환
df2[np.abs(df2)>100]=NA
df2.head()

전과 동일한 방법으로 절대값을 취해서 이상치를 찾아낼 수 있다.

하지만 이번에는 T/F대신 그 자리를 NA로 치환하면 이상치 자리에 NaN이 들어가게 된다.

(참고로 앞에서 NA는 NaN이라고 정의하였다.)

 

 

이상치 자리 (1,2) 가 NaN으로 바뀌었다!


 

 

 

여기까지 결측치와 이상치 분석에 대해 정리해보았다

난 졸리니까 안녕........

댓글