共享单车数据可视化分析(Python/Seaborn)

项目数据来源于kaggle项目 Bike Share Demand,使用Python对数据进行了可视化分析:

共享单车项目分析_页面_01.jpg
共享单车项目分析_页面_02.jpg
共享单车项目分析_页面_03.jpg
共享单车项目分析_页面_04.jpg
共享单车项目分析_页面_05.jpg

共享单车项目分析_页面_06.jpg
共享单车项目分析_页面_07.jpg
共享单车项目分析_页面_08.jpg
共享单车项目分析_页面_09.jpg
共享单车项目分析_页面_10.jpg

分析过程代码如下:

1. 提出问题
影响共享单车租用数量的因素有哪些?影响程度如何?

2. 理解数据

import numpy as np
import pandas as pd

bike_train = pd.read_csv(".../train.csv")

bike_train.head()
datetime season holiday workingday weather temp atemp humidity windspeed casual registered count
0 2011/1/1 0:00 1 0 0 1 9.84 14.395 81 0 3 13 16
1 2011/1/1 1:00 1 0 0 1 9.02 13.635 80 0 8 32 40
2 2011/1/1 2:00 1 0 0 1 9.02 13.635 80 0 5 27 32
3 2011/1/1 3:00 1 0 0 1 9.84 14.395 75 0 3 10 13
4 2011/1/1 4:00 1 0 0 1 9.84 14.395 75 0 0 1 1
bike_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.6+ KB

变量说明:

  • datatime 日期+时间
  • season 1=春 2=夏 3=秋 4=冬
  • holiday 1=节假日 0=非节假日
  • workingday 1=工作日 0=周末
  • weather 1=晴天多云 2=雾天阴天 3=小雪小雨 4=大雨大雪大雾
  • temp 气温摄氏度
  • atemp 体感温度
  • humidity 湿度
  • windspeed 风速
  • casual 非注册用户个数
  • registered 注册用户个数
  • count 给定日期时间(每小时)总租车人数

3.数据清洗

1)数据预处理:数据完整无缺失值
2)特征工程:从datetime中提取年、月、日、时、星期等时间信息

import calendar

bike_train['date']=bike_train.datetime.apply(lambda x :x.split()[0])
bike_train['year']=bike_train.date.apply(lambda x:x.split("-")[0])
bike_train['month']=bike_train.date.apply(lambda x:x.split("-")[1])
bike_train['day']=bike_train.date.apply(lambda x:x.split("-")[2])
bike_train['hour']=bike_train.datetime.apply(lambda x: x.split()[1].split(":")[0])
bike_train['weekday'] = bike_train.datetime.apply(lambda x: calendar.day_name[pd.to_datetime(x).weekday()])
#把季节和天气转换成文字
bike_train['season']=bike_train.season.map({1: "Spring", 2 : "Summer", 3 : "Fall", 4 :"Winter" })
bike_train[:50:20]
datetime season holiday workingday weather temp atemp humidity windspeed casual registered count date year month day hour weekday
0 2011-01-01 00:00:00 Spring 0 0 1 9.84 14.395 81 0 3 13 16 40544 2011 1 1 0 Saturday
20 2011-01-01 20:00:00 Spring 0 0 2 16.4 20.455 87 16.9979 11 25 36 40544 2011 1 1 20 Saturday
40 2011-01-02 17:00:00 Spring 0 0 1 13.94 16.665 57 12.998 7 58 65 40545 2011 1 2 17 Sunday

4. 可视化分析

1)单车使用量在天气维度上的分析(天气、温度、湿度和风速相关性)

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

#租车辆与天气的关系
fig = plt.subplots(figsize=(5,5))
sns.boxplot(data=bike_train, y='count', x='weather')

<matplotlib.axes._subplots.AxesSubplot at 0x1146cf2b0>
output_10_1.png

可以看到,整体租车量受天气影响较为明显,极端的天气租车数量减少。
4级天气看起来有些异常,于是统计数据条目:

#统计各天气数据数量
weather_count = pd.DataFrame(bike_train.assign(weather_count=0).groupby('weather').weather_count.apply(len).reset_index())
weather_count['weather']=weather_count.weather.map({1:"晴天、多云",2:"雾天、阴天",3:"小学、小雪",4:"大风、大雪、大雨"})
weather_count
weather weather_count
0 晴天、多云 7192
1 雾天、阴天 2834
2 小学、小雪 859
3 大风、大雪、大雨 1

可以看到,4级天气只有1条数据记录,这种极端天气情况出现的数据极少。

#使用量与温度、湿度、风速的关系
#绘制heatmap
corrMatt = bike_train[["temp","atemp","humidity","windspeed","count"]].corr()
mask = np.array(corrMatt)    
mask[np.tril_indices_from(mask)] = False 
fig = plt.figure(figsize=(10, 10))
sns.heatmap(corrMatt, mask=mask,square=True,annot=True)
output_16_1.png

温度和使用量有正相关关系,湿度与使用量有负相关关系,风速和使用量几乎不相关。

#绘制线性图像
fig,(ax1,ax2,ax3) = plt.subplots(1,3, figsize=(12,5))
sns.regplot(x="temp", y="count", data=bike_train,ax=ax1)
sns.regplot(x="windspeed", y="count", data=bike_train,ax=ax2)
sns.regplot(x="humidity", y="count", data=bike_train,ax=ax3)
output_18_1.png

由图像可看出,使用量与温度、湿度和风速的关系,相关性有限。

2)单车使用量在时间维度上的分析(月份、季节、时间、星期等相关性)

#租车总量和工作日、节假日的关系
fig,(ax1,ax2) = plt.subplots(1,2, figsize=(10,5))
sns.boxplot(data=bike_train, y='count', x='workingday',ax=ax1)
sns.boxplot(data=bike_train, y='count', x='holiday',ax=ax2)

ax1.set(xticklabels=['Not holiday','Holiday'])
ax2.set(xticklabels=['Weekend','Workday'])
output_21_1.png

总量来看,节假日和周末/工作日的租车数量基本相同。

fig,axes = plt.subplots(3,1, figsize=(12,20))
#租车辆按月份、年份统计
month_Aggregated = pd.DataFrame(bike_train.groupby(['year','month'])['count'].mean()).reset_index() 
sns.barplot(data=month_Aggregated,x="month",y="count",hue='year',ax=axes[0])
axes[0].set(xlabel='Month', ylabel='Avearage Count',title="Average Count By Month")

#每日租车辆按季节统计
hour_Aggregated1 = pd.DataFrame(bike_train.groupby(['hour','season'])['count'].mean()).reset_index()
sns.pointplot(data=hour_Aggregated1,x='hour',y='count',hue='season',hue_order=['Spring','Summer','Fall','Winter'],join=True, ax=axes[1])
axes[1].set(xlabel='Hour', ylabel='Avearage Count',title="Average Count By Hour Across Season")

#日租车辆按周统计
hour_Aggregated2 = pd.DataFrame(bike_train.groupby(['hour','weekday'])['count'].mean()).reset_index()
sns.pointplot(data=hour_Aggregated2,x='hour',y='count',hue='weekday',join=True,ax=axes[2])
axes[2].set(xlabel='Hour', ylabel='Avearage Count',title="Average Count By Hour Across weekday")

output_23_1.png

图1可以看出2012年共享单车的使用量高于2011年,消费人群增加了1.5~2倍。两年内租车量随月份变化的趋势相同,6、7、8月有明显的高需求。

图2可以看出租车时间高峰为上午7-8点,下午5-6点,符合上下班通勤的时间范围。季节上看,春天的租车辆明显少于其它三个季节。

图3可以看出工作日租车辆主要为上下班时间,周末租车辆主要集中在10am-4pm之间。

3)单车使用量与注册用户/非注册用户的相关性

fig,axes=plt.subplots(2,1,figsize=(12,10))
hour_Transform=pd.melt(bike_train[['hour','casual','registered','weekday']],id_vars=['hour','weekday'],value_vars=['casual','registered'])
hour_Aggregated3=pd.DataFrame(hour_Transform.groupby(['hour','variable'])['value'].mean()).reset_index()
sns.pointplot(data=hour_Aggregated3,x='hour',y='value',hue='variable',hue_order=['casual','registered'],join=True,ax=axes[0])

weekday_Aggregated=pd.DataFrame(hour_Transform.groupby(['weekday','variable'])['value'].mean()).reset_index()
sns.barplot(data=weekday_Aggregated,x='weekday',y='value',hue='variable',order=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],ax=axes[1])


output_26_1.png

注册人数使用量明显高于非注册人数,
非会员casual主要是周末出行,为了游玩; 会员registered主要是为了周一到周五上班。

5. 总结

  • 时间:需求量最大的时间为夏、秋季工作日上、下班时间,其次为周末10am-4pm。需求量最小的时间为每年1-3月,时间集中在半夜/凌晨。
  • 天气:除极端情况外(大风、高温、低温、强降水等),天气对租车量的影响不明显。
  • 用户类型:注册用户和普通用户行为特征明显,前者主要为工作日通勤使用,后者为节假日出游。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 01 目的 手里有一份A市近两年来共享单车的租车数据,字段丰富,可挖掘的东西蛮多的,真是让人蠢蠢欲动~~ 那么今天...
    Sudden阅读 3,666评论 2 6
  • 一. 姐发现,最近大家看得热门电影,题材好像都还蛮严肃的。 像姐这般爱快乐的girl,那是断断然要闷闷一下。 所以...
    娜就酱吧阅读 393评论 0 0
  • 01 “爸!你放我出去!我不去上海工作,我不去!”奥铃拼命捶打着门背。 “你给我好好呆着!去西藏,你想都别想!”老...
    觅羽阅读 672评论 0 0
  • 最近在接触AI的事情,Google到很多破解版的matlab,大多数都存到百度网盘上了,为此还买了一个月VIP。。...
    Jogis阅读 1,123评论 0 0