결측치 제거&대체, 수치형 데이터 정제 완벽 가이드! (평균, 중앙값, 최빈값 활용)
데이터 정제: 결측치 다루기
이번 파트에서는 데이터를 깨끗하게 만들어서 컴퓨터가 잘 이해할 수 있도록 하는 방법을 배울 거야. 특히 숫자로 된 데이터에서 빠진 값, 즉 '결측치'를 어떻게 다룰지 알아볼 거야.
학습 목표
- 결측치가 뭔지 이해하기
- 결측치가 어디 있는지 찾고 눈으로 보기 쉽게 만들기
- 결측치를 없애거나 다른 값으로 바꾸는 방법 배우기
dropna와fillna라는 유용한 도구 사용법 익히기
준비물
먼저 필요한 도구들을 불러오고, 그래프에 한글이 잘 나오도록 설정해 줄 거야. 이 한글 설정은 시험이랑 상관없으니 그냥 지금만 해둔다고 생각하면 돼.
결측치란 무엇일까?
결측치는 말 그대로 데이터가 빠져서 비어있는 값이야. 파이썬에서는 보통 NaN이라고 표시돼. 결측치가 있으면 분석 결과가 이상해지거나 컴퓨터가 제대로 작동하지 않을 수 있어서 꼭 확인하고 처리해야 해.
예제 데이터 준비
일부러 결측치를 몇 개 넣어둔 샘플 데이터를 만들었어.
A B C
0 1 2 3
1 4 NaN 6
2 7 8 NaN
3 NaN 11 12
4 13 14 NaN
5 16 17 18
6 19 NaN 21
여기 보면 B 컬럼에 두 군데, C 컬럼에 세 군데 결측치가 있네.
결측치 확인하기
결측치가 있는지 어떻게 알 수 있을까? 두 가지 방법이 있어.
-
isnull()사용하기:
isnull()을 쓰면 결측치인지 아닌지True또는False로 알려줘. 이걸sum()으로 합치면 각 컬럼에 결측치가 몇 개인지 알 수 있어.```python
df.isnull().sum()결과 예시:
A 0
B 2
C 3
dtype: int64
```
이렇게 하면
B컬럼에 2개,C컬럼에 3개의 결측치가 있다는 걸 알 수 있지. -
info()사용하기:
info()메소드를 쓰면 데이터의 전체 개수와 결측치가 아닌 값의 개수를 보여줘. 이걸 보고 결측치 개수를 짐작할 수 있어.```python
df.info()결과 예시:
RangeIndex: 7 entries, 0 to 6
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 7 non-null int64
1 B 5 non-null float64
2 C 4 non-null float64
dtypes: float64(2), int64(1)
memory usage: 296.0+ bytes
```
B컬럼은 총 7개의 데이터가 있는데,Non-Null Count가 5개라고 나왔지? 그럼 7 - 5 = 2개의 결측치가 있다는 뜻이야.
결측치 시각화하기
숫자로만 보면 좀 어렵잖아? 그래서 그래프로 보면 더 쉽게 알 수 있어. seaborn 라이브러리의 heatmap을 사용하면 돼.
isnull()로 나온 True/False 값을 heatmap으로 보여주면, 결측치가 있는 부분이 색깔로 표시돼. 아까 예시 데이터에서 B 컬럼에 두 군데, C 컬럼에 세 군데 결측치가 있었는데, 히트맵으로 보면 빨간색으로 표시되는 걸 확인할 수 있을 거야.
결측치 삭제하기
결측치를 없애는 방법 중 하나는 그냥 삭제해버리는 거야.
-
dropna()사용하기:
dropna()는 결측치가 있는 행이나 열을 삭제해줘.- 행 삭제:
dropna()만 쓰면 결측치가 하나라도 있는 행 전체를 삭제해. - 열 삭제:
dropna(axis=1)이라고 하면 결측치가 하나라도 있는 열 전체를 삭제해.
주의할 점: 너무 많이 삭제하면 데이터가 너무 줄어들어서 분석하기 어려워질 수 있어. 그래서 결측치가 많을 때는 삭제보다는 다른 방법으로 처리하는 게 좋아.
- 행 삭제:
결측치 대체하기
삭제하는 대신, 결측치를 다른 값으로 채워 넣을 수도 있어.
-
fillna()사용하기:
fillna()는 결측치를 원하는 값으로 채워주는 도구야.- 평균값으로 대체:
df.fillna(df.mean())처럼 쓰면 각 컬럼의 평균값으로 결측치를 채워줘. - 중앙값으로 대체:
df.fillna(df.median())처럼 쓰면 중앙값으로 채워줘. - 최빈값으로 대체:
df.fillna(df.mode().iloc[0])처럼 쓰면 가장 많이 나온 값(최빈값)으로 채워줘.
보간법 (Interpolation):
시계열 데이터처럼 순서가 중요한 데이터에서는 근처에 있는 값으로 채워주는 '보간법'을 쓸 수 있어.interpolate()메소드를 사용하면 돼. 예를 들어, 30과 35 사이에 결측치가 있다면, 이 두 값의 중간값인 32.5로 채워주는 식이지. - 평균값으로 대체:
실제 예시: 타이타닉 데이터
이제 실제 데이터인 타이타닉 데이터를 가지고 결측치를 처리해 볼 거야.
-
결측치 비율 확인:
타이타닉 데이터에서Age,Embarked,Fare컬럼의 결측치 비율을 확인해 볼 거야.isnull()과mean()을 같이 쓰면 결측치 비율을 쉽게 알 수 있어.Age컬럼에 결측치가 꽤 많다는 걸 확인할 수 있을 거야. -
결측치 대체:
Age컬럼의 결측치는 중앙값으로 채워줄 거야.Embarked컬럼의 결측치는 최빈값으로 채워줄 거야.
-
결과 확인:
대체하고 나서 다시 결측치가 있는지 확인하면, 이제 결측치가 모두 사라진 것을 볼 수 있을 거야.
정리
- 결측치 확인:
isnull()과info()로 결측치가 있는지, 얼마나 있는지 확인해. 그래프로 보고 싶으면heatmap을 써봐. - 결측치 처리:
- 결측치가 적으면 삭제(
dropna())해도 괜찮아. 행이나 열 단위로 삭제할 수 있어. - 결측치가 많으면 대체(
fillna())하는 게 좋아.- 숫자 데이터는 평균이나 중앙값으로 대체해.
- 순서가 중요한 데이터는 보간법(
interpolate())을 써서 근처 값으로 채워. - 범주형 데이터는 최빈값으로 대체해.
- 결측치가 적으면 삭제(
- 마무리: 결측치를 처리한 후에는 데이터가 잘 바뀌었는지, 분포가 이상해지지는 않았는지 꼭 다시 확인해봐야 해.