본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

빅데이터분석기사 제2유형 : ② 데이터 전처리 (결측치/이상치)

by 푸루루 2024. 6. 4.
728x90
반응형

 

 

👍데이터 3개 불러오기

import pandas as pd
X_train = pd.read_csv("X_train.csv")
y_train = pd.read_csv("y_train.csv")
X_test = pd.read_csv("X_test.csv")
 

 

👍결측치 찾기

 

아래 함수를 통해 개수를 파악한다

X_train.isnull().sum()

 
사진 삭제

사진 설명을 입력하세요.

👍결측치의 데이터 타입 확인하기 -> X_train.info()

수치형(age, hous.per.week) 과 범주형(workclass,occupation,native.country)를 알 수 있다.

 
사진 삭제

사진 설명을 입력하세요.

👍결측값의 컬럼 고유 개수 확인하기

X_train['workclass].value_counts() # 이 함수는 많이 쓰이니 꼭 기억하자

고유값이 Private가 가장 너무 많이 나왔으니, 해당 값(최빈값)으로 결측값을 쓰면 되겠다~

이런걸 판단할 수 있음

 
사진 삭제

사진 설명을 입력하세요.

 

 

👍범주형 변수 결측치 처리하기 (Object)

삭제 / 최빈값 / 없는값

 

결측치가 있는 행을 전체 삭제하기

# 결측치가 있는 데이터(행) 전체 삭제 및 확인 dropna() #기본값 axis=0
df=X_train.dropna(axis=0)
df.isnull().sum()
 

특정 컬럼에 결측치가 있으면 행을 삭제하기

# 특정컬럼에 결측치가 있으면 데이터(행) 삭제 subset=['native.country',workclass']
# 다건의 행을 삭제할 때는 리스트로 묶어서 넣어준다
df=X_train.dropna(subset='native.country')
df.isnull().sum()
 

결측이 너무 많아 특정 컬럼을 아예 삭제해 버리기 (axis)

# 결측치가 많은 특정 컬럼 삭제 drop(['workclass'], axis=1)
df = X_train.drop(['workclass'], axis=1)
df.isnull().sum()
 

최빈값(mode)으로 채우기

# 최빈값
mode=X_train['workclass'].mode()[0]
#fillna 쓸때는 특정 컬럼을 지정해줘야함 (전체 채워지니까)
X_train['workclass'].fillna(mode) 
 

결측값을 새로운 값으로 넣는다

# 결측값을 새로운 카테고리로 생성 X_train['occupation']
X_train['occupation'] = X_train['occupation'].fillna('X')
X_train.isnull().sum()
 

결측치를 처리할때는 가급적 Train 테스트를 처리할때, Test 데이터도 동시에 처리한다 !!!

 

👍수치형 변수 결측치 처리하기 (float, int)

  • 평균/중앙/최대/최소/그룹별 ~값
  • mean() , median(), max(), min()
# 주당 근무시간 중앙값으로 채우기
value = int(X_train['hours.per.week'].median())
print("채울 값:", value)
X_train['hours.per.week'] = X_train['hours.per.week'].fillna(value)
X_test['hours.per.week'] = X_test['hours.per.week'].fillna(value)
 

👍이상값

 

아까 describe로 확인했지만 나이는 음수가 있으면 안되므로 조건을 걸어 정비함

# age가 1이상인 데이터만 살림
print(X_train.shape)
X_train = X_train[X_train['age']>0]
print(X_train.shape)
 

IQR로도 확인하지만, 너무 많은 데이터가 있고 다 삭제하기는 애매함

잘쓰이지는 않음

# IQR로 확인 >> 너무 많은 데이터가 많음. 다 삭제하기는 애매하므로.. ㅕㅎㅍㄷ34ㅈ3
cols = ['age','fnlwgt','education.num', 'capital.gain', 'capital.loss', 'hours.per.week']
for col in cols:
    Q1 = X_train[col].quantile(.25)
    Q3 = X_train[col].quantile(.75)
    IQR = Q3 - Q1
    min_iqr = Q1-1.5*IQR
    max_iqr = Q3+1.5*IQR
    cnt=sum((X_train[col] < min_iqr) | (X_train[col] > max_iqr))
    print(f'{col}의 이상치:{cnt}개 입니다.')
 

전처리 주의 사항

  • 이상치, 결측치에 대해 test 데이터(행) 삭제 불가
  • 예) test 데이터 100개가 주어지고 100개로 평가를 하는데 임의로 10개를 삭제해버리면 채점을 할 수가 없음
  • train 데이터는 학습/훈련용 데이터임. 데이터가 많을 경우 임의로 소수 데이터(행) 삭제해도 무방함
  • test, train 컬럼은 삭제/추가 가능. 단, train과 컬럼수와 명이 일치해야 함 (y(target) 제외)

 

728x90

댓글