# -*- coding: utf-8 -*-
"""
Created on Mon Aug 6 08:48:58 2018
@author: wangxihe
"""
#%%首先我们使用传统的统计学回归方法,然后在使用多中机器学习
#数据说明
#CRIM:城镇人均犯罪率。
#ZN:住宅用地超过 25000 sq.ft. 的比例。
#INDUS:城镇非零售商用土地的比例。
#CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
#NOX:一氧化氮浓度。
#RM:住宅平均房间数。
#AGE:1940 年之前建成的自用房屋比例。
#DIS:到波士顿五个中心区域的加权距离。
#RAD:辐射性公路的接近指数。
#TAX:每 10000 美元的全值财产税率。
#PTRATIO:城镇师生比例。
#B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
#LSTAT:人口中地位低下者的比例。
#MEDV:自住房的平均房价,以千美元计。
#%%
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
import statsmodels.formula.api as smf
from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
n_fold=10
seed=7
scoring='neg_mean_squared_error'
os.chdir('E:\spyderwork\wxh\数据科学\线性回归')
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
hprice =pd.read_csv('housing.csv', names=names, delim_whitespace=True)
X=hprice.ix[:,0:13].copy()
Y=hprice.ix[:,13].copy()
train,test,train_y,test_y=train_test_split(X,Y,test_size=0.2,random_state=seed)
len(train)
len(train_y)
dfy=pd.DataFrame(train_y,columns=['MEDV'])
traindata=pd.concat([train,dfy], axis=1)
dftesty=pd.DataFrame(test_y,columns=['MEDV'])
testdata=pd.concat([test,dftesty], axis=1)
#%%
#分类变量
var_c=['CHAS','RAD']
#连续变量相关性检查
var_d=['MEDV','CRIM','ZN','INDUS','NOX','RM','AGE','DIS','TAX','PRTATIO','B','LSTAT']
corr=hprice[var_d].corr()
sns.heatmap(corr)
#%%
# 利用众数减去中位数的差值除以四分位距来查找是否有可能存在异常值
abs((X[var_d[1:]].mode().iloc[0,] - X[var_d[1:]].median()) /
(X[var_d[1:]].quantile(0.75) - X[var_d[1:]].quantile(0.25)))
#%%分类变量
CHAST=hprice.CHAS.value_counts()
CHAST.plot(kind='bar')
#双样本T检验
#二分类双样本T检验
CHAS0=hprice[hprice['CHAS']==0]['MEDV']
CHAS1=hprice[hprice['CHAS']==1]['MEDV']
#方差齐性检验
leveneTest=stats.levene(CHAS0,CHAS1,center='median')
print('w-value=%6.4f, p-value=%6.4f' %leveneTest)
stats.stats.ttest_ind(CHAS0,CHAS1,equal_var=False) #显著
#多分类方差分析
RADT=hprice.RAD.value_counts()
RADT.sort_values().plot(kind='barh')
sm.stats.anova_lm(ols('MEDV~C(RAD)',data=hprice).fit())#显著
#%%共线性
def vif(df, col_i):
cols = list(df.columns)
cols.remove(col_i)
cols_noti = cols
formula = c