Skip to content
Home » 다항 회귀 분석 | 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 Polynomial Regression Analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 N차 다항식 빠른 답변

다항 회귀 분석 | 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 Polynomial Regression Analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 N차 다항식 빠른 답변

당신은 주제를 찾고 있습니까 “다항 회귀 분석 – 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 곽기영 이(가) 작성한 기사에는 조회수 1,989회 및 좋아요 39개 개의 좋아요가 있습니다.

+ wn * xn 과 같이 독립변수(feature)와 종속변수(target)의 관계가 1차 방정식의 형태로 표현된 회귀입니다.

Table of Contents

다항 회귀 분석 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식 – 다항 회귀 분석 주제에 대한 세부정보를 참조하세요

[R을 이용한 통계데이터분석]다항회귀분석(polynomial regression analysis)은 단순회귀분석을 확장하여 독립변수의 n차 다항식으로 종속변수를 설명합니다. 다음과 같은 함수에 대한 설명이 포함되어 있습니다: scatterplot(), lm(), summary(), lines(), arrange(), fitted().

다항 회귀 분석 주제에 대한 자세한 내용은 여기를 참조하세요.

[28편] 회귀 분석 – 다항 회귀(Polynomial Regression)

회귀 모델식을 위와 같이 다차원 다항식으로 두고 회귀 분석을 수행하는 것을 다항 회귀(Polynomial Regression)라 합니다. 그런데 이 다항 회귀도 …

+ 여기를 클릭

Source: m.blog.naver.com

Date Published: 6/29/2021

View: 4166

다중 회귀 분석 vs 다항 회귀 분석 (Multiple VS Polynomial …

다중회귀분석시 독립변수간 상관관계가 높아 발생하는 다중공선성(multicollinearity)문제 처리가 … 다항회귀분석은 독립변수의 차수를 높이는 형태.

+ 여기에 표시

Source: dodonam.tistory.com

Date Published: 6/2/2022

View: 9682

B4. 다항 회귀분석(Polynomial Regression)

다항회귀분석에서는 매우 중요한 개념이 하나 따라오는데, 이를 확인하고 다항 회귀분석을 진행하도록 하겠습니다. 분산-편차의 Trade off 관계. Trade …

+ 여기에 더 보기

Source: wikidocs.net

Date Published: 9/8/2022

View: 1014

다항회귀분석(Polynomial regression analysis) – velog

다항회귀분석(Polynomial regression analysis)단순회귀분석처럼 한 개의 연속형 독립변수를 이용하여 한 개의 연속형 종속변수를 예측한다.

+ 여기에 보기

Source: velog.io

Date Published: 8/2/2021

View: 4069

[지도 학습 01] 선형 회귀와 다항 회귀 – Move Fast – 티스토리

다항 회귀(Polynomial Regression) · 항이 여러 개인 가설 함수로 결과를 예측하는 회귀 분석 방법이다. · 항은 제곱근이나 2차항, 3차항 등 다양하게 …

+ 여기를 클릭

Source: movefast.tistory.com

Date Published: 1/6/2021

View: 2472

[Python] 다항 회귀(Polynomial Regression)의 이해와 구현

다항 회귀(Polynomial Regression)란 비선형 데이터를 학습하기 위해 선형 모델을 사용하는 기법이다. 단순 선형 회귀(SLR)를 이용해 모든 데이터의 관계 …

+ 여기에 자세히 보기

Source: aliencoder.tistory.com

Date Published: 8/20/2022

View: 9128

[ML] 다중 회귀 VS 다항 회귀 (Multiple VS Polynomial regression)

회귀 분석이란, 관찰된 연속형 변수들에 대해 두 변수 사이의 모형을 … 독립변수의 차수를 높이는 형태; 다차원의 회귀식인 다항 회귀 분석으로 …

+ 더 읽기

Source: herjh0405.tistory.com

Date Published: 10/22/2022

View: 4184

머신러닝 다항 회귀 분석 개념 Machine Learning Polynomial …

다항 회귀 분석은 여러개의 독립변수에 의해 종속변수에 변화가 생기는 회귀 분석이다. 선형 회귀 분석은 단순이 하나의 독립변수에 따라 하나의 종속 …

+ 더 읽기

Source: lngnat.tistory.com

Date Published: 8/17/2021

View: 4075

[머신러닝]회귀분석 진단, 다항회귀분석 – 맷햄 – 티스토리

회귀분석 진단. 1. 회귀분석의 가정. 2. 회귀분석의 잔차의 가정. 2. 다항회귀분석(Polynomial regression). 1. 다항회귀분석이 필요한 경우.

+ 더 읽기

Source: topo314.tistory.com

Date Published: 11/6/2021

View: 9136

주제와 관련된 이미지 다항 회귀 분석

주제와 관련된 더 많은 사진을 참조하십시오 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

통계데이터분석 - 회귀분석 - 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식
통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식

주제에 대한 기사 평가 다항 회귀 분석

  • Author: 곽기영
  • Views: 조회수 1,989회
  • Likes: 좋아요 39개
  • Date Published: 2020. 10. 18.
  • Video Url link: https://www.youtube.com/watch?v=53N4NQ1bgCA

[머신러닝 완벽가이드] 다항회귀(Polynomial Regression)와 편향-분산 트레이드오프

현재 각 point에 해당하는 sample들은 2차 방정식 함수를 이용해서 생성했기 때문에 차수가 2인 degree = 2 인 다항 회귀에서 가장 높은 성능을 보이는 것을 확인할 수 있습니다.

여기서 주목할 부분은 바로 마지막 그래프인 차수를 25로 가져간 모델인데 이 경우 차수가 너무 높아 학습된 데이터에 과도하게 fit하게 학습되어 앞서 언급한 오버피팅(overfitting) 문제가 발생합니다.

따라서 3번째 그래프의 모델은 학습된 데이터에는 매우 높은 성능을 보이지만 새로운 데이터에 대해선 낮은 성능을 보이게 됩니다.

[28편] 회귀 분석 – 다항 회귀(Polynomial Regression)

분석하고자 하는 데이터의 설명변수와 응답변수가 선형적인 관계가 아니라 곡선 형태로 되어 있는 경우, 선형 회귀 모델을 이용해 계산하게 되면 오차가 크게 나타날 것입니다.

만약 분석하고자 하는 데이터 분포가 2차원 곡선 형태로 되어 있으면 2차원 곡선으로, 3차원 곡선 형태로 되어 있으면 3차원 곡선으로 접근하는 것이 오차가 작겠지요.

아래와 같은 데이터 분포를 봅니다.

위 그래프와 같은 데이터 분포는 위로 볼록한 2차원 곡선 형태로 되어 있다고 말할 수 있겠지요. 이런 경우, 우리가 구하고자 하는 회귀 모델 식은 아래의 식과 같이 가정할 수 있습니다.

동일한 개념으로 일반적인 곡선에 대해 회귀 모델을 가정하면 아래와 같이 표현할 수 있겠습니다.

따라서 위 그래프는 d=2 로 두고 회귀 모델을 구하는 것이라고 보면 됩니다.

회귀 모델식을 위와 같이 다차원 다항식으로 두고 회귀 분석을 수행하는 것을 다항 회귀(Polynomial Regression)라 합니다. 그런데 이 다항 회귀도 결국 다중 회귀식의 일종임을 알 수 있습니다. 앞서 말했듯이 다중 회귀는 설명 변수가 여러 개 있는 식에서 설명 변수 계수를 구하는 것이라 했습니다. ​아래의 치환식을 생각해봅니다.

이 치환식을 적용하면 위에서 보인 다항 회귀 모델식은 아래와 같은 식으로 표현할 수 있습니다.

즉, 다항 회귀 모델은 다중 회귀 모델로 계산될 수 있다는 말입니다.

코드를 보면서 이해해 보도록 합니다. 먼저 아래와 같이 필요한 모듈을 임포트합니다.

위 코드 아래에 다음 코드를 추가합니다.

skl_polyregression.py

이 코드에서 X와 y는 이 포스팅 처음에 보인 그래프에서 데이터의 분포와 같은 값을 가집니다. 다항 회귀를 적용하려면 아래와 같은 순서로 로직을 구현합니다.

다항 회귀를 위한 필요한 차수만큼 항을 추가하기 위해 PolynomialFeatures() 객체를 생성합니다. 트레이닝 데이터 X를 PolynomialFeatures.fit_transform(X)로 변형합니다. LinearRegression.fit()에 2단계의 결과를 적용하여 회귀 모델을 구합니다.

그러면 코드를 보시죠~

>>> lr = LinearRegression()

>>> pr = LinearRegression()

lr은 단순 선형 회귀 모델로 계산하기 위한 것이고, pr은 다항 회귀를 적용하여 다중 회귀 모델로 계산하기 위한 것입니다. 따라서 pr이 우리가 주목해야 할 부분입니다.

>>> quadratic = PolynomialFeatures(degree=2)

다항 회귀를 위해 2차항을 적용합니다.

>>> X_quad = quadratic.fit_transform(X)

트레이닝 데이터 X를 2차항이 적용된 다항 회귀 모델로 변형합니다.

>>> pr.fit(X_quad, y)

다항 회귀를 위해 변형된 트레이닝 데이터 X_quad를 이용해 회귀 모델 pr을 계산합니다.

>>> y_quad_fit = pr.predict(quadratic.fit_transform(X_fit))

계산된 회귀 모델로 좌표값 X_fit의 예측값을 계산합니다. 계산한 (X_fit, y_quad_fit)을 그래프에 그려주면 회귀 모델 그래프가 그려집니다.

나머지 코드는 회귀 모델 그래프를 화면에 그려주고, 단순 선형 모델의 MSE와 결정 계수값, 다항 회귀 모델을 적용하여 계산한 회귀 모델의 MSE와 결정 계수값을 보여주는 코드입니다.

코드를 실행하면 다음과 같은 결과가 나옵니다.

그래프를 보면, 단순 회귀 모델로 계산된 것은 점선으로 된 직선이고, 다항 회귀를 적용한 회귀 모델은 초록색 곡선입니다. 또한 단순 회귀 모델에 의해 계산된 MSE는 569.78로 다소 크지만 다항 회귀를 적용한 다중 회귀 모델의 MSE는 61.33으로 많이 줄어들었음을 알 수 있습니다. 또한 결정 계수의 값도 0.83에서 0.98로 1에 더욱 가까와져 적합도가 더욱 좋아졌습니다.

그러면 여태 다루었던 주택 정보에 다항 회귀를 적용해 보도록 하겠습니다. ‘회귀 분석 – 준비하기’에서 보인 페어플롯을 다시 보도록 합니다.

페어플롯에서 MEDV-LSTAT에 해당하는 그래프를 보면 데이터가 2차원 곡선 형태 비스므리하게 분포되어 있음을 알 수 있습니다.

skl_polyregression.py를 아래의 코드로 수정합니다.

skl_polyregression1.py

이 코드는 3차 다항 회귀 모델을 적용하는 부분이 추가된 것 말고는 전체적인 로직이 skl_polyregression.py와 동일합니다. 코드를 실행하면 아래와 같은 결과가 나옵니다.

각 회귀 모델의 결정 계수를 보면 결과가 썩 훌륭하지는 못합니다. 모든 비선형 모델에 다항 회귀 모델을 적용하는 것이 팔방미인은 아닙니다. 가끔은 데이터를 다른 식으로 변형해서 단순 회귀 모델로 계산할 때 더 좋은 결과를 보일 때도 있습니다. 이는 데이터를 바라보고 분석하는 사용자의 직관이나 경험이 중요하다는 것을 말해 줍니다.

MEDV-LSTAT 데이터에서, MEDV는 로그 값을 취하고, LSTAT은 제곱근 값을 취한 후, 단순 회귀 모델로 계산해보는 코드는 아래와 같습니다.

skl_polyregression1.py의 #그래프 그리기 부분을 삭제하고 이 코드를 추가합니다. 수정한 코드를 실행하면 다음과 같은 결과가 나옵니다.

결정 계수 값이 0.69로 이전의 결과보다 더 나아졌다는 것을 알 수 있습니다.

이는 데이터의 분포 형태에 따라 단순 회귀 모델로 계산할지, 다항 회귀를 적용한 다중 회귀 모델로 계산해야 할지 결정하는 것도 중요하지만, 데이터를 바라보고 직관적으로 해석하는 사용자의 경험이나 능력도 중요하다는 것을 말해줍니다.

다중 회귀 분석 vs 다항 회귀 분석 (Multiple VS Polynomial regression analysis)

반응형

다중 회귀 (multiple regression)

– 다중회귀분석은 다중의 독립변수가 있는 형태 (x1, x2)

– 다중회귀분석시 독립변수간 상관관계가 높아 발생하는 다중공선성(multicollinearity)문제 처리가 필요

> 다중공선성 확인은 분산팽창지수 (Variation Inflation Factor ; VIF) 로 확인 가능

– 변수 제거 등

단일회귀분석의 경우, 종속변수와 독립변수를 나눈 feature 분포를 토대로 대체 가능

다항 회귀 (polynomial regrsssion)

– 다항회귀분석은 독립변수의 차수를 높이는 형태

– 다차원의 회귀식인 다항 회귀 분석으로 단순 선형 모델의 한계를 어느정도 극복할 수 있음

Feature selection

출처:

https://bioinformaticsandme.tistory.com/290

https://m.blog.naver.com/PostView.nhn?blogId=samsjang&logNo=221006905415&proxyReferer=https:%2F%2Fwww.google.com%2F

728×90

반응형

B4. 다항 회귀분석(Polynomial Regression)

13. 다항 회귀분석(Polynomial Regression)

다항 회귀분석 : 예측자들이 1차항으로 구성된 것이 아닌, 2차항, 3차항 등으로 구성되어 있는 회귀식

$$ \hat y = b_0+b_1x_i+b_2x_{i}^2+\cdots+b_px_p^{p} $$

\ 다항 회귀분석은 위 식처럼 구성이 될 수 있습니다. 다항회귀분석에서는 매우 중요한 개념이 하나 따라오는데, 이를 확인하고 다항 회귀분석을 진행하도록 하겠습니다.

분산-편차의 Trade off 관계

Trade off : 두 개의 목표 중에서 하나를 달성하려고 하면 다른 목표가 희생되어야 하는 관계를 의미합니다.

기계학습에서 예측 모형을 만드는 것은 항상 Trade off 관계를 생각해야 됩니다. 기본적으로 통계학에서는 모형의 Target Variable(종속 변수)이 연속형(Continuous)일 때는 MSE 와 Bias에 주목합니다. 만약 Target Variable이 범주형(Categorical)일 경우에는 모형의 Error Rate에 주목합니다. 그 이유는 모형의 정확성은 MSE 혹은 Bias가 얼마나 작은지에 따라 결정되기 때문입니다.

MSE(Mean Squared Error)

앞서 단순선형회귀에서 MSE를 다루었지만, 다시 한번 복습하면서 재차 다루어보도록 하겠습니다.

$MSE$를 이해하기 위해서는 위 그림의 의미를 제대로 숙지하고 있어야 합니다.

$$ Y_i = 실제 관측값 \, $$

$$ \hat{Y_i} = 예측값 $$

$$ \overline{Y} = 평균 $$

여기서 예측값 $\hat{Y_i}$은 추정된 회귀식 $\hat{Y_i} = \beta_0 + \beta_1X_i$으로부터 추정된 예측 값입니다. 평균값 $\overline{Y}$은 $\overline{Y} = \frac{1}{n}\Sigma(Y_i)$ 평균 산술식으로부터 계산된 표본평균입니다.

보라색 간격에 해당되는 $\hat{Y_i}-\overline{Y}$는 간격의 차이를 설명할 수 있기 때문에($\beta_0 + \beta_1X_i – \frac{1}{n}\Sigma(Y_i)$) 추정된 회귀식이설명이 가능한 영역이 입니다. 하지만 초록색 간격에 해당되는 $Y_i – \hat{Y_i}$는 실제로 관측된 $Y_i$값이 왜 저기에 찍혔는지에 대해서는 설명을 할 수 없습니다. 그런관계로 해당 영역을 설명이 불가능한 영역입니다.

모든 모형은 설명력이 높으며 (혹은 설명 못하는 영역이 적은) 예측이 잘 되는 모형이 좋은 모형입니다. 결국 모형의 결함은 설명을 하지 못하는 $Y_i – \hat{Y_i}$은 오차로 계산하게 됩니다. 이를 잔차(Residuals, 혹은 Error)라고 합니다.

추정된 회귀식 $\hat{Y_i} = \beta_0 + \beta_1X_i$이 변수들 간의 인과관계를 제대로 설명하는지 측정하기 위하여 잔차의 합을 계산하게 됩니다. 여기서 잔차는 상황에 따라 양수가 될 수도, 음수가 될 수도 있습니다. 그렇기에 부호 간 계산으로 잔차의 합이 상쇄되는 것을 방지하기 위하여 잔차를 제곱하여 합을 구하게 됩니다. 이를 오차의 제곱합(Sum Squred Error, $SSE$)라고 부릅니다. 그런 다음 계산된 $SSE$를 보정하기 위하여 $SSE$를 오차의 자유도($df_e$)로 나눕니다. 그렇게 계산 된 값을 오차 평균 제곱합(Mean Squared Error, $MSE$)라고 부릅니다.

$$ SSE = \Sigma(Y_i – \hat{Y_i})^2 $$

$$ MSE = \frac{1}{df_E}\Sigma{(Y_i-\hat{Y_i})^2} $$ SSE를 오차의 자유도로 나누어주는 이유

제곱 된 값은 항상 양수입니다

양수를 모두 더하게 되면, 데이터가 많을 수록 값은 커지게 됩니다.

그 의미는 SSE자체가 데이터가 많을 수록 단순히 커지는 의미이기 때문에, 정말 오차가 높은가? 에 대한 평가기준이 잘못 해석될 수가 있습니다.

이를 자유도로 나눔으로써 평균이 계산되고, 보정된 평균오차를 모형의 Error 수준으로 판단하게 됩니다.

위와 같은 계산으로 회귀식이 설명 가능한 영역인, $\hat{Y_i} – \overline{Y}$은 각각 다음과 같이 계산이 됩니다. $$ SSR = \Sigma(\hat{Y_i}-\overline{Y})^2 $$

$$ MSR = \frac{1}{df_R}\Sigma(\hat{Y_i}-\overline{Y})^2 $$

그렇다면 추정되는 회귀식이 데이터의 인과관계를 얼마나 잘 설명하는지 계산하기 위해 설명을 하지 못하는 영역 대비, 설명을 할 수 있는 영역을 비교하게 됩니다. $$ F \, value = \frac{MSR}{MSE} = \frac{\frac{1}{df_R}\Sigma(\hat{Y_i}-\overline{Y})^2}{\frac{1}{df_E}\Sigma{(Y_i-\hat{Y_i})^2}} $$ $\frac{MSR}{MSE}$는 두 집단의 분산을 비교하는 F 분포를 따르게 됩니다.

추정된 회귀식의 설명하는 영역이 설명하지 못하는 영역에 비해 얼마나 큰지 나타내는 검정통계량(Test Statistics)$F \, value$는 값이 클수록 회귀식의 귀무가설($H_0\,: 회귀식의 \, 기울기가 \,0이다$)를 기각할 가능성이 커지게 됩니다. 그렇다면 $F\ value$값이 커질려면 다음과 같습니다.

$MSR$이 증가

$MSE$가 감소

분석모형의 성능 평가를 $MSE$로 하는 이유입니다. $MSE$가 작은 모형일수록 회귀식의 오차가 줄기때문에 그만큼 현상을 잘 설명한다고 할 수 있습니다.

Variation & Bias

회귀식으로 추정된 $\hat{Y_i}$는 얼핏보면 단일 값인 점 추정(Point Estimation)으로 생각할 수 있지만, 모든 통계분석 모형은 구간 추정(Interval Estimation)입니다. 구간 추정이란 소리는 추정값에 대한 신뢰구간을 계산한다는 의미입니다.

신뢰구간의 의미는 똑같은 $X$값이 주어졌을 때, 추정값 $\hat{y} = \beta_0 + \beta_1 X$ 의 값이 $[\hat{y} – \alpha , \hat{y} +\alpha]$의 범위에 속한다는 의미입니다. 만약 분산이 크다면, 이 신뢰구간의 길이는 길어지게 되고, 추정의 신뢰성이 떨어지는 문제가 발생합니다. 반대로 편의(Bias)는 추정된 값이 모집단의 특성, 즉 모수를 반영하지 못한다는 의미입니다.

위 그림을 보시면 분산과 편향이 크고 작을 때에 따라 모형의 정확성이 어떻게 변하는지 알 수 있습니다. 모수의 True Value가 원 정중앙에 있다고 하였을 때, Variance 가 크다는 것은 추정값의 범위가 넓은 것을 의미하고, Bias가 크다는 것은 영점조준 사격 훈련 때 탄집군은 생겼지만 영점이 잘못잡혔다와 비슷하다고 생각하시면 됩니다.

선형 & 비선형 Modeling

Linear Regression(선형 회귀분석)과 Non – Linear Regression(비선형 회귀분석)을 잠깐 다루고 가겠습니다.

library(ggplot2) ggplot(Regression) + geom_point(aes(x = X, y = y),col = ‘royalblue’,alpha = 0.4) + geom_smooth(aes(x = X, y = y),col = ‘red’) + theme_bw() + xlab(“”) + ylab(“”) ggplot(Regression) + geom_point(aes(x = X, y = y2),col = ‘royalblue’,alpha = 0.4) + geom_smooth(aes(x = X, y = y2),col = ‘red’) + theme_bw() + xlab(“”) + ylab(“”)

사람들이 회귀분석을 돌릴 때, 가장 실수하는 부분은 단순하게 변수들 간의 상관관계만을 파악해서 분석하는 경우입니다. 상관관계는 두 변수의 관계가 선형성을 띄는지를 판단하는 것일 뿐입니다. 만약 두 변수가 비선형 관계에 있을 경우, 상관관계는 낮게 잡힐 수도 있습니다. 하지만 상관계수가 낮게 잡힌다고 해서 이 두 변수 간에 관계가 존재하지 않는 것은 아닙니다. 비선형으로 회귀식을 잡으면 충분히 관계를 설명할 수가 있게 됩니다.

ggplot(Regression) + geom_point(aes(x = X, y = y3),col = ‘royalblue’,alpha = 0.4) + geom_smooth(aes(x = X, y = y3),col = ‘red’) + theme_bw() + xlab(“”) + ylab(“”)

특히 이런 경우, 데이터의 상관관계수가 매우 낮게 계산이 됩니다. 상관계수만 보면 매우 낮기때문에 일반적으로 모델링 할 생각부터 안하게 됩니다. 하지만 분석모형에서는 이러한 비선형 관계들로 관계식을 추정할 수 있습니다.

선형 회귀분석

두 변수의 관계가 선형인 경우에 대해서 회귀분석을 추정해보겠습니다.

LINEAR = lm(y ~ X,data = Regression) summary(LINEAR)

Call: lm(formula = y ~ X, data = Regression) Residuals: Min 1Q Median 3Q Max -9.5537 -5.7116 0.2738 5.0961 10.2835 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.9839 0.9975 1.989 0.0486 * X 10.0924 0.1620 62.308 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 6.085 on 148 degrees of freedom Multiple R-squared: 0.9633, Adjusted R-squared: 0.963 F-statistic: 3882 on 1 and 148 DF, p-value: < 2.2e-16 ggplot(Regression) + geom_smooth(aes(x = X, y = predict(LINEAR, newdata = Regression)),col = "red", method = 'lm') + geom_point(aes(x = X , y = y),col = 'royalblue') + ylab("") + xlab("") + ggtitle("Linear Regression") + theme_bw() 일반적인 선형회귀분석, 즉 선형을 완벽하게 띄고 있는 변수 간의 관계는 간단하게 선형으로 적합시키면 문제가 없습니다. Polynomial Regression 변수 간의 관계가 y=x2y=x2형태를 가지는 데이터에 대해 2차항 회귀분석(다항 회귀분석)을 적용시켜 보겠습니다. # 제곱꼴 관계를 선형으로 적합 NonLinear = lm(y2 ~ X, data = Regression) summary(NonLinear) Call: lm(formula = y2 ~ X, data = Regression) Residuals: Min 1Q Median 3Q Max -154.19 -84.79 -46.28 46.35 446.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -208.872 21.225 -9.841 <2e-16 *** X 103.788 3.447 30.113 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 129.5 on 148 degrees of freedom Multiple R-squared: 0.8597, Adjusted R-squared: 0.8587 F-statistic: 906.8 on 1 and 148 DF, p-value: < 2.2e-16 2차항의 관계를 선형으로 적합하였을 때의 설명력은 85 ~ 86%가 나온 것을 알 수가 있습니다. 다음으로 다항 회귀분석(2차항)을 적용시켜보도록 하겠습니다. NonLinear2 = lm(y2 ~ poly(X,2), data = Regression) summary(NonLinear2) Call: lm(formula = y2 ~ poly(X, 2), data = Regression) Residuals: Min 1Q Median 3Q Max -65.180 -25.879 5.213 29.693 39.436 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 345.341 2.582 133.74 <2e-16 *** poly(X, 2)1 3899.149 31.625 123.29 <2e-16 *** poly(X, 2)2 1527.866 31.625 48.31 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 31.63 on 147 degrees of freedom Multiple R-squared: 0.9917, Adjusted R-squared: 0.9916 F-statistic: 8767 on 2 and 147 DF, p-value: < 2.2e-16 회귀식을 $\hat{y_i} = \beta_0 + \beta_1x_i +\beta_2x_i^2$형태로 적합한 결과 설명력은 99%로 상승한 것을 볼 수 있습니다. ggplot(Regression) + geom_smooth(aes(x = X, y = predict(NonLinear2,newdata = Regression)),col = "red") + geom_point(aes(x = X, y = y2),col = 'royalblue') + ylab("") + xlab("") + ggtitle("Polynomial Regression") + theme_bw() 유연성이 있는 회귀분석 다음 회귀분석은 $y=sin(x)$꼴을 가지는 두 변수 간의 관계를 회귀식으로 추정해보도록 하겠습니다. 워낙 형태가 괴이하기 때문에 몇차 항을 적합시켜야할지 모르겠습니다. 그러하니 변수항의 차수(Degree of Polynomial)을 2 ~ 10까지 주고 Testing을 해보도록 하겠습니다. # Train Set & Test Set 형성 TRAIN = Regression[1:100,] TEST = Regression[101:150,] # 저장공간 생성 DEGREE = c() TEST_MSE = c() TRAIN_MSE = c() Adj_R = c() TEST_VAR = c() TRAIN_VAR = c() # 적합 모델 찾기 for( degree in 2:10){ FLEXIBLE_MODEL = lm(y3 ~ poly(X,degree),data = TRAIN) ## Summary Save SUMMARY = summary(FLEXIBLE_MODEL) ANOVA = anova(FLEXIBLE_MODEL) DEGREE = c(DEGREE,degree) ## R_SQUARE Adj_R = c(Adj_R,SUMMARY$adj.r.squared) ## Train Set TRAIN_MSE = c(TRAIN_MSE, ANOVA$`Mean Sq`[2]) TRAIN_VAR = c(TRAIN_VAR, var(FLEXIBLE_MODEL$fitted.values)) ## Test Set Pred = predict(FLEXIBLE_MODEL, newdata = TEST) TEST_RESIDUALS = (Pred - TEST$y3) TEST_MSE_VALUE = sum(TEST_RESIDUALS^2)/(nrow(TEST)) TEST_MSE = c(TEST_MSE,TEST_MSE_VALUE) TEST_VAR = c(TEST_VAR, var(Pred)) } ## Test 결과 데이터프레임 생성 F_DATA = data.frame( DEGREE = DEGREE, Adj_R = Adj_R, TRAIN_MSE = TRAIN_MSE, TRAIN_VAR = TRAIN_VAR, TEST_MSE = TEST_MSE, TEST_VAR = TEST_VAR ) 항차를 2차항부터 10차항까지 차례대로 추정해본 결과는 다음과 같습니다. library(dplyr) library(reshape) ggplot(TRAIN) + geom_point(aes(x= X, y = y3) , col = 'royalblue', alpha = 0.8) + geom_smooth(aes(x = X, y = predict(FLEXIBLE_MODEL,newdata = TRAIN)),col = 'red') + xlab("") + ylab("") + ggtitle("Flexible Regression") + theme_bw() ggplot(F_DATA) + geom_point(aes(x = DEGREE, y = Adj_R * 100)) + geom_line(aes(x = DEGREE, y = Adj_R * 100)) + geom_text(aes(x = DEGREE, y = Adj_R * 100 + 5, label = paste(round(Adj_R*100,2),"%",sep="")),size = 3)+ scale_x_continuous(breaks = seq(2,10,by = 1)) + ylab("Adj_R2") + theme_bw() F_DATA %>% select(DEGREE,TRAIN_MSE,TEST_MSE) %>% melt(id.vars = c(“DEGREE”)) %>% ggplot() + geom_point(aes(x = DEGREE, y = value, col = variable)) + geom_line(aes(x = DEGREE, y = value, col = variable)) + labs(col = “”) + theme_bw() + theme(legend.position = “bottom”) + xlab(“Degree”) + ylab(“MSE”) F_DATA %>% select(DEGREE,TRAIN_VAR,TEST_VAR) %>% melt(id.vars = c(“DEGREE”)) %>% ggplot() + geom_point(aes(x = DEGREE, y = value, col = variable)) + geom_line(aes(x = DEGREE, y = value, col = variable)) + labs(col = “”) + theme_bw() + theme(legend.position = “bottom”) + xlab(“Degree”) + ylab(“Variation”)

$R^2$는 6차항부터 급격하게 올라가는 것을 볼 수가 있습니다. 따라서 6차항은 되어야 $y=sin(x)$형태의 관계를 잘 설명할 수 있는 편이라고 생각할 수 있습니다.

$MSE$는 Train Set과 Test Set에 따라 추세가 다릅니다. 차수가 높아질수록 Train Set의 $MSE$는 감소하는 것을 알 수있습니다. 하지만 Test Set의 MSE는 감소하다가 증가하는 것을 확인할 수 있습니다. 이는 Train Set은 기가막히게 잘 맞추지만 새로운 데이터인 Test Set은 맞추지 못하는 OverFitting 이 발생하였다고 볼 수 있습니다.

이 발생하였다고 볼 수 있습니다. $Variance$는 항차가 올라갈수록 대체로 증가하는 추세에 있는 것을 볼 수 있습니다. 여기서 고차항의 회귀모형의 단점이 제대로 드러납니다. 분석 모형이 유연할수록(항차가 높을수록) 회귀추정값의 분산은 높게 뛰기 마련입니다. 이는 회귀식에 의한 추정값에 대한 신뢰구간이 길어진다는 의미이며, 결과에 대한 신뢰도가 떨어진다는 것을 의미합니다.

여기까지 비선형 회귀분석에 대해 알아보았습니다.

다항회귀분석(Polynomial regression analysis)

📌 다항회귀분석(Polynomial regression analysis)

단순회귀분석처럼 한 개의 연속형 독립변수를 이용하여 한 개의 연속형 종속변수를 예측한다.

단순회귀분석과 달리 선형관계는 독립변수의 n차 다항식으로 모델링한다.

y = B_0 + B_1 x + B_2 x^2

산점도에 관측값을 통과하는 추세선을 그렸을 때 n-1개의 굴절이 관찰되면 일반적으로 이를 n차 다항식으로 모델링

> library ( car ) > str ( Prestige ) ‘data.frame’ : 102 obs . of 6 variables : $ education : num 13.1 12.3 12.8 11.4 14.6 . . . $ income : int 12351 25879 9271 8865 8403 11030 8258 14163 11377 11023 . . . $ women : num 11.16 4.02 15.7 9.11 11.68 . . . $ prestige : num 68.8 69.1 63.4 56.8 73.5 77.6 72.6 78.1 73.1 68.8 . . . $ census : int 1113 1130 1171 1175 2111 2113 2133 2141 2143 2153 . . . $ type : Factor w / 3 levels “bc” , “prof” , “wc” : 2 2 2 2 2 2 2 2 2 2 . . .

📌 교육기관과 소득 간의 관계 분석

단순회귀분석

> Prestige . lm < - lm ( income ~ education , data = Prestige ) > summary ( Prestige . lm ) Call : lm ( formula = income ~ education , data = Prestige ) Residuals : Min 1Q Median 3Q Max – 5493.2 – 2433.8 – 41.9 1491.5 17713.1 Coefficients : Estimate Std . Error t value Pr ( > | t | ) ( Intercept ) – 2853.6 1407.0 – 2.028 0.0452 * education 898.8 127.0 7.075 2.08e-10 ** * – – – Signif . codes : 0 ‘ ** * ’ 0.001 ‘ ** ’ 0.01 ‘ * ’ 0.05 ‘ . ’ 0.1 ‘ ’ 1 Residual standard error : 3483 on 100 degrees of freedom Multiple R – squared : 0.3336 , Adjusted R – squared : 0.3269 F – statistic : 50.06 on 1 and 100 DF , p – value : 2.079e-10

회귀식 : income = -2853.6 + 898.8 * education

교육기간이 1년 증가할 때 마다 소득은 898.8 달러씩 증가한다.

> windows ( width = 12 , height = 8 ) > plot ( Prestige$income ~ Prestige$education , + col = “cornflowerblue” , pch = 19 , + xlab = “Education (years)” , ylab = “Income (dollars)” , + main = “Education and Income” )

산점도 관측값들을 보면 교육기관이 짧을 때와 길 때 소득에 미치는 영향이 다르다. 교육기관이 길 때는 짧을 때에 비해 한 단위 증가에 따른 소득의 증가폭이 더 크다. 직선이 교육기관과 소득 간의 관계를 잘 표현하는지는 더 생각해볼 필요가 있다.

📌 교육기관이 짧은 집단과 긴 집단으로 나누어 회귀분석

> lm ( income ~ education , data = Prestige , + subset = ( education > mean ( Prestige$education ) ) ) Call : lm ( formula = income ~ education , data = Prestige , subset = ( education > mean ( Prestige$education ) ) ) Coefficients : ( Intercept ) education – 10299 1455 > lm ( income ~ education , data = Prestige , + subset = ( education <= mean ( Prestige$education ) ) ) Call : lm ( formula = income ~ education , data = Prestige , subset = ( education <= mean ( Prestige$education ) ) ) Coefficients : ( Intercept ) education 2546.6 281.8 긴 집단 : 독립변수 회귀계수 1455 짧은 집단 : 독립변수 회귀계수 281.8 두 집단에 있어서 회귀선의 기울이가 다르다는 것은 단일 직선의 회귀선 보다는 굴절을 갖는 곡선에 의해서 더 잘 설명될지도 모른다. > scatterplot ( income ~ education , data = Prestige , + pch = 19 , col = “orangered” , cex = 1.2 , + regLine = list ( method = lm , lty = 2 , lwd = 3 , col = “royalblue” ) , + smooth = list ( soother = loessLine , spread = FALSE , + lty . smooth = 1 , lwd . smooth = 3 , col . smooth = “green3” ) , + xlab = “Education (years)” , ylab = “Income (dollars)” , + main = “Education and Income” )

regLine : 직선

method=lm : 선형 회귀선

smooth : 곡선 추세선

soother=loessLine : 현제 데이터의 구간별 가장 적합한 추세선

곡선 loess 추세선이 개별 데이터를 더 잘 나타낸다. 따라서 2차항 회귀모델이 더 적합하다.

다항회귀분석

📝 포뮬러 심볼

> summary ( prestige . poly ) Call : lm ( formula = income ~ education + I ( education ^ 2 ) , data = Prestige ) Residuals : Min 1Q Median 3Q Max – 5951.4 – 2091.1 – 358.2 1762.4 18574.2 Coefficients : Estimate Std . Error t value Pr ( > | t | ) ( Intercept ) 12918.23 5762.27 2.242 0.02720 * education – 2102.90 1072.73 – 1.960 0.05277 . I ( education ^ 2 ) 134.18 47.64 2.817 0.00586 ** – – – Signif . codes : 0 ‘ ** * ’ 0.001 ‘ ** ’ 0.01 ‘ * ’ 0.05 ‘ . ’ 0.1 ‘ ’ 1 Residual standard error : 3369 on 99 degrees of freedom Multiple R – squared : 0.383 , Adjusted R – squared : 0.3706 F – statistic : 30.73 on 2 and 99 DF , p – value : 4.146e-11

p-value = 4.146e-11이므로 다항회귀 모델의 회귀식은 통계적으로 유의하다.

RSE = 3369

R-squared = 0.383

📌 단순회귀 결과와 비교

> Prestige . lm < - lm ( income ~ education , data = Prestige ) > summary ( Prestige . lm ) Call : lm ( formula = income ~ education , data = Prestige ) Residuals : Min 1Q Median 3Q Max – 5493.2 – 2433.8 – 41.9 1491.5 17713.1 Coefficients : Estimate Std . Error t value Pr ( > | t | ) ( Intercept ) – 2853.6 1407.0 – 2.028 0.0452 * education 898.8 127.0 7.075 2.08e-10 ** * – – – Signif . codes : 0 ‘ ** * ’ 0.001 ‘ ** ’ 0.01 ‘ * ’ 0.05 ‘ . ’ 0.1 ‘ ’ 1 Residual standard error : 3483 on 100 degrees of freedom Multiple R – squared : 0.3336 , Adjusted R – squared : 0.3269 F – statistic : 50.06 on 1 and 100 DF , p – value : 2.079e-10

p-value = 2.079e-10이므로 단순회귀 모델의 회귀식은 통계적으로 유의하다.

RSE = 3483

R-squared = 0.3336

RSE 값은 작을수록 좋고, R-squared 값은 클수록 좋다.

따라서 다항회귀 모델이 단순회귀 모델에 비해서 더 우수하다.

⭐ 다중공선성 ⭐

I(education^2)의 p-value = 0.00586 통계적으로 유의하다.

education의 p-value = 0.05277 통계적으로 유의하지 않다.

두 독립변수 간의 통계적 유의성이 다르게 나타난 이유는 ❓

두 독립변수 간의 강한 상관관계가 이유일 수도 있다. => ⭐다중공선성⭐

다항회귀분석은 다중공선성이 나타날 확률이 크다.

왜 ❓

2차항은 원래의 독립변수를 바탕으로 계산되기 때문에 상관관계가 크다. 다만 회귀식은 통계적으로 유의하기 때문에 예측이 주 목적이라면, 문제가 되지 않는다.

📌 faithful 데이터 셋으로 다항 회귀 분석

> str ( faithful ) ‘data.frame’ : 272 obs . of 2 variables : $ eruptions : num 3.6 1.8 3.33 2.28 4.53 . . . $ waiting : num 79 54 74 62 85 55 88 85 51 85 . . . > > scatterplot ( eruptions ~ waiting , data = faithful , + pch = 19 , col = “deepskyblue” , cex = 1.2 , + regLine = list ( method = lm , lty = 2 , lwd = 3 , col = “blueviolet” ) , + smooth = list ( soother = loessLine , spread = FALSE , + lty . smooth = 1 , lwd . smooth = 3 , col . smooth = “coral” ) , + xlab = “waiting (minutes)” , ylab = “Eruptions (minutes)” , + main = “Waiting Time Between Eruptions and the Duration of the Eruptions” )

2개의 굴절이 나타나기 때문에 3차 다항식 회귀 모델을 해야 한다.

> faithful . ploy < - lm ( eruptions ~ waiting + I ( waiting ^ 2 ) + I ( waiting ^ 3 ) , data = faithful ) > summary ( faithful . ploy ) Call : lm ( formula = eruptions ~ waiting + I ( waiting ^ 2 ) + I ( waiting ^ 3 ) , data = faithful ) Residuals : Min 1Q Median 3Q Max – 1.20224 – 0.21761 – 0.02508 0.27463 1.28682 Coefficients : Estimate Std . Error t value Pr ( > | t | ) ( Intercept ) 3.063e+01 3.722e+00 8.229 8.27e-15 ** * waiting – 1.438e+00 1.672e-01 – 8.601 6.74e-16 ** * I ( waiting ^ 2 ) 2.290e-02 2.450e-03 9.346 < 2e - 16 ** * I ( waiting ^ 3 ) - 1.128e-04 1.176e-05 - 9.593 < 2e - 16 ** * - - - Signif . codes : 0 ‘ ** * ’ 0.001 ‘ ** ’ 0.01 ‘ * ’ 0.05 ‘ . ’ 0.1 ‘ ’ 1 Residual standard error : 0.4238 on 268 degrees of freedom Multiple R - squared : 0.8637 , Adjusted R - squared : 0.8622 F - statistic : 566 on 3 and 268 DF , p - value : < 2.2e-16 p-value = < 2.2e-16 이므로 다항 회귀모델의 회귀식은 통계적으로 유의하다. RSE = 0.4238 R-squared = 0.8637 📌 단순회귀분석과 비교 faithful . lm < - lm ( eruptions ~ waiting , data = faithful ) > summary ( faithful . lm ) Call : lm ( formula = eruptions ~ waiting , data = faithful ) Residuals : Min 1Q Median 3Q Max – 1.29917 – 0.37689 0.03508 0.34909 1.19329 Coefficients : Estimate Std . Error t value Pr ( > | t | ) ( Intercept ) – 1.874016 0.160143 – 11.70 < 2e - 16 ** * waiting 0.075628 0.002219 34.09 < 2e - 16 ** * - - - Signif . codes : 0 ‘ ** * ’ 0.001 ‘ ** ’ 0.01 ‘ * ’ 0.05 ‘ . ’ 0.1 ‘ ’ 1 Residual standard error : 0.4965 on 270 degrees of freedom Multiple R - squared : 0.8115 , Adjusted R - squared : 0.8108 F - statistic : 1162 on 1 and 270 DF , p - value : < 2.2e-16 p-value = < 2.2e-16 RSE = 0.4965 R-squared = 0.8115 따라서 다항 회귀 모델의 성능이 조금 더 뛰어나다.

[지도 학습 01] 선형 회귀와 다항 회귀

역행렬이 존재하지 않는 경우: 선형 대수에서는 역행렬이 존재하려면 행 벡터(row vector) 또는 열 벡터(column vector)끼리 선형 독립이어야 한다. 선형 독립이 아닌 경우는 첫번째 열 벡터가 두번째 열벡터의 2배 (v1 = 2*v2) 처럼 다른 벡터와 의존성이 있는 경우인데 이는 데이터셋에서 보기 힘든 케이스이다. 예를 들어 집을 m^2과 feet^2 으로 표현된 데이터셋이 있다고 하면 둘은 선형독립이 아니지만 데이터의 의미가 같으므로 하나의 열은 없애버려도 될 것이다. 이런 식으로 전처리를 하고 입력으로 주어지는 경우가 많기 때문에 역행렬이 존재하지 않는 경우는 거의 없다.

[Python] 다항 회귀(Polynomial Regression)의 이해와 구현

반응형

주요 개념

다항 회귀(Polynomial Regression)

비선형 데이터

편향(Bias)

분산(Variance)

다항 회귀(Polynomial Regression)란 비선형 데이터를 학습하기 위해 선형 모델을 사용하는 기법이다. 단순 선형 회귀(SLR)를 이용해 모든 데이터의 관계성을 직선으로 표현할 수는 없으므로 다항 회귀 또는 다중 선형 회귀(MLR) 등과 같은 조금 더 복잡한 회귀 모델이 때에 따라 최적의 회귀선을 나타내고는 한다. 각 변수의 거듭제곱을 새로운 변수로 추가하고 이 확장된 변수를 포함한 데이터셋에 선형 모델을 훈련시킨다.

다중 선형 회귀는 여러 독립 변수들이 필요한 반면 다항 회귀는 하나의 독립 변수에 대한 차수를 확장해가며 단항식이 아닌 2차, 3차 등의 회귀 모델을 도출한다. 다만 주의해야 할 점은 선형 회귀와 비선형 회귀를 구분하는 것은 “독립변수”의 선형성이 아니라, “회귀 계수”의 선형성이라는 것이다. 아래는 다항 회귀 모델로 산출되는 수식이다.

$$ f(x)=w_{n}x^n+w_{n-1}x^{n-1}+…+w_2x^2+w_1x+b $$

직선으로 어떤 데이터를 충분히 표현하지 못하는 경우를 편향(bias)이 크다고 한다. 지나치게 한 방향으로 치우쳐져 있기 때문이다.

반대로 다항 회귀에서는 차수가 너무 큰 경우에는 변동성이 커지고, 이를 고분산성을 가진다고 한다.

편향(Bias)과 분산(Variance)은 한쪽의 성능을 좋게 하면, 나머지 하나의 성능이 떨어지는 trade-off 관계에 있다. 쉽게 말해 편향을 줄이면 분산이 늘어나고, 분산을 줄이면 편향이 늘어나게 된다.

이 둘의 성능을 적절하게 맞춰 전체 오류가 가장 낮아지는 지점을 골디락스 지점이라고 한다. 이 지점을 찾는 것이 모든 회귀식과 관련된 분석에서 가장 중요하다.

다음은 python을 이용한 다항 회귀의 구현이다. 다항 회귀는 sklearn의 선형 회귀 함수에 독립 변수를 다항식으로 변환하여 삽입하면 되므로 따로 직접 구현하는 과정은 생략한다. 회귀식을 직접 구현하는 과정은 여기 를 참조하면 된다.

우선 데이터 생성이다.

Fig 1. 샘플 데이터

import matplotlib.pyplot as plt import numpy as np def make_data(size=100, noise=1): x = np.linspace(-5, 11, size).reshape(-1, 1) y = 3*x**2 + 3*x noise = np.random.uniform(-abs(noise), abs(noise), size=y.shape) yy = y + noise # 노이즈 추가 plt.scatter(x, y) plt.suptitle(“Sample Data”, size=24) plt.show() return x, yy

아래는 다항 회귀 도출을 위해 독립 변수 x에 PolynomialFeatures 함수를 적용하는 부분이다. interection_only=True로 지정하면 거듭제곱이 포항된 항은 제외된다. 즉, 1차 항과 상수항만 남게 되는 것이다. 또한 다항 회귀의 차수(degree)가 높아질수록 더 훈련데이터에 fitting을 시도하는데 이때 overfitting의 위험이 있다. 이는 특성의 개수가 과도하게 많아졌기 때문인데 이는 sklearn의 릿지(Ridge, L2 규제), 라쏘(Lasso, L1 규제) 클래스를 이용해 규제를 둠으로써 해결할 수 있다.

먼저 릿지(Ridge)는 변형된 데이터 변수를 모두 사용하지만 계수는 줄이는 방식으로 규제(Regulation)를 둔다.

다음으로 라쏘(Lasso)는 일정 변수들의 계수를 0으로 만들어 사용하지 않도록 하는 방법을 이용한다. 따라서, 라쏘를 사용하면 데이터가 손실되어 정확도가 떨어지는 위험성이 있기도 하다.

from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score def poly(x, degree=2): model = PolynomialFeatures(degree=degree, include_bias=False) x_poly = model.fit_transform(x) return x, x_poly

주어진 데이터를 다항 회귀와 단순 선형 회귀를 이용해 각각 표현해보면 아래와 같다.

Fig 2. 다항 회귀와 단순 선형 회귀

import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn.metrics import mean_squared_error from sklearn.linear_model import LinearRegression def LR(poly_x, x, y): SLR_model = LinearRegression() model = LinearRegression() SLR_model.fit(x, y) model.fit(poly_x, y) print(“w1: “, model.coef_[0][0]) print(“w2: “, model.coef_[0][1]) print(“b: “, model.intercept_[0]) SLR_result = SLR_model.predict(x) result = model.predict(poly_x) plt.figure(figsize=(10, 7)) plt.scatter(x, y) plt.plot(x, result, color=’red’, label=’Polynomial Regression’) plt.plot(x, SLR_result, color=’green’, label=’Simple Linear Regression’) plt.suptitle(“LR function”, size=24) plt.legend() plt.show() return result x, y = make_data(size=100, noise=6) x, x_poly = poly(x) result = LR(x_poly, x, y) data = np.concatenate((x, y, result), axis=1) df = pd.DataFrame(data, columns=[‘x’, ‘y’, ‘predict’]) print(“결정계수: “, r2_score(y, result)) print(“상관계수:

“, df.corr()) print(“MSE: “, mean_squared_error(y, result)) # w1: 3.088145089337895 # w2: 2.991563564168224 # b: 0.6733335620988612 # 결정계수: 0.999178861266219 # 상관계수: # x y predict # x 1.000000 0.859681 0.860034 # y 0.859681 1.000000 0.999589 # predict 0.860034 0.999589 1.000000 # MSE: 10.702276737672278

선형 회귀보다 다항 회귀가 저런 곡선 구간이 존재하는 데이터의 특징을 더 잘 설명하고 있다. 여기서 산출되는 가중치는 coef_[0][0]번부터 1차 항의 가중치로 순차적 적용을 하면 된다. 예를 들어 위 수식에서 w1=3.08, w2=2.99, b=0.67인데 \( w_1*x +w_2*(x^2)+b \)로 표현된다.

이번에는 차수를 100차로 올려보았다.

Fig 3. 100차가 적용된 다항 회귀

따로 수치로 확인하지 않아도 2차를 적용했을 때보다 좋지 않다는 것이 보인다. Ridge, Lasso나 데이터 전처리 등을 이용해 데이터를 잘 정제해가며 파라미터들을 잘 조정하면 더 좋은 결과가 나올 것이다.

아래는 전체 python 코드이다.

import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn.metrics import mean_squared_error from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score def make_data(size=100, noise=1): x = np.linspace(-5, 11, size).reshape(-1, 1) y = 3*x**2 + 3*x noise = np.random.uniform(-abs(noise), abs(noise), size=y.shape) yy = y + noise # 노이즈 추가 plt.scatter(x, y) plt.suptitle(“Sample Data”, size=24) plt.show() return x, yy def poly(x, degree=2): model = PolynomialFeatures(degree=degree, include_bias=False) x_poly = model.fit_transform(x) return x, x_poly def LR(poly_x, x, y): SLR_model = LinearRegression() model = LinearRegression() SLR_model.fit(x, y) model.fit(poly_x, y) print(“w1: “, model.coef_[0][0]) print(“w2: “, model.coef_[0][1]) print(“b: “, model.intercept_[0]) SLR_result = SLR_model.predict(x) result = model.predict(poly_x) plt.figure(figsize=(10, 7)) plt.scatter(x, y) plt.plot(x, result, color=’red’, label=’Polynomial Regression’) plt.plot(x, SLR_result, color=’green’, label=’Simple Linear Regression’) plt.suptitle(“LR function”, size=24) plt.legend() plt.show() return result x, y = make_data(size=100, noise=6) x, x_poly = poly(x) result = LR(x_poly, x, y) data = np.concatenate((x, y, result), axis=1) df = pd.DataFrame(data, columns=[‘x’, ‘y’, ‘predict’]) print(“결정계수: “, r2_score(y, result)) print(“상관계수:

“, df.corr()) print(“MSE: “, mean_squared_error(y, result))

관련 포스트

2021.12.27 – [Data Science/Statistics] – [Python] 상관 분석(Correlation Analysis)과 상관계수(Correlation Coefficient), 자기상관계수(Autocorrelation Coefficient)

2022.02.15 – [Data Science/Statistics] – [Python] 결정계수 R2 score(R-squared)와 조정된 결정계수(Adjusted R-squared)의 이해

2022.02.22 – [Data Science/Statistics] – [Python] 예측 모델 평가를 위한 지표 정리(ME, MAE, MSE, MSLE, RMSE, RMSLE, MPE, MAPE, MASE)와 구현

2022.02.23 – [Data Science/Statistics] – [Python] 단순 선형 회귀(Simple Linear Regression, SLR)의 이해와 구현

2022.02.24 – [Data Science/Statistics] – [Python] 다중 선형 회귀(Multiple Linear Regression, MLR)의 이해와 구현

참고 자료

https://dsbook.tistory.com/192

https://bioinformaticsandme.tistory.com/290

https://kimdingko-world.tistory.com/236

https://itstory1592.tistory.com/7

소스 코드

https://github.com/sehoon787/Personal_myBlog/blob/main/Data%20Science/Statistics/blog_statistics_29.py

반응형

[ML] 다중 회귀 VS 다항 회귀 (Multiple VS Polynomial regression)

728×90

우리는 머신러닝 기법을 사용할 때 회귀 관련 모델을 사용하긴 한다. 가장 기본적인 선형 회귀(Linear Regression) 모델을 많이 사용할 텐데, 데이터의 분포가 직선이 아니라 곡선 형태를 띠고 있을 경우 오차가 크게 나타날 수 있다. 그럴 때 사용할 수 있는 다항 회귀를 헷갈릴 수 있는 다중 회귀와 비교하며 알아보자.

회귀 분석 (Regression Analysis)

그게 앞서 회귀 분석부터 알아보자

정의 회귀 분석이란, 관찰된 연속형 변수들에 대해 두 변수 사이의 모형을 구한 뒤 적합도를 측정해내는 분석 방법 회귀 분석은 시간에 따라 변화하는 데이터나, 어떤 영향, 가설적 실험, 인과 관계의 모델링등의 통계적 예측에 사용

회귀 분석은 하나의 종속변수와 하나의 독립변수 사이의 관계를 분석하는 단순 회귀 분석과 하나의 종복변수와 여러 독립변수 사이의 관계를 분석하는 다중 회귀 분석으로 나뉜다. 독립변수와 종속변수는 실험으로 획득한 데이터를 통해 수학적 모델을 세우거나 통계적 모델을 세울 때 사용되는 변수의 두 종류 독립변수(independent varibale) – 입력값이나 원인 종속변수(dependent variable) – 독립변수에 의해 영향을 받는, 결과물이나 효과를 나타낸다 Ex) y=3x+5라는 함수가 있을 때 y는 x에 따라 변하므로 종속변수, x는 독립변수

정리 회귀 문제는 연속된 값을 가진 결과를 예측 하는 것, 예측하는 함수를 찾는 것이 회귀 분석의 목적

Ex) 부동산 평수에 따른 집값 가격 예측을 선형 회귀로 진행

가설함수와 비용함수 회귀 모델이 학습으로 찾은 함수를 가설 함수(hypothesis function) 라고 하며, 예측 결과의 정확도를 판단하는 함수를 비용 함수(cost function) 이라고 한다. 회귀 모델의 비용 함수는 여러 가지가 있지만 평균 제곱 오차(Mean Squared Error, MSE) 가 사용되며, 가설 함수의 결과(예측값)과 실측값(정답)의 오차 제곱의 합이 MSE이다. 좌표계에서 MSE의 의미는 아래의 그림으로 설명된다. 거리는 예측값과 실측값의 차이이며, 모든 데이터에 대해 이 값이 가장 작은 함수가 바로 가설 함수이다.

다중 회귀 (Multivariate Linear Regression)

변수(feature)가 2개 이상인 데이터의 결과를 예측하는 것

가설 함수는 다음과 같은 형태이며, n은 (feature의 개수+1)이다. +1은 bias인 첫 번째 파라미터를 포함 $$ h_\theta(x) = \theta_0 + \theta_1x_1 +\theta_2x_2 + \dots + \theta_nx_n $$

다중 회귀 분석시 독립변수간 상관관계가 높아 발생하는 다중공선성(multicollinearity) 문제 처리가 필요 다중공선성 확인은 분산팽창지수 (Variation Inflation Factor, VIF)로 확인 가능

Feature Scaling : 서로 다른 변수들은 범위가 달라서 비용함수의 그래프에서 파라미터를 임의 값으로 했을 때, 극소점하고 멀리 떨어져 있을 확률이 높다. 비용 함수의 그래프가 3차원일 때 매우 넓게 퍼져 있음. 변수의 범위가 많이 차이날 경우 경사 하강법에 시간이 오래 걸리는 단점이 있다. 따라서, 학습 속도를 높이기 위해 변수의 범위가 모두 동일하도록 스케일링 해줘야 한다. 보통 모든 변수의 범위를 -1 ~ 1 사이로 스케일링함 단, 어떤 변수의 범위 차이가 많이 나면 안된다. -100 ~ 100 인 거랑 -0.0001 ~ 0.0001 인 경우 두 feature에 대한 전처리는 필수 너무 정확할 필요는 없다. 경사 하강법을 빠르게 하기 위한 것 Mean normalization : 각 데이터에 일반적으로 적용되는 방식으로, feature 내 평균값을 뺀 다음 feature의 범위로 나눠준다. $$ \acute{x} = \frac{x – average(x)}{max(x) – min(x)} $$ 경사 하강법이 올바르게 작동 하는 경우 매 반복마다 비용 함수가 줄어들어야하기 때문에, 그래프의 형태가 그렇지 않다면 코드를 고쳐줘야 한다. 학습률이 너무 작으면 시간이 오래걸리고, 너무 크면 비용 함수가 적절히 수렴하지 않을 수 있다. 따라서 0.001부터 3배씩 학습률을 늘려보면서 적절한 값을 찾는 것이 좋음

: 서로 다른 변수들은 범위가 달라서 비용함수의 그래프에서 파라미터를 임의 값으로 했을 때, 극소점하고 멀리 떨어져 있을 확률이 높다. 비용 함수의 그래프가 3차원일 때 매우 넓게 퍼져 있음. 변수의 범위가 많이 차이날 경우 경사 하강법에 시간이 오래 걸리는 단점이 있다. 따라서,

다항 회귀 (Polynomial Regression)

$$ y=w_0 + w_1x + w_2x^2 + \dots + w_dx^d $$

독립변수의 차수를 높이는 형태

다차원의 회귀식인 다항 회귀 분석으로 단순 선형 모델의 한계를 어느정도 극복할 수 있음. 함수가 비선형, 데이터가 곡선 형태일 경우 예측에 유리 데이터에 각 특성의 제곱을 추가해주어서 특성이 추가된 비선형 데이터를 선형 회귀 모델로 훈련시키는 방법

보통 2차함수는 중간에 하강하므로 3차(cubic) 함수부터 아니면 단조증가하는 제곱근이나 로그 함수를 많이 쓴다.

다항 회귀도 결국 $ x^d=X_d $로 뒀을 때 다중 회귀식의 일종이라고 볼 수 있다.

Code를 통한 이해

Import Library

%matplotlib inline import numpy as np import pandas as pd import matplotlib import matplotlib.pyplot as plt from matplotlib import style from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score from sklearn.preprocessing import PolynomialFeatures style.use(‘seaborn-talk’) import matplotlib import matplotlib.font_manager as fm import os # 한글 폰트 사용 def change_matplotlib_font(font_download_url): FONT_PATH = ‘MY_FONT’ font_download_cmd = f”wget {font_download_url} -O {FONT_PATH}.zip” unzip_cmd = f”unzip -o {FONT_PATH}.zip -d {FONT_PATH}” os.system(font_download_cmd) os.system(unzip_cmd) font_files = fm.findSystemFonts(fontpaths=FONT_PATH) for font_file in font_files: fm.fontManager.addfont(font_file) font_name = fm.FontProperties(fname=font_files[0]).get_name() matplotlib.rc(‘font’, family=font_name) print(“font family: “, plt.rcParams[‘font.family’]) font_download_url = “https://fonts.google.com/download?family=Noto%20Sans%20KR” change_matplotlib_font(font_download_url)

# np.newaxis란 차원을 늘려줌 (10,)을 (10, 1)로 X = np.array([258, 270, 294, 320, 342, 368, 396, 446, 480, 586])[:, np.newaxis] y = np.array([236.4, 234.4, 252.8, 298.6, 314.2, 342.2, 360.8, 368.0, 391.2, 390.8]) lr = LinearRegression() pr = LinearRegression() # 기본 다항식 형태 생성 # include_bias=True로 할 경우 0차항(1)도 함께 만든다. defualt값 True quadratic = PolynomialFeatures(degree=2, include_bias=True) # 정의된 numpy 배열은 행별로 각 데이터를 다항 형태로 변형해준다 # 1과 주어진 값과 주어진 값을 제곱한 항을 추가하여 반환 X_quad = quadratic.fit_transform(X) display(X[0], X_quad[0]) # array([258]), array([1.0000e+00, 2.5800e+02, 6.6564e+04]) # 비교를 위해 단순 회귀 계산 lr.fit(X, y) X_fit = np.arange(250, 600, 10)[:, np.newaxis] y_lin_fit = lr.predict(X_fit) # 다항 회귀를 위해 변형된 모델에 다중 회귀 모델 계산 pr.fit(X_quad, y) y_quad_fit = pr.predict(quadratic.fit_transform(X_fit)) # 단순 회귀 및 다항 회귀 모델의 예측값 계산 y_lin_pred = lr.predict(X) y_quad_pred = pr.predict(X_quad) mse_lin = mean_squared_error(y, y_lin_pred) mse_quad = mean_squared_error(y, y_quad_pred) r2_lin = r2_score(y, y_lin_pred) r2_quad = r2_score(y, y_quad_pred) print(f’MSE\tLinear : {mse_lin:.2f},\tQuadratic: {mse_quad:.2f}’) print(f’R2\tLinear : {r2_lin:.2f},\tQuadratic: {r2_quad:.2f}’) plt.scatter(X, y, label=’트레이닝 데이터’) plt.plot(X_fit, y_lin_fit, label=’linear fit’, linestyle=’–‘) plt.plot(X_fit, y_quad_fit, label=’quadratic fit’) plt.legend(loc=2) plt.show()

위의 그래프를 통해서 비선형의 데이터에는 다항 회귀를 사용하여 예측하는 것이 조금 더 높은 효율을 보임을 확인할 수 있다.

Pipeline 응용

위의 과정을 make_pipeline을 통해 PolynomialFeatures와 LinearRegression 과정이 한번에 통합된 모델을 생성

# 데이터 변환 과정과 머신러닝을 연결해주는 파이프라인 from sklearn.pipeline import make_pipeline model_lr = make_pipeline(PolynomialFeatures(degree=2, include_bias=True), LinearRegression()) model_lr.fit(X, y) print(model_lr.steps[1][1].coef_) # [ 0.00000000e+00 2.39893018e+00 -2.25020109e-03]

make_pipeline으로 생성된 모델은 step에 따라 과정이 나누어진다. (steps함수도 존재하여 파이프라인에 포함된 모델의 형태를 확인할 수도 있다.

그렇게 생성된 모델이 X와 y를 fit시키고, 최종적으로 steps를 통해 학습된 모델의 형태를 확인할 수 있다.

Feature selection (변수 선택법)

1. All possible regressions

변수들의 가능한 모든 조합들로부터 최적의 모형을 찾아냄

유의한 변수가 누락되지 않는 안전한 방법

변수가 많을수록 탐색 시간이 급증함

2. Forward stepwise selection (Forward selection)

기여도가 높은 유의한 변수부터 하나씩 추가하는 기법

빠른 계산이 장점

이미 선택된 변수는 다시 제거되지 않음

3. Backward stepwise selection (Backward elimination)

모든 변수를 포함한 상태에서 불필요한 변수를 제거해나가는 방법

중요한 변수가 제외될 가능성이 매우 적음

이미 제외된 변수는 다시 선택되지 않음

머신러닝 다항 회귀 분석 개념 Machine Learning Polynomial Regression

반응형

다항 회귀 분석은 여러개의 독립변수에 의해 종속변수에 변화가 생기는 회귀 분석이다. 선형 회귀 분석은 단순이 하나의 독립변수에 따라 하나의 종속변수를 알 수 있었다고 하면, 다항 회귀 분석은 여러개의 독립변수가 있다는 점이다. 여기서 말하는 다항은 n차 식을 말한다. 독립변수가 여러개 라는 것은 원인이 여러개 라는 인과관계를 가지고, 이것들의 수치화가 가능하기 때문에 상관관계가 이루어진다.

머신러닝 다항회귀분석

다항 회귀 분석

Polynomial Regression

선형회귀분석에서 좌표평면에 선을 그렸다.

다항회귄분석에서 좌표평면에 선이 여러개가 존재하며 굴절이 발생한다.

이것은 여러개의 독립변수에 의한 영향이 있음을 알 수 있고, 수식이 여러개 발생하기 때문에 다항식이 발생한다.

다시말해

좌표평면을 선으로 표현하는 선형 회귀 분석으로 적합하지 않은 경우 다항 회귀 분석으로 독립변수와 종속변수의 상관관계를 알 수 있는 것이다.

선형으로 표혀할 수 없기에 그래프는 다양한 독립변수를 이용해 굴절이 일어날 수 있다.

당연히 함수로는 여러개의 원인이 있고, 식이 여러개 존재하게 된다.

인과관계, 상관관계에 따른 독립변수와 종속변수를 잠깐 살펴보고 넘어가자.

인과관계 = 원인, 결과 = 독립변수, 종속변수

인과관계의 수치화 = 상관관계

샘플 데이터 만들기

다항 회귀 분석을 위해 데이터를 만들었다.

이전의 데이터는 회귀 분석이라고 하기에 부끄럽기 때문에 다른 곳의 데이터를 참고하였다.

물론, 실제적인 통계데이터를 이용하는 것이 좋겠지만, 예시로 들기에는 수치가 너무 큰 이유도 있다.

단순하게 하나 사용해 본다.

vX = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22] vY = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100] print(“개별 값 : “, vX, type(vX), vX) print(“개별 값 : “, vY, type(vY), vY) plt.scatter(vX, vY) plt.show()

어딘가의 데이터와 비슷한 느낌이 들 것이다.

w3schools 의 데이터를 가지고 왔다.

이곳이 가장 쉽고 잘 되어 있기 때문이기도 하다.

파이썬으로 다항 회귀 분석 그리기

실질적으로 파이썬으로 다항 회귀 분석 곡선을 그려보자.

위의 그래프만 보자면 선형으로 그릴 수 없는 구조임을 가시적으로 알 수 있기도 하다.

위에서 언급했듯이 다항 회귀 분석은 선형 회귀 분석으로 표현할 수 없고, 다른 여러 요인인 독립변수가 수치적으로 함수표현이 가능할 경우 다항 회귀 분석 곡선을 그릴 수 있음을 언급했다.

import numpy import matplotlib.pyplot as plt print(‘—————————————————————————————————-‘) vX = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22] vY = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100] print(“개별 값 : “, vX, type(vX), vX) print(“개별 값 : “, vY, type(vY), vY) ModelPoly = numpy.poly1d(numpy.polyfit(vX, vY, 3)) LinePoly = numpy.linspace(1, 22, 100) plt.scatter(vX, vY) plt.plot(LinePoly, ModelPoly(LinePoly)) plt.show() print(‘—————————————————————————————————-‘)

결과화면을 보면 선이 아닌 굴절이 발생한 것을 알 수 있다.

선으로써 표현이 되지 않기 때문에 수치화 할 수 있는 여러 개의 식을 이용한 다항 회귀 분석이 그려진 것을 알 수 있다.

반응형

[머신러닝]회귀분석 진단, 다항회귀분석

1. 회귀분석 진단

1. 회귀분석의 가정

2. 회귀분석의 잔차의 가정

2. 다항회귀분석(Polynomial regression)

1. 다항회귀분석이 필요한 경우

2. 다항회귀 적합

1. 회귀분석 진단

-적합한 회귀모델이 잘 만들어진 모델인지 진단이 필요함

1. 회귀분석의 가정

-1. 잔차(epsilon)가 i.i.d이고 평균이 0, 분산이 sigma^2인 정규분포를 따른다

-2. Y가 정규분포를 따른다

-3. X와 Y가 선형관계이다

2. 회귀분석의 잔차의 가정

-정규성, 독립성, 등분산성(잔차가 동일한 분산을 가짐)

-이 3가지를 만족하면 잘 만들어진 회귀모델로 판단(잔차 검정 필요)

-진단 방법:

1. Residuals 산점도

-x축: t 시점의 잔차, y축: (t+1) 시점의 잔차

-t시점과 (t+1)시점의 잔차의 correlration이 강하면(trend가 존재) 독립성을 만족하지 않음(잔차간 상관있음)

2. Normal Q-Q plot(quantile-quantile)

-data에 대한 quantile값과 이론적인 정규분포의 quantile을 비교

-x축: 정규분포의 quantile, y축: 잔차의 quantile

-기울기가 1인 직선형태(y=x)를 따르면 정규성을 만족함

3. Residual vs Fitted plot

-x축: 예측값(fitted value), y축: 잔차

-예측값에 따라 잔차가 변하면 등분산성을 만족하지 않음

-잔차가 가정에 위배된 경우:

1) Y에 대해 log 또는 root를 씌워줌(예측시 다시 exp 또는 제곱을 해야함)

=> 비선형회귀가 더 잘맞을 수도 있지만 더 간단한 모델로 선택

2) 이상치 제거(함부로 제거 x)

3) 다항회귀분석(더 복잡한 모델 사용)

2. 다항회귀분석(Polynomial regression)

-비선형 회귀모형(이차항 이상 포함)

-단점: 과적합(overfitting)

1. 다항회귀분석이 필요한 경우

1) 독립변수 X와 종속변수 Y가 비선형 관계일 때 사용

=> X와 Y의 산점도(scatter plot)를 보고 판단(데이터가 많은 경우 확인 불가)

2) 회귀의 가정이 위배된 경우

=> 잔차분석- residual plot을 보고 판단(3가지 잔차가정이 만족하는지)

2. 다항회귀 적합

-선형회귀분석과 동일하게 잔차제곱합(SSE)가 최소화되도록 회귀계수 추정

-기존 변수+2차항 모델은 과적합이 심해지고 변수간 correlation과 다중공산성이 커질 수 있음

-일반적으로 2차항만 있는 모델 사용

-항이 추가 될수록 과적합이 잘일어나기 때문에 고차항은 신중하게 추가(보통 3차 이상은 잘 안넣음)

키워드에 대한 정보 다항 회귀 분석

다음은 Bing에서 다항 회귀 분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식

  • 통계
  • 데이터분석
  • 회귀분석
  • 선형회귀식
  • 선형회귀모델
  • 단순회귀분석
  • 다항회귀분석
  • 다중회귀분석
  • regression analysis

통계데이터분석 #- #회귀분석 #- #다항회귀분석 #🔑 #polynomial #regression #analysis #| #굴절을 #갖는 #곡선의 #추세선 #| #독립변수의 #n차 #다항식


YouTube에서 다항 회귀 분석 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 통계데이터분석 – 회귀분석 – 다항회귀분석 🔑 polynomial regression analysis | 굴절을 갖는 곡선의 추세선 | 독립변수의 n차 다항식 | 다항 회귀 분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  비즈니스 모델 캔버스 양식 | 8차시. 사업모델 구체화 및 비즈니스 모델 캔버스 작성법 181 개의 정답

Leave a Reply

Your email address will not be published. Required fields are marked *