寫在前面:
該報告為優(yōu)達學城數(shù)據(jù)分析進階納米學位的項目三伤疙,報告使用的模板為項目提供,其中有一些引導性的文字辆影,原本是英文模板徒像,本文中翻譯為了中文,方便不了解 EDA(探索性數(shù)據(jù)分析)的同學從中學習到探索的步驟和思路蛙讥。
EDA 探索報告锯蛀,并不是最終可以發(fā)布給觀眾的數(shù)據(jù)分析報告,僅供學習參考次慢。
注意旁涤,優(yōu)達學城有誠信代碼規(guī)則,如果抄襲有可能會被移除納米學位學習資格迫像,如果你也要完成本項目劈愚,請謹慎參考
初步探索
該數(shù)據(jù)集包含有關(guān)在舊金山灣區(qū)的自行車共享系統(tǒng)中的單次騎行信息。下載地址為:https://s3.amazonaws.com/baywheels-data/index.html 闻妓。本次分析只下載了 2018 年 1 - 12 月的數(shù)據(jù)菌羽。每條信息都是匿名的,其中包括:
- 騎行時長
- 開始時間
- 結(jié)束時間
- 開始站點 ID
- 開始站點名稱
- 開始站點緯度
- 開始站點經(jīng)度
- 結(jié)束站點 ID
- 結(jié)束站點名稱
- 結(jié)束站點緯度
- 結(jié)束站點經(jīng)度
- 車輛 ID
- 用戶類型:
- 會員:"Subscriber" 或者 "Member"
- 散客:"Customer" 或者 "Casual"
- 是否參與 Bike Share for All 計劃
# import all packages and set plots to be embedded inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import requests, zipfile, io
from parse_data import unzip_csv, append_csv # 自定義的腳本文件由缆,用于處理 zip 數(shù)據(jù)集文件
pd.set_option('max_colwidth',200)
%matplotlib inline
2018 年數(shù)據(jù)集有多個注祖,每個月一個 csv 文件,所以這里先把 2018 年的數(shù)據(jù)進行合并均唉,創(chuàng)建一個新的
2018-fordgobike-tripdata.csv
數(shù)據(jù)集是晨。
因為數(shù)據(jù)集太大惶洲,下載下來的是 zip 文件犁嗅,初始需要運行以下代碼獲取完整數(shù)據(jù):
# 解壓 zip 文件為 csv 文件,并且將多個文件合并為一個
# 初次運行需要耐心等待一段時間
if '2018-fordgobike-tripdata.csv' not in os.listdir(): # 判斷當前工作目錄是否存在目標數(shù)據(jù)集
# 下載鏈接列表
urls = []
for i in range(1,13):
date = str(201800+i)
url = ('https://s3.amazonaws.com/baywheels-data/' +
date + '-fordgobike-tripdata.csv.zip')
urls.append(url)
csv_list = unzip_csv(urls) # 下載并解壓所有 zip 文件
df = append_csv(csv_list) # 將所有 csv 文件讀取并合并到一個數(shù)據(jù)集
df.to_csv('2018-fordgobike-tripdata.csv',index=False) # 保存為一個 2018 年的數(shù)據(jù)集
else:
df = pd.read_csv('2018-fordgobike-tripdata.csv')
加載數(shù)據(jù)集缩功,并通過以下問題描述數(shù)據(jù)屬性。
嘗試通過這部分內(nèi)容獲得探索靈感靴庆。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1863721 entries, 0 to 1863720
Data columns (total 14 columns):
# Column Dtype
--- ------ -----
0 duration_sec int64
1 start_time object
2 end_time object
3 start_station_id float64
4 start_station_name object
5 start_station_latitude float64
6 start_station_longitude float64
7 end_station_id float64
8 end_station_name object
9 end_station_latitude float64
10 end_station_longitude float64
11 bike_id int64
12 user_type object
13 bike_share_for_all_trip object
dtypes: float64(6), int64(2), object(6)
memory usage: 199.1+ MB
# 每列數(shù)據(jù)的缺失值比例
df.isna().sum()/df.shape[0]
duration_sec 0.000000
start_time 0.000000
end_time 0.000000
start_station_id 0.006316
start_station_name 0.006316
start_station_latitude 0.000000
start_station_longitude 0.000000
end_station_id 0.006316
end_station_name 0.006316
end_station_latitude 0.000000
end_station_longitude 0.000000
bike_id 0.000000
user_type 0.000000
bike_share_for_all_trip 0.000000
dtype: float64
因為這個數(shù)據(jù)集的量非常大时捌,缺失值比例都比較小,所以直接將所有包含缺失值的數(shù)據(jù)刪除處理炉抒。
df.dropna(inplace=True)
df.shape[0]
1851950
df.head()
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 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 75284 | 2018-01-31 22:52:35.2390 | 2018-02-01 19:47:19.8240 | 120.0 | Mission Dolores Park | 37.761420 | -122.426435 | 285.0 | Webster St at O'Farrell St | 37.783521 | -122.431158 | 2765 | Subscriber | No |
1 | 85422 | 2018-01-31 16:13:34.3510 | 2018-02-01 15:57:17.3100 | 15.0 | San Francisco Ferry Building (Harry Bridges Plaza) | 37.795392 | -122.394203 | 15.0 | San Francisco Ferry Building (Harry Bridges Plaza) | 37.795392 | -122.394203 | 2815 | Customer | No |
2 | 71576 | 2018-01-31 14:23:55.8890 | 2018-02-01 10:16:52.1160 | 304.0 | Jackson St at 5th St | 37.348759 | -121.894798 | 296.0 | 5th St at Virginia St | 37.325998 | -121.877120 | 3039 | Customer | No |
3 | 61076 | 2018-01-31 14:53:23.5620 | 2018-02-01 07:51:20.5000 | 75.0 | Market St at Franklin St | 37.773793 | -122.421239 | 47.0 | 4th St at Harrison St | 37.780955 | -122.399749 | 321 | Customer | No |
4 | 39966 | 2018-01-31 19:52:24.6670 | 2018-02-01 06:58:31.0530 | 74.0 | Laguna St at Hayes St | 37.776435 | -122.426244 | 19.0 | Post St at Kearny St | 37.788975 | -122.403452 | 617 | Subscriber | No |
初步清理各列錯誤的數(shù)據(jù)類型:
- id 相關(guān)列應該是字符串類型奢讨;
- time 相關(guān)列應該是 datetime 類型;
- bike_share_for_all_trip 應該是布爾值焰薄。
column_list = df.columns.tolist()
for c in column_list:
if '_id' in c:
df[c] = df[c].astype(np.int64).astype(str)
elif '_time' in c:
df[c] = pd.to_datetime(df[c])
df.replace(['Yes','No'],[True,False],inplace=True)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1851950 entries, 0 to 1863720
Data columns (total 14 columns):
# Column Dtype
--- ------ -----
0 duration_sec int64
1 start_time datetime64[ns]
2 end_time datetime64[ns]
3 start_station_id object
4 start_station_name object
5 start_station_latitude float64
6 start_station_longitude float64
7 end_station_id object
8 end_station_name object
9 end_station_latitude float64
10 end_station_longitude float64
11 bike_id object
12 user_type object
13 bike_share_for_all_trip bool
dtypes: bool(1), datetime64[ns](2), float64(4), int64(1), object(6)
memory usage: 199.6+ MB
數(shù)據(jù)集結(jié)構(gòu)
-
duration_sec
int64 -
start_time
datetime64[ns] -
end_time
datetime64[ns] -
start_station_id
object -
start_station_name
object -
start_station_latitude
float64 -
start_station_longitude
float64 -
end_station_id
object -
end_station_name
object -
end_station_latitude
float64 -
end_station_longitude
float64 -
bike_id
object -
user_type
object -
bike_share_for_all_trip
bool
數(shù)據(jù)集中感興趣的列主要有:
- 是否訂閱會員服務(
user_type
)拿诸,與哪些特征相關(guān)?
你認為數(shù)據(jù)集中的哪些特征有助于對感興趣的特征進行探索塞茅?
duration_sec
亩码、start_time
、bike_share_for_all_trip
單變量探索
對單一變量進行探索野瘦,如果發(fā)現(xiàn)異常值描沟,則進行深入清理。
df_copy = df[['duration_sec','start_time','bike_share_for_all_trip','user_type']].copy()
騎行時長分布
df_copy.duration_sec.hist(bins=50)
plt.xscale('log');
可以看到騎行時長右偏非常嚴重鞭光,使用 log 變換之后也不太容易觀察吏廉,再詳細設置一下:
bin_edges = 10 ** np.arange(1, np.log10(df_copy.duration_sec.max())+0.1, 0.1)
plt.hist(df_copy.duration_sec, bins = bin_edges)
plt.xscale('log')
tick_locs = [60, 180, 300, 600, 1200, 1800, 3600, 7200, 18000]
tick_labels = ['1min','3min','5min','10min','20min','30min','60min','120min','300min']
plt.xticks(tick_locs, tick_labels, rotation=90);
可以觀察到騎行時長大部分都在 1 小時以下,最多的位于 5-20 分鐘的范圍內(nèi)惰许,還是比較合理的席覆。雙變量探索時要探索會員與非會員分別的騎行時長分布。
騎行開始時間探索
df_copy['start_date'] = df_copy['start_time'].dt.date
df_copy['start_week'] = df_copy['start_time'].dt.week
df_copy['start_weekday'] = df_copy['start_time'].dt.weekday
df_copy['start_hour'] = df_copy['start_time'].dt.hour
df_copy['start_month'] = df_copy['start_time'].dt.month
df_copy['start_date'].value_counts().sort_index().plot(figsize=(15,5))
plt.xlabel('Start Date');
可以看到明顯的汹买、有規(guī)律的波動佩伤,猜測是周末使用量下降導致的,看一下每周使用量是否與上面的波動相似:
df_copy['start_week'].value_counts().sort_index().plot(kind='bar',figsize=(15,5));
每周的波動很可能是由于周末導致的晦毙,觀察一下一周 7 天的變化情況:
df_copy['start_weekday'].value_counts().sort_index().plot(kind='bar',figsize=(10,5))
# dayOfWeek={0:'Monday', 1:'Tuesday', 2:'Wednesday', 3:'Thursday', 4:'Friday', 5:'Saturday', 6:'Sunday'}
weekday_name = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
plt.xticks(range(0,7), weekday_name)
plt.xlabel('Start Weekday');
果然周末使用量減少很多生巡,那么可能使用更多的是通勤的用途,可以探索一下小時的規(guī)律见妒,看看能否與通勤掛鉤:
df_copy['start_hour'].value_counts().sort_index().plot(kind='bar',figsize=(15,5),rot=0)
plt.xticks(range(0,24), range(0,24))
plt.xlabel('Start Hour');
開始騎行的小時障斋,可以發(fā)現(xiàn)明顯的兩個高峰,一個是 8-9 點徐鹤,一個是 17-18 點垃环,上下班高峰期。
df_copy['start_month'].value_counts().sort_index().plot(kind='bar',figsize=(15,5),rot=0);
寒冷的月份使用量較少返敬,5-10月使用量較多遂庄。
用戶類型分布
print(df_copy.user_type.value_counts())
df_copy.user_type.value_counts().plot(kind='pie', autopct='%.1f%%',figsize=(5,5));
Subscriber 1574991
Customer 276959
Name: user_type, dtype: int64
# 創(chuàng)建布爾值類型的會員列,方便后續(xù)計算
df_copy['is_vip'] = df_copy['user_type'] == 'Subscriber'
df_copy['is_vip'].mean() #驗證一下劲赠,與上面的餅圖百分比一致
0.8504500661464942
大部分騎行訂單來自會員賬戶涛目,只有 11.4% 來自散客秸谢。
Bike Share for All 服務
Bike Share for All 這是一種服務方式,根據(jù)官網(wǎng)的介紹霹肝,似乎針對的是低收入人群估蹄,需要符合一些標準才可以申請,以下內(nèi)容摘自官網(wǎng)介紹:
We offer all residents of the Bay Area an affordable, accessible, and fun new transportation option. Low-income residents qualify for a discounted membership.
Bike Share for All is available to Bay Area residents ages 18 and older who qualify for Calfresh, SFMTA (Low Income) Lifeline Pass or PG&E CARE utility discount.
探索一下 2018 年這個服務的情況:
print(df_copy.bike_share_for_all_trip.value_counts())
df_copy.bike_share_for_all_trip.value_counts().plot(kind='pie', autopct='%.1f%%',figsize=(5,5));
False 1690457
True 161493
Name: bike_share_for_all_trip, dtype: int64
只有 9.3% 的用戶享用 Bike Share for All 服務沫换。
對于你感興趣的變量臭蚁,存在什么異常嗎?需不需要執(zhí)行變換操作讯赏?
感興趣的變量是分類變量垮兑,其實想要探索是否會員,可以直接將其轉(zhuǎn)換為布爾值漱挎,方便后續(xù)的探索
在你探索的特征中系枪,是否存在異常分布?你對這些數(shù)據(jù)執(zhí)行了什么整理操作磕谅?請給出整理操作的原因私爷。
探索的其他特征中,沒有異常分布
雙變量探索
df_copy.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1851950 entries, 0 to 1863720
Data columns (total 10 columns):
# Column Dtype
--- ------ -----
0 duration_sec int64
1 start_time datetime64[ns]
2 bike_share_for_all_trip bool
3 user_type object
4 start_date object
5 start_week int64
6 start_weekday int64
7 start_hour int64
8 start_month int64
9 is_vip bool
dtypes: bool(2), datetime64[ns](1), int64(5), object(2)
memory usage: 130.7+ MB
騎行時長 vs 會員
df_copy.boxplot(column='duration_sec',by='is_vip',showfliers=False, showmeans=True,figsize=(7,5))
plt.ylabel('duration_sec');
df_copy.groupby('is_vip')['duration_sec'].describe()
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
is_vip | ||||||||
False | 276959.0 | 1918.298532 | 5020.580956 | 61.0 | 581.0 | 946.0 | 1566.0 | 86366.0 |
True | 1574991.0 | 665.668655 | 1329.790060 | 61.0 | 330.0 | 515.0 | 783.0 | 86281.0 |
從上面的箱線圖和描述性統(tǒng)計信息可以看到膊夹,會員的騎行時長相對比較短当犯,絕大多數(shù)都在 1500 秒以下,也就是小于 25 分鐘割疾。75% 的人騎行時長都在 13 分鐘以下。
def duration_hist(df,label):
bin_edges = 10 ** np.arange(1, np.log10(df_copy.duration_sec.max())+0.1, 0.1)
df['duration_sec'].hist(bins=bin_edges,alpha=0.5,figsize=(7,5),label=label)
plt.xscale('log')
tick_locs = [60, 180, 300, 600, 1200, 1800, 3600, 7200, 18000]
tick_labels = ['1min','3min','5min','10min','20min','30min','60min','120min','300min']
plt.xticks(tick_locs, tick_labels, rotation=90)
plt.xlabel('Duration')
plt.ylabel('Number of users')
plt.title('Duration vs Vip vs Count')
plt.legend();
duration_hist(df_copy[df_copy['is_vip']==True],'VIP')
duration_hist(df_copy[df_copy['is_vip']==False],'NotVIP')
通過上方直方圖對比嘉栓,可以看到非會員的分布更加均勻且時長偏長宏榕,會員的時間非常集中在 3-20 分鐘的范圍內(nèi)。
會員 bike share for all 服務
因為關(guān)于會員的一些探索使用了類似的代碼侵佃,所以整合為一個可以重復利用的函數(shù):
def variable_visulization(df, feature):
'''各個因素對注冊會員的影響分析對比柱狀圖組合'''
f, ax = plt.subplots(1,2,figsize=(18,5))
# 左側(cè)顯示注冊會員人數(shù)對比柱狀圖
df1 = df.groupby([feature,'is_vip'])['is_vip'].count().unstack()
df1.plot(kind='bar',ax=ax[0])
ax[0].set_ylabel('Number of trips')
ax[0].set_title(feature + ' VS Vip VS Count')
# 右側(cè)顯示注冊會員幾率柱狀圖
df2 = df.groupby(feature)['is_vip'].mean()
df2.plot(kind='bar',ax = ax[1])
ax[1].set_ylabel('Vip Rate')
ax[1].set_title(feature + ' VS Vip Rate')
for i, mean in enumerate(df2):
ax[1].text(i+0.08, mean-0.03, round(mean, 3),
horizontalalignment='center',rotation=90,color='white')
plt.show()
variable_visulization(df_copy,'bike_share_for_all_trip')
bike share for all 服務全部屬于會員麻昼,可能是因為該服務也屬于會員的一種。
會員 vs 周
variable_visulization(df_copy,'start_weekday')
可以看到周末和工作日的表現(xiàn)呈現(xiàn)兩種形式馋辈,創(chuàng)建一個新的變量 is_weekend抚芦,看看周末與非周末的直觀差異:
df_copy['is_weekend'] = df_copy['start_weekday'].isin([5,6])
variable_visulization(df_copy,'is_weekend')
上圖中可以看到,共享單車的使用迈螟,會員在工作日使用更多叉抡,非會員在周末使用更多,工作日的會員訂單比例更多答毫。這也比較符合認知褥民,如果一個人通勤時需要使用共享單車,注冊會員可能會更加劃算洗搂;而周末使用的人很可能是偶然情況下使用消返。
會員 vs 月
variable_visulization(df_copy,'start_month')
單變量探索中载弄,發(fā)現(xiàn)的規(guī)律是寒冷的月份使用的比較少,這在上面左側(cè)的圖表中同樣可以體現(xiàn)出來撵颊。每個月份的會員使用比例差異不是特別大宇攻,不過在相對寒冷的 1-4 月和 10-12 月,會員訂單的比例是相對較高的倡勇,在寒冷的月份逞刷,會員仍有選擇騎車的傾向,或許是習慣译隘,或許是已經(jīng)享受了訂閱服務亲桥,不使用有點浪費?
會員 vs 時
variable_visulization(df_copy,'start_hour')
可以看到共享單車會員的使用高峰與探索單變量時得出的結(jié)論一致固耘,都是上下班高峰题篷,但是非會員的分布就比較平滑,沒有那么明顯的差異厅目。在右邊的圖表中也可以看出番枚,會員在早晚高峰的使用率也是較多的。
騎行時長 vs 是否周末
因為騎行時長與會員存在一定的相關(guān)性损敷,而會員和是否為周末也存在一定的關(guān)系葫笼,所以再來看看騎行時長與周末是否有關(guān)系,先來看看箱線圖的表現(xiàn):
df_copy.boxplot(column='duration_sec',by='start_weekday',showfliers=False, showmeans=True,figsize=(7,5))
plt.ylabel('duration_sec');
df_copy.boxplot(column='duration_sec',by='is_weekend',showfliers=False, showmeans=True,figsize=(7,5))
plt.ylabel('duration_sec');
兩幅圖表都表現(xiàn)出了拗馒,周末的騎行時長相對更長路星,而工作日騎行時長更短、時間更集中诱桂,可以看到周末的均值被一些較大的值拉到了較高的位置洋丐,與中位數(shù)的線距離較遠。
duration_hist(df_copy[df_copy['is_weekend']==False],'Weekday')
duration_hist(df_copy[df_copy['is_weekend']==True],'Weekend')
圖中可以看到挥等,工作日的騎行時長處于 5-20 min 的數(shù)據(jù)非常多友绝,周末的數(shù)據(jù)分布則更為平均。
是否周末 vs 騎行開始時間
猜測是否周末應該也與騎行開始的時間有關(guān)系肝劲,因為工作日的時間可能更接近通勤時間迁客,看看可視化效果:
df_copy.groupby(['start_hour','is_weekend']).size().unstack().plot(figsize=(10,5))
plt.title('is_weekend vs start_hour')
plt.ylabel('Number of trips');
可以看到周末的數(shù)據(jù)非常平滑,是按照白天較多辞槐、夜晚較少的分布掷漱,而工作日正如想象的那樣呈現(xiàn)了兩個峰值:上下班的高峰期。
講一下你在這一部分的探索中觀察到的關(guān)系榄檬,你感興趣的變量是否有變化切威?
觀察到的關(guān)系:
- 會員的騎行時長相對更短,非會員的分布更加均勻且時長偏長丙号,會員的時間非常集中在 3-20 分鐘的范圍內(nèi)先朦;
- 會員騎行更集中在工作日缰冤、通勤時間段,在寒冷的月份喳魏,比起非會員來說更有選擇騎車的可能棉浸;
- 工作日的訂單騎行時長更集中、更短刺彩,周末的騎行時長更為分散迷郑,相對時間較長。
- 工作日的訂單更多發(fā)生在早晚高峰创倔,周末白天的時間都比較均勻嗡害。
感興趣的變量出現(xiàn)了變化,從更為具體的每周七天畦攘,歸類為是否為周末霸妹,創(chuàng)建了新的變量 is_weekend。
是否觀察到其他特征(不是之前感興趣的特征)之間的有趣關(guān)系知押?
之前一直集中在是否為會員與其他特征的關(guān)系叹螟,在分析中發(fā)現(xiàn)了騎行開始的小時與是否周末也有關(guān)系。
多變量探索
創(chuàng)建三個或更多變量的圖表台盯,以進一步探索數(shù)據(jù)罢绽。確保探索是合理的,與前面的探索一脈相承静盅。
這部分主要想探索的是會員與騎行時長和騎行發(fā)生的時間(是否為周末良价、通勤時間等)的關(guān)系,先創(chuàng)建一個可復用的函數(shù):
def muliple_features(x,y="duration_sec",hue="is_vip"):
plt.figure(figsize=(10,5))
sns.boxplot(x=x, y=y, hue=hue,
data=df_copy, palette="Set3",showfliers=False, showmeans=True)
plt.title('{} vs {} vs {}'.format(x,y,hue))
會員 vs 騎行時長 vs 周
muliple_features("start_weekday")
muliple_features("is_weekend")
通過上面兩幅圖表蒿叠,明顯可以看出明垢,綠色的箱線更分散,均值更靠上栈虚。可以判斷會員和非會員周末的騎行時長都相對更長史隆,工作日都相對較短魂务,而會員不論是周末還是工作日都比非會員的騎行時長更為集中。
muliple_features("start_hour")
騎行開始時間泌射,可以從均值看出夜晚和凌晨的時間波動比較大粘姜,會員的騎行時長一直都相對穩(wěn)定,非會員在白天 10-16 點的時間段騎行時長比較長熔酷。下面將最感興趣的四個變量放到一個圖表中進行觀察孤紧,這里選擇了 seaborn 庫的繪圖方式,一方面是代碼簡練拒秘,另一方面還可以看到 95% 置信區(qū)間号显,觀察到波動劇烈的凌晨數(shù)據(jù)臭猜。
VIP vs Start Hour vs Weekend vs Duration 折線圖
g = sns.relplot(x="start_hour", y="duration_sec", hue="is_vip", col="is_weekend",
height=5, aspect=12/7, facet_kws=dict(sharex=False),
kind="line", legend="full", data=df_copy)
g.fig.suptitle('VIP vs Start Hour vs Weekend vs Duration', fontsize=12);
圖中可以觀察到,會員的折線波動都非常平滑押蚤,集中在較短的時間內(nèi)蔑歌,騎行時長的均值都維持在 1000 左右,也就是約 16 分鐘左右揽碘。非會員的騎行時長均值維持在會員的折線上方次屠,且波動較大,置信區(qū)間的范圍也較大雳刺,說明數(shù)據(jù)較為分散劫灶。工作日和周末的對比不是特別明顯,再繪制一份柱狀圖觀察一下:
g = sns.catplot(x="start_hour", y="duration_sec", hue="is_weekend", col="is_vip",
data=df_copy, kind="bar", height=5, aspect=12/7)
g.fig.suptitle('VIP vs Start Hour vs Weekend vs Duration',fontsize=12);
上圖可以看到:
- 夜晚和凌晨的誤差條都比較長掖桦,說明數(shù)據(jù)較為分散本昏,沒有那么明確的規(guī)律;
- 左右兩個子圖對比滞详,可以看出左側(cè)的長條都相對較高凛俱,說明非會員的騎行時長比會員的騎行時長要更長;
- 右側(cè)會員的數(shù)據(jù)中料饥,除了凌晨的個別時間段蒲犬,基本上都處于 1000 以下,且誤差條非常短岸啡,說明騎行時長集中原叮,且時長都較短;
- 除了凌晨的個別時間段巡蘸,基本上所有的橙色長條都比藍色長條要高奋隶,說明基本上周末都比工作日的騎行時長要長;
討論這一部分探索中觀察到的關(guān)系悦荒。這些特征關(guān)系是否對你感興趣的特征有幫助唯欣?
這一部分的探索驗證了自己的猜想,非常有幫助搬味。
特征之間是否存在有趣的境氢、令人驚訝的相互作用?
共享單車的大部分用戶都是會員碰纬,且主要的用途是短途通勤萍聊。所以訂單數(shù)量、騎行時長悦析,都會與工作日和通勤時間存在密切的聯(lián)系寿桨。
會員這樣的訂閱服務,會在較為寒冷的月份體現(xiàn)出更明顯的商業(yè)價值强戴。
更好閱讀體驗可以訪問 Kesci Lab:原文鏈接