栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Cocos2d-x

Python共享单车数据可视化(时间、空间、频次三维度分析)

Cocos2d-x 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python共享单车数据可视化(时间、空间、频次三维度分析)

项目背景

公共交通工具的“最后一公里”是城市居民出行采用公共交通出行的主要障碍,也是建设绿色城市、低碳城市过程中面临的主要挑战。
共享单车(自行车)企业通过在校园、地铁站点、公交站点、居民区、商业区、公共服务区等提供服务,完成交通行业最后一块“拼图”,带动居民使用其他公共交通工具的热情,也与其他公共交通方式产生协同效应。
共享单车是一种分时租赁模式,也是一种新型绿色环保共享经济。自2014年ofo首次提出共享单车概念,至今已陆续产生了25个共享单车品牌,与传统的有桩借还自行车相比,无桩的共享单车自由度更高,广受用户好评。
本次分析拟取2017年5月中旬某共享单车在北京地区的车辆订单数据,从时间、空间、频次三个维度进行分析,对该品牌共享单车的发展方向提出改善性意见。

项目分析思维导图


数据:共享单车数据集

数据字段如下:

orderid 订单号 userid 用户ID bikeid 车辆ID start_time 骑行起始日期时间
end_time骑行结束日期时间 start_year 骑行起始年 start_month 骑行起始月 start_day
骑行起始日 start_weekday 周一到周日 weekend 工作日:0,周末:1 start_location_x
骑行起始经度 start_location_y 骑行起始纬度 end_location_x 骑行结束经度
end_location_y 骑行结束纬度

项目分析具体步骤 导入模块
from geopy.geocoders import BaiduV3
from geopy import distance
import geohash as gh
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
import datetime
%matplotlib inline

import warnings
warnings.filterwarnings("ignore")
读取数据
df=pd.read_csv('train.csv')
df.head()

df.info()

#数据预处理
#查看重复值
print(df.duplicated().any())#无重复值,无需处理

#查看缺失值
print(df.isnull().any())#无缺失值,无需处理

数据分析

每日使用量分析

# #1.将datetime中的数据转化为日期形式
# df['start_time']=pd.to_datetime(df['start_time'])
# df['end_time']=pd.to_datetime(df['end_time'])
# #2.将日期中的年,月,日,小时作为新的字段名
# df['start_year'] = df['start_time'].dt.year
# df['start_month'] = df['start_time'].dt.month
# df['start_day'] = df['start_time'].dt.day
# df['start_weekday']=df['start_time'].dt.weekday
# df['start_hour'] = df['start_time'].dt.hour
# df.head()
#start_weekday数据编码{0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',5:'星期六',6:'星期日'}
# dict1={0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',5:'星期六',6:'星期日'}
# df['start_weekday']=df['start_weekday'].map(dict1)
# df.head()
#添加weekend列(0 or 1)
# dict1={'星期一':0,'星期二':0,'星期三':0,'星期四':0,'星期五':0,'星期六':1,'星期日':1}
# df['weekend']=df['start_weekday'].map(dict1)
# df.head()
#按日期升序排列
# df=df.sort_values(by="start_time")
# df.index=[i for i in range(len(df))]
# df.head()
#完整数据的时间跨度为2016-08-01至2016-08-31,历时31天
print(df.iloc[0,:].start_time)
print(df.iloc[-1,:].start_time)

#2016-08-01 是星期一
df[['start_day','start_weekday']].drop_duplicates().head(7)

plt.figure(figsize=(18,8))
sns.countplot(x="start_day",data=df,palette='Spectral')
plt.title('每日单车使用次数',fontsize=20)
plt.xlabel('Day',fontsize=20)
plt.ylabel('Count',fontsize=20)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False

结论:整体趋势为稳步增长趋势
星期一到星期日不同时间段的使用量分析

#将数据分为7类,星期一到星期日,分别分析24小时的不同时间段内的使用量
plt.figure(figsize=(18,10))
data1=df.groupby(['start_hour','start_weekday'])['orderid'].count().reset_index()
sns.pointplot(x='start_hour',y='orderid',hue='start_weekday',data=data1,ci=None,palette='Spectral')
plt.xlabel('Hour',fontsize=20)
plt.ylabel('Count',fontsize=20)
plt.title('星期一到星期日不同时间段的使用量分析',fontsize=20)

星期一到星期日使用量分析结论:工作日与周末分布有不同的分布规律。

#将数据分为两类,工作日和周末,分别分析24小时的不同时间段内的使用量
plt.figure(figsize=(18,10))
data1=df.groupby(['start_hour','weekend'])['orderid'].count().reset_index()
sns.pointplot(x='start_hour',y='orderid',hue='weekend',data=data1,ci=None,palette='Spectral')
plt.xlabel('Hour',fontsize=20)
plt.ylabel('Count',fontsize=20)
plt.title('工作日和周末不同时间段的使用量分析',fontsize=20)

周末和工作日使用量分析结论:

工作日早晚各有一个峰值,中午12点有一个小峰值,说明工作日的单车使用时间符合通勤高峰时间规律,工作日的使用场景以通勤为主,还伴有部分午餐时间的使用
周末在8点至21点区间内使用量平缓分布.
结合前述单日总使用量的对比,通勤需求产生的使用量更大
可以选择工作日非高峰时段或周末进行单车维修、保养等工作

骑行距离的分析

#添加"起始点距离"列
# for i in df.index:
#     df.loc[i,"起始点距离"]=distance.distance((df['start_location_y'][i],df['start_location_x'][i]),(df['end_location_y'][i],df['end_location_x'][i])).km
# df.head()
#骑行距离比例分布
from pyecharts.charts import Pie
bins = [*range(6)] # 手动设置分箱间隔
dff=df[['orderid','起始点距离']]
dff['起始点int值'] = pd.cut(dff['起始点距离'],bins,labels=False) # 使用cut离散化
df1=['0-1 km', '1-2 km', '2-3 km', '3-4 km', '>4 km']
df2=dff.groupby("起始点int值").count()["orderid"]
df3=list(list(z) for z in zip(df1,df2))
pie_dis=(Pie()
        .add("骑行距离比例分布",df3)
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行距离比例分布"))
        )
pie_dis.render_notebook()

骑行距离的分析结论:

大部分用户的骑行距离都小于2km
骑行距离不超过1km的用户占比1/3,符合共享单车的使用场景——解决“最后一公里”问题
df.loc[df.start_hour==18,:].groupby(["start_location_x","start_location_y"])["orderid"].count().reset_index()["orderid"].sort_values()


高峰期单车起点位置分布

#提取8-9点时间段内所有被使用的单车的起点位置
df_=df.loc[df.start_hour==8,:].groupby(["start_location_x","start_location_y"])["orderid"].count().reset_index()
df8=list(list(z) for z in zip(df_["start_location_x"],df_["start_location_y"],df_["orderid"]))
bar3D = (
    Bar3D()
    .add(
        "",
        
        df8,
        shading='realistic',
        grid3d_opts=opts.Grid3DOpts(width="200",depth="200",is_rotate=True),
        
    )
    .set_global_opts(
                 title_opts=opts.TitleOpts(title="8-9点早高峰单车起点位置分布",subtitle="8-9点早高峰单车起点位置分布"),
                 visualmap_opts=opts.VisualMapOpts(is_show=True, max_=25,
                                          is_piecewise=False,
                                          range_color=Faker.visual_color,
                                                ))
            
)

bar3D.render_notebook()

#提取18-19点时间段内所有被使用的单车的起点位置
df_=df.loc[df.start_hour==18,:].groupby(["start_location_x","start_location_y"])["orderid"].count().reset_index()
df18=list(list(z) for z in zip(df_["start_location_x"],df_["start_location_y"],df_["orderid"]))
bar3D = (
    Bar3D()
    .add(
        "",
        
        df18,
        shading='realistic',
        grid3d_opts=opts.Grid3DOpts(width="200",depth="200",is_rotate=True),
        
    )
    .set_global_opts(
                 title_opts=opts.TitleOpts(title="18-19点晚高峰单车起点位置分布",subtitle="18-19点晚高峰单车起点位置分布"),
                 visualmap_opts=opts.VisualMapOpts(is_show=True, max_=46,
                                          is_piecewise=False,
                                          range_color=Faker.visual_color,
                                                ))
            
)

bar3D.render_notebook()


高峰期单车起点位置分布

可以针对早晚高峰,提前从需求较少的区域投放车辆至高峰期高需求区域

用户使用频次分析

#提取用户批次数据
df1=df.groupby("userid")["orderid"].count().reset_index().groupby("orderid")[["userid"]].count().reset_index()
bins1 = [0,5,10,26] # 手动设置分箱间隔
df1['orderid1']=pd.cut(df1['orderid'],bins1,labels=False) # 使用cut离散化
df2=['0-5 次', '5-10 次', '>10 次']
df1=df1.groupby('orderid1')["userid"].sum()
df3=list(list(z) for z in zip(df2,df1))
#一个月内用户的使用次数大量分布在10次以下,50%的用户使用次数为5次及以下
pie_user_frequency=(Pie()
                   .add("",df3)
                   .set_global_opts(title_opts=opts.TitleOpts(title="用户使用频次统计",subtitle="取连续31天的完整数据进行统计")))

pie_user_frequency.render_notebook()

用户使用频次分析结论:

用户的使用次数大量分布在10次以下,50%的用户使用次数为5次及以下,有较大提升空间,考虑改进两个因素
    因素一 高峰时段的车辆分布情况,是否因为高峰时段车辆数量不足,导致用户无法使用到单车
    因素二 用户粘性差,是否用户对本品牌的单车选择倾向性低,可以考虑加大月卡等套餐的推广力度,或提升本品牌单车品质
    *使用单车次数5次及以上的用户为高粘性用户,占比约50%
项目总结
本次分析明确了共享单车的使用场景:
    工作日早晚高峰的通勤需求
    周末白天无明显峰值的外出需求
    短距离骑行(2公里内)的外出需求
改善性意见:
    可以针对早晚高峰,提前从需求较少的区域投放车辆至高峰期高需求区域
    用户使用频次有提升空间,有近50%的用户使用频次不超过5次,用户粘性较差,可以推广月卡或优惠套餐等进一步提升用户粘性
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号