머신러닝 팀스터디 2주차 (2)

윤태호·2023년 8월 10일
0
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에 저장한다
마지막으로, 중복된 인덱스를 제거하고 이상치의 개수와 인덱스를 출력한다

profile
데이터 부트캠프 참여중

1개의 댓글

comment-user-thumbnail
2023년 8월 10일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기