티스토리 뷰
오늘은 파이썬을 활용한 상관분석과 회귀분석을 학습했습니다.
기초 통계 개념부터 함수 구현까지 직접 코드를 짜보면서, 통계 이론을 실제 코드로 해석하는 방법을 익힐 수 있었고,
마지막에는 시각화와 모델 평가까지 포함한 심화 회귀분석을 실습했습니다.
1. 기초 데이터 정의
우선 기본 데이터를 리스트로 정의하고, 독립변수(x)와 종속변수(y)를 분리해 저장했습니다.
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]
2. 기초 통계 함수 구현
2.1 평균 구하기 (mean)
def mean(x):
return sum(x) / len(x)
- 통계에서 기본이 되는 평균을 구하는 함수입니다.
- 추후 분산, 표준편차 등을 계산할 때도 활용됩니다.
2.2 편차 구하기 (d_mean)
def d_mean(x):
x_mean = mean(x)
return [i - x_mean for i in x]
- 각 데이터에서 평균을 뺀 편차를 구합니다.
- 회귀계수나 분산 계산 시 사용됩니다.
2.3 내적 구하기 (dot)
def dot(x, y):
return sum([x * y for x, y in zip(x, y)])
- 두 벡터의 내적을 구해주는 함수입니다.
- 공분산 및 회귀계수 계산 시 핵심적으로 사용됩니다.
2.4 제곱의 합 (sum_of_squares)
def sum_of_squares(v):
return dot(v, v)
- 벡터의 제곱합을 계산합니다.
- 분산, 표준편차 등에 사용됩니다.
2.5 분산 (variance)과 표준편차 (standard_deviation)
def variance(x):
n = len(x)
d = d_mean(x)
return sum_of_squares(d) / (n-1)
def standard_deviation(x):
import math
return math.sqrt(variance(x))
- 분산은 편차 제곱의 평균이고,
- 표준편차는 분산의 제곱근입니다.
2.6 공분산 (covariance)
def covariance(x, y):
n = len(x)
return dot(d_mean(x), d_mean(y)) / (n - 1)
- 두 변수의 변동이 얼마나 같이 변하는지를 나타냅니다.
2.7 상관계수 (correlation)
def correlation(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
- 공분산을 각 변수의 표준편차 곱으로 나눈 값입니다.
- 1에 가까울수록 정비례, -1에 가까울수록 반비례 관계입니다.
3. 회귀분석 (최소자승법)
3.1 회귀계수 구하기 (OLS, OLS_fit)
def OLS(x,y):
beta = covariance(x, y)/variance(x)
alpha = mean(y) - beta * mean(x)
return [alpha, beta]
def OLS_fit(x,y):
beta = (correlation(x, y)*standard_deviation(y))/standard_deviation(x)
alpha = mean(y) - beta * mean(x)
return [alpha, beta]
- OLS는 **Ordinary Least Squares (최소자승법)**입니다.
- alpha: 절편, beta: 기울기(회귀계수)
3.2 예측값 구하기 (predict)
def predict(alpha, beta, train, test):
predictions = []
for i in test:
yhat = alpha + beta * i[0]
predictions.append(yhat)
return predictions
- 추정된 alpha, beta를 활용해 예측값 리스트를 반환합니다.
3.3 시각화 (산점도 + 회귀선)
import matplotlib.pyplot as plt
plt.title('아파트 평수에 따른 전기 사용량')
plt.scatter(x, y, c='red') # 실제 데이터
plt.plot(x, predict(alpha, beta, train, train)) # 예측 회귀선
plt.xlabel('아파트 평형')
plt.ylabel('전기사용량')
plt.show()
- matplotlib을 이용해 회귀선을 시각화했습니다.
- 실제값과 예측 선의 관계를 직관적으로 확인할 수 있습니다.

4. 모델 평가 지표
4.1 SSE (오차 제곱합)
def SSE(alpha, beta, train, test):
sse = 0
for i in test:
error = (i[1] - (alpha + beta * i[0]))**2
sse += error
return sse
- 예측값과 실제값 차이의 제곱합
4.2 SST (총 제곱합)
def SST(alpha, beta, train, test):
sst = 0
y = [j[1] for j in train]
for i in test:
sst += (i[1] - mean(y))**2
return sst
- 전체 데이터의 총 변동성을 의미합니다.
4.3 결정계수 (R²)
def R_squared(alpha, beta, train, test):
return 1.0 - (SSE(alpha, beta, train, test) / SST(alpha, beta, train, test))
- 예측값이 실제 데이터를 얼마나 잘 설명하는지를 나타냅니다.
- 1에 가까울수록 설명력이 높습니다.
5. statsmodels로 회귀 결과 확인
import statsmodels.api as sms
_X = sms.add_constant(x)
model = sms.OLS(y, _X).fit()
print(model.summary())
- sms.add_constant(x)로 절편 추가
- .OLS(y, _X).fit()로 모델 학습
- .summary()로 회귀계수, 결정계수, p값 등 확인 가능
6. 테스트 데이터 예측 및 RMSE 평가
test = [[45,183],[40,175],[55,203],[28,152],[42,198]]
actual = [j[1] for j in test]
predicted = predict(alpha, beta, train, test)
RMSE (Root Mean Squared Error)
from math import sqrt
def RMSE(actual, predicted):
sum_error = 0.0
for i in range(len(actual)):
sum_error += (predicted[i] - actual[i])**2
mean_error = sum_error / len(actual)
return sqrt(mean_error)
RMSE(actual, predicted) # 예측 성능 확인
- 예측 오차의 제곱 평균의 제곱근
- 값이 작을수록 예측 성능이 좋음
7. 결론 및 정리
7.1 오늘 배운 내용
오늘은 상관관계 분석부터 단순 선형 회귀분석까지의 전 과정을 Python 코드로 구현하고 해석하는 연습을 진행했습니다.
단순히 함수를 쓰는 것을 넘어서, 각 통계적 개념을 수식 없이 코드로 구현해보면서 실제 데이터 분석 과정을 체감할 수 있었습니다.
특히, OLS 회귀계수 추정과 모델 성능 평가(R², RMSE)를 직접 계산하며 회귀 모델의 이해도를 높일 수 있었습니다.
7.2 추가 분석 가능성
- 다중 회귀분석으로 확장해보기
- 비선형 회귀나 다항 회귀로 예측력 개선 시도
- seaborn, scikit-learn 등 다양한 라이브러리를 활용한 비교 분석
- 잔차 분석을 통해 모델 적합성 검정도 함께 수행해볼 수 있습니다
'LG U+ Why Not SW 부트캠프 5기' 카테고리의 다른 글
| Flask 웹 프로젝트 실습 정리: 구조화, 라우팅, 템플릿, 폼 처리까지 (0) | 2025.04.03 |
|---|---|
| Flask 웹 프로젝트 시작하기 - 가상환경 설정부터 로그인 기능 구현까지 (0) | 2025.03.31 |
| [Python] 타이타닉 생존자 예측 모델 실습 (0) | 2025.03.27 |
| [Python] 문서 유사도 분석 (0) | 2025.03.12 |
| [Python] 한국어 전처리와 단어 표현 기법 (0) | 2025.03.11 |
