빅데이터 QAQC_3기/빅데이터 QAQC_3기 TIL

TIL_251024

usungusung 2025. 10. 24. 20:31

Today I learned

 

1. 머신러닝의 이해와 라이브러리 활용 기초

 


2. [라이브세션] 기초통계-기술통계 2회 복습

 

1) 확률변수

  • 이산형 확률변수
    • 셀수 있는 값만 가짐
    • ex) 하루 동안 발생한 결함의 수, 불량품의 갯수
  • 연속형 확률변수
    • 실수값처럼 무한히 많은 값 중 하나를 가질 수 있는 변수
    • ex) 제품의 길이, 무게, 온도

2) 확률 분포

구분 확률분포 이름 주요 특징 확률질량함수(PMF) / 확률밀도함수(PDF) 형태 대표 예시

구분 확률분포 이름 주요 특징 확률질량함수/확률밀도함수 예시
이산확률변수 베르누이 분포 (Bernoulli) 두 가지 결과(성공/실패)를 가지는 단일 시행 ( P(X=1)=p,\ P(X=0)=1-p ) 동전 한 번 던지기 (앞/뒤)
이항분포 (Binomial) 독립된 베르누이 시행을 n번 반복 ( P(X=k)=\binom{n}{k}p^k(1-p)^{n-k} ) 10번 던져 3번 성공할 확률
포아송 분포 (Poisson) 단위 시간·공간당 사건 발생 횟수 ( P(X=k)=\frac{λ^k e^{-λ}}{k!} ) 1시간당 전화 수, 결함 개수
기하분포 (Geometric) 처음 성공이 나올 때까지 시행 횟수 ( P(X=k)=p(1-p)^{k-1} ) 처음 성공이 나올 때까지 동전 던지기
음이항분포 (Negative Binomial) r번째 성공이 나올 때까지 시행 횟수 ( P(X=k)=\binom{k-1}{r-1}p^r(1-p)^{k-r} ) r번째 성공까지 필요한 시행 횟수
다항분포 (Multinomial) 세 가지 이상 결과를 갖는 n번 시행 ( P(X_1,…,X_k)=\frac{n!}{x_1!…x_k!}p_1^{x_1}…p_k^{x_k} ) 주사위 n번 던지기 (1~6 눈의 빈도)
연속확률변수 정규분포 (Normal) 평균 μ, 분산 σ²를 가지는 종 모양 분포 ( f(x)=\frac{1}{\sqrt{2πσ^2}}e^{-\frac{(x-μ)^2}{2σ^2}} ) 키, 시험 점수, 오차 등
균등분포 (Uniform) 구간 내 모든 값이 같은 확률 ( f(x)=\frac{1}{b-a},\ a<x<b ) 랜덤 숫자 추출
지수분포 (Exponential) 포아송 과정의 사건 간격 시간 ( f(x)=λe^{-λx},\ x≥0 ) 고장까지의 시간, 대기시간
감마분포 (Gamma) 여러 지수분포의 합 ( f(x)=\frac{λ^α x^{α-1} e^{-λx}}{Γ(α)} ) 생존시간, 대기시간
카이제곱분포 (χ²) 정규분포 제곱합의 분포 ( f(x)=\frac{1}{2^{k/2}Γ(k/2)}x^{(k/2)-1}e^{-x/2} ) 분산 검정, 적합도 검정
t분포 (Student’s t) 표본평균의 분포 (소표본) 복잡한 형태(자유도 ν에 따라 다름) 평균 차이 검정 (t-검정)
F분포 (F) 두 분산의 비의 분포 복잡한 형태(자유도에 따라) 분산 비교 (분산분석, ANOVA)

 

 

3) PMF? PDF?

- PMF(Probability Mass Function)

  • 이산형 확률변수의 각 값에 대한 확률을 정의
  • 각 가능한 값에 대해 딱 그 값이 나올 확률을 제공
  • 예시) 주사위 눈, 동전 덙지기

- PDF(Probability Density Function)

  • 연속형 확률변수
  • 특정한 값으 확률은 0이고, 구간을 설정해야 확률값이 정의됨
  • CDF(누적 분포함수)는 어떤 확률변수 X가 x보다 작거나 같을 확률을 누적해서 나타내는 함수

- KDE(Kernal Density Estimation)

  • PDF가 주어지지 않았을 때 샘플 데이터만 가지고 PDF를 추정하는 방법
  • PDF처럼 연속형 변수의 분포를 추정하지만, 실제 데이터를 기반으로 비모수적으로 추정함
  • KDE는 데이터 기반 PDF 근사치

4) 확률분포의 종류 및 소개


 

3. [라이브세션] 머신러닝 오프닝 2회차

 

1) Encoding

  • 목적: 범주형 데이터를 숫자로 변환
    • 범주형 데이터: category or 이름으로 표현되는 데이터
    • ex) 성별: 남/녀, 지역: 서울/부산/대전
    • 머신러닝은 '숫자형' 데이터만 받는다.
  • A. OneHotEncoding
    • 순서 없는 범주에 사용
    • 각 범주를 새로운 열로 만들어 0과 1로 표시
OneHotEncoding 예시 데이터셋
import pandas as pd

# 1. 샘플 데이터프레임 생성
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'blood_type': ['A', 'B', 'O', 'AB']
})
# 2. One-Hot Encoding 적용 - **get_dummies**
df_encoded = pd.get_dummies(df, columns=['blood_type'])
print("\nOne-Hot Encoding 결과:")
print(df_encoded)
 

blood_type 별로 True/False 형태의 데이터를 얻을 수 있다. pandas 내의 get_dummies를 사용할것.

 

  • B. LabelEncoding
    • 순서 있는 범주에 사용 (low < medium < high, 초급 < 중급 < 고급 같은 사항들)
    • 문자형 데이터를 정수로 변환
    • 각 범주에 대해 고유한 정수값을 할당
LabelEncoding 예시 데이터셋
import pandas as pd
from sklearn.preprocessing import LabelEncoder # 선언을 먼저 해줘야 한다

# 예시 데이터
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'satisfaction': ['만족', '보통', '불만', '만족']
})

# Label Encoding
le = LabelEncoder()
df['satisfaction_encoded'] = le.fit_transform(df['satisfaction'])

print("\nLabel Encoding 결과:")
print(df)
 

※ LabelEncoder는 Scikitlearn에서 가져와서 선언해줘야 한다!

 

2) Scaling

  • 목적: 수치형 데이터의 단위를 맞춰 모델의 민감도 완화
    • 머신러닝 모델은 입력 변수들의 크기 차이에 민감함
    • 단위가 큰 변수는 모델이 편향되게 학습될 수 있음
  • A. StandardScaler
    • 각 값을 평균0, 표준편차 1로 변환 
    • 데이터가 정규분포에 가깝거나 대칭적일 때 사용
    • 데이터의 모양(분포 곡선)은 유지하며, 중심만 0으로 옮기고 크기만 1로 맞춘다는 의미

- x: 원본 값
- μ: 전체 데이터의 평균
- σ: 전체 데이터의 표준편차
- z: 변환된 값 (표준화된 값)

 

StandardScaler 예시
# standard scaling
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder

# 예시 데이터 (5개의 샘플, 2개의 특성)
X_train = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

# StandardScaler 초기화
scaler = StandardScaler()

# 데이터 표준화
X_train_scaled = scaler.fit_transform(X_train)

print(X_train_scaled)

※ 1~10까지 산포된 데이터가 5,6을 기준으로 한 정규분포 형태로 바뀜

※ X_train의 리스트에서 왼쪽과 오른쪽의 값을 따로 봐야 함

 

  • B. MinMaxScaler
    • 0~1 사이로 변환 - 정규분포가 아니어도 사용 가능
    • 값의 범위를 일정한 크기로 맞춰야 할 때
    • 데이터 분포가 비정규형일 때 사용
- x' : 변환값
- x : 원본값
- x min: x의 최솟값
- x max: x의 최댓값

 

 

MinMaxScaler 예시
#minmax scaling
from sklearn.preprocessing import MinMaxScaler

# 예시 데이터 (5개의 샘플, 2개의 특성)
X_train = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

# MinMaxScaler 초기화
scaler = MinMaxScaler()

# 데이터 정규화
X_train_scaled = scaler.fit_transform(X_train)

print(X_train_scaled)

 

 

3) 다중공선성 제거

  • 독립변수간 강한 상관관계가 있는 경우를 의미
  • 선형 모델에서 다중공선성이 있으면 예측과 해석이 어려워짐. - 비선형 모델에서는 적게 받는 경향이 있다
    • 영향 받는 선형 모델: 선형회귀, 로지스틱 회귀
    • 다만, 비선형 모델에서도 다중공선성이 문제될 수 있는 경우가 있음.
      • 불필요한 변수가 많아져 모델의 복잡도 증가(과적합)
더보기

과적합(overfitting): 머신러닝 모델이 학습 데이터에 지나치게 최적화되어 새로운 데이터에 대한 예측 성능이 저하되는 현상

발생 원인

    • 너무 많은 파라미터, 너무 깊은 신경망 사용 시
    • 훈련 데이터가 부족할 때
    • 노이즈가 많을 떄

방지하는 법!

  • 모델의 복잡도 줄이기
  • 더 많은 훈련 데이터 확보하기
  • 정규화 - 모델의 복잡도 제어하기
  • 교차검증
  • A. VIF (Varience Inflation Factor) 기반 변수 제거하기
    • VIF값이 높으면 해당 변수는 다른 변수들과 높은 상관관계를 가지게 됨 
    • VIF 10 이상 변수 제거
VIF 기반 변수 제거 예시
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 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)
변수 X1과 X2의 VIF가 유사하고 높다
-> 둘 중 하나의 변수를 제거해야 한다.






  • B. 상관관계 0.9 이상 변수 제거
  • C. PCA로 차원 축소
  • D. 해석이 목적이면 제거 필요 / 예측이 목적이면 트리모델은 영향이 적다.

 

 

4) 데이터 분할

  • 목적: 모델 학습과 테스트 데이터 분리 - 과적합 방지
  • train_test_split()
  • 보통 비율: 7:3 or 8:2
데이터 분할 예시
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)
훈련 데이터: 모델 학습에 사용

테스트 데이터: 모델이 본 적이 없는 데이터로, 일반화 성능 평가 용도
결과:


훈련 데이터 크기: (70, 2)
테스트 데이터 크기: (30, 2)

'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글

TIL_251028  (0) 2025.10.28
TIL_251027  (0) 2025.10.27
TIL_251023  (0) 2025.10.23
TIL_251022  (0) 2025.10.22
TIL_251021  (0) 2025.10.21