当前位置: 首页 > 后端技术 > Python

共享单车数据集探索与可视化

时间:2023-03-25 21:52:02 Python

分析背景分析目的分析摩拜订单数据对骑行时间的影响,作为业务运营优化的参考和依据(由于原始数据集中没有订单金额数据,且由于摩拜单车以骑行时长为计费标准,而骑行时长是影响订单金额的最主要因素,故本次分析以骑行时长为准)。主要着重分析骑行时间(包括工作日/周末、高峰时段/非高峰时段)、骑行地点、用户价值等变量对骑行时间的影响。数据集摘要原始数据集来自优达学城2016年8月的摩拜单车上海市区,随机抽取了数百万用户使用数据,共计102361条订单记录,包括出发地、目的地、租车时间、还车时间、用户ID、车辆ID、交易编号和路线跟踪信息。经过清洗和信息抽取,新数据集新增了22个变量。主要用于分析的变量有:ttl_min(骑行时长(min)),distance(骑行起点和终点之间的直线距离(km)),daytype(工作日/周末),hourtype(高峰时段/非-peakhours),ring_stage(内环/中环/外环/外环),rate(高价值用户/中价值用户/低价值用户)这六个变量。在新数据集的使用过程中,也去除了少量骑行速度、距离、时长的异常记录,最终订单记录数为102338条。分析结论用户行为总结在数据探索过程中发现骑行时间(包括工作日/周末、高峰时段/非高峰时段)、骑行区域和用户价值四个变量均对骑行时间产生影响.依次定义四个变量条件可以发现:在骑行地点或用户价值条件相同的情况下,骑行时间对平均骑行时间有明显规律,高峰时段平均骑行时间且周末高于非周末。高峰时间和工作日;一般来说,用户价值越高,骑行时间越长,骑行区域离市中心越远,骑行时间越长,但前者对骑行时间的影响远小于后者。除了关注类型变量对骑行时长的影响外,还有以下发现:对比不同的骑行地点和用户价值类型,工作日和高峰时段的数据点分布特征高度相似,表明工作日和高峰时段数据点分布与用车行为特征相似;高价值用户更多分布在内环。优化建议总结基于以上用户行为数据分析结论,提出如下优化建议:骑行时间,可以以不同的骑行时间为划分标准,有针对性地推出骑行套餐和营销活动,增加订单频次和订单量(如不同时间段的骑行徽章奖励、限时免费骑行、迎峰车辆等)出行时间长),消费频率低(高价值用户少),可根据骑行的地理位置推出相应的骑行套餐,增加此类地区用户的消费频率,增加他们对摩拜单车的依赖。鉴于工作日和高峰时段的用户行为特征相似,在设计运营方案时可以考虑其他解释。由于原始数据集中的信息量太少,可供分析的内容有限。扩展数据集的信息和范围后,可用于分析的内容包括但不限于:根据用户在APP中的点击数据分析关键路径的转化率,从而判断某区域自行车供需是否平衡,优化自行车配送和调度效率。以季度自行车使用周期作为营销方案设计优化的参考,并根据骑行券、骑行套餐、充值、返现等优惠活动对用户骑行行为的影响,作为用户参考依据精细化运营或营销方案设计的基础分析过程分析过程主要关注四类变量对骑行时间的影响。首先介绍骑行时间和骑行距离的数据分布。然后通过绘制小提琴图,观察到两者的数据特征随着类型变量的变化高度相似,进而确定只有骑行时间这个关键指标与四个类型变量之间的关系应引起重视。最后,在控制不同条件的类型变量的同时,通过点图绘制其他变量对骑行持续时间的影响。#导入所有需要的库并设置图形直接显示importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassb%matplotlibinline#清除输出中的警告importwarnings.simplefilter("ignore")#导入清理后的数据集df_e=pd.read_csv('mobike_master.csv')#将对应列转化为类别变量'],'rate':['高价值用户','中价值用户','低价值用户'],'daytype':['weekdays','weekends'],'hourtype':['rushhours','non-rushhours']}forvarinorder_dict:order=pd.api.types.CategoricalDtype(ordered=True,categories=order_dict[var])df_e[var]=df_e[var].astype(order)#数据清洗,去掉少量骑行速度、骑行时间、骑行距离明显异常的数据df_e['speed']=df_e['distance']/(df_e['ttl_min']/60)df_e=df_e[-(((df_e['速度']<12)|(df_e['速度']>20))&((df_e['ttl_min']>720)|(df_e['distance']>50)))]骑行时间分布骑行时间的数据范围很大,最小值为1分钟,最大值为666分钟,且呈现长尾分布,大部分骑行时间较短,使用对数变换x轴图,可以发现骑行时间呈现右偏分布,峰值出现在7-10分钟bins=10**np.arange(0,np.log10(df_e.ttl_min.max())+0.15,0.15)plt.hist(data=df_e,x='ttl_min',bins=bins);plt.xscale('log')xticks=(1,2,5,10,20,50,100,200,500)plt.xticks(xticks,xticks);plt.xlabel('骑行时长(分钟)');plt.title('骑行时长分布');骑行距离分布数据集中的骑行距离是通过骑行起点和终点之间的直线距离来估算的。数据的范围也很大,最小值0.146km,最大值32.497km。而且它还表现出长尾分布。大多数骑行距离都很短,很少有骑行距离很长。使用对数变换x轴图可以发现,骑行距离呈现右偏分布,峰值出现在0.7-1.3公里之间。之间。bins=10**np.arange(np.log10(df_e.distance.min()),np.log10(df_e.distance.max())+0.08,0.08)plt.hist(data=df_e,x='距离',bins=bins);plt.xscale('log')xticks=(0.1,0.2,0.5,1,2,5,10,20)plt.xticks(xticks,xticks);plt.xlabel('骑行距离(km)');plt.title('骑行距离分布');骑行时间与骑行距离等变量的关系骑行时间方面,求周末和高峰时段的骑行时间和骑行距离的中位数均高于工作日和非高峰时段(周末除外,其中骑行距离略低于工作日);从骑行区域来看,一旦用户的骑行区域在内环外,骑行时间会更长离市中心的距离和离市中心的距离的中位数都变高,这可能是因为距离更近到郊区,用户的出发地和目的地之间的距离越来越大;在用户价值方面,骑行时长和行驶距离的中位数都随着用户价值的降低而降低。通过对比发现,骑行时间和骑行距离这两个数值变量的数据分布特征与分类情况下的变化特征几乎一致,后续对骑行距离的分析可以不再做原因如下:一方面,骑行时间长是原始数据中的真实数据(骑行距离是骑行起点和终点估算的直线距离)。另一方面,摩拜按骑行时间付费。因此,当数据特征高度相似时,选择数据质量和价值较高的乘车时间作为后续分析指标。#因为骑行时间和距离的数据呈现出很长的长尾,为了更清楚的观察数据特征,先对这两个数据进行对数变换df_e['log_ttl_min']=np.log10(df_e['ttl_min'])df_e['log_distance']=np.log10(df_e['distance'])cat_vars=['daytype','hourtype','ring_stage','rate']fig,ax=plt.subplots(ncols=4,nrows=2,figsize=[20,10])color=sb.color_palette()[0]foriinrange(len(cat_vars)):var=cat_vars[i]#绘制图形的第一行sb.violinplot(data=df_e,x=var,y='log_ttl_min',ax=ax[0,i],color=颜色);ttl_min_ticks=[1,2,5,10,20,50,100,200,500]ax[0,i].set_yticks(np.log10(ttl_min_ticks));ax[0,i].set_yticklabels(ttl_min_ticks);ax[0,i].set_ylabel('骑行时长(分钟)');如果我==2:xlabels=ax[0,i].get_xticklabels()ax[0,i].set_xticklabels(xlabels,rotation=10);#绘制图形的第二条线sb.violinplot(data=df_e,x=var,y='log_distance',ax=ax[1,i],color=color);distance_ticks=[0.1,0.2,0.5,1,2,5,10,20]ax[1,i].set_yticks(np.log10(distance_滴答声));ax[1,i].set_yticklabels(distance_ticks);ax[1,i].set_ylabel('骑行距离(km)');ifi==2:xlabels=ax[1,i].get_xticklabels()ax[1,i].set_xticklabels(xlabels,rotation=10);plt.suptitle('其他特征的骑行时长和距离',fontsize='xx-大');在给定骑行时间的情况下,骑行时间随骑行区域和用户价值的变化一般情况下,除内环内的数据外,其他区域的平均骑行时间随着起点距离城市中心。周末和非高峰时段外环外,高价值用户平均乘车时长最高。总体而言,高峰时段和周末的平均乘车时间高于非高峰时段和工作日。从第一列顶部和底部两个图可以大致看出,工作日和高峰时段平均骑行时间随用户价值变量和骑行面积变量变化的变化特征非常相似,可能是由于工作日和高峰时段之间的差异。用户中上班族占大多数,这些上班族有类似的用车行为特征(row_dict.keys())[0]#设置第一张图的编号,以便后续操作获取第一张图的y轴a0,b0,c0=var.split(',')a,b,c=int(a0),int(b0),int(c0)plt.subplot(a,b,c)标志,标志,色调,x=row_dict[var]['flagid'],row_dict[var]['标志'],row_dict[var]['色调'],row_dict[var]['x']ax=sb.pointplot(data=df_e[df_e[flagid]==flag],x=x,y='log_ttl_min',hue=hue,palette='Blues_r',linestyles='',dodge=0.1);ax.set_title("{}在{}和{}之间的骑行时长".format(flag,x,hue),fontsize='small');ylocs=np.arange(1,1.25,0.025)ylabels=np.round(np.power(10,ylocs),2)ax.set_yticks(ylocs);ax.set_yticklabels(ylabels);ax.set_yticklabels([],minor=True);#don'tshowdefaultmajorticksifc%b==1:#为每一行设置第一个图的y轴标签,其他图不显示,防止图内容被覆盖ax.set_ylabel('平均骑行时间(分钟)');否则:ax.set_ylabel('');ifx=='ring_stage'orx=='rate':#ring_stage和rate的类别名称太长,将字体调小xlabels=ax.get_xticklabels()ax.set_xticklabels(xlabels,fontsize='small');ifvar==firstplot:ylim=ax.get_ylim()#获取第一个图的y轴else:plt.ylim(ylim);#使从第二个开始的所有绘图与第一个绘图保持相同的y轴范围plt.figure(figsize=[15,10])row_dict={'2,2,1':{'flagid':'daytype','flag':'weekdays','hue':'rate','x':'ring_stage'},'2,2,2':{'flagid':'daytype','flag':'weekends','hue':'rate','x':'ring_stage'},'2,2,3':{'flagid':'hourtype','flag':'高峰时间','hue':'rate','x':'ring_stage'},'2,2,4':{'flagid':'hourtype','flag':'非高峰时段','hue':'rate','x':'ring_stage'}}ppltgrid(row_dict)给定骑行区域和用户值,骑行变化规则timewithridingtime分别定义骑行地点变量和用户价值变量,观察骑行时间对平均骑行时间的影响。可以发现,数据点分布的相对位置高度相似,说明骑行时间为平均骑行时间的规律性明显,即在相同骑行位置或用户价值条件下,高峰时段和周末的平均骑行时间高于非高峰时段和工作日。对比第一行和第二行的数据,根据点分布特征可以发现,从用户价值变量来看,数据点随着用户价值从高到低,垂直变化幅度很大低于第一行的骑行位置透视图,表明用户价值对平均骑行位置有影响。行程时间的影响很小,远小于骑行位置对它的影响。plt.figure(figsize=[20,10])row_dict={'2,4,1':{'flagid':'ring_stage','flag':'insideinnerring','hue':'daytype','x':'hourtype'},'2,4,2':{'flagid':'ring_stage','flag':'中环内','hue':'daytype','x':'hourtype'},'2,4,3':{'flagid':'ring_stage','flag':'insideouterring','hue':'daytype','x':'hourtype'},'2,4,4':{'flagid':'ring_stage','flag':'outsideouterring','hue':'daytype','x':'hourtype'},'2,4,5':{'flagid':'rate','flag':'高价值用户','hue':'daytype','x':'hourtype'},'2,4,6':{'flagid':'rate','flag':'中值用户','hue':'daytype','x':'hourtype'},'2,4,7':{'flagid':'rate','flag':'低价值用户','hue':'daytype','x':'hourtype'}}ppltgrid(row_dict)的代码已经提交到Github,更多内容请关注我的个人博客。Point——国际酒店(高德开放平台)的经纬度坐标:https://lbs.amap.com/console/...上海市内环、中环、外环大概范围:https://zhidao.baidu.com/ques...2016年8月摩拜单车收费标准:http://www.33lc.com/文章/7...