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

TIL_251027

usungusung 2025. 10. 27. 22:04

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