ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 값을 통해 모델의 성능을 평가할 수 있으며, 데이터의 분포 및 크기에 따라 모델의 정확도가 달라질 수 있습니다. 추가적인 모델 개선 방법으로는 비선형 회귀 모델, 다중 회귀 모델, 정규화 기법 등을 고려할 수 있습니다.

Designed by Tistory.