데이터 분석 심화

Chapter.4 데이터 분석 심화(4)

devjjun 2026. 4. 16. 20:21

TIL(Today I Learned)


1️⃣통계학 기초 Chapter.4 & 5

단순선형회귀란?

  • 하나의 독립변수(X)와 하나의 종속변수(Y) 간의 관계를 직선으로 모델링하는 방법 

회귀식

  • Y = β0 + β1X, 여기서 β0는 절편, β1는 기울기

특징

  • 독립변수의 변화에 따라 종속변수가 어떻게 변하는지 설명하고 예측
  • 데이터가 직선적 경향을 따를 때 사용 

실습

더보기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

#예시 데이터 생성
np.random.seed(0)
X = 2* np.random.rand(100,1)
y = 4 + 3 * X + np.random.randn(100,1)

#데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=42)

#단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

#예측
y_pred = model.predict(X_test)

#회귀계수 및 절편 출력
print("회귀계수:",model.coef_)
print("절편:",model.intercept_)

#모델 평가
mse = mean_squared_error(y_test,y_pred)
r2 = r2_score(y_test,y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

#시각화
plt.scatter(X,y,color='blue')
plt.plot(X_test,y_pred,color='red',linewidth=2)
plt.title('linear regeression')
plt.xlabel('X : cost')
plt.ylabel('Y : sales')
plt.show()

다중선형회귀란?

  • 두 개 이상의 독립 변수(X1, X2, ..., Xn)와 하나의 종속 변수(Y) 간의 관계를 모델링.

회귀식

  • Y = β0 + β1X1 + β2X2 + ... + βnXn

특징

  • 여러 독립 변수의 변화를 고려하여 종속 변수를 설명하고 예측
  • 종속변수에 영향을 미치는 여러 독립변수가 있을 때 사용
  • 변수들 간의 다중공선성 문제 발생 가능
  • 📌다중공선성이란?
    • 회귀분석에서 독립변수 간에 높은 상관관계가 있는 경우를 지칭 
    • 회귀분석 모델의 성능과 해석에 문제 야기 가능성
    • 진단방법
      • 상관계수 계산을 통해 높은 변수들이 있는지 확인
      • 분산팽창계수 (VIF)를 계산하여 10이 높은지 확인하는 방법
    • 해결방법
      • 높은 계수를 가진 변수 중 하나를 제거
      • 주성분 분석(PCA)와 같은 효과적 변수 제거의 수단 

실습

  • 다양한 광고비(TV, Radio, Newspaper)과 매출 간의 관계 분석.
  • 현재의 광고비(TV, Radio, Newspaper)를 바탕으로 예상되는 매출을 예측 가능.
더보기
# 예시 데이터 생성
data = {'TV': np.random.rand(100) * 100,
        'Radio': np.random.rand(100) * 50,
        'Newspaper': np.random.rand(100) * 30,
        'Sales': np.random.rand(100) * 100}
df = pd.DataFrame(data)

# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 다중선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)

# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

범주형 변수란?

  • 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수가 범주형 변수

범주형 변수의 종류 

  • 순서가 있는 범주형 변수
    • 옷의 사이즈 (L, M, …), 수능 등급 (1등급, 2등급, ….)과 같이 범주형 변수라도 순서가 있는 변수에 해당한다
    • 이런 경우 각 문자를 임의의 숫자로 변환해도 문제가 없다 (순서가 잘 반영될 수 있게 숫자로 변환)
    • ex) XL → 3, L → 2, M → 1, S → 0
  • 순서가 없는 범주형 변수
    • 성별 (남,여), 지역 (부산, 대구, 대전, …) 과 같이 순서가 없는 변수에 해당한다
    • 2개 밖에 없는 경우 임의의 숫자로 바로 변환해도 문제가 없지만
    • 3개 이상인 경우에는 무조건 원-핫 인코딩(하나만 1이고 나머지는 0인 벡터)변환을 해주어야 한다 → pandas의 get_dummies를 활용하여 쉽게 구현 가능
    • ex) 부산 = [1,0,0,0], 대전 = [0,1,0,0], 대구 = [0,0,1,0], 광주 = [0,0,0,1]

실습

  • 범주형 변수를 찾고 더미 변수로 변환한 후 회귀 분석 수행
  • 성별, 근무 경력과 연봉 간의 관계.
  • 성별과 근무 경력이라는 요인변수 중 성별이 범주형 요인변수에 해당
  • 해당 변수를 더미 변수로 변환
  • 회귀 수행
더보기
# 예시 데이터 생성
data = {'Gender': ['Male', 'Female', 'Female', 'Male', 'Male'],
        'Experience': [5, 7, 10, 3, 8],
        'Salary': [50, 60, 65, 40, 55]}
df = pd.DataFrame(data)

# 범주형 변수 더미 변수로 변환 
df = pd.get_dummies(df,drop_first=True)

# 독립변수와 종속변수 설정
X = df[['Experience','Gender_Male']]
y = df['Salary']

# 단순선형회귀 모델 생성 및 훈련 
model = LinearRegression()
model.fit(X,y)

# 예측
y_pred = model.predict(X)

# 회귀계수 및 절편 출력 
print('회귀계수:',model.coef_)
print('절편:',model.intercept_)

# 모델 평가
mse = mean_squared_error(y,y_pred)
r2 = r2_score(y,y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

다항회귀

  • 독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용. 독립 변수의 다항식을 사용하여 종속 변수를 예측.
  • 데이터가 곡선적 경향을 따를 때 사용
  • 비선형 관계를 모델링할 수 있다.
  • 고차 다항식의 경우 과적합(overfitting) 위험이 있다.

스플라인 회귀 

  • 독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링
  • 구간마다 다른 다항식을 사용하여 전체적으로 매끄러운 곡선을 생성
  • 복잡한 비선형 관계를 유연하게 모델링할 수 있다.
  • 적절한 매듭점(knots)의 선택이 중요

실습 

  • 주택 가격 예측(면적과 가격 간의 비선형 관계)
더보기
from sklearn.preprocessing import PolynomialFeatures

# 예시 데이터 생성
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100)
X = X[:, np.newaxis]

# 다항 회귀 (2차)
polynomial_features = PolynomialFeatures(degree=2)
X_poly = polynomial_features.fit_transform(X)

model = LinearRegression()
model.fit(X_poly, y)
y_poly_pred = model.predict(X_poly)

# 모델 평가
mse = mean_squared_error(y, y_poly_pred)
r2 = r2_score(y, y_poly_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

# 시각화
plt.scatter(X, y, s=10)
# 정렬된 X 값에 따른 y 값 예측
sorted_zip = sorted(zip(X, y_poly_pred))
X, y_poly_pred = zip(*sorted_zip)
plt.plot(X, y_poly_pred, color='m')
plt.title('polynomial regerssion')
plt.xlabel('area')
plt.ylabel('price')
plt.show()

 

💡 느낀점

 

실습을 통해 학습한 모델링을 적용시켜보는 과정을 통해 어떠한 데이터에서 어떠한 방식으로 접근해야 하는지 이해할 수 있었다. mse나 r2 등의 평가를 통해 모델이 유의미한지 확인하는 이해하는 과정에 도움이 되었다. 직접 손으로 적어보는 실습 위주의 반복 학습을 통해 데이터에서 내가 원하는 부분을 추출, 전처리하고 데이터의 형식에 따라 모델링하는 순서를 묶어서 진행할 예정이다.