基于数据挖掘的共享单车骑行数据分析与预测

这篇具有很好参考价值的文章主要介绍了基于数据挖掘的共享单车骑行数据分析与预测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 完整代码下载:https://download.csdn.net/download/andrew_extra/88612623

1. 项目背景

共享单车系统在大城市越来越流行,通过提供价格合理的自行车租赁,让人们可以享受在城市里骑自行车的乐趣,而无需为自己购买自行车。本项目利用 Nice Ride MN 在双子城(明尼苏达州明尼阿波利斯市/圣保罗市)提供的历史数据。我们将通过查看不同站点的自行车需求、每个站点的自行车流量、季节性和天气对骑行模式的影响,以及会员和非会员之间骑行模式的差异,来探索共享单车骑行数据。

2. 功能组成

基于数据挖掘的共享单车骑行数据分析与预测系统的主要功能包括:

基于数据挖掘的共享单车骑行数据分析与预测

3. 数据读取与预处理

stations = pd.read_csv('data/Nice_Ride_2017_Station_Locations.csv')
trips = pd.read_csv('data/Nice_ride_trip_history_2017_season.csv')

Stations 和 trips 基本信息:

stations.info()
trips.info()

基于数据挖掘的共享单车骑行数据分析与预测基于数据挖掘的共享单车骑行数据分析与预测

 stations 和 trips 数据集看起来非常干净——没有丢失值,纬度、经度和加载的码头数量与预期一致。

        转换时间字段的数据格式:

# Convert start and end times to datetime
for col in ['End date', 'Start date']:
    trips[col] = pd.to_datetime(trips[col],
                                format='%m/%d/%Y %H:%M')

4. 数据探索式可视化分析

4.1 车站位置 Station Locations 的分析

# On hover, show Station name
tooltips = [("Station", stations['Name'])]

# Plot the stations
p, _ = MapPoints(stations.Latitude, stations.Longitude, 
                 title="Nice Ride Station Locations",
                 tooltips=tooltips,
                 height=fig_height, width=fig_width)

show(p)

基于数据挖掘的共享单车骑行数据分析与预测

        可以看出,大多数车站都分散在明尼阿波利斯周围,但圣保罗市中心也有一个集群,以及沿大学大道和格兰德大道的几个车站,它们连接明尼阿波利斯和圣保罗。

4.2 每个车站的自行车停靠站数量

# Plot histogram of # docks at each station 
plt.figure(figsize=(16, 5))
plt.hist(stations['Total docks'],)
plt.ylabel('Number of Stations')
plt.xlabel('Number of Docks')
plt.title('Number of Docks Distribution')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测         可以看出,每个车站大部分停靠15辆共享单车。

# 显示车站名称和停靠自行车数量
tooltips = [("Station", stations['Name']), 
            ("Docks", stations['Total docks'])]

# Plot the stations
p, _ = MapPoints(stations.Latitude, stations.Longitude, 
                 tooltips=tooltips, color=stations['Total docks'],
                 size=4*np.sqrt(stations['Total docks']/np.pi),
                 title="Number of Docks at each Station",
                 height=fig_height, width=fig_width)

show(p)

 4.3 车站需求分析 Station Demand

demand_df = pd.DataFrame({'Outbound trips': trips.groupby('Start station').size(),
                          'Inbound trips': trips.groupby('End station').size()
                      })
demand_df['Name'] = demand_df.index
sdf = stations.merge(demand_df, on='Name')

plt.figure(figsize=(16, 5))
plt.hist(sdf['Outbound trips'], bins=20)
plt.ylabel('Number of Stations')
plt.xlabel('Number of outbound rentals')
plt.title('Outbound trip distribution')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

# Plot num trips started from each station 
plt.figure(figsize=(16, 5))
plt.hist(sdf['Inbound trips'], bins=20)
plt.ylabel('Number of Stations')
plt.xlabel('Number of inbound rentals')
plt.title('Inbound trip distribution')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测         可以看出,Nice Ride MN 必须将自行车从有多余自行车的车站重新分配到没有足够自行车的车站。在该站结束的骑乘次数比在该站开始的骑乘次数多的车站最终会有额外的自行车,而 Nice Ride MN 将不得不将这些额外的自行车重新分配给更空的车站!分析哪些车站的终点车次比起点车次多。

基于数据挖掘的共享单车骑行数据分析与预测

        大多数车站的终点车次和起点车次差不多。然而,肯定有几个站是不平衡的!也就是说,有些车站的入站乘车次数多于出站乘车次数,反之亦然。

        我们可以把这些分布绘制在地图上,看看哪些是不平衡的站。我们将使用Bokeh在三个单独的选项卡中绘制出出境旅行次数、入境旅行次数和需求差异。圆圈的颜色和区域表示相应选项卡中的vaue(出境旅行次数、入境旅行次数或差异)。对于“差异”,圆圈的大小表示“绝对”差异(因此我们可以看到哪些站点最不平衡,颜色告诉我们它们在哪个方向不平衡)。单击绘图顶部的每个选项卡,查看出站行程、入站行程的数量或两者之间的差异。

基于数据挖掘的共享单车骑行数据分析与预测

        有些车站结束行程的人数远远多于开始行程的人数(例如,位于圣诺克斯湖大道Lake St & Knox Ave、Bde Maka Ska东北角的车站,或Minnehaha Park车站)。还有一些车站,开始旅行的人比结束旅行的人多得多(例如,明尼苏达大学校园的科夫曼联合车站和威利大厅车站)。但大多数车站的入站和出站数量差不多。

        还可以看出,更多的车从明尼阿波利斯市中心或密歇根大学校园出发,离开市中心。请注意,明尼阿波利斯市中心聚集了许多大型蓝色圆圈(出站次数较多的车站),但大多数大型红色圆圈(出站次数较多的车站)远离市中心,往往是“目的地”和公园(如明尼哈公园、Bde Maka Ska、洛根公园和北密西西比区域公园))

4.4 需求差异性分析

         理想情况下,“Nice Ride”希望在进站和出站车次差异较大的车站有更多的码头。这是因为,如果在一个特定的车站开始的骑乘次数多于在该车站结束的骑乘次数,那么随着时间的推移,该车站的自行车数量将会减少。所以,车站需要有足够的码头来容纳足够的自行车,这样车站在一天结束时就不会空无一人了!另一方面,如果在一个车站结束的车程比在那里开始的车程多,那么该车站的所有码头都会挤满,人们将无法在那里结束他们的车程!因此,这些车站必须有足够的码头来吸收一天中的交通量。

sdf['abs_diff'] = sdf['demand_diff'].abs()

sdf['Docks'] = sdf['Total docks']/sdf['Total docks'].sum()
sdf['DemandDiff'] = sdf['abs_diff']/sdf['abs_diff'].sum()

sdf['demand_dir'] = sdf['Name']
sdf.loc[sdf['demand_diff']<0, 'demand_dir'] = 'More Outgoing'
sdf.loc[sdf['demand_diff']>0, 'demand_dir'] = 'More Incoming'
sdf.loc[sdf['demand_diff']==0, 'demand_dir'] = 'Balanced'

tidied = (
    sdf[['Name', 'Docks', 'DemandDiff']]
       .set_index('Name')
       .stack()
       .reset_index()
       .rename(columns={'level_1': 'Distribution', 0: 'Proportion'})
)

plt.figure(figsize=(4.5, 35))
station_list = sdf.sort_values('DemandDiff', ascending=False)['Name'].tolist()
sns.barplot(y='Name', x='Proportion', hue='Distribution', 
            data=tidied, order=station_list)
plt.title('Proportion Docks vs Demand Difference')
locs, labels = plt.yticks()
plt.yticks(locs, tuple([s[:15] for s in station_list]))
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

        每个车站的码头数量与总体需求差异之间并没有很好的匹配。需求的差异可能会随着时间的推移而变化。例如,一些车站可能在早上有更多的出站行程,在晚上有更多的入站行程,反之亦然。

4.5 需求随时间变化的差异

基于数据挖掘的共享单车骑行数据分析与预测

        驶入和驶出车站之间的平衡并不是一成不变的——它会随着时间而变化!在早上8点左右,有更多的人在车站结束他们的租车,可能是通勤上班的人。但在一天结束时,大约下午5点,人们通常会从该车站开始租车,可能是为了上下班回家。 

4.6 需求的累积差异分析

# 计算需求的累积差异
cdiff = trips_hp['Difference'].apply(np.cumsum, axis=1)

基于数据挖掘的共享单车骑行数据分析与预测

        从累积的需求差异来看,很明显早上有很多自行车被从这个车站带走,晚上又被带回来。所以,如果尼斯骑行不把自行车重新分配给这个车站,在上午9点到下午4点之间,这里的自行车会比晚上少很多。

4.7 单车从停靠点的流转情况分析

        乘站的位置、每个车站的码头数量、每个车站的需求以及需求随时间的变化。然而,自行车是如何从每个车站流向另一个车站的?也就是说,旅行的分布是什么样的?每个车站最常见和最不常见的目的地是什么?

# 计算从每个车站到另一个车站的行程数
flow = (
    trips.groupby(['Start station', 'End station'])['Start date']
    .count().to_frame().reset_index()
    .rename(columns={"Start date": "Trips"})
    .pivot(index='Start station', columns='End station')
    .fillna(value=0)
)
# Plot trips to and from each station
sns.set_style("dark")
plt.figure(figsize=(10, 8))
plt.imshow(np.log10(flow.values+0.1),
           aspect='auto',
           interpolation="nearest")
plt.set_cmap('plasma')
cbar = plt.colorbar(ticks=[-1,0,1,2,3])
cbar.set_label('Number of trips')
cbar.ax.set_yticklabels(['0','1','10','100','1000'])
plt.ylabel('Station Number FROM')
plt.xlabel('Station Number TO')
plt.title('Number of trips to and from each station')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

# 最终停靠在出发时候的同一车站的数量
sns.set()
plt.figure()
plt.bar([0, 1], 
        [np.trace(flow.values), 
         flow.values.sum()-np.trace(flow.values)],
        tick_label=['Same as start', 'Other'])
plt.xlabel('End station')
plt.ylabel('Number of trips')
plt.title('Number of trips which end\n'+
          'at same station they started from')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

        可以看出,大多数旅行实际上不会回到他们出发的车站。

4.8 骑行时长分析

# 超过24小时的,可能为异常情况
Ntd = np.count_nonzero(trips['Total duration (Seconds)']>(24*60*60))
print("Number of trips longer than 24 hours: %d ( %0.2g %% )"
      % (Ntd, 100*Ntd/float(len(trips))))

# 骑行时长不超过1小时的
Ntd = np.count_nonzero(trips['Total duration (Seconds)']<(24*60))
print("Number of trips shorter than 1 hour: %d ( %0.2g %% )"
      % (Ntd, 100*Ntd/float(len(trips))))

# Plot histogram of ride durations
plt.figure()
sns.distplot(trips.loc[trips['Total duration (Seconds)']<(4*60*60),
                       'Total duration (Seconds)']/3600)
plt.xlabel('Ride duration (hrs)')
plt.ylabel('Number of Trips')
plt.title('Ride durations')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

4.9 每个月骑行时长分布情况

基于数据挖掘的共享单车骑行数据分析与预测

        最受欢迎的单车骑行月份是7月,尽管在非黄金月份仍有很多单车骑行,但4月和10月的数量几乎是7月的一半。

 4.9 一年中每天骑行分布情况

trips.groupby(trips['Start date'].dt.dayofyear)['Start date'].count().plot()
plt.xlabel('Day of the year')
plt.ylabel('Number of rentals')
plt.title('Number of rentals by day of the year in 2017')
holidays = [("Mother's day", 134),
            ("Memorial day", 149),
            ("4th of July", 185),
            ("Labor day", 247), 
            ("Oct 27", 300)]
for name, day in holidays:
    plt.plot([day,day], [0,6000], 
             'k--', linewidth=0.2)
    plt.text(day, 6000, name, fontsize=8, 
             rotation=90, ha='right', va='top')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

 4.10 每周骑行分布情况

plt.figure()
sns.countplot(trips['Start date'].dt.weekday)
plt.xlabel('Day')
plt.ylabel('Number of Trips')
plt.title('Number of rentals by day of the week in 2017')
plt.xticks(np.arange(7),
           ['M', 'T', 'W', 'Th', 'F', 'Sa', 'Su'])
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

 4.11 天气因素影响骑行情况

weather = pd.read_csv('data/WeatherDailyMinneapolis2017.csv')
weather['DATE'] = pd.to_datetime(weather['DATE'],
                                 format='%Y-%m-%d')
# Plot daily min + max temperature
plt.plot(weather.DATE.dt.dayofyear,
         weather.TMAX, 'C2')
plt.plot(weather.DATE.dt.dayofyear,
         weather.TMIN, 'C1')
plt.legend(['Max', 'Min'])
plt.xlabel('Day of year')
plt.ylabel('Temperature (degrees F)')
plt.title('Daily temperatures in Minneapolis for 2017')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

        气温与单车骑行数量分布情况:

基于数据挖掘的共享单车骑行数据分析与预测

        降水量与骑行次数分布情况:

基于数据挖掘的共享单车骑行数据分析与预测

         降水量与骑行时长的分布情况:

基于数据挖掘的共享单车骑行数据分析与预测

        降水量和骑行持续时间之间可能存在一定的负相关。这在比较有雨和无雨的骑行时间时更为明显。

4.12 会员用户分析

        会员与非会员用户每日骑行次数差异性分析: 

基于数据挖掘的共享单车骑行数据分析与预测

        会员与非会员用户每小时骑行次数差异性分析: 

基于数据挖掘的共享单车骑行数据分析与预测

        会员与非会员用户骑行时长差异性分析:

基于数据挖掘的共享单车骑行数据分析与预测

 5. 基于天气数据和历史骑行数据预测每日骑行数据

        建立一个模型来预测每天的乘车次数,包括季节、天气和其他因素,利用二阶多项式来模拟季节效应:

基于数据挖掘的共享单车骑行数据分析与预测

         然而,季节将与温度高度相关!这意味着,如果我们试着将两者都放在同一个模型中,温度对乘坐次数的一些影响可能归因于季节。因此,我们来拟合一个模型,它包含了我们所关心的一切除了季节的预测因子,然后将该模型的残差视为季节的函数。基本上,我们将要做的是“消除”天气对乘车次数的影响,然后研究剩余信息如何随季节变化。

        首先,让我们拟合一个普通的最小二乘回归模型,从一周中的某一天开始预测每天的乘车次数、每日最高温度和每日降水量。

5.1 OLS 回归分析

df = pd.DataFrame()
df['Trips'] = weather.trips
df['Date'] = weather.DATE
df['Day'] = weather.DATE.dt.dayofweek
df['Temp'] = weather.TMAX
df['Precip'] = weather.PRCP + 0.001

# Only fit model on days with trips
df = df.loc[~np.isnan(df.Trips), :]
df.reset_index(inplace=True, drop=True)

# Fit the linear regression model
olsfit = smf.ols('Trips ~ Temp + log(Precip) + C(Day)', data=df).fit()

# Show a summary of the fit
print(olsfit.summary())

基于数据挖掘的共享单车骑行数据分析与预测

         我们的模型确实捕捉到了天气的影响。在上面的汇总表中,coef列包含最左侧列中变量的系数。温度系数为≈39.9,这意味着温度每升高10度,就可以获得良好的乘坐体验≈每天还有400次骑乘!但不可能再多坐400次。最右边的两列显示了95%的置信区间,这表明该模型95%确定温度系数在33.6和46.2之间。因此,该模型非常确定每天的乘车次数会随着温度的升高而增加(因为95%的置信区间完全高于0),但这种关系到底有多强还不确定。

        同样,降水量系数显著为负值,这意味着降水量越多,每天的乘车次数就越少。这是有道理的,符合我们之前的天气分析。

5.2 预测每天骑行次数

# Predict num rides and compute residual
y_pred = olsfit.predict(df)
resid = df.Trips-y_pred

# Plot Predicted vs actual
plt.figure(figsize=(12, 6))
sns.set_style("darkgrid")
plt.plot(df.Date.dt.dayofyear, y_pred)
plt.plot(df.Date.dt.dayofyear, df.Trips)
plt.legend(['Predicted', 'Actual'])
plt.xlabel('Day of the Year')
plt.ylabel('Number Daily Rentals')
plt.title('Actual vs Predicted Rides Per Day')
plt.show()

基于数据挖掘的共享单车骑行数据分析与预测

6. 总结

        本项目利用 Nice Ride MN 在双子城(明尼苏达州明尼阿波利斯市/圣保罗市)提供的历史数据。我们将通过查看不同站点的自行车需求、每个站点的自行车流量、季节性和天气对骑行模式的影响,以及会员和非会员之间骑行模式的差异,来探索共享单车骑行数据。

  完整代码下载:https://download.csdn.net/download/andrew_extra/88612623

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码

精彩专栏推荐订阅:

1. Python 毕设精品实战案例
2. 自然语言处理 NLP 精品实战案例
3. 计算机视觉 CV 精品实战案例
文章来源地址https://www.toymoban.com/news/detail-513000.html

到了这里,关于基于数据挖掘的共享单车骑行数据分析与预测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于数据挖掘机器学习的心脏病患者分类建模与分析

    首先,读取数据集,该数据集是UCI上的心脏病患者数据集,其中包含了 303 条患者信息,每一名患者有 13 个字段记录其基本信息(年龄、性别等)和身体健康信息(心率、血糖等),此外有一个类变量记录其是否患有心脏病。详细的字段信息可见 此处。 类别字段 target 有两

    2024年01月19日
    浏览(57)
  • 【数据挖掘torch】 基于LSTM电力系统负荷预测分析(Python代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 1.1 地区负荷的中短期预测分析 1.2 行业负荷的中期预测分

    2024年02月14日
    浏览(65)
  • 基于数据挖掘技术的手机消费行为分析的研究与实现(论文+源码)_jsp_236

    摘要 本文首先研究并介绍国内外目前的背景和现状,在此基础上给出论文的主要研究内容,其次,对数据挖掘技术手机消费行为系统的需求进行了分析。再次,对数据挖掘技术手机消费行为系统进行了总体设计,根据其总体设计、软件架构和总体功能模块进行了详细设计,作

    2024年02月04日
    浏览(46)
  • 共享单车之数据分析-统计共享单车每天的平均使用时间

    第1关:统计共享单车每天的平均使用时间 任务描述 相关知识 如何配置Hbase的MapReduce类 如何使用Hbase的MapReduce进行数据分析 编程要求 测试说明 任务描述 本关任务:使用 Hbase 的 MapReduce 对已经存在 Hbase 的共享单车运行数据进行分析,统计共享单车每天的平均使用时间,其中

    2024年02月03日
    浏览(60)
  • 基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

    收藏和点赞,您的关注是我创作的动力   随着科学技术的发展,人类进入了互联网时代,不仅数据量庞大,而且数据种类繁多,Python简单易学, 语法清晰,在数据操作方面有着一定优势,成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来作为开发语言,并

    2024年02月03日
    浏览(56)
  • 头歌:共享单车之数据分析

    第1关 统计共享单车每天的平均使用时间 第2关 统计共享单车在指定地点的每天平均次数   第3关 统计共享单车指定车辆每次使用的空闲平均时间   第4关 统计指定时间共享单车使用次数   第5关 统计共享单车线路流量

    2024年02月20日
    浏览(40)
  • 数据中台系统是一个重要的数字化转型方式之一,它基于现代的大数据处理技术,通过构建统一的数据仓库,将不同来源、格式的数据进行整合、清洗、融合,并提供给业务人员进行分析挖掘的数据集合

    作者:禅与计算机程序设计艺术 数据中台系统是一个重要的数字化转型方式之一,它基于现代的大数据处理技术,通过构建统一的数据仓库,将不同来源、格式的数据进行整合、清洗、融合,并提供给业务人员进行分析挖掘的数据集合。其目标就是为了实现数字化进程中的各

    2024年02月11日
    浏览(48)
  • 共享单车数据处理与分析

    本案例来源不清楚,如果有作者,可以联系我,给加上对应链接 公共交通工具的“最后一公里”是城市居民出行采用公共交通出行的主要障碍,也是建设绿色城市、低碳城市过程中面临的主要挑战。 共享单车(自行车)企业通过在校园、地铁站点、公交站点、居民区、商业

    2024年02月09日
    浏览(46)
  • 关联规则挖掘(上):数据分析 | 数据挖掘 | 十大算法之一

    ⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者: 秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们 点赞👍🏻、收藏

    2024年02月07日
    浏览(56)
  • 数据挖掘与数据分析

    目录 数据挖掘与数据分析 一.数据的本质 二.什么是数据挖掘和数据分析 三.数据挖掘和数据分析有什么区别 案例及应用 1. 基于分类模型的案例 2. 基于预测模型的案例 3. 基于关联分析的案例 4. 基于聚类分析的案例 5. 基于异常值分析的案例 6. 基于协同过滤的案例 7. 基于

    2024年04月28日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包