파이썬) 다중선형회귀그래프 그리기 (+sklearn, mpl_toolkits)
#1. 단순선형회귀 그래프 예제는 많다:
1개의 독립변수와 1개의 종속변수를 선정하여 그 인과관계를 시각화하는 방법 중 하나인 단순선형회귀그래프는 직관적으로 x축, y축으로 좌표평면 상에 그려 이해하기 쉽고 코드도 단순해서 그런지 예제들이 엄청 많다.
x축을 독립변수, y축을 종속변수로 하는 좌표 평면상에 전체 데이터들의 (x, y) 좌표값을 점으로 좌표평면 상에 그리면 산점도가 된다. 그리고 그 산점도의 경향성을 따라 계산한 추세식을 위에 덧붙여 그리면 단순선형회귀 그래프가 완성된다.
자세한 내용은 별도로 포스팅한 적이 있다:
https://lovelydiary.tistory.com/339
반면, 종속변수가 1개 독립변수가 2개 이상인 다중선형회귀그래프는 2D로 그리기 힘들어서 그런지 예제들이 별로 보이지가 않았다. 다중선형그래프의 경우, 실제로 어떤 모양으로 구현이 될지 그런 시각화 자료를 통해 어떤 insight를 얻을 수 있을지 궁금했다. 그래서 이리저리 찾아보다가 발견한 코드로 그려 본 다중선형회귀그래프를 기록해 보았다.
#2. 다중선형회귀 그래프 그리기
R에 내장되어 있는 car93이라는 데이터로 다중선형회귀그래프를 그려보았다. 3D로 표현하기 때문에 x, y, z 즉, 변수 3개(독립변수 2개: x, y, 종속변수 1개: z)까지만 그릴 수 있고 독립변수가 3개 이상이 되는 다중선형회귀의 경우, 해당 그래프로를 그릴 수 없는 것으로 보인다.
1) 그래프를 그리기에 앞서 패키지들을 설치해서 메서드들을 불러와야 한다.
여기서 mpl_toolkits의 경우, pip3 명령어를 통해 패키지를 설치해야 할 것 같이 보이지만 matplotlib 패키지를 이미 설치했으면 mpl_tollkits는 설치하지 않아도 바로 import 해올 수 있다. 그밖에 pandas, numpy, sklearn은 기존에 설치한 이력이 없다면 패키지 설치를 진행해야 한다.
mpl이 matplotlib의 약자인 것으로 보인다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import linear_model
2) 데이터를 전처리한다.
먼저 다중선형회귀그래프로 시각화 하고자 하는 데이터를 불러온다. 그리고 2개의 독립변수 값과 1개의 종속변수의 값을 각각 X, Y 변수에 담아야 하는데, 독립변수의 경우 두 값을 짝을 지어서 배열로 만들어 주어야 한다. 즉, [[독립변수1값, 독립변수2값], [독립변수 1값, 독립변수2값] ...] 이런 식의 2차 배열로 정리해야 하며 해당 전처리를 하기 위해 reshape 함수를 사용하였다.
이번에는 x, y, z라는 변수에 독립변수1의 값, 독립변수2의 값, 종속변수 값을 각각 array의 형태로 할당해주어야 한다.
또한, x_pred, y_pred에 각 독립변수들의 range 값을 할당 하는데 각 데이터의 최소값, 최대값으로 범위를 지정하고 그 구간을 10으로 지정하여 각각 10개의 배열을 할당 받았다.
3) 다중선형회귀모델을 만든다.
LinearRegression 함수로 다중선형회귀 모델을 만들고, 앞서 만든 독립변수들의 전처리한 배열값인 model_viz값을 넣어 다중선형회귀식으로부터 예측값을 얻는다. Regression 값이라고 볼 수 있다. 또한, 만든 모델의 설명력을 의미하는 "결정계수", R2을 구할 수도 있는데 그래프에 텍스트로 들어가는 것이기 때문에 넣어도 되고 불필요하다면 제거해도 된다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# Data 준비 (R에 내장된 cars93 데이터를 가져왔음)
# 독립변수 Horsepower(마력), MPG.city(도시연비)로 Price(차 가격)를 예측해보고자 한다
df=pd.read_excel('cars93.xlsx')
#df에서 Horsepower, MPG.city 열의 값을 불러와서 배열로 짝지음
X = df[['Horsepower', 'MPG.city']].values.reshape(-1,2)
Y = df['Price']
# 시각화를 위한 데이터 준비
x = X[:, 0] #Horsepower 열 값만 array로 가져옴
y = X[:, 1] #MPG.city 열 값만 array로 가져옴
z = Y
#각 독립변수들의 range 지정: 데이터 중 최소값, 최대값, 그 구간을 10으로 설정
x_pred = np.linspace(df['Horsepower'].min(), df['Horsepower'].max(), 10)
y_pred = np.linspace(df['MPG.city'].min(), df['MPG.city'].max(), 10)
xx_pred, yy_pred = np.meshgrid(x_pred, y_pred)
model_viz = np.array([xx_pred.flatten(), yy_pred.flatten()]).T
#sklearn의 linear_model.LinearRegression()함수로 다중선형회귀식을 만들고,
ols = linear_model.LinearRegression()
model = ols.fit(X, Y)
#위에서 만든 model_viz 값을 넣어 다중선형회귀식의 예측값을 얻음
predicted = model.predict(model_viz)
# 해당 다중선형회귀식의 결정계수 R^2을 구함: 회귀식의 실제 데이터에 대한 설명력을 확인
r2 = model.score(X, Y)
#다중선형회귀 그래프 그리기
plt.style.use('default')
fig = plt.figure(figsize=(12, 4))
ax1 = fig.add_subplot(131, projection='3d')
ax2 = fig.add_subplot(132, projection='3d')
ax3 = fig.add_subplot(133, projection='3d')
axes = [ax1, ax2, ax3]
for ax in axes:
ax.plot(x, y, z, color='k', zorder=15, linestyle='none', marker='o', alpha=0.5) #검은색 마커들
ax.scatter(xx_pred.flatten(), yy_pred.flatten(), predicted, s=20, edgecolor='#70b3f0') #파란색 마커들
ax.set_xlabel('Horsepower', fontsize=12) #해당 축을 설명하는 라벨
ax.set_ylabel('MPG.city', fontsize=12)
ax.set_zlabel('Price', fontsize=12)
ax.locator_params(nbins=6, axis='x') #해당 축의 구간 개수 (쪼개진 구간도 포함)
ax.locator_params(nbins=4, axis='y')
ax.locator_params(nbins=4, axis='z')
#높이와 방위각을 조절해서 보고 싶은 위치를 조정할 수 있음
#elevation (높이), azimuth (방위각)
ax1.view_init(elev=27, azim=112)
ax2.view_init(elev=4, azim=114)
ax3.view_init(elev=60, azim=165)
fig.suptitle('$R^2 = %.2f$' % r2, fontsize=20)
fig.tight_layout()
|
cs |
[코드 출처: https://aegis4048.github.io/mutiple_linear_regression_and_visualization_in_python]
[주석은 본인이 작성]
4) 다중선형회귀 그래프 그리기
본격적인 그래프 그리기는 plt 혹은 pyplot으로부터 시작된다. 그래프의 주축이 되는 코드는 plot(선그래프), scatter(산점도그래프)이고 그외의 옵션들을 입력해서 그래프의 완성도를 높일 수 있다.
#3. 다중선형회귀그래프 출력 결과는 다음과 같다.
subplot과 반복문을 통해 3개의 다중선형그래프를 다양한 각도에서 그려 보았다. 결정계수도 가운데에 출력하였다. 결정계수가 0.63인, 즉 데이터의 63%를 설명할 수 있는 다중선형모델이 만들어졌다. 두번째 각도의 그래프를 보니 마력(Horsepower)이 높아질수록 차량 가격(Price)이 높아지는 추세를 확인할 수 있고, 세번째 각도의 그래프에서는 마력(Horsepower)이 높아질수록 도시연비(MPG.city)가 낮아지는 경향을 볼 수 있었다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."