[Python] Pandas를 활용해 결측치 보간(interpolate) 하기
Pandas에서 제공하는 interpolate 함수로 결측치 보간 하기
탐색적 데이터 분석(Exploratory Data Analysis)를 진행하다보면, 결측치를 흔히 볼 수 있습니다.
이때, 결측치를 버릴 것인지, 채울 것인지에 따라 분석 결과가 달라집니다.
결측치가 매우 적은 경우는 버려도(drop) 결과에 큰 영향을 주지 않을 수 있습니다. 하지만, 결측치 양이 많다면 함부로 버릴 수 없습니다.
이런 상황에선 결측치를 특정 값으로 채워주어야 하는데요, 결측치를 채우는 방법엔 Pandas 에서 제공하는 fillna 메서드와 interpolate 메서드를 활용할 수 있습니다.
결측치를 채우는 방법
- fillna : 결측치를 특정의 동일 값으로 채우는 방식
- interpolate : 실측값과 실측값 사이의 결측값을 ‘그라데이션’ 기법으로 조금씩 변화시켜가면서 부드럽게 채워나가는 방법
Fillna 로 결측치 채우기
- 특정의 동일 값으로 채우는 방식
- 원하는 값으로 변경하는 매서드
Interpolate 로 스마트하게 결측치 채우기
- 앞, 뒤 값을 통하여 유추하여 좀 더 스마트하게 결측치를 채울 수 있음 (시계열 데이터에 적합)
- 실측값과 실측값 사이의 결측값을 마치 ‘그라데이션 (gradation)’ 기법으로 조금씩 변화시켜가며 채워나가는 방법
결측치 보간하는 방법
👉 기본 구조 : df.interpolate()
주요 파라미터
method
: 보간 기술 지정 (default: linear)linear
: 인덱스 값을 무시하고 값을 동일한 간격으로 처리 (MultiIndexes 지원하는 유일한 방법)time
: 주어진 간격 길이를 보간하기 위해 일일 및 고해상도 데이터에서 작동index
,values
: 인덱스의 실제 숫자 값을 사용pad
: 기존 값 사용nearest
,zero
,slinear
,quadratic
,cubic
,spline
,barycentric
,polynomial
- cipy.interpolate.interp1d로 전달됨
- 이 방법은 색인의 숫자 값을 사용
polynomial
과spline
모두 차수 (int)도 지정해야 함- (예 : df.interpolate (method=’polynomial’, order=5).
axis
: 함께 보간할 축- 시리즈의 경우 사용되지 않으며, 기본값은 0
limit
: 채울 연속 NaN 의 최대 수 (0보다 커야 함)inplace
: bool, default False- 가능한 경우 제자리에서 데이터 업데이트 권장
limit_direction
: NaN 채울 방향 설정- ‘forward’, ‘backward’, ‘both’
limit_area
: 제한하여 NaN 채울 수 있음- None, ‘inside’, ‘outside’ (default None)
inside
: 유효한 값으로 둘러싸인 NaN 만 채움 (보간)outside
: 유효 값을 초과하는 NaN 만 채움 (외삽)
downcast
: ‘infer’ or None- 가능한 경우 다운캐스트 권장
실습으로 배우기
데이터 정보
- Dataset : Kaggle 타이타닉 - train.csv
- 👉 데이터 보러가기
Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
PassengerId | ||||||||||||
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th… | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. | 3101282 | 7.9250 | NaN | S |
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S | |
5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
나이(Age) 결측치 보간하기
train["Age"].isnull().sum() # 177 개의 결측치 확인
# 새로운 컬럼 "Age_fill_linear" 에 "Age" 결측치 보간하기
train["Age_fill_linear"] = train["Age"].interpolate(method="linear")
train["Age_fill_values"] = train["Age"].interpolate(method="values")
train["Age_fill_pad"] = train["Age"].interpolate(method="pad")
train[["Age", "Age_fill_linear", "Age_fill_values", "Age_fill_pad"]].head(10)
Age | Age_fill_linear | Age_fill_values | Age_fill_pad | |
---|---|---|---|---|
PassengerId | ||||
1 | 22.0 | 22.0 | 22.0 | 22.0 |
2 | 38.0 | 38.0 | 38.0 | 38.0 |
3 | 26.0 | 26.0 | 26.0 | 26.0 |
4 | 35.0 | 35.0 | 35.0 | 35.0 |
5 | 35.0 | 35.0 | 35.0 | 35.0 |
6 | NaN | 44.5 | 44.5 | 35.0 |
7 | 54.0 | 54.0 | 54.0 | 54.0 |
8 | 2.0 | 2.0 | 2.0 | 2.0 |
9 | 27.0 | 27.0 | 27.0 | 27.0 |
10 | 14.0 | 14.0 | 14.0 | 14.0 |
# 0 출력 => linear, values 동일한 값으로 결측치 채워 짐
((train["Age_fill_linear"] == train["Age_fill_values"]) == False).sum()
정리
method 가
linear
,values
로 결측치를 보간하면 값이 동일하다.
pad
로 결측치를 보간하면, NaN 값 이전에 있던 ‘기존 값’으로 채워진다.
Reference
- [테디노트] - Pandas를 활용한 결측치 보간(interpolation) 하기 ⭐️⭐️⭐️⭐️⭐️
- [Wikidocs] Pandas 완전정복 시리즈 2편 - 06-04. 결측값 변경
- [R, Python 분석과 프로그래밍의 친구 (by R Friend) - [Python pandas] 결측값 보간하기 (interpolation of missing values) : interpolate(), interpolate(method=’time’), interpolate(method=’values’)]
- [Pandas 공식문서] - pandas.Series.interpolate
- [Pandas 공식문서] - pandas.Series.fillna
개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)
댓글남기기