![[8주차 회고] 데이터 전처리의 핵심, 이상치(Outlier) 처리와 IQR](https://blog.kakaocdn.net/dna/bgN1lj/dJMcaiL4d4r/AAAAAAAAAAAAAAAAAAAAACWhfydSHgh2Fs-YqL_P9iFIMLvqbYH_ETyV3v2eGZns/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1796050799&allow_ip=&allow_referer=&signature=GxyXrsscFGx0Sso8FF41R%2BuFCDE%3D)
이번 주 학습에서는 데이터 분석 과정에서 반드시 거쳐야 하는 데이터 전처리(Preprocessing) 중 이상치(Outlier) 탐지와 처리를 집중적으로 학습했다. 단순히 데이터를 수집하고 분석하는 것에서 끝나는 것이 아니라, 신뢰할 수 있는 분석 결과를 얻기 위해 데이터 품질을 관리하는 과정이 얼마나 중요한지 이해할 수 있었다.
특히 사분위수(Quartile), 백분위수(Percentile), IQR(Interquartile Range)의 개념을 이해하고, Python의 pandas를 활용하여 이상치를 탐지하는 실습을 진행했다.
1. 이상치(Outlier)란?
이상치란 수집된 데이터 중에서 다른 데이터들과 비교했을 때 지나치게 작거나 큰 값, 또는 전체적인 데이터 분포의 패턴에서 벗어나는 값을 의미한다.
이러한 값들은 평균, 분산, 상관관계 등 통계 분석 결과를 왜곡할 수 있으며, 일부 머신러닝 알고리즘에서는 모델 학습과 예측 성능에도 영향을 줄 수 있다.
이상치의 대표적인 유형
- 다른 데이터에 비해 매우 작은 값
- 다른 데이터에 비해 매우 큰 값
- 전체 데이터의 분포나 패턴에서 벗어나는 값
다만 이상치라고 해서 반드시 잘못된 데이터인 것은 아니다. 실제 발생한 특이 현상일 수도 있고, 입력 오류나 측정 오류일 수도 있다. 따라서 이상치를 발견하면 무조건 삭제하기보다는 발생 원인과 데이터의 특성을 먼저 확인해야 한다.
2. 사분위수(Quartile)와 백분위수(Percentile)
이상치를 판별하기 위해 먼저 사분위수와 백분위수의 개념을 학습했다. 두 개념 모두 데이터를 크기순으로 정렬했을 때 특정 위치에 해당하는 값을 기준으로 한다.
2-1. 사분위수(Quartile)
사분위수는 정렬된 데이터를 4개의 동일한 비율로 나누는 기준값이다.
- Q1 (제1사분위수) : 하위 25% 지점
- Q2 (제2사분위수) : 하위 50% 지점, 중앙값(Median)
- Q3 (제3사분위수) : 하위 75% 지점
참고로 Q4는 일반적으로 제4사분위수 구간을 의미하며, Q1·Q2·Q3처럼 데이터를 나누는 경계값을 의미하는 것은 아니다.
2-2. 백분위수(Percentile)
백분위수는 정렬된 데이터를 100개의 동일한 비율로 나누었을 때의 위치를 나타내는 기준값이다. 예를 들어 25백분위수는 전체 데이터 중 약 25%가 해당 값 이하에 위치한다는 의미다.
사분위수는 백분위수의 특수한 형태로 이해할 수 있다.
- Q1 = 25백분위수
- Q2 = 50백분위수
- Q3 = 75백분위수
3. IQR(Interquartile Range)
이상치를 판별하기 위한 대표적인 통계적 방법으로 IQR(사분위 범위)을 사용했다.
IQR은 데이터의 중심 50%가 어느 정도 범위에 분포하는지를 나타내는 값이다. Q1과 Q3 사이의 범위를 계산하여 데이터의 산포 정도를 확인할 수 있다.
IQR = Q3 - Q1
예를 들어 Q1이 20이고 Q3가 60이라면 다음과 같이 계산한다.
IQR = 60 - 20
IQR = 40
IQR은 평균과 표준편차를 이용하는 방식과 달리 극단적인 값의 영향을 상대적으로 적게 받는다는 장점이 있다. 따라서 데이터 분포가 한쪽으로 치우친 경우에도 활용할 수 있다.
4. IQR을 이용한 이상치 판별 기준
IQR을 계산한 뒤에는 다음 공식을 이용하여 이상치 판별을 위한 하한값과 상한값을 정의한다.
하한값(Lower Bound) = Q1 - (1.5 × IQR)
상한값(Upper Bound) = Q3 + (1.5 × IQR)
계산된 하한값보다 작거나 상한값보다 큰 데이터는 이상치 후보로 판단한다.
- 하한값보다 작은 값 → 이상치 후보
- 하한값 이상, 상한값 이하 → 일반적인 범위
- 상한값보다 큰 값 → 이상치 후보
이번 수업에서는 일반적으로 사용하는 1.5를 기본 가중치로 적용했다. 데이터 특성에 따라 2.0 또는 3.0 등의 기준을 사용할 수도 있지만, 가중치를 변경할 때는 그 근거를 함께 검토해야 한다.
실제 프로젝트에서는 이상치 판별 기준과 처리 방법을 보고서에 명시하는 것이 중요하다.
5. pandas를 활용한 IQR 계산
Python의 pandas에서는 quantile() 함수를 활용하여 Q1과 Q3를 간단하게 계산할 수 있다.
아래 코드는 데이터프레임의 숫자형 컬럼을 대상으로 사분위수와 IQR을 계산하는 예시다.
# 숫자형 컬럼만 추출
df_numeric = df.select_dtypes(include='number')
# Q1 : 제1사분위수
q1 = df_numeric.quantile(q=0.25)
# Q3 : 제3사분위수
q3 = df_numeric.quantile(q=0.75)
# IQR 계산
iqr = q3 - q1
# 결과 확인
display(q1)
display(q3)
display(iqr)
이후 정상 범위의 하한값과 상한값을 계산한다.
# 이상치 판별 하한값
min_val = q1 - (iqr * 1.5)
# 이상치 판별 상한값
max_val = q3 + (iqr * 1.5)
# 결과 확인
print('하한값')
display(min_val)
print('상한값')
display(max_val)
여기서 주의할 점은 컬럼마다 데이터의 단위와 분포가 다르기 때문에 IQR도 컬럼별로 각각 계산해야 한다는 것이다.
6. 논리 연산자를 이용한 이상치 탐지
계산된 하한값과 상한값을 이용하면 각 데이터가 이상치 범위에 포함되는지 확인할 수 있다. 이때 비교 연산자와 논리 연산자 |를 활용한다.
# 이상치 여부 확인
df_outlier_bool = (df_numeric < min_val) | (df_numeric > max_val)
# 결과 확인
display(df_outlier_bool)
위 코드는 각 셀의 값이 하한값보다 작거나 상한값보다 큰 경우 True를 반환한다.
- True : 이상치 범위에 해당
- False : 이상치 범위에 해당하지 않음
이후 any(axis=1)을 사용하면 행 단위로 이상치가 하나라도 존재하는지 확인할 수 있다.
# 행 단위로 이상치 존재 여부 확인
has_outlier = df_outlier_bool.any(axis=1)
# 이상치가 존재하는 행 확인
df_outlier = df_numeric[has_outlier]
display(df_outlier)
axis=1은 행 방향으로 확인한다는 의미다. 즉, 한 행에 포함된 여러 컬럼 중 하나라도 이상치에 해당하면 해당 행을 True로 표시한다.
7. 블리언 인덱싱(Boolean Indexing)
pandas의 블리언 인덱싱은 조건에 맞는 데이터만 선택하거나 제외할 때 사용하는 기능이다. 이상치가 없는 정상 데이터만 추출할 때도 활용할 수 있다.
# 이상치가 없는 정상 행만 추출
df_normal = df_numeric[~has_outlier]
# 결과 확인
display(df_normal)
여기서 ~ 연산자는 논리 부정(NOT)을 의미한다.
has_outlier가 True인 행 → 이상치가 존재하는 행~has_outlier가 True인 행 → 이상치가 없는 행
따라서 df_numeric[~has_outlier]는 이상치가 없는 행만 추출한다.
다만 위 코드는 숫자형 컬럼만 포함하는 데이터프레임을 생성한다. 실제 프로젝트에서 원본 데이터의 모든 컬럼을 유지하려면 동일한 행 인덱스를 사용해야 한다.
# 원본 데이터프레임에서 이상치가 없는 행 추출
df_normal_all = df.loc[~has_outlier]
display(df_normal_all)
8. 실무에서 주의해야 할 이상치 처리
이번 학습에서 중요한 점은 이상치를 탐지하는 것과 실제로 제거하는 것은 별개의 의사결정이라는 것이다. 이상치가 발견되었다고 해서 무조건 삭제하면 오히려 중요한 정보를 잃을 수 있다.
실무에서 고려할 수 있는 대표적인 처리 방법
- 제거(Removal) : 입력 오류나 측정 오류 등 잘못된 데이터로 확인된 경우 제거
- 대체(Imputation) : 중앙값 등 적절한 통계값으로 대체
- 상한·하한 처리(Capping) : 기준 범위를 벗어난 값을 경계값으로 조정
- 유지(Retention) : 실제 발생한 중요한 현상이라면 원본 값을 유지
또한 머신러닝 프로젝트에서는 학습 데이터와 평가 데이터의 정보가 섞이지 않도록 주의해야 한다. IQR 기준값을 학습 데이터에서 계산하고, 동일한 기준을 평가 데이터에 적용하는 방식이 데이터 누수(Data Leakage)를 방지하는 데 적절하다.
9. 이번 주 핵심 정리
- 이상치는 다른 데이터의 분포나 패턴에서 벗어나는 값이다.
- 사분위수는 데이터를 4개의 동일한 비율로 나누는 기준값이다.
- Q1은 25%, Q2는 50%, Q3는 75% 지점이다.
- IQR = Q3 - Q1
- 이상치 판별 하한값은 Q1 - (1.5 × IQR)이다.
- 이상치 판별 상한값은 Q3 + (1.5 × IQR)이다.
- pandas의 quantile() 함수로 사분위수를 계산할 수 있다.
- 논리 연산자와 any(axis=1)로 행 단위 이상치를 탐지할 수 있다.
- 블리언 인덱싱으로 이상치가 없는 데이터를 추출할 수 있다.
- 이상치는 무조건 제거하지 않고 발생 원인과 분석 목적에 따라 처리해야 한다.
10. 8주차 학습 회고
이번 주 학습을 통해 데이터 분석에서 전처리 과정이 얼마나 중요한지 다시 한번 체감했다. 그동안 이상치를 단순히 제거해야 하는 값 정도로만 생각했는데, 실제로는 평균과 분산, 데이터 분포, 머신러닝 모델 성능까지 영향을 줄 수 있는 중요한 요소라는 점을 이해하게 되었다.
특히 IQR 방식은 사분위수를 기반으로 이상치를 판별하기 때문에 평균과 표준편차를 사용하는 방식과는 다른 장점을 가지고 있다는 점이 인상적이었다. pandas의 quantile(), any(), 그리고 블리언 인덱싱을 연결해서 사용하면서 데이터 탐지부터 추출까지 이어지는 전처리 흐름도 익힐 수 있었다.
앞으로 실제 프로젝트를 진행할 때는 단순히 이상치를 제거하는 데 그치지 않고, 데이터 확인 → 이상치 탐지 → 발생 원인 분석 → 처리 기준 결정 → 결과 검증의 과정을 습관화하고 싶다.
머신러닝 모델의 성능을 높이는 것도 중요하지만, 그보다 먼저 모델이 학습하는 데이터가 신뢰할 수 있는 데이터인지 확인하는 것이 중요하다는 점을 기억해야겠다.
다음 주 학습 목표
- 이상치 탐지와 처리 방법을 실제 데이터에 적용하기
- 이상치 처리 전후의 데이터 분포 비교하기
- 전처리 방식에 따른 머신러닝 모델 성능 차이 확인하기
- 데이터 품질과 모델 성능의 관계 이해하기
#AI캠프 #8주차회고 #데이터전처리 #이상치 #Outlier #IQR #사분위수 #백분위수 #Python #Pandas #머신러닝 #데이터분석
```