1. 오늘 배운 것
1) 인코딩 : 머신러닝을 할때 범주 또는 이름으로 분류되는 데이터를 숫자로 바꿔줘야 합니다.
방법 .1 OneHotEncoding : 순서가 없는 범주형 변수를 다룰 때 가장 안전하고 효과적인 방법입니다.
- 성별, 혈액형처럼 순서가 없는 범주형 변수에 사용
- 범주의 개수가 너무 많지 않을 때 사용 ex) A~Z
- 각 범주를 새로운 열로 만들어 0과 1로 표시 예) 혈액형(A, B, O) → A열(1,0,0), B열(0,1,0), O열(0,0,1)
예제)
# 1. 샘플 데이터프레임 생성
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'blood_type': ['A', 'B', 'O', 'AB']
})
print("원본 데이터:")
print(df)

# 2. One-Hot Encoding 적용
df_encoded = pd.get_dummies(df, columns=['blood_type'])
print("\nOne-Hot Encoding 결과:")
print(df_encoded)
get_dumies(데이터, 분류할 컬럼) 이런식으로 써주면 됩니다.

방법.2 Label Encoder : 문자형 데이터를 정수로 변환하는 방법.(주로 순서가 있는 범주형 변수를 처리)
- low,medium,high 또는 초급,중급,고급 처럼 순서가 있는 범주형 변수에 사용
- 범주가 있지만 One-hot을 쓰기엔 너무 많은 경우
예시)
import pandas as pd
# 예시 데이터
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'satisfaction': ['만족', '보통', '불만', '만족']
})
print("원본 데이터:")
print(df)

from sklearn.preprocessing import LabelEncoder
# Label Encoding
le = LabelEncoder()
df['satisfaction_encoded'] = le.fit_transform(df['satisfaction'])
print("\nLabel Encoding 결과:")
print(df)
le = LabelEncoder()로 따로 선언해줘야 합니다.
이후 fit_transform으로 'satisfaction_encoded'로 컬럼을 새로 만들어줍니다.

2) 데이터 스케일링 : 머신러닝에서 수치형 데이터의 단위를 맞추는 전처리 과정
- 머신러닝 모델은 입력 변수들의 크기 차이에 민감함
- 스케일이 크거나 단위가 다른변수는 모델이 편향되게 학습할 수 있음.
ex)
- 키(cm): 160~190 ⇒ 최대값과 최소값의 차이는 30
- 연봉(만원): 1,000~10,000 ⇒ 최대값과 최소값의 차이는 : 9000
→ 연봉이 압도적이므로 모델이 연봉만 보고 학습할 수 있음
방법.1 StandardScaler(표준화)

- x: 원본 값 5
- μ(뮤): 전체 데이터의 평균 2
- σ: 전체 데이터의 표준편차 1
- z: 변환된 값 (표준화된 값) 3
※ 사용시기
| 1. 데이터가 정규분포에 가깝거나 대칭적일 때 2. 값의 분포 자체를 보존하고 싶을때 -> 데이터의 모양은 유지하면서, 중심만 0으로 옮기고 크기만 1로 맞춘다는 의미 |
주의) 이상치가 있으면 평균과 표준편차가 흔들릴 수 있음.

방법.2 MinMaxScaler(정규화) : 각 값을 0~1 사이로 변환

※ 사용 시기
| 1. 값의 범위를 일정한 크기로 맞춰야 할때 2. 데이터 분포가 비정규형일때 |

3) 다중공선성 제거
다중공선성: 독립변수들 간에 강한 상관관계가 있는 경우
→ 선형모델에서 다중공선성이 있으면 모델이 예측하는데 불안정해지고, 해석이 어려워짐.
과접합: 모신러닝 모델이 학습 데이터에 지나치게 최적화 되어, 새로운 데이터에 대한 예측 성능이 저하되는 형상

※ 과접합을 방지하는 방법
| 1. 모델의 복잡도 줄이기 : 너무 많은 파라미터를 가진 모델 대신, 간단한 모델 사용 2. 더많은 훈련 데이터 확보 : 데이터가 많을 수록 모델이 훈련 데이터에 과도하게 맞추는 것을 방지할 수 있음. 3. 정규화 : L1, L2 정규화 같은 기법을 사용해 모델의 복잡도를 제어할 수 있음. 4. 교차검 : 모델을 여러 번 테스트하여 과적합 여부를 확인하고, 모델을 개선합니다. |
★ VIF 기반 변수제거
- VIF(Variance Inflation Factor) 값이 높으면 해당 변수는 다른 변수들과 높은 상관관계를 가짐
- 일반적으로 VIF 값이 10 이상이면 다중공선성이 높다고 판단하고 제거 고려
코드 예시
# VIF 계산 함수
def calculate_vif(X):
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i)
for i in range(X.shape[1])]
return vif_data.sort_values('VIF', ascending=False)
# 예시 데이터 생성
np.random.seed(42)
size = 100
# 독립변수 3개
X1 = np.random.normal(10, 5, size)
X2 = 2*X1 + np.random.normal(0, 1, size) # X1과 강한 상관관계
X3 = np.random.normal(5, 2, size)
# 데이터프레임 구성
df = pd.DataFrame({
"X1": X1,
"X2": X2,
"X3": X3
})
# VIF 계산 실행
vif_result = calculate_vif(df)
print(vif_result)
결과

★ 높은 상관계수를 계산하여 상관계수 0.9 이상인 변수 쌍 중 하나를 제거
1. 피어슨 상관행렬을 계산
2. 상관계수가 0.9 이상인 변수 쌍을 찾음
3. 도메인 지식이나 모델 성능을 고려하여 제거할 변수를 결정
★PCA 분석
1. 다중공선성이 높은 변수를 직접제거하지 않고, 새로운 축으로 변환하여 차원을 줄이는 방법
2. PCA를 사용하여 주요 정보를 유지하면서 변수를 축소
4) 데이터 분할: 모델을 훈련하고 평가하기 위해 데이터를 훈련 데이터와 테스트 데이터로 나누는것.
- 훈련데이터 : 모델 학습에 사용
- 테스트 데이터 : 모델이 본적없는 데이터로, 일반화 성능 평가
코드 예제)
import pandas as pd
from sklearn.model_selection import train_test_split
# 예시 데이터 생성
data = {
'feature1': range(100),
'feature2': range(100, 200),
'label': [0]*80 + [1]*20 # 불균형 데이터
}
df = pd.DataFrame(data)
# X(입력), y(출력) 분리
X = df[['feature1', 'feature2']]
y = df['label']
# 데이터 분할 (stratify로 클래스 비율 유지)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42)
# 결과 확인
print("훈련 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)

2. 오늘 해본 것
오늘은 베이직반 퀴즈를 해봤습니다.




3. 학습 후 느낀점
이제 오늘 해본 간단한 것들은 머리에서 쉽게 뽑아낼 수 있는 것같습니다.
대충 무슨 코드를 써야할지 감이 잡히고 있어서 간단한 전처리와 시각화는 자신있게 할 수 있을것같습니다.
그리고 머신러닝 부분 같은경우 기존 통계에 대한 지식이 있어서 어렵지 않게 따라가고 있습니다.
다만 코드사용에 대한 부분은 전처리, 시각화 처럼 충분한 경험이 있어야 가능할 것 같습니다.