안녕하세요 Dibrary입니다.
이번 시간에는 데이터 분석을 하기 전에 데이터의 이상치(outlier)를 제거하는 Dixon Q test를 파이썬으로 구현 해 보겠습니다.
먼저, Dixon Q test에 대해 알아보겠습니다.
Dixon Q test는 이상치를 제거할 때 사용할 수 있습니다. 식은 간단하게 아래와 같이 나타낼 수 있고,
여기서 gap은 이상치(outlier)로 추정되는 값, 그리고 그 값과 가장 가까운 숫자간의 절대값 '차이' 입니다.
range는 전체 데이터의 (최대값 - 최소값) 차이 입니다.
이렇게 계산된 Q값이 table의 Q값보다 크다면 이상치(outlier)로 추정되는 값이 이상치가 맞다는 결론을 내립니다.
신뢰도를 90, 95, 99로 다르게 적용 할 수록, table의 Q값은 달라지고, 이에 따라 gap 값이 크거나 작다고 판단될 수 있습니다.
테이블은 위와 같이 주어지며, 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)를 확인하고, 제거할 수 있습니다.
'프로그래밍 > Python' 카테고리의 다른 글
파이썬 데이터 분석 준비! - Numpy배열 다루기 - 3(배열 응용하기) (0) | 2022.03.29 |
---|---|
파이썬 데이터 분석 준비! - Numpy배열 다루기 - 2(배열 데이터 다루기) (0) | 2022.03.24 |
Anderson-Darling 통계 - 정규성 검정, 파이썬으로 확인하기 (0) | 2022.03.16 |
파이썬 데이터 분석 준비! - Numpy배열 다루기 - 1(객체 만들어보기) (0) | 2022.03.15 |
알고리즘을 풀 때 항상 생각해봐야 하는 것 - 복잡도 (0) | 2022.02.16 |