2019未来杯高校AI挑战赛 > 城市-房产租金预测(第一部分赛题分析和对数据做EDA)

折月煮酒 提交于 2020-01-07 21:46:54

赛题说明

认识数据(赛题说明)

  • 了解比赛的背景(比赛要求选手根据给定数据集,建立模型,预测房屋租金)
  • 分类问题还是回归问题(租金是个连续值,所以是回归问题)
  • 熟悉比赛的评分函数:
    Alt

对比赛数据做EDA

  • 数据分析
    • 缺失值分析(有缺失值的话要进行补充,比如用中位数、众数)
    • 特征值分析(看看有没有异常值等等)
    • 是否有单调特征列(单调的特征列很大可能是时间)
    • 特征nunique分布
    • 出现在测试集中的community,但是在训练集中数量较少(保证训练集和测测试集数据保持一致)
    • 统计特征值出现频次大于100的特征
    • Label分布
    • 不同的特征值的样本的label的分布

分割线,正文

1.导入所需要的包及载入数据

import warnings
warnings.filterwarnings('ignore')#导入warning包,利用过滤器来实现忽略警告语句
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#载入数据
data_train = pd.read_csv('C:\\Users\\qiyao_wu\\Documents\\GitHub\\team-learning\\数据竞赛(房租预测)\\数据集\\train_data.csv')
data_test = pd.read_csv('C:\\Users\\qiyao_wu\\Documents\\GitHub\\team-learning\\数据竞赛(房租预测)\\数据集\\test_a.csv')
data_train['Type'] = 'Train'
data_test['Type'] = 'Test'
data_all = pd.concat([data_train, data_test], ignore_index = True)

2.总体情况一览(看是否导入成功)

print(data_train.info())
print(data_train.describe())
data_train.head()

对输出文档进行简要分析
训练集包含41440行*52列数据
目标变量是 真实房租价格-tradeMoney
大多数是int和float类型;字段是object型的后续要进行处理

3.分类特征和连续类特征(打开数据集自我判断)

#按照字段属性来进行特征分类
categorical_feas = ['rentType', 'houseType', 'houseFloor', 'region', 'plate', 'houseToward', 'houseDecoration',
    'communityName','city','region','plate','buildYear']

numerical_feas=['ID','area','totalFloor','saleSecHouseNum','subwayStationNum',
    'busStationNum','interSchoolNum','schoolNum','privateSchoolNum','hospitalNum',
    'drugStoreNum','gymNum','bankNum','shopNum','parkNum','mallNum','superMarketNum',
    'totalTradeMoney','totalTradeArea','tradeMeanPrice','tradeSecNum','totalNewTradeMoney',
    'totalNewTradeArea','tradeNewMeanPrice','tradeNewNum','remainNewNum','supplyNewNum',
    'supplyLandNum','supplyLandArea','tradeLandNum','tradeLandArea','landTotalPrice',
    'landMeanPrice','totalWorkers','newWorkers','residentPopulation','pv','uv','lookNum']

4.缺失值分析

#缺失值分析
def missing_value(df):
    alldata_na = pd.DataFrame(df.isnull().sum(), columns = {'missingNum'})
    alldata_na['existNum'] = len(df) - alldata_na['missingNum']
    alldata_na['sum'] = len(df)
    alldata_na['missingRatio'] = alldata_na['missingNum']/len(df)*100
    alldata_na['dtype'] = df.dtypes
    #ascending 默认True升序排序
    alldata_na = alldata_na[alldata_na['missingNum']>0].reset_index().sort_values(by = ['missingNum','index'],ascending = [False,True])
    alldata_na.set_index('index',inplace = True)
    return alldata_na

缺失值
通过编写函数的方式来直接获取结果,养成这种习惯。

5.单调特征列分析

个人理解这个*主要是依靠于数据集的排列*,时间列在特征工程的时候,不同情况下能有很多变种形式,比如按年月日分箱,或者按不同的维度在时间上聚合分组,等等

#是否有单调特征列(单调的很大可能是时间)
def increasing(vals):
    cnt = 0
    len_ = len(vals)
    for i in range(len_-1):
        if vals[i+1] > vals[i]:
            cnt += 1
    return cnt
fea_cols = [col for col in data_train.columns]
for col in fea_cols:
    cnt = increasing(data_train[col].values)
    if cnt / data_train.shape[0] >= 0.55:
        print('单调特征:', col)
        print("单调特征值个数:", cnt)
        print('单调特征值比例:', cnt/data_train.shape[0])
单调特征: tradeTime
单调特征值个数: 24085
单调特征值比例: 0.5812017374517374

6.特征nunique分布(针对字段为object类型)

#特征nunique分布,针对object类型
for feature in categorical_feas:
    print(feature + '特征分布如下:')
    print(data_train[feature].value_counts())
    if feature != 'communityName':  #communityName值太多,暂且不看图表
        plt.hist(data_train[feature], bins = 3)
        plt.show()

运行结果
在这里插入图片描述

简要分析

用自带函数value_counts() 来得到每个分类变量的 种类 分布;
并且简单画出柱状图。

rentType:4种,且绝大多数是无用的未知方式;
houseType:104种,绝大多数在3室及以下;
houseFloor:3种,分布较为均匀;
region: 15种;
plate: 66种;
houseToward: 10种;
houseDecoration: 4种,一大半是其他;
buildYear: 80种;
communityName: 4236种,且分布较为稀疏;

此步骤是为之后数据处理和特征工程做准备,先理解每个字段的含义以及分布,之后需要根据实际含义对分类变量做不同的处理。

7.统计特征值频次大于100的特征(还是针对object类型)

# 统计特征值出现频次大于100的特征
for feature in categorical_feas:
    df_value_counts = pd.DataFrame(data_train[feature].value_counts())
    df_value_counts = df_value_counts.reset_index()
    df_value_counts.columns = [feature, 'counts'] # change column names
    print(df_value_counts[df_value_counts['counts'] >= 100])

简要分析

因为数据量过大的,如果出现小于100频次的特征值可以一起并入其他来进行清洗。

8.Label分布(主要是看数值特征的分布问题,集中程度等等)

这边看的是我们目标量tradeMoney 的分布

# Labe 分布
fig,axes = plt.subplots(2,3,figsize=(20,5))
fig.set_size_inches(20,12)
sns.distplot(data_train['tradeMoney'],ax=axes[0][0])
sns.distplot(data_train[(data_train['tradeMoney']<=20000)]['tradeMoney'],ax=axes[0][1])
sns.distplot(data_train[(data_train['tradeMoney']>20000)&(data_train['tradeMoney']<=50000)]['tradeMoney'],ax=axes[0][2])
sns.distplot(data_train[(data_train['tradeMoney']>50000)&(data_train['tradeMoney']<=100000)]['tradeMoney'],ax=axes[1][0])
sns.distplot(data_train[(data_train['tradeMoney']>100000)]['tradeMoney'],ax=axes[1][1])
print("money<=10000",len(data_train[(data_train['tradeMoney']<=10000)]['tradeMoney']))
print("10000<money<=20000",len(data_train[(data_train['tradeMoney']>10000)&(data_train['tradeMoney']<=20000)]['tradeMoney']))
print("20000<money<=50000",len(data_train[(data_train['tradeMoney']>20000)&(data_train['tradeMoney']<=50000)]['tradeMoney']))
print("50000<money<=100000",len(data_train[(data_train['tradeMoney']>50000)&(data_train['tradeMoney']<=100000)]['tradeMoney']))
print("100000<money",len(data_train[(data_train['tradeMoney']>100000)]['tradeMoney']))

输出结果:
在这里插入图片描述

简要分析

查看目标变量各个区间的分布,也可以看每个特征值和目标变量之间的二元关系图。
通过图中我们可以看到大部分房价租金是集中在10000元以下的,并呈右偏分布
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!