共享单车项目数据可视化展示

1. 数据收集

https://www.kaggle.com/c/bike-sharing-demand/data

1.1 数据说明及问题分析

数据内容包括两年内的每小时租赁数据,包括有:

  1. datetime(日期时间) - hourly date + timestamp
  2. season(季节) - 1 = spring, 2 = summer, 3 = fall, 4 = winter
  3. holiday(假期) - whether the day is considered a holiday
  4. workingday(是否工作日) - whether the day is neither a weekend nor holiday w
  5. 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 暴雨+冰雹+雷暴+雾,雪+雾
  6. temp(温度) - temperature in Celsius(摄氏度)
  7. atemp(体感温度) - "feels like" temperature in Celsius
  8. humidity(湿度) - 相对湿度
  9. windspeed(风速) - wind speed
  10. casua(临时租赁数量) - number of non-registered user rentals initiated
  11. registered(会员租赁数量) - number of registered user rentals initiated
  12. count(总租赁数量) - number of total rentals

在比赛中需要将使用模式与历史天气数据结合起来,以便预测华盛顿特区自行车共享计划中自行车租赁需求。

2. 准备数据

2.1 导入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
train = pd.read_csv('F:/hzh/Houzi_Data_Analysis/Level_5/Houzi/共享单车项目-数据/train_bike.csv')
test = pd.read_csv('F:/hzh/Houzi_Data_Analysis/Level_5/Houzi/共享单车项目-数据/test_bike.csv')

2.2 查看数据缺失值

# 1.查看数据集大小
print('训练数据集:', train.shape)
print('测试数据集:', test.shape)
训练数据集: (10886, 12)
测试数据集: (6493, 9)
# 2.查看训练数据和测试数据集集信息
train.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.7+ KB
test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6493 entries, 0 to 6492
Data columns (total 9 columns):
datetime      6493 non-null object
season        6493 non-null int64
holiday       6493 non-null int64
workingday    6493 non-null int64
weather       6493 non-null int64
temp          6493 non-null float64
atemp         6493 non-null float64
humidity      6493 non-null int64
windspeed     6493 non-null float64
dtypes: float64(3), int64(5), object(1)
memory usage: 456.7+ KB

训练数据集于测试数据集中不存在缺失值。

2.3 查看数据异常值并处理

train.describe()

根据对训练数据数值型数据进行描述分析显示,主要异常表现在租赁数的极差偏大

3. 数据可视化展示以方便特征值选取

为了从不同时间尺度展示时间与租赁数的关系,从日期中提取月份、星期、天、小时等数据

3.1 数据时间特征处理

train_Df = train
from datetime import datetime
# 提取年份数据
def get_year(x):datestr = x.split()[0]date = datetime.strptime(datestr, '%Y-%m-%d')year = date.yearreturn year
train_Df['year'] = train_Df.datetime.apply(get_year)
train_Df.head()
# 提取月份数据
def get_month(x):datestr = x.split()[0]date = datetime.strptime(datestr, '%Y-%m-%d')month = date.monthreturn month
train_Df['month'] = train_Df.datetime.apply(get_month)
# 提取星期
def get_weekday(x):datestr = x.split()[0]date = datetime.strptime(datestr, '%Y-%m-%d')week = date.weekday()return week
train_Df['weekday'] = train_Df.datetime.apply(get_weekday)
# 获取date
train_Df['date'] = train_Df.datetime.apply(lambda x: x.split()[0])
# 获取小时数
def get_hour(x):hourstr = x.split()[1].split(':')[0]hour = int(hourstr)return hour
train_Df['hour'] = train_Df.datetime.apply(get_hour)
train_Df.head()

# 调整列顺序
list = ['datetime', 'year', 'month', 'weekday', 'date', 'hour', 'season', 'holiday', 'workingday', 'weather','temp', 'atemp', 'humidity', 'windspeed', 'casual', 'registered', 'count']
train_Df = train_Df[list]
train_Df.head()

train_Df.tail()

查看尾部数据:数据的最晚时间为2012年12月19日,并没有完全包括12年的全部数据。

3.2 相关系数矩阵及热度图

# 相关系数矩阵
corr = train_Df.corr()
# 相关系数矩阵可视化
fig, ax = plt.subplots(figsize=(12, 12))
# vmax:表示热力图颜色取值的最大范围
# annot: 是否写入数据,默认为False
# square:设置热力图矩阵小块形状
sns.heatmap(corr, vmax=1, vmin=-1, square=False, cmap='YlGnBu',annot=True, linewidths=.05, xticklabels=True, yticklabels=True)
<matplotlib.axes._subplots.AxesSubplot at 0x25a026e8c08>

根据相关系数分析可以看出,count:

  • 与小时成正相关,说明一天中的租赁数量随时间增加而增加
  • 与温度/体感温度成正相关,说明温度升高,总租赁数量也随之增加
  • 与湿度成负相关,说明湿度越大,租赁车的人越少

3.3 count与时间关系可视化

# 将季节参数改为字符串形式
seasonDict = {1: 'Spring', 2: 'Summer', 3: 'Fall', 4: 'Winter'}
train_Df['seasonstr'] = train_Df['season'].map(seasonDict)
train_Df.head()
# 将count与时间的关系可视化(箱线图)
fig, axes = plt.subplots(3, 3, figsize=(16, 16))
fig.suptitle('Count-Datetime Analysis', fontsize=18)
ax0 = sns.boxplot(data=train_Df, y='count', orient='v',ax=axes[0][0])# count箱线图
ax1 = sns.boxplot(data=train_Df, x=train_Df['year'], y='count', orient='v',ax=axes[0][1])# count-year箱线图
ax2 = sns.boxplot(data=train_Df, x=train_Df['seasonstr'], y='count', orient='v', ax=axes[0][2])# count-season箱线图
ax3 = sns.boxplot(data=train_Df, x=train_Df['month'], y='count', orient='v', ax=axes[1][0])# count-month箱线图
ax4 = sns.boxplot(data=train_Df, x='weekday', y='count', orient='v', ax=axes[1][1])# count-weeekday箱线图
ax5 = sns.boxplot(data=train_Df, x='date', y='count', orient='v', ax=axes[1][2])# count-date箱线图
ax6 = sns.boxplot(data=train_Df, x='hour', y='count', orient='v', ax=axes[2][0])# count-hour箱线图
ax7 = sns.boxplot(data=train_Df, x='holiday', y='count', orient='v', ax=axes[2][1])# count-holiday箱线图
ax8 = sns.boxplot(data=train_Df, x='workingday', y='count', orient='v', ax=axes[2][2])# count-workingday箱线图

# 将count与时间的关系可视化(柱形图-折线图)
# orient:设置柱状图水平绘制还是竖直绘制,"h"表示水平,“v”表示竖直。
fig, axes = plt.subplots(4, 2, figsize=(12, 12))
fig.suptitle('Count-Datetime Analysis', fontsize=18)
ax1 = sns.barplot(data=train_Df, x='year', y='count', orient='v',ax=axes[0][0])# count-year箱线图
ax2 = sns.barplot(data=train_Df, x='seasonstr', y='count', orient='v', ax=axes[0][1])# count-season箱线图
ax3 = sns.barplot(data=train_Df, x='month', y='count', orient='v', ax=axes[1][0])# count-month箱线图
ax4 = sns.barplot(data=train_Df, x='weekday', y='count', orient='v', ax=axes[1][1])# count-weeekday箱线图
ax5 = sns.lineplot(data=train_Df, x='date', y='count', ax=axes[2][0])# count-date箱线图
ax6 = sns.barplot(data=train_Df, x='hour', y='count', orient='v', ax=axes[2][1])# count-hour箱线图
ax7 = sns.barplot(data=train_Df, x='holiday', y='count', orient='v', ax=axes[3][0])# count-holiday箱线图
ax8 = sns.barplot(data=train_Df, x='workingday', y='count', orient='v', ax=axes[3][1])# count-workingday箱线图

由图可以看出:

  • 在2012年12月份缺少部分数据的情况下,2012年租赁人数较2011年有约60%的增长;
  • 在季节数据中,夏秋冬的租赁人数明显多于春季租赁人数,除了可能与温度因素有关外,还需要注意的是2011年春季可能为刚运行阶段,所以人数偏少;
  • 早8点及晚17点分别为租车的早高峰和晚高峰,与上班作息一致
# 绘制2011、2012年四季租赁人数
sns.barplot(data=train_Df, x='seasonstr', y='count', hue='year')
<matplotlib.axes._subplots.AxesSubplot at 0x25a069a6548>

从分年数据可以看出,2012年各季节的租赁数相比于2011年均有约50的增长,春季租赁人数为最少的。

# 各季节的count分时图
hourcount = train_Df.pivot_table(index=['hour'], columns=['seasonstr'], values=['count'])
hourcount.head()

hourcount.plot(linestyle='--', marker='o')
plt.legend(['Fall', 'Spring', 'Summer', 'Winter'])
<matplotlib.legend.Legend at 0x25a09179848>

各季节的租赁人数分时图趋势都相似,在早8点和晚17点为租赁高峰

# 各星期每天的平均count分时图
weekDict = {0: "Sunday",1: "Monday",2: "Tuesday",3: "Wednesday",4: "Thursday",5: "Friday",6: "Saturday"}
hourweekcount = train_Df.pivot_table(index=['hour'], columns=['weekday'], values=['count'])
hourweekcount.rename(columns=weekDict, inplace=True)
hourweekcount.head()

hourweekcount.plot(linestyle='--', marker='o')
plt.legend(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'])
<matplotlib.legend.Legend at 0x25a08d61188>

3.4 count平均值与温度、湿度、风速关系可视化

# 绘制温度、湿度、风速-count的散点图
fig, axes = plt.subplots(2, 2, figsize=(12, 12))
ax1 = sns.regplot(x='temp', y='count', data=train_Df, ax=axes[0][0])
ax2 = sns.regplot(x='atemp', y='count', data=train_Df, ax=axes[0][1])
ax3 = sns.regplot(x='humidity', y='count', data=train_Df, ax=axes[1][0])
ax4 = sns.regplot(x='windspeed', y='count', data=train_Df, ax=axes[1][1])

# 绘制温度、湿度、风速-count的核密度估计
# space:中心和侧边轴的间隔大小
# height:图像的尺寸(方形)
# ratio:中心轴的高度与侧边轴高度的比例
sns.jointplot(x='temp', y='count', data=train_Df, space= 0, height=5, ratio=5, kind='kde')
<seaborn.axisgrid.JointGrid at 0x25a0dbed708>

sns.jointplot(x='atemp', y='count', data=train_Df, space= 0, height=5, ratio=5, kind='kde')
<seaborn.axisgrid.JointGrid at 0x25a0a87c0c8>

sns.jointplot(x='humidity', y='count', data=train_Df, space= 0, height=5, ratio=5, kind='kde')
<seaborn.axisgrid.JointGrid at 0x25a0f5f84c8>

sns.jointplot(x='windspeed', y='count', data=train_Df, space= 0, height=5, ratio=5, kind='kde')
<seaborn.axisgrid.JointGrid at 0x25a0dd0b248>

  • 当温度在10-30度之间是,租赁人数较多,温度过低或过高都会导致租赁人数减少
  • 风速越大,租赁人数越少

4 所遇到问题

在利用seaborn绘制相关系数热力图时,出现y轴最上端和最下端方块只显示一半,经查阅得知这是“matplotlib库3.1.0—3.1.1版本出现的bug”,解决办法有:

  1. 回退到低版本
  2. 升级到3.1.2及以上的版本
  3. 手动修改
def Thermodynamic():import matplotlib.pyplot as pltimport numpy as npnp.random.seed(0)import seaborn as sns# 初始化参数sns.set()uniform_data = np.random.rand(3, 3)heatmap = sns.heatmap(uniform_data,annot=True, square=False)bottom, top = heatmap.get_ylim()heatmap.set_ylim(bottom + 0.5, top - 0.5)plt.show()

共享单车数据集_共享单车项目数据可视化展示相关推荐

  1. 共享单车数据集_共享单车数据可视化报告

    1.1 项目说明 自行车共享系统是一种租赁自行车的方法,注册会员.租车.还车都将通过城市中的站点网络自动完成,通过这个系统人们可以根据需要从一个地方租赁一辆自行车然后骑到自己的目的地归还.为了更好地服 ...

  2. python聚类算法中x是多维、y是一维怎么画图_基于Python的数据可视化:从一维到多维...

    目录 一.iris数据集介绍 二.一维数据可视化 三.二维数据可视化 四.多维数据可视化 五.参考资料 一.iris数据集介绍 iris数据集有150个观测值和5个变量,分别是sepal length ...

  3. 奥运会数据可视化展示

    奥运会数据可视化展示 一.背景 二.数据说明 三.数据展示 1.历届奥运会奖牌数量 2.历届奥运会奖牌在项目中的分配情况 3.奥运会参赛运动员的性别占比情况 4.运动员平均参赛年龄/身高/体重 5.各 ...

  4. python 爬虫及数据可视化展示

    python 爬虫及数据可视化展示 学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发. 1.做任何事情都要明确自己的目的,想要做什么,打算 ...

  5. 基于echarts 24种数据可视化展示,填充数据就可用,动手能力强的还可以DIY(演示地址+下载地址)

    基于echarts 24种数据可视化展示,填充数据就可用,动手能力强的还可以DIY(演示地址+下载地址) 前言 演示地址 下载地址 Demo示例(部分) 1.总览 2.物流信息展示 3.车辆综合管控平 ...

  6. 使用python采集某二手房源数据并做数据可视化展示(含完整源代码)

    本次目的: python采集链家二手房源数据并做数据可视化展示 亮点: 系统分析网页性质 结构化的数据解析 csv数据保存 环境介绍: python 3.8 解释器 pycharm 专业版2021.2 ...

  7. 数据可视化之数据可视化展示平台

    一.前言 数据可视化展示平台,是指使用多种表格和图表类型来展示多维分析结果的数据分析展示方式,借助于图形化手段,清晰有效地传达与沟通信息.通过可视化分析,您可以美学形式与分析功能并进,直观地传达关键的 ...

  8. 通用的综合大数据数据可视化展示html页面源码

    大家好,今天给大家介绍一款,通用的综合大数据数据可视化展示html页面源码(图1).送给大家哦,获取方式在本文末尾. 图1 带区域地图(图2) 图2 动态图表(图3) 图3 各类统计图数据展示十分丰富 ...

  9. 共享单车项目数据可视化+需求策略分析

    一.项目背景 自行车共享系统是一种租赁自行车的方式,其中获得会员资格.租赁和归还自行车的过程是通过遍布城市的站点网络自动完成的.使用这些系统,人们可以从一个地方租用自行车,并根据需要将其归还到另一个地 ...

最新文章

  1. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
  2. python中格式符的应用%s,%d,%f以及format()的实例以及输出格式
  3. python字符串、列表和文件对象总结
  4. 哈尔滨__伏尔加庄园
  5. android toast有焦点,android – 如何在显示Toast后进行edittext自动对焦?
  6. 【项目管理】ITTO-范围管理
  7. 又翻出来老电视剧看了看....
  8. Qt场景中图形项的删除
  9. “附近的小程序”可以直接找“餐饮” 非管理员也能登录小程序了
  10. Linux基本操作——VI和VIM
  11. java将动态图转换成静态图_如何用最简单的方法把静态图变成动图?
  12. gc日志一般关注什么_JVM(23)JVM的Full GC日志
  13. Problem C: 默认参数:求圆面积
  14. svg 动画_svg 动画介绍(一)
  15. Spring ——《第二章》Spring中的Bean
  16. 海洋工作室成立啦!!
  17. [转]easyui常用控件及样式收藏
  18. 软件设计文档国家标准—软件需求说明书(GB856T——88)
  19. Zip文件压缩与解压
  20. 音视频中的码率控制(CBR、VBR、CVBR、FIXQP)

热门文章

  1. rx java定时循环_Rxjava定时器异常循环
  2. oracle rac ora 12547,oracle11g RAC 下DBCA建库失败:ORA-12547: TNS:lost contact
  3. 为什么微软账号被暂时停用_微软向Win10 20H2推出测试版更新KB4586853修复多种已知问题...
  4. php mysql errorcode_PHP errorCode()和errorInfo():PDO中的错误处理
  5. java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...
  6. mysql如何选择多个表_从两个表mysql中选择多行
  7. cookie可存的最大限制_cookie、localStorage、sessionStorage、
  8. pythonrequests库使用方法_python三方库之requests-快速上手
  9. python open函数参数_python open函数的用法笔记
  10. 查看欧拉系统服务器ip,euler os 查看center进程命令