任务说明
摩拜单车,英文名mobike,是北京摩拜科技有限公司研发的互联网短途出行解决方案,是无桩借还车模式的智能硬件。人们通过智能手机就能快速租用和归还一辆摩拜单车,用可负担的价格来完成一次几公里的市内骑行。
由于一公里的出行是一个高频的需求场景,所以mobike单车累计了大量的用户基本信息以及骑行的数据,通过这些数据,能够帮助企业更好识别自己的客群画像和他们的骑行偏好。
分析目标:
数据字典
plt.figure(figsize=(15,5))
sns.distplot(mobike['age'], bins=15, color='orangered')
plt.title("用户年龄分布", fontsize=15)
plt.show()
大部分用户集中在 25-35 年龄段
plt.figure(figsize=(15,5))
sns.countplot(y='gender', data=mobike)
plt.title("用户类型分布", fontsize=15)
plt.show()
男性用户较多,约占 78%
mobike['usertype'].value_counts()
Subscriber 5704
Customer 179
Name: usertype, dtype: int64
mobike['usertype'].value_counts(1)
Subscriber 0.969573
Customer 0.030427
Name: usertype, dtype: float64
plt.figure(figsize=(15,5))
sns.countplot(y='usertype', data=mobike)
plt.title("用户类型分布", fontsize=15)
plt.show()
大部分为订阅用户,占 96.5%
# 查看骑行时间年的分布
mobike['start_time'].dt.year.value_counts()
2018 5883
Name: start_time, dtype: int64
# 查看骑行时间月份的分布
mobike['start_time'].dt.month.value_counts()
10 3107
11 1601
12 1175
Name: start_time, dtype: int64
# 查看骑行时间按天分布
plt.figure(figsize=(15,5))
sns.countplot(mobike['start_time'].dt.day, color='orangered')
plt.title("骑行开始时间按天分布", fontsize=15)
plt.show()
在月末骑行的人略少于月初和月中的人
# 查看骑行时间按周内天分布
plt.figure(figsize=(15,5))
sns.countplot(mobike['start_time'].dt.dayofweek, color='orangered')
plt.title("骑行开始时间按周内天分布", fontsize=15)
plt.show()
周末骑行的人少于周中的
# 查看骑行开始时间按小时分布
plt.figure(figsize=(15,5))
sns.countplot(mobike['start_time'].dt.hour, color='orangered')
plt.title("骑行开始时间按小时分布", fontsize=15)
plt.show()
早晚高峰的骑车数量明显增多
plt.figure(figsize=(15,5))
sns.distplot(mobike['timeduration'], color='orangered')
plt.title("骑行时长分布 (分钟)", fontsize=15)
plt.show()
骑行时长在 5-15 分钟最多
plt.figure(figsize=(15,5))
sns.distplot(mobike['tripduration'], color='orangered')
plt.title("骑行距离分布", fontsize=15)
plt.show()
骑行距离在 200-800 米最多
plt.figure(figsize=(15,5))
sns.distplot(mb['speed'], color='orangered')
plt.title("平均骑行速度分布 (米/分钟)", fontsize=15)
plt.show()
平均骑行速度集中在 60米/分钟 左右
将类别变量使用 one-hot 编码方式进行编码
# 寻找最优 k
def KM_score(X, k: int) -> float:
"""返回轮廓系数 (Silhouette score)"""
model=KMeans(n_clusters=k, random_state=42)
model.fit(X)
X_cluster = model.fit_predict(X)
score = metrics.silhouette_score(X, X_cluster)
return score
# 计算轮廓系数
score_dict = {}
for i in range(2, 10):
score_dict[i] = KM_score(X, i)
# 绘制轮廓系数图像
plt.figure(figsize=(15,5))
plt.plot(score_dict.keys(), score_dict.values(), linestyle='--', marker='o')
plt.title("轮廓系数折线图", fontsize=15)
plt.show()
# 为了观察分群效果,我们选择分成7组
model = KMeans(n_clusters=7, random_state=42)
model.fit(X)
KMeans(n_clusters=7, random_state=42)
mobike_cluster['cluster'] = model.labels_
mobike_cluster['cluster'].value_counts()
0 1399
2 1167
6 1114
3 783
1 703
5 538
4 179
Name: cluster, dtype: int64
>> mobike_cluster.groupby(['cluster'])['timeduration'].describe()
>> mobike_cluster.groupby(['cluster'])['tripduration'].describe()
4,5 组骑行时间较长,骑行距离也远
>> pd.DataFrame(model.cluster_centers_, columns=mobike_cluster.columns[:8])
聚类分组分析
总结