데이터 분석가
article thumbnail
  • 프로젝트에서는 머신러닝에 앞서 PCC와 Regression analysis등의 통계분석을 통해 머신러닝에 넣어줄 변수를 선정하기로 하였습니다.
  • PCC와 VIF를 통해 변수를 1차적으로 선택하고 선택한 변수들로 Regression analysis를 수행하여 p-value값을 기준으로 유의한 변수를 선정합니다.

PCC

  • 종속변수는 전세가인 JS_Price로 하고 독립변수들과의 PCC를 계산하였습니다.
  • 독립변수 중 범주형 데이터가 존재하여 처음에는 원핫인코딩을 진행하였다가 독립변수의 수가 너무 많아져 타겟인코딩으로 대체하여 독립변수를 인코딩 해주었습니다.
# 결과를 저장할 DataFrame 생성
result_df = pd.DataFrame(columns=['Column_Name', 'PCC', 'p-value'])

# 'JS_Price'와 다른 열 간의 PCC 및 p-value 계산 및 저장
for column in df.columns:
    if column != 'JS_Price':
        if df[column].dtype != object:
            correlation, p_value = pearsonr(df['JS_Price'], df[column])
            result_df = result_df.append({'Column_Name': column, 'PCC': correlation, 'p-value': p_value}, ignore_index=True)

result_df.sort_values(by='PCC', ascending=False).reset_index(drop=True)
  • PCC결과는 아래와 같았고, 유의확률을 0.01로 하여 p-value가 0.01을 초과하는 변수를 1차적으로 제거하였습니다.

VIF

  • 데이터에 대해 standard scaling을 적용한 후 PCC결과가 반영된 독립변수와 JS_Price를 종속변수로 하여 `sm.OLS(Y, X).fit()` 회귀모델을 생성하였습니다.
  • 독립변수들간의 다중공선성을 배제하기 위해 VIF를 계산하여 VIF값이 10보다 큰 변수를 2차적으로 제거하였습니다.

Regression analysis

  • PCC와 VIF의 결과가 반영된 독립변수를 토대로 회귀모델을 생성하고 p-value값이 0.01보다 큰 변수를 제거하여 최종적으로 머신러닝에 입력할 독립변수를 정하였습니다.

  • 최종 선택 변수는 ['Sell_Price', 'UR', 'Population', 'JS_BA', 'SDT_index', 'Building_Use_y', 'Region_Name_y', 'Shortest_Distance_to_School', 'Building_Age', 'Crime_Rates', 'longitude']로 정해졌습니다.

잔차분석

  • 선형 회귀분석이기 때문에 선형성, 정규성, 등분산성, 독립성을 만족하는지 확인하기 위해 잔차분석을 시행해줍니다.

선형성

  • 예측값을 x축으로 잔차를 y축으로 두고 그래프를 그린 결과 극단값의 영향이 있지만 대부분의 예측값에서 선형성을 만족한다고 판단한다.

정규성

  • Q-Q플롯에서 점들이 점선을 크게 벗어나고 p-value값이 0으로 0.05보다 작으므로 정규성을 만족하지 않는다고 판단한다.
ShapiroResult(statistic=0.8079574108123779, pvalue=0.0)

등분산성

  • 모든 예측값들에 대해 잔차의 분산이 동일하지 않은 모습을 보이므로 등분산성을 만족하지 않는다고 판단한다.

독립성

  • 독립성을 나타내는 Durbin-Watson의 값이 1.993로 1.5~2.5사이이므로 잔차 간의 자기상관이 없다고 할 수 있으며, 회귀 모델은 독립성 가정을 만족한다고 판단한다.

잔차분석 결과

  • 잔차분석의 결과 회귀분석이 정규성과 등분산성의 가정을 만족하지 않는 것으로 보임으로 다음의 처리를 통해 가정을 만족시킬 수 있도록 해본다. 이에 대한 내용은 다음 블로그부터 다룰 예정이다.

 

  • 극단값을 제거
    • IQR기준으로 극단값 제거
    • 건물용도별로 데이터 분할해보기
    • 지역별로 데이터 분할해보기
  • 종속변수를 로그변환
profile

데이터 분석가

@이꾹꾹

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!