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 |









