# New York City Taxi Trip Duration纽约出租车大数据探索
# 该项目来源于Kaggle,旨在建模来预测纽约出租车在行程中的总行驶时间。
# 在建模预测的过程中,我们可以顺便探索纽约市民打车出行习惯及其他有效信息。
# kaggle项目链接 https://www.kaggle.com/c/nyc-taxi-trip-duration/overview# 本文内容结构说明:# 一、先参考简书帖子《纽约出租车大数据探索》完成一部分探索,帖子没有源代码,所以我会根据帖子思路,自行写出代码。
# 帖子网址 https://www.jianshu.com/p/1da53849a314 # 二、按照帖子文末提出的可以进一步拓展的探索方向,自行深入探索。# 三、kaggle比赛目标之预测行程持续时间,另外再开帖子叙述。
# 一、先参照简书帖子# 帖子的结构为五部分:
# 1、提出问题—2、理解数据——3、数据清理——4、数据分析—5、得出结论
# 1、提出问题(根据已有数据分析)# (1)何时为打车需求高发期?
# (2)居民夜生活活跃情况?
# (3)城市一天的什么时候最为拥堵?
# (4)什么时间容易接到长途单?
# 2、理解数据(表单说明)# id - 每次行程的唯一ID
# vendor_id - 行程提供者的ID
# pickup_datetime - 上车的日期和时间
# dropoff_datetime - 停表的日期和时间
# passenger_count - 车辆中的乘客数量(驾驶员输入值)
# pickup_longitude - 上车的经度
# pickup_latitude - 上车的纬度
# dropoff_longitude - 下车经度
# dropoff_latitude - 下车的纬度
# store_and_fwd_flag - 行程记录是否为存储转发(或是直接发送)-- Y =存储和转发 N =没有存储
# trip_duration - 行程持续时间(秒)
# 3、数据清理# Basic packages
import numpy as np
import pandas as pd# Viz
import matplotlib.pyplot as plt
import seaborn as sns# settings
import warnings
warnings.filterwarnings("ignore")
# 导入数据
train=pd.read_csv(r"D:\2018_BigData\Python\Kaggle_learning\New York City Taxi Trip Duration\train.csv")
train.head()
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.964630
|
40.765602
|
N
|
455
|
1
|
id2377394
|
1
|
2016-06-12 00:43:35
|
2016-06-12 00:54:38
|
1
|
-73.980415
|
40.738564
|
-73.999481
|
40.731152
|
N
|
663
|
2
|
id3858529
|
2
|
2016-01-19 11:35:24
|
2016-01-19 12:10:48
|
1
|
-73.979027
|
40.763939
|
-74.005333
|
40.710087
|
N
|
2124
|
3
|
id3504673
|
2
|
2016-04-06 19:32:31
|
2016-04-06 19:39:40
|
1
|
-74.010040
|
40.719971
|
-74.012268
|
40.706718
|
N
|
429
|
4
|
id2181028
|
2
|
2016-03-26 13:30:55
|
2016-03-26 13:38:10
|
1
|
-73.973053
|
40.793209
|
-73.972923
|
40.782520
|
N
|
435
|
train.info()# 从下表看到,数据比较完整。看Kaggle官网也说了,因为是playground项目,所以已经把数据cleaned了。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1458644 entries, 0 to 1458643
Data columns (total 11 columns):
id 1458644 non-null object
vendor_id 1458644 non-null int64
pickup_datetime 1458644 non-null object
dropoff_datetime 1458644 non-null object
passenger_count 1458644 non-null int64
pickup_longitude 1458644 non-null float64
pickup_latitude 1458644 non-null float64
dropoff_longitude 1458644 non-null float64
dropoff_latitude 1458644 non-null float64
store_and_fwd_flag 1458644 non-null object
trip_duration 1458644 non-null int64
dtypes: float64(4), int64(3), object(4)
memory usage: 122.4+ MB
train.describe()# 看下表,全部是科学计数法,影响观察。
|
vendor_id
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
trip_duration
|
count
|
1.458644e+06
|
1.458644e+06
|
1.458644e+06
|
1.458644e+06
|
1.458644e+06
|
1.458644e+06
|
1.458644e+06
|
mean
|
1.534950e+00
|
1.664530e+00
|
-7.397349e+01
|
4.075092e+01
|
-7.397342e+01
|
4.075180e+01
|
9.594923e+02
|
std
|
4.987772e-01
|
1.314242e+00
|
7.090186e-02
|
3.288119e-02
|
7.064327e-02
|
3.589056e-02
|
5.237432e+03
|
min
|
1.000000e+00
|
0.000000e+00
|
-1.219333e+02
|
3.435970e+01
|
-1.219333e+02
|
3.218114e+01
|
1.000000e+00
|
25%
|
1.000000e+00
|
1.000000e+00
|
-7.399187e+01
|
4.073735e+01
|
-7.399133e+01
|
4.073588e+01
|
3.970000e+02
|
50%
|
2.000000e+00
|
1.000000e+00
|
-7.398174e+01
|
4.075410e+01
|
-7.397975e+01
|
4.075452e+01
|
6.620000e+02
|
75%
|
2.000000e+00
|
2.000000e+00
|
-7.396733e+01
|
4.076836e+01
|
-7.396301e+01
|
4.076981e+01
|
1.075000e+03
|
max
|
2.000000e+00
|
9.000000e+00
|
-6.133553e+01
|
5.188108e+01
|
-6.133553e+01
|
4.392103e+01
|
3.526282e+06
|
# 尝试不以科学计数法显示。# np.set_printoptions(suppress=True)
pd.set_option('display.max_columns', None)
train[["passenger_count","trip_duration"]].describe()# 暂不成功。因为整体数据比较完整,接下来直接可视化分析。
|
passenger_count
|
trip_duration
|
count
|
1.458644e+06
|
1.458644e+06
|
mean
|
1.664530e+00
|
9.594923e+02
|
std
|
1.314242e+00
|
5.237432e+03
|
min
|
0.000000e+00
|
1.000000e+00
|
25%
|
1.000000e+00
|
3.970000e+02
|
50%
|
1.000000e+00
|
6.620000e+02
|
75%
|
2.000000e+00
|
1.075000e+03
|
max
|
9.000000e+00
|
3.526282e+06
|
# 4、 数据分析与可视化# (1)何时为打车需求高发期?
# (2)居民夜生活活跃情况?
# (3)城市一天的什么时候最为拥堵?
# (4)什么时间容易接到长途单?
# 分析一:何时为打车需求高发期?import datetime
from datetime import datetime# dt = train["pickup_datetime"]
# dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
# train["pickup_month"] = dt.monthtrain.pickup_datetime = train.pickup_datetime.apply(lambda x:datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
train["pickup_yearmonth"] = train["pickup_datetime"].map(lambda x: 100*x.year + x.month)
train.head(1)# 另外,年份月份提取也可以用astpye函数,例如[M]转换成月份:参考 df["month"]=df.DealTime.values.astype("datetime64[M]")
# 还可以提取星期几的周信息。
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.96463
|
40.765602
|
N
|
455
|
201603
|
train["pickup_yearmonth"].value_counts()# 只有六个月的时间数据。
201603 256189
201604 251645
201605 248487
201602 238300
201606 234316
201601 229707
Name: pickup_yearmonth, dtype: int64
# 新增月份
# train.drop(["pickup_yearmonth"],axis=1,inplace=True)
train["pickup_month"] = train["pickup_datetime"].map(lambda x: x.month)# train.dropoff_datetime = train.dropoff_datetime.apply(lambda x:datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
# train["dropoff_month"] = train["dropoff_datetime"].map(lambda x: x.month)train.head(1)# 其实dropoff_month和pickup_month基本一致,如果考虑到效率和内存,可以不用提取dropoff_month。
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
pickup_month
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.96463
|
40.765602
|
N
|
455
|
201603
|
3
|
# 新增周标识# train["week"]=train.pickup_datetime.weekday()
# AttributeError: 'Series' object has no attribute 'datetime'train["pickup_week"]=train.pickup_datetime.apply(lambda x: x.weekday())
train.head(2)
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
pickup_month
|
pickup_week
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.964630
|
40.765602
|
N
|
455
|
201603
|
3
|
0
|
1
|
id2377394
|
1
|
2016-06-12 00:43:35
|
2016-06-12 00:54:38
|
1
|
-73.980415
|
40.738564
|
-73.999481
|
40.731152
|
N
|
663
|
201606
|
6
|
6
|
train["pickup_day"]=train.pickup_datetime.apply(lambda x: x.day)
train.head(2)
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
pickup_month
|
pickup_week
|
pickup_day
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.964630
|
40.765602
|
N
|
455
|
201603
|
3
|
0
|
14
|
1
|
id2377394
|
1
|
2016-06-12 00:43:35
|
2016-06-12 00:54:38
|
1
|
-73.980415
|
40.738564
|
-73.999481
|
40.731152
|
N
|
663
|
201606
|
6
|
6
|
12
|
# 新增日标识
train["pickup_date"]=train.pickup_datetime.values.astype("datetime64[D]")
train.head(2)
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
pickup_month
|
pickup_week
|
pickup_day
|
pickup_date
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.964630
|
40.765602
|
N
|
455
|
201603
|
3
|
0
|
14
|
2016-03-14
|
1
|
id2377394
|
1
|
2016-06-12 00:43:35
|
2016-06-12 00:54:38
|
1
|
-73.980415
|
40.738564
|
-73.999481
|
40.731152
|
N
|
663
|
201606
|
6
|
6
|
12
|
2016-06-12
|
month_trip=train.groupby(['pickup_month'])["trip_duration"].agg(["sum","mean","count"])
month_trip=month_trip.reset_index()
month_trip.head(2)
|
pickup_month
|
sum
|
mean
|
count
|
0
|
1
|
211875608
|
922.373319
|
229707
|
1
|
2
|
219433897
|
920.830453
|
238300
|
# 为了直观一些,改列名
month_trip.rename(columns={'sum':'month_sum_trip_dur','mean':'month_avg_trip_dur','count':"month_trip_times"}, inplace = True)
month_trip.head(2)
|
pickup_month
|
month_sum_trip_dur
|
month_avg_trip_dur
|
month_trip_times
|
0
|
1
|
211875608
|
922.373319
|
229707
|
1
|
2
|
219433897
|
920.830453
|
238300
|
date_trip=train.groupby(['pickup_date'])["trip_duration"].agg(["sum","mean","count"])
date_trip=date_trip.reset_index()
date_trip.rename(columns={'sum':'date_sum_trip_duration','mean':'date_avg_trip_dur','count':"date_trip_times"}, inplace = True)
date_trip.head()
|
pickup_date
|
date_sum_trip_duration
|
date_avg_trip_dur
|
date_trip_times
|
0
|
2016-01-01
|
6593910
|
920.679978
|
7162
|
1
|
2016-01-02
|
5470632
|
840.084767
|
6512
|
2
|
2016-01-03
|
5874410
|
924.667086
|
6353
|
3
|
2016-01-04
|
5723773
|
851.118662
|
6725
|
4
|
2016-01-05
|
10484304
|
1455.344808
|
7204
|
day_trip=train.groupby(['pickup_day'])["trip_duration"].agg(["sum","mean","count"])
day_trip=day_trip.reset_index()
day_trip.rename(columns={'sum':'day_sum_trip_duration','mean':'day_avg_trip_dur','count':"day_trip_times"}, inplace = True)
day_trip.head()
|
pickup_day
|
day_sum_trip_duration
|
day_avg_trip_dur
|
day_trip_times
|
0
|
1
|
44656812
|
958.053978
|
46612
|
1
|
2
|
44354937
|
928.860299
|
47752
|
2
|
3
|
46806173
|
976.247221
|
47945
|
3
|
4
|
47050568
|
947.549451
|
49655
|
4
|
5
|
51193213
|
1020.272899
|
50176
|
# plot
plt.figure(figsize=(16,18))plt.subplot(321)
ax1= plt.plot(month_trip.pickup_month, month_trip.month_trip_times, color="green", alpha=0.8, label='trip times',marker='*')
plt.title("Monthly Trip Times")
plt.ylabel('# of trip times', fontsize=12)
plt.xlabel('Pickup_Month', fontsize=12)plt.subplot(322)
ax2= plt.plot(month_trip.pickup_month, month_trip.month_avg_trip_dur, color="green",alpha=0.8,marker='o')
plt.title("Monthly Trip Duration")
plt.ylabel('Avg of trip druration', fontsize=12)
plt.xlabel('Pickup_Month', fontsize=12)plt.subplot(312)
ax2= plt.plot(date_trip.pickup_date, date_trip.date_trip_times, color="red", alpha=0.8,marker='o')
plt.title("Date Trip Time")
plt.ylabel('Date trip time', fontsize=12)
plt.xlabel('Pickup_Date', fontsize=12)plt.subplot(313)
ax2= plt.plot(day_trip.pickup_day, day_trip.day_trip_times, color="red", alpha=0.8,marker='*')
plt.title("Day Trip Time")
plt.ylabel('Day trip time', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)plt.show()# 从趋势来说,2016年1~6月整体打车时长一直呈增长状态,可能用户逐渐习惯了更远距离也打车。# 其中,3月-5月订单数量属于六个月中最高的三个月,但是整体下降趋势。# 1月下旬和5月底有异常点,这两天打车人数特别少,可能是当天发生了什么重大事故,或者是重大节日不出行。# 从日折线图来看,忽略23号和31号两个异常点,整体订单数量随日期变化呈现规律波动,看似周期为7天(一个星期),据此推测订单数量可能与星期几有关。
![](/assets/blank.gif)
# 1、分析异常值# 从图"Date Trip Time"可以定义异常值临界点为6000,将低于6000的异常值筛选出来。date_trip[date_trip.date_trip_times<6000]# 找出异常的日期是1月23日,1月24日,5月30日。
# 分析其原因。根据当日美国新闻:# (1)美遭暴风雪袭击 纽约时报广场飞雪飘零_网易新闻
# 2016-1-24 · 当地时间2016年1月23日,美国纽约,美国遭遇暴雪天气,暴雪中的时报广场。# (2)阵亡将士纪念日 (5月的最后一个星期一)
# 中新网5月30日电 据美媒报道,美国迎来“国殇日”长周末,标志着夏季的正式开始。
|
pickup_date
|
date_sum_trip_duration
|
date_avg_trip_dur
|
date_trip_times
|
22
|
2016-01-23
|
1691754
|
1026.549757
|
1648
|
23
|
2016-01-24
|
3052107
|
902.189477
|
3383
|
150
|
2016-05-30
|
4568228
|
820.148654
|
5570
|
# 2、分析订单数量可能和星期几有关
x = train.groupby(['pickup_day'])["passenger_count"].agg(["mean"])
x = x.reset_index()
day_trip["avg_passenger_count"] = x["mean"]
day_trip.head()
|
pickup_day
|
day_sum_trip_duration
|
day_avg_trip_dur
|
day_trip_times
|
avg_passenger_count
|
0
|
1
|
44656812
|
958.053978
|
46612
|
1.682871
|
1
|
2
|
44354937
|
928.860299
|
47752
|
1.666611
|
2
|
3
|
46806173
|
976.247221
|
47945
|
1.655355
|
3
|
4
|
47050568
|
947.549451
|
49655
|
1.643279
|
4
|
5
|
51193213
|
1020.272899
|
50176
|
1.670301
|
plt.figure(figsize=(12,12))plt.subplot(211)
ax2= plt.plot(day_trip.pickup_day, day_trip.avg_passenger_count, color="grey", alpha=0.8,marker='o')
plt.title("Day Trip Passenger")
plt.ylabel('Day trip passenger', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)plt.subplot(212)
ax2= plt.plot(day_trip.pickup_day, day_trip.day_trip_times, color="grey", alpha=0.9,marker='*')
plt.title("Day Trip Time")
plt.ylabel('Day trip time', fontsize=12)
plt.xlabel('Pickup_Day', fontsize=12)plt.show()# 两张图展示了在2016年1月1日至2016年6月30日这半年内,六个月1~31日的每日订单总量、每日平均乘车人数随日期的波动。# 两个图(每日订单数量/乘车次数与日平均乘车人数)的趋势惊人地一致。这说明在周期的某一阶段,不仅订单数量增多,而且人们偏向于结伴出行。
![](/assets/blank.gif)
train["pickup_hour"]=train.pickup_datetime.apply(lambda x: x.hour)
train.head()
|
id
|
vendor_id
|
pickup_datetime
|
dropoff_datetime
|
passenger_count
|
pickup_longitude
|
pickup_latitude
|
dropoff_longitude
|
dropoff_latitude
|
store_and_fwd_flag
|
trip_duration
|
pickup_yearmonth
|
pickup_month
|
pickup_week
|
pickup_day
|
pickup_date
|
pickup_hour
|
0
|
id2875421
|
2
|
2016-03-14 17:24:55
|
2016-03-14 17:32:30
|
1
|
-73.982155
|
40.767937
|
-73.964630
|
40.765602
|
N
|
455
|
201603
|
3
|
0
|
14
|
2016-03-14
|
17
|
1
|
id2377394
|
1
|
2016-06-12 00:43:35
|
2016-06-12 00:54:38
|
1
|
-73.980415
|
40.738564
|
-73.999481
|
40.731152
|
N
|
663
|
201606
|
6
|
6
|
12
|
2016-06-12
|
0
|
2
|
id3858529
|
2
|
2016-01-19 11:35:24
|
2016-01-19 12:10:48
|
1
|
-73.979027
|
40.763939
|
-74.005333
|
40.710087
|
N
|
2124
|
201601
|
1
|
1
|
19
|
2016-01-19
|
11
|
3
|
id3504673
|
2
|
2016-04-06 19:32:31
|
2016-04-06 19:39:40
|
1
|
-74.010040
|
40.719971
|
-74.012268
|
40.706718
|
N
|
429
|
201604
|
4
|
2
|
6
|
2016-04-06
|
19
|
4
|
id2181028
|
2
|
2016-03-26 13:30:55
|
2016-03-26 13:38:10
|
1
|
-73.973053
|
40.793209
|
-73.972923
|
40.782520
|
N
|
435
|
201603
|
3
|
5
|
26
|
2016-03-26
|
13
|
# pc=train["passenger_count"]
# phour=train["pickup_hour"]
# pday=train["pickup_day"]
# pweek=train["pickup_week"]
# pmonth=train["pickup_month"]
# pdate=train["pickup_date"]
# tripdur=train["trip_duration"]# sns.swarmplot(x="pweek", y="tripdur", hue="pmonth", data=train)# 如上先赋值再代入函数,则swarmplot函数运行报错。下面尝试直接代入函数。# sns.swarmplot(x=train["pickup_week"], y=train["trip_duration"], hue=train["pickup_month"], data=train)
# sns.swarmplot(x="pickup_week", y="trip_duration", hue="pickup_month", data=train)
# 这两句语句都运行过久,30分钟未有反应,暂时放弃该语句,再寻找其他较优语句。
week_trip = train.groupby(["pickup_month",'pickup_week','pickup_day','pickup_hour'])["trip_duration"].agg(["mean","count"])
week_trip = week_trip.reset_index()
week_trip.head(2)
|
pickup_month
|
pickup_week
|
pickup_day
|
pickup_hour
|
mean
|
count
|
0
|
1
|
0
|
4
|
0
|
656.771186
|
118
|
1
|
1
|
0
|
4
|
1
|
703.086957
|
92
|
week_trip.rename(columns={'mean':'week_avg_trip_dur','count':"week_trip_times"}, inplace = True)
print(week_trip.shape)
week_trip.head(2)# 4359行数据,数据量不大,这次可以用sns.swarmplot()函数了。
(4359, 6)
|
pickup_month
|
pickup_week
|
pickup_day
|
pickup_hour
|
week_avg_trip_dur
|
week_trip_times
|
0
|
1
|
0
|
4
|
0
|
656.771186
|
118
|
1
|
1
|
0
|
4
|
1
|
703.086957
|
92
|
# 在week_trip表中增加乘车人数x1 = train.groupby(["pickup_month",'pickup_week','pickup_day','pickup_hour'])["passenger_count"].agg(["mean"])
x1 = x1.reset_index()
week_trip["avg_passenger_count"] = x1["mean"]
week_trip.head()
|
pickup_month
|
pickup_week
|
pickup_day
|
pickup_hour
|
week_avg_trip_dur
|
week_trip_times
|
avg_passenger_count
|
0
|
1
|
0
|
4
|
0
|
656.771186
|
118
|
1.593220
|
1
|
1
|
0
|
4
|
1
|
703.086957
|
92
|
1.673913
|
2
|
1
|
0
|
4
|
2
|
692.085106
|
47
|
1.574468
|
3
|
1
|
0
|
4
|
3
|
738.500000
|
32
|
1.250000
|
4
|
1
|
0
|
4
|
4
|
644.000000
|
50
|
1.700000
|
# 周一至周日打车次数/订单数量plt.figure(figsize=(10,8))
sns.swarmplot(x="pickup_week", y="week_trip_times", hue="pickup_month", data=week_trip)
plt.show()# 明显周日周一打车次数最低,周五至周六打车次数最高。可能周四至周六市民出行意愿更高。
# 另外发现,周日打车次数/订单数量在100-300区间内明显比周一至周六多,这里可能蕴含一些信息,待挖掘。
![](/assets/blank.gif)
# 周一至周日乘车人数plt.figure(figsize=(10,5))
sns.boxplot(x="pickup_week", y="avg_passenger_count", hue="pickup_month", data=week_trip)
plt.show()# 下图可见,周六周日拼车人数较多。
![](/assets/blank.gif)
# 当日内0点至24点乘车次数/订单数量plt.figure(figsize=(16,6))
sns.swarmplot(x="pickup_hour", y="week_trip_times", data=week_trip)
plt.show()# 从图中可以看出:# (1)全天候分析:
# 凌晨一点开始至凌晨五点,订单数量急剧下降,符合人群休息规律。从早6点开始,订单量由谷底回升,早7点至早9点有一个早高峰。
# 在早8点到下午5点之间有轻微波动不明显。而早10点和下午4点均有一个轻微的走低点。# 原因推测:
# 1、市民上班的出行需求被公共交通、私家车等分担,不会偏好于出租车出行;
# 2、假设通勤时间1小时,则基本可确定八点至十点是上班时间小集中的时间段。(此结论与原贴不一致,甚至有轻微相反。)
# 3、早八点和下午四点这两个时间点,人群在公司开会尚未外出(早)或已在出差公司开会还未散会(下午四点)。# (2)晚高峰表现显著:
# 从晚6点开始订单量有大规模增长,约晚7点进入打车最高峰,且在23点之前的平均打车量均维持较高水平,高于白天时段。# 原因推测:
# 1、相比于白天,市民在晚上外出活动时更偏向于出租车出行。有可能逐渐下班。
# 2、也猜测晚间时间家庭出行或约伴出行,下面通过乘车人数认证后发现该假设并不成立。# (3)下午时段,四点左右出现订单量回落。
# 原因推测:
# 1、司机交班;2、道路拥堵;3、出差人群在出差公司开会还未散会下班。
![](/assets/blank.gif)
# 当日内0点至24点乘车人数plt.figure(figsize=(16,6))
sns.stripplot(x="pickup_hour", y="avg_passenger_count", data=week_trip)
plt.show()# 前面猜测晚间时间家庭出行或约伴出行,这里乘车人数在晚间并无明显变化,故前面猜测不成立。
# 反而发现凌晨2点至5点订单乘车人数较为分散,既有较多人(约伴),也有较少人(单人)的情况。
# 早5点-8点之间,每个订单乘车人数全日最低(boxplot比较清晰,stripplot没那么清晰),恰好又是上班时间,预计是单人上班打车情况较多。
![](/assets/blank.gif)
# 当日内0点至24点打车行程时间分布plt.figure(figsize=(16,6))
y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()# 一开始发现三个异常值干扰观察,尝试增加boxplot函数中参数y的重新赋值来忽略异常值(week_avg_trip_dur>8000)。——下图为已修正三个异常值。# 白天早9点至下午5点,行车时间较长,据此可以推测白天这个时间段道路较为拥塞。# 凌晨2点至5点,基本可以排除拥塞影响,行程时间长短可近似等同于距离长短。且分布在箱盒之外的长行车时间较多,据此推测:
# 凌晨2点至5点这个时间段接到长距离行程单的机会比其他时间段多很多。
![](/assets/blank.gif)
# 分析二:居民夜生活活跃情况?# 订单数量在晚8点至凌晨1点均维持较高水平,从凌晨1点开始,订单量断崖式下跌,这一下跌持续到约早5点,早5点是一天内订单量最低的时刻。
# 说明纽约市民夜生活活跃情况:
# (1)第一种可能:下午/晚上下班后约伴交友灯红酒绿夜夜笙歌,至凌晨1点方歇。
# (2)当然,也有第二种可能是:晚晚加班。白天会议下午法定下班时间后,才是晚间工作的开始,然后陆陆续续持续到凌晨十二点。
# 从国情看,纽约的第一种可能性高一些;而第二种则在中国一线城市发生的概率比率高一些。
# 分析三: 城市的一天什么时候最为拥堵?# 第一个思路(如下图):
# 从前面分析第一部分的“当日内0点至24点打车行程时间分布”初步推测:
# 白天早9点至下午5点,行车时间较长,据此可以推测白天这个时间段道路较为拥塞。# 第二个思路(待挖掘):
# 先通过上下车地点经纬度计算行程距离,再用行程距离/行程时间得出行车均速。行程均速可体现道路畅通拥堵程度。plt.figure(figsize=(16,6))
# y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()
![](/assets/blank.gif)
# 计算行程距离from math import sin,radians,cos,asin,sqrtdef haversine(lon1, lat1, lon2, lat2):lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) #radians 角度转弧度dlon = lon2 - lon1dlat = lat2 - lat1a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2c = 2 * asin(sqrt(a)) # 反正弦r = 6371return c * r# EARTH_REDIUS = 6378.137# def rad(d):
# return d * pi / 180.0# def getDistance(lat1, lng1, lat2, lng2):
# radLat1 = rad(lat1)
# radLat2 = rad(lat2)
# a = radLat1 - radLat2
# b = rad(lng1) - rad(lng2)
# s = 2 * math.asin(math.sqrt(math.pow(math.sin(a/2), 2) + math.cos(radLat1) * math.cos(radLat2) * math.pow(math.sin(b/2), 2)))
# s = s * EARTH_REDIUS
# return s
# train["distance"] = train['pickup_longitude', 'pickup_latitude','dropoff_longitude', 'dropoff_latitude'].apply(lambda x: haversine(x))
# 整列计算行程距离的方法,暂时搁置。(未完待续)
# 分析四:什么时间容易接到长途单?# 接单时间和订单行程时间/路程距离是否有关系呢?接下来进入分析。
# 前面已经绘出一日内0点至24点的平均行程时间,我们这里重新引用:plt.figure(figsize=(16,6))
y=week_trip["week_avg_trip_dur"][week_trip["week_avg_trip_dur"]<=8000]
daytripdur=sns.boxplot(x="pickup_hour", y=y, data=week_trip)
plt.show()# 凌晨2点至5点,基本可以排除拥塞影响,行程时间长短可近似等同于距离长短。且分布在箱盒之外的长行车时间较多,据此推测:
# 凌晨2点至5点这个时间段接到长距离行程单的机会比其他时间段多很多。
![](/assets/blank.gif)
# 总结# 分析到此告一段落。当然,虽然数据量不多,但是还可以挖掘更细致的城市出行行为等信息。# 例如,
# 可以分析哪些时段的哪些区域更容易发生订单,人群一般从哪些地方去往哪些地方——这对出租调度来说是个有效数据。
# 从暴雪带来的异常值可以推测,天气与订单量是有密切关系的,根据日期对应天气数据,可以进一步分析天气与订单量的影响。
# 结合位置数据,还可以分析哪些区域受天气的影响较大,等等。
【Python】New York City Taxi Trip Duration纽约出租车大数据探索(技术实现过程)相关推荐
- New York City Taxi Trip Duration纽约出租车大数据探索(报告版
一.项目说明 该项目来源于Kaggle,旨在建模来预测纽约出租车在行程中的总行驶时间. 在建模预测的过程中,我们可以顺便探索纽约市民打车出行习惯及其他有效信息. 附kaggle项目链接 https:/ ...
- 纽约出租车大数据探索
本文旨在探索纽约城市市民的打车出行习惯,通过对145万余条数据的定量分析,针对提出的问题相应地得出了些许结论.并在文末分析了日后可以进一步拓展的探索方向. 数据来自于kaggle,选用train.cs ...
- Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介、下载、使用方法之详细攻略
Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介.下载.使用方法之详细攻略 目录 New York City Taxi Fare P ...
- kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration
kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration 1. 项目简介 1.1 数据说明 1.2 相关数据集 2. 数据读取 2.1 读取数据集 2.2 读取节假日数据 2. ...
- 转:大数据处理与开发课程设计——纽约出租车大数据分析
大数据处理与开发课程设计--纽约出租车大数据分析_LHR13的博客-CSDN博客_出租车大数据分析 一.设计目的 综合应用所学的Hadoop/Spark/Storm/Mongdb等技术,设 ...
- Flink入门训练--以New York City Taxi为例
最近在学Flink,准备用Flink搭建一个实时的推荐系统.找到一个好的网站(也算作是flink创始者的官方网站),上面有关于Flink的上手教程,用来练练手,熟悉熟悉,下文仅仅是我的笔记. 1. 数 ...
- Python+大数据-Spark技术栈(二)SparkBaseCore
Python+大数据-Spark技术栈(二)SparkBase&Core 学习目标 掌握SparkOnYarn搭建 掌握RDD的基础创建及相关算子操作 了解PySpark的架构及角色 环境搭建 ...
- 计算机毕业设计之Python+Spark汽车推荐系统 汽车可视化 汽车数据分析 汽车大数据 汽车推荐app 汽车小程序 大数据毕业设计 汽车爬虫
功能 最近移动端的沙箱支付不太稳定,经常报订单不存在,可以不管,直接多点几次,仍然可以支付的. Vue spark 懂车帝汽车大数据大屏 技术 基于spark java API 实现分析功能 基础情况 ...
- python本科生就业_准备报学习机构学习大数据、Java或者python,是计算机专业的本科生,请问选择哪种就业发展比较好?...
谢邀.对比java和python后者还算是小语种.不知道楼主的具体情况如何.根据个人情况,建议先学java,毕竟你目前的需求是尽快找到更合适的技术工作,java择业面相对较宽,虽然也难学,但学习资源丰 ...
最新文章
- 学 Python 必看书单汇总
- smack连接openfire
- keras构建前馈神经网络(feedforward neural network)进行分类模型构建并加入L2正则化
- Windows 修改hosts文件以及权限问题
- Java高并发编程:总线锁定和缓存一致性的问题
- 设置eclipse启动时使用的jdk
- 生成验证码的流程分析.
- MSChart中转义符
- 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵
- 夜间模式html,夜间模式.html
- 威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!
- Mysql慢查询操作梳理
- 【资源下载】《Pytorch模型训练实现教程》(附下载链接)
- JAVA——JVM参数设置规则以及参数含义
- 路由器防御Dos***方法
- ibm服务器如何安装linux,IBM服务器安装步骤
- 计算机老是重启进不了桌面,电脑无限重启进不桌面
- windows11 安全中心点击进去内容空白解决方法
- XML格式文件转化为实体类Bean
- 职场人需要的2大礼物
热门文章
- 计算机的英语谚语,英语谚语Proverbs2.doc
- 一个“周公解梦”小程序的实现,前端和后台源码分析-附完整项目
- 如何用PS做出血轮眼
- SharePoint备份文件
- 【普通人题解】LeetCode 纸牌游戏
- Linux环境搭建----VMware安装虚拟机
- python爬虫:猿人学7ttf字体
- MySQL安装配置教程(图文+视频【超详细】)
- Java何为范式_冒号课堂§3.1:泛型范式
- SpringCloud(下)