import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 다중공선성
# 컬런의 상관관계에 관한 내용
# 상관관계가 너무 높으면 제거하거나 차원 축소하는것이 나을지도 모른다
# 코릴레이션(corr)과 비슷한것
# 다중공선성 확인을 위해서는 스케일링을 먼저 해준다.(컬런이 다르면 값들의 차이가 크기 때문에)

data = {'size' : [30, 35, 40, 45, 50, 45],
        'rooms': [2, 2, 3, 3, 4, 3],
        'window': [2, 2, 3, 3, 4, 3],
        'year' : [2010, 2015, 2010, 2015, 2010, 2014],
        'price': [1.5, 1.8, 2.0, 2.2, 2.5, 2.3]
        }

df = pd.DataFrame(data)

# print(df)

x = df[['size', 'rooms','window', 'year']]
y = df['price']
scaler = StandardScaler()# 다중공선성은 통상 스탠다드 스케일러 사용한다
x_scaled = scaler.fit_transform(x)
print(x_scaled)

vif = pd.DataFrame()
vif['variables']=x.columns #컬런 이름 넣기. 3개

        # aaa for i in range(x_scaled.shape[1])  #포문의 내용이 aaa에 들어간다
vif['VIF'] = [variance_inflation_factor(x_scaled, i) for i in range(x_scaled.shape[1])] #vif의 VIF에는 포문의 반환값 세개가 들어가있다.

#   variables         VIF #다중공선성 출력하기
# 0      size  378.444444
# 1     rooms  406.111111
# 2      year   53.333333
#다중공선성이 10 이하일경우 높지 않다고 판단한다.
#현 데이터는 다중공선성이 너무 높다. 
#이럴경우 가장 높은 컬런부터 제거해본다.

print('=====================rooms 제거전=======================')
print(vif)

lr = LinearRegression()
lr.fit(x_scaled, y)
y_pred = lr.predict(x_scaled)
r2 = r2_score(y, y_pred)
print('rooms 제거 전 r2 :', r2)

# r2 : 0.9938931297709924

print('=====================rooms 제거후=======================')

x_scaled=df[['size','window', 'year']]

vif2 = pd.DataFrame()
vif2['variables']=x_scaled.columns #컬런 이름 넣기. 3개
vif2['VIF'] = [variance_inflation_factor(x_scaled, i) for i in range(x_scaled.shape[1])] #vif의 VIF에는 포문의 반환값 세개가 들어가있다.
print(vif2)

lr = LinearRegression()
lr.fit(x_scaled, y)
y_pred = lr.predict(x_scaled)
r2 = r2_score(y, y_pred)
print('rooms 제거 후 r2 :', r2)

# =====================rooms 제거전=======================
#   variables         VIF
# 0      size  378.444444
# 1     rooms         inf
# 2    window         inf
# 3      year   53.333333
# rooms 제거 전 r2 : 0.9938931297709924
# =====================rooms 제거후=======================
#   variables         VIF
# 0      size  295.182375
# 1    window  139.509263
# 2      year   56.881874
# rooms 제거 후 r2 : 0.9938931297709924

m66_VIF2