Today I Learned (TIL)/Python

[TIL] 통계학 기초 - 4주차

신짜린 2024. 8. 2. 19:11

1. 단순선형회귀

 하나의 독립 변수(X)와 하나의 종속 변수(Y)간의 관계를 직선으로 모델링하는 방법으로 간단하고 해석이 용이하여 데이터가 선형적이지 않을 경우 적합하지 않다.

 독립 변수의 변화에 따라 종속 변수가 어떻게 변화하는지 설명하고 예측하는 것이 특징이다.

 단순선형회귀 회귀식은 Y = β0 + β1X  β0 (β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, 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()

 

2. 다중선형회귀

 두 개 이상의 독립 변수(X1, X2, ..., Xn)와 하나의 종속 변수(Y) 간의 관계를 모델링하는 것으로 여러 독립 변수의 변화를 고려하여 종속 변수를 설명하고 예측한다.

 종속 변수에 영향을 미치는 여러 독립 변수가 있을 때 사용하여 여러 변수의 영향을 동시에 분석하기 때문에 변수들 간의 다중공선성 문제가 발생할 수 있다.

- 다중공선성

 회귀분석에서 독립 변수들 간 높은 상관관계가 있는 경우를 말한다.

 독립 변수들이 서로 강하게 상관되어 있으면 각 변수의 개별적인 효과를 분리해내기 어려워져 회귀의 해석을 어렵게 만들고 실제로 중요한 변수가 통계적으로 유의하지 않게 나타나는 등 성능과 해석에 여러가지 문제를 일으킬 수 있다.

 다중공선성은 상관계수 계산을 통해 상관계수가 높은 변수들이 있는지 확인하고 분산 팽창 계수(VIF)를 통해 진단할 수 있다.

 다중공선성 높은 상관계수를 가진 변수 중 하나를 제거하거나 주성분 분석(PCA)과 같이 변수를 효과적으로 줄이는 차원 분석 방법을 적용하여 해결할 수 있다.

# 예시 데이터 생성
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)

 

3. 범주형 변수

 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수를 말한다. 성별, 지역과 같은 것들이 있으며 이 데이터들은 더미 변수로 변환하여 회귀 분석에 사용한다.

 성별, 근무 경력과 연봉 간의 관계를 알아볼 때 성별이 범주형 요인변수로 이를 더미 변수로 변환하여 분석한다.

# 예시 데이터 생성
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)와 종속 변수(Y) 설정
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)

 

4. 다항회귀, 스플라인 회귀

- 다항회귀

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

 

- 스플라인 회귀

 독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링한다. 구간마다 다른 다항식을 사용하여 전체적으로 매끄러운 곡선을 생성한다. 때문에 데이터가 국부적으로 다른 패턴을 보일 때 사용하여 복잡한 비선형 관계를 유연하게 모델링할 수 있다..

 주낵 가격 예측과 같이 면적과 가격 간의 비선형 관계에 사용할 수 있다.

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()

'Today I Learned (TIL) > Python' 카테고리의 다른 글

[TIL] 통계학 기초 - 6주차  (0) 2024.08.05
[TIL] 통계학 기초 - 5주차  (0) 2024.08.05
[TIL] Python 챌린지 - 3, 4회차  (0) 2024.08.02
[TIL] 통계학 기초 - 3주차  (0) 2024.08.02
[TIL] 통계학 기초 - 2주차(2)  (0) 2024.08.01