파이썬에서 처음으로 단일 회귀 분석

단회귀 분석의 의미는 알아보면 얼마든지 나옵니다만, 스스로 실제로 프로그램을 써 보는 것으로, 이해가 깊어지면 좋을까라고 생각해, Python 를 사용해 시험해 보고 싶습니다.

일단 단회귀 분석에 대한 설명으로는 다음과 같은 예가 있습니다.
1. 하나의 목적 변수(y)를 하나의 설명 변수(x)로 예측하는 것.
2. 그 관계를 y = ax + b 라는 1차 방정식의 형태로 나타낸다.
※ a 는 기울기, b 는 절편

테스트 환경은 언제 설치했는지 기억하지 않는 Jupyter Notebook을 사용합니다.
사용한 버전은 다음과 같습니다.
The version of the notebook server is: 6.0.0
Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
[GCC 7.3.0]

pandas



pandas (판다스, 팬더 또는 팬더)는 데이터를 변환하고 분석하는 라이브러리입니다.
이것을 사용해, 데이터를 읽어 갑니다.
사용한 버전은 다음과 같습니다.
import pandas as pd
print(pd.__version__)
# 0.24.2

데이터 로드



이번에는 48명분의 신장(x)과 체중(y)의 데이터(sample.csv)를 사용해 보겠습니다.

sample.csv
x,y
152,57
173,78
172,83
178,58
166,63
175,66
158,66
163,74
157,64
165,68
176,68
165,60
147,63
153,63
146,47
156,49
145,59
181,66
160,74
140,55
152,55
165,56
170,65
159,51
151,52
167,51
177,82
155,63
159,45
170,66
154,56
163,60
161,70
165,70
150,57
158,53
163,67
186,69
168,68
170,74
155,60
159,49
170,87
163,50
166,58
161,69
159,60
171,71

sample.csv 파일을 읽고 처음 세 줄을 출력해 봅니다.
다음과 같이 읽는 것 같습니다.
df = pd.read_csv('sample.csv')
df.head(3)
    x   y
0   152     57
1   173     78
2   172     83

pandas.read_csv로 데이터를 읽으면 DataFrame이라는 형식으로 데이터가 만들어지는 것 같습니다.
pandas.read_csv
DataFrame

각 열 데이터를 변수 x, y에 저장합니다.
x = df.x
y = df.y

matplotlib



matplotlib (매트 플롯 리브)는 그래프 그리기 라이브러리.
사용한 버전은 다음과 같습니다.
import matplotlib
matplotlib.__version__
# '3.1.0'

그래프 그리기


import matplotlib.pyplot as plt
plt.plot(x, y)
plt.show()



모든 점이 선으로 연결된 그래프가 표시되었습니다.
기대하고 있던 것은 점만이 표시되고 있는 그래프이었으므로, 이하와 같이 수정합니다.
import matplotlib.pyplot as plt
plt.plot(x, y, 'o')
plt.show()



scikit-learn



scikit-learn(사이킷 런)은 과학기술 계산을 실시하기 위한 Python 패키지 NumPy(남파이 또는 남파이)와 SciPy(사이파이) 위에 구축된 기계 학습용 라이브러리.
사용한 버전은 다음과 같습니다.
import sklearn
print(sklearn.__version__)
# 0.21.2

scikit-learn을 사용하면 쉽게 단회귀 분석할 수 있을 것 같습니다.
LinearRegression

데이터 학습



선형 회귀 모델(LinearRegression)의 인스턴스를 생성하고 데이터를 학습(fit)시킵니다.
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x, y)
# ValueError: Expected 2D array, got 1D array instead:

라고 생각하면, 에러가 나 버렸습니다. 2차원 배열이 필요한 곳에 1차원 배열을 제공하는 것 같습니다.
x, y 의 격납 방법을 변경해, 다시 학습해 봅니다.
x = df[['x']]
y = df[['y']]
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x, y)
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

이번에는 가져온 것 같습니다.
여기의 부분은, 원래의 x 와 y 그대로도 다음과 같이 정의하면 움직여 줄 것입니다.
# values で numpy.ndarray 型に変換し、np.reshape(-1, 1)でn行1列に変換する
model.fit(x.values.reshape(-1,1), y.values.reshape(-1,1))

데이터 예측



그러면 예측(predict)시켜 보겠습니다.
plt.plot(x, y, 'o')
plt.plot(x, model.predict(x), linestyle="solid")
plt.show()


설명 변수(x)에서 목적 변수(y)를 예측한 결과 오른쪽 어깨 상승(신장이 늘어날수록 체중이 늘어난다)의 선이 그려졌습니다.

이 직선의 "기울기"와 "절편"에 대해서는, 각각 coef_ 와 intercept_ 속성이 보관 유지하고 있는 것 같기 때문에, 그것들을 출력해 보면, 직선의 방정식을 얻을 수 있습니다.
print('y = %.2fx + %.2f' % (model.coef_ , model.intercept_))
# y = 0.52x + -20.94

이상으로부터, a(기울기)와 b(절편)를 알 수 있어, x(신장)로부터 y(체중)를 예측할 수 있는, 즉 "단회귀 분석"을 실현할 수 있었다고 하게 됩니다 .

좋은 웹페이지 즐겨찾기