datawhale数据竞赛day01-认识数据

datawhale数据竞赛day01-认识数据

2019未来杯高校AI挑战赛 > 城市-房产租金预测”

认识数据

  • 了解比赛的背景
  • 分类问题还是回归问题
  • 熟悉比赛的评分函数

对比赛数据做EDA

  • 缺失值分析
  • 特征值分析
  • 是否有单调特征列(单调的特征列很大可能是时间)
  • 特征nunique分布
  • 统计特征值出现频次大于100的特征
  • Label分布
  • 不同的特征值的样本的label的分布

认识数据

背景:数据集中的数据类别包括租赁房源、小区、二手房、配套、新房、土地、人口、客户、真实租金等。
要求:建立模型,预测房屋租金,此问题是跟回归问题
比赛的评分函数:待了解

对比赛数据做ETA

一、缺失值分析

  1. 统计数据的总条数:41440
print(len(data_train))
  1. 查看数据的基本情况
print(data_train.describe())

1
2
3
3. 查看有无缺失值

print(data_train.isnull().sum())

1
2
可见pv,uv缺失18条记录
函数式编程

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

二、特征值分析

大多数数据都是int或float型;有部分字段是object型,即文本型中文或英文的,如rentType字段,这些字段在之后需要做处理

  1. 定量数据
    定量数据有:area,totalFloor,saleSecHouseNum,
    subwayStationNum,busStationNum, interSchoolNum, schoolNum, privateSchoolNum,hospitalNum, drugStoreNum, gymNum, bankNum, shopNum, parkNum, mallNum, superMarketNum,totalTradeMoney ,totalTradeArea,tradeMeanPrice,tradeSecNum,totalNewTradeMoney,totaINewTradeArea,tradeNewMeanPrice,tradeNewNum,remainNewNum,supplyNewNum,supplyLandNum,supplyLandArea,tradeLandNum,tradeLandArea,IandTotalPrice,landMeanPrice,totalworkers,newWorkers,residentPopulation,PV,uv,lookNum

  2. 定性数据
    定性数据:rentType,houseType,houseFloor,houseToward,houseDecoration,communityName,city,region,plate,buildYear

三、是否有单调特征列

单调特征列很可能是时间,判断单调列,可以做类似时间序列,如果两个都是单调,可以探索他们的关系

def increasing(vals):
    flag = 0
    for i in range(len(vals) - 1):
        if vals[i+1] > vals[i]:
            flag += 1
    return flag

cols = [col for col in data_train.columns]
for col in cols:
    inc = increasing(data_train[col].values)
    if inc/data_train.shape[0] >= 0.55:
        print('单调特征:', col)
        print('单调特征值个数:', inc)
        print('单调特征值比例:', inc / data_train.shape[0])

单调特征列结果

四、特征nunique分布

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

定性数据

  1. rentType
print(data_train['rentType'].unique())
print(data_train['rentType'].describe())
data_train['rentType'].value_counts().plot(kind = 'pie')


4种,大多数都是未知方式

  1. houseType
print(data_train['houseType'].unique())
print(data_train['houseType'].describe())
print(data_train['houseType'].value_counts())

1
2
3
4
104种,大多数都是3室以下,其中1室1厅1卫的最多,2室1厅1卫和2室2厅1卫次之

  1. houseFloor
print(data_train['houseFloor'].unique())
print(data_train['houseFloor'].describe())
print(data_train['houseFloor'].value_counts())
data_train['houseFloor'].value_counts().plot(kind = 'pie')

1
3种,分布较为均匀

  1. houseToward
    1
    2
    10种,朝南的最多

  2. houseDecoration
    1
    4种,大半是其他,精装次之

  3. communityName
    1
    2
    4236种,分布较为稀疏

  4. city
    在这里插入图片描述
    全都在SH

  5. region
    1
    2
    15种,RG00002最多

  6. plate
    12
    3
    15种,有些地方较为密集

  7. buildYear
    1
    2
    3
    80种,大多都在94年后

定量数据

五、统计特征值出现频率大于100的特征

此步骤和特征nunique分布结合步骤结合起来看,有一些小于100的是可以直接统一归类为其他的

#统计特征值出现频率大于100的特征
cols = [col for col in data_train.columns]
for col in cols:
    df_value_counts = pd.DataFrame(data_train[col].value_counts())
    #重新定义索引
    df_value_counts = df_value_counts.reset_index()
    df_value_counts.columns = [col, 'counts']
    print(df_value_counts[df_value_counts['counts'] >= 100])

1
2
2
3
4
5
5
6
6
7
8
9
10
11

六、Label分布

#看label分布
fig,axes = plt.subplots(2,3,figsize = (20,5))
fig.set_size_inches(10,6)
sns.distplot(data_train[data_train['tradeMoney'] <= 10000]['tradeMoney'], ax = axes[0][0])
sns.distplot(data_train[(data_train['tradeMoney']>10000) & (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('money>10000', len(data_train[data_train['tradeMoney'] > 100000]['tradeMoney']))

在这里插入图片描述
在这里插入图片描述
将目标变量tradeMoney分组,并查看每组间分布,可以看出绝大多数都是集中在10000以下,且该分布左偏

八、不同的特征值的样本的label的分布

可以和多样的特征结合起来分析,但是现在没有时间了,待完善

发布了6 篇原创文章 · 获赞 0 · 访问量 82

猜你喜欢

转载自blog.csdn.net/m0_37836661/article/details/103871524