빅데이터/Machine-Learning

유형별 데이터 분석 맛보기 02 - EDA & 회귀분석(3)

H-V 2022. 2. 16. 16:47

패스트캠퍼스 '직장인을 위한 파이썬 데이터분석 올인원 패키치 Online' 참조

 

 

 

  • 보스턴 데이터셋으로 회귀분석이 어떻게 쓰이는지를 알아 보자!

 

 

01 데이터 전처리

  • 피처들의 회귀분석에 적합하게 만들어야 한다. 피처들의 단위 표준화가 필요하다
  • 예로 아래 그래프를 보면 각각의 피처들의 값이 우후죽순이다.
    CRIM = 0~80, ZN=0~100, INDUS=0~20, CHAS=0.0~1.0
  • 'Sklearn' 패키지를 훑어볼때 배웠던 'Scaler'로 하면 된다.
  • 여기서 Scaler는 중고등학교때 배웠던 'z'값(표준화) 구하기가 반영된 패키지다. z값 수치로 표본들이 평균으로부터 몇 구간의 표준 편차만큼 떨어져 있는지 알려주는 값 (Scaler를 하게되면 평균 0 을 기준으로 표준편차 -2~2  내외로 세팅됨)
# 1. 데이터 전처리 - 피처들의 단위 표준화
from sklearn.preprocessing import StandardScaler

# feature standardization
scaler = StandardScaler()

# 타겟값을 제외하고 표준화를 하고자 하는 컬럼들을 변수화
scale_columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM' , 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']

# DF에 새롭게 컬럼을 추가하여 적용하는데 적용되는 값은 scaler가 들어간 값이 들어가도록 함
df[scale_columns] = scaler.fit_transform(df[scale_columns])

Object 타입을 제외하고 표준화가 된것을 볼 수 있다.
수정 전 뒤죽박죽의 데이터 형태

 

 

▶ 데이터가 이제 사용될 수 있도록 표준화가 진행이 되었으면 회귀분석의 지도학습을 위한 데이터셋을 분리를 해줘야 한다.

# 데이터셋 분리
from sklearn.model_selection import train_test_split

# x = feautre 학습 데이터
# y = 예측값
x = df[scale_columns]
y = df['CMEDV']

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=33)

x_train.shape
(404, 13)

 

▶ 전 시간에 공부했던대로 쉽게 말해 데이터셋을 분리하고 분리된 train데이터로 학습을 시킨다 (x-문제,y-답 을 던져주고 학습을 시킴)

# 데이터 학습
from sklearn import linear_model
from sklearn.metrics import mean_squared_error # 모델 평가용
from math import sqrt

# train regression model
lr = linear_model.LinearRegression() # 사용하고자 하는 모델을 불러와 변수화
model = lr.fit(x_train, y_train) # 그리고 문제와 정답지를 주고 학습을 시킴

print(lr.coef_)
[-0.95549078  1.18690662  0.22303997  0.76659756 -1.78400866  2.83991455
 -0.05556583 -3.28406695  2.84479571 -2.33740727 -1.77815381  0.79772973
 -4.17382086]
  • .coef_를 통해서 이 모델의 w/b가 어떻게 학습 됬는지 볼 수 있다. 'Y=wX+b'가 성립이 되어 13개의 x에 대한 y값이 .나온다

 

 

▶ 학습 계수를 그래프로 확인!

# 학습 계수를 그래프로 확인
# 이유는 학습한 w들이 어떤 피처에서 어떤 영향이 있는지 볼 수 있음
# 예로, 1번은 양의 상관정도가 나오고 2번은 음수에 가깝다는 등을 그래프로 볼 수 있음

# .rcParams
plt.rcParams['figure.figsize'] = [12,16]
coefs = lr.coef_.tolist() # .coef_로 받아온 데이터를 .tolist() = 파이썬 리스트 형식으로 바꿔줌
coefs_series = pd.Series(coefs) # 판다스/넘파이로 출력하기 위해 시리즈로 변환



x_labels = scale_columns
ax = coefs_series.plot.barh() # 그래프 세팅을 위해 변수화
ax.set_title('Feature Coef Graph')
ax.set_xlabel('coef')
ax.set_ylabel('x_features')
ax.set_yticklabels(x_labels); # 눈금 이름

 

 

 

02 학습 결과 해석

  • 회귀분석과 같은 예측 모델에서는 'R2 Score'/'RMSE Score'를 많이 사용

1) R2 Score (결정 계수)

# 학습 결과 해석
print(model.score(x_train, y_train))
0.7490284664199387


print(model.score(x_test, y_test))
0.700934213532155
  • 1에 가까울수록 모델의 성능이 좋다 즉 예측을 잘 한다는 말
  • 훈련에서는 75점, 실제 예측에서는 70점에 가까운 예측을 함. 

 

2) RMSE Score - MSE에 루트를 씌운 값. 예측값과 실제값의 차이가 적을수록 좋음

# RMSE Score
y_predictions = lr.predict(x_train) # x문제집을 던져주고 거기에 답을 예측하도록 함
print(sqrt(mean_squared_error(y_train, y_predictions))) # 실제 답과 예측 답을 비교하여 수치로 나타냄

# RMSE Score
y_predictions = lr.predict(x_test) # x문제집을 던져주고 거기에 답을 예측하도록 함
print(sqrt(mean_squared_error(y_test, y_predictions))) # 실제 답과 예측 답을 비교하여 수치로 나타냄


4.672162734008588
4.614951784913309
  • 실제 = 4.67, 예측 4.61 차이가 많이 없으므로 모델의 성능이 좋다고 볼 수 있음

 

03 유의성과 다중 공선성

# 피처 유의성 검성
import statsmodels.api as sm

x_train = sm.add_constant(x_train)
model = sm.OLS(y_train, x_train).fit()
model.summary()

- 회귀분석 결과 해석시에는 결정계수확인 → 모형의 적합도 확인 → 회귀계수확인 → t값/유의확률 확인

  1. 결정계수가 0.749로써 1에 가깝다. 나쁘지 않은 모델
  2. F값이 0에 가까울수록 도출된 회귀식이 적절하다고 볼 수 있음
  3. Prob(F-statistics) - 회귀식이 유의미한지 판단. 0.05이하일 경우 변수 끼리 매우 관련있다고 판단 (현재는 0)
  4. P>ltl - 독립변수들의 유의확률, 0.05보다 작아야 유의미한 관계를 가지고 있다고 할 수 있음. 
  5. 쉽게 말해 P값이 0에 가까울수록 회귀식이 유의하다고 볼 수 있고 F값이 높아질수록 P값은 낮아진다고 한다. F값 89는 상당히 높은값이라 P값은 0에 가깝게 나왔고 따라서 회귀식 자체는 유의
  6. 즉 INDUS/AGE 변수는 무의미하기때문에 다음에는 제거를 하고 돌려야 성능이 더 잘나옴. 
  7. 이제 표를 해석하자면 집값을 예측할때 집값에 영향을 주는 피처들은 INDUS/AGE를 제외하고 대부분이 다 영향을 준다는것을 알 수 있다
    참고 링크 - https://ysyblog.tistory.com/119
 

[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel)

Statsmodel을 활용한 회귀분석 statsmodels 패키지에서는 OLS 클래스를 사용하여 선형 회귀분석을 실시한다 독립변수와 종속변수가 모두 포함된 데이터프레임이 생성되며, 상수항 결합은 하지 않아도

ysyblog.tistory.com

 

 

- 다중공산성 - 

# 다중공산성
from statsmodels.stats.outliers_influence import variance_inflation_factor

vlf = pd.DataFrame()
vlf['VIF Factor'] = [variance_inflation_factor(x_train.values, i) for i in range(x_train.shape[1])]
vlf['Feature'] = x_train.columns

vlf.round(1)

  • 제거기준은 10이상이기때문에 다중공산성의 문제는 없어 보인다. 

 

 

  • 정리를 하자면 회귀분석은 '예측'을 하는 모델인데 여기서의 예측은 2023년 이 집값의 가격은? 이런 예측이 아니다
  • 지금까지 해왔던 프로세스를 되짚어 보면 집값이라는 피처에 다른 피처들을 대입시켜 특정조건에 이런 집값이 나온다라는것을 '예측'하는게 회귀분석인 것이다. 예로 방6개면 가격이 이정도 일거다 라고 예측을 할 수 있는것이다.