머신러닝(Machine Learning) 실전 데이터 전처리

728x90
반응형

빈칸을 채워넣어야 합니다.

서론

 

데이터 분석에서 가장 중요한 단계 중 하나는 데이터 전처리입니다. 데이터 전처리는 원시 데이터를 분석에 적합한 형태로 변환하는 과정을 말합니다. 이 과정에서 결측치와 이상치 처리는 필수적인 과정입니다. 결측치는 데이터가 없는 부분을, 이상치는 일반적인 데이터 패턴에서 벗어난 값을 의미합니다. 이 두 가지 문제를 적절하게 처리하지 않으면 데이터 분석의 정확도와 신뢰성이 크게 떨어질 수 있습니다. 본 글에서는 결측치와 이상치 처리에 대한 다양한 방법을 소개하고, 파이썬 코드를 통해 실제로 어떻게 적용하는지를 설명하겠습니다. 

 

1. 결측치 처리

데이터에서 가장 흔히 발생하는 문제는 결측치입니다. 결측치는 데이터가 없는 부분을 의미하며, 이를 처리하는 방법은 여러 가지가 있습니다.

 

- 평균, 중앙값, 최빈값 등으로 채우기

 

df.fillna(df.mean(), inplace=True)

 

- 특정 값으로 채우기

 

df.fillna(0, inplace=True)

 

- 결측치가 있는 행이나 열 제거

 

df.dropna(inplace=True)

 

결측치 처리에 대해 더 다양한 방법을 소개하겠습니다.

 

1) 선형 보간법을 이용한 결측치 처리

 

선형 보간법은 결측치 양쪽의 값을 이용하여 결측치를 보간하는 방법입니다. 주식 가격이나 기온 등 시간에 따라 변하는 데이터에 주로 사용됩니다. 

 

 df.interpolate(method='linear', limit_direction='forward', axis=0, inplace=True)

코드해석▼

더보기

이 코드는 pandas의 DataFrame에서 결측치를 선형(Linear) 보간법을 통해 채우는 작업을 수행합니다. 코드를 자세히 분석하면 다음과 같습니다:

1. `df.interpolate()`: DataFrame 'df'에서 결측치를 보간하는 메소드입니다.

2. `method='linear'`: 'linear'는 선형 보간법을 사용하겠다는 의미입니다. 선형 보간법은 결측치의 앞뒤 값을 이용하여 결측치를 채우는 방법입니다. 예를 들어, 결측치 앞의 값이 1, 뒤의 값이 3이라면, 결측치는 (1+3)/2 = 2로 채워집니다.

3. `limit_direction='forward'`: 'forward'는 결측치를 앞에서 뒤로 채우겠다는 의미입니다. 즉, 결측치 앞의 값과 결측치 뒤의 값 사이에서 선형 보간을 수행하겠다는 것입니다.

4. `axis=0`: 축을 지정하는 인자로, '0'은 행 방향을 의미합니다. 따라서 각 컬럼의 행 방향으로 보간을 수행하겠다는 것입니다.

5. `inplace=True`: 'inplace=True'는 원본 DataFrame 'df'에 보간 결과를 바로 적용하겠다는 의미입니다. 'inplace=False' (기본값)로 설정하면, 보간 결과를 적용한 새로운 DataFrame이 반환되지만 원본 DataFrame은 변경되지 않습니다. 결과적으로, 이 코드는 DataFrame 'df'의 각 컬럼에서 결측치를 해당 컬럼의 앞뒤 값으로 선형 보간하는 작업을 수행하며, 보간 결과를 원본 DataFrame에 바로 적용합니다.

2) 시계열 데이터에 대한 결측치 처리

 

시계열 데이터에서는 이전 시점의 값으로 결측치를 채우는 방법이 일반적입니다. 이 방법은 데이터가 시간적인 순서를 가지고 있으며, 시간적인 흐름에 따라 값이 크게 달라지지 않는 경우에 유용합니다. 

 

df.fillna(method='ffill', inplace=True) # forward-fill 
df.fillna(method='bfill', inplace=True) # backward-fill ```

 

3) 다른 컬럼을 이용한 결측치 대체

 

다른 컬럼의 값과의 관계를 이용해 결측치를 대체하는 방법입니다. 예를 들어, '성별' 컬럼에 따른 '키' 컬럼의 평균값으로 '키' 컬럼의 결측치를 채우는 것입니다.  

 

df['height'] = df.groupby('sex')['height'].transform(lambda x: x.fillna(x.mean()))

 

코드해석▼

더보기

이 코드는 '성별'('sex') 별로 그룹화된 데이터에서 '키'('height')의 결측치를 해당 성별의 '키' 평균값으로 채우는 작업을 수행합니다. 코드를 자세히 분석하면 다음과 같습니다:

1. `df.groupby('sex')`: DataFrame 'df'를 'sex' 컬럼의 값에 따라 그룹화합니다. 이 결과, 남성과 여성 그룹이 각각 생성됩니다.

2. `groupby('sex')['height']`: 각 성별 그룹에서 'height' 컬럼을 선택합니다.

3. `transform(lambda x: x.fillna(x.mean()))`: 각 성별 그룹의 'height' 컬럼에서, 결측치를 해당 그룹의 'height' 평균값으로 채우는 작업을 수행합니다. 'lambda x: x.fillna(x.mean())'는 각 그룹에 적용되는 함수를 의미하며, 이 함수는 각 그룹의 'height' 값이 'x'라고 할 때, 'x'의 결측치를 'x'의 평균값으로 채우는 작업을 수행합니다.

4. `df['height'] = `: 위의 작업으로 채워진 'height' 값을 원래 DataFrame 'df'의 'height' 컬럼에 다시 할당합니다. 따라서, 이 코드는 성별에 따른 키의 평균값을 이용해 'height' 컬럼의 결측치를 채워 넣는 역할을 합니다. 이 방법은 '성별'과 '키' 사이에 상관관계가 있다고 가정할 때 유용하게 사용할 수 있습니다.

4) 모델을 이용한 결측치 대체

 

머신러닝 모델을 이용하여 결측치를 예측하는 방법입니다. 이 방법은 복잡하지만 결측치 처리에 높은 정확도를 제공합니다. 예를 들어, 여러 요인이 복합적으로 작용하여 결측치가 발생한 경우, KNNImputer 등을 이용하여 결측치를 예측할 수 있습니다.

 

from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
df = pd.DataFrame(imputer.fit_transform(df), columns = df.columns)

 

각각의 방법은 데이터의 특성과 결측치의 성질에 따라 적절하게 선택하고 사용해야 합니다.

 

2. 이상치 처리

 

이상치는 일반적인 데이터 패턴에서 벗어난 값으로, 제거하거나 대체해야 할 수 있습니다.

 

- Z-score를 이용한 이상치 제거

 

from scipy import stats

df = df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]

 

- IQR을 이용한 이상치 제거

 

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75) 
IQR = Q3 - Q1 
df = df[~((df < (Q1 - 1.5 * IQR)) |(df > (Q3 + 1.5 * IQR))).any(axis=1)]

 

평균과 표준편차를 이용한 이상치 제거

 

평균과 표준편차를 이용하면, 데이터가 정규분포를 따를 때 이상치를 찾는데 유용합니다. 평균에서 표준편차의 3배 이상 떨어진 값을 이상치로 판단하고 제거합니다. 주식 가격, 기온 등 일반적으로 정규분포를 이루는 데이터에서 사용됩니다.

 

mean = df.mean()

std = df.std()

df = df[(df > mean - 3*std) & (df < mean + 3*std)]

 

- DBSCAN을 이용한 이상치 탐색

 

DBSCAN은 밀도 기반의 클러스터링 알고리즘으로, 이상치 탐색에도 활용할 수 있습니다. DBSCAN은 데이터의 밀도를 계산하여 밀도가 낮은 지역을 이상치로 판단합니다. 다차원 데이터에서 이상치를 찾아내는 과제에서 사용됩니다. 

 

from sklearn.cluster import DBSCAN

outlier_detection = DBSCAN(min_samples = 2, eps = 3)

clusters = outlier_detection.fit_predict(df)

outliers = df[clusters == -1]

 

각 방법은 데이터의 분포 특성과 이상치의 성질에 따라 적절하게 선택하고 사용해야 합니다. 이상치 탐지 및 처리는 데이터 분석의 중요한 단계로, 이상치 때문에 모델의 성능이 저하되는 것을 방지합니다.

 

결론

 

결측치와 이상치 처리는 데이터 전처리 과정에서 핵심적인 작업입니다. 이들을 적절하게 처리함으로써 데이터의 품질을 높이고, 더욱 정확한 분석 결과를 도출할 수 있습니다. 그러나 모든 데이터셋에 동일한 방법을 적용하는 것이 아니라, 각 데이터셋의 특성과 분석 목적에 따라 적절한 방법을 선택해야 합니다. 이 글에서 소개한 방법들이 결측치와 이상치를 효과적으로 처리하는 데 도움이 되길 바라며, 이러한 기초적인 데이터 전처리 과정을 통해 분석의 신뢰성을 더욱 높일 수 있기를 기대합니다.

반응형