Python 數據集探索與可視化實例指南

字幕組雙語原文:Python 數據集探索與可視化實例指南

英語原文:Explore and Visualize a Dataset with Python

翻譯:AI研習社(Suen



在今天的文章中,您將學習:

  • 如何合併和整理數據,

  • 如何探索和分析數據,

  • 如何創建漂亮的圖形以可視化您的發現

本文適用於誰:

  • 經常處理數據的人

  • 對Python和Pandas有基本了解的人

情景再現: 

你的任務是提高銷售團隊的績效。在我們假設的情況下,潛在客戶有相當自發的需求。當這種情況發生時,您的銷售團隊會在系統中放置一個訂單線索。然後,您的銷售代表會設法安排一次會議,會議將在訂單線索被注意到的時候舉行。有時在前,有時在後。你的銷售代表有一個把會議和餐費結合起來的開支預算。銷售代表花費他們的成本,並將發票交給會計團隊處理。在潛在客戶決定是否接受您的報價后,銷售代表會跟蹤訂單線索是否轉化為銷售。 

 對於分析,您可以訪問以下三個數據源: 

  •  訂單線索(包含所有訂單線索和轉換信息) 

  •  銷售團隊(包括公司和負責的銷售代表) 

  •  發票(提供發票和參與者的信息)

導入和安裝:

需要安裝標準庫,此外,通過使用以下命令,在你的Notebook上安裝seaborn.

!pip install seaborn


下載數據:

您可以按照上周的說明下載併合並數據,也可以從此處下載文件並將其加載到 Notebook中。

  

 sales_team 數據表的前兩行

order_leads數據表的前兩行

  

invoices數據表的前兩行

開始探索

總轉化率發展:

  轉化率隨時間的變化 

 事情似乎在2017年初走下坡路。經過與首席銷售官核實,發現大約在那個時候有一個競爭對手進入了這個市場。很高興知道,但我們現在無能為力。

_ = order_leads.set_index(pd.DatetimeIndex(order_leads.Date)).groupby(    pd.Grouper(freq='D')    

)['Converted'].mean()    

ax = _.rolling(60).mean().plot(figsize=(20,7),title='Conversion Rate Over Time')    

vals = ax.get_yticks()    

ax.set_yticklabels(['{:,.0f}%'.format(x*100) for x in vals])    

sns.despine()


  1. 我們使用下劃線_作為臨時變量。對於以後不再使用的一次性變量,我通常會這樣做。 

  2.  我們在order_leads.Date上使用了pd.DateTimeIndex並將結果設置為索引,這使我們能夠

  3. 使用pd.Grouped(freq ='D')按天對數據進行分組。 或者,您可以將頻率更改為W,M,Q或Y(每周,每月,每季度或每年) 

  4. 我們計算每天「轉換」的平均值,這將給出當天訂單的換算率。 

  5. 我們使用.roll(60)和.mean()來獲得60天的滾動平均值。 

  6. 然後我們格式化yticklables,使它們顯示一個百分號。

各銷售代表的轉化率:

各個銷售代表之間似乎存在很大的差異。 讓我們對此進行更多調查。

就所使用的功能而言,這裡沒有太多新內容。 但是請注意我們如何使用sns.distplot將數據繪製到軸上。

如果我們回顧sales_team數據,我們會記住並非所有的銷售代表都擁有相同數量的客戶,這肯定會產生影響! 讓我們檢查。

按分配的帳戶數分配的轉換率

我們可以看到,轉換率數字似乎與分配給銷售代表的帳戶數量成反比。 那些降低的轉化率是有道理的。 畢竟,代表擁有的帳戶越多,他可以花在每個人身上的時間就越少。

在這裡,我們首先創建一個輔助函數,該函數將垂直線映射到每個子圖中,並用數據的均值和標準差注釋該線。然後我們設置一些seaborn繪圖默認值,例如較大的font_scale和whitegrid設置為樣式。

進餐影響:

進餐數據

看來我們已經確定了用餐的日期和時間,讓我們快速了解一下時間分佈:

invoices['Date of Meal'] = pd.to_datetime(invoices['Date of Meal'])    
invoices['Date of Meal'].dt.time.value_counts().sort_index()


out:
07:00:00    5536
08:00:00    5613
09:00:00    5473
12:00:00    5614
13:00:00    5412
14:00:00    5633
20:00:00    5528
21:00:00    5534
22:00:00    5647


總結:

invoices['Type of Meal'] = pd.cut(    
    invoices['Date of Meal'].dt.hour,    
    bins=[0,10,15,24],    
    labels=['breakfast','lunch','dinner']    
)

">

注意,這裡我們是如何使用pd.cut為數字數據分配類別的,這很有意義,因為畢竟,早餐是在8點還是9點開始,都沒有關係。

另外,請注意我們如何使用.dt.hour,我們只能這樣做,因為我們將

invoices['Date of Meal']轉換為之前的日期時間。 .dt是所謂的訪問器,其中有三個cat,str和dt。 如果您的數據類型正確,則可以使用這些訪問器及其方法進行直接操作(計算有效且簡潔)。不幸的是,invoices ['Participants']是一個字符串,我們必須首先將其轉換為合法的JSON,以便我們 可以提取參與者的數量。

def replace(x):    
    return x.replace("\n ",",").replace("' '","','").replace("'",'"')    
invoices['Participants'] = invoices['Participants'].apply(lambda x: replace(x))    
invoices['Number Participants'] = invoices['Participants'].apply(lambda x: len(json.loads(x)))

">

現在,我們合併數據。 為此,我們首先將公司ID上的所有發票左連接到order_leads。 但是,合併數據會導致所有餐點都加入所有訂單。 也有古老的飯菜,以最近的訂單。 為了緩解這種情況,我們計算了進餐和點餐之間的時間差,並且僅考慮訂單周圍五天的進餐。">

仍然有一些訂單已分配多餐。 當同時有兩個訂單和兩餐時,可能會發生這種情況。 然後,兩餐將分配給兩個訂單線索。 要刪除這些重複項,我們僅使餐點最接近該訂單。

  組合數據的部分

我創建了一個繪圖欄功能,其中已經包含一些樣式。 通過該功能進行繪圖可以使目視檢查更快。 我們將在一秒鐘內使用它。

進餐類型的影響:


orders_with_meals['Type of Meal'].fillna('no meal',inplace=True)    
_ = orders_with_meals.groupby('Type of Meal').agg({'Converted': np.mean})    
plot_bars(_,x_col='Type of Meal',y_col='Converted')


哇! 用餐相關的訂單與不用餐相關的訂單之間的轉換率差異非常大。 不過,看起來午餐的轉化率略低於晚餐或早餐。 

時間的影響(即進餐之前或之後進餐):


_ = orders_with_meals.groupby(['Days of meal before order']).agg(    
{'Converted': np.mean}    
)    
plot_bars(data=_,x_col='Days of meal before order',y_col='Converted')

">

「訂購前用餐天數」為負數表示用餐是在訂單線索輸入之後進行的。我們可以看到,如果膳食在訂單線索進入之前發生,則對轉化率似乎有積極影響。 訂單的先驗知識似乎在這裡給我們的銷售代錶帶來了優勢。 

結合所有:

現在,我們將使用熱圖同時可視化數據的多個維度。 為此,首先創建一個輔助函數。

然後,我們使用一些最終數據進行爭辯,以額外考慮餐食價格與訂單價值的關係,並將交貨時間分配到「訂購前」,「訂購前後」,「訂購后」,而不是從負4到正4的天數,因為這在解釋方面有些繁瑣。

運行以下代碼片段將產生多維熱圖。

draw_heatmap(    
    data=data,    
    outer_row='Timing of Meal',    
    outer_col='Type of Meal',    
    inner_row='Meal Price / Order Value',    
    inner_col='Number Participants',    
    values='Converted'    
)




熱圖可在一幅圖中可視化四個維度

該熱圖當然很漂亮,儘管起初有點難讀。 因此,讓我們來看一下。 圖表總結了4個不同維度的影響:

  • 用餐時間:訂購后,訂購前後,訂購前(外排)

  • 用餐類型:早餐,晚餐,午餐(外欄)

  • 餐單價格:最低價格,最低價格,比例價格,最高價格,最高價格(內排)

  • 參加人數:1,2,3,4,5(內欄)

當然,圖表底部的顏色似乎更深/更高,這表明:

  • 在點餐之前用餐時,轉化率會更高

  • 當只有一名參與者時,晚餐轉化率似乎更高

  • 與訂單價值相比,看起來更昂貴的餐食對轉化率有積極影響 

結果:

  1. 銷售代表的帳戶不要超過9個(轉化率會迅速下降)

  2. 確保每個訂單線索都伴隨有會議/進餐(因為這會使轉換率翻倍當只有一位員工來訪時,晚餐最有效

  3. 您的銷售代表應支付的餐費約為訂單金額的8%至10%

  4. 時間是關鍵,理想情況下,您的銷售代表應儘早知道即將達成交易。

單擊此處查看代碼: GitHub Repo / Jupyter Notebook

備註為熱圖:

要解決可能出現的格式錯誤,可以先卸載(然後在終端中必須這樣做),然後運行以下命令,將matplotlib降級到3.1.0版:

!pip install matplotlib==3.1.0

雷鋒字幕組是一個由AI愛好者組成的翻譯團隊,匯聚五五多位志願者的力量,分享最新的海外AI資訊,交流關於人工智能技術領域的行業轉變與技術創新的見解。

團隊成員有大數據專家,算法工程師,圖像處理工程師,產品經理,產品運營,IT諮詢人,在校師生;志願者們來自IBM,AVL,Adobe,阿里,百度等知名企業,北大,清華,港大,中科院,南卡羅萊納大學,早稻田大學等海內外高校研究所。

如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。


想在手機閱讀更多程式設計資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems