欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

datawhale数据竞赛day01-认识数据

程序员文章站 2022-05-17 08:25:14
...

datawhale数据竞赛day01-认识数据

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

认识数据

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

对比赛数据做EDA

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

认识数据

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

对比赛数据做ETA

一、缺失值分析

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

datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
3. 查看有无缺失值

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

datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
可见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])

datawhale数据竞赛day01-认识数据

四、特征nunique分布

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

定性数据

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

datawhale数据竞赛day01-认识数据
4种,大多数都是未知方式

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

datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
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')

datawhale数据竞赛day01-认识数据
3种,分布较为均匀

  1. houseToward
    datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    10种,朝南的最多

  2. houseDecoration
    datawhale数据竞赛day01-认识数据
    4种,大半是其他,精装次之

  3. communityName
    datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    4236种,分布较为稀疏

  4. city
    datawhale数据竞赛day01-认识数据
    全都在SH

  5. region
    datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    15种,RG00002最多

  6. plate
    datawhale数据竞赛day01-认识数据datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    15种,有些地方较为密集

  7. buildYear
    datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    datawhale数据竞赛day01-认识数据
    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])

datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据

六、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']))

datawhale数据竞赛day01-认识数据
datawhale数据竞赛day01-认识数据
将目标变量tradeMoney分组,并查看每组间分布,可以看出绝大多数都是集中在10000以下,且该分布左偏

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

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