본문으로 바로가기

스플라인 회귀: Python 및 R로 배우는 실전 가이드

조각별 다항식과 매듭이 비선형 관계를 어떻게 모델링하는지, 주요 스플라인 종류, 그리고 Python과 R에서의 적합 방법을 다루는 실전 가이드입니다.
업데이트됨 2026년 6월 15일  · 15분 읽다

AI로 탐색하기

ChatGPT에서 열기Claude에서 열기Perplexity에서 열기

휘어지는 데이터를 직선으로 맞추는 건 결코 좋은 생각이 아닙니다.

선형 회귀는 예측 변수와 타깃 간의 관계가 직선이라고 가정합니다. 하지만 현실 세계의 관계는 대부분 그렇지 않습니다. 소득과 지출, 시간과 성장의 관계를 떠올려 보세요. 데이터는 꺾이고, 평평해졌다가, 다시 꺾이며, 한 번의 기울기로는 표현할 수 없는 방식으로 방향을 바꿉니다.

스플라인 회귀는 관계가 필요할 때 적절히 휘어지도록 하면서도, 제멋대로의 무제약 곡선을 맞추지 않도록 합니다. 핵심 아이디어는 예측 변수 범위 전반에 걸쳐 여러 개의 매끄러운 다항식 구간을 맞춘 뒤 특정 지점에서 결합하는 것입니다.

이 글에서는 스플라인 회귀의 핵심 개념, 매듭이 유연성을 어떻게 제어하는지, 주요 스플라인 종류, 그리고 실전 적용 방법을 배웁니다.

스플라인을 배우기 전에, 먼저 아래 튜토리얼을 통해 단순 선형 회귀를 알아두세요.

스플라인 회귀란?

스플라인 회귀는 매듭(knots)이라 불리는 특정 지점에서 서로 이어지는 조각별(piecewise) 다항식을 사용해 비선형 관계를 모델링하는 회귀 기법입니다.

즉, 전체 관계를 하나의 방정식으로 설명하는 대신, 예측 변수 범위를 더 작은 조각으로 나누고 각 조각에 별도의 다항식을 적합합니다. 이 조각들은 매듭에서 만나며, 제약을 통해 전환이 매끄럽도록 합니다.

결과는 두 극단의 중간쯤에 위치합니다. 하나의 직선만 그릴 수 있는 선형 회귀보다 유연하고, 거의 무엇이든 맞출 수 있지만 무엇을 맞췄는지 알려주지 않는 딥러닝이나 커널 방법 같은 완전 무제약 비선형 모델보다 구조적입니다.

이런 이유로 스플라인은 응용 통계에서 매우 자주 쓰입니다.

왜 스플라인 회귀가 필요한가

현실 데이터는 거의 직선을 따르지 않습니다.

선형 회귀는 관계 모델링의 기본 출발점이지만, 강한 가정을 합니다. 예측 변수의 효과가 전체 범위에 걸쳐 일정하다는 가정입니다. 실제 관계가 굽거나 방향을 바꾸면 직선은 과소적합합니다. 극단에서 오차가 커지고, 패턴을 따라가지 못하는 모델이 됩니다.

해결책은 더 유연한 모델을 쓰는 것입니다. 고차 다항 회귀도 한 방법입니다. 곡선이 데이터에 맞게 충분히 휘어질 때까지 x^2, x^3, x^4 항을 추가하는 방식이죠. 하지만 다항식은 데이터 가장자리에서 불안정해져, 데이터가 거의 없는 구간에서 위아래로 요동칠 수 있습니다. 이를 룽게(Runge) 현상이라 하며, 고차 다항식을 예측에 쓰기 어렵게 만듭니다.

스플라인 회귀는 이 두 극단의 중간에 있습니다.

데이터가 굽는 곳에서 국소적으로 유연성을 얻되, 단일 고차 다항식의 전역적 불안정성은 피합니다. 각 구간은 낮은 차수의 다항식(보통 3차)이라 어느 한 부분도 예상 밖의 행동을 하기 어렵습니다. 그리고 매듭에서 구간들이 매끄럽게 이어지므로 전체 곡선은 하나의 연속 함수처럼 보입니다.

요약하면, 스플라인은 복잡한 패턴을 따라갈 만큼의 유연성과, 극단에서도 얌전하게 행동할 만큼의 구조를 함께 제공합니다.

스플라인 회귀는 어떻게 작동하나요

스플라인 회귀는 항상 간단한 세 단계 워크플로를 따릅니다.

  1. 예측 변수 범위를 구간으로 나누기: 예측 변수 축을 따라 매듭을 정합니다. 매듭은 범위를 구간으로 나눕니다. 매듭이 3개면 4개의 구간이 생깁니다. 매듭은 구간 사이의 경계입니다.
  2. 각 구간에 다항식 적합: 각 구간 내부에서 낮은 차수의 다항식을 적합합니다. 구간마다 계수가 달라 예측 변수 범위의 서로 다른 부분에서 곡선이 다르게 휘어질 수 있습니다. 관계가 거의 평평한 구간은 거의 평평한 다항식이, 급하게 굽는 구간은 더 굽은 다항식이 맞춰집니다.
  3. 구간 연결: 각 매듭에서 연속성 제약을 강제합니다. 매듭에서 양쪽 다항식의 함수값이 같아 점프가 없도록 합니다. 3차 스플라인의 경우 1차와 2차 미분도 같아야 하므로 날카로운 모서리나 곡률의 갑작스러운 변화가 없습니다.

이러한 제약 덕분에 스플라인은 전체 예측 변수 범위에 걸쳐 연속적으로 흐르면서도 국소적으로만 휘어지는 하나의 매끄러운 곡선처럼 보입니다. 어디서 하나의 다항식이 끝나고 다음이 시작되는지 시각적으로 구분하기 어렵습니다.

매듭, 다항식 차수, 연속성 제약이 함께 스플라인을 정의합니다. 이들 중 하나라도 바꾸면 성질이 다른 스플라인이 만들어집니다. 다음 섹션에서 이를 다룹니다.

스플라인 회귀에서 매듭(Knots)이란?

매듭은 예측 변수 축에서 한 다항식 구간이 끝나고 다음 구간이 시작되는 지점입니다.

스플라인의 관절이라고 생각하면 됩니다. x = 5에 매듭을 두면, 5보다 작은 값에는 하나의 다항식, 5보다 큰 값에는 다른 다항식을 맞춥니다. 두 다항식은 매듭에서 만나며, 연속성 제약으로 매끄럽게 이어집니다. 매듭을 더 많이 추가하면 구간이 늘어나 곡선이 더 많은 곳에서 휘어질 수 있습니다.

그래서 매듭은 모델 유연성을 제어하는 핵심 레버입니다.

매듭의 개수는 스플라인을 이루는 다항식 조각의 개수를 결정하고, 매듭의 위치는 곡선이 형태를 바꿀 수 있는 지점을 결정합니다. 매듭이 두 개인 스플라인은 몇 군데만 휠 수 있습니다. 매듭이 스무 개인 스플라인은 거의 모든 점을 따라갈 수 있습니다.

따라서 매듭의 개수와 배치를 올바르게 선택하는 것이 스플라인 회귀의 핵심 결정입니다.

매듭이 너무 적을 때

매듭이 너무 적으면 데이터의 실제 패턴을 따라가기 위한 구간이 부족합니다. 곡선이 지나치게 뻣뻣해져, 일반적인 유연성은 있지만 국소적인 변화를 포착하지 못하는 낮은 차수의 다항식처럼 동작합니다.

상승 추세, 정체, 하락의 세 단계가 뚜렷한 데이터에 매듭 하나짜리 스플라인을 맞춘다고 가정해 보세요. 구간이 두 개뿐이므로 상승과 다른 한 단계를 겨우 포착할 수 있지만, 세 단계 모두는 어렵습니다. 결국 선형 회귀와 같은 문제가 생깁니다. 스플라인이 데이터의 형태를 맞추지 못하는 구간에서 오차가 큽니다.

매듭이 너무 적은 예시

매듭이 너무 적은 예시

매듭이 너무 적으면 과소적합을 초래합니다. 모델이 너무 매끄러워 실용적이지 않습니다.

매듭이 너무 많을 때

반대 문제도 똑같이 나쁩니다. 매듭이 너무 많으면 구간이 지나치게 많아져 실제 패턴보다 데이터의 잡음을 맞추기 시작합니다. 곡선이 관측치마다 요동치며 근본적인 추세가 아니라 우연한 변동을 쫓습니다.

관측치가 50개인 데이터에 매듭이 20개인 스플라인을 맞추면, 모델이라기보다 점잇기 그림처럼 보일 겁니다. 학습 데이터에는 거의 완벽히 맞지만, 새로운 데이터에 대한 예측은 신뢰할 수 없습니다. 입력의 작은 변화가 출력의 크고 예측 불가능한 변화로 이어집니다.

매듭이 너무 많은 예시

매듭이 너무 많은 예시

매듭이 너무 많으면 과적합을 초래합니다. 모델이 너무 유연해 일반화하지 못합니다.

실제 데이터의 굽는 지점을 포착할 만큼 충분히, 그러나 잡음을 외우기 시작하지 않을 만큼 적당히 매듭을 두는 것이 이상적입니다. 다음 섹션에서 실전에서 어떻게 판단할지 다룹니다.

스플라인의 종류

스플라인에는 몇 가지 변형이 있으며, 선택은 대체로 각 구간에서 어떤 다항식을 쓰는지와 곡선에 어떤 제약을 두는지에 달려 있습니다.

선형 스플라인

가장 단순한 형태입니다. 각 구간은 직선이며, 구간은 매듭에서 연결됩니다.

선형 스플라인 예시

선형 스플라인 예시

연속성 제약은 느슨합니다. 매듭에서 양쪽 값은 같아야 하지만, 기울기는 바뀔 수 있습니다. 결과는 각 매듭에 모서리가 있는 연결된 선분처럼 보입니다. 간단한 굽은 정도는 다룰 수 있지만, 곡선이 매끄럽지 않을 때가 있습니다.

전체적인 추세만 잡으면 되고 시각적 날카로움이 신경 쓰이지 않는다면 유용합니다. 각 구간이 고유 기울기의 직선이므로 해석도 가장 쉽습니다.

3차(큐빅) 스플라인

대부분의 응용에서 기본 선택입니다. 각 구간은 3차 다항식(차수 3)이며, 연속성 제약은 선형 스플라인보다 더 엄격합니다.

3차 스플라인 예시

3차 스플라인 예시

모든 매듭에서 세 가지 조건이 만족되어야 합니다. 값이 같고, 1차 미분이 같고, 2차 미분이 같아야 합니다. 점프도, 모서리도, 곡률의 갑작스러운 변화도 없습니다. 곡선은 전환 지점이 어디인지 시각적으로 드러나지 않게 매듭을 지나갑니다.

3차는 매끄러운 곡률 변화를 허용하는 가장 낮은 차수입니다. 그래서 널리 쓰입니다. 더 높은 차수는 유용한 유연성을 거의 더해주지 않으며, 모델 제어만 어렵게 만듭니다.

네추럴(자연) 3차 스플라인

경계에서 추가 제약을 두는 변형입니다.

네추럴 3차 스플라인 예시

네추럴 3차 스플라인 예시

일반 3차 스플라인은 특히 데이터가 적은 가장자리에서 이상하게 행동할 수 있습니다. 양끝 구간도 여전히 3차 다항식이므로, 외삽 시 빠르게 위아래로 흔들릴 수 있습니다.

네추럴 3차 스플라인은 양쪽 경계 매듭에서 2차 미분을 0으로 강제하여 이를 회피합니다. 실제로는 최외곽 매듭 밖에서는 곡선이 선형이 됩니다. 외삽 거동이 훨씬 안정적이므로, 데이터의 가장자리 근처 예측을 신경 쓸 때 더 좋은 선택입니다.

B-스플라인

B-스플라인(basis splines의 약자)은 스플라인을 구성하는 다른 방식입니다. 각 다항식 구간을 직접 정의하는 대신, 기저 함수의 가중합으로 스플라인을 만듭니다.

B-스플라인 예시

B-스플라인 예시

각 기저 함수는 자체로 작은 스플라인이며, 제한된 구간에서만 0이 아닙니다. 전체 스플라인은 이 기저 함수들의 합이며, 각 기저에 곱해지는 계수는 회귀를 통해 추정됩니다.

B-스플라인은 수치적으로 안정적이고 확장하기 쉽습니다. Python과 R의 현대적 스플라인 구현 대부분은 사용자 인터페이스가 일반 스플라인처럼 보여도 내부적으로 B-스플라인 표현을 사용합니다. R에서 bs()를 호출하거나 scikit-learn에서 SplineTransformer를 사용해봤다면, B-스플라인을 쓴 것입니다.

스플라인 회귀 vs 다항 회귀

다항 회귀와 스플라인 회귀는 모두 비선형 관계를 다루지만, 접근 방식이 매우 다릅니다. 차이는 곡선을 어떻게 구성하는지에 있습니다.

다항 회귀

다항 회귀는 전체 예측 변수 범위에 하나의 전역 다항식을 맞춥니다. 차수(2, 3, 5, 10 등)를 고르면, 모델이 모든 데이터에 대한 오차를 최소화하는 계수 집합을 찾습니다. 곡선은 하나의 방정식이며, 그 방정식이 모든 구간의 관계를 설명합니다.

깔끔해 보이지만 문제가 있습니다. 하나의 다항식은 전체 범위의 적합을 균형 맞춰야 하므로, 한 구간의 변화가 다른 모든 구간에 영향을 미칩니다. 데이터 중간의 급격한 굽이를 처리하려고 차수를 높이면, 가장자리에서 곡선이 흔들리기 시작합니다. 앞서 언급한 룽게 현상으로, 데이터 경계 근처에서 고차 다항식은 불안정해집니다.

또 다른 문제는 다항 회귀에는 지역성의 개념이 없다는 점입니다. x = 5에서의 스파이크가 x = 50의 적합 형태를 바꿀 수 있습니다. 모든 관측치가 같은 전역 방정식에 기여하기 때문입니다.

스플라인 회귀

스플라인 회귀는 예측 변수 범위를 구간으로 나누고 각 구간에 낮은 차수의 다항식을 맞춥니다. 다항식들은 매듭에서 매끄럽게 이어지지만, 각 다항식의 형태는 주로 자신의 구간 데이터에 의해 좌우된다는 점에서 서로 독립적입니다.

이로써 국소적 유연성을 얻습니다. 급격히 굽는 구간에는 더 굽은 다항식이, 평평한 구간에는 거의 평평한 다항식이 들어갑니다. 그리고 각 구간이 낮은 차수(보통 3차)라 극단에서 이상 행동을 하기가 어렵습니다. 특히 데이터 가장자리에서 더 매끄럽고 안정적인 적합을 얻습니다.

나란히 비교

다항 회귀 vs 스플라인 회귀

다항 회귀와 스플라인 회귀 비교

관계가 약하게 비선형이고 전역 적합으로 충분하다면 다항 회귀로도 됩니다. 더 복잡한 패턴이 있거나 경계 근처 예측이 중요하다면 스플라인이 더 안전한 선택입니다.

매듭의 개수와 위치 선택

매듭 선택은 스플라인 회귀에서 가장 중요한 부분입니다. 매듭이 너무 적으면 과소적합, 너무 많으면 과적합이 발생합니다. 그리고 어디에 두느냐에 따라 모델이 포착할 수 있는 패턴이 달라집니다.

접근 방식이 몇 가지 있으며, 보통은 이들을 조합합니다.

  1. 도메인 지식: 문제에 대해 아는 바가 있다면 활용하세요. 임상 연구에서는 알려진 임상 임계값에 매듭을 둘 수 있습니다. 가격 모델에서는 소비자 행동이 바뀔 것으로 예상되는 지점에 매듭을 둘 수 있습니다. 도메인 기반 매듭 배치는 구간이 실제 경계와 대응하므로 해석 가능성이 가장 높습니다.
  2. 균등 간격 매듭: 매듭 수를 정하고 예측 변수 범위에 균등 간격으로 둡니다. 예측 변수 축을 따라 데이터가 대체로 균일하게 분포할 때는 잘 작동합니다. 하지만 어떤 구간은 밀집하고 어떤 구간은 희소할 때는 좋지 않습니다. 매듭이 데이터가 거의 없는 구간에 놓이면 적합이 불안정해집니다.
  3. 분위수 기반 매듭: x축의 동일 간격이 아니라 예측 변수의 분위수에 매듭을 둡니다. 매듭 4개를 분위수로 배치하면 20, 40, 60, 80 분위에 둡니다. 각 구간에 관측치가 비슷한 수로 들어가므로, 희소 구간에서도 적합이 더 안정적입니다.
  4. 교차검증: 매듭 수를 달리해 여러 스플라인을 적합하고, 홀드아웃 데이터에서 성능을 비교합니다. 검증 오차가 가장 작은 구성이 승자입니다. 추측을 줄여주지만 계산 비용이 들고, 어떤 배치 전략(균등, 분위수)을 탐색하느냐에 결과가 좌우됩니다.

트레이드오프는 모든 회귀 문제에서 보는 것과 같습니다. 유연성 대 복잡성입니다. 매듭이 많을수록 더 미세한 패턴을 따라갈 수 있지만 잡음도 쫓을 수 있습니다. 매듭이 적을수록 더 안정적이고 해석 가능한 모델이 되지만 실제 패턴을 놓칠 수 있습니다.

먼저 분위수에 매듭 3~5개를 두고 잔차를 확인하세요. 스플라인이 잡지 못한 체계적 패턴이 보이면 그 구간에 매듭을 추가하세요. 적합이 요동친다면 매듭을 줄이세요. 선택을 방어해야 하거나 모델을 프로덕션에 넣을 때는 교차검증을 권합니다.

머신 러닝과 통계에서의 스플라인 회귀

특정 함수형을 가정하지 않고 매끄러운 비선형 효과를 모델링해야 할 때 스플라인 회귀가 등장합니다. 흔한 사례는 다음과 같습니다.

  • 시계열 추세: 시계열의 매끄러운 추세를 단기 변동과 분리하는 데 자주 씁니다. 시간에 스플라인을 맞추면 잡음에 과민반응하지 않으면서 방향 변화를 따라가는 유연한 추세선을 얻습니다. 경제학자와 애널리스트는 GDP나 주가처럼 변수의 기조 흐름을 설명하고자 할 때 자주 사용하며, 선형이나 지수 가정을 강요하지 않습니다.
  • 경제학/계량경제: 변수의 효과가 범위에 따라 달라지는 관계를 모델링합니다. 예를 들어 소득이 소비에 미치는 효과는 상수적이지 않습니다. 저소득 가구와 고소득 가구의 지출 방식이 다르기 때문입니다. 스플라인은 특정 함수형을 가정하지 않고 이를 포착합니다.
  • 헬스케어/생물통계: 많은 건강 지표는 나이, BMI, 혈압, 바이오마커 수치 같은 예측 변수와 비선형 관계를 가집니다. 질병 위험이 U자형이나 J자형을 따르는 경우가 많습니다. 극단이 위험하고, 중간이 안전합니다. 선형 모델은 이를 놓칩니다. 3차 스플라인과 네추럴 3차 스플라인은 이러한 효과를 모델링하는 표준 도구이며, 임상 연구에서 쓰는 대부분의 통계 소프트웨어에 내장되어 있습니다.
  • 환경/생태 모델링: 종이나 기후 변수가 환경 구배에 어떻게 반응하는지를 모델링할 때도 등장합니다. 온도, 고도, 강수량 같은 요인은 종 풍부도나 작물 수확량 같은 결과에 비선형 효과를 미치는 경우가 많습니다. 스플라인은 사전에 형태를 지정하지 않고 반응 곡선을 적합할 수 있게 합니다.

이 모든 경우에 스플라인은 필요한 곳에 유연성을 제공하면서, 관계의 함수형을 미리 추측하지 않아도 됩니다. 탐색적 모델링에 적합하며, 해석 가능성이 중요할 때 프로덕션 모델로도 탄탄한 선택입니다.

Python에서의 스플라인 회귀

Python에서는 스플라인 회귀를 적합하는 일반적 방법이 세 가지 있습니다. ML 스타일 파이프라인을 위한 scikit-learn, 수식 기반 모델 명세를 위한 patsy, 통계적 추정을 위한 statsmodels입니다. 각 방법을 살펴보겠습니다.

scikit-learn 사용

scikit-learn은 숫자형 특성을 B-스플라인 기저 함수 집합으로 변환하는 SplineTransformer를 제공합니다. 이렇게 만든 특성을 임의의 선형 회귀 모델에 넣으면 됩니다.

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import SplineTransformer
from sklearn.pipeline import make_pipeline

# Data
np.random.seed(42)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(x).ravel() + 0.3 * x.ravel() + np.random.normal(0, 0.3, 100)

# Spline features + linear regression pipeline
model = make_pipeline(
    SplineTransformer(n_knots=5, degree=3),
    LinearRegression()
)
model.fit(x, y)
y_pred = model.predict(x)

print("R^2 score:", model.score(x, y))

scikit-learn R2 점수

scikit-learn R2 점수

SplineTransformer가 매듭 5개, 3차 다항식으로 스플라인 기저를 만듭니다. 그런 다음 LinearRegression이 각 기저 함수의 계수를 추정합니다. 여기에는 어떤 sklearn 선형 회귀 계열도 바꿔 넣을 수 있습니다. 릿지, 라쏘 등 변환된 특성에 선형 모델을 적합하는 것이면 됩니다.

이 방식은 sklearn 워크플로에 잘 맞지만, 표준 오차나 p-값 같은 통계 출력은 제공하지 않습니다. 그런 경우에는 patsy나 statsmodels를 사용하세요.

patsy 사용

patsy는 수식 기반 디자인 행렬 생성 인터페이스입니다. R의 모델 수식과 가장 비슷하며, statsmodels와 함께 쓸 스플라인 특성을 만드는 표준 방법입니다.

import numpy as np
import pandas as pd
from patsy import dmatrix
import statsmodels.api as sm

np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.3 * x + np.random.normal(0, 0.3, 100)
df = pd.DataFrame({"x": x, "y": y})

# B-spline basis using patsy
spline_basis = dmatrix("bs(x, df=6, degree=3)", data=df, return_type="dataframe")

# Fit with statsmodels OLS
model = sm.OLS(df["y"], spline_basis).fit()
print(model.summary())

patsy 모델 요약

patsy 모델 요약

bs()는 6 자유도, 차수 3(3차)의 B-스플라인 기저를 만들도록 지시합니다. patsy가 반환한 디자인 행렬을 그대로 sm.OLS()에 넣습니다. df 파라미터는 스플라인 기저 함수의 개수를 제어합니다. 값이 클수록 더 유연해지며, 매듭을 늘리는 것과 비슷한 효과입니다.

네추럴 스플라인이 필요하면 bs()ns()로 바꾸세요:

spline_basis = dmatrix("ns(x, df=6)", data=df, return_type="dataframe")

수식과 함께 statsmodels 사용

statsmodels에는 patsy와 통합되는 수식 API도 있습니다. 통계 출력을 모두 갖춘 한 줄짜리 스플라인 회귀가 필요할 때 가장 깔끔한 방법입니다.

import statsmodels.formula.api as smf

model = smf.ols("y ~ bs(x, df=7, degree=3)", data=df).fit()
print(model.summary())

statsmodels 모델 요약

statsmodels 모델 요약

summary() 출력에는 각 스플라인 기저 함수에 대한 계수, 표준 오차, p-값, 일반적 적합 통계가 포함됩니다. 계수 자체는 실세계 양과 직접적으로 대응하지 않습니다. 각 계수는 기저 함수에 해당하므로, 예측 변수 전 범위에 걸친 예측을 그려서 적합을 해석합니다.

대부분의 통계 워크플로에서는 statsmodels 수식 API가 가장 편리합니다. 스플라인이 더 큰 ML 파이프라인의 일부라면 scikit-learn을 사용하세요.

R에서의 스플라인 회귀

R은 주요 언어 중 스플라인 지원이 가장 좋습니다. splines 패키지는 기본 R에 포함되어 있으며, 핵심 함수 bs()ns()는 어떤 회귀 수식 안에서도 바로 사용할 수 있습니다.

bs()는 B-스플라인 기저를, ns()는 네추럴 3차 스플라인 기저를 생성합니다. 둘 다 스플라인 특성 행렬을 만들어 R의 수식 시스템이 자동으로 모델에 삽입합니다.

B-스플라인을 위한 bs() 사용

# Data
set.seed(42)
x <- seq(0, 10, length.out = 100)
y <- sin(x) + 0.3 * x + rnorm(100, sd = 0.3)
df <- data.frame(x = x, y = y)

# Cubic B-spline with 6 degrees of freedom
library(splines)
model <- lm(y ~ bs(x, df = 6, degree = 3), data = df)
summary(model)

R에서의 bs() 출력

R에서의 bs() 출력

수식 y ~ bs(x, df = 6, degree = 3)x를 3차, 6 자유도의 B-스플라인 기저로 바꾸라고 R에 지시합니다. R이 나머지를 처리합니다. 기저 행렬을 만들고, 선형 모델을 적합하며, 표준 lm 객체를 생성해 모든 진단을 제공합니다.

원한다면 매듭 위치를 직접 지정할 수도 있습니다:

model <- lm(y ~ bs(x, knots = c(2, 5, 8), degree = 3), data = df)

이는 R이 결정하도록 두는 대신, 매듭을 x = 2, x = 5, x = 8에 둡니다.

네추럴 스플라인을 위한 ns() 사용

경계 밖에서 선형 거동을 하는 네추럴 3차 스플라인은 ns()를 사용하세요:

model_natural <- lm(y ~ ns(x, df = 6), data = df)
summary(model_natural)

R에서의 ns() 출력

R에서의 ns() 출력

문법은 같지만 경계 거동이 다릅니다. 데이터 가장자리 근처의 예측이나 해석이 중요할 때는 네추럴 스플라인이 대체로 더 안전한 선택입니다.

출력 해석

summary() 출력의 계수는 해석 가능한 양이 아니라 스플라인 기저 함수에 대응합니다. 모델이 실제로 무엇을 학습했는지 보려면, x 그리드에 걸쳐 예측하고 결과를 그리세요:

x_grid <- data.frame(x = seq(0, 10, length.out = 200))
preds <- predict(model, newdata = x_grid)
plot(df$x, df$y)
lines(x_grid$x, preds, col = "green", lwd = 2)

R 스플라인 회귀 출력 해석

R에서의 출력 해석

R에서는 스플라인을 적합하고, 매끄러운 그리드에서 예측한 뒤, 이를 데이터 위에 겹쳐 그리는 것이 표준 패턴입니다. 또한 같은 수식 안에서 다른 예측 변수와 스플라인 항을 함께 사용할 수도 있습니다:

model_multi <- lm(y ~ ns(x, df = 6) + other_var, data = df)

이 모델은 같은 모델에서 x에 비선형 효과를, other_var에는 선형 효과를 적합합니다. 이러한 유연성 덕분에 스플라인은 R 기반 통계 워크플로에서 널리 쓰입니다.

스플라인 회귀의 장점

더 인기 있는 머신 러닝 모델과 비교했을 때 스플라인의 장점은 다음과 같습니다.

  • 형태를 몰라도 비선형 관계를 모델링: 특정 함수형을 고집할 필요가 없습니다. 스플라인은 데이터가 곡선을 결정하도록 하므로, 어디에서 발생할지 미리 알지 못해도 꺾임, 평탄화, 방향 전환을 모델링할 수 있습니다.
  • 매끄럽고 해석 가능한 적합: 결과는 블랙박스 예측이 아니라 연속 곡선입니다. 스플라인을 그려 예측 변수 범위에서 반응이 어떻게 변하는지 보고, 비전문가에게도 설명할 수 있습니다.
  • 고차 다항식보다 안정적: 각 구간은 낮은 차수의 다항식이므로 어느 한 조각도 극단에서 지나치게 행동할 수 없습니다. 특히 네추럴 3차 스플라인에서는 경계 거동이 훨씬 잘 제어됩니다.
  • 기존 회귀 워크플로에 잘 녹아듦: 스플라인은 표준 선형 회귀 안에서 작동합니다. 다른 예측 변수, 정규화, 혼합효과 등 OLS 위에 쌓이는 모든 도구와 결합할 수 있습니다.

스플라인 회귀의 한계

대부분의 모델과 마찬가지로 스플라인에도 알아두어야 할 몇 가지 트레이드오프가 있습니다.

  • 매듭 선택이 어렵다: 매듭의 개수와 위치를 고르는 데 노력이 필요합니다. 기본값이 통할 때도 있지만, 많은 경우 좋은 적합을 위해 교차검증이나 도메인 지식이 필요합니다. 항상 통하는 규칙은 없습니다.
  • 매듭이 늘수록 해석이 어려워진다: 매듭 3개짜리 스플라인은 해석이 비교적 쉽습니다. 매듭 20개짜리는 아닙니다. 곡선을 그릴 수는 있지만, 모델이 무엇을 하는지 엄밀히 설명하기가 훨씬 어려워집니다.
  • 여전히 과적합할 수 있다: 스플라인은 고차 다항식보다 안정적이지만 과적합에 면역인 것은 아닙니다. 매듭이 너무 많거나, 배치가 좋지 않거나, 이상치가 많거나, 표본이 작으면 학습 데이터에는 잘 맞지만 새 데이터에는 실패할 수 있습니다.
  • 계수는 직접적으로 의미가 없다: 적합된 계수는 실세계 양이 아니라 기저 함수에 대응합니다. 선형 회귀처럼 “x가 1 증가하면 y가 베타만큼 변한다”를 읽어낼 수 없습니다. 시각적으로 적합을 해석해야 합니다.

스플라인 회귀에서 흔한 실수

이제 입문자들이 스플라인 회귀에서 자주 하는 실수를 몇 가지 짚어보겠습니다.

  • 매듭을 너무 많이 쓰기: 초보자는 학습 데이터에서 시각적으로 좋아 보일 때까지 매듭을 추가하는 경향이 있습니다. 전형적인 과적합 함정입니다. 관측치 사이사이마다 스플라인이 꿈틀거린다면 매듭이 너무 많습니다. 교차검증을 하거나, 적은 매듭으로 시작해 잔차가 분명한 패턴을 보일 때만 추가하세요.
  • 매듭이 너무 적은데 데이터를 선형이라 가정하기: 반대 실수입니다. 매듭 1~2개의 스플라인을 적합했는데 잔차가 여전히 곡률을 보인다면 과소적합입니다. 실제 패턴을 따라갈 구간이 충분치 않은 것입니다. 잔차가 어긋나는 구간에 매듭을 더하세요.
  • 경계 거동을 오해하기: 일반 3차 스플라인은 데이터 가장자리에서 불안정할 수 있습니다. 경계 근처에서 예측하거나 경계를 넘어 외삽한다면 네추럴 3차 스플라인을 사용하세요. 경계 매듭 밖에서 선형 거동을 강제해 일반 3차 스플라인의 흔들림을 피합니다.
  • 스플라인을 무제약 비선형 모델과 직접 비교하기: 스플라인은 신경망이나 랜덤 포레스트가 되려는 게 아닙니다. 원시 예측 정확도만으로 블랙박스 모델과 비교하면 블랙박스가 더 나을 때가 많습니다. 그게 요지가 아닙니다. 스플라인의 강점은 해석 가능성과 전통적 통계 추론에 자연스럽게 들어맞는다는 점입니다.

스플라인 회귀 vs 다른 비선형 모델링 기법

스플라인만이 비선형 관계를 모델링하는 유일한 방법은 아니지만, 해석 가능성이 중요하다면 유용합니다. 흔한 대안들과 비교하면 다음과 같습니다.

다항 회귀

다항 회귀는 단일 전역 방정식을 사용합니다. 지정이 더 간단하지만, 특히 경계에서 덜 안정적입니다. 관계에 굽이가 하나 이상이면 스플라인이 유연성과 안정성에서 우세합니다. 다항식은 매우 낮은 차수(2 또는 3)에서만 해석이 더 쉽습니다. 그 이상이면 스플라인이 더 신뢰할 만하고 해석도 쉬워집니다.

일반화 가법 모형(GAM)

GAM은 본질적으로 스플라인을 규모 있게 확장한 것입니다. GAM은 각 예측 변수에 대해 스플라인을 적합하고 이를 가법적으로 결합합니다. 스플라인 회귀를 단일 변수의 GAM, GAM을 여러 변수에 걸친 스플라인의 합으로 생각할 수 있습니다.

GAM은 여러 비선형 예측 변수를 개별 스플라인으로 수동 적합하는 것보다 더 깔끔하게 처리합니다. 또한 적절한 유연성을 선택하는 평활화 패널티를 포함해, 일부 매듭 선택 작업을 덜어줍니다. 예측 변수가 여러 개이고 그중 몇 개에 비선형 처리가 필요하다면 GAM이 보통 더 좋은 선택입니다.

의사결정나무

의사결정나무는 완전히 다른 접근을 합니다. 매끄러운 곡선을 맞추는 대신, 예측 변수 공간을 직사각형 영역으로 나누고 각 영역에서 상수를 예측합니다. 결과는 계단 함수입니다.

나무는 어떤 면에서는 스플라인보다 유연합니다. 상호작용과 급격한 변화를 모델링할 수 있기 때문입니다. 그러나 적합 함수는 매끄럽거나 연속적이지 않습니다. 또한 희소한 구간에서는 일반화가 잘 되지 않습니다. 매끄러움과 안정적인 외삽이 중요하면 스플라인이 낫고, 많은 변수에서 날카로운 경계나 상호작용을 모델링해야 하면 나무가 더 낫습니다.

스플라인 회귀가 중요한 이유

스플라인은 응용 통계 곳곳에서 사용됩니다. 임상 연구, 경제 분석, 환경 과학, 시계열 모델링 등, 블랙박스 모델을 쓰지 않고 매끄러운 비선형 효과를 모델링해야 하는 모든 분야에서 등장합니다.

그 이유는 균형에 있습니다. 지저분한 데이터를 다룰 만큼의 유연성, 그리고 해석 가능하고 안정적으로 유지할 만큼의 구조를 동시에 제공하기 때문입니다.

또한 더 고급 방법의 토대이기도 합니다. 일반화 가법 모형은 스플라인 위에 직접 구축되었고, 스무딩 스플라인은 내장 정규화를 더해 개념을 확장합니다. 현대의 비선형 회귀 기법 다수도 스플라인 기저를 사용합니다. 이러한 방법을 이해하려면 먼저 스플라인을 이해해야 합니다.

스플라인이 중요한 이유는 실용적이기 때문이고, 또한 많은 다음 단계의 빌딩 블록이기 때문입니다. 가장 강력한 모델은 아닐지라도 가장 신뢰할 수 있는 모델 중 하나이며, 그게 종종 더 중요합니다.

결론

스플라인 회귀는 매듭이라 불리는 지점에서 조각별 다항식을 결합해 비선형 관계를 모델링합니다. 아이디어는 이것이며, 나머지는 그 변형입니다.

매듭과 매끄러움이 핵심 두 가지 개념입니다. 스플라인 종류, 기저 표현, R과 Python에서의 구현은 모두 이 두 개념을 다루는 다른 방식일 뿐입니다.

자신의 데이터에 여러 스플라인을 적용해 보세요. 3차, 네추럴 3차, B-스플라인을 비교하고, 매듭을 옮겨 보며 결과를 확인하세요. 적합의 시각적 특성 덕분에 선택의 효과를 쉽게 볼 수 있으니, 과감히 실험해 보세요.

스플라인과 다른 많은 알고리즘의 수학을 더 깊이 파고들고 싶다면, 우리의 Machine Learning Scientist in Python 트랙에 등록하세요. 2026년에 취업할 준비를 갖추는 데 필요한 모든 것을 담고 있습니다.

스플라인 회귀 자주 묻는 질문(FAQ)

스플라인 회귀를 쉽게 설명하면 무엇인가요?

스플라인 회귀는 예측 변수 범위를 구간으로 나누고 각 구간에 작은 다항식을 적합해 데이터의 곡선형 관계를 모델링하는 방법입니다. 구간은 매듭에서 매끄럽게 연결되어 전체적으로 하나의 연속 곡선이 됩니다. 선형 회귀보다 유연하고, 고차 다항 회귀보다 안정적입니다.

언제 선형 회귀 대신 스플라인 회귀를 사용해야 하나요?

예측 변수와 결과 간의 관계가 직선이 아닐 때 스플라인 회귀를 사용하세요. 선형 모델에서 잔차에 패턴이 남는다면, 예를 들어 데이터 가운데에서는 양의 오차가, 극단에서는 음의 오차가 보인다면 관계가 비선형이라는 신호입니다.

스플라인 회귀에서 매듭(knots)이란 무엇인가요?

매듭은 예측 변수 축에서 한 다항식 구간이 끝나고 다음이 시작되는 지점입니다. 스플라인의 유연성을 제어합니다. 매듭이 많을수록 더 많은 곳에서 곡선이 휘어질 수 있습니다. 매듭의 개수와 배치를 고르는 것이 스플라인 회귀의 핵심 결정입니다. 너무 적으면 과소적합, 너무 많으면 과적합이 됩니다.

큐빅 스플라인과 네추럴 큐빅 스플라인의 차이는 무엇인가요?

둘 다 매듭 사이에서 3차 다항식을 사용하지만, 데이터 경계에서의 거동이 다릅니다. 일반 3차 스플라인은 양끝이 여전히 완전한 3차 다항식이라 경계 근처에서 예기치 않게 행동할 수 있습니다. 네추럴 3차 스플라인은 최외곽 매듭 밖에서 곡선을 선형으로 강제하여, 경계 근처나 경계를 넘는 예측을 훨씬 안정적으로 만듭니다.

스플라인 모델의 매듭 개수는 어떻게 고르나요?

예측 변수의 분위수에 매듭을 두어 각 구간에 비슷한 수의 관측치가 들어가도록 매듭 3~5개로 시작하세요. 스플라인이 잡지 못한 패턴이 잔차에서 보이면 그 구간에 매듭을 추가하세요. 더 엄격하게 하려면, 매듭 수를 바꿔가며 교차검증으로 비교해 검증 오차가 가장 낮은 구성을 고르세요.

주제

DataCamp로 배우세요

courses

R에서 Generalized Linear Models

4
21.8K
Generalized Linear Model 코스로 회귀 도구를 확장해 logistic 및 Poisson 회귀를 학습합니다.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow