feat. 결측값 처리 및 중복 처리
안녕하세요, 브래드입니다.
오늘은 파이썬으로 데이터 전처리하기 아홉 번째 시간으로 pandas에서 결측값 처리 및 중복 처리하는 과정을 함께 공부해보아요.
결측값은 자료가 입력되지 않은 값 혹은 누락된 값을 의미합니다.
실제 데이터 처리에 있어서는 결측값이 불가피하게 존재하므로, 결측값을 다루는 것이 중요합니다.
결측값은 NaN, N/A, Null, 0 등 다양한 방식으로 불립니다. 위의 예시에서는 NaN과 0으로 표시된 모습입니다.
현재의 예시에서 0 값을 결측값으로 가정하고, 일괄적인 결측값 처리를 위하여 0 값을 NaN으로 변환했습니다.
df = df.replace('0', np.NaN)
isnull()로 결측값을 확인할 수 있습니다.
df.isnull()을 출력하여 True로 반환된다면 해당 값은 Null 값임을 알 수 있습니다.
파이썬에서 True는 1로 인식하기 때문에 df.isnull().sum()을 출력하여 칼럼 별로 결측값의 개수를 파악할 수 있습니다.
데이터 분석에 방해되는 결측값을 지우려 한다면 dropna()를 활용할 수 있습니다.
기본적으로 df.dropna()를 한다면, 결측값이 존재하는 모든 행을 삭제합니다. 따라서 분석할 데이터가 지나치게 사라지므로 주의하여 사용할 필요가 있습니다.
따라서, df.dropna(subset=['컬럼명']) 을 출력하여 해당 컬럼 내에 존재하는 결측값만 삭제시켜줄 수 있습니다. 추가적으로 여러개의 []안에 여러개의 컬럼명 입력 또한 가능합니다.
위의 예시에서는 'mm' 컬럼에 존재하는 결측값만 삭제를 실행한 모습입니다.
결측값을 삭제하는 것이 아닌 우리가 원하는 지정값으로 대체하려면 fillna('대체값')를 사용해줄 수 있습니다.
위의 예시에서는 df['mm'] = df['mm'].fillna(3)을 입력하여 'mm이란 컬럼 내에 있는 결측값은 3으로 변환해줘'를 출력한 결과입니다.
df['컬럼명'] = df['컬럼명'].fillna(3)
이번엔 결측값을 평균값으로 대체해주는 사례입니다.
먼저, 구해줄 컬럼의 평균값을 지정 및 구해준 후 앞서 진행했던 것처럼 fillna를 통해 결측값을 우리가 구한 평균값으로 대체해줄 수 있습니다.
1) Null_value = df['컬럼명'].mean()
2) df['컬럼명'] = df['컬럼명'].fillna(Null_value)
*Null_value는 임의로 임의로 설정한 것으로, 지정된 값이 아님
결측값을 최빈값으로 대체하기 위해선, 먼저 값을 세어주는 함수인 value_counts()를 활용하여 최빈값을 알아내야 합니다.
위의 예시에서는 df['mm'].value_counts()를 통해 'mm' 컬럼에서 3.0이 가장 많이 존재하는 것을 알 수 있습니다.
이후, df['mm'].value_counts().index[0]을 출력하여 index에서 가장 첫 번째 값인 최빈값 3을 출력할 수 있습니다.
최종적으로 df['mm'] = df['mm'].fillna()의 fillna()안에 df['mm'].value_counts().index[0]을 넣어, df['mm'] = df['mm'].fillna(df['mm'].value_counts().index[0])을 출력하여 결측값 대신에 최빈값을 출력할 수 있습니다.
결측값을 제거 및 변환하면서 인덱스가 0부터 시작하는 것이 아닌, 데이터 프레임의 인덱스가 중구난방으로 바뀌는 경우를 만날 가능성이 다분합니다.
따라서, 결측값 작업을 모두 완료한 후에는 reset_index()를 통해 인덱스를 재정렬할 필요가 있습니다.
df = df.rest_index(drop=True)를 출력하여 0부터 순차적으로 데이터 프레임의 인덱스가 정렬됨을 확인할 수 있습니다. 여기서의 drop=True는 이전의 인덱스를 버린다는 의미입니다.
중복 데이터 탐색은 duplicated() 함수를 활용합니다.
df[df.duplicated()]를 통해 행이 완전히 중복된 값을 찾을 수 있을 뿐만 아니라, df['컬럼명'].duplicated()를 출력하여 특정한 열에 중복된 값을 찾을 수도 있습니다.
위의 예시에서는 행에서는 중복된 값이 존재하지 않고, 'mm'열에서 중복된 값이 존재하는 것을 확인할 수 있습니다.
drop_duplicates()를 통해 완전히 겹치는 중복된 행을 삭제할 수 있습니다.
또한, 특정 열을 기준으로 제거한다면 df.drop_duplicates(subset=['컬럼명'])을 통해 특정 열 내의 중복된 값을 제거하고 상위 값들만 남길 수 있습니다.
지금까지 파이썬으로 데이터 전처리하기 아홉 번째 시간으로 결측값 처리 및 중복 처리에 관해 함께 알아보았습니다.
가공된 raw 데이터가 아닌 현업의 데이터에서는 결측값이 다수 존재하는 경우가 많으므로 분석에 용이하게 결측값 처리와 중복 처리를 진행할 필요가 존재한다고 생각합니다.
브래드였습니다. 감사합니다.