결측치는 데이터 분석에서 중요한 정보를 제공하지 않기 때문에
- 제거하거나
- 다른 값으로 대체
해야 합니다.
결측치를 처리하는 방법으로는
- 결측치가 많은 열은 열을 제거합니다.
- 결측치가 아주 많지 않은 열의 경우, 결측치를 가진 행만 제거합니다.
- 결측치를 가진 데이터를 삭제하면 안되는 경우(결측치가 몇 개 안되거나, 전체 데이터가 적은 경우), 결측치를 다른 값으로 치환합니다.
1. 결측치 확인하기 : isnull()
`df.isnull().sum()`을 통해 각 열 별 결측치 개수를 확인할 수 있습니다.
- `df.isnull()` : 결측치가 있는 위치에서 True를 반환합니다.
df.isnull().sum()
>>>
MovieId 5430
ImdbId 5430
TmdbId 5443
Title 5430
Year 5430
Genres 5430
UserId 18
Rating 5448
Timestamp 5448
Gender 18
Age 18
Occupation 18
dtype: int64
`df.info()`를 활용해도 탐색적으로 결측치 유무를 확인 가능합니다.
- 아래의 예시에서 총 106284개의 데이터가 있는데, non-null의 값이 106284가 아니면 차이만큼이 결측치
df.info()
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 106284 entries, 0 to 106283
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 MovieId 100854 non-null float64
1 ImdbId 100854 non-null float64
2 TmdbId 100841 non-null float64
3 Title 100854 non-null object
4 Year 100854 non-null float64
5 Genres 100854 non-null object
6 UserId 106266 non-null float64
7 Rating 100836 non-null float64
8 Timestamp 100836 non-null object
9 Gender 106266 non-null object
10 Age 106266 non-null float64
11 Occupation 106266 non-null object
dtypes: float64(7), object(5)
memory usage: 9.7+ MB
2. 결측치 제거하기 : dropna()
대부분의 경우에서는 결측치를 삭제하는 방법이 가장 좋습니다.
- 옵션
- axis : 0(default)인 경우 행 제거, 1인 경우 열을 제거
- subset : 특정 열을 지정하여 해당 열의 결측치를 제거, 리스트 형태로 복수의 컬럼 조건 지정 가능
- tresh : 임계치를 주어 행에 해당 개수만큼 결측치가 있는 경우 제거
- inplace : 결측치를 제거한 상태를 바로 저장
2-1) 목록 삭제 방식 (Listwise)
결측치가 있는 행 또는 열을 전부 삭제하는 방식
# 결측치가 있는 행을 전부 삭제
df_temp = df.dropna()
# 결측치가 있는 열을 전부 삭제
df_temp = df.dropna(axis=1)
2-2) 특정 값 조건 만족 시 삭제 방식 (Pairwise)
특정 값 조건 만족 시에만 결측치를 삭제하고, 다른 변수가 존재하는 경우에는 그대로 유지합니다.
# 행 전체가 결측치인 행만 삭제
df.dropna(how='all')
# 행의 결측치가 n개 초과인 행만 삭제
df.dropna(tresh=6)
# 특정 열들 중에 결측치가 있는 경우에만 행을 삭제
df.dropna(subset=['MovieId'])
3. 결측치 채우기 : fillna(), replace()
결측치를 특정 값으로 대체합니다. 가장 많이 사용되는 값은 `최빈값(mode), 중앙값(median), 평균(mean)`으로 채우는 평균화 기법과,
fillna()의 method 옵션을 활용하여 `이전 값(ffill), 이후 값(bfill)`과 같은 주변 값을 채우는 기법이 있습니다.
일반적으로 이전 값, 이후 값은 시계열 데이터에서 사용됩니다.
# 결측치를 특정 단일 값으로 대체하는 방법
df.fillna(0)
# 특정 열의 결측치를 다른 값으로 대체
df['UserId'].fillna(0, inplace=True)
# 평균화 기법을 사용하여 결측치 채우기
df['Age'].fillna(df['Age'].mean(), inplace=True)
# 최빈값으로 대체
df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)
# 결측치를 주변 값으로 채우기
df.fillna(method='ffill')
df.fillna(method='bfill')
'IT' 카테고리의 다른 글
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 2장. 개략적인 규모 추정 (0) | 2024.05.18 |
---|---|
[가상면접 사례로 배우는 대규모 시스템 설계 기초] 1장. 사용자 수에 따른 규모 확장성 (0) | 2024.05.16 |
[Pandas] 3. DataFrame 조회(필터링), 변경 (0) | 2024.03.27 |
[Pandas] 2. DataFrame 결합과 정렬 (0) | 2024.03.27 |
[Pandas] 1. 데이터 탐색 (0) | 2024.03.27 |