天天看點

奔奔資料分析

資料來源于網絡;

使用工具:python,navicat, MySQL,excel

分析分為3塊:

1.資料預處理:異常值,重複值,缺失值,(線性回歸填充)

2.資料分析:描述型統計分析(MySQL),管道&平台分析産品TOP分析

3.RFM(k-means),同期群分析(新使用者留存,客單價),流失周期

資料概貌:

一張excel表,來源某電商平台,購買訂單明細表,以下是字段:

奔奔資料分析

1.在做分析前先對資料進行預處理:

逐一字段,争對,異常值,缺失值,重複值進行分析

這裡提一下,chanelID,和payment存在缺失。

對于缺失值的處理方法有:删除和填充

填充又分為:平均數填充,中位數填充,衆數填充,和回歸預測填充。

對于ChanelID 因為缺失值較少,直接删除。

Payment缺失1038行,又因為是金額重要名額,采用回歸填充

這裡采用線性回歸預測填充

def data_tackle_restart(self,data):
        # print(data.info())
        # print(data.info())
        # print(data.head())
        #主要争對重複值,異常值,缺失值進行處理
        # data.set_index('id',inplace=True)

        data.drop(index=data[data.index=='NaN'].index,inplace=True)

        data.drop_duplicates(subset='orderID',inplace=True)
        data['userID']=data['userID'].str[5:]

        data.drop(index=data[data.payment>data.orderAmount].index,inplace=True)
        data.drop(index=data[data.payment<0].index,inplace=True)
        data.drop(index=data[data.orderAmount<0].index,inplace=True)
        data['orderAmount']=data['orderAmount']/10
        data['payment']=data['payment']/10
        data.drop(index=data[data.chanelID=='###'].index,inplace=True)
        # data['goodsID']=data['goodsID'].str[2:]
        data['platformType']=data['platformType'].str.replace(" ","")
        d={'WechatShop':'1',        
            'WEB':'2',        
            'ALiMP':'3',        
            'WechatMP':'4',
            'Wap':'5',
            'APP':'6'}
        data=data.replace({'platformType':d})
        d={'否':'1','是':'0'}
        data=data.replace({'chargeback':d})

        df=data.copy()
        #對于缺失值在資料量比較小的時候可以進行删除,比較大或者比較關鍵的時候進行填充
        #這裡采用線性回歸
        #金額
        
        data['platformType']=data['platformType'].astype(int)
        data['chargeback']=data['chargeback'].astype(int)
        # print(data.info())
        # print(data.corr())

        x_train=np.array(df[df.payment.isnull()==False]['orderAmount']).reshape(-1,1)
        x_text=np.array(df[df.payment.isnull()==True]['orderAmount']).reshape(-1,1)
        y_train=np.array(df[df.payment.isnull()==False]['payment']).reshape(-1,1)       
        l=LinearRegression()
        l.fit(x_train,y_train)
        rr=l.predict(x_text)
        # print(rr)
        data.loc[data['payment'].isnull()==True,'payment']=rr
        # print(cross_val_score(l,np.array(data.orderAmount).reshape(-1,1),np.array(data.payment).reshape(-1,1),cv=5).mean())       
        data['orderTime']=pd.to_datetime(data.orderTime)
        data['payTime']=pd.to_datetime(data.payTime)
        data.drop(index=data[data.orderTime > data['payTime']].index,inplace=True)
        data.drop(index=data[(data.payTime-data.orderTime).dt.days>1].index,inplace=True)
        data['month']=data.payTime.dt.month
        data['星期']=data.payTime.dt.day_name() 
        data['date']=data.payTime.dt.date
        data['hour']=data['payTime'].dt.hour
        data['order']=1
        return data
           

以上最後一段是關于時間粒度的建構,從年,月,星期,小時,進行拆分。

2.描述性統計分析:

1.描述性統計分析基于mySQL,使用navicat連接配接操作MYSQL.

1.1先來看一下整體的一個彙總情況:總訂單數,GMV,獨立使用者數,客單價

奔奔資料分析

1.2 聯合時間次元;月,星期,小時,集中在銷售額和獨立使用者上,對資料進行描述。

月:

奔奔資料分析
奔奔資料分析

分析:從5月開始整體的GMV呈現上漲趨勢,其他名額也對應上漲,且5月的增長率也是最高,雖然之後增長率走低,但是絕對值GMV基本穩定在100萬以上

按照星期:

奔奔資料分析

整個GMV基本上符合電商平台的特性,在周末逐漸上漲,周内有所下降,在周三相比最低。

整體GMV都處于150萬以上

按照小時:

奔奔資料分析
奔奔資料分析

整體符合電商平台的規律,晚上是黃金時間[17-22]點 一路走高,在21點達到最高,除了在晚上這個時間段發送push多次彈出,以及優惠卷的發放(為了刺激使用者消費)以外,還應将一部分優惠卷,積分的發放時間争對不同人群精準在13-14點投放。

按照管道分解:

奔奔資料分析

分析:就GMV來說,可以明顯看到斷層,no.1 0896管道比第二名高出了40萬,之後的斷層也是在0530 管道,與0765,0007與0283 ;20萬-30萬之間,說明整體管道這方面不是很穩定,超頭部管道達到了170萬,而之後的都相差至少40萬以上,這還僅僅是購買金額的量 由此可以反推該管道一開始的流量也是非常巨大的,一旦0896 該管道關閉或者出現振蕩會大幅度影響整個流量的減少;

建議:1.盡量保持該超頭部管道的穩定

2.可以借鑒0896 管道投放的人群特點進行分析,找出可以進行複刻的特點精準投放與其他頭部管道,并且在其他頭部管道進行精準投放該類似群體時間在13-14或者15到22 一些不好的管道關注是否投放人群有誤,是否存在轉化率過低和本身流量過少的問題,進行調整。

對于0896的管道分析:

奔奔資料分析

我們可以看到前半年基本處于增長的态勢,後半年有着略微的下降,但是整體來看依然是處于增長的狀态。

再取平台這邊的資料看一下該管道的人數主要分布于哪些平台。

奔奔資料分析

由圖可知管道0896 的人數主要還是分布在4和6之間,人數購買的占比達到了16%左右。

而且,通過以上展示,我們也可以看到GMV也是主要集中在,4-6,判斷主要受了管道0896的影響,從管道0986 的流量大多在4,6平台上進行購買:

通過對管道0986的分析,再結合0986 的人群特征我們就可以複刻于其他頭部管道,并且盡可能多的投放于4和6平台。觀察效果

商品TOP分析:

奔奔資料分析

可以看到第一名産品與之後的産品相差至少在18%以上,我們對這前10熱銷産品進行月次元的拆分:

select *,(sum_payment-rnk) ‘增長’ from (

select * ,lag(sum_payment,1) over(partition by goodsID) rnk from (

select benben.goodsID,month,round(sum(payment),2) sum_payment from benben

INNER join (select goodsID from benben

group by goodsID

order by sum(payment) DESC

limit 10)a

on a. goodsID=benben.goodsID

group by benben.goodsID,month

) p )a

order by goodsID

奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析
奔奔資料分析

可以看到分别是排名3,4,8,9,10 都開始有大幅度的下降,而且仍舊有往下跌的趨勢,要對這幾個熱銷産品進行關注且分别對與對應的店家進行溝通做出補救措施,穩定熱銷單品的銷售,整體的結構并不穩定,除此之外還應關注排名第十之後的産品,對于一路走高的産品,合理擡高價格,牟取利潤。

描述性分析結束;

進入深入分析:

RFM:

目的:1.對使用者進行分群,對不同的使用者群體進行不同的營運政策

2.對該平台自身回報,明确目前平台定位,明确主要發展方向,明确主要服務群體。

RFM使用了兩種方法,通過對名額R,F,M的建構,

1并使用均值或者中位數作為門檻值進行分割,再将三列值組合在一起,進行打标簽

2.使用K-means算法,通過輪廓系數來進行取最優K。

奔奔資料分析

畫了金額的箱型圖,在普通數值上來看有很多的異常值,但是基于金額的自身屬性無法将其去除,則無法使用平均值作為門檻值,于是我們使用中位數來進行分割。

def rfm(self,data):
        
        
        data=data[['userID','payment','payTime','order']]
        payment=data.groupby(by='userID')['payment'].sum()
        
        print(payment.mean())
        print(payment.median())
        plt.boxplot(payment,vert=True)
        plt.show()      
        data=data.pivot_table(index='userID',values=['payTime','order','payment'],aggfunc={'payTime':'max','payment':'sum','order':'count'})
        # print(data)
        data.rename(columns={'payTime':'R','order':'F','payment':'M'},inplace=True)
        # print(pf)
        data['R']=(data['R'].max()-data['R']).dt.days
        pf=data.copy()
        pf['label']=pf[['R','F','M']].apply(lambda x: x-x.median()).apply(return_def,axis=1)
        
        d={
            '011':'重要價值客戶',
            '111':'重要喚回客戶',
            '001':'重要深耕客戶',
            '101':'重要挽留客戶',
            '010':'潛力客戶',
            '110':'一般維持客戶',
            '000':'新客戶',
            '100':'流失客戶',
        }
        pf=pf.replace({'label':d})
        print(pf)
        # # print(data)
        result=pf['label'].value_counts()
        print(result)
        sns.barplot(x=result.index,y=result.values)
        plt.show()
           
奔奔資料分析
奔奔資料分析

計算每一列的中位數,對其進行中位數的劃分,打标簽沿用網上通用的劃分方法得到以上結果

主要分析流失使用者和新客戶;

流失使用者:可以看到有接近2萬的使用者處于100狀态,對于這種使用者要差別對待,不能單單采取常用的發送郵件,短信推送。要去結合該流失使用者的主要群體特征分析,對于有相同特征的使用者群體提前進行預警,并且兩者對比分析,再進行流失使用者的召回,除此之外,完善使用者流失召回體制,以及輔助名額:客服接受投訴資訊,以及投訴電話,都可以作為先見型名額,對于流失進行提前預警。

新客戶:1.6萬的新使用者處于000的狀态,說明他們的金額,頻率都低于此次分析的中位數,而且可知,這1.6萬的使用者都是在下半年湧入的,對于新使用者進行同期群分析來看看,在不同的階段新使用者的留存和客單價的情況

K-means:

金額存在比較多的離群點:使用歸一化來縮放資料,則資料将更集中在均值附近。這是由于歸一化的縮放是“拍扁”統一到區間(僅由極值決定),而标準化的縮放是更加“彈性”和“動态”的,和整體樣本的分布有很大的關系。是以歸一化不能很好地處理離群值,而标準化對異常值的魯棒性強,在許多情況下,它優于歸一化。是以此次對資料标準化

K-means方法,先通過輪廓系數來确定最優的K值,然後計算中位數,通過對門檻值的分割之後進行打标簽。

df=data.copy()
        score_k=[]
        df = np.array(df.loc[:,['R','F','M']])
        # print(df)
        scale=StandardScaler()
        df=scale.fit_transform(df)
        # print(df)
        for i in range(2,10,1):
            k_result=KMeans(n_clusters=i,random_state=20)
            # df = np.array(df.loc[:,['R','F','M']])
            # print(data)
            k_result.fit(df)
            # print(k_result.inertia_)
            # score_k.append(k_result.inertia_)
            # print(k_result.labels_)
            print(silhouette_score(df,k_result.labels_))
            score_k.append(silhouette_score(df,k_result.labels_))
        
        k_result=KMeans(n_clusters=6,random_state=20)
        k_result.fit(df)
        center=k_result.labels_
        df=pd.DataFrame(df)
        df.rename(columns={'0':'R','1':'F','2':'M'},inplace=True)
        print(df)
        # print(center)
        df['index']=center


        center=pd.DataFrame(k_result.cluster_centers_,columns=['R','F','M'])


        center['label_name']=(center-center.median()).apply(return_def,axis=1)
        print(center)
        d={
            '011':'重要價值客戶',
            '111':'重要喚回客戶',
            '001':'重要深耕客戶',
            '101':'重要挽留客戶',
            '010':'潛力客戶',
            '110':'一般維持客戶',
            '000':'新客戶',
            '100':'流失客戶',
        }
        center=center.replace({'label_name':d})
        print(center)
        center=pd.DataFrame(center[['label_name']],columns=['label_name'])
        # print(center)
        center.reset_index(inplace=True)
        print(center)
        k_means_result=pd.merge(left=df,right=center,how='left',on='index')
        k_means_result=k_means_result['label_name'].value_counts()
        # # print(score_k)
        sns.barplot(x=k_means_result.index,y=k_means_result.values)
        # plt.xticks(range(len(k_means_result.index)),k_means_result.index)
        plt.show()
           
奔奔資料分析
奔奔資料分析
奔奔資料分析

得到6個聚類點,對于每列取中位數進行分割,按照組合進行打标簽。得到以上結果。

一共是6類可以看到其中有幾類都劃分為新使用者,是以K-means聚類實際隻有4種結果,可以看到主要還是新使用者和流失客戶的數量較多。

流失使用者:可以看到有2萬的使用者處于100狀态,對于這種使用者要差別對待,不能單單采取常用的發送郵件,短信推送。要去結合該流失使用者的主要群體特征分析,對于有相同特征的使用者群體提前進行預警,并且兩者對比分析,再進行流失使用者的召回,除此之外,完善使用者流失召回體制,以及輔助名額:客服接受投訴資訊,以及投訴電話,都可以作為先見型名額,對于流失進行提前預警。

新客戶:4.2萬的新使用者處于000的狀态,說明他們的金額,頻率都低于此次分析的中位數,而且可知,這4.2萬的使用者都是在下半年湧入的,對于新使用者進行同期群分析來看看,在不同的階段新使用者的留存和客單價的情況。

同期群分析;

同期群分析模型,是通過細分的方法,把同期的資料拿出來,比較相似群體随時間的變化

思路:找到每個使用者的最小購買時間并取出粒度為月份求和當作該月的新使用者,然後通過取到接下來每個月的相同的客戶計算占比,客單價等進行橫向縱向對比;

def better_anaylise(self,data):
        
        like=data.groupby(by='userID',as_index=False)['payTime'].min()
        like=pd.DataFrame(like)
        like['like_month']=pd.to_datetime(like['payTime']).dt.month
        first_buy=like.groupby(by='like_month')['payTime'].count()
        result_people=pd.DataFrame(index=range(1,13),columns=range(1,13),data=np.zeros((12,12)))
        result_atv=pd.DataFrame(index=range(1,13),columns=range(1,13),data=np.zeros((12,12)))
        for j in range(1,13):
            for i in range(j+1,13):    
                liucun_people=data[(data['userID'].isin(like[like['like_month']==j]['userID'])) & (data.month==i)]   
                people=liucun_people['userID'].unique().size 
                liucun_sum=data[(data['userID'].isin(like[like['like_month']==j]['userID'])) & (data.month==i)]   
                atv_payment=liucun_sum['payment'].sum()
                atv=round(atv_payment/people,0)
                result_atv.loc[j,i]=atv
                result_people.loc[j,i]=people
        result_people.loc[:,1]=first_buy
        print(result_people)
        
        result_people=round(result_people.loc[:,2:]/first_buy,5)
        for i in range(1,13):
            for j in range(i+1,13):
                result_people.loc[i,j]="%.2f%%" % (result_people.loc[i,j] * 100)
        print(result_people)
        print(result_atv)
        first_atv_month=[]
        for i in range(1,12):
            j=i+1
            # print(result_atv.loc[i,j])            
            first_atv_month.append(result_atv.loc[i,j])
        # print(first_atv_month)
        first_atv_month=pd.DataFrame(first_atv_month,columns=['month_new_atv'])
           

本次觀察新使用者留存,客單價情況,以上為同期群結果

此次計算的是新使用者在該電商平台的不同階段所呈現的占比情況,

縱向:可以看到随着時間的變化,産品對于新使用者的留存逐漸上升從3.31%,2.42%,逐漸上漲,以此可知,至少在新使用者這塊,該平台留存在逐漸的變好。

橫向:對于不同時期進來的新使用者我們可以看到最後基本都穩定在6.5%左右,而且因為資料有限(這隻是一張購買表),我們僅能知道,使用者在90天以後購買率還是逐漸上升的。說明使用者對于該産品的粘性還是比較大的。

特别的:可以看到在5-7月的時候新使用者留存都穩定在7.00%以上,在排除自然周期的情況下對他進行更詳細的排查,尋找優質人群和當時的産品特點與現在進行對比,進行小流量實驗,推往更多使用者群體。

對于客單價來說:可以看到有下降的趨勢,無論是從橫向還是縱向都處于下降的狀态,有公式客單價=總金額/總人數 在新使用者留存穩定上升的前提下,客單價下降,說明總金額應該是不高的,推測該産品初期進行了大量活動,例如首單減免,反複的薅羊毛導緻客單價大大拉低了平均客單價

奔奔資料分析
奔奔資料分析

建議:

1.争對不同的使用者群體,進行不同程度的刺激,結合RFM我們知道該平台目前主要集中為新使用者,關注整個新使用者的使用者流程,對使用者流程,提高轉化且對于新使用者首先要能迅速體驗到産品價值,并且在盡量降低使用者體驗的情況下,引導使用者下單購買

2.應該提高首單門檻,或者降低活動優惠對于反複享受活動的使用者應減少活動優惠的力度

流失周期:

流失周期指的就是如果使用者在這個時期内沒有進行活躍, 在這個流失周期左右的時間是我們最好去幹預使用者的時間,是以這個流失周期也是一個先見型名額,在使用者群體内我們可以知道有多少使用者處于流失周期内。

在此次分析裡,我們定義活躍為 購買行為,對于a客戶第一次購買之後再次購買的時間間隔,

分别取每個使用者購買的最小時間,再計算第二次,分别觀察整體平均值,中位數,90%分位數。

lost_time=data.groupby(by='userID')['payTime'].min()
        # print(lost_time)
        second_time=data[(data['userID'].isin(lost_time.index)) & (~data['payTime'].isin(lost_time.values))]

        second_time=second_time.groupby(by='userID')['payTime'].min()
        result=pd.merge(left=lost_time,right=second_time,how='inner',on='userID')
        print(result)
        result['distance']=(result['payTime_y']-result['payTime_x']).dt.days
        print(result['distance'].quantile(0.9))
        print(result['distance'].mean())
        print(result['distance'].median())
        plot_result=result['distance'].value_counts().sort_values(ascending=False)
        # print(plot_result)
        plt_plot=pd.DataFrame(plot_result)
        # plt_plot['占比']=plt_plot/plt_plot.sum()
        print(plt_plot)
        sns.lineplot(x=range(len(plot_result)),y=plot_result)
        plt.xticks(range(len(plot_result))[::10],list(plot_result)[::10],rotation=90)
        plt.show()
           
奔奔資料分析
奔奔資料分析

結果如上:我們采取中位數來作為流失周期的天數也就是97天,也就是說如果一個使用者在這個周期裡都沒有在這個周期内不活躍的話, 之後活躍的可能性也不高。是以我們就要盡可能在這個時間段來幹預使用者,引導使用者進行第二次購買。

具體的營運措施可以是:

1.根據不同的使用者群體計算更為精細的流失周期,通過不同的流失周期作為先見型名額,在使用者流失之前進行幹預。

2.基于不同的使用者群體群體可以做橫向對比:在一些比較重要的使用者群體即:具有重要價值的使用者流失周期可以進行減小,加強幹預能力,結合棄買率等反向名額進行優化。

總結:

1.整體來看:管道産品的結構都不穩定,存在斷層現象,應在保證超頭部管道産品穩定的情況下,提升其他優質管道産品,達到穩定金字塔的狀态,其次可以對0896管道及超頭部産品進行持續跟進,一邊深挖目标客戶的使用者進行複刻,一邊在這些大流量的管道和産品做小規模的探索實驗。

2.平台湧入大批量新使用者,新使用者複購率穩定上升,但是客單價逐漸減少,出現大量薅羊毛的客戶,建議提高首單價格,對于反複享受購買優惠的使用者應該降低其折扣力度。持續優化新使用者使用者流程,對于轉化率和絕對值進行追蹤,如何改進這塊,應該進行小流量實驗進行決策選擇。

3.先見型名額,流失周期的建立,以及完善流失使用者的召回機制,對于平台存在大量的流失使用者,要進行定期召回,并且分析,使用者流失是在哪一個環節,進行反向名額的建構,如棄買率,退貨率進行觀察。對其轉化率較低的環節進行優化調整。