-
[3월 4주차-3/27(3)]통계 용어 정리+ 최소자승법을 이용한 회귀 분석 (OLS)Why Not SW CAMP 5기/수업 기록 2025. 3. 27. 17:07
기본 데이터와 평균, 편차의 평균
train = [[25,100,],[52,256],[38,152],[32,140],[25,150]] x = [i[0] for i in train] y = [j[1] for j in train] ## 평균 : mean(x) ## def mean(x): # 평균 return sum(x) / len(x) mean(x), mean(y) # (34.4, 159.6) ## 개별 값과 평군의 차 : d_mean(x) ## def d_mean(x): # 편차 x_mean = mean(x) return [i - x_mean for i in x] d_mean(x), d_mean(y)
내적
## 내적 : dot(x,y) ## def dot(x,y): return sum([x*y for x,y in zip(x,y)]) dot(x,y) # 29818
- 두 개의 화살표(벡터)를 곱해서 하나의 숫자를 얻는 방법.
- 두 화살표가 같은 방향을 가리키면 값이 크고 긍정적.
- 반대 방향을 가리키면 값이 크고 부정적.
- 직각일 경우 0이 된다. (독립적인 관계)
- 주로 데이터 유사도 측정, 효율성 계산 등에 사용.
분산
- 데이터들이 얼마나 흩어져 있는지를 나타내는 값.
- 데이터가 평균에서 얼마나 떨어져 있는지 계산 후, 제곱해서 평균을 구한 값.
- 값이 크면 데이터가 넓게 퍼져있다는 의미, 작으면 평균 근처에 몰려 있다는 의미.
표본 분산
## 제곱의 합 : sum_of_square(v) ## def sum_of_square(v): return dot(v,v) sum_of_square(x), sum_of_square(y) # (6422, 140740) ## 분산 : variance(x) ## def variance(x): # 편차 제곱의 평균 n = len(x) d = d_mean(x) return sum_of_square(d) / (n-1) variance(x) # 126.3
- 전체 집단의 일부 표본을 대상으로 흩어진 정도를 나타냄.
- 표본의 오차를 보정하기 위해 표본의 개수보다 하나 작은 수로 나눔.
- 값이 크면 데이터가 평균에서 많이 떨어져 있다는 의미.
모분산
- 전체 집단의 데이터가 얼마나 흩어져 있는지를 나타냄.
- 값이 작을수록 데이터가 평균값 근처에 몰려 있고, 값이 크면 멀리 떨어져 있다는 의미.
표준편차
## 표준편차 : standard_deviation(x) ## def standard_deviation(x): # 루트 분산 return variance(x) ** 0.5 standard_deviation(x) # 11.23
- 모분산의 제곱근.
- 데이터가 평균을 중심으로 얼마나 퍼져 있는지를 직관적으로 보여줌.
- 값이 작을수록 평균에 가깝게 모여 있고, 값이 클수록 멀리 흩어져 있다는 의미.
공분산
## 공분산 ## ''' 하나의 데이터가 증가할 때 다른 데이터도 함께 증가하는 경향이 있다면, 공분산은 양수 값 두 데이터 사이에 뚜렷한 관계가 없다면, 공분산은 0에 가까운 값 ''' def covariance(x,y): n = len(x) return dot(d_mean(x), d_mean(y)) / (n-1) covariance(x,y) # 591.7
- 두 데이터가 함께 변하는 관계를 나타냄.
- 양수: 함께 증가, 음수: 하나는 증가하고 다른 하나는 감소.
- 0에 가까울수록 관계가 적음.
상관계수
## 상관계수 ### ''' 공분산을 조금 더 보기 좋고 이해하기 쉽게 다듬은 개념. -1부터 +1 사이의 숫자 ''' def corrlation(x,y): stdev_x =standard_deviation(x) stdev_y =standard_deviation(y) if stdev_x > 0 and stdev_y >0: return covariance(x, y) / (stdev_x * stdev_y) else: return 0 corrlation(x, y)
- 공분산을 -1부터 +1 사이의 숫자로 정규화한 값.
- +1: 강한 양의 관계, -1: 강한 음의 관계, 0: 관계 없음.
Numpy로 기초 통계 구하기
## nupmy 로 기초 통계 구하기 import numpy as np x1 = np.array(x) x1.mean() x1.var() x1.std() np.cov(x1, y) np.corrcoef(x1,y)
최소자승법
- 흩어진 점들을 가장 잘 나타내는 선을 찾는 방법.
- 오차(예측값과 실제 값의 차이)의 제곱합을 최소로 만드는 선을 찾음.
- 선형 회귀 분석에서 많이 사용됨.
회귀 계수
## 회귀계수 구하기 ## def OLS(x,y): beta = covariance(x, y) / variance(x) alpha = mean(y) - beta * mean(x) return [alpha, beta] OLS(x, y) # 다른 방법 def OLS_fit(x,y): beta = (corrlation(x, y)* standard_deviation(y))/standard_deviation(x) alpha = mean(y) - beta * mean(x) return [alpha, beta] OLS_fit(x, y)
- 독립변수가 종속변수에 미치는 영향의 크기를 나타내는 값.
- 양수: 독립변수 증가 시 종속변수도 증가.
- 음수: 독립변수 증가 시 종속변수 감소.
- 값이 클수록 영향이 크다.
SSE (오차 제곱합)
## SSE(Error Sum of Squares) ## def SSE(alpha, beta, train, test): sse = 0 for i in test: error=(i[1]-(alpha + beta *i[0]))**2 sse = error+sse return sse SSE(alpha, beta, train, train) # 2291.0324623911324
- 예측 모델이 실제 데이터를 얼마나 잘 설명하는지 나타내는 값.
- 예측값과 실제 값의 차이를 제곱하여 모두 더한 값.
- 값이 작을수록 모델의 예측 정확도가 높다.
SST (총 제곱합)
## SST(Total Sum of Squares) ## def SST(alpha, beta, train, test): sst = 0 x = [i[0] for i in train] y = [j[1] for j in train] for i in test: sum_ds = (i[1] -mean(y)) **2 sst = sum_ds + sst return sst SST(alpha, beta, train, train) # 13379.2
- 전체 데이터의 변동성을 나타내는 값.
- 평균에서의 차이를 제곱하여 모두 더한 값.
- 모델의 예측 성능을 평가하는 데 사용.
결정계수 (R²)
## 결정계수 (R squared) def R_squared(alpha, beta, train, test): return 1.0-(SSE(alpha, beta, train, test)) / SST(alpha, beta, train, test) R_squared(alpha, beta, train, train) # 0.8287616253295315
- 예측 모델이 데이터를 얼마나 잘 설명하는지를 0에서 1 사이의 값으로 나타냄.
- 1에 가까울수록 예측 정확도가 높고, 0에 가까울수록 낮음.
경사하강법
- 최적의 값을 찾기 위해 현재 위치에서 가장 가파르게 내려가는 방향으로 이동하는 방법.
- 반복적으로 이동하며 손실 함수를 최소화하는 값을 찾음.
- 기계 학습에서 모델 학습에 사용됨.
최소자승법을 이용한 회귀 분석 (OLS)
최소자승법(Ordinary Least Squares, OLS)은 선형 회귀 모델을 학습하는 대표적인 방법 중 하나입니다. 주어진 데이터를 기반으로 두 변수 간의 관계를 직선으로 표현하고, 예측 모델을 구축합니다.
데이터 준비
train = [[25,100], [52,256], [38,152], [32,140], [25,150]] test = [[45,183], [40,175], [55,203], [28,152], [42,198]]
- train: 모델 학습을 위한 데이터 (X, Y) 쌍으로 구성됩니다.
- test: 학습된 모델의 예측 성능을 평가할 데이터입니다.
모델 학습 (OLS)
선형 회귀 모델을 만들기 위해 절편(alpha)과 기울기(beta)를 계산하는 함수. 즉 회귀 계수 구하는 함수
import numpy as np def OLS_fit(x, y): beta = (np.corrcoef(x, y)[0, 1] * np.std(y)) / np.std(x) alpha = np.mean(y) - beta * np.mean(x) return [alpha, beta] x = [i[0] for i in train] y = [i[1] for i in train] alpha, beta = OLS_fit(x, y)
모델 예측
def predict(alpha, beta, test): return [alpha + beta * i[0] for i in test] predicted = predict(alpha, beta, test)
모델 평가 (RMSE 계산)
예측값과 실제값의 차이를 제곱하고 평균을 낸 뒤 제곱근
from math import sqrt def RMSE(actual, predicted): sum_error = 0.0 for i in range(len(actual)): prediction_error = predicted[i] - actual[i] sum_error += (prediction_error ** 2) mean_error = sum_error / float(len(actual)) return sqrt(mean_error) actual = [j[1] for j in test] rmse_value = RMSE(actual, predicted)
결과 확인
print("예측값:", predicted) print("실제값:", actual) print("RMSE:", rmse_value)
예시 결과:
예측값: [209.26, 185.84, 256.11, 129.62, 195.21] 실제값: [183, 175, 203, 152, 198] RMSE: 28.76
결론
최소자승법을 이용하여 선형 회귀 모델을 학습하고 예측을 수행했습니다. RMSE 값을 통해 모델의 성능을 평가할 수 있으며, 데이터의 분포 및 크기에 따라 모델의 정확도가 달라질 수 있습니다. 추가적인 모델 개선 방법으로는 비선형 회귀 모델, 다중 회귀 모델, 정규화 기법 등을 고려할 수 있습니다.
'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[3월 5주차-3/31]🐍 Flask로 로그인 시스템 만들기 - 기초부터 실습까지! (0) 2025.03.31 [3월 4주차-3/28]경사하강법을 사용한 선형 회귀 학습 및 예측 평가 (0) 2025.03.31 [3월 4주차-3/27(1)]Titanic 생존 예측 모델 분석 (의사결정나무 & 로지스틱 회귀) (0) 2025.03.27 [3월 4주차-3/27(2)]다양한 모델 정리 (0) 2025.03.27 [3월 3주차-3/18]국민청원 데이터 분석 및 120다산콜재단 데이터 RNN 모델링 (0) 2025.03.19