[빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(결측치, 이상치)

2025. 6. 15. 16:01·Data/빅데이터분석기사
728x90

머신러닝에는 지도학습, 비지도학습, 강화학습이 있는데 작업형2에서는 지도학습이 출제되고 있다.

비지도학습은 시각화가 되어야하는데, 구름 환경에서는 시각화를 할 수 없기 때문에 출제되기 어렵고 강화학습은 그냥 어려워서 패스.

 

전통적인 접근방식과 머신러닝 접근방식

작업형2는 정답이 없기 때문에 평가를 한다. (구간으로 평가)

머신러닝 데이터로 넣기 위해서는 전부 숫자로 바꿔야한다. 그래서 자료형이 숫자인지/문자인지 꼭 확인해야한다.

결측치가 있는 데이터가 작업형2에서 나온 적은 아직까지 없었음 !

 

predict는 0과 1 이탈여부처럼 정답이 주어진 경우 분류 모델을 사용하고, (평가지표: 모든 평가지표)

매출을 예측하는 경우에는 회귀 모델을 사용하면 된다. (평가지표: 모든 평가지표)

 

다만, 분류이면서 평가지표가 ROC-AUC일 경우에는 predict_proba로 예측한다.


결측치 처리(필수⭐️)

1. 결측치 삭제

결측치가 있는 데이터(행)을 전체 삭제하는 경우는 train데이터에만 사용해야한다. test 데이터에는 사용하면 안된다.

ex) test 데이터가 1,000개라면 정답도 1,000개가 필요한데 결측치가 있는 행을 삭제하게 되면 개수가 맞지 않아 틀린 답이 된다.

# 결측치가 있는 데이터(행) 전체 삭제 및 확인 dropna() / 기본값 axis=0
print("처리전:", train.shape)
df = train.dropna()
print("처리후:", df.shape)

 

subset을 사용해서 결측치가 있는 특정 컬럼의 행을 삭제할 수 있다.

# 결측치가 있는 특정컬럼 데이터(행)삭제
df = train.dropna(subset=['native.country','workclass'])
df.isnull().sum()

 

결측치가 너무 많아서 결측치를 채우기가 힘들 것 같을때 결측치가 있는 컬럼 삭제를 사용한다. (그 외엔 잘 사용하지 않음)

이 방법의 경우에는 train 데이터와 test 데이터 둘 다에 적용 가능한 방법이다. 

# 결측치가 있는 컬럼 삭제 dropna(axis=1)
print("처리전:", train.shape)
df = train.dropna(axis=1)
print("처리후:", df.shape)

 

2. 결측치 채우기(범주형)

최빈값으로 채우기 .mode()[0] (mode는 시리즈로 결과값이 나오기 때문에 항상 [0]을 뒤에 붙여줘야한다.)

# 최빈값
m = train['workclass'].mode()[0]
train['workclass'] = train['workclass'].fillna(m)

m = train['native.country'].mode()[0]
train['native.country'] = train['native.country'].fillna(m)

train.isnull().sum()

 

새로운 카테고리로 채우기. ex) 난 결측치를 'X'로 채우겠어!

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

 

모든 전처리는 사용자가 편한 방법으로 하면 된다.
최빈값으로 처리하던, 새로운 카테고리인 'X'로 처리하던..
결과적으로 평가지표로 모델을 돌려봤을 때 결과가 더 좋은 방법을 사용하면 된다.

 

이렇게 train 데이터에 전처리를 해줬으면 동일한 방법으로 test 데이터에 전처리를 해줘야 한다.

단, train 데이터에서 행 삭제를 했을 경우 test 데이터에서는 행 삭제를 해선 안 된다 !!! (test 데이터는 전부 해결해야하는 정답이기 때문)

 

또, test 데이터에서 최빈값을 채울 때는 train데이터의 최빈값을 채워준다. 

➡️ test 데이터는 미래의 데이터라고 가정하고 예측하는 것이기 때문에 우리가 최빈값을 알 수 없다.

➡️ 그래서 train데이터(과거 데이터)의 최빈값을 활용해서 결측값을 채워주면 된다.

# test데이터
test['workclass'] = test['workclass'].fillna(train['workclass'].mode()[0])
test['native.country']  = test['native.country'].fillna(train['native.country'].mode()[0])
test['occupation'] = test['occupation'].fillna("X")

 

3. 결측치 채우기(수치형)

컬럼을 평균값으로 채우기(mean). 이때 int형으로 변형해 처리해준다. (train과 test 데이터 둘 다에 train 데이터의 평균값을 사용한다.)

# age 컬럼 평균값으로 채우기
value = int(train['age'].mean())
print("평균값:", value)
train['age'] = train['age'].fillna(value)
test['age'] = test['age'].fillna(value)

 

중앙값으로 채우기(median). (train과 test 데이터 둘 다에 train 데이터의 평균값을 사용한다.)

# 주당 근무시간 중앙값으로 채우기
value = train['hours.per.week'].median()
print("중앙값:", value)
train['hours.per.week'] = train['hours.per.week'].fillna(value)
test['hours.per.week'] = test['hours.per.week'].fillna(value)

 

다 처리한 다음 결측치가 있는지 없는지 확인하기 위해 isnull().sum() 사용한다.

train.isnull().sum() # 컬럼별 결측치 합친 표
train.isnull().sum().sum() # 0 나오면 결측치가 없는 것

이상치 처리(선택사항)

describe로 통계량 요약을 보며 이상치를 확인한다.

train.describe()

 

통계량 요약을 보니 age의 min값이 마이너스인 것을 알 수 있었다. 

단, age가 마이너스라고 해서 꼭 이상치인 것은 아니다. test 데이터에서도 age값이 마이너스인 값이 있다면 이유가 있는 값이라는 뜻

 

그러니 train데이터와 test데이터에 마이너스인 값이 있는지 확인해야 한다.

cond = train['age']<=0
train[cond]

cond = test['age']<=0
test[cond]

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

전처리 주의사항

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

'Data > 빅데이터분석기사' 카테고리의 다른 글

[빅데이터분석기사] 작업형2 머신러닝 - 머신러닝 학습 및 평가(분류/회귀)  (0) 2025.06.16
[빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(인코딩, 스케일링), 검증 데이터 분할  (0) 2025.06.15
[빅데이터분석기사] 작업형1 모의문제3+4  (0) 2025.06.13
[빅데이터분석기사] 작업형1 모의문제1+2  (0) 2025.06.13
[빅데이터분석기사] 판다스7-시계열데이터2  (0) 2025.06.12
'Data/빅데이터분석기사' 카테고리의 다른 글
  • [빅데이터분석기사] 작업형2 머신러닝 - 머신러닝 학습 및 평가(분류/회귀)
  • [빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(인코딩, 스케일링), 검증 데이터 분할
  • [빅데이터분석기사] 작업형1 모의문제3+4
  • [빅데이터분석기사] 작업형1 모의문제1+2
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • Dev (443)
      • App·Android (1)
      • BE (50)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (11)
        • 스프링부트 시큐리티 & JWT (0)
        • 실전 자바 기본, 중급 (1)
        • PHP (11)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (28)
        • AI (7)
        • Bigdata (6)
        • Database (1)
        • Python (0)
        • 빅데이터분석기사 (13)
      • Infra (1)
      • Activity (9)
        • Intern (0)
        • SK AI Dream Camp (2)
        • 구름톤 유니브 4기 (1)
        • 리모트 인턴십 6기 (3)
        • 봉사활동 (0)
        • 부스트캠프 AI Tech 8기 (3)
      • CS (8)
      • 취준 (12)
        • 자격증 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (2)
      • 코테 (270)
        • Algorithm (222)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    이분탐색
    그래프이론
    오블완
    수학
    정렬
    시뮬레이션
    매개변수탐색
    문자열
    구현
    최단경로
    다이나믹프로그래밍
    브루트포스 알고리즘
    투포인터
    누적합
    자료구조
    그리디알고리즘
    티스토리챌린지
    그래프탐색
    너비우선탐색
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[빅데이터분석기사] 작업형2 머신러닝 - 데이터 전처리(결측치, 이상치)
상단으로

티스토리툴바