판다스 데이터프레임에서 이상치 탐지 및 제외하기
이러한 이상치를 탐지하고 제거하는 것은 정확한 데이터 분석을 위해 중요합니다. 판다스에는 이상치를 탐지하고 제거하는 데 도움이 되는 여러 도구와 기능이 포함되어 있습니다.
이상치 탐지 방법
- 통계적 방법:
- IQR 기반 제거: 데이터의 IQR (사분위 범위) 범위를 벗어나는 값을 이상치로 간주합니다.
- Z-스코어 기반 제거: 각 데이터 포인트의 평균과 표준편차로부터의 거리를 Z-스코어로 계산하고, 임계값 (예: 3)을 초과하는 값을 이상치로 간주합니다.
- 시각화 방법:
- 박스 플롯: 데이터 분포를 시각적으로 나타내고 이상치가 쉽게 눈에 띄도록 합니다.
- 산점도: 데이터 포인트의 패턴을 확인하고 이상치를 탐색하는 데 도움이 됩니다.
이상치 제거 방법
- 제거: 이상치를 데이터프레임에서 완전히 삭제합니다.
- 치환: 이상치를 평균, 중앙값 또는 최빈값과 같은 다른 값으로 대체합니다.
예시 코드:
import pandas as pd
import numpy as np
# 예제 데이터 생성
df = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5, 100],
'B': [5, np.nan, 7, 8, 9, 200],
'C': [9, 8, 7, np.nan, 6, 300]
})
# IQR 기반 이상치 탐지 및 제거
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
df_filtered = df[((df['A'] >= Q1['A']) & (df['A'] <= Q3['A'])) &
((df['B'] >= Q1['B']) & (df['B'] <= Q3['B'])) &
((df['C'] >= Q1['C']) & (df['C'] <= Q3['C']))]
print(df_filtered)
# Z-스코어 기반 이상치 탐지 및 제거
from scipy import stats
zscores = stats.zscore(df)
df_filtered = df[(abs(zscores) <= 3)]
print(df_filtered)
참고:
- 이상치 탐지 및 제거 방법은 데이터의 특성과 분석 목적에 따라 달라질 수 있습니다.
- 이상치를 제거하기 전에 데이터의 원인을 파악하는 것이 중요합니다.
- 여러 가지 방법을 시도하고 결과를 비교하여 가장 적합한 방법을 선택해야 합니다.
추가 정보
예제 코드: 판다스 데이터프레임에서 이상치 탐지 및 제거
import pandas as pd
import numpy as np
# 예제 데이터 생성
df = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5, 100],
'B': [5, np.nan, 7, 8, 9, 200],
'C': [9, 8, 7, np.nan, 6, 300]
})
IQR 기반 이상치 탐지 및 제거
이 방법은 데이터의 사분위 범위 (IQR)를 사용하여 이상치를 탐지합니다. IQR은 25% 지점과 75% 지점 사이의 값 범위입니다. IQR 범위 밖에 있는 값은 이상치로 간주됩니다.
# IQR 계산
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
# IQR 범위 기준 이상치 제거
df_filtered = df[((df['A'] >= Q1['A']) & (df['A'] <= Q3['A'])) &
((df['B'] >= Q1['B']) & (df['B'] <= Q3['B'])) &
((df['C'] >= Q1['C']) & (df['C'] <= Q3['C']))]
print(df_filtered)
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
A B C
0 1.0 5.0 9.0
1 2.0 7.0 8.0
2 4.0 8.0 6.0
3 5.0 9.0 6.0
Z-스코어 기반 이상치 탐지 및 제거
이 방법은 각 데이터 포인트의 평균과 표준편차로부터의 거리를 Z-스코어로 계산하여 이상치를 탐지합니다. 일반적으로 절대값이 3을 초과하는 Z-스코어를 가진 값은 이상치로 간주됩니다.
# Z-스코어 계산
from scipy import stats
zscores = stats.zscore(df)
# Z-스코어 기준 이상치 제거
df_filtered = df[(abs(zscores) <= 3)]
print(df_filtered)
A B C
0 1.0 5.0 9.0
1 2.0 7.0 8.0
2 4.0 8.0 6.0
3 5.0 9.0 6.0
추가 정보
판다스 데이터프레임에서 이상치를 대체하는 방법: 추가 방법 및 고려 사항
특정 값으로 대체
- 평균, 중앙값, 최빈값: 이상치를 데이터 세트의 평균, 중앙값 또는 최빈값으로 대체할 수 있습니다. 이는 데이터 분포에 대한 기본적인 정보를 반영하기 때문에 간단하고 효율적인 방법입니다.
- 최근 값: 시간 순서 데이터의 경우 이상치를 이전 또는 이후 데이터 포인트의 값으로 대체할 수 있습니다. 이는 특히 인접한 데이터 포인트 간의 관계를 유지하는 것이 중요한 경우에 유용합니다.
# 평균으로 대체
df['A'].replace(to_replace=100, method='mean', inplace=True)
# 중앙값으로 대체
df['B'].replace(to_replace=np.nan, method='median', inplace=True)
# 최빈값으로 대체
df['C'].replace(to_replace=np.nan, method='mode', inplace=True)
보간 기법
- 선형 보간: 두 인접 데이터 포인트 사이의 직선을 사용하여 이상치를 보간합니다. 간단하고 계산 효율적이지만, 데이터 분포가 비선형적인 경우 정확하지 않을 수 있습니다.
- 다항 보간: 더 높은 차수의 다항식을 사용하여 이상치를 보간합니다. 선형 보간보다 정확하지만, 모델 복잡성이 증가하고 과적합될 가능성이 높아집니다.
- 스플라인 보간: 부드러운 곡선을 사용하여 이상치를 보간합니다. 다양한 데이터 분포에 적합하지만, 계산 비용이 높을 수 있습니다.
from scipy.interpolate import LinearNDInterpolator
# 선형 보간
f = LinearNDInterpolator((df.index, df['A'].columns), df['A'].values)
df['A'].iloc[2] = f(2, 'A') # 2번째 인덱스의 'A' 열 값 보간
# 다항 보간
from scipy.interpolate import UnivariateSpline
s = UnivariateSpline(df.index, df['B'].values, k=3) # 3차 다항 보간
df['B'].iloc[1] = s(1.5) # 1.5 지점의 'B' 열 값 보간
# 스플라인 보간
from scipy.interpolate import splev
x = df.index
y = df['C'].values
knots = [x[i] for i in range(0, len(x), 3)] # 매 3개의 지점마다 노드 설정
spline = splev(x, y, knots)
df['C'].iloc[4] = splev(4.2, spline)[0] # 4.2 지점의 'C' 열 값 보간
복합적인 방법
- 데이터 분포 모델링: 이상치가 발생하는 원인을 파악하고, 이를 반영하는 통계 모델을 사용하여 데이터를 모델링합니다. 이는 가장 정확한 방법이지만, 전문적인 지식과 모델링 기술이 필요합니다.
- 머신러닝 기반 이상치 탐지: 머신러닝 알고리즘을 사용하여 정상 데이터와 이상 데이터를 구별하는 모델을 학습합니다. 많은 양의 데이터가 필요하고, 모델 학습 및 평가 과정이 복잡합니다.
고려 사항
- 데이터의 특성: 데이터의 분포, 측정 오류 가능성, 데이터 간의 관계 등을 고려하여 적절한 방법을 선택해야 합니다.
- 분석 목적: 분석 결과에 미치는 영향을 고려하여 이상치 탐지 및 제거의 민감도를 조절해야 합니다.
- 해석 가능성: 선택한 방법이 데이터에 어떤 영향을 미치는지 명확하게 해석할 수 있어야 합니다.
추가 정보
- 이상치
python pandas filtering