이상값 감지와 처리
IQR 경계와 Z 점수로 이상값을 식별하고 상한·하한 제한, 제거, 플래그 지정 중 방법을 결정한 뒤 그 결정을 기록합니다.
이상값 감지와 처리은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
이상치란 무엇인가요
이상치는 데이터셋의 다른 데이터와 크게 다른 데이터 포인트입니다. 이상치는 실제 현상일 수도 있습니다(평균 주문 금액이 100달러인 데이터셋에서 한 기업 고객이 500,000달러를 주문한 경우). 반대로 오류일 수도 있습니다(음수 가격 또는 오타로 120이 12,000으로 입력된 경우). 이상치 처리의 첫 단계는 극단적인 값이 실제로 의미 있는 값인지, 아니면 데이터 품질 문제인지 결정하는 것입니다. 두 경우의 처리 방법은 크게 달라집니다.
import pandas as pd
import numpy as np
df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())시각적 이상치 탐지: 상자 수염 그림
상자 수염 그림은 이상치를 찾는 가장 빠른 시각화 도구입니다. 상자는 사분위 범위(IQR, Q1–Q3)를 나타내고, 수염은 IQR의 1.5배까지 뻗으며, 수염 바깥의 점은 의심되는 이상치로 개별 표시됩니다. df['revenue'].plot(kind='box') 또는 Seaborn의 sns.boxplot()을 사용하면 임계값을 직접 계산하지 않고도 이상치를 즉시 확인할 수 있습니다.
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()IQR 경계 방법
IQR 경계 방법은 사분위 범위를 계산하고 Q1 − 1.5×IQR과 Q3 + 1.5×IQR을 경계로 정의합니다. 이 경계를 벗어나는 값은 이상치로 표시됩니다. 1.5 배수는 경미한 이상치에 사용하는 표준값이며, 극단적인 이상치에만 3.0을 사용하십시오. 이 방법은 강건합니다. Z 점수와 달리 정규 분포를 가정하지 않기 때문입니다.
Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')이상치 탐지를 위한 Z 점수 방법
Z 점수는 값이 평균에서 표준편차 몇 배만큼 떨어져 있는지를 나타냅니다. 일반적으로 |Z| > 3인 값은 정규 분포 데이터의 99.7%를 포함하므로 이상치로 간주합니다. 그러나 Z 점수는 탐지하려는 이상치 자체에 민감합니다. 극단적인 값이 평균을 끌어 올리고 표준편차를 증가시켜 다른 이상치를 가릴 수 있기 때문입니다.
mean = df['revenue'].mean()
std = df['revenue'].std()
df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]
print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())이상치 표시와 제거
이상치를 기록하고 정당화하지 않은 채 절대 제거하지 마십시오. 먼저 불리언 열(is_outlier)을 사용하여 이상치를 표시한 다음, 동일한 지역·상품·날짜 등 공통된 패턴이 있는지 분석하십시오. 실제 값이라면 유지하고 모델에서 명시적으로 처리하십시오. 오류라면 제거하고 pipeline 감사 기록에 제거한 행의 수를 기록하십시오.
df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)
print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())이상치 상한 처리(윈저화)
상한 처리(또는 윈저화)는 경계를 벗어난 값을 행에서 제거하는 대신 경계값 자체로 바꿉니다. 이렇게 하면 데이터셋의 모든 행을 유지하면서 이상치가 선형 모델과 요약 통계에 미치는 왜곡을 줄일 수 있습니다. clip(lower=, upper=)를 사용하면 한 번의 벡터화 연산으로 상한과 하한을 적용할 수 있습니다.
df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)
print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())오른쪽으로 치우친 데이터의 로그 변환
수익과 가격의 분포는 큰 값이 길게 이어지는 꼬리를 가진 오른쪽 치우침인 경우가 많습니다. np.log1p()를 사용하여 로그 변환을 적용하면(0을 처리하기 위해 값에 1을 더한 뒤 로그를 계산) 꼬리를 압축하고 분포를 더 대칭적으로 만들 수 있습니다. 많은 통계 모델과 시각화는 정규성을 가정하므로, 모델링 전에 수익 열을 로그 변환하면 결과가 개선되는 경우가 많습니다.
df['log_revenue'] = np.log1p(df['revenue'])
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()여러 열의 이상치
한 번에 여러 열을 분석할 때는 모든 수치형 열에 대해 프로그래밍 방식으로 IQR 이상치 경계를 계산하십시오. 수치형 열을 순회하며 경계를 계산하고 결과를 사전에 저장합니다. 이렇게 하면 각 열마다 IQR 계산을 수동으로 반복하지 않고도 몇 줄의 코드로 전체 이상치 보고서를 생성할 수 있습니다.
numeric_cols = df.select_dtypes(include=['number']).columns
outlier_report = {}
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
outlier_report[col] = n_out
print(pd.Series(outlier_report).sort_values(ascending=False))산점도를 이용한 이변량 이상치
일부 데이터 포인트는 다른 값과의 조합에서만 이상치가 됩니다. 단가 10달러는 정상이고 수량 500은 이례적이지만 불가능하지 않을 수 있습니다. 그러나 고급 상품의 단가가 10달러이고 수량이 500이라면 의심스럽습니다. 이변량 이상치는 산점도에서 고립된 점으로 나타납니다. df.plot.scatter('quantity', 'unit_price')를 사용하여 주된 군집에서 멀리 떨어진 점을 찾으십시오.
fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()이상치 결정 기록
모든 이상치 결정은 기록해야 합니다. 기록할 항목은 열, 탐지 방법, 사용한 임계값, 표시된 행의 수, 적용한 처리(유지, 상한 처리 또는 제거)입니다. 이러한 문서는 코드 검토와 감사에서 분석가를 보호합니다. 정제 기록 사전에 저장하고 출력 데이터셋과 함께 보관하십시오.
outlier_log = {
'column': 'revenue',
'method': 'IQR 1.5x',
'lower_bound': round(lower, 2),
'upper_bound': round(upper, 2),
'rows_flagged': int(df['is_revenue_outlier'].sum()),
'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
print(f'{k}: {v}')처리된 데이터셋 저장
이상치를 표시하고 처리한 후 업데이트된 DataFrame을 저장하십시오. 후속 사용자가 특정 분석에서 표시된 행을 제외할 수 있도록 출력에 is_outlier 표시 열을 유지하십시오. 상한 처리된 버전은 원본과 함께 명확한 접미사(_capped)가 붙은 열에 저장하여 정제를 되돌릴 수 있게 하십시오.
cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)빠른 확인
이 단원에서 배운 데이터 분석 개념을 이해했는지 확인해 보십시오.
단원 복습
이 단원에서는 IQR 경계와 Z 점수로 이상치를 탐지하는 방법, 이상치를 표시하거나 상한 처리하거나 제거할지 결정하는 방법, 오른쪽으로 치우친 분포에 로그 변환을 적용하는 방법을 배웠습니다. 다음으로는 텍스트 열에서 일관되지 않은 범주 레이블을 표준화하는 방법을 살펴보겠습니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“이상값 감지와 처리” 강의는 무료인가요?
네 — “이상값 감지와 처리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“이상값 감지와 처리”에서 뭘 배우나요?
IQR 경계와 Z 점수로 이상값을 식별하고 상한·하한 제한, 제거, 플래그 지정 중 방법을 결정한 뒤 그 결정을 기록합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“이상값 감지와 처리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 중복 감지와 제거
- 이상값 감지와 처리
- 일관되지 않은 범주 표준화
- 스키마 검증과 단언