新闻中心
【数据分析】共享单车用户数据分析(共享单车大数据分析报告)
一、分析背景及目的
共享单车系统是一种自动化的自行车租赁模式,用户能够从一个地方租借自行车,并根据需要将其归还到不同的地方。目前全世界已经有超过500个共享单车项目。共享单车系统产生的用户数据非常具有研究意义,因为用户使用的时间、季节、天气等实时情况都已经被记录下来。我们可以通过分析这些用户数据,探索用户使用共享单车的规律。
二、分析思路与分析问题
那么用户选择使用共享单车与哪些客观因素有关呢?在不同因素的影响下,用户结构分布是如何的呢?我们可以通过Python分析这些用户数据,探索用户在什么情况下更可能选择使用共享单车,并根据分析得到的数据结果,在运营策略方面提供一些建议。
数据来源:
Bike Sharing Demand | Kagglewww.kaggle.com/c/bike-sharing-demand分析问题:
整体数据情况共享单车的总用户数与哪些因素相关性较大?其他相关因素的探索性分析三、数据获取与数据清洗
1. 导入常用库
import numpy as num import pandas as pd from matplotlib import pyplot as plt from matplotlib import pylab as plb import seaborn as sns import calendar from datetime import datetime import warnings pd.options.mode.chained_assignment = None warnings.filterwarnings("ignore", category=DeprecationWarning)2. 导入数据
#读取Excel数据到为DataFrame #数据源中有三个csv文件,分别为:sampleSubmission.csv、test.csv、train.csv。考虑此分析仅做描述性分析,因此只选择train.csv文件的数据集 train = pd.read_csv(/Users/Sophia/Desktop/数据分析/Data/6bike-sharing-demand/train.csv)3. 理解数据
#理解数据:查看数据有多少行,多少列 train.shape(10886, 12)
#观察数据 train.head()
此次分析相关的变量含义如下:
datetime:日期+时间 season: 季节(1 = 春天, 2 = 夏天, 3 = 秋天, 4 = 冬天)holiday:节假日workingday:工作日weather :天气(1 = 晴朗,少云;2 = 多云、薄雾;3 = 小雨、小雪;4 = 大雨、大雪)temp:摄氏温度atemp:体感温度humidity:相对湿度windspeed:风速casual:发起的非注册用户租赁数量registered:已注册用户租赁的数量count:总租车人数#描述统计分析 train.describe()
4. 数据清洗
1)数据备份与选择子集
#数据备份 bikeDf = train #第1步:选择子集 #本案无需选择子集 #查看数据集信息 bikeDf.info()
2)重复值处理
#第2步:重复值处理 #本案无需处理重复值 #查看缺失数据 bikeDf.isnull().sum()
3)缺失数据处理
#第3步:缺失数据处理 #本案无缺失数据4)数据类型转换
#第4步:数据类型转换 #时间特征处理 #提取 Date bikeDf[date] = bikeDf.datetime.apply(lambda x: x.split()[0]) #提取年份 bikeDf[year] = bikeDf.date.apply(lambda x: x.split(-)[0]) #提取月份 bikeDf[month] = bikeDf.date.apply(lambda x: x.split(-)[1]) bikeDf[month_name]=bikeDf[month].map(lambda x:calendar.month_name[int(x)]) #提取天 bikeDf[day] = bikeDf.date.map(lambda x: x.split(-)[2]) #提取小时 bikeDf[hour] = bikeDf.datetime.map(lambda x: x.split()[1].split(:)[0]) #获取weekday bikeDf[weekday] = bikeDf.datetime.apply(lambda x:pd.to_datetime(x).weekday()) bikeDf[weekday_name] = bikeDf.date.apply(lambda x: calendar.day_name[datetime.strptime(x,"%Y-%m-%d").weekday()]) bikeDf.head()

5)异常值处理
#第5步: 异常值的处理 #本案无异常值6)特征提取
# 第6步:特征提取 #分类数据特征提取 #使用get_dummies进行one-hot编码,产生虚拟变量 #天气 weatherDf=pd.DataFrame() weatherDf=pd.get_dummies(bikeDf[weather],prefix=weather) #季节 seasonDf=pd.DataFrame() seasonDf=pd.get_dummies(bikeDf[season],prefix=season) #将虚拟变量列添加到 bikeDf bikeDf=pd.concat([bikeDf,weatherDf],axis=1) bikeDf=pd.concat([bikeDf,seasonDf],axis=1) bikeDf.head()
检查清洗后的数据
bikeDf.info()
四、数据分析过程
分析问题1:整体数据情况
#总用户数随时间变化趋势 plt.rc("font",family=MicroSoft YaHei,weight="bold") monthAvg=bikeDf.groupby([year,month],as_index=False).agg({date:min,count:mean}) fig = plt.figure(figsize=(25,10)) ax = plt.subplot(1,1,1) plt.plot(monthAvg[date],monthAvg[count],linewidth=3,label=monthly average) plt.title(月平均用户数变化图,fontsize=20) plt.xlabel(时间,fontsize=20) plt.ylabel(用户数,fontsize=20) plt.show()

问题1总结:通过观察《月平均用户数变化图》,用户数在2011-2012这两年内整体呈上涨趋势,但存在季节性的波动。通过观察《用户注册情况结构图》,注册用户数远远超过未注册用户数。
分析问题2:共享单车的总用户数与哪些因素相关性较大?
#查看各个变量之间的相关系数 bikeDf.corr()


问题2总结:温度、湿度与用户量的相关性更高,此外,用户数也受季节影响比较大。
为了更直观地呈现用户结构分布,我们将对这些因素的数据展开进一步分析:
1. 室外温度对用户数的影响
fig = plt.figure(figsize=(20,10)) ax1 = plt.subplot(2,2,1) temp=bikeDf.groupby([bikeDf[temp]]).agg({casual:mean,registered:mean,count:mean}) temp.plot(ax=ax1,title=不同室外温度下的用户数) plt.xlabel(摄氏度) plt.ylabel(用户数) plt.show()
2. 体感温度对用户数的影响
fig = plt.figure(figsize=(20,10)) ax2 = fig.add_subplot(2,2,2) temp=bikeDf.groupby([bikeDf[atemp]]).agg({casual:mean,registered:mean,count:mean}) temp.plot(ax=ax2,title=不同体感温度下的用户数) plt.xlabel(摄氏度) plt.ylabel(用户数) plt.show()
小结1 & 小结2:使用共享单车比较适宜的室外温度大致在30-35摄氏度,越接近这个温度区间,用户数越多,反之则越少。使用共享单车比较适宜的体感温度大致在30-40摄氏度,越接近这个温度区间,用户数越多,反之则越少。在这些区间的边界值温度,用户数有明显的波动,可能与短期温度骤变造成的短期需求下降有关。
3. 湿度对用户数的影响
fig = plt.figure(figsize=(20,10)) ax3 = fig.add_subplot(2,2,3) temp=bikeDf.groupby([bikeDf[humidity]]).agg({casual:mean,registered:mean,count:mean}) temp.plot(ax=ax3,title=不同湿度下的用户数) plt.xlabel(湿度) plt.ylabel(用户数) plt.show()
小结3:使用共享单车比较适宜的湿度在20-25之间,而后随着湿度增加,用户数量逐渐减少。
4. 季节、月份对用户数的影响
#季节 fig, axes = plt.subplots(nrows=1,ncols=3) fig.set_size_inches(16, 8) sns.boxplot(x="season",y="count",data=bikeDf,ax=axes[0]); sns.boxplot(x="season",y="registered",data=bikeDf,ax=axes[1]); sns.boxplot(x="season",y="casual",data=bikeDf,ax=axes[2]); plt.show()#月份 fig = plt.figure(figsize=(10,5)) ax4 = fig.add_subplot(1,1,1) monthDf=bikeDf.groupby([bikeDf[month]]).agg({casual:mean,registered:mean,count:mean}) monthDf.plot(ax=ax4,title=不同月份的用户数) plt.xlabel(月份) plt.ylabel(用户数) plt.show()小结4:用户数高峰期在夏季和秋季,具体为6月-10月,其次是冬季,而最少在春季。冬季用户需求减少可能受气温影响;春季用户需求减少可能是受春节影响。
分析问题3:其他相关因素的探索性分析
1. 其他环境维度因素-天气
fig = plt.figure(figsize=(20,20)) ax5 = plt.subplot(4,2,1) weatherDf=bikeDf.groupby([bikeDf[weather]]).agg({casual:mean,registered:mean,count:mean}) weatherDf.plot.bar(ax=ax5,stacked=True,title=不同天气下的用户数) ax5.set_xticklabels([晴朗少云,多云薄雾,小雨小雪,大雨大雪],rotation=horizontal) plt.xlabel(天气) plt.ylabel(用户数) plt.show()小结5:在注册用户中,晴朗少云的天气用车人数最多,小雨、小雪天气用车人数最少;在非注册用户中,晴朗少云的天气用车人数最多,大雨、大雪天气用车人数最少。
2. 其他环境维度因素-风速
fig = plt.figure(figsize=(20,10)) ax6 = fig.add_subplot(2,2,4) windspeedDf=bikeDf.groupby([bikeDf[windspeed]]).agg({casual:mean,registered:mean,count:mean}) windspeedDf.plot(ax=ax6,title=不同风速下的用户数) plt.xlabel(风速) plt.ylabel(用户数) plt.show()小结6:用户数在风速0-45之间基本保持平稳,在风速达45之后用户数有明显波动,受大风天气影响较明显。
3. 其他时间维度因素-工作日
3.1 工作日 vs. 非工作日
#工作日 vs. 非工作日(1:工作日;0:非工作日) fig, axes = plt.subplots(nrows=1,ncols=3) fig.set_size_inches(16, 8) sns.boxplot(x="workingday",y="count",data=bikeDf,ax=axes[0]); sns.boxplot(x="workingday",y="registered",data=bikeDf,ax=axes[1]); sns.boxplot(x="workingday",y="casual",data=bikeDf,ax=axes[2]); plt.show()小结7:对于注册用户,是否是工作日这一因素对用户数影响不明显,工作日的用户数略大多非工作日的用户数;但对于非注册用户,非工作日的用户数是工作日用户数的两倍左右。
3.2 工作日的使用时刻
workingdayDf=bikeDf[bikeDf[workingday]==1] fig = plt.figure(figsize=(10,5)) ax7 = fig.add_subplot(2,1,1) workingdayDf_hour=workingdayDf.groupby([workingdayDf[hour]]).agg({casual:mean,registered:mean,count:mean}) workingdayDf_hour.plot(ax=ax7,title=用户在工作日的使用时刻) plt.xlabel(小时) plt.ylabel(用户数) plt.show()小结8:在工作日,注册用户中,早晚通勤高峰期间用户数有明显增加;在非注册用户中,工作日的使用时刻没有明显的差异。
4. 其他时间维度因素-节假日
4.1 节假日 vs. 非节假日
#节假日 vs. 非节假日(1:节假日;0:非节假日) fig, axes = plt.subplots(nrows=1,ncols=3) fig.set_size_inches(16, 8) sns.boxplot(x="holiday",y="count",data=bikeDf,ax=axes[0]); sns.boxplot(x="holiday",y="registered",data=bikeDf,ax=axes[1]); sns.boxplot(x="holiday",y="casual",data=bikeDf,ax=axes[2]); plt.show()小结9:对于注册用户,是否是节假日这一因素对用户数影响不明显,节假日的用户数略少于非工作日的用户数;但对于非注册用户,节假日的用户数明显超过非节假日的用户数。
4.2 节假日的使用时刻
holidayDf=bikeDf[bikeDf[holiday]==1] fig = plt.figure(figsize=(10,5)) ax7 = fig.add_subplot(2,1,1) holidayDf_hour=holidayDf.groupby([holidayDf[hour]]).agg({casual:mean,registered:mean,count:mean}) holidayDf_hour.plot(ax=ax7,title=用户在节假日的使用时刻) plt.xlabel(小时) plt.ylabel(用户数) plt.show()小结10:在节假日,用户数在白天时间段8-18点持续上升保持较高数量,夜间持续下降保持较低数量,符合人们白天外出游玩需要用车、夜间休息的生活规律。注册用户与非注册用户没有明显的差异。