프로그래밍/Python

Dixon Q test - 특이치 식별 및 제거, 파이썬으로 구현

Dibrary 2022. 3. 23. 10:00
반응형

안녕하세요 Dibrary입니다.

이번 시간에는 데이터 분석을 하기 전에 데이터의 이상치(outlier)를 제거하는 Dixon Q test를 파이썬으로 구현 해 보겠습니다.

 

먼저, Dixon Q test에 대해 알아보겠습니다.

Dixon Q test는 이상치를 제거할 때 사용할 수 있습니다. 식은 간단하게 아래와 같이 나타낼 수 있고,

여기서 gap은 이상치(outlier)로 추정되는 값, 그리고 그 값과 가장 가까운 숫자간의 절대값 '차이' 입니다.
range는 전체 데이터의 (최대값 - 최소값) 차이 입니다. 

이렇게 계산된 Q값이 table의 Q값보다 크다면 이상치(outlier)로 추정되는 값이 이상치가 맞다는 결론을 내립니다.
신뢰도를 90, 95, 99로 다르게 적용 할 수록, table의 Q값은 달라지고, 이에 따라 gap 값이 크거나 작다고 판단될 수 있습니다.

Q 테이블의 일부 발췌

테이블은 위와 같이 주어지며, N의 갯수에 따라 Q값이 다르고, 신뢰도에 따라 다른 것을 확인할 수 있습니다.


dixon_test는 함수로 구현 해야 합니다.

먼저 비교를 할 Q-table의 값을 만들어 두죠.

출력은 95%의 신뢰도 값만 출력 해 보았습니다. 

위 코드는 Q-table의 값을 먼저 list로 만들고, dict자료형으로 N수를 key로, Q-table값을 value로 dictionary 변수를 생성한 것입니다.

 

아래 코드는 위에서 만든 Q-table 값을 사용하는 함수 입니다.

코드 설명을 간략히 드리자면, 먼저 데이터를 정렬 하는 코드가 있습니다. (sorted)

그 밑에 조건문으로 왼쪽부분(low부분)의 Q값을 계산하는 코드가 위치해 있습니다. (Q_mindiff는 Q테이블 값과 비교한 결과를 저장한 변수입니다.)

그 아래에 조건문으로 오른쪽부분(high부분)의 Q값을 계산하는 코드가 위치해 있습니다. (Q_maxdiff는 Q테이블 값과 비교한 결과를 저장한 변수입니다.)

그 밑에 Q_mindiff와 Q_maxdiff 값에 따라 함수 반환값을 설정하는 부분이 위치해 있습니다.

 


이번에도 어김없이 임의 데이터를 넣어서 dixon_test 함수를 실행 해 보겠습니다.

5에 근접한 데이터들로 값을 설정하고, dixon_test 함수를 거친 결과는 [None, None]으로 나옵니다.

이 말은 low 부분의 outlier는 없고, high 부분의 outlier는 없다는 의미입니다.


데이터 값을 바꿔서 한 번 더 보겠습니다.

임의로 110이라는 위쪽으로 굉장히 튀어나간 outlier를 설정 해 보았습니다. dixon_test 함수의 결과는 high에서 outlier로 110이라는 값이 있다고 알려줍니다.

이상치(outlier)를 데이터 리스트에서 삭제하고 다시 dixon_test 함수를 실행하니 이상치가 없다고 알려주네요.


이번에는 데이터에 이상치(outlier)를 위, 아래에 둘 다 설정 해 보겠습니다.

먼저 dixon_test를 하니 low쪽의 이상치가 -130이라는 값이 있다고 알려주네요, 그 값을 데이터에서 삭제한 후에 다시 dixon_test 함수를 실행하니 이번에는 high쪽에 115라는 이상치가 있다고 알려주네요.

이렇게 Dixon Q test를 이용해서 이상치(outlier)를 확인하고, 제거할 수 있습니다.

728x90
반응형