Bay Wheels 共享單車數(shù)據(jù)探索(EDA)

寫在前面:
該報告為優(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
  • 用戶類型:
    1. 會員:"Subscriber" 或者 "Member"
    2. 散客:"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_timebike_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:原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭螟,一起剝皮案震驚了整個濱河市挡鞍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媒佣,老刑警劉巖匕累,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異默伍,居然都是意外死亡欢嘿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門也糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼蹦,“玉大人,你說我怎么就攤上這事狸剃∑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵钞馁,是天一觀的道長虑省。 經(jīng)常有香客問我,道長僧凰,這世上最難降的妖魔是什么探颈? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮训措,結(jié)果婚禮上伪节,老公的妹妹穿的比我還像新娘。我一直安慰自己绩鸣,他們只是感情好怀大,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呀闻,像睡著了一般化借。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捡多,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蓖康,我揣著相機與錄音,去河邊找鬼局服。 笑死钓瞭,一個胖子當著我的面吹牛驳遵,可吹牛的內(nèi)容都是我干的淫奔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼堤结,長吁一口氣:“原來是場噩夢啊……” “哼唆迁!你這毒婦竟也來了鸭丛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤唐责,失蹤者是張志新(化名)和其女友劉穎鳞溉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼠哥,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡熟菲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朴恳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄罕。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖于颖,靈堂內(nèi)的尸體忽然破棺而出呆贿,到底是詐尸還是另有隱情,我是刑警寧澤森渐,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布做入,位于F島的核電站,受9級特大地震影響同衣,放射性物質(zhì)發(fā)生泄漏竟块。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一乳怎、第九天 我趴在偏房一處隱蔽的房頂上張望彩郊。 院中可真熱鬧,春花似錦蚪缀、人聲如沸秫逝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违帆。三九已至,卻和暖如春金蜀,著一層夾襖步出監(jiān)牢的瞬間刷后,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工渊抄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尝胆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓护桦,卻偏偏與公主長得像含衔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353