一、实验目的与要求
1、掌握使用numpy和pandas库处理数据的基本方法。2、掌握使用Sklearn库对多元线性回归算法的实现及其评价方法。3、掌握使用matplotlib结合pandas库对数据分析可视化处理的基本方法。
二、实验内容
1、利用python中pandas等库完成对数据的预处理,最后将处理好的文件进行保存。2、利用pandas、matplotlib等库完成对预处理数据的可视化。3、结合pandas、matplotlib库对聚类完成的结果进行可视化处理。
三、实验步骤
1.数据预处理
(1)导入所需要使用的包
import osimport reimport pandas as pdimport numpy as np
(2)读取文件
input_dir='/data/bigfiles/'files=os.listdir(input_dir)data_list=[]for file in files: data_list.append(pd.read_excel(input_dir +file))
(3)查看数据的基本统计信息
data=pd.concat(data_list)data
(4)删除csv文件中索引列,并重置
data= data.reset_index()data=data.drop("index",axis=1)data.head(10)
(5)处理空值
(data.isnull()).sum()#检查重复值(data.duplicated()).sum()#抛弃重复值data.drop_duplicates(inplace=True)
(6)删除部分数据的中文字符,将数据类型转换为float型
#使用正则表达式查看单价列中含有的中文字符种类data.总价.map(lambda x: re.sub('[^\u4E00-\u9FA5]','',x)).unique()print(data.单价.map(lambda x: re.sub('[^\u4E00-\u9FA5]','',x)).unique())data['单价']=data.单价.map(lambda x : round(float(re.findall(r'单价(.*?)元/平米',x)[0])/10000,2))#删去字符串“万”,将类型转换float,保留两位小数data['总价']=data.总价.map(lambda x : round(float(x.replace('万','')),2))data#拆分房屋信息所在列a = data.房屋信息.map(lambda x : len(x.split('|')))data= data[a == 7]data.loc[:,'户型'] = data.房屋信息.map(lambda x : x.split('|')[0])data.loc[:,'面积'] = data.房屋信息.map(lambda x : x.split('|')[1])data.loc[:,'朝向'] = data.房屋信息.map(lambda x : x.split('|')[2])data.loc[:,'类型'] = data.房屋信息.map(lambda x : x.split('|')[3])data.loc[:,'楼层'] = data.房屋信息.map(lambda x : x.split('|')[4])data.loc[:,'建成时间'] = data.房屋信息.map(lambda x : x.split('|')[5])data.loc[:,'结构'] = data.房屋信息.map(lambda x : x.split('|')[6])# data = data.drop('房屋信息',axis = 1)data['面积']=data.面积.map(lambda x : round(float(x.replace('平米','')),2))len(data[~data.建成时间.str.contains('年建')])# data['建成时间']=data.建成时间.map(lambda x:float(x.replace('年建','')))data.head()
(7)对部分数据进行独热码编码
#对户型进行独热编码data=data.join(pd.get_dummies(data.户型))# data = data.drop('户型',axis = 1)#对区域类型结构print(data.区域.unique())data=data.join(pd.get_dummies(data.区域))data.head()
(8)对数据进行标准化处理
# #说白了就是清晰数据# #去掉字符串前后空格data.head()data.类型.unique()data.结构.unique()data['类型'] = data.类型.str.strip()data['结构'] = data.结构.str.strip()#丢弃无效数据data=data[(data.类型 != '其他')&(data.结构!='暂无数据')]#使用独热码编码data =data.join(pd.get_dummies(data.类型))data =data.join(pd.get_dummies(data.结构))# data = data.drop('类型',axis = 1)#处理朝向列种类def my_get_dummies(ser): base_dirt=['东','南','西','北','东北','东南','西南','西北'] base_data=np.zeros((len(ser),),dtype=np.int) df = pd.DataFrame({'东':base_data,'南':base_data,'西':base_data,'北':base_data,'东北':base_data,'东南':base_data,'西南':base_data, '西北':base_data}) for irec in ser.index: rec=ser[irec].strip().split(' ') for dirt in rec: #检查是否存在8个基本方位以外的记录 if dirt not in base_dirt: print(dirt) else: df[dirt][irec]=1 return dfdata=data.join(my_get_dummies(data.朝向))#删除原有列data=data.drop('朝向',axis=1)data.head()#检测数据格式一致性(~data.楼层.str.contains('楼层')).sum()#舍弃数据data = data[data.楼层.str.contains('楼层')]#查看数据唯一值data.楼层.unique()#提取所在楼层data['所在楼层']=data.楼层.map(lambda x:x.split('(')[0])#对所在楼层进行独热编码data=data.join(pd.get_dummies(data.所在楼层))#使用正则表达式提取数据并转换为int类型data['总楼层'] =data.楼层.map(lambda x: int(re.findall(r'\(共(.*?)\层',x)[0]))#删除原有列# data = data.drop('楼层',axis=1)# data = data.drop('所在楼层',axis=1)data.head(5)# #删除发布时间列信息# data=data.drop('发布时间',axis=1)#去掉空格data=data.rename(columns = lambda x:x.strip())
(9)存储预处理后的文件
#保存数据,如果服务器挂掉重新跑一边但不要跑这段代码output_file_path = '/data/bigfiles/房产信息_预处理.xlsx'data.to_excel(output_file_path,index=False)
2、数据分析
(1)读取预处理后的文件
#建议不要运行如过服务不挂的话可以运行input_dir='/data/bigfiles/房产信息_预处(9)存储预处理后的文件理.xlsx'data=pd.read_excel(input_dir)
(2)利用二八原则,划分训练集和测试集
#二分原则为80%为样例数据作为模型训练集20%为样本数据作为测试集检查估计能力import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_split #划分测试集与训练集from sklearn.linear_model import LinearRegression as LR #回归模块##在ipy中显示图像%matplotlib inline#设置绘图显示中文字体plt.rcParams['font.sans-serif']=['SimHei']pd.set_option('display.max_columns', None)print(data.columns)#特征提取total_price=data.总价unit_price=data.单价house_area=data.面积house_type=data[['0室0厅', '0室1厅', '1室0厅', '1室1厅', '1室2厅', '2室0厅', '2室1厅', '2室2厅', '3室0厅', '3室1厅', '3室2厅', '3室3厅', '3室4厅', '4室0厅', '4室1厅', '4室2厅', '4室3厅', '4室4厅', '5室0厅', '5室1厅', '5室2厅', '5室3厅', '5室4厅', '6室1厅', '6室2厅', '6室3厅', '6室4厅', '6室5厅', '7室1厅', '7室2厅', '7室3厅', '7室4厅', '7室5厅', '8室2厅', '8室3厅', '9室2厅']]region=data[['双流', '大邑' ,'天府新区' ,'天府新区南区', '彭州', '新津', '新都', '武侯' ,'温江', '简阳', '蒲江', '郫都' ,'都江堰', '金堂' ,'金牛', '锦江', '青白江' ,'青羊' ,'高新', '高新西', '龙泉驿']]house_class= data[['塔楼','板塔结合','板楼']]house_layer=data[['低楼层','中楼层','高楼层']]house_dirt=data[['东','南','西','北','东北','东南','西南','西北']]total_layer=data.总楼层# 选择自变量与因变量X = pd.concat([house_area,house_type,region,house_class,house_layer,house_dirt,total_layer],axis=1)Y = unit_priceprint(type(X))X = X.fillna(0)#划分测试集与训练集Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)
(3)建立多元回归模型并训练
reg=LR().fit(Xtrain,Ytrain)#这里其实就是建立模型把训练的值放进去返回一个拟合对象#预测Yhat=reg.predict(Xtest)#查看回归系数print(list(zip(X.columns,reg.coef_)))#查看截距print(reg.intercept_)
(4)检验模型效果
from sklearn.metrics import mean_squared_error #MSEfrom sklearn.metrics import mean_absolute_error #MAEfrom sklearn.metrics import r2_score #R2mse= mean_squared_error(Ytest,Yhat)mae= mean_absolute_error(Ytest,Yhat)r2=r2_score(Ytest,Yhat)#调整R2n=Xtest.shape[0]k=Xtest.shape[1]
(5)计算估计值
adj_r2=1-(1-r2)*((n-1)/(n-k-1))
(6)判断模型拟合的好坏程度
print('MSE:'+str(mse))print('MAE:'+str(mae))print('R2:'+str(r2))print('调整后R2:'+str(adj_r2))
3、数据可视化
(1)将训练集真实值与模型预测值用折线图的形式表现出来
#绘制前50条记录n=50#绘制模型预测值plt.plot(range(len(Yhat[:n])),Yhat[:n])#绘制模型真实值plt.plot(range(len(Ytrain[:n])),Ytrain[:n])#图形设置plt.xlabel('个例')plt.ylabel('单价')plt.title('线性回归预测结果')plt.legend(["预估","实际"])
(2)将测试集真实值与模型预测值用折线图的形式表现出来
#绘制前50条记录n=50#绘制模型预测值plt.plot(range(len(Yhat[:n])),Yhat[:n])#绘制模型真实值plt.plot(range(len(Ytest[:n])),Ytest[:n])#图形设置plt.xlabel('个例')plt.ylabel('单价')plt.title('线性回归预测结果')plt.legend(["预估","实际"])
链接:https://pan.baidu.com/s/1ed7wUs1hwdqTKJrhaHmtyw?pwd=2222
提取码:2222