파이썬 NumPy로 리스트에서 이상치 제거하기
파이썬 NumPy로 리스트에서 이상치 제거하기
IQR (사분위수 범위) 기반 제거
사분위수 범위(IQR)는 데이터 세트의 분포를 기반으로 이상치를 식별하는 데 사용되는 통계적 도구입니다. IQR 기반 제거는 다음 단계로 수행됩니다.
- 사분위수 계산:
numpy.percentile
함수를 사용하여 데이터 세트의 1사분위수(Q1)와 3사분위수(Q3)를 계산합니다. - IQR 계산: IQR은 Q3 - Q1입니다.
- 상한 및 하한 계산: 상한은 Q3 + 1.5 * IQR이고, 하한은 Q1 - 1.5 * IQR입니다.
- 이상치 제거: 상한 또는 하한보다 큰/작은 값은 이상치로 간주되고 제거됩니다.
import numpy as np
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
q1 = np.percentile(data, 25)
q3 = np.percentile(data, 75)
iqr = q3 - q1
upper_bound = q3 + 1.5 * iqr
lower_bound = q1 - 1.5 * iqr
filtered_data = [x for x in data if lower_bound <= x <= upper_bound]
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
Z 점수 기반 제거
Z 점수는 각 데이터 포인트가 평균으로부터 얼마나 떨어져 있는지를 나타내는 값입니다. Z 점수 기반 제거는 다음 단계로 수행됩니다.
- 평균 및 표준편차 계산:
numpy.mean
및numpy.std
함수를 사용하여 데이터 세트의 평균과 표준편차를 계산합니다. - Z 점수 계산: 각 데이터 포인트에 대해 Z 점수를 계산합니다. Z 점수는 (값 - 평균) / 표준편차입니다.
- 임계값 설정: 일반적으로 절대값이 3 이상인 Z 점수를 가진 값은 이상치로 간주됩니다.
- 이상치 제거: 임계값을 초과하는 Z 점수를 가진 값은 이상치로 간주되고 제거됩니다.
import numpy as np
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
mean = np.mean(data)
std = np.std(data)
z_scores = (data - mean) / std
threshold = 3
filtered_data = [x for x, z in zip(data, z_scores) if abs(z) <= threshold]
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
로버스트 통계 기반 제거
NumPy는 scipy.stats
모듈에서 로버스트 통계 함수를 제공합니다. 로버스트 통계는 이상치에 강인한 통계적 척도이며, 다음과 같은 방법으로 이상치를 제거하는 데 사용할 수 있습니다.
- Tukey's IQR:
scipy.stats.iqr
함수를 사용하여 IQR 기반 제거와 유사하게 이상치를 식별합니다. - Median absolute deviation (MAD):
scipy.stats.mad
함수를 사용하여 MAD 기반 제거를 수행합니다. MAD는 데이터 세트의 중앙값으로부터 각 데이터 포인트의 거리의 중앙값입니다. MAD를 사용하여 상한 및 하한을 계산하고 이상치를 제거할 수 있습니다.
import numpy as np
from scipy import stats
data = [1, 2, 3, 100, 5, 6, 7, 8
예제 코드: NumPy로 리스트에서 이상치 제거
IQR 기반 제거
import numpy as np
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
def iqr_outlier_removal(data):
q1 = np.percentile(data, 25)
q3 = np.percentile(data, 75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
filtered_data = [x for x in data if lower_bound <= x <= upper_bound]
return filtered_data
filtered_data = iqr_outlier_removal(data)
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
Z 점수 기반 제거
import numpy as np
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
def zscore_outlier_removal(data):
mean = np.mean(data)
std = np.std(data)
z_scores = (data - mean) / std
threshold = 3
filtered_data = [x for x, z in zip(data, z_scores) if abs(z) <= threshold]
return filtered_data
filtered_data = zscore_outlier_removal(data)
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
Tukey's IQR 기반 제거
import numpy as np
from scipy import stats
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
def iqr_outlier_removal_scipy(data):
filtered_data = stats.iqr(data, isoutlier=True)
return filtered_data
filtered_data = iqr_outlier_removal_scipy(data)
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
NumPy로 리스트에서 이상치를 제거하는 대체 방법
특정 값 제거
특정 값이 이상치로 판명된 경우 해당 값을 직접 제거하는 방법입니다. numpy.where
함수와 같은 조건부 인덱싱을 사용하여 원하는 값을 제거할 수 있습니다.
import numpy as np
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
filtered_data = data[np.where(data != 100)] # 특정 값 100 제거
print(filtered_data) # [1, 2, 3, 5, 6, 7, 8, 9]
히스토그램 기반 제거
히스토그램을 사용하여 데이터 분포를 시각화하고 이상치가 튀어나온 빈을 제거하는 방법입니다. numpy.histogram
함수를 사용하여 히스토그램을 생성하고, 빈의 개수나 빈 폭을 기준으로 이상치 빈을 판별하여 제거할 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
data = [1, 2, 3, 100, 5, 6, 7, 8, 9]
plt.hist(data)
plt.show() # 히스토그램 확인
# 빈 분석 및 이상치 빈 제거 (예시)
머신러닝 기반 제거
Isolation Forest나 Local Outlier Factor (LOF)와 같은 머신러닝 알고리즘을 사용하여 이상치를 식별하는 방법입니다. 이러한 알고리즘은 데이터의 특징을 학습하고 거리 또는 밀도 기반으로 이상치를 점수화하여 제거합니다.
# 라이브러리 설치 필요 (예: scikit-learn)
# ...
# 머신러닝 알고리즘 적용 및 이상치 제거 (예시)
위 방법들은 각각 장단점이 있으며, 데이터의 특성과 분석 목적에 따라 적절한 방법을 선택해야 합니다.
참고:
- 이상치 제거는 데이터 분석 과정에서 중요한 단계이지만, 모든 이상치를 제거하는 것이 항상 좋은 것은 아닙니다. 데이터의 특성을 이해하고 분석 목적에 맞게 적절한 판단이 필요합니다.
- NumPy 외에도 Pandas, scikit-learn 등 다양한 라이브러리가 이상치 제거 기능을 제공합니다.
python numpy