반응형
📌 데이터 병합
1️⃣ merge() 함수
- SQL의 JOIN과 가장 유사한 방식
- 특정 컬럼(키)을 기준으로 데이터프레임을 결합
- 가장 많이 사용되는 방법
- 열(column) 기준 결합
pd.merge(left_df, right_df, on='key', how='inner')
on : 공통 키 컬럼
how : 조인 방식
2️⃣ join() 함수
- 기본적으로 인덱스(index) 기준 결합
- merge보다 문법이 간단
- 여러 개의 데이터프레임을 한 번에 결합 가능
df1.join(df2, how='left')
- Inner Join (이너 조인) : 공통된 키 값만 남김
- Left Join (레프트 조인) : 왼쪽 데이터프레임 기준 유지(왼쪽 모든 행 유지, 오른쪽에 없는 값은 NaN)
- Right Join (라이트 조인) : 오른쪽 데이터프레임 기준 유지(오른쪽 모든 행 유지, 왼쪽에 없는 값은 NaN)
- Outer Join (아우터 조인, Full Join) : 양쪽 모두 유지(모든 키 포함, 매칭 안되는 부분 NaN)
📌 결측치 & 이상치 (Missing Value & Outlier)
결측치(Missing Value)
df.isna().sum() # 컬럼별 결측치 개수
df.isna().mean() # 컬럼별 결측치 비율(0~1)
df[df['col'].isna()] # 특정 컬럼 결측치 행만 보기
1️⃣ 삭제
df.dropna() # 결측치 있는 행 제거
df.dropna(axis=1) # 결측치 있는 열 제거
df.dropna(subset=['col']) # 특정 컬럼 기준으로만 제거
2️⃣ 대체
df['col'].fillna(0)
df['col'].fillna(df['col'].mean()) # 평균 대체
df['col'].fillna(df['col'].median()) # 중앙값 대체(이상치에 강함)
df['col'].fillna(df['col'].mode()[0]) # 최빈값 대체(범주형)
3️⃣ 앞/뒤 값으로 채우기
df['col'].fillna(method='ffill') # 앞 값으로
df['col'].fillna(method='bfill') # 뒤 값으로
4️⃣ 조건부 대체(그룹별로 채우기)
df['col'] = df.groupby('group')['col'].transform(lambda x: x.fillna(x.median()))
이상치(Outlier)
1️⃣ IQR 방식 : Q1(25%) ~ Q3(75%) 범위 바깥(1.5*IQR)을 이상치로 판단
q1 = df['col'].quantile(0.25)
q3 = df['col'].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
out = df[(df['col'] < lower) | (df['col'] > upper)]
2️⃣ Z-score 방식(정규분포 가정) : |z| > 3 정도면 이상치로 보기도 함
from scipy.stats import zscore
z = zscore(df['col'].dropna())
이상치 처리 방법(대표 4가지)
- 제거 : 데이터 오류일 때
- 상/하한으로 자르기(clip / winsorizing) : 정보는 유지하되 영향 축소
- 변환 : log, sqrt 등
- 그냥 둠 : 진짜 중요한 이벤트일 수 있음, 판단 잘해야함
df['col'] = df['col'].clip(lower, upper) # 상하한으로 자르기
📌 집계 및 그룹화 (Aggregation & GroupBy)
- groupby 기본 형태
df.groupby('그룹컬럼')['값컬럼'].집계함수()
- 여러 개 집계(agg)
df.groupby('region')['sales'].agg(['count','sum','mean','max'])
- 그룹별 계산값을 원본에 붙이기(transform)
df['region_mean'] = df.groupby('region')['sales'].transform('mean')
📌 피벗테이블 (Pivot / Pivot_table)
Pivot이란?
데이터를 “행/열 구조로 재배치”해서 엑셀 피벗테이블처럼 요약표 만드는 것
df.pivot_table(index='date', columns='region', values='sales', aggfunc='sum')
pivot_table 자주 쓰는 옵션
index: 행columns: 열values: 채울 값aggfunc: 집계 방식 (mean, sum, count 등)fill_value: NaN 채우기margins: 합계(총계) 추가
df.pivot_table(
index='month',
columns='region',
values='sales',
aggfunc='sum',
fill_value=0,
margins=True
)
📌 Log Transformation (로그 변환)
- 데이터가 한쪽으로 치우쳐 있을 때 (Right-skewed)
- 값 범위가 너무 클 때 (예: 1 ~ 10,000,000)
- 이상치 영향을 줄이고 싶을 때
- 정규분포에 가깝게 만들고 싶을 때
| 변환 전 | 변환 후 |
|---|---|
| 큰 값 차이 매우 큼 | 차이 완화 |
| 분포 오른쪽 꼬리 김 | 더 대칭적 |
| 모델 학습 불안정 | 안정화 |
import numpy as np
df['sales_log'] = np.log(df['sales'])
# 0이 있을 경우
df['sales_log'] = np.log1p(df['sales']) # log(1+x)
📌 원-핫 인코딩 (One-Hot Encoding)
- 머신러닝 모델은 숫자만 이해하기 때문에 범주형 데이터들을 숫자로 바꾸는 것
df = pd.get_dummies(df, columns=['color'])
# 다중공선성 방지
pd.get_dummies(df, columns=['color'], drop_first=True)
- 카테고리 수가 너무 많으면 차원 폭발 발생
→ 이 경우 Label Encoding, Target Encoding 고려
📌 스케일링 (Scaling)
- 변수들의 단위가 다르면 문제가 생길 수 있어서 맞춰주는 작업
스케일링이 특히 중요한 모델
- KNN
- K-means
- SVM
- PCA
- 신경망
(거리 기반 모델들)
주요 스케일링 방법
1️⃣ Standard Scaling (표준화) : 평균 0, 표준편차 1
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['age','salary']])
2️⃣ Min-Max Scaling (정규화) : 0 ~ 1 사이로 변환
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df[['age','salary']])
3️⃣ Robust Scaling : 이상치에 강함 (median & IQR 사용)
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df_scaled = scaler.fit_transform(df[['age','salary']])'IT' 카테고리의 다른 글
| SQL with 빅쿼리 - 데이터베이스, 테이블, SQL, 쿼리문, 조건문 (0) | 2026.04.20 |
|---|---|
| 데이터 전처리와 시각화 - 피처 엔지니어링, 피처 셀렉션 (1) | 2026.04.19 |
| 데이터 전처리와 시각화 - 파이썬 판다스 (0) | 2026.04.18 |
| 통계학 기초 - AI 머신러닝, 의사 결정 나무 (Decision Tree), 랜덤 포레스트 (Random Forest), K-최근접 이웃 (K-Nearest Neighbor, KNN) (1) | 2026.04.17 |
| 통계학 기초 - 인과관계 vs 상관관계, 빈도주의 통계 vs 베이즈 통계 (1) | 2026.04.17 |