[TIL] 내일배움캠프 33일차_[Pandas] 데이터 전처리 - 결측치, 이상치
👀Today I Learn
결측치 탐지와 처리
1. 결측치 탐지
결측치(Missing Value)?
- 데이터가 누락되거나 기록되지 못한 상황
- Pandas는 결측치를 쉽게 탐지하고 처리할 수 있는 기능 제공
isna()와 isnull()로 결측치 탐지
- 데이터프레임의 각 요소가 결측치 여부를 확인
-
NaN은 수치적인 데이터를 나타내고, None은 파이썬 코드에서 값이 없는 것을 의미(둘 다 결측치)
df.isna() # 결측치면 True 아니면 False
sum() 을 사용한 결측치 개수 확인
-
결측치의 총 개수를 확인하려면
sum()
을 사용# 각 열별 결측치 개수 확인 df.isna().sum()
2. 결측치 처리 방법
결측치 제거
- 결측치가 표함된 행이나 열을 삭제
-
dropna()
함수를 사용(열을 제거하려면axis=1
)df_dropped_rows = df.dropna()
결측치 대체(채우기)
- 결측치를 특정 값으로 대체(채우기)
-
fillna()
함수 사용# 결측치를 '없음'으로 대체 df_filled = df.fillna('없음')
-
평균, 중앙값, 최빈값 등으로도 결측치를 채울 수 있음
# '나이' 열의 결측치를 평균값으로 대체 df['나이'] = df['나이'].fillna(df['나이'].mean())
결측치 보간(iInterpolation)
- 결측치를 주변 값들을 기반으로 보간 가능
- 일반적으로 행이 순서에 따라 연관이 있을 경우 사용함(선형보간)
interplate()
함수를 사용-
특히 시간 데이터를 다룰 때 유용
# 선형 보간법으로 결측치 채우기 df2['온도'] = df2['온도'].interpolate()
3. 고급 결측치 처리 방법
특정 조건을 기반으로 결측치 처리
-
예를 들어, 다른 열의 값을 기준으로 결측치를 채우기
df.loc[(df['직업'] == '학생') & (df['나이'].isna()), '나이'] = 20
apply() 를 사용한 사용자 정의 함수 적용
-
결측치를 처리하는 사용자 정의 함수를 적용 가능
df['나이'] = df['나이'].apply(fill_missing_age)
이상치 탐지 및 처리
1. 이상치(Outloer)란?
- 데이터의 일반적인 패턴에서 벗어난 값
- 이러한 값들은 데이터 분석에 부정적인 영향을 미치므로 탐지하여 적절히 처리하는 것이 중요
2. 이상치 탐지 방법
기술 통계 기반 이상치 탐지
describe()
함수 사용-
데이터의 기본 통계랑을 확인하고, 이상치 의심
# 기술 통계량 확인 df['나이'].describe()
- 이상치 의심
- 평균(mean)과 표준편자(std)가 큰 경우
- 최대값(max)이 비정상적으로 높은 경우
시각화를 사용한 이상치 탐지
- 박스플롯(Box Plot)과 히스토그램을 사용하면 데이터를 시각적으로 확인할 수 있어 이상치 탐지 용이
-
박스플롯의 이상치는 통상적으로 박스(사분위수 범위)의 위아래에 위치한 점으로 표시
import matplotlib.pyplot as plt # 박스플롯으로 이상치 시각화 plt.boxplot(df['나이']) plt.title('나이의 박스플롯') plt.show()
IQR(Interquartile Range)을 사용한 이상치 탐지
- IQR은 1사분위수(Q1)와 3사분위수(Q3)의 차이로, 이 범위를 벗어나는 데이터를 이상치로 간주
-
추천하지 않는 방식
# IQR 계산 Q1 = df['나이'].quantile(0.25) Q3 = df['나이'].quantile(0.75) IQR = Q3 - Q1 # IQR을 이용한 이상치 탐지 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR outliers = df[(df['나이'] < lower_bound) | (df['나이'] > upper_bound)] # 20이라는 값이 IQR 범위를 벗어나므로 이상치로 탐지됩니다.
3. 이상치 처리 방법
이상치 제거
-
이상체를 데이터프레임에서 제거
# 이상치를 제거 df_without_outliers = df[(df['나이'] >= lower_bound) & (df['나이'] <= upper_bound)]
이상치를 특정 값으로 대체
-
이상치를 특정 값으로 대체 가능
# '나이'의 중앙값으로 이상치 대체 median_age = df['나이'].median() df['나이'] = df['나이'].apply(lambda x: median_age if x > upper_bound or x < lower_bound else x)
이상치를 그대로 유지
- 이상치가 중요한 분석 포인트가 될 수 있다고 판단되면, 별도의 처리를 하지 않고 그대로 유지하기도 함
-
이 방법은 분석 목적에 따라 선택적으로 사용
# 이상치를 그대로 유지하는 경우 (처리하지 않음) print(df)
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 38-40
- SQL 코드카타 45-46
- 백준 코테 1문제
- 프로그래머스 코딩테스트 Day 25 ⇒ 2문제
- 머신러닝 과제
- TIL 작성
회고
머신러닝 과제가 잘 안되서 너무 힘들다ㅠㅠ 엉엉.. 주말에도 공부해야하다니.. 주말에는 놀고싶었는데,, 두부도 데리고 와야하는데..
댓글남기기