데이터 분석/빅데이터 분석 기사
[빅분기 실기] 데이터 정제 - 이상치, 결측치 처리
eunki
2022. 5. 22. 22:00
728x90
이상치 확인
# 상자수염도표 그리기
df.boxplot(column='컬럼명')
이상치 처리
1. 이상치 기준을 IQR로 하여 제거
IQR = Q3 (3사분위수) - Q1 (1사분위수)
IQR = df['컬럼명'].quantile(0.75) - df['컬럼명'].quantile(0.25)
IQR × 1.5 보다 크거나 작은 값을 제거하여 새로운 데이터셋에 할당
df_new = df[(df['컬럼명'] < Q3 + IQR * 1.5 ) & (df['컬럼명'] > Q1 - IQR * 1.5 )]
2. 로그(log) 변환
변수를 log 변환하여 새로운 변수로 생성
df['log_컬럼명'] = np.log(df['컬럼명'])
3. 제곱근(sqrt) 변환
변수를 sqrt 변환하여 새로운 변수로 생성
df['sqrt_컬럼명'] = np.sqrt(df['컬럼명'])
⇒ 이상치 처리 후, histogram과 corr()로 확인
결측치 확인
isnull() # 결측이면 True 반환
notnull() # 결측이면 False 반환
# 변수별 결측값 개수 확인
isnull().sum()
# 변수별 결측 아닌 값 개수 확인
notnull().sum()
# 행 단위로 결측값 개수 확인
isnull().sum(1)
# 행 단위로 실측값 개수 확인
notnull().sum(1)
결측치 제거
# 결측값 있는 행 제거
df.dropna(axis=0)
# 결측값 있는 열 제거
df.dropna(axis=1)
# 결측값 있는 특정 행/열 제거
df[['컬럼명']].dropna()
결측치 대체
# 특정 값으로 대체
df.fillna(값)
# 앞의 값으로 대체
df.fillna(method='ffill')
df.fillna(method='pad')
# 다음 값으로 대체
df.fillna(method='bfill')
df.fillna(method='backfill')
# 평균 대체
df.fillna(df.mean())
# 다른 변수 값으로 대체
np.where(pd.notnull(df['컬럼명1'])==True, df['컬럼명1'], df['컬럼명2'])
# 집단 평균 값으로 대체
# 평균 대체 함수 생성
fill_mean_func = lambda g: g.fillna(g.mean())
# 집단별 평균 적용
df.groupby('컬럼명').apply(fill_mean_func)
# 집단별 특정 값으로 대체
# 특정값 기준 저장
fill_values = {1:1000, 2:2000}
# 설정 기준 함수 생성
fill_func = lambda d: d.fillna(fill_values[d.name])
# 집단별 설정 함수 적용
df.groupby('컬럼명').apply(fill_func)
# 변수별 다른 대체 방법
# 기준 함수 생성
fill_val = {'a':data.a.mean(), 'b':0}
# 함수 적용
df.fillna(fill_val)
728x90