美国共享单车数据分析
一、数据说明
本次分析的数据是美国旧金山地区共享单车的骑行信息,时间范围2018-01-01至2018-12-23,点击可进行下载csv文件。
数据约180万条,共14个特征。
骑行秒数 | 开始时间 | 结束时间 | 开始站点ID | 开始站点名称 | 开始站点纬度 | 开始站点经度 | 结束站点ID | 结束站点名称 | 结束站点纬度 | 结束站点经度 | 车辆ID | 用户类型 | 计划参与 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
duration_sec | start_time | end_time | start_station_id | start_station_name | start_station_latitude | start_station_longitude | end_station_id | end_station_name | end_station_latitude | end_station_longitude | bike_id | user_type | bike_share_for_all_trip |
本次主要使用Pandas、matplotlib、folium库进行分析与可视化
二、数据清洗
# 导入常用库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import folium # 地图可视化
from folium.plugins import HeatMap
%matplotlib inline
path = '/Users/valkyrja/Documents/dataanalysis/taobao/2018-baywheels-tripdata.csv'
data = pd.read_csv(path)
data.info(null_counts = True) #概览数据类型与空值的情况
- 共1863721行数据
- 14个特征
- 开始时间、结束时间数据类型需要调整为datetime
- 开始结束站点ID、bikeID视情况调整为字符串类型
- 开始结束站点的ID和名称列,每个特征存在约1万个缺失值
# 进一步观察缺失值情况(每个特征确实11771条数据)
data.isna().sum()
# 查看是否有重复数据(无重复数据,无须去重操作)
data.duplicated().sum()
每个特征约1万条确实值,进行删除操作,不影响整体数据。
1.空值删除
# 删除缺失值的行
data.dropna(subset = ['start_station_id', 'start_station_name', 'end_station_id', 'end_station_name'], inplace = True)
2.数据类型转化
# 开始结束时间数据类型调整为datetime类型
for i in ['start_time', 'end_time']:
data[i] = pd.to_datetime(data[i])
# 站点id、车辆id调整为字符串类型
for m in ['start_station_id', 'end_station_id', 'bike_id']:
data[m] = data[m].astype('int').astype('str')
3.统计值概览
# 对骑行时间进行统计值概览
round(data['duration_sec'].describe(), 2)
这里发现了问题,75%的骑行时间小于870秒(约15分钟),最大值为86366秒(约24个小时),最大时间有点反常。
4.异常数据
# 找数据观察一下
data[data['duration_sec'] > 86300]
- 根据数据发现,记录时间是没有问题的
- 但起止站点是一样的,经纬度也相同
- 推断:车辆故障或用户忘记关闭记录锁
# 查看99%骑行时间大小
num = int(data.shape[0] * 0.99)
data['duration_sec'].sort_values(ascending = True).iloc[:num].tail(10)
99%骑行时间是在5496秒(约1.5小时)以下,根据实际共享单车骑行时间判断,2小时以下为正常骑行的标准,对2小时以上的骑行数据判定为异常数据。
5.数据筛选
# 筛选出2小时及以下骑行时间的数据
data_2 = data[data['duration_sec'] <= 7200]
# 简单看一下骑行数据的分布
plt.hist(data_2['duration_sec'], bins = 50)
plt.show()
筛选数据后,约90%数据仍在2000秒(30分钟)以内。
6.新增小时、周、月纬度
data_2['hour'] = data_2['start_time'].dt.hour
data_2['week'] = data_2['start_time'].dt.dayofweek
data_2['week'] = data_2['start_time'].dt.month
# 顺便重命名共享计划的列名为 'bike_plan',原名太长了
data.rename(columns = {
'bike_share_for_all_trip':'bike_plan'}, inplace = True)
三、探索性分析
1.数据概览
# 共计1838703行数据
data_2.shape
# 共计4852辆共享单车
data_2['bike_id'].nunique()
# 站点共计331个
data_2['start_station_id'].nunique()
data_2['end_station_id'].nunique()
# 订阅会员发生1572041次的骑行记录,普通用户发生266662次骑行记录
data_2['user_type'].value_counts()
订阅会员数量约占85%,普通用户约占15%
# bike_plan计划用户发生160898次骑行记录。
data_2['bike_plan'].value_counts()
# 骑行时间统计值观察
round(data_2['duration_sec'].describe(), 2)