주차를 나눠서 TIL작성을 하는 것이 좋을 것 같아서
나눠서 작성한다.
https://justdata.tistory.com/47
TIL_24.08.06_ 유의성 검정
A/B 검정(A/B 테스트)두 버전 (A와 B) 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정 방법마케팅, 웹사이트 디자인 등에서 많이 사용됨.사용자들을 두 그룹으로 나누고, 각 그룹에 다른
justdata.tistory.com
4.1 단순선형회귀
- 하나의 독립변수(x)와 하나의 종속 변수(y) 간의 관계를 직선으로 모델링하는 방법
- 특징
- 독립 변수의 변화에 따라 종속 변수가 어떻게 변화하는지 설명하고 예측
- 데이터가 직선적 경향을 따를 때 사용
- 간단하고 해석이 용이
- 데이터가 선형적이지 않을 경우 적합하지 않는다.
- 광고비(x)와 매출(y) 간의 관계 분석
- 현재의 광고비를 바탕으로 예상되는 매출을 예측 가능
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("결정 계수 (R^2):", r2)
# 시각화
plt.scatter(x,y,color='blue')
plt.plot(x_test, y_pred, color = 'red', linewidth = 2)
plt.title('linear regression')
plt.xlabel('x : cost')
plt.ylabel('y : sales')
plt.show()
4.2 다중선형회귀
- 두 개 이상의 독립 변수 (x1,x2,....,xn)와 하나의 종속변수 (y)간의 관계를 모델링.
- 여러 독립 변수의 변화를 고려하여 종속 변수를 설명하고 예측.
- 종속 변수에 영향을 미치는 여러 독립변수가 있을 때 사용
- 여러 변수의 영향을 동시에 분석할 수 있다.
- 변수들 간의 다중 공선성 문제가 발생할 수 있다.
- 다중공선성(Multicollinearity)은 회귀분석에서
- 독립변수들 간에 높은 상관관계가 있는 경우를 말합니다.
- 이는 회귀분석 모델의 성능과 해석에 여러가지 문제를 일으킬 수 있다.
- 독립변수들이 서로 강하게 상관되어 있으면,
- 각 변수의 개별적인 효과를 분리해내기 어려워져 회귀의 해석을 어렵게 만든다.
- 다중공선성으로 인해 실제로 중요한 변수가 통계적으로 유의하지 않게 나타날 수 있다.
- 어떻게 진단할 수 있을까?
- 가장 간단한 방법은 상관계수를 계산하여
- 상관계수가 높은 (약 0.7) 변수들이 있는지 확인해볼 수 있다.
- 더 정확한 방법으로는 분산 팽창 계수(VIF)를 계산하여
- VIF값이 10이 높은지 확인하는 방법으로 다중공선성이 높다고 판단 할 수 있다.
- 다중공선성 해결 방법
- 가장 간단한 방법으로는 높은 계수를 가진 변수 중 하나를 제거하는 것
- 혹은 주성분 분석(PCA)과 같은 변수들을 효과적으로 줄이는
- 차원 분석 방법을 적용하여 해결할 수 있다
4.3 범주형 변수
회귀에서 범주형 변수의 경우 특별히 변환을 해주어야 한다.
범주형 변수
- 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수가 범주형 변수
범주형 변수 종류
- 예를 들어 성별(남,여), 지역(도시, 시골)등이 있으며, 더미 변수로 변환하여 회귀 분석에 사용
- 순서가 있는 범주형 변수
- 옷의 사이즈(L,M,...), 수능 등급(1등급, 2등급,...)과 같이 범주형 변수라도 순서가 있는 변수에 해당
- 이런 경우 각 문자를 임의의 숫자로 변환해도 문제가 없다 (순서가 잘 반영될 수 있게 숫자로 변환)
- 순서가 없는 범주형 변수
- 성별(남,여), 지역(부산,대구, 대전,...)과 같이 순서가 없는 변수에 해당한다.
- 2개 밖에 없는 경우 임의의 숫자로 바로 변환해도 문제가 없지만
- 3개 이상인 경우에는 무조건 원-핫 인코딩(하나만 1이고 나머지는 0인 벡터)변환을 해주어야 한다.
- -> pandas의 get_dummies를 활용하여 쉽게 구현 가능
- 순서가 있는 범주형 변수
# 예시 데이터 생성
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)
# drop_first란 범주형 변수 개수 중 1개를 빼는 것
# 어차피 마지막 1개 변수는 있으니 마나한 존재이기 때문
# 다중 공선성 문제도 막아줄 수 있다.
# 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_)
# -- 회귀계수 : [2.57281553, -6.01941748]
# -- 절편 : 40.63106796
# 모델 평가
mse = mean_squared_error(y,y_pred)
r2 = r2_score(y,y_pred)
print("평균 제곱 오차(MSE):",mse)
print("결정 게수(R2):", r2)
# -- 평균 제곱 오차(MSE) : 3.1067961165
# -- 결정계수(R2) : 0.958
# 이 모형은 전체 데이터의 95%이상을 설명
4.4 다항회귀, 스플라인 회귀
다항회귀
- 독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용, 독립 변수의 다항식을 사용하여 종속 변수를 예측
- 데이터가 곡선적 경향을 따를 때 사용
- 비선형 관계를 모델링할 수 있다.
- 고차 다항식의 경우 과적합(overfitting)위험이 있다.
스플라인 회귀
- 독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링
- 구간마다 다른 다항식을 사용하여 전체적으로 매끄러운 곡선을 생성
다항회귀는 어떨 때 사용할까?
- 독립변수와 종속변수의 관계가 비선형 관계일 때 사용
- 주택 가격 예측(면적과 가격간의 비선형 관계)
ex) 다항회귀 예시
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)
# 2차식으로 만듦
x = x[:,np.newaxis]
# 다항 회귀 (2차)
polynomial_features = PolynomialFeatures(degree=2)
# 차수를 높이고 싶다면 'degree'뒤에 숫자를 올리면 된다.
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)
# -- 평균 제곱 오차(MSE) : 9.44744195
# -- 결정계수(R2) : 0.989887
# 이 모형은 전체 데이터의 98% 이상의 설명력을 갖는다.
# 시각화
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.xlabel('area')
plt.ylabel('price')
plt.title('Polynomial Regression')
plt.show()
'데이터분석 study > 통계학 기초' 카테고리의 다른 글
TIL_24.08.07_ 가설검정의 주의점 (0) | 2024.08.07 |
---|---|
TIL_24.08.07_상관계수 (0) | 2024.08.07 |
TIL_24.08.06_ 유의성 검정 (0) | 2024.08.06 |
TIL_24.08.05_ 모집단과 표본, 분포 정리 (0) | 2024.08.05 |
TIL_24.08.05_데이터 분석과 통계 (0) | 2024.08.05 |