머신러닝에는 지도학습, 비지도학습, 강화학습이 있는데 작업형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) 제외)
'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 |