蒙特利尔共享单车数据分析实战
简介:本项目使用一个包含1000万条骑行记录的蒙特利尔市共享单车数据集,涉及时间、位置、会员状态等信息。通过Python语言和数据分析库,将执行清洗、描述统计、时间序列分析、空间分析、会员与非会员行为对比以及骑行时长分布等任务,以获取关于共享单车使用模式和用户行为的见解,为城市规划和交通管理提供数据支持。
1. 共享单车数据集介绍
共享单车作为一种新兴的城市交通方式,它所产生的数据集为城市交通规划、用户行为分析以及智能交通系统提供了宝贵的信息资源。本章将详细介绍共享单车数据集的基本结构、数据类型和数据集涵盖的关键信息点。
数据集结构和组成
共享单车数据集通常包含以下关键字段:
-
ride_id: 每次骑行的唯一标识符。 -
start_time和end_time: 用户开始和结束骑行的时间戳。 -
start_station_id和end_station_id: 起始和终点站点的唯一标识符。 -
start_station_name和end_station_name: 起始和终点站点的名称。 -
bike_id: 使用的自行车的唯一标识符。 -
user_type: 用户类型(例如会员或非会员)。 -
duration: 骑行时长(通常以秒为单位)。
数据集的价值与应用
该数据集对于交通规划者、城市管理者以及数据分析师来说具有以下价值:
- 模式识别 : 识别城市中使用共享单车的热点区域,优化站点布局。
- 行为分析 : 分析用户骑行行为,包括出行时间和距离,了解骑行习惯。
- 预测和模拟 : 利用历史数据预测未来的使用趋势,为城市交通流量管理和调度提供依据。
本文接下来的章节将围绕如何处理和分析这些数据展开,从数据清洗与预处理到深入的统计分析,每一步都旨在提取出有用的信息,以支持决策和优化共享单车服务。
2. 数据清洗与预处理
数据清洗和预处理是数据分析和机器学习中不可或缺的步骤,它们通常占据了数据分析师大量宝贵的时间。在共享单车数据集上进行清洗和预处理的目的是确保数据质量,提高后续分析的准确性。接下来我们将详细探讨数据清洗的基本步骤和数据预处理的关键技术。
2.1 数据清洗的基本步骤
数据清洗涉及识别和修正数据集中的问题,这些问题可能会影响数据分析的准确性和可靠性。基本的清洗步骤包括识别并处理缺失值和检测并修正异常值。
2.1.1 识别并处理缺失值
缺失值是数据集中常遇到的问题。它们可能由数据输入错误、设备故障、数据传输失败等原因产生。根据缺失的程度,我们可以采取不同的策略来处理它们。
- 删除含有缺失值的记录 :如果数据集很大,且缺失值不多,可以考虑删除包含缺失值的记录。然而,这可能会导致信息的丢失。
- 填充缺失值 :更常见的做法是用某些统计方法填充缺失值。例如,可以用平均值、中位数或众数等替代缺失值。
让我们通过一段Python代码演示如何处理缺失值:
import pandas as pd
# 加载数据集
df = pd.read_csv('bikeshare_data.csv')
# 查看数据集的头部信息
print(df.head())
# 检查每一列的缺失值数量
print(df.isnull().sum())
# 选择一列(假设为 'ride_length')并用中位数填充缺失值
df['ride_length'].fillna(df['ride_length'].median(), inplace=True)
# 再次检查缺失值数量确认填充成功
print(df.isnull().sum())
在执行上述代码后, df.isnull().sum() 将显示每一列缺失值的数量,我们看到 ride_length 列的缺失值被成功填充。
2.1.2 检测并修正异常值
异常值是与数据集中其他观测值显著不同的值,它们可能是数据录入错误,或者某些不寻常事件的真实反映。检测异常值通常使用箱线图、标准差、IQR(四分位距)等方法。检测到异常值后,我们可以根据数据的特性和分析目的来决定是删除这些值,还是对其进行修正。
下面的代码使用了IQR方法来识别和处理异常值:
# 计算IQR
Q1 = df['ride_length'].quantile(0.25)
Q3 = df['ride_length'].quantile(0.75)
IQR = Q3 - Q1
# 定义异常值的范围
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 识别异常值并创建一个没有异常值的新数据集
df_filtered = df[(df['ride_length'] >= lower_bound) & (df['ride_length'] <= upper_bound)]
# 查看处理后的数据集的头部信息
print(df_filtered.head())
在这段代码中,我们首先计算 ride_length 列的四分位数和IQR,然后确定了异常值的上下界。最后,我们创建了一个新的数据集 df_filtered ,其中不包含原始数据集中的异常值。
2.2 数据预处理的关键技术
在完成基本的数据清洗步骤后,接下来我们需要应用一些关键的数据预处理技术来优化数据,使其适用于各种分析模型。
2.2.1 数据标准化与归一化
数据标准化和归一化是改变数据分布使其满足分析模型的需要的常见方法。标准化通常指将数据按比例缩放,使之落入一个小的特定区间,例如使用标准分数(Z-score)。归一化则是将数据按比例缩放至一个范围,比如0到1。
以下是一个使用Python的 sklearn.preprocessing 库来实现标准化和归一化的示例:
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 创建标准化器和归一化器实例
scaler_standard = StandardScaler()
scaler_minmax = MinMaxScaler()
# 对 'ride_length' 列进行标准化处理
df_standardized = pd.DataFrame(scaler_standard.fit_transform(df[['ride_length']]), columns=['ride_length_standardized'])
# 对 'ride_length' 列进行归一化处理
df_normalized = pd.DataFrame(scaler_minmax.fit_transform(df[['ride_length']]), columns=['ride_length_normalized'])
# 比较标准化前后的数据
print(df[['ride_length']].describe())
print(df_standardized.describe())
2.2.2 编码分类变量
分类变量需要转换为数值形式,以便算法能够处理。有几种常用的编码方式,包括独热编码(One-Hot Encoding)和标签编码(Label Encoding)。
这里,我们使用 pandas 库进行独热编码的演示:
# 假设 'user_type' 是一个分类变量,我们将其转换为独热编码格式
df_one_hot_encoded = pd.get_dummies(df, columns=['user_type'])
# 查看独热编码后的数据集的头部信息
print(df_one_hot_encoded.head())
2.2.3 特征选择与提取
特征选择是从现有的特征中选取一个子集的过程,而特征提取则是从原始数据中构建新的特征。特征选择有助于提高模型性能,减少训练时间。
让我们通过一个简单的相关性分析来选择特征:
# 假设 'start_station_id' 是我们要分析的特征
correlation_matrix = df.corr()['ride_length'].sort_values(ascending=False)
# 选择与 'ride_length' 相关性高的特征
print(correlation_matrix)
这段代码生成了一个相关系数矩阵,从而帮助我们识别出与骑行时长相关性较高的特征,以便在后续分析中使用。
总结
数据清洗与预处理是数据分析流程中不可或缺的一环,它涉及识别和处理缺失值、异常值,以及通过各种技术手段对数据进行转换和格式化以适应后续的分析模型。正确执行这一过程能够提高数据质量,并最终提升分析结果的准确性。在下一章中,我们将通过描述性统计分析,揭示共享单车数据集的更多潜在信息。
3. 描述性统计分析
描述性统计分析是数据分析中的基础,它涉及对数据集的中心趋势、分散程度、分布形状等进行量化的描述和解释。通过对数据进行描述性统计分析,研究者可以获得数据的初步理解,并为进一步的分析工作奠定基础。在共享单车数据分析中,描述性统计不仅有助于了解共享单车使用的基本情况,而且为运营优化、市场营销以及用户体验改进提供了宝贵的洞见。
3.1 描述性统计分析的目的和方法
描述性统计分析的目的是对数据集中的变量进行简洁明了的汇总和表示,使数据更容易理解和解释。通过使用均值、中位数、众数、方差、标准差、偏度、峰度等统计指标,可以得到数据分布的全面概览。
3.1.1 分析数据的集中趋势
集中趋势是指数据集中的数值倾向于聚集在某一点周围的特性,常用的集中趋势度量指标包括均值、中位数和众数。
- 均值 是所有数据值的总和除以数据个数,它反应了数据集的整体水平,是描述性统计中最常用的集中趋势度量。
- 中位数 是将数据集从小到大排列后位于中间位置的数值,对于异常值不敏感,因此比均值更能反映数据集的中心。
- 众数 是数据集中出现次数最多的值,能反应出数据的最大频数。
3.1.2 分析数据的离散程度
离散程度是指数据集中的数值分布的紧密程度,度量指标主要包括极差、方差、标准差等。
- 极差 是一组数据中的最大值与最小值之差,表示了数据的全距。
- 方差 是每个数据点与均值差值的平方的平均值,用以衡量数据的波动程度。
- 标准差 是方差的平方根,它使我们能够以与原始数据相同的单位度量离散程度。
下面是一个Python代码块,展示了如何使用Pandas和SciPy库计算共享单车数据集中某一变量的均值、中位数、众数、方差和标准差。
import pandas as pd
from scipy import stats
# 假设df是已经加载的包含共享单车数据的DataFrame
# 计算某个变量的描述性统计指标
variable = 'Ride Duration' # 示例变量名,需要替换为实际变量名
# 均值
mean_value = df[variable].mean()
# 中位数
median_value = df[variable].median()
# 众数
mode_value = stats.mode(df[variable])[0][0]
# 方差
variance_value = df[variable].var()
# 标准差
std_deviation = df[variable].std()
# 打印结果
print(f'Mean: {mean_value}')
print(f'Median: {median_value}')
print(f'Mode: {mode_value}')
print(f'Variance: {variance_value}')
print(f'Standard Deviation: {std_deviation}')
3.2 描述性统计在共享单车数据分析中的应用
3.2.1 使用描述性统计描述用户行为
描述性统计分析可以揭示共享单车用户的使用模式。例如,通过统计骑行时间的均值、中位数,可以了解用户平均使用共享单车的时间长度;通过统计骑行频率的方差,可以分析用户间使用频率的差异程度。这些信息对于共享单车公司来说至关重要,有助于它们更好地理解目标市场,并据此调整运营策略。
3.2.2 描述性统计与业务决策
描述性统计分析的结果直接指导了共享单车公司的业务决策。假设分析显示某地区的骑行时长较长,公司可能会考虑在该地区增加车辆的分布数量,或者对长期租赁提供优惠,以鼓励用户使用共享单车进行长距离的出行。同样,如果发现数据的方差较大,说明存在极端值,公司可能会进一步研究这些极端情况的成因,并采取措施进行优化。
描述性统计分析为深入的数据探索奠定了基础,并为更复杂的数据分析方法如预测模型和空间分析提供了洞察。在共享单车业务中,这一基础分析是不可或缺的,它能够为业务决策提供数据支持,同时通过数据可视化技术,使得非技术人员也能理解分析结果并参与到决策中来。
4. 时间序列分析
在处理共享单车数据时,时间序列分析为我们提供了一种强大的手段来观察和预测数据随时间变化的模式。时间序列分析不仅帮助我们理解过去的行为,还可以预测未来的趋势。本章节将深入探讨时间序列分析的基础知识、构建预测模型的方法以及它们在共享单车数据中的具体应用。
4.1 时间序列分析的基本概念
时间序列分析是对按照时间顺序排列的数据点集合进行分析的方法,旨在识别其中的模式、趋势和周期性,以便做出预测。在共享单车数据集中,这可能涉及到分析车辆使用率、租金变化等随时间推移的数据。
4.1.1 时间序列数据的特性
时间序列数据通常具有以下特性:
- 趋势(Trend) :数据随时间推移呈现出的上升或下降的长期运动方向。
- 季节性(Seasonality) :数据在固定时间间隔内周期性重复出现的模式,如每天的使用高峰、每年的季节变化。
- 周期性(Cyclicality) :不固定时间间隔内出现的波动,这些波动与经济周期或其他外部因素有关。
- 随机波动(Irregular) :不规则的数据波动,这些往往是由随机事件引起的。
理解这些特性有助于我们更好地设计和应用预测模型。
4.1.2 时间序列分析的目的
时间序列分析的目的通常包括:
- 理解数据 :揭示数据随时间变化的内在结构和模式。
- 预测未来 :根据已知数据,对未来数据进行预测。
- 检测异常 :识别数据中的异常行为或异常值。
在共享单车的背景下,预测未来的需求和使用趋势,对于资源规划和优化运营至关重要。
4.2 时间序列预测模型的构建
时间序列预测模型通常用于根据历史数据预测未来的点。这些模型可以基于统计方法,也可以基于机器学习。以下是两种常用的时间序列预测模型。
4.2.1 ARIMA模型介绍和应用
ARIMA(自回归积分滑动平均模型)是一种线性模型,广泛应用于时间序列数据的预测。ARIMA模型包括三个参数:自回归项(p),差分阶数(d)和滑动平均项(q),通常表示为ARIMA(p,d,q)。
- 自回归项(p) :模型中当前点与前p个点的线性关系。
- 差分阶数(d) :模型为了达到平稳性所做的数据差分次数。
- 滑动平均项(q) :模型中当前预测误差与前q个预测误差的线性关系。
在共享单车数据中,ARIMA模型可用于预测未来几小时或几天内的需求量。
代码块示例:
from statsmodels.tsa.arima.model import ARIMA
import pandas as pd
# 假设df是一个包含共享单车使用数据的DataFrame,'rides'列包含了我们需要预测的值
# 这里使用了ARIMA模型的简要代码来预测未来几天的骑行数据
# 将数据集分成训练集和测试集
train = df[:len(df)-7]
test = df[len(df)-7:]
# ARIMA模型的构建
model = ARIMA(train['rides'], order=(5, 1, 0))
results = model.fit()
# 进行未来7天的预测
forecast = results.forecast(steps=7)
print(forecast)
参数说明: - order=(5, 1, 0) :表示我们使用的是ARIMA模型的变体,其中自回归项为5,差分阶数为1,滑动平均项为0。 - fit() 函数用来拟合模型。 - forecast(steps=7) 用于预测未来7天的数据。
4.2.2 季节性分解的时间序列预测模型
另一种重要的模型是季节性分解的时间序列预测模型(SARIMA),它是ARIMA模型的扩展,增加了对季节性因素的考虑。SARIMA模型包括四个额外的参数来处理季节性:自回归季节性项(P)、差分季节性阶数(D)、季节性滑动平均项(Q)以及季节周期(S)。
代码块示例:
from statsmodels.tsa.statespace.sarimax import SARIMAX
# 使用SARIMA模型来预测具有季节性的共享单车数据
# 定义模型
model_sarima = SARIMAX(train['rides'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 7))
results_sarima = model_sarima.fit()
# 进行未来7天的预测
forecast_sarima = results_sarima.forecast(steps=7)
print(forecast_sarima)
参数说明: - seasonal_order=(1, 1, 1, 7) 表示季节性差分阶数为1,季节性自回归项为1,季节性滑动平均项为1,季节周期为7天(这里以周为周期进行季节性分解)。
在构建时间序列模型时,需要仔细选择模型参数以达到最佳的预测效果。一般会通过模型诊断(例如残差分析)来评估模型的适用性,并进行必要的模型调整。
通过本章的介绍,我们可以看到时间序列分析在共享单车数据预测中的重要性。下一章将介绍如何使用空间分析与可视化技术进一步深入探索共享单车数据集。
5. 空间分析与可视化
5.1 空间数据分析的重要性
5.1.1 地理信息系统(GIS)在共享单车数据分析中的作用
地理信息系统(GIS)是一种集成软件、硬件和数据,用于捕获、管理、分析和显示所有形式的地理数据的工具。在共享单车数据分析中,GIS 发挥了至关重要的作用。通过GIS,可以将骑行数据与地理空间数据相结合,提供更深入的洞察力,比如骑行的热点区域、车辆分布、骑行路径等。这些信息对于城市规划、车辆调度以及优化站点布局等都具有极大的价值。
例如,通过GIS可以直观地展示某个区域的共享单车使用率,判断哪些区域是需求高峰点,从而为运营决策提供依据。另外,通过地图的热力图可以清晰看到哪些街道或地点是骑行的高频率路线,有助于进行城市交通规划,甚至可以为新站点的选择提供数据支持。
graph TD;
A[共享单车使用数据] -->|输入| B(GIS分析系统);
B -->|处理地理信息| C[展示高需求区域];
B -->|路径分析| D[识别常用骑行路线];
C -->|输出| E[城市规划建议];
D -->|输出| F[新站点选址参考];
5.1.2 空间数据的可视化技术
空间数据可视化是将数据的地理位置和相关属性信息以图形的方式展示在地图上,以增强理解与决策支持的一种技术。在共享单车的分析中,可视化可以帮助我们直观理解数据的空间分布情况。
借助各种图表和图形,比如热力图、点密度图、路径流线等,可以有效地展示数据的分布和模式。热力图能直观地描绘出骑行热点区域,而点密度图则可以展示数据在不同区域的集中程度。路径流线则可以展示用户骑行的路线,分析骑行的连贯性和骑行量的大小。
graph TD;
A[空间数据分析] -->|数据转换| B[数据可视化工具];
B -->|生成图形| C[热力图];
B -->|生成图形| D[点密度图];
B -->|生成图形| E[路径流线图];
C -->|输出| F[热点区域分析结果];
D -->|输出| G[骑行密度分析结果];
E -->|输出| H[骑行路径分析结果];
5.2 空间分析方法与工具
5.2.1 利用地图展示空间分布
地图是展示空间分布信息的传统方式,而现代GIS软件则提供了更为丰富和直观的地图展示工具。在共享单车的空间分析中,地图不仅可以显示单车的地理位置,还能展示每个地点的使用频次、停留时间等信息。
例如,使用彩色图层来区分不同骑行时长或用户数量的区域。通过颜色的深浅变化,用户可以立即识别出需求最高的区域,从而为运营策略提供直观的依据。
graph TD;
A[骑行位置数据] -->|输入| B(GIS软件);
B -->|处理| C[生成色彩图层];
C -->|输出| D[空间需求分布图];
5.2.2 空间聚类和热点分析
空间聚类分析可以识别数据中的模式,它通过将具有相似属性的地理空间对象分组到同一个群集中来实现。这在共享单车数据分析中可以帮助识别出骑行行为类似的区域,例如,居住区、商业区、工业园区等。
热点分析是识别和分析数据在地理空间上的集中区域的过程。在共享单车的热点分析中,主要关注的是那些高频使用共享单车的地区,即“热点”,这通常通过“热点地图”来展示。热点地图是一种特殊类型的密度地图,它用不同的颜色深浅来表示位置上事件的相对概率。
graph TD;
A[骑行行为数据] -->|输入| B[空间分析工具];
B -->|执行聚类分析| C[群集识别结果];
B -->|执行热点分析| D[热点识别结果];
C -->|输出| E[地理空间群集图];
D -->|输出| F[骑行热点地图];
本章节详细探讨了空间分析与可视化的重要性及其方法和工具。通过GIS的使用和地图的展示,我们能有效地分析和理解共享单车的空间数据,进而做出更明智的运营决策。而空间聚类和热点分析进一步加深了我们对骑行模式的认识,并为优化共享单车的分布和调度提供了有力的数据支持。在下一章节中,我们将探讨会员与非会员用户行为的比较,以及这些差异对业务的影响。
6. 会员与非会员使用行为比较
6.1 会员与非会员数据的特征差异
在共享单车领域,会员用户与非会员用户之间在行为上存在显著的差异。这些差异通常表现在骑行频率、平均骑行时长、热门使用时间等多个维度。对这些特征进行深入分析,能够帮助我们更好地理解不同用户群体,并为精细化运营提供数据支撑。
6.1.1 分析不同用户群体的基本特征
通过对共享单车用户数据的分析,我们可以得到会员和非会员用户的基本特征。会员用户往往是重复使用的高频用户,他们可能更倾向于使用共享单车作为日常通勤的工具。而非会员用户可能是偶发性的用户,他们使用共享单车的情况更随机,可能受天气、节假日等因素影响较大。
import pandas as pd
import numpy as np
# 假设数据集已经加载到DataFrame中,并且已经按照会员状态进行了筛选
# 计算会员和非会员的基本统计数据
def calculate_basic_stats(dataframe, membership_column):
stats = dataframe[membership_column].value_counts()
return stats
# 假设'Membership'列中,1表示会员,0表示非会员
member_stats = calculate_basic_stats共享单车数据集, 'Membership')
print(member_stats)
在上述代码块中,我们定义了一个函数 calculate_basic_stats 来计算基于会员状态的数据集中会员和非会员的数量统计。通过查看这些统计数据,我们可以初步了解不同用户群体在数量上的差异。
6.1.2 利用统计测试比较用户行为差异
为了更精确地比较会员和非会员之间的行为差异,我们可以运用统计测试,比如t检验、卡方检验等方法,来确定观察到的差异是否具有统计学意义。这些测试有助于识别在骑行行为上显著不同的方面,比如平均骑行时长、平均骑行速度等。
from scipy import stats
# 假设'Membership'列中,1表示会员,0表示非会员;'RideDuration'列表示骑行时长
member_rides =共享单车数据集[共享单车数据集['Membership'] == 1]['RideDuration']
non_member_rides =共享单车数据集[共享单车数据集['Membership'] == 0]['RideDuration']
# 进行t检验
t_statistic, p_value = stats.ttest_ind(member_rides, non_member_rides)
print(f"t统计量: {t_statistic}, p值: {p_value}")
执行上述代码后,我们可以得到t统计量和p值。如果p值小于设定的显著性水平(比如0.05),则表明会员和非会员的平均骑行时长存在显著差异。
6.2 行为差异对业务的影响分析
不同用户群体的行为差异对共享单车企业的运营和营销策略具有直接影响。通过对这些差异的深入分析,企业能够更有效地调整其服务和推广策略,以提高用户体验和企业收益。
6.2.1 会员与非会员行为对运营的影响
会员用户群体的行为特征通常更加稳定,对企业的收益贡献也更加可预测。而针对非会员用户,企业可能需要设计更具吸引力的一次性优惠或临时活动以增加他们的使用频率。了解这两类用户的行为特点,有助于企业做出更精准的运营决策。
6.2.2 基于行为差异的营销策略
基于不同用户群体的行为特征,共享单车企业可以设计差异化的营销策略。例如,对于经常短距离骑行的会员用户,可以推出基于骑行次数的套餐计划;而对于长距离骑行的非会员用户,则可以尝试推广短期的会员体验卡,鼓励他们尝试会员服务。通过个性化和精准化的服务,企业可以更好地满足用户需求,同时提高用户的忠诚度和企业的收益。
# 假设我们根据骑行时长将用户分为短途和长途骑行者
# 然后根据用户是否为会员,分析他们的骑行时长
# 以下代码示例使用逻辑回归模型来分析特征与行为的关系
from sklearn.linear_model import LogisticRegression
# 准备数据集
X =共享单车数据集[['RideDuration', 'Membership']]
y =共享单车数据集['LongDistanceRider'] # 假设这是表示长途骑行者的标签
# 创建逻辑回归模型并拟合数据
model = LogisticRegression()
model.fit(X, y)
# 打印模型参数
print(model.coef_)
在上述代码中,我们使用了逻辑回归模型来分析骑行时长和会员状态对长途骑行者的影响。模型的系数可以帮助我们理解不同特征对长途骑行倾向的影响程度。
通过对会员和非会员用户行为的深入分析,共享单车企业可以更细致地掌握不同用户群体的特征和需求,进而制定出更具针对性的运营策略和营销计划,从而提升用户满意度和企业盈利能力。
7. 骑行时长分布分析
7.1 骑行时长数据的统计分析
在共享单车数据分析中,理解骑行时长的分布对于优化车辆分布、预测需求量以及提高运营效率等方面都至关重要。
7.1.1 时长分布的特点
首先,通过数据可视化手段,我们可以快速了解骑行时长的分布特性。例如,下面是一个骑行时长分布的直方图,它可以帮助我们直观地看到数据集的分布情况:
import matplotlib.pyplot as plt
# 假设 df 是我们的数据集,'ride_length' 是表示骑行时长的列名
plt.hist(df['ride_length'], bins=20, edgecolor='black')
plt.xlabel('Ride Length (minutes)')
plt.ylabel('Frequency')
plt.title('Distribution of Ride Lengths')
plt.show()
通过直方图,我们能够观察到骑行时长是否呈现出正态分布或者其他偏斜的分布特性。对于共享单车数据,通常我们会发现骑行时长倾向于偏斜分布,其中大部分骑行的时长较短,极少数时长较长的骑行则会拖长尾部。
7.1.2 峰度和偏度分析
接下来,我们可以通过计算峰度(kurtosis)和偏度(skewness)来进一步量化分布的特征:
from scipy.stats import skew, kurtosis
# 计算偏度和峰度
skewness = skew(df['ride_length'])
kurt = kurtosis(df['ride_length'])
print(f"Skewness: {skewness:.2f}")
print(f"Kurtosis: {kurt:.2f}")
峰度反映了一个分布的尖峭程度,正值表示数据比正态分布有更尖锐的峰,负值则表示数据比正态分布有更平缓的峰。偏度告诉我们数据分布的不对称性,正值表示右侧(较长时长的骑行)的尾部比左侧(较短时长的骑行)更长,反之亦然。
7.2 骑行时长与用户行为的关系
了解骑行时长的统计特性后,我们接下来深入分析它和用户行为之间的关系。
7.2.1 长短时长骑行行为模式的对比
长短时长的骑行往往反映了用户的出行目的不同。例如,短时长骑行可能更多地与通勤或购物有关,而长时长骑行可能意味着用户是在进行休闲活动或长距离通勤。为了更好地理解这种行为模式,我们可以将骑行时长按照一定标准分为短时长组和长时长组,然后分析这两组之间的行为差异。
import pandas as pd
# 将骑行时长分为短时长和长时长两组
short_rides = df[df['ride_length'] <= 15] # 假设15分钟内为短时长骑行
long_rides = df[df['ride_length'] > 15] # 15分钟以上为长时长骑行
# 计算两组用户的平均骑行时长、平均速度等统计量进行对比
short_stats = short_rides[['ride_length', 'average_speed']].describe()
long_stats = long_rides[['ride_length', 'average_speed']].describe()
print("Short Rides Statistics:")
print(short_stats)
print("\nLong Rides Statistics:")
print(long_stats)
7.2.2 骑行时长对运营效率的影响
最后,我们需要分析骑行时长对运营效率的影响。长时长骑行可能导致车辆长时间占用,影响其他用户的使用,造成车辆分布不均。而短时长骑行频繁且集中,可能会对特定区域造成高需求。为了平衡这种情况,运营者可能需要调整车辆的调度策略。
# 假设我们有每个站点每小时的车辆使用数量
# 计算高峰时段的车辆使用情况
df['hour'] = pd.to_datetime(df['start_time']).dt.hour
peak_usage = df.groupby(['hour', 'ride_length']).size().unstack(fill_value=0)
# 计算每小时的平均骑行时长
average_ride_length_per_hour = df.groupby('hour')['ride_length'].mean()
# 绘制高峰时段车辆使用数量和平均骑行时长的关系图
import seaborn as sns
plt.figure(figsize=(10, 5))
plt.plot(average_ride_length_per_hour, marker='o')
sns.lineplot(data=peak_usage.T, dashes=False)
plt.xlabel('Hour of Day')
plt.ylabel('Number of Rides')
plt.title('Average Ride Length and Peak Usage by Hour')
plt.legend(title='Ride Length', labels=['Average Length', 'Short Rides', 'Long Rides'])
plt.grid(True)
plt.show()
通过上述分析,共享单车运营者可以更好地了解不同骑行时长对车辆使用模式的影响,并据此做出更有效的运营决策。
简介:本项目使用一个包含1000万条骑行记录的蒙特利尔市共享单车数据集,涉及时间、位置、会员状态等信息。通过Python语言和数据分析库,将执行清洗、描述统计、时间序列分析、空间分析、会员与非会员行为对比以及骑行时长分布等任务,以获取关于共享单车使用模式和用户行为的见解,为城市规划和交通管理提供数据支持。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)