결측치 처리하기
- 결측치 확인하기
- 결측치 : 값이 없다는 의미. 또는 존재하지 않는다는 의미. NaN 또는 Null로 표현됨
- 결측치 처리 방법
- 결측치가 있는 부분의 데이터를 사용할지/말지 결정
- 사용안한다면, 컬럼과 행 중에 어느 부분을 제거할지 결정
- 사용한다면, 어떻게 사용할지 결정 (대체 방법 : 평균 대체, 비율대비 대체, 0 대체)
isnull()
: 결측치 확인 함수. True이면 null인 데이터notnull()
: 결측치 아닌 데이터 조회. True이면 null 아닌 데이터
- 결측 데이터 현황 확인 :
isnull().sum()
sum()
: 0을 넣으면 각 컬럼별 행 단위 합, 1을 넣으면 각 행별 컬럼 단위 합
# True = 1, False = 0
# True을 sum()하면 count한 결과와 동일
# 결측치가 있는 행의 갯수
df.isnull().sum()
# 결측치가 있는 컬럼의 갯수
df.isnull().sum(1)
- 결측치 삭제하기
dropna(axis=0)
: 결측치가 있는 행 삭제하기dropna(axis=1)
: 결측치가 있는 열 삭제하기- ignore_index=True : 인덱스 재정렬하기
- 여러 컬럼일 경우 :
데이터프레임[["컬럼1”, "컬럼2", "컬럼3"]].dropna()
# dropna(axis=0) : 행을 기준으로 결측치가 있는 행들은 모두 삭제
df_drop_row = df.dropna(axis=0)
# dropna(axis=1) : 열을 기준으로 결측치가 있는 열들은 모두 삭제
df_drop_column = df.dropna(axis=1)
- 결측치 대체하기
- 범주형 데이터의 경우 비율 대비 대체
- 연속형 데이터의 경우 유사한 주변 데이터의 평균으로 대체
mean()
: 데이터프레임의 전체 평균 확인하기- 데이터 중 문자열 또는 카테고리 타입이 있으면 오류
fillna()
: 결측치를 다른 값으로 대체하기
# 결측치를 해당 컬럼의 평균으로 대체하기
df["이용거리"] = df["이용거리"].fillna(df["이용거리"].mean())
중복 데이터 처리하기
- 중복 데이터 확인하기
- 중복 데이터 처리 방법
- 중복 데이터는 하나만 남기고 삭제
- 중복이 아닌 데이터만 추출하여 사용
duplicated()
: 중복 데이터 확인 함수- 중복이 있으면 True, 없으면 False
- 중복 데이터 중에 첫번째 중복은 False, 두번째 중복부터는 모두 True가 됨
- 단, keep이라는 속성을 사용 안했을 때
- keep : 중복 데이터 중에 몇번째 중복을 False로 만들지 여부
- first : 중복 중 첫번째 데이터는 False, 나머지는 True
- last : 중복 중 마지막 데이터는 False, 나머지는 True
- False : 중복 데이터 전체 True
# 중복 데이터 확인하기
df.duplicated(["이용거리"]) # 또는
df["이용거리"].duplicated()
- 중복 데이터 삭제하기
drop_duplicates()
: 중복 데이터 삭제 함수. 중복 중에 True인 행들을 모두 삭제시킴- ignore_index=True : 인덱스 재정렬하기
# 중복이 없는 데이터 추출해서 사용
df = df[df.duplicated(["이용거리"]) == False] # 또는
# 중복 데이터 삭제해서 사용
df = df.drop_duplicates(["이용거리"], keep="first")
이상치 처리하기
- 이상치 시각화하기
- 박스플롯(boxplot) : 이상치 데이터 확인을 위해 사용하는 시각화
- Outliers : 이상치 데이터
- q1: 25% 지점 데이터
- q3 : 75% 지점 데이터
- IQR : q3 - q1
- Maximum = q3 + (iqr * 1.5)
- Minimum = q1 - (iqr * 1.5)
np.percentile()
: 분위수에 해당하는 값을 구해주는 Numpy 함수. % 단위로 입력quantile()
: 분위수에 해당하는 값을 구해주는 함수. 0~1 사이 값으로 입력
# 이상치 데이터 확인
plt.boxplot(df["나이"])
plt.show()
# IQR 확인
# q1 = 25% 시점 데이터
# q3 = 75% 시점 데이터
import numpy as np
q1, q3 = np.percentile(df["나이"], [25, 75])
# IQR 계산하기
iqr = q3 - q1
iqr
# 최대/최소 값 계산하기
upper_bound = q3 + (iqr * 1.5)
lower_bound = q1 - (iqr * 1.5)
- 이상치 제거하기
- 이상치 제거 방법
- 최대/최소 이상치 기준을 벗어나는 값을 제외하고 필터링하기
- 필터링 결과 중에 False인 데이터만 추출해서 사용
- 이상치 대체하기
- 이상치 대체 방법 : 평균 또는 비율로 대체해서 사용