4. Iris 데이터셋
from sklearn.model_selection import train_test_split
# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
- train_test_split:
- 데이터를 훈련(train)과 테스트(test)로 분리.
- test_size: 테스트 데이터 비율(0.2 = 20%).
- stratify=y: 클래스 비율을 고르게 유지(필수!).
- random_state=42: 실행마다 동일한 결과를 보장.
- 암기 포인트:
- train_test_split의 매개변수.
- stratify는 반드시 사용하여 데이터 분포가 유지되도록 설정.
5. 타이타닉 데이터
결측치 처리:
from sklearn.impute import SimpleImputer
# imputer 객체 생성 (최빈값 사용)
imputer = SimpleImputer(strategy='most_frequent')
# fit: 결측치 처리 기준 학습, transform: 실제 처리
X_imputed = imputer.fit_transform(X)
- SimpleImputer의 strategy 옵션:
- mean: 평균값 대체.
- median: 중앙값 대체.
- most_frequent: 최빈값 대체.
- fit_transform: 학습과 적용을 한 번에 실행.
Null 값 직접 처리:
# 결측치를 0으로 대체
df['column_name'].fillna(0, inplace=True)
- fillna(값): 결측치 대체.
- inplace=True: 원본 데이터 직접 수정.
6. 정규화(Normalization):
from sklearn.preprocessing import MinMaxScaler
# 정규화 객체 생성
scaler = MinMaxScaler()
# 데이터를 0~1로 변환
normalized_data = scaler.fit_transform(data)
- 정규화는 데이터 범위를 0~1로 스케일링.
- MinMaxScaler:
- 데이터를 최소값 0, 최대값 1로 변환.
- 예제:
movie = {'naver': [2, 4, 6, 8, 10], 'netflix': [1, 2, 3, 4, 5]}
cf. 정규화와 규제의 차이:
- 정규화(Normalization):
- 데이터 스케일을 조정.
- 규제(Regularization):
- 모델 학습 시 가중치(weight)에 제약을 추가해 과적합 방지.
- L1 규제: LASSO(마름모 모양).
- L2 규제: Ridge(원 모양).
특성 | Ridge | Lasso |
정규화 유형 | L2(제곱합) | L1(절댓값 합) |
가중치 | 작게 만듦. | 일부 가중치를 0으로 설정. |
특성 선택 | 상관관계 높은 특성 유지 | 상관 관계 높은 특성 중 일부 선택 |
사용 사례 | 모든 특성 사용 | 중요한 특성만 사용 |
수식 | $Penalty(w) = \|w\|_2^2 = \sum_{i=1}^n w_i^2$ | $Penalty(w) = \|w\|_1 = \sum_{i=1}^n |w_i|$ |
7. 표준편차(Standard Deviation)
1. 표준편차의 정의
- : 표준편차.
- $x_i$: 각 데이터 값.
- $\bar{x}$: 데이터의 평균.
- : 데이터의 개수.
- 설명:
- 표준편차는 분산의 제곱근으로 정의되며, 분산은 데이터가 평균으로부터 떨어진 정도를 제곱해 평균을 구한 값.
- 표준편차가 작을수록 데이터가 평균값 주변에 모여 있음.
- 표준편차가 클수록 데이터의 흩어짐이 큼.
2. 표준편차 계산 예제
- 데이터: [50, 80, 100, 40, 70]
1) 평균 계산:
$$\bar{x} = \frac{\sum_{i=1}^{N} x_i}{N} = \frac{50 + 80 + 100 + 40 + 70}{5} = 68$$
2) 분산 계산:
분산=$$\text{분산} = \frac{\sum_{i=1}^{N} (x_i - \bar{x})^2}{N} = \frac{(50-68)^2 + (80-68)^2 + (100-68)^2 + (40-68)^2 + (70-68)^2}{5}$$
$$\text{분산} = \frac{324 + 144 + 1024 + 784 + 4}{5} = 456$$
3) 표준편차 계산:
$$\sigma = \sqrt{\text{분산}} = \sqrt{456} \approx 21.37$$
3. 코드 상세 설명
1. 데이터 입력 및 정렬:
score.sort()
print(f"최솟값: {score[0]}, 최댓값: {score[-1]}")
- 사용자로부터 데이터를 입력받아 리스트에 저장.
- 입력된 데이터를 오름차순으로 정렬하여 최솟값과 최댓값 확인.
2. 최댓값/최솟값 제외 평균 계산:
슬라이싱으로 최솟값과 최댓값 제거:
filtered_score = score[1:-1]
평균 계산:
mean = sum(filtered_score) / len(filtered_score)
3. 분산 계산:
variance = sum((x - mean) ** 2 for x in filtered_score) / len(filtered_score)
4. 표준편차 계산:
분산의 제곱근으로 표준편차 계산:
std_dev = math.sqrt(variance)
4. 주의할 점
- 입력 데이터가 너무 적으면 최댓값/최솟값 제외 시 계산이 어려울 수 있음 → 최소 3개 이상의 데이터 필요.
- 데이터 타입이 정수인지 확인 → 입력값이 숫자인지 체크 필요.
5. 확장 개념
- 평균과 표준편차를 활용한 이상치 탐지:
- 이상치 기준: $\bar{x} \pm 2\sigma$ 범위를 벗어나는 데이터.
lower_bound = mean - 2 * std_dev
upper_bound = mean + 2 * std_dev
outliers = [x for x in score if x < lower_bound or x > upper_bound]
print(f"이상치: {outliers}")
8. 가상쇼핑몰 데이터
데이터 전처리:
- Null 값 제거: pd.notnull().
- 조건 필터링: df[df['column'] > 0].
# Null 제거
retail = retail[pd.notnull(retail['CustomerID'])]
# 수량과 가격이 0보다 큰 데이터만 사용
retail = retail[retail['Quantity'] > 0]
retail = retail[retail['UnitPrice'] > 0]
# 새로운 컬럼 추가
retail['CheckoutPrice'] = retail['Quantity'] * retail['UnitPrice']
매출 분석:
- groupby로 특정 컬럼 기준으로 데이터를 집계.
# 전체 매출
total_revenue = retail['CheckoutPrice'].sum()
# 국가별 매출
rev_by_countries = retail.groupby('Country')['CheckoutPrice'].sum()
9. 텐서플로우와 케라스
import tensorflow as tf
from tensorflow import keras
# 버전 확인
print(tf.__version__, keras.__version__)
- 텐서플로우와 케라스는 딥러닝 개발의 핵심 라이브러리.
Tensor 생성:
# Tensor 생성
x = tf.constant([[1.0, 2.0], [3.0, 4.0]])
print(x)
- tf.constant: 상수 텐서 생성.
- 텐서는 다차원 배열로 표현됨.
속성 변경:
tensor = tf.random.normal((3, 4))
tensor = tf.reshape(tensor, (4, 3)) # 차원 재구성
tensor = tf.cast(tensor, tf.int32) # 데이터 타입 변경
- Tensor 생성/변환:
- tf.constant(), tf.convert_to_tensor() 사용.
- 텐서를 Numpy 배열로 변환 시 .numpy().
- 속성 확인 및 변경:
- tensor.shape, tensor.dtype 확인.
- tf.reshape(), tf.cast()로 변경.
- Variable:
- tf.Variable() 생성.
- 값 변경: assign(), assign_add(), assign_sub().
- 연산:
-
- 기본: tf.add(), tf.multiply(), tf.matmul().
- 축별 합계: tf.reduce_sum(tensor, axis=0).
- 0축 (axis=0): 행(Row) 방향.
- 데이터가 세로로 쌓이는 방향.
- axis=0은 열(Column)끼리 연산을 수행.
- 1축 (axis=1): 열(Column) 방향.
- 데이터가 가로로 쌓이는 방향.
- axis=1은 행(Row)끼리 연산을 수행.
- 2축 이상 (axis=2, axis=3):
- 3차원 이상의 배열에서 축의 순서에 따라 연산 방향이 결정됨.
- (axis=-1):
- 마지막 축 기준 연산.
- 0축 (axis=0): 행(Row) 방향.
- 생성 함수:
- 1/0 채우기: tf.ones(), tf.zeros().
- 랜덤 값: tf.random.uniform(), tf.random.normal().