728x90
머신러닝 모델을 만들기 전, 단순히 주어진 데이터만 사용하는 것은 부족할 수 있습니다.
예를 들어:
- 생년월일 이 있다고 가정을 하면 그대로 사용이 가능할까?
- 승선 인원 이 있는데, 이걸 혼자인지 여부, 가족 수 같은 의미 있는 값으로 바꾸면 더 좋지 않을까?
이처럼 기존 변수로부터 새로운 의미 있는 변수를 만들어내는 작업이
바로 파생변수 생성(Feature Engineering)입니다.
이 과정은 모델 성능을 극적으로 개선할 수 있으며, 데이터 분석의 핵심이라 해도 과언이 아닙니다.
파생변수 생성 패턴
1. 날짜/시간 파생변수
예시: SibSp(형제자매 수), Parch(부모자녀 수) → 가족 수 변수 생성
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1 # 자기 자신 포함
날짜 → 연도, 월, 요일, 시간대 등
df['Date'] = pd.to_datetime(df['Date'])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Weekday'] = df['Date'].dt.dayofweek # 0=월요일
주말 여부
df['IsWeekend'] = df['Weekday'].isin([5, 6]).astype(int)
2. 길이, 비율, 수치 조합 변수
텍스트 길이
df['NameLength'] = df['Name'].apply(len)
금액/수량 비율
df['FarePerPerson'] = df['Fare'] / df['FamilySize']
범주 개수 (고유값 수)
df['CabinInitial'] = df['Cabin'].str[0]
df['CabinCount'] = df.groupby('CabinInitial')['CabinInitial'].transform('count')
3. 범주형 변수 → 그룹 통계값
Pclass(등급)별 평균 요금 변수 생성
df['PclassMeanFare'] = df.groupby('Pclass')['Fare'].transform('mean')
성별별 평균 나이 변수 생성
df['SexMeanAge'] = df.groupby('Sex')['Age'].transform('mean')
Titanic 데이터셋 파생 변수 생성
import pandas as pd
df = pd.read_csv('Titanic-Dataset.csv')
# 가족 수
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
# 1인 승객 여부
df['IsAlone'] = (df['FamilySize'] == 1).astype(int)
# 이름 길이
df['NameLength'] = df['Name'].apply(len)
# 등급별 평균 요금
df['PclassMeanFare'] = df.groupby('Pclass')['Fare'].transform('mean')
# 요금 대비 가족 수 비율
df['FarePerPerson'] = df['Fare'] / df['FamilySize']
위 코드 처럼 직접 변수를 만들면 모델 성능을 개선하기 위해 기존 컬럼보다
정보력이 강한 파생 변수가 예측력을 높일 수 있습니다.
또한 데이터의 숨겨진 구조를 명확하게 드러낼 수 있습니다.
변수 수를 줄이기보단, 질 좋은 변수를 만드는 것이 우선입니다.
주의할 점
- 누락된 값이 섞여 있는 컬럼으로 연산 시 NaN 전파
→ .fillna()로 먼저 처리 필요 - 의미 없는 변수 생성 주의
→ 단순 조합이 아닌, 문제와 관련된 변수인지 검증해야 함 - 데이터 누수 위험
→ 테스트셋 정보가 유출되는 그룹 연산 (e.g. 전체 평균 사용)
정리
파생변수 생성은 데이터를 단순히 "정리" 하는 것을 넘어 정보를 창출하는 작업입니다.
날짜, 텍스트, 범주형 변수 등 다양한 유형에서 유용한 파생 변수 도출이 가능합니다.
"좋은 데이터"는 결국 "좋은 변수"에서 시작됩니다.
728x90
반응형
'Data Analysis' 카테고리의 다른 글
범주형 변수 인코딩 - Label, One-Hot, Ordinal (0) | 2025.05.19 |
---|---|
정규화(Normalization) vs 표준화(Standardization) (0) | 2025.05.14 |
이상치(Outliers) 탐지와 처리 방법 (0) | 2025.05.14 |
결측치(Missing Values) 처리 (0) | 2025.05.12 |
Hypothesis Test란? (0) | 2023.08.23 |