数据源:https://tianchi.aliyun.com/competition/entrance/231715/information

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. %matplotlib inline
  6. plt.rc("font",family="SimHei",size="12") #解决中文无法显示的问题
  1. #导入数据
  2. listings=pd.read_csv(\'F:\\python\\天池_短租数据分析\\listings.csv\')
  1. listings.info()
  2. listings.head(5)
  3. listings.shape
  4. listings.describe()
  1. <class \'pandas.core.frame.DataFrame\'>
  2. RangeIndex: 28452 entries, 0 to 28451
  3. Data columns (total 16 columns):
  4. # Column Non-Null Count Dtype
  5. --- ------ -------------- -----
  6. 0 id 28452 non-null int64
  7. 1 name 28451 non-null object
  8. 2 host_id 28452 non-null int64
  9. 3 host_name 28452 non-null object
  10. 4 neighbourhood_group 0 non-null float64
  11. 5 neighbourhood 28452 non-null object
  12. 6 latitude 28452 non-null float64
  13. 7 longitude 28452 non-null float64
  14. 8 room_type 28452 non-null object
  15. 9 price 28452 non-null int64
  16. 10 minimum_nights 28452 non-null int64
  17. 11 number_of_reviews 28452 non-null int64
  18. 12 last_review 17294 non-null object
  19. 13 reviews_per_month 17294 non-null float64
  20. 14 calculated_host_listings_count 28452 non-null int64
  21. 15 availability_365 28452 non-null int64
  22. dtypes: float64(4), int64(7), object(5)
  23. memory usage: 3.5+ MB

 数据情况如上面截图,主要是有关可租房屋的信息,字段含义和英文含义基本一致,主要包括:房东ID、房东姓名、所属行政区、经纬度、房间类型、价格、最小可租天数、评论数量、最后一次评论时间、每月评论占比、可出租房屋、每年可出租时长等

  1. #数据缺失计算
  2. missing=listings.isnull().sum()
  3. missing[missing>0].plot.bar()

 缺失比例

  1. #数据缺失比例计算
  2. missing=listings.isnull().sum()/len(listings)
  3. missing[missing>0].plot.bar()

 

 可以看出来,一共有四个字段有缺失,其中有一个字段缺失特别严重,缺失比例达到了100%,可以删除,还有2个缺失40%左右,也可以考虑将此删除

  1. #数据特征
  2. numeric_features = listings.select_dtypes(include=[np.number])
  3. numeric_features.columns
  4. #类别特征
  5. categorical_features = listings.select_dtypes(include=[np.object])
  6. categorical_features.columns
  1. for cat_fea in categorical_features:
  2. print(cat_fea + "的特征分布如下:")
  3. print("{}特征有个{}不同的值".format(cat_fea, listings[cat_fea].nunique()))
  4. print(listings[cat_fea].value_counts())

类别特征[\’name\’, \’host_name\’, \’neighbourhood\’, \’room_type\’, \’last_review\’]

  1. #使用str.split,记住不要忘记.str,不然会出错
  2. listings[\'neighbourhood\']=listings[\'neighbourhood\'].str.split(\'/\').str[0]

原来是这样:

  1. 0 朝阳区 / Chaoyang
  2. 1 密云县 / Miyun
  3. 2 东城区
  4. 3 东城区
  5. 4 朝阳区 / Chaoyang
  6. Name: neighbourhood, dtype: object

现在是这样:

  1. 0 朝阳区
  2. 1 密云县
  3. 2 东城区
  4. 3 东城区
  5. 4 朝阳区
  6. Name: neighbourhood, dtype: object
  1. #按照neighbourhood和room_type分组,计算每个值的个数和price的均值
  2. neigh_roomtype=listings.groupby([\'neighbourhood\',\'room_type\']).agg({\'id\':\'size\',\'price\':\'mean\'})
  3. #将ID改为number
  4. neigh_roomtype=neigh_roomtype.rename(columns={\'id\':\'number\'})
  5. #先对number计算统计可视化等
  6. number_n_r=neigh_roomtype.unstack()[\'number\']
  7. number_n_r.plot(figsize=(12,5),title=\'1:不同房屋类型在不同地区的数量\')

  1. #条形图
  2. number_n_r.plot.bar(figsize=(12,5),title=\'1:不同房屋类型在不同地区的数量\')

 

  1. #画饼图(sum(1)是按行求和)
  2. number_n_r.sum(1).sort_values().plot.pie(figsize=(6,6),autopct=\'%.2f%%\',title=\'2:房屋地区占比\')

  1. #画饼图(按列求和)
  2. number_n_r.sum(0).sort_values().plot.pie(figsize=(6,6),autopct=\'%.2f%%\',title=\'3:房屋类型占比\')

  1. #先对price计算统计可视化等
  2. price_r=neigh_roomtype.unstack()[\'price\']
  3. price_r.plot.bar(figsize=(12,5),title=\'1:不同房屋类型在不同地区的均价\')
  4. #先对price计算统计可视化等
  5. price_r=neigh_roomtype.unstack()[\'price\']
  6. price_r.plot(figsize=(12,5),title=\'1:不同房屋类型在不同地区的均价\')

 

 

  1. #计不同地区均价
  2. listings.groupby(\'neighbourhood\')[\'price\'].mean().sort_values().plot.bar(figsize=(8,8),title=\'4:不同地区房源均价\')

 不能是这样,因为这样没有考虑个数,直接使用三个值平均,这种做法是错误了

  1. price_r.mean(1).sort_values().plot.bar(figsize=(6,6),title=\'2:房屋地区占比\')
  1. #不同房屋类型均价
  2. listings.groupby(\'room_type\')[\'price\'].mean().sort_values().plot.bar(figsize=(8,8),title=\'5:不同房屋类型均价\')

  1. #不同房源地区和房子类型均价
  2. n_r_data=listings.groupby([\'neighbourhood\',\'room_type\'])[\'price\'].mean()
  3. plt.figure(figsize=(8,8))
  4. plt.title(\'6:不同房屋类型在不同地区的均价\')
  5. sns.barplot(x=\'neighbourhood\',y=\'price\',hue=\'room_type\',data=n_r_data.reset_index())
  6. #或者是这样子
  7. #先对price计算统计可视化等
  8. price_r=neigh_roomtype.unstack()[\'price\']
  9. price_r.plot.bar(figsize=(12,5),title=\'1:不同房屋类型在不同地区的均价\')

 

 

  1. listings[[\'name\', \'host_name\']].head()

 

 

 房东名字应该是没有什么信息的,可以考虑去掉,name可以从中提取一些特征

  1. listings[\'last_review\'].head()
  1. 0 2019-03-04
  2. 1 2017-10-08
  3. 2 2019-02-05
  4. 3 2016-12-03
  5. 4 2018-08-01
  6. Name: last_review, dtype: object

 可以构造一些有用的特征

  1. \'\'\'
  2. Index([\'id\', \'host_id\', \'neighbourhood_group\', \'latitude\', \'longitude\',
  3. \'price\', \'minimum_nights\', \'number_of_reviews\', \'reviews_per_month\',
  4. \'calculated_host_listings_count\', \'availability_365\'],
  5. dtype=\'object\')
  6. \'\'\'
  7. for i in numeric_features.columns:
  8. print(i,listings[i].value_counts())

 

  1. #可以先保留一下id ,然后再删除
  2. id=listings[\'id\']
  3. listings=listings.drop([\'id\', \'host_id\'],axis=1)
  1. listings=listings.drop(\'neighbourhood_group\',axis=1)
  1. sns.regplot(\'latitude\',\'price\',data=listings)
  2. sns.regplot(\'longitude\',\'price\',data=listings)

 

  1. sns.regplot(\'minimum_nights\',\'price\',data=listings)

  1. sns.boxplot(\'minimum_nights\',data=listings)

 

 

 

 这肯定有异常值了,而且一般不都是最小入住天数是1天吗

  1. #看的出来最小入住天数是1晚,还有30天这个值还挺多的有609个,应该是月租
  2. listings[\'minimum_nights\'].value_counts().sort_index()
  1. for i in [\'number_of_reviews\',
  2. \'calculated_host_listings_count\', \'availability_365\']:
  3. sns.regplot(i,\'price\',data=listings)
  4. plt.show()

 

 

 

  1. sns.boxplot(listings[\'price\'])
  2. sns.distplot(listings[\'price\'])

 

 

 大于10000的值影响太大了,可以只画10000以下的

  1. sns.distplot(listings[listings[\'price\']<=10000][\'price\'])

 

 

查看一下描述性

  1. listings[\'price\'].describe()
  1. count 28452.000000
  2. mean 611.203325
  3. std 1623.535077
  4. min 0.000000
  5. 25% 235.000000
  6. 50% 389.000000
  7. 75% 577.000000
  8. max 68983.000000
  9. Name: price, dtype: float64

 再看一下1000以下的

  1. sns.distplot(listings[listings[\'price\']<=1000][\'price\'])

 

为什么会有0,好诡异,青年旅馆吗

  1. listings[\'price\'].value_counts().sort_index()
  2. #0 3

 

log一下

  1. sns.distplot(np.log(listings[\'price\']+1))
  2. sns.distplot(np.log(listings[listings[\'price\']<=1000][\'price\']+1))

 

 

 

 

先复制一份数据,省得对原数据造成影响

  1. train=listings.copy()

 

先对类别特征进行构造特征

 

版权声明:本文为cgmcoding原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cgmcoding/p/13215022.html