티스토리 뷰

오늘은 파이썬을 활용한 상관분석과 회귀분석을 학습했습니다.
기초 통계 개념부터 함수 구현까지 직접 코드를 짜보면서, 통계 이론을 실제 코드로 해석하는 방법을 익힐 수 있었고,
마지막에는 시각화와 모델 평가까지 포함한 심화 회귀분석을 실습했습니다.


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 등 다양한 라이브러리를 활용한 비교 분석
  • 잔차 분석을 통해 모델 적합성 검정도 함께 수행해볼 수 있습니다
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함