데이터 정제(Data Cleansing)은 데이터 분석 목적에 부합하는 데이터 품질을 확보하기 위한 일체의 데이터 작업으로 데이터 분석 작업의 약 80% 수준이 데이터 수집 및 전처리 작업이라고 보아도 무방하다.
데이터 전처리 과정
data cleansing의 주요 5단계
1. 데이터 베이스 정의
2. 불량 데이터의 원인 찾기
3. 우선순위 매기기
4. 데이터 베이스에 들어오는 불량 데이터 막기
5. 불량 데이터 제거
데이터 오류 확인
- 수집된 데이터 셋 중 관측되지 않은 특정 확률변수의 값을 의미한다.
- 값의 특성은 0, NaN(Not Available) 이며 발생 시 잘못된 분석 결과를 낳거나 분석 시 코드 대입 경우 에러가 발생할 수 있다.
MAR (무작위 결측)
MNAR (비 무작위 결측)
처음에는 이게 무슨 차이인가 싶지만, MCAR에서 발생한 결측치는 완전 무작위로 발생한 것이 자명하기 때문에 제거해도 무방한 이상적인 경우이다. 반면, MAR와 MNAR는 분명한 인과관계 때문에 생긴 결측치 이지만, MAR는 그 원인이 뚜렷한 상태이고, MNAR는 그 원인도 알 수 없다는 차이점이 있다.
# 완전 분석법 예시 코드
import pandas as pd
# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
'B': [5, None, 7, 8]})
# 결측치가 있는 행 제거
df.dropna(inplace=True)
# 결측치가 있는 열 제거
df.dropna(axis=1, inplace=True)
# 평균 대치법 예시 코드
import pandas as pd
# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
'B': [5, None, 7, 8]})
# 열의 평균값 계산
mean_A = df['A'].mean()
mean_B = df['B'].mean()
# 결측치를 평균값으로 대체
df['A'].fillna(mean_A, inplace=True)
df['B'].fillna(mean_B, inplace=True)
# 단순 확률 대치법 예시 코드
import pandas as pd
import numpy as np
# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8],
'C': [np.nan, 2, 6, 8]})
# 각 열의 결측치 개수 확인
missing_counts = df.isnull().sum()
# 각 열의 결측치를 해당 열의 랜덤 데이터로 대체
for col in df.columns:
if missing_counts[col] > 0:
col_data = df[col].dropna() # 결측치가 아닌 데이터 추출
fill_values = np.random.choice(col_data, size=missing_counts[col]) # 랜덤으로 대체값 선택
df[col].fillna(pd.Series(fill_values, index=df.index), inplace=True)
# 다중 대치법 예시 코드
import pandas as pd
from sklearn.impute import IterativeImputer
# 결측치가 있는 데이터프레임 예시
df = pd.DataFrame({'A': [1, 2, None, 4],
'B': [5, None, 7, 8],
'C': [2, 4, 6, None]})
# 다중 대치법 모델 생성
imputer = IterativeImputer()
# 결측치 대체
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
References