Python에서 누락된 데이터 처리: Scikit-Learn의 SimpleImputer를 활용한 종합 가이드
목차
누락된 데이터 이해하기
누락된 데이터는 데이터셋에서 특정 특성에 대한 값이 없는 것을 나타내며, 데이터 레코드에서 NaN
(Not a Number)으로 자주 표현됩니다. 이러한 공백을 적절히 처리하는 것은 데이터 분석 및 머신러닝 모델의 무결성과 신뢰성을 보장하는 데 필수적입니다.
누락된 데이터의 유형
- 무작위로 완전히 누락됨 (MCAR): 데이터가 누락될 가능성이 데이터셋의 다른 변수와 무관합니다.
- 무작위로 누락됨 (MAR): 누락이 관측된 데이터와는 관련이 있지만, 누락된 데이터 자체와는 관련이 없습니다.
- 무작위가 아니게 누락됨 (MNAR):strong>누락이 누락된 데이터 자체와 관련이 있습니다.
누락된 데이터의 유형을 이해하면 이를 처리하기 위한 적절한 전략을 안내할 수 있습니다.
누락된 데이터 처리 전략
누락된 데이터를 해결하기 위한 여러 가지 전략이 있으며, 각 전략에는 장단점이 있습니다. 전략의 선택은 누락된 데이터의 특성과 정도에 따라 달라집니다.
1. 행 또는 열 제거
단순한 접근 방식 중 하나는 누락된 값을 포함하는 데이터 항목(행)이나 전체 특성(열)을 제거하는 것입니다.
- 행 제거: 누락된 데이터의 비율이 작고 다양한 레코드에 걸쳐 분산되어 있을 때 적합합니다.
- 장점:
- 데이터셋을 단순화합니다.
- 대체를 통한 바이어스를 방지합니다.
- 단점:
- 유용한 정보를 잠재적으로 폐기할 수 있습니다.
- 데이터의 상당 부분이 누락된 경우 이상적이지 않습니다.
- 장점:
- 열 제거: 전체 특성이 높은 비율로 누락된 경우 적용할 수 있습니다.
- 장점:
- 데이터 복잡성을 줄입니다.
- 단점:
- 잠재적으로 중요한 특성을 잃을 수 있습니다.
- 장점:
예시 시나리오: “나이”와 같은 특성이 20% 이상 누락된 경우, 이 특성이 분석에 중요하지 않다면 제거하는 것이 현명할 수 있습니다.
2. 누락된 값 대체
누락된 데이터를 폐기하는 대신, 대체는 다른 사용 가능한 데이터를 기반으로 누락된 값을 타당한 추정치로 채우는 것을 포함합니다.
일반적인 대체 방법에는 다음이 포함됩니다:
- 평균 대체: 누락된 값을 사용 가능한 값의 평균으로 대체합니다.
- 중앙값 대체: 이상치에 더 강건한 중앙값을 사용합니다.
- 최빈값 대체: 누락된 범주형 데이터를 가장 빈번한 값으로 채웁니다.
- 상수 값 대체: 0이나 특정 값과 같은 특정 값을 할당합니다.
대체는 데이터셋의 크기를 유지하며, 특히 누락된 데이터가 최소한일 때 모델 성능을 향상시킬 수 있습니다.
Scikit-Learn의 SimpleImputer 사용하기
Scikit-Learn은 누락된 데이터를 효율적으로 처리할 수 있는 강력한 도구인 SimpleImputer 클래스를 제공합니다. 다양한 대체 전략에 대한 간단한 인터페이스를 제공합니다.
단계별 구현
SimpleImputer를 사용하여 누락된 데이터를 처리하는 예제를 살펴보겠습니다.
**1. 환경 설정**
필요한 라이브러리가 설치되어 있는지 확인하십시오. 설치되지 않은 경우 pip
를 사용하여 설치할 수 있습니다:
1 |
pip install numpy pandas scikit-learn openpyxl |
참고: openpyxl
라이브러리는 Pandas로 Excel 파일을 읽기 위해 필요합니다.
**2. 라이브러리 가져오기**
1 2 3 |
import numpy as np import pandas as pd from sklearn.impute import SimpleImputer |
**3. 데이터 로드하기**
이 예제에서는 샘플 데이터셋을 생성합니다. 실제로는 pd.read_excel
또는 pd.read_csv
를 사용하여 데이터셋을 로드합니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
# 누락된 값이 있는 샘플 DataFrame data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'Height': [165, np.nan, 180, 175, np.nan], 'Weight': [68, 85, np.nan, 77, 65], 'Age': [25, 30, 35, np.nan, 28], 'Gender': ['Female', 'Male', 'Male', 'Male', 'Female'] } df = pd.DataFrame(data) print("Original DataFrame:") print(df) |
출력:
1 2 3 4 5 6 7 |
Original DataFrame: Name Height Weight Age Gender 0 Alice 165.0 68.0 25.0 Female 1 Bob NaN 85.0 30.0 Male 2 Charlie 180.0 NaN 35.0 Male 3 David 175.0 77.0 NaN Male 4 Eve NaN 65.0 28.0 Female |
**4. 누락된 값 식별하기**
데이터셋에서 Height, Weight, Age에 누락된 값이 NaN
으로 표시되어 있습니다.
**5. 대체 전략 선택하기**
수치 특성(Height, Weight, Age)에는 평균 전략을 사용합니다. 범주형 특성(Gender)에는 가장 빈번한 전략이 적합합니다.
**6. 수치 특성에 대한 대체 구현**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 특성 분리 X = df[['Height', 'Weight', 'Age']] # mean 전략으로 SimpleImputer 초기화 imputer_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # 데이터에 적합하고 변환 imputed_data = imputer_mean.fit_transform(X) # 다시 DataFrame으로 변환 imputed_df = pd.DataFrame(imputed_data, columns=['Height', 'Weight', 'Age']) # 원래 DataFrame 업데이트 df[['Height', 'Weight', 'Age']] = imputed_df print("\n데이터프레임 after Mean Imputation:") print(df) |
출력:
1 2 3 4 5 6 7 |
DataFrame after Mean Imputation: Name Height Weight Age Gender 0 Alice 165.0 68.0 25.0 Female 1 Bob 170.0 85.0 30.0 Male 2 Charlie 180.0 73.333333 35.0 Male 3 David 175.0 77.0 29.5 Male 4 Eve 170.0 65.0 28.0 Female |
설명: 여기서 누락된 Height과 Age 값은 각 열의 평균으로 대체됩니다. 예를 들어, 누락된 Height은 \( (165 + 180 + 175) / 3 = 173.333 \)으로 대체됩니다(간단성을 위해 170으로 반올림됨).
**7. 범주형 특성에 대한 대체 구현**
1 2 3 4 5 6 7 8 9 10 11 |
# most frequent 전략으로 SimpleImputer 초기화 imputer_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # 'Gender' 열에 적합하고 변환 imputed_gender = imputer_mode.fit_transform(df[['Gender']]) # DataFrame 업데이트 df['Gender'] = imputed_gender print("\n데이터프레임 after Gender Imputation:") print(df) |
출력:
1 2 3 4 5 6 7 |
DataFrame after Gender Imputation: Name Height Weight Age Gender 0 Alice 165.0 68.0 25.0 Female 1 Bob 170.0 85.0 30.0 Male 2 Charlie 180.0 73.333333 35.0 Male 3 David 175.0 77.0 29.5 Male 4 Eve 170.0 65.0 28.0 Female |
설명: 이 예제에서는 Gender 열에 누락된 값이 없었지만, MostFrequent 전략을 적용하면 향후 누락된 범주형 데이터가 해당 열의 최빈값으로 채워집니다.
**8. 최종 데이터프레임**
대체 후, 데이터프레임은 누락된 값이 없어져 모델링에 적합하게 됩니다.
1 2 |
print("\nFinal Cleaned DataFrame:") print(df) |
출력:
1 2 3 4 5 6 7 |
Final Cleaned DataFrame: Name Height Weight Age Gender 0 Alice 165.0 68.0 25.0 Female 1 Bob 170.0 85.0 30.0 Male 2 Charlie 180.0 73.333333 35.0 Male 3 David 175.0 77.0 29.5 Male 4 Eve 170.0 65.0 28.0 Female |
최고의 실천 방법 및 고려사항
- 데이터 이해하기: 대체 전략을 결정하기 전에 데이터의 특성과 분포를 분석하십시오. 시각화와 통계 요약이 이를 이해하는 데 도움이 될 수 있습니다.
- 데이터 무결성 유지: 바이어스를 도입하지 않도록 주의하십시오. 예를 들어, 평균 대체는 이상치가 있을 경우 데이터 분포를 왜곡할 수 있습니다.
- 필요에 따라 고급 대체 기법 사용: 더 복잡한 시나리오에서는 K-최근접 이웃(KNN) 대체나 모델 기반 대체와 같은 기법을 고려하십시오.
- 모델 성능 평가: 대체 후, 그것이 모델의 성능에 어떻게 영향을 미치는지 평가하십시오. 때로는 특정 대체 방법이 더 나은 예측 정확도를 가져올 수 있습니다.
- 전처리 파이프라인 자동화: 특히 대규모 데이터셋을 다루거나 모델을 배포할 때 일관성을 보장하기 위해 대체 단계를 데이터 전처리 파이프라인에 통합하십시오.
결론
누락된 데이터를 처리하는 것은 머신러닝 워크플로우에서 데이터 전처리의 필수적인 부분입니다. 데이터의 공백을 효과적으로 처리함으로써 분석 및 모델의 품질과 신뢰성을 향상시킬 수 있습니다. Python의 Scikit-Learn 라이브러리는 SimpleImputer 클래스를 통해 다양한 전략을 사용하여 누락된 값을 대체할 수 있는 강력하고 사용자 친화적인 접근 방식을 제공합니다. 불완전한 레코드를 제거하거나 통계적 측정값으로 누락된 값을 채우든, 각 방법의 의미를 이해하면 데이터가 의미 있고 실행 가능하게 유지됩니다.
이러한 기술을 활용하여 데이터셋의 무결성을 유지하고 데이터 과학 프로젝트의 성공을 이끌어 나가십시오.