이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

선형 회귀

소개

데이터 모델예측 변수와 응답 변수 간의 관계를 명시적으로 설명합니다. 선형 회귀는 해당 모델 계수에서 선형인 데이터 모델을 피팅합니다. 가장 일반적인 선형 회귀의 유형은 최소제곱 피팅으로, 선형 모델 중에서도 직선과 다항식을 모두 피팅할 수 있는 유형입니다.

두 양 간의 관계를 모델링하기 전에, 상관 분석을 수행하여 이러한 양 간에 선형 관계가 존재하는지 여부를 알아보는 것이 좋습니다. 변수들이 비선형 관계를 가질 수도 있으며, 이는 상관 분석을 통해 알아낼 수 없습니다. 자세한 내용은 선형 상관관계 항목을 참조하십시오.

MATLAB® 기본 피팅 UI를 사용하여 데이터를 피팅할 수 있으며, 모델 계수를 계산하고 데이터를 기반으로 모델을 플로팅할 수 있습니다. 예제는 예제: 기본 피팅 UI 사용하기 항목을 참조하십시오. 또한, MATLAB polyfit 함수와 polyval 함수를 사용하여 해당 계수에서 선형인 모델로 데이터를 피팅할 수도 있습니다. 예제는 프로그래밍 방식 피팅 항목을 참조하십시오.

비선형 모델로 데이터를 피팅해야 하는 경우에는 관계가 선형이 되도록 변수를 변환하십시오. 또는, Statistics and Machine Learning Toolbox™ nlinfit 함수나 Optimization Toolbox™ lsqcurvefit 함수를 사용하거나 Curve Fitting Toolbox™에서 함수를 적용하여 직접 비선형 함수를 피팅해 보십시오.

여기서는 다음을 수행하는 방법에 대해 설명합니다.

  • \ 연산자를 사용하여 단순 선형 회귀 수행.

  • 상관 분석을 통해 두 수치가 서로 관련이 있는지 확인하여 데이터 피팅의 타당성 확인.

  • 데이터에 선형 모델 피팅.

  • 잔차를 플로팅하고 패턴을 찾아 피팅의 적합도(Goodness of Fit) 평가.

  • 피팅의 적합도 R2과 조정된 R2의 측정값 계산.

단순 선형 회귀

이 예제에서는 accidents 데이터셋을 사용하여 단순 선형 회귀를 수행하는 방법을 보여줍니다. 또한, 결정계수 R2을 계산하여 회귀식을 평가하는 방법도 보여줍니다. accidents 데이터셋에는 사망자가 발생한 교통사고 건수에 대한 미국의 각 주별 데이터가 들어 있습니다.

선형 회귀는 종속 변수(즉, 응답 변수) y와 하나 이상의 독립 변수(즉, 예측 변수) x1,...,xn 사이의 관계를 모델링합니다. 단순 선형 회귀에서는 독립 변수를 하나만 고려하며, 다음과 같은 관계식을 사용합니다.

y=β0+β1x+ϵ,

여기서 β0은 y절편이고, β1은 기울기(또는 회귀 계수)이며, ϵ은 오차항입니다.

(x1,y1), (x2,y2), ..., (xn,yn)으로 주어진, xy의 관측값 n개 세트로 시작해 보겠습니다. 단순 선형 회귀 관계식을 사용할 경우 이러한 값은 선형 연립방정식을 구성합니다. 이러한 방정식은 다음과 같이 행렬 형식으로 나타낼 수 있습니다.

[y1y2yn]=[1x11x21xn][β0β1].

다음과 같이 가정하겠습니다.

Y=[y1y2yn],X=[1x11x21xn],B=[β0β1].

관계식은 이제 Y=XB가 됩니다.

MATLAB에서는 mldivide 연산자를 사용하여 B를 구할 수 있습니다. 즉, B = X\Y와 같은 형식을 사용합니다.

데이터셋 accidents에서 교통사고 건수 데이터를 y에 불러오고 주별 인구 데이터를 x에 불러옵니다. \ 연산자를 사용하여 한 주에서 발생한 교통사고 건수와 그 주의 인구 간 선형 회귀 관계식 y=β1x를 구합니다. \ 연산자는 최소제곱 회귀를 수행합니다.

load accidents
x = hwydata(:,14); %Population of states
y = hwydata(:,4); %Accidents per state
format long
b1 = x\y
b1 = 
     1.372716735564871e-04

b1은 기울기 또는 회귀 계수입니다. 선형 관계식은 y=β1x=0.0001372x가 됩니다.

이 관계식을 사용하여 x로부터 각 주별 교통사고 건수 yCalc를 계산합니다. 실제 값 y와 계산된 값 yCalc를 플로팅하여 회귀식을 시각화합니다.

yCalc1 = b1*x;
scatter(x,y)
hold on
plot(x,yCalc1)
xlabel('Population of state')
ylabel('Fatal traffic accidents per state')
title('Linear Regression Relation Between Accidents & Population')
grid on

y=β0+β1x와 같이 모델에 y절편 β0을 포함시켜 피팅을 개선해 보겠습니다. x를 1로 구성된 열로 채우고 \ 연산자를 사용하여 β0을 계산합니다.

X = [ones(length(x),1) x];
b = X\y
b = 2×1
102 ×

   1.427120171726537
   0.000001256394274

이 결과는 관계식 y=β0+β1x=142.7120+0.0001256x를 나타냅니다.

이 관계식을 동일한 Figure에 플로팅하여 시각화합니다.

yCalc2 = X*b;
plot(x,yCalc2,'--')
legend('Data','Slope','Slope & Intercept','Location','best');

Figure에서 두 피팅은 거의 비슷합니다. 둘 중 더 적합한 피팅을 찾을 수 있는 한 가지 방법은 결정계수 R2을 계산하는 것입니다. R2은 모델이 데이터를 얼마나 잘 예측할 수 있는지를 측정하는 값으로, 그 값의 범위는 0에서 1 사이입니다. R2의 값이 높을수록 모델이 데이터를 더 잘 예측하는 것입니다.

yˆy의 계산된 값을 나타내고 yy의 평균인 경우 R2은 다음과 같이 정의됩니다.

R2=1-i=1n(yi-yˆi)2i=1n(yi-y)2.

R2의 값을 비교하여 두 피팅 중 더 적합한 피팅을 찾습니다. R2 값에서 알 수 있듯이, y절편이 포함된 두 번째 피팅이 더 적합한 피팅입니다.

Rsq1 = 1 - sum((y - yCalc1).^2)/sum((y - mean(y)).^2)
Rsq1 = 
   0.822235650485566

Rsq2 = 1 - sum((y - yCalc2).^2)/sum((y - mean(y)).^2)
Rsq2 = 
   0.838210531103428

잔차와 피팅의 적합도(Goodness of Fit)

잔차는 응답(종속) 변수의 관측된 값과 모델이 예측하는 값 사이의 차이입니다. 데이터에 적합한 모델을 피팅할 경우 잔차는 독립적인 랜덤 오차와 비슷합니다. 즉, 잔차의 분포는 분명한 패턴을 보여서는 안 됩니다.

선형 모델을 사용하여 피팅을 생성하려면 잔차 제곱의 합을 최소화해야 합니다. 이와 같이 최소화하면 최소제곱 피팅이 생성됩니다. 잔차의 플롯을 시각적으로 검토하여 피팅의 “적합도”를 판단할 수 있습니다. 잔차 플롯에 패턴이 있는 경우(즉, 잔차 데이터 점이 랜덤 산포를 갖지 않음), 그러한 무작위성(Randomness)은 모델이 데이터를 적절히 피팅하지 않고 있음을 나타냅니다.

생성된 각 피팅을 데이터의 컨텍스트에서 평가합니다. 예를 들어, 데이터 피팅의 목적이 물리적 의미를 갖는 계수를 추출하는 것이면 모델에 데이터의 물리적 특성이 반영되는 것이 중요합니다. 피팅의 적합도를 평가할 때는 데이터가 무엇을 나타내는지, 데이터가 어떻게 측정되었는지, 그리고 어떻게 모델링되었는지 이해하는 것이 중요합니다.

피팅의 적합도를 측정하는 한 가지 값은 결정계수, 즉 R2(r 제곱으로 읽음)입니다. 이 통계량은 모델을 피팅하여 얻은 값이 모델에서 예측하고자 하는 종속 변수와 얼마나 근접하게 일치하는지를 나타냅니다. 통계학자들은 종종 다음과 같이, 피팅된 모델의 잔차 분산을 사용하여 R2을 정의합니다.

R2 = 1 – SSresid / SStotal

SSresid는 회귀의 잔차 제곱합입니다. SStotal은 종속 변수의 평균과의 차이의 제곱합(총 제곱합)입니다. 두 값은 모두 양의 스칼라입니다.

기본 피팅 툴을 사용할 때 R2을 계산하는 방법을 알아보려면 결정계수 R2 도출하기 항목을 참조하십시오. R2 통계량을 계산하는 방법과 다변량 일반화에 대해 자세히 알아보려면 다음 내용을 계속 읽어 보십시오.

예제: 다항식 피팅에서 R2 계산하기

다항 회귀 계수에서 R2을 도출하여 선형 모델이 설명하는 y의 분산이 어느 정도인지 확인할 수 있습니다. 다음 예제를 참조하십시오.

  1. 데이터 파일 count.dat를 불러와서 count 변수의 처음 두 개 열에서 두 변수 xy를 생성합니다.

    load count.dat
    x = count(:,1);
    y = count(:,2);

  2. polyfit을 사용하여 x로부터 y를 예측하는 선형 회귀를 계산합니다.

    p = polyfit(x,y,1)
    
    p =
        1.5229   -2.1911
    

    p(1)은 기울기이고 p(2)는 선형 예측 변수의 절편입니다. 기본 피팅 UI를 사용하여 회귀 계수를 구할 수도 있습니다.

  3. polyval을 호출해서 p를 사용하여 y를 예측하고, 결과를 yfit으로 이름 짓습니다

    yfit = polyval(p,x);

    polyval을 사용하면 피팅 방정식을 직접 입력할 필요가 없습니다. 이 경우 피팅 방정식은 다음과 같습니다.

    yfit =  p(1) * x + p(2);
  4. 다음과 같이 잔차 값을 부호 있는 숫자의 벡터로 계산합니다.

    yresid = y - yfit;

  5. 다음과 같이 잔차를 제곱한 후 모두 합하여 잔차 제곱합을 구합니다.

    SSresid = sum(yresid.^2);

  6. 다음과 같이 관측값 개수에서 1을 뺀 값을 y의 분산값과 곱하여 y의 총 제곱합을 계산합니다.

    SStotal = (length(y)-1) * var(y);
    

  7. 이 항목의 소개 부분에서 설명한 다음 공식을 사용하여 R2을 계산합니다.

    rsq = 1 - SSresid/SStotal
    
    rsq =
        0.8707
    이는 선형 방정식 1.5229 * x -2.1911이 변수 y의 분산 중 87%를 예측한다는 것을 나타냅니다.

다항 회귀에 대해 조정된 R2 계산

일반적으로 더 높은 차수의 다항식을 피팅하여 모델의 잔차를 줄일 수 있습니다. 항을 더 추가하면 결정계수 R2 값이 증가합니다. 이 경우 데이터에 더 근접한 피팅을 얻게 되지만, R2으로 평가할 수 없는 더 복잡한 모델을 사용해야 합니다. 그러나 이 통계량의 개선된 형태인 조정된 R2은 모델의 항 개수에 대한 페널티를 포함합니다. 따라서, 서로 다른 모델이 동일한 데이터에 어떻게 피팅되는지 비교하는 데는 조정된 R2이 더 적합합니다. 조정된 R2

R2adjusted = 1 - (SSresid / SStotal)*((n-1)/(n-d-1))로 정의됩니다.

여기서 n은 데이터의 관측값 개수이고, d는 다항식의 차수입니다. (선형 피팅은 차수가 1이고, 2차 피팅은 2이며, 3차 피팅은 3 등등이 됩니다.)

다음 예제에서는 위에 나온 예제 예제: 다항식 피팅에서 R2 계산하기의 단계를 반복하며, 선형(차수 1) 피팅 대신 3차(차수 3) 피팅을 수행합니다. 3차 피팅부터는 단순 R2 값과 조정된 값을 모두 계산하여, 항을 추가함으로써 예측 검정력이 개선되는지 여부를 평가합니다.

  1. 데이터 파일 count.dat를 불러와서 count 변수의 처음 두 개 열에서 두 변수 xy를 생성합니다.

    load count.dat
    x = count(:,1);
    y = count(:,2);

  2. polyfit을 호출하여 x로부터 y를 예측하는 3차 피팅을 생성합니다.

    p = polyfit(x,y,3)
    
    p =
       -0.0003    0.0390    0.2233    6.2779

    p(4)는 3차 예측 변수의 절편입니다. 기본 피팅 UI를 사용하여 회귀 계수를 구할 수도 있습니다.

  3. polyval을 호출해서 p의 계수를 사용하여 y를 예측하고, 결과를 yfit으로 이름 짓습니다.

    yfit = polyval(p,x);

    polyval은 다음과 같이 수동으로 입력할 수도 있는 양함수 방정식을 실행합니다.

    yfit =  p(1) * x.^3 + p(2) * x.^2 + p(3) * x + p(4);

  4. 다음과 같이 잔차 값을 부호 있는 숫자의 벡터로 계산합니다.

    yresid = y - yfit;

  5. 다음과 같이 잔차를 제곱한 후 모두 합하여 잔차 제곱합을 구합니다.

    SSresid = sum(yresid.^2);

  6. 다음과 같이 관측값 개수에서 1을 뺀 값을 y의 분산값과 곱하여 y의 총 제곱합을 계산합니다.

    SStotal = (length(y)-1) * var(y);
    

  7. 이 항목의 소개 부분에서 설명한 다음 공식을 사용하여 3차 피팅에 대해 단순 R2을 계산합니다.

    rsq = 1 - SSresid/SStotal
    
    rsq =
        0.9083

  8. 마지막으로, 다음과 같이 조정된 R2을 계산하여 자유도를 설명합니다.

    rsq_adj = 1 - SSresid/SStotal * (length(y)-1)/(length(y)-length(p))
    
    rsq_adj =
        0.8945
    조정된 R2의 값 0.8945는 단순 R2의 값 .9083보다 작습니다. 이 조정된 값은 다항식 모델의 예측 검정력에 대한 더 신뢰할 수 있는 추정값입니다.

많은 다항 회귀 모델에서, 방정식에 항을 추가하면 R2 값과 조정된 R2 값이 모두 증가합니다. 위 예제에서 3차 피팅을 사용했을 때 선형 피팅과 비교하여 두 통계량이 모두 증가했습니다. (선형 피팅에 대해 조정된 R2을 계산하여, 더 낮은 값이 나오는지 직접 확인해 볼 수 있습니다.) 그러나 선형 피팅이 더 높은 차수의 피팅보다 항상 더 부적합한 것은 아닙니다. 더 복잡한 피팅의 조정된 R2 값이 단순한 피팅보다 더 낮게 나올 수 있습니다. 이는 더 복잡한 피팅이 더 적합한 것은 아니라는 것을 나타냅니다. 또한, 기본 피팅 툴이 생성하는 다항 회귀 모델에 대해 R2 값은 항상 0에서 1 사이인 반면, 일부 모델의 조정된 R2 값은 음수일 수 있습니다. 이는 모델의 항 개수가 너무 많음을 나타냅니다.

상관관계가 인과 관계를 의미하지는 않습니다. 따라서 상관 계수와 결정계수를 해석할 때는 항상 주의해야 합니다. 이러한 계수는 피팅된 모델이 제거하는 종속 변수의 분산이 어느 정도인지 수치화할 뿐입니다. 이러한 측정값은 모델이 예측하는 변수의 동작을 설명하는 데 모델 또는 선택한 독립 변수가 얼마나 적절한지 설명해 주지는 못합니다.

Curve Fitting Toolbox 함수를 사용하여 데이터 피팅하기

Curve Fitting Toolbox는 다음과 같은 데이터 피팅 기능을 제공하여 MATLAB의 핵심 기능을 확장합니다.

  • 표준 선형 최소제곱, 비선형 최소제곱, 가중 최소제곱, 제약적(Constrained) 최소제곱, 견고한(Robust) 피팅 절차를 포함한 선형 및 비선형 파라미터 피팅

  • 비 파라미터 피팅

  • 피팅의 적합도를 확인할 수 있는 통계량

  • 외삽, 미분, 적분

  • 데이터 분할과 스무딩을 용이하게 해 주는 대화 상자

  • MATLAB 코드 파일, MAT 파일, 작업 공간 변수를 비롯한 다양한 형식으로 피팅 결과 저장

자세한 내용은 Curve Fitting Toolbox 문서를 참조하십시오.