Python 數據分析指南 -全-
前言
數據分析是通過明確分析目的,梳理並確定分析邏輯,針對性的收集、整理數據,並採用統計、挖掘技術分析,提取有用信息和展示結論的過程,是數據科學領域的核心技能。
本文從數據分析常用邏輯框架及技術方法出發,結合 python 項目實戰全面解讀數據分析,可以系統掌握數據分析的框架套路,快速上手數據分析。
一、 數據分析的邏輯 -- 構建系統的分析維度及指標
1.1 PEST 分析法
PEST 分析是指宏觀環境的分析,宏觀環境是指影響一切行業或企業的各種宏觀力量。P 是政治 (Politics),E 是經濟 (Economy),S 是社會 (Society),T 是技術 (Technology)。通常是戰略諮詢顧問用來幫助企業檢閱其外部宏觀環境的一種方法,以吉利收購沃爾沃爲例:
1.2 5W2H 分析法
5W2H 分析法又稱七何分析法,包括:Why、What、Where、When、Who、How、How much 。主要用於用戶行爲分析、業務問題專題分析、營銷活動等,是一個方便又實用的工具。
1.3 邏輯樹分析法
邏輯樹是分析問題最常用的工具之一,它是將問題的所有子問題分層羅列,從最高層開始,並逐步向下擴展。使用邏輯樹分析的主要優點是保證解決問題的過程的完整性,且方便將工作細分爲便於操作的任務,確定各部分的優先順序,明確地把責任落實到個人。
1.4 4P 營銷理論
4P 即產品(Product)、價格(Price)、渠道(Place)、促銷(Promotion),在營銷領域,這種以市場爲導向的營銷組合理論,被企業應用最普遍。通過將四者的結合、協調發展,從而提高企業的市場份額,達到最終獲利的目的。
4P 營銷理論適用於分析企業的經營狀況,可視爲企業內部環境,PEST 分析的是企業在外部面對的環境。
1.5 SCQA 分析法
SCQA 分析是一個 “結構化表達” 工具,即 S(Situation)情景、C(Complication)衝突、Q(Question)疑問、A(Answer)回答。
整個結構是通過描述當事者的現實狀態,然後帶出衝突和核心問題,通過結構化分析以提供更爲明智的解決方案。以校園招聘 SCQA 分析爲例:
1.6 SMART 分析法
SMART 法是一種目標管理方法,即對目標的 S(Specific)明確性,M(Measurable)可衡量性,A(Attainable)可實現性,R(Relevant)相關性,T(Time-based)時限性。
1.7 SWOT 分析法
SWOT 分析法也叫態勢分析法,S (Strengths)是優勢、W (Weaknesses)是劣勢,O (Opportunities)是機會、T (Threats)是威脅或風險。常用來確定企業自身的內部優勢、劣勢和外部的機會和威脅等,從而將公司的戰略與公司內部與外部環境有機地結合起來。以 HUAWEI 的 SWOT 分析爲例:
二、 數據分析的技術方法
數據分析的技術方法是指提取出關鍵指標信息的具體方法,如對比分析、交叉分析、迴歸預測分析等方法。
2.1 對比分析法
對比分析法是將兩個或兩個以上的數據進行比較,分析差異,揭示發展變化情況和規律。
-
靜態比較:時間一致的前提下選取不同指標,如部門、城市、門店等,也叫橫向比較。
-
動態比較:指標一致的前提下,針對不同時期的數據比較,也叫縱向比較。
舉例:各車企銷售表現
2.2 分組分析法
-
先經過數據加工,對數據進行數據分組,然後對分組的數據進行分析。
-
分組的目的是爲了便於對比,把總體中具有不同性質的對象區分開,把性質相同的對象合併在一起,保持各組內對象屬性的一致性、組與組之間屬性的差異性,以便進一步運用各種數據分析方法來解釋內在的數量關係。
舉例:新書在各銷售渠道的銷量
2.3 結構分析法
- 結構分析法又稱比重分析法,是在分組分析法的基礎上,計算總體內各組成部分佔總體的比重,進而分析總體數據的內部特徵。
舉例:市場佔有率是典型的結構分析。
2.4 平均分析法(標準參數分析法)
-
運用計算平均數的方法來反映總體在一定的時間、地點條件下某一數量特徵的一般水平。
-
平均指標可用於同一現象在不同地區、不同部門或單位間的對比,還可用於同一現象在不同時間的對比。
舉例:季節性分析和價格分析時常會用到 index 指標
2.5 交叉分析法
- 通常用於分析兩個變量之間的關係,即同時將兩個有一定聯繫的變量及其值交叉排列在一張表格內,使各變量值成爲不同變量的交叉節點,形成交叉表。
舉例:常見的氣泡圖數據表格
2.6 漏斗圖分析法
- 漏斗圖可以很好的反映網站各步奏轉化率,利用對比法對同一環節優化前後的效果進行對比分析來反映某個步奏轉化率的好壞。
舉例:商品流轉率表現圖
三、 數據分析的圖表展示
圖表展示可以幫助我們更好、更直觀地看懂數據信息。
圖表的選擇,不只是關注圖表的樣式,而關鍵在於關注數據情況及圖表展示的功能。可以通過數據展示的功能(構成、比較、趨勢、分佈及聯繫)進行圖表選擇,如下所示:
四、 項目實戰 (python)
4.1 數據內容
數據來源於 kesci 天貓真實成交訂單,主要是行爲類數據。
a. 訂單編號:訂單編號
b. 總金額:訂單總金額
c. 買家實際支付金額:總金額 - 退款金額(在已付款的情況下);未付款的支付金額爲 0
d. 收貨地址:全國各個省份
e. 訂單創建時間:下單時間
f. 訂單付款時間:付款時間(如果未付款,顯示 NaN)
g. 退款金額:付款後申請退款的金額。未付款的退款金額爲 0
4.2 天貓訂單分析過程
4.2.1 背景及分析目的
以天貓一個月內的訂單數據,觀察這個月的訂單量以及銷售額, 分析下單日期、收貨地址等因素對訂單量的影響以及訂單轉換情況,旨在提升用戶下單量和訂單轉換率,進而提高用戶實際支付額。
4.2.2 分析邏輯
本文結合訂單流程以邏輯樹方法分析訂單數目的影響因素,從以下幾個維度展開:
4.2.3 數據讀取及處理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import warnings
warnings.filterwarnings('ignore')
# 讀取數據
df = pd.read_csv('tmall_order_report.csv')
df.head()
# 利用pandas_profiling一健生成數據情況(EDA)報告:數據描述、缺失、相關性等情況
import pandas_profiling as pp
report = pp.ProfileReport(df)
report
#規範字段名稱
df.columns
df=df.rename(columns={'收貨地址 ':'收貨地址','訂單付款時間 ':'訂單付款時間'})
df.columns
#查看數據基本信息
df.info()
# 數據類型轉換
df['訂單創建時間']=pd.to_datetime(df.訂單創建時間)
df['訂單付款時間']=pd.to_datetime(df.訂單付款時間)
df.info()
# 數據重複值
df.duplicated().sum()
無
#數據缺失值
df.isnull().sum()
#數據集描述性信息
df.describe()
#篩選數據集
df_payed=df[df['訂單付款時間'].notnull()]#支付訂單數據集
df_trans=df_payed[df_payed['買家實際支付金額']!=0]#到款訂單數據集
df_trans_full=df_payed[df_payed['退款金額']==0]#全額到款訂單數據集
4.2.4 總體運營指標分析
分析 2 月份成交訂單數的變化趨勢
import pyecharts.options as opts
#將訂單創建時間設爲index
df_trans=df_trans.set_index('訂單創建時間')
#按天重新採樣
se_trans_month = df_trans.resample('D')['訂單編號'].count()
from pyecharts.charts import Line
#做出標有具體數值的變化圖
name = '成交訂單數'
(
Line()
.add_xaxis(xaxis_data = list(se_trans_month.index.day.map(str)))
.add_yaxis(
series_name= name,
y_axis= se_trans_month,
)
.set_global_opts(
yaxis_opts = opts.AxisOpts(
splitline_opts = opts.SplitLineOpts(is_show = True)
)
)
.render_notebook()
)
小結 1 :2 月上半月,多數企業未復工,快遞也停運,暫時無法發貨,訂單數很少;2 月下半月,隨着企業復工逐漸增多,訂單數開始上漲。
se_trans_map=df_trans.groupby('收貨地址')['收貨地址'].count().sort_values(ascending=False)
# 爲了保持收貨地址和下面的地理分佈圖使用的省份名稱一致,定義一個處理自治區的函數
def strip_region(iterable):
result = []
for i in iterable:
if i.endswith('自治區'):
if i == '內蒙古自治區':
i = i[:3]
result.append(i)
else:
result.append(i[:2])
else:
result.append(i)
return result
# 處理自治區
se_trans_map.index = strip_region(se_trans_map.index)
# 去掉末位‘省’字
se_trans_map.index = se_trans_map.index.str.strip('省')
import pyecharts.options as opts
from pyecharts.charts import Map
# 展示地理分佈圖
name = '訂單數'
(
Map()
.add(
series_name = name,
data_pair= [list(i) for i in se_trans_map.items()])
.set_global_opts(visualmap_opts=opts.VisualMapOpts(
max_=max(se_trans_map)*0.6
)
)
.render_notebook()
)
用直觀的地圖來觀察成交訂單數的分佈情況
小結 2 :地區對訂單數量影響較大,一般較發達地區訂單數較大,邊遠地區較小。這裏可能需要具體分析每個地區的商品種類、消費羣體以及優惠政策,快遞等原因。可以根據原因進一步提高其他地區的訂單數量和銷售金額。
4.2.5 銷售轉化指標
訂單數以及訂單轉化率的呈現
dict_convs=dict() #字典
dict_convs['總訂單數']=len(df)
df_payed
dict_convs['訂單付款數']=len(df_payed.notnull())
df_trans=df[df['買家實際支付金額']!=0]
dict_convs['到款訂單數']=len(df_trans)
dict_convs['全額到款訂單數']=len(df_trans_full)
#字典轉爲dataframe
df_convs = pd.Series(dict_convs,name = '訂單數').to_frame()
df_convs
#求總體轉換率,依次比上總訂單數
total_convs=df_convs['訂單數']/df_convs.loc['總訂單數','訂單數']*100
df_convs['總體轉化率']=total_convs.apply(lambda x:round(x,0))
df_convs
#求單一轉換率
single_convs=df_convs.訂單數/(df_convs.訂單數.shift())*100
single_convs=single_convs.fillna(100)
df_convs['單一轉化率']=single_convs.apply(lambda x:round(x,0))
df_convs
畫轉換率漏斗圖,直觀呈現訂單轉化情況
from pyecharts.charts import Funnel
from pyecharts import options as opts
name = '總體轉化率'
funnel = Funnel().add(
series_name = name,
data_pair = [ list(z) for z in zip(df_convs.index,df_convs[name]) ],
is_selected = True,
label_opts = opts.LabelOpts(position = 'inside')
)
funnel.set_series_opts(tooltip_opts = opts.TooltipOpts(formatter = '{a}<br/>{b}:{c}%'))
funnel.set_global_opts( title_opts = opts.TitleOpts(title = name),
# tooltip_opts = opts.TooltipOpts(formatter = '{a}<br\>{b}:{c}%'),
)
funnel.render_notebook()
name = '單一轉化率'
funnel = Funnel().add(
series_name = name,
data_pair = [ list(z) for z in zip(df_convs.index,df_convs[name]) ],
is_selected = True,
label_opts = opts.LabelOpts(position = 'inside')
)
funnel.set_series_opts(tooltip_opts = opts.TooltipOpts(formatter = '{a}<br/>{b}:{c}%'))
funnel.set_global_opts( title_opts = opts.TitleOpts(title = name),
# tooltip_opts = opts.TooltipOpts(formatter = '{a}<br\>{b}:{c}%'),
)
funnel.render_notebook()
小結 3:從單一轉化率來看,支付訂單數 - 到款訂單數轉換率爲 79%,後續可以從退款率着手分析退款原因,提高轉換率。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/cFVEaqSiURIUpWq0OQHsLA