Today I learned
1. QAQC 문제풀이
1) One-Hot Encoding 적용하기
|
import pandas as pd
data = {
'고객ID': [101, 102, 103, 104, 105],
'성별': ['남', '여', '여', '남', '여'],
'회원등급': ['Silver', 'Gold', 'Gold', 'Bronze', 'Silver']
}
df = pd.DataFrame(data)
#One-Hot Encoding
df_encoded = pd.get_dummies(df,columns = ['성별', '회원등급'])
print(df_encoded)
|
![]() |
2) StandardScaler를 이용한 연속형 변수 표준화
|
import pandas as pd
sales = pd.DataFrame({
'상품ID': ['A01', 'A02', 'A03', 'A04', 'A05'],
'가격': [12000, 18000, 15000, 22000, 13000],
'판매량': [35, 50, 45, 60, 40]
})
#standard scaling
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_values = scaler.fit_transform(sales[['가격', '판매량']])
sales['가격_scaled'] = scaled_values[:, 0]
sales['판매량_scaled'] = scaled_values[:, 1]
sales
|
![]() |
3) Train/Test 데이터 분할하기
|
import pandas as pd
from sklearn.model_selection import train_test_split
customer = pd.DataFrame({
'나이': [25, 32, 47, 51, 38, 44, 29, 31],
'연봉': [3500, 4800, 6200, 7000, 5400, 5900, 4000, 4500],
'구매여부': [0, 1, 1, 1, 0, 1, 0, 0]
})
# X(입력), Y(출력) 분리하기
X = customer[['나이','연봉']]
y = customer['구매여부']
#데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state =42)
#결과
print("X_train shape:", X_train.shape)
print("X_test shape:", X_test.shape)
print("y_train shape:", y_train.shape)
print("y_test shape:", y_test.shape)
|
![]() |
4) 평균이 100, 표준편차가 15인 정규분포에서 ±1, 2, 3σ 범위를 시각화하세요.
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
mu = 100
sigma = 15
x = np.linspace(mu - 6*sigma, mu + 6*sigma , 1000)
y = stats.norm.pdf(x, mu, sigma)
plt.plot(x, y)
for i in range(1,4):
plt.axvline(mu - i*sigma, color='r', linestyle='--')
plt.axvline(mu + i*sigma, color='r', linestyle='--')
plt.title("정규분포 및 ±σ 경계선")
plt.show()
|
![]() |
5) PDF vs KDE
|
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import seaborn as sns
# 1. 정규분포에서 샘플 100개 생성
data = np.random.normal(loc=100, scale=5, size=100) # (1), (2)
# 2. x축 범위 생성
x = np.linspace(80, 120, 200)
# 3. 이론 PDF 계산
pdf = norm.pdf(x, loc=100, scale=5) # (3), (4)
# 4. 시각화
plt.figure(figsize=(8,5))
sns.kdeplot(data, label="KDE (실제 샘플)", fill=True)
plt.plot(x, pdf, label="PDF (이론 분포)", linestyle='--')
plt.title("정규분포 PDF vs. 샘플 기반 KDE")
plt.xlabel("측정값")
plt.ylabel("밀도")
plt.legend()
plt.show()
|
![]() |
6) Z-score
|
import pandas as pd
# 온도 센서 측정값 12개
data = {
"temperature": [23.4, 24.1, 22.8, 23.9, 24.5, 23.7, 100.0, 24.0, 23.8, 22.9, 23.6, 24.2]
}
df = pd.DataFrame(data)
df["z_score"] = (df["temperature"] - df["temperature"].mean()) / df["temperature"].std()
# Z-score가 절댓값 ___ 이상인 값을 이상치로 간주
outliers = df[ df["z_score"].abs() > 3 ]
print(outliers)
|
![]() |
7) 정규화 vs 표준화 비교 및 시각화
|
import matplotlib.pyplot as plt
# 표준화
df["temperature_std"] = (df["temperature"] - df["temperature"].mean()) / df["temperature"].std()
# 정규화 (min-max)
df["temperature_minmax"] = (df["temperature"] - df["temperature"].min()) / (df["temperature"].max() - df["temperature"].min())
plt.plot(df["temperature"], label="original")
plt.plot(df["temperature_std"], label="standardized")
plt.plot(df["temperature_minmax"], label="min-max")
plt.legend()
plt.title("온도 원본 / 표준화 / 정규화 비교")
plt.show()
|
![]() |
8) 바이올린플롯
|
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
"process": ["A"]*6 + ["B"]*6,
"weight": [101, 102, 100, 99, 98, 102, 120, 121, 122, 119, 118, 121]
})
# 바이올린플롯으로 공정별 분포 시각화
sns.violinplot(x="process", y="weight", data=df) # (1)
plt.title("공정별 제품 무게 분포")
plt.show()
|
![]() |
2. 머신러닝의 이해와 라이브러리 활용 기초
더보기



1-6) 선형회귀
- 선형회귀 유도하기
| 샘플 데이터 | |
|
weights = [87,81,82,92,90,61,86,66,69,69]
heights = [187,174,179,192,188,160,179,168,168,174]
import pandas as pd
import matplotlib.pyplot as plt
plt.scatter(weights, heights)
plt.title('Weights vs heights')
plt.xlabel('weights(kg)')
plt.ylabel('heights(cm)')
|
![]() |
![]() |
- 어떤 직선이 데이터를 잘 설명한다고 말 할 수 있는가 - Red? 근데 기준이 뭐임?? |
![]() |
- 직선과 점의 거리를 계산하고, Error라고 하자. 1) 실제 데이터값 - 직선의 예측 값 = Error ① 188.0 - 186.3 = +1.7 ② 174.0 - 179.4 = -5.4 ③ 174.0 - 169.0 = 5.0 모든 점에 대한 에러 계산 가능 = 각 데이터들을 잘 설명하는 직선이다. 2) 각 error를 제곱하여 모두 더하기 ① ② ③ 을 제곱하여 모두 더하기 - 오차의 합이 가장 적은 직선이 '그래프를 가장 잘 설명하는 직선' 3) 전체 에러 합에 대하여 데이터의 갯수로 나누기 = '오차 합 평균' |
- 선형회귀 이론
- y는 종속변수, 결과변수 = 알고싶은 값
- x는 독립변수, 원인변수 = y에 영향을 주는 변수
| 선형회귀 식 | |
| 통계학에서 사용 | 머신러닝에서 사용 |
| Y = β0 + β1X + ε | Y = wX + b |
| - β0: 편향 - β1: 회귀 계수 - ε: 에러 |
- w: 가중치 - b: 편 |
1-7) 회귀분석의 평가 지표
- MSE
| 에러의 정의 | |
| 정의 방법 | 수식 |
| 에러 = 실제 데이터 - 예측 데이터 | |
| 에러를 제곱하여 모두 양수로 만들고 다 합침 | ![]() |
| 데이터만큼 나누기 = Mean Squared Error (MSE) |
![]() |
※ 항상 MSE를 최소화 하는 방향으로
- R square
- 선형 회귀만의 평가 지표
- 기초 용어



3. [라이브세션]머신러닝 오프닝 3회차
- VIF 복습
- VIF는 독립변수들끼리 얼마나 상관성이 높은지 확인하는 지표
- 1 : 공선성 없음
- 1~5 사이 : 약한 공선성
- 5 초과 : 공선성 의심
- 100 초과: 심각한 공선성
|
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm
# 예시 데이터 (X1, X2, X3는 독립 변수라고 가정)
data = pd.DataFrame({
'X1': [10, 20, 30, 40, 50],
'X2': [15, 25, 35, 45, 55],
'X3': [12, 22, 33, 44, 53]
})
# 1. 독립 변수 행렬 준비
X = data[['X1', 'X2', 'X3']]
# data 분석에 사용할 컬럼 X1, X2, X3만 뽑아 X라는 새로운 데이터프레임을 만듦# 2. VIF 계산용 틀 만들기 VIF = pd.DataFrame()
VIF['변수'] = X.columns
# VIF 라는 결과표를 만들고 첫 열에는 변수이름 X1, X2, X3를 넣음 #3. VIF 값 계산 VIF['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
# X.shape[1] : X의 열 갯수for i in range (X.shape[1]):
print(i)
VIF
|
![]() 변수들이 거의 선형관계에 놓여있어 VIF 값이 무한대 또는 매우 큰 값이다. |
- 회귀분석
- 종속변수(목표 변수)와 독립변수(설명 변수)간의 관게를 모델링, 예측
- 종속변수: 우리가 예측하고자 하는 변수 y값
- 독립변수: 종속변수에 영향을 미치는 변수 X값
- 선형회귀: 데이터를 기반으로 함수 형태의 관계를 도출
| 선형회귀 예시 | |
|
# 라이브러리 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
|
sklearn에서 다음 라이브러리를 불러온다. - LinearRegression : 선형회귀 - train_test_split: 데이터 스플릿 - mean_squared_error: MSE 계산 |
|
# 데이터 준비
X = [[1], [2], [3], [4], [5]]
y = [2, 4, 6, 8, 10]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
데이터를 준비하고, 8:2의 비율로 테스트 데이터/ 훈련 데이터를 나눔 |
|
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
#모델을 학습시킬 때 테스트 데이터는 사용하지 않는다
# 지도학습 문제랑 정답을 다 줘야 한다
#여기까진 훈련만 시킨거
|
![]() |
|
#예측 및 평가
y_pred = model.predict(X_test) # 정답(y_test)는 주지 않ㅇ므.
y_pred
X_test
|
y_pred(5 개 값 중 테스트에 사용되지 않은 값) = 4 X_test = 2 |
|
print("MSE:", mean_squared_error(y_test, y_pred))
print("회귀계수 w : ", model.coef_)
print("절편 b:", model.intercept_)
|
![]() 현제 우리 모델은 y = 2x 라는 얘기 |
|
# 그래프 그리기
plt.scatter(X, y, color='blue', label='Actual data') # 실제 데이터
plt.plot(X, model.predict(X), color='red', label='Regression line') # 회귀선
plt.scatter(X_test, y_test, color='orange', label='Test data') # 테스트 데이터
plt.title("Linear Regression Visualization")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
|
![]() |
- 다중선형회귀
| 데이터 예시 | |
|
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
|
sklearn에서 다음 라이브러리를 불러온다. - LinearRegression : 선형회귀 - train_test_split: 데이터 스플릿 - mean_squared_error: MSE 계산 |
|
# 데이터 생성 독립 변수 (x1, x2)
X = np.array([[1, 2], [2, 3], [3, 5], [4, 6], [5, 8]])
# 종속 변수 (y)
y = np.array([3, 5, 7, 9, 11])
# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
데이터를 준비하고, 마찬가지로 8:2 비율로 데이터 분리 |
|
model = LinearRegression()
|
모델은 선형회귀로 |
|
model.fit(X_train, y_train)
|
fit()은 훈련시키는 코드 fit(독립변수, 종속변수) 형태로 사용 |
|
model.predict(X_test)
|
|
|
print(X_test)
print(y_test) # 오차 없다!
|
[[2 3]] [5] |
|
print("회귀계수 w : ", model.coef_)
print("절편 b:", model.intercept_)
|
![]() y = 2.00000000e+00 * x + 1.46823416e-15* x1 + 0.9999999999999947
|
- 모델 성능평가
- MSE(Mean Square Error)
- RMSE(Root Mean Square Error)
| 데이터 예시 | |
|
#MSE
from sklearn.metrics import mean_squared_error
# 예시 데이터 (실제 값과 예측 값)
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
# MSE 계산
mse = mean_squared_error(y_true, y_pred)
# 결과 출력
print("MSE:", mse)
|
MSE: 0.375
|
|
#RMSE: MSE에 루트 씌움
from sklearn.metrics import mean_squared_error
import numpy as np
# 예시 데이터 (실제 값과 예측 값)
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
# MSE 계산
mse = mean_squared_error(y_true, y_pred)
# RMSE 계산 (MSE의 제곱근)
rmse = np.sqrt(mse)
# 결과 출력
print("RMSE:", rmse)
|
RMSE: 0.6123724356957945
|
- 따로 공부해볼 것들
- 릿지회귀: L2 정규화 벌점을 주며 각 가중치를 동등하게 만든다.
- 라쏘회귀: L1 정규화 벌점을 주며, 불필요한 칼럼의 가중치를 0으로 만들어 없앤다.
- 엘라스틱넷: L2+L1 정규화를 합친 회귀로, 둘의 비율을 결정할 수 있다.
'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글
| TIL_251029 (1) | 2025.10.29 |
|---|---|
| TIL_251028 (0) | 2025.10.28 |
| TIL_251024 (0) | 2025.10.24 |
| TIL_251023 (0) | 2025.10.23 |
| TIL_251022 (0) | 2025.10.22 |



















