features = ['age', 'bmi', 'children', 'charges']
# Standard Deviation 사용 index_list = [] for f in features : mean = df[f].mean() std = df[f].std() cutoff = std*3 index = df[(df[f] < mean-cutoff) | (df[f] > mean+cutoff)].index index_list.extend(index)
Standard Deviation 사용
- 표준 편차(standard deviation)를 기반으로 이상치를 찾는 방법
- 각 특성(feature)에 대해 평균과 표준 편차를 계산하고, 표준 편차의 몇 배수를 기준으로 이상치를 식별
- mean: 특성의 평균
- std: 특성의 표준 편차
- cutoff: 표준 편차의 몇 배수를 기준으로 이상치를 판단하는 값
- index_list: 이상치의 인덱스를 저장하는 리스트
표준 편차의 3배(std*3)를 계산하여 임계값(cutoff)으로 사용합니다
- 해당 열의 값이 평균에서 표준 편차의 3배 이상 떨어져 있는 경우 또는 평균에서 표준 편차의 3배 이상 더 높은 값이거나 낮은 값인 경우,
찾은 이상치의 인덱스를 index_list에 추가
index_list = sorted(set(index_list)) print("outliers counts : ", len(index_list)) print("outlier indexes : ", index_list)
index_list라는 리스트에 저장된 값을 정렬하고 중복된 값을 제거하는 작업을 수행하기 위해
- set(index_list): index_list에 저장된 값들을 집합(set)으로 변환
집합은 중복된 값을 허용하지 않으므로 중복된 값들이 제거됨- sorted(set(index_list)): 위에서 생성된 중복되지 않은 값을 정렬
이 때 sorted() 함수를 사용하여 값을 오름차순으로 정렬- 따라서 이 코드를 실행하면, index_list에 저장된 값들이 중복이 제거되고 정렬된 순서로 저장됩니다
index_list = [] for f in features : Q1 = np.percentile(df[f], 25) Q3 = np.percentile(df[f], 75) IQR = Q3 - Q1 index = df[(df[f] < Q1-1.5*IQR) | (df[f] > Q3+1.5*IQR)].index index_list.extend(index)
Interquartile Range(IQR) 사용
- IQR을 이용하여 이상치를 찾는 방법
- IQR은 데이터의 중간 50% 범위를 의미
- 데이터의 25번째 백분위수(Q1)와 75번째 백분위수(Q3)를 계산하고, IQR의 1.5 배수를 기준으로 이상치를 식별
- Q1: 특성의 25번째 백분위수
- Q3: 특성의 75번째 백분위수
- IQR: Interquartile Range
- index_list: 이상치의 인덱스를 저장하는 리스트
df[f] < Q1 - 1.5 * IQR
해당 열의 값이 1사분위(Q1)에서 1.5배의 IQR을 뺀 값보다 작은 경우
df[f] > Q3 + 1.5 * IQR
해당 열의 값이 3사분위(Q3)에서 1.5배의 IQR을 더한 값보다 큰 경우
두가지 방법 모두 데이터셋의 각 특성에 대해 이상치를 찾아내고, 이상치의 인덱스를 index_list에 저장한다
마지막으로, 중복된 인덱스를 제거하고 이상치의 개수와 인덱스를 출력한다
공감하며 읽었습니다. 좋은 글 감사드립니다.