共享单车项目分析

共享单车项目分析

作者:马建龙

目录

  1. 提出问题
  2. 理解数据
  • 采集数据
  • 导入数据
  • 查看数据集信息
  1. 数据清洗
  • 数据预处理
  1. 数据分析
  2. 数据可视化
  3. 方案实施
  • 报告撰写

1、提出问题

根据kaggle项目:共享单车的数据进行描述性统计分析,查看不同因素对共享单车使用数量的影响。

2、理解数据

2.1 采集数据

从kaggle网站下载,https://www.kaggle.com/c/bike-sharing-demand

2.1 导入数据

1import numpy as np
2import pandas as pd
3import datetime
1%matplotlib inline
1bike=pd.read_csv("C:/Users/my/data/train(bike).csv")

2.3 查看数据信息

datetime(日期) - hourly date + timestamp

season(季节) - 1 = spring, 2 = summer, 3 = fall, 4 = winter

holiday(是否假日) - whether the day is considered a holiday

workingday(是否工作日) - whether the day is neither a weekend nor holiday

weather(天气等级) -

1: Clear, Few clouds, Partly cloudy 清澈,少云,多云。

2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist 雾+阴天,雾+碎云、雾+少云、雾

3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds 小雪、小雨+雷暴+散云,小雨+云

4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog 暴雨+冰雹+雷暴+雾,雪+雾

temp(温度) - temperature in Celsius

atemp(体感温度) - "feels like" temperature in Celsius

humidity(相对湿度) - relative humidity

windspeed(风速) - wind speed

casual(临时租赁数量) - number of non-registered user rentals initiated

registered(会员租赁数量) - number of registered user rentals initiated

count(总租赁数量) - number of total rentals

1bike.shape

(10886, 12)

1bike.info()

<class 'pandas.core.frame.DataFrame'> RangeIndex: 10886 entries, 0 to 10885 Data columns (total 12 columns): datetime 10886 non-null object season 10886 non-null int64 holiday 10886 non-null int64 workingday 10886 non-null int64 weather 10886 non-null int64 temp 10886 non-null float64 atemp 10886 non-null float64 humidity 10886 non-null int64 windspeed 10886 non-null float64 casual 10886 non-null int64 registered 10886 non-null int64 count 10886 non-null int64 dtypes: float64(3), int64(8), object(1) memory usage: 1020.6+ KB

1bike.head()
          datetime  season  holiday  workingday  weather  temp   atemp  \

0 2011-01-01 00:00:00 1 0 0 1 9.84 14.395
1 2011-01-01 01:00:00 1 0 0 1 9.02 13.635
2 2011-01-01 02:00:00 1 0 0 1 9.02 13.635
3 2011-01-01 03:00:00 1 0 0 1 9.84 14.395
4 2011-01-01 04:00:00 1 0 0 1 9.84 14.395

humidity windspeed casual registered count
0 81 0.0 3 13 16
1 80 0.0 8 32 40
2 80 0.0 5 27 32
3 75 0.0 3 10 13
4 75 0.0 0 1 1

数据清洗

3.1 选择子集

本数据暂时不用选择子集

3.2 列重命名

1bike.columns=["日期","季节","节假日","工作日","天气","温度","感觉温度","湿度","风速","非注册用户","注册用户","数量"]
1bike.head()
                日期  季节  节假日  工作日  天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  \

0 2011-01-01 00:00:00 1 0 0 1 9.84 14.395 81 0.0 3 13
1 2011-01-01 01:00:00 1 0 0 1 9.02 13.635 80 0.0 8 32
2 2011-01-01 02:00:00 1 0 0 1 9.02 13.635 80 0.0 5 27
3 2011-01-01 03:00:00 1 0 0 1 9.84 14.395 75 0.0 3 10
4 2011-01-01 04:00:00 1 0 0 1 9.84 14.395 75 0.0 0 1

数量
0 16
1 40
2 32
3 13
4 1

3.3 缺失值处理

  • 本数据没有缺失值

3.4 替换值

  • 本数据变量中的分类变量有:季节,节假日,工作日,天气,需要进行变换
1jijie={1:"春",2:"夏",3:"秋",4:"冬"}
1jijie

{1: '春', 2: '夏', 3: '秋', 4: '冬'}

1bike["季节"]=bike["季节"].map(jijie)
1tianqi={1:"晴,少云",2:"薄雾,少云",3:"小雨,小雪,散云",4:"大雨,冰雹,雪,雾"}
1bike["天气"]=bike["天气"].map(tianqi)
  • 节假日和工作日,需要先把日期列转换为date格式

3.5 重复值处理

1bike.drop_duplicates(inplace=True)
1bike.shape#没有重复值

(10886, 12)

3.6 字符类型转换

1bike.dtypes

日期 object 季节 object 节假日 int64 工作日 int64 天气 object 温度 float64 感觉温度 float64 湿度 int64 风速 float64 非注册用户 int64 注册用户 int64 数量 int64 dtype: object

1bike.loc[0,"日期"].split(" ")

['2011-01-01', '00:00:00']

1a=[]
2b=[]
3for i in bike["日期"]:
4    c=i.split(" ")
5    a.append(c[0])
6    b.append(c[1])
7        
1bike["日期"]=a
1bike["时间"]=b
1bike.head()
       日期 季节  节假日  工作日    天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  \

0 2011-01-01 春 0 0 晴,少云 9.84 14.395 81 0.0 3 13 16
1 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 8 32 40
2 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 5 27 32
3 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 3 10 13
4 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 0 1 1

     时间  

0 00:00:00
1 01:00:00
2 02:00:00
3 03:00:00
4 04:00:00

1bike["日期"]=pd.to_datetime(bike["日期"], format='%Y-%m-%d', errors='coerce')
1bike.dtypes

日期 datetime64[ns] 季节 object 节假日 int64 工作日 int64 天气 object 温度 float64 感觉温度 float64 湿度 int64 风速 float64 非注册用户 int64 注册用户 int64 数量 int64 时间 object dtype: object

1bike.loc[0,"日期"].weekday()

5

1xingqi={0:"星期一",1:"星期二",2:"星期三",3:"星期四",4:"星期五",5:"星期六",6:"星期日"}
1a=[]
2for i in bike["日期"]:
3    b=i.weekday()
4    a.append(b)
1bike["星期"]=a
1bike["星期"]=bike["星期"].map(xingqi)
1bike.head()
      日期 季节  节假日  工作日    天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  \

0 2011-01-01 春 0 0 晴,少云 9.84 14.395 81 0.0 3 13 16
1 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 8 32 40
2 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 5 27 32
3 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 3 10 13
4 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 0 1 1

     时间   星期  

0 00:00:00 星期六
1 01:00:00 星期六
2 02:00:00 星期六
3 03:00:00 星期六
4 04:00:00 星期六

1bike.loc[0,"日期"].month

1

1a=[]
2for i in bike["日期"]:
3    b=i.month
4    a.append(b)
1bike["月份"]=a
1b=[]
2for i in bike["时间"]:
3    a=i.split(":")
4    b.append(a[0])
1bike["时间"]=b
1bike.head()
      日期 季节  节假日  工作日    天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  时间  \

0 2011-01-01 春 0 0 晴,少云 9.84 14.395 81 0.0 3 13 16 00
1 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 8 32 40 01
2 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 5 27 32 02
3 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 3 10 13 03
4 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 0 1 1 04

星期  月份  

0 星期六 1
1 星期六 1
2 星期六 1
3 星期六 1
4 星期六 1

1bike2=pd.read_csv("C:/Users/my/data/train(bike).csv")
1bike2.columns=["日期","季节","节假日","工作日","天气","温度","感觉温度","湿度","风速","非注册用户","注册用户","数量"]
1a=[]
2b=[]
3for i in bike2["日期"]:
4    c=i.split(" ")
5    a.append(c[0])
6    b.append(c[1])
1bike2["日期"]=a
2bike2["时段"]=b
1bike2.head()
      日期  季节  节假日  工作日  天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  时段  \

0 2011-01-01 1 0 0 1 9.84 14.395 81 0.0 3 13 16 00
1 2011-01-01 1 0 0 1 9.02 13.635 80 0.0 8 32 40 01
2 2011-01-01 1 0 0 1 9.02 13.635 80 0.0 5 27 32 02
3 2011-01-01 1 0 0 1 9.84 14.395 75 0.0 3 10 13 03
4 2011-01-01 1 0 0 1 9.84 14.395 75 0.0 0 1 1 04

星期 月份
0 5 1
1 5 1
2 5 1
3 5 1
4 5 1

1bike2["日期"]=pd.to_datetime(bike2["日期"], format='%Y-%m-%d', errors='coerce')
1a=[]
2for i in bike2["日期"]:
3    b=i.weekday()
4    a.append(b)
1bike2["星期"]=a
1a=[]
2for i in bike["日期"]:
3    b=i.month
4    a.append(b)
1bike2["月份"]=a
1b=[]
2for i in bike2["时段"]:
3    a=i.split(":")
4    b.append(a[0])
1bike2["时段"]=b
1bike2.dtypes

日期 datetime64[ns] 季节 int64 节假日 int64 工作日 int64 天气 int64 温度 float64 感觉温度 float64 湿度 int64 风速 float64 非注册用户 int64 注册用户 int64 数量 int64 时段 int64 星期 int64 月份 int64 dtype: object

1bike2["时段"]=bike2["时段"].astype("int64")
1bike2.head()
      日期  季节  节假日  工作日  天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  时段  \

0 2011-01-01 1 0 0 1 9.84 14.395 81 0.0 3 13 16 0
1 2011-01-01 1 0 0 1 9.02 13.635 80 0.0 8 32 40 1
2 2011-01-01 1 0 0 1 9.02 13.635 80 0.0 5 27 32 2
3 2011-01-01 1 0 0 1 9.84 14.395 75 0.0 3 10 13 3
4 2011-01-01 1 0 0 1 9.84 14.395 75 0.0 0 1 1 4

星期 月份
0 5 1
1 5 1
2 5 1
3 5 1
4 5 1

1bike.head()
      日期 季节  节假日  工作日    天气    温度    感觉温度  湿度   风速  非注册用户  注册用户  数量  时间  \

0 2011-01-01 春 0 0 晴,少云 9.84 14.395 81 0.0 3 13 16 00
1 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 8 32 40 01
2 2011-01-01 春 0 0 晴,少云 9.02 13.635 80 0.0 5 27 32 02
3 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 3 10 13 03
4 2011-01-01 春 0 0 晴,少云 9.84 14.395 75 0.0 0 1 1 04

星期  月份  

0 星期六 1
1 星期六 1
2 星期六 1
3 星期六 1
4 星期六 1

  • 在这一步有些差错,所以就做了2个Df:bike和bike2。bike是把数值型的转换为字符型,是用来画表用的,让表格更加直观,bike2是把所有变量转化为数值型,是为以后构建模型方便。

4 进行数据分析与可视化

1g = sns.PairGrid(bike2)
2g.map(plt.scatter)#这个图没啥用

<seaborn.axisgrid.PairGrid at 0x1d792208>

Image

1corrDf = bike2.corr() 
2corrDf
         季节       节假日       工作日        天气        温度      感觉温度        湿度  \

季节 1.000000 0.029368 -0.008126 0.008879 0.258689 0.264744 0.190610
节假日 0.029368 1.000000 -0.250491 -0.007074 0.000295 -0.005215 0.001929
工作日 -0.008126 -0.250491 1.000000 0.033772 0.029966 0.024660 -0.010880
天气 0.008879 -0.007074 0.033772 1.000000 -0.055035 -0.055376 0.406244
温度 0.258689 0.000295 0.029966 -0.055035 1.000000 0.984948 -0.064949
感觉温度 0.264744 -0.005215 0.024660 -0.055376 0.984948 1.000000 -0.043536
湿度 0.190610 0.001929 -0.010880 0.406244 -0.064949 -0.043536 1.000000
风速 -0.147121 0.008409 0.013373 0.007261 -0.017852 -0.057473 -0.318607
非注册用户 0.096758 0.043799 -0.319111 -0.135918 0.467097 0.462067 -0.348187
注册用户 0.164011 -0.020956 0.119460 -0.109340 0.318571 0.314635 -0.265458
数量 0.163439 -0.005393 0.011594 -0.128655 0.394454 0.389784 -0.317371
时段 -0.006546 -0.000354 0.002780 -0.022740 0.145430 0.140343 -0.278011
星期 -0.010553 -0.191832 -0.704267 -0.047692 -0.038466 -0.040235 -0.026507
月份 0.971524 0.001731 -0.003394 0.012144 0.257589 0.264173 0.204537

         风速     非注册用户      注册用户        数量        时段        星期        月份  

季节 -0.147121 0.096758 0.164011 0.163439 -0.006546 -0.010553 0.971524
节假日 0.008409 0.043799 -0.020956 -0.005393 -0.000354 -0.191832 0.001731
工作日 0.013373 -0.319111 0.119460 0.011594 0.002780 -0.704267 -0.003394
天气 0.007261 -0.135918 -0.109340 -0.128655 -0.022740 -0.047692 0.012144
温度 -0.017852 0.467097 0.318571 0.394454 0.145430 -0.038466 0.257589
感觉温度 -0.057473 0.462067 0.314635 0.389784 0.140343 -0.040235 0.264173
湿度 -0.318607 -0.348187 -0.265458 -0.317371 -0.278011 -0.026507 0.204537
风速 1.000000 0.092276 0.091052 0.101369 0.146631 -0.024804 -0.150192
非注册用户 0.092276 1.000000 0.497250 0.690414 0.302045 0.246959 0.092722
注册用户 0.091052 0.497250 1.000000 0.970948 0.380540 -0.084427 0.169451
数量 0.101369 0.690414 0.970948 1.000000 0.400601 -0.002283 0.166862
时段 0.146631 0.302045 0.380540 0.400601 1.000000 -0.002925 -0.006818
星期 -0.024804 0.246959 -0.084427 -0.002283 -0.002925 1.000000 -0.002266
月份 -0.150192 0.092722 0.169451 0.166862 -0.006818 -0.002266 1.000000

1corrDf["数量"].sort_values(ascending=False)

数量 1.000000 注册用户 0.970948 非注册用户 0.690414 时段 0.400601 温度 0.394454 感觉温度 0.389784 月份 0.166862 季节 0.163439 风速 0.101369 工作日 0.011594 星期 -0.002283 节假日 -0.005393 天气 -0.128655 湿度 -0.317371 Name: 数量, dtype: float64

1fig=plt.figure(figsize=(12,12))
2ax1=fig.add_subplot(1,1,1)
3sns.set(style='dark')
4sns.heatmap(corrDf,ax=ax1,vmax=1,square=False,annot=True,cmap='YlGnBu',linewidths=.5)
5plt.title('Heatmap on Correlation',fontsize=30,color='white')
6plt.xticks(fontsize=10,color='white',rotation=45)
7plt.yticks(fontsize=10,color='white')
8plt.show()

Image

  • 这一步进行了相关性分析,从结果上可以看出,影响因素的排名为:时段>温度>感觉温度>湿度>月份>季节>天气>风速,其中正相关的有:时段,温度,感觉温度,月份,季节,风速;负相关的有湿度,天气

4.1查看月份与共享单车的影响

1import seaborn as sns
2import matplotlib.pyplot as plt
1fig,(ax1,ax2)=plt.subplots(nrows=2)
2fig.set_size_inches(9,10)
3sns.barplot(data=monthg,x="月份",y="数量",ax=ax1)
4sns.pointplot(data=monthg,x="月份",y="数量",ax=ax1)
5ax1.set(xlabel="月",ylabel="数量",title="每月的共享单车数量")
6
7sns.barplot(data=monthweek,x="月份",y="数量",hue="星期",ax=ax2)
8ax2.set(xlabel="月",ylabel="数量",title="每月的共享单车数量")

[Text(0,0.5,'数量'), Text(0.5,0,'月'), Text(0.5,1,'每月的共享单车数量')]

Image

1rizhu=pd.DataFrame(bike.groupby("月份")["注册用户"].mean()).reset_index()
2rifeizhu=pd.DataFrame(bike.groupby("月份")["非注册用户"].mean()).reset_index()
3ri=pd.DataFrame(bike.groupby("月份")["数量"].mean()).reset_index()
1fig,ax1=plt.subplots()
2fig.set_size_inches(20, 20)
3sns.pointplot(data=rifeizhu,x="月份",y="非注册用户",color="green",ax=ax1,label="非注册用户")
4sns.pointplot(data=rizhu,x="月份",y="注册用户",color="red",ax=ax1,label="非注册用户")
5sns.pointplot(data=ri,x="月份",y="数量",color="black",ax=ax1,label="总数量")
6ax1.set(xlabel="月份",ylabel="数量",title="不同月份下不同用户类型的增长情况")

[Text(0,0.5,'数量'), Text(0.5,0,'月份'), Text(0.5,1,'不同月份下不同用户类型的增长情况')]

Image

  • 从上图可以看出,5-10月的共享单车使用量比较高,而且变化比较稳定,11-12月是一个递减趋势,1-4月是一个递增趋势,虽然11、12月是递减趋势,但是仍然比1、2、3、4这四个月份的使用量高。初步分析的天气因素的温度造成的,温度越低,人们使用共享单车的数量越少。

4.2 查看季节与共享单车数量的关系

1monthg=pd.DataFrame(bike.groupby("月份")["数量"].mean()).reset_index()
2monthg=monthg.sort_values(by="数量",ascending=False)
3monthweek=pd.DataFrame(bike.groupby(["月份","星期"],sort=True)["数量"].mean()).reset_index()
4monthweek=monthweek.sort_values(by="数量",ascending=False)
1monthg.head()

月份 数量 5 6 242.031798 6 7 235.325658 7 8 234.118421 8 9 233.805281 9 10 227.699232

1jijiedf=pd.DataFrame(bike.groupby("季节")["数量"].mean()).reset_index()
1jijieshijian=pd.DataFrame(bike.groupby(["季节","时间"],sort=True)["数量"].mean()).reset_index()
2jijiexingqi=pd.DataFrame(bike.groupby(["季节","星期"],sort=True)["数量"].mean()).reset_index()
 1fig,(ax1,ax2,ax3)=plt.subplots(nrows=3)
 2fig.set_size_inches(9,10)
 3sns.barplot(data=jijiedf,x="季节",y="数量",ax=ax1)
 4sns.pointplot(data=jijiedf,x="季节",y="数量",ax=ax1)
 5ax1.set(xlabel="季节",ylabel="数量",title="每个季节共享单车数量")
 6
 7sns.barplot(data=jijieshijian,x="季节",y="数量",hue="时间",ax=ax2)
 8ax2.set(xlabel="季节",ylabel="数量",title="每月的共享单车数量")
 9
10sns.barplot(data=jijiexingqi,x="季节",y="数量",hue="星期",ax=ax3)
11ax3.set(xlabel="季节",ylabel="数量",title="每月的共享单车数量")

[Text(0,0.5,'数量'), Text(0.5,0,'季节'), Text(0.5,1,'每月的共享单车数量')]

Image

  • 从上图看出秋季的使用量最高,对应的是7,8,9月份,春季的使用量最低,对应的是1,2,3月份,与月份图想吻合。而且在季节星期和月份星期的图中都可以看出,不论哪个月份,哪个季节,每周中7天的共享单车使用数量都没有明显的差别。

4.3 查看每个时间断与共享单车数量的关系

 1shijianweek=pd.DataFrame(bike.groupby(["时间","星期"],sort=True)["数量"].mean()).reset_index()
 2shijiajijie=pd.DataFrame(bike.groupby(["时间","季节"],sort=True)["数量"].mean()).reset_index()
 3shijianyuefen=pd.DataFrame(bike.groupby(["时间","月份"],sort=True)["数量"].mean()).reset_index()
 4shijian=pd.DataFrame(bike.groupby("时间")["数量"].mean()).reset_index()
 5
 6fig,(ax1,ax2,ax3,ax4)=plt.subplots(nrows=4)
 7fig.set_size_inches(9,10)
 8sns.pointplot(data=shijian,x="时间",y="数量",ax=ax1)
 9ax1.set(xlabel="时间",ylabel="数量",title="不同时间断的共享单车数量")
10
11sns.pointplot(data=shijianweek,x="时间",y="数量",hue="星期",ax=ax2)
12ax2.set(xlabel="时间",ylabel="数量",title="每周不同时间段的共享单车数量")
13
14sns.pointplot(data=shijiajijie,x="时间",y="数量",hue="季节",ax=ax3)
15ax3.set(xlabel="时间",ylabel="数量",title="每个季节不同时间段的共享单车数量")
16
17sns.pointplot(data=shijianyuefen,x="时间",y="数量",hue="月份",ax=ax4)
18ax4.set(xlabel="时间",ylabel="数量",title="每月不同时间段的共享单车数量")

[Text(0,0.5,'数量'), Text(0.5,0,'时间'), Text(0.5,1,'每月不同时间段的共享单车数量')]

Image

  • 从图中得出阶段,时段对于共享单车使用数量有着较大的影响,在周一到周五通勤时,变化剧烈,具体时间段为5.00-10.00。16.00-20.00,在10.00-16.00之间平缓运行, 但是在12.00-13.00之间有一个小高峰,为午间休息时间。而且下午时间段要比上午时间段要高。但是周五的使用量在白天是略高于其他四天,但是晚上则是略低于 其他四天,这就以为这周五这一天白天人们出行时间多,而晚上则出行时间少。
  • 在周末则是变换平缓,虽然通勤时间段没有工作日高,但是在9.00-16.00是要高于工作日的,并且变化平滑。
  • 通过上面4个图可以得出,时段的曲线变化是基本不根据季节和月份来变化的,因此,时段对于共享单车数量的影响具有很强的规律和适用性。

4.4 查看不同时间注册用户与非注册用户的数据对比

1shijianyonghu=pd.DataFrame(bike.groupby("时间")["注册用户"].mean()).reset_index()
2shijianfeiyonghu=pd.DataFrame(bike.groupby("时间")["非注册用户"].mean()).reset_index()
1fig,ax1=plt.subplots()
2fig.set_size_inches(9,10)
3sns.pointplot(data=shijianfeiyonghu,x="时间",y="非注册用户",color="blue",ax=ax1,label="非注册用户")
4sns.pointplot(data=shijianyonghu,x="时间",y="注册用户",color="red",ax=ax1,label="注册用户")
5ax1.set(xlabel="时间",ylabel="数量",title="每个时间段非注册用户的数量")
6ax1.legend(loc="best")

No handles with labels found to put in legend.

<matplotlib.legend.Legend at 0xefb1be0>

Image

1swz=pd.DataFrame(bike.groupby(["时间","星期"],sort=True)["注册用户"].mean()).reset_index()
2swfz=pd.DataFrame(bike.groupby(["时间","星期"],sort=True)["非注册用户"].mean()).reset_index()
1fig,(ax1,ax2)=plt.subplots(nrows=2,sharey=True)
2fig.set_size_inches(15,10)
3plt.ylim=([0,400])
4sns.pointplot(data=swz,x="时间",y="注册用户",hue="星期",ax=ax1)
5ax1.set(xlabel="时间",ylabel="数量",title="每周每个时间段注册用户的数量")
6sns.pointplot(data=swfz,x="时间",y="非注册用户",hue="星期",ax=ax2)
7ax2.set(xlabel="时间",ylabel="数量",title="每周时间段非注册用户的数量")

[Text(0,0.5,'数量'), Text(0.5,0,'时间'), Text(0.5,1,'每周时间段非注册用户的数量')]

Image

  • 如图所示,时段与注册用户的使用量具有明显的规律性,与通勤时间想吻合。而时段与未注册用户的使用量的关系与之相比则不够明显,但是也具有一定的 的规律性,在工作日的8.00-15.00之间,非注册用户的使用量缓慢上升,但是在周末,非注册用户的使用量变化则是与注册用户的使用量变化相同,都是在 8.00-14.00之间上升,在14.00-20.00下降,而且周日比周六的使用量更加少。

4.5 利用箱型图查看各时间单位上共享单车数量的变化

1fig,axes=plt.subplots(2,2)
2fig.set_size_inches(10, 10)
3sns.boxplot(data=bike,x="季节",y="数量",ax=axes[0][0])
4sns.boxplot(data=bike,x="时间",y="数量",ax=axes[0][1])
5sns.boxplot(data=bike,x="月份",y="数量",ax=axes[1][0])
6sns.boxplot(data=bike,x="星期",y="数量",ax=axes[1][1])

<matplotlib.axes._subplots.AxesSubplot at 0x10a48208>

Image

  • 从上图可以看出:季节,时间,月份对共享单车使用量的变化有一定想想,但是星期则没有大的影响。

4.6 不同天气因素对共享单车数量的影响

1sns.jointplot(data=bike,x="温度",y="数量")

D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been " D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been "

<seaborn.axisgrid.JointGrid at 0xfbd57b8>

Image

  • 从上图看出,温度对数量的变化有一定的影响,在0-30度的时候,呈现的是正先关,但是超过30度,则呈现的是负相关。
1sns.jointplot(data=bike,x="湿度",y="数量")

D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been " D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been "

<seaborn.axisgrid.JointGrid at 0x126b9fd0>

Image

  • 从上图看出,湿度对于数量有一定的负相关,湿度越高,数量越少。
1sns.jointplot(data=bike,x="天气",y="数量")

Image

1tianqi=pd.DataFrame(bike.groupby("天气")["数量"].mean()).reset_index()
2sns.barplot(data=tianqi,x="天气",y="数量")

<matplotlib.axes._subplots.AxesSubplot at 0x29cb2978>

Image

1tianqi
      天气          数量

0 大雨,冰雹,雪,雾 164.000000 1 小雨,小雪,散云 118.846333 2 晴,少云 205.236791 3 薄雾,少云 178.955540

  • 根据以上信息来进行判断,天气对于数量有有一定的影响,天气越恶劣,数量越少,但是大雨,冰雹天气的数量太小,只有一个,并不考虑。
1sns.jointplot(data=bike,x="风速",y="数量")

D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been " D:\anaconda\lib\site-packages\matplotlib\axes_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg. warnings.warn("The 'normed' kwarg is deprecated, and has been "

<seaborn.axisgrid.JointGrid at 0xfef1080>

Image

  • 总图中看出,温度对共享单车使用过的数量总体有一定的负相关,但是从相关系数上来看,则是正相关。我们进行细分的话,在小于15风速的时候,风速是正相关的,在大于15风速的情况下,风速是负相关的,两者都有局限性,因此,我们不能凭借风速来判断。