【分析方法論】屬性對行為的影響分析

Ryan_Yang_發表於2017-04-19

一直感覺之所以學習R語言,是因為其程式碼編譯屬性可以複用,那麼在對R語言有初步認識後,需要更有效率的對工作有些幫助,現階段在進行使用者分析過程中,有些共性的方法,記錄之。

本文的題目很讓人頭疼,一來這塊只是一個經驗,所以談不上是從大方法下挖出來的一個部分,所以暫且定位屬性對行為的影響分析吧。

顧名思義,屬性對行為影響的分析,主要的因是屬性,而行為是果,換句話說,因為在兩類中有了比較顯著的屬性劃分,造成二者的行為有差異,那麼這個情況就適合這個方法論。

看起來還是有些晦澀,下面舉幾個應用的例子:
1. 汽車分手動擋和自動擋,這是汽車的屬性,那麼關於汽車的行為,就是維修時間、故障頻率、耗油等
2. 使用者分男女,這是使用者的屬性,那麼使用者的購買品類,比如男的是否更容易購買低單價的商品,女性是否容易購買高單價的產品?
3. 網站本身的屬性是頁面排版,在做灰度的時候,是否因為這兩種屬性的差異,導致了PV的變化?

上面幾個例子,看似就是簡單的T檢驗或迴歸,但是其中有很多細節需要處理,那麼下面就針對一個例子說明一下一般性的五步處理方法:

  1. 資料集處理:缺失值、因子轉換等
  2. 頻數分佈和頻率分佈,描述性統計
  3. 屬性和行為的假設檢驗
  4. 迴歸
  5. 具體分析業務

好像CSDN無法傳附件,直接把資料集展示:

  • sex city gmv type order
    男 上海市 158 玩具樂器 首單
    男 北京市 10 本地生活/旅遊出行 首單
    男 黃石市 27 食品飲料 首單
    男 黃石市 33 個護化妝 首單
    男 深圳市 639 電腦、辦公 首單
    男 福州市 160 食品飲料 首單
    男 福州市 224 電腦、辦公 首單
    男 福州市 224 電腦、辦公 首單
    男 福州市 306 酒類 首單
    男 東莞市 125 家用電器 首單
    男 北京市 70 個護化妝 首單
    男 北京市 152 食品飲料 首單
    男 北京市 99 本地生活/旅遊出行 首單
    男 遂寧市 104 醫藥保健 首單
    男 德州市 517 個護化妝 首單
    男 德州市 517 食品飲料 首單
    男 德州市 517 家用電器 首單
    男 德州市 72 食品飲料 首單
    男 成都市 148 圖書 首單
    男 成都市 148 圖書 首單
    男 成都市 148 圖書 首單
    男 廣州市 60 食品飲料 非首單
    男 江門市 120 食品飲料 非首單
    男 江門市 120 家居裝潢 非首單
    男 廣州市 149 家用電器 非首單
    男 深圳市 6085 電腦、辦公 非首單
    男 深圳市 6085 電腦、辦公 非首單
    男 瀋陽市 500 食品飲料 非首單
    男 瀋陽市 500 食品飲料 非首單
    男 瀋陽市 500 生鮮 非首單
    女 瀋陽市 500 家居裝潢 非首單
    女 瀋陽市 517 家用電器 非首單
    女 瀋陽市 119 醫藥保健 非首單
    女 瀋陽市 500 食品飲料 非首單
    女 瀋陽市 500 家用電器 非首單
    女 瀋陽市 34 圖書 非首單
    女 瀋陽市 517 家居裝潢 非首單
    女 瀋陽市 517 家用電器 非首單
    女 廣州市 5899 手機 非首單
    女 蘇州市 60 運動戶外 非首單
    女 衡陽市 95 電腦、辦公 非首單
    女 杭州市 3999 電腦、辦公 非首單
    女 杭州市 3999 電腦、辦公 非首單
    女 重慶市 115 個護化妝 非首單
    女 重慶市 115 個護化妝 非首單
    女 承德市 52 圖書 非首單
    女 承德市 52 個護化妝 非首單
    女 中山市 66 生鮮 未知
    女 成都市 856 醫藥保健 未知
    女 成都市 856 醫藥保健 未知

下面開始處理。

這個資料集是隨便編的,可以暫且認為是某網站的銷售資料詳單;其中的sex是性別,city是下單城市,gmv是訂單金額,type是品類,order是訂單類別。

下面進行第一步:資料預處理

由於我儲存到csv檔案到D盤,所以先開啟csv檔案,然後看各個列的屬性

t1<-read.csv('D:\\R study\\test.csv',stringsAsFactors = F)
str(t1)
t2<-transform(t1,sex=as.factor(sex),
              city=as.factor(city),
              type=as.factor(type),
              order=as.factor(order))
str(t2)

首先先讀取這個csv檔案,我放在了D:\R study\test.csv這個地方,同時一般情況下都先把因子變成字元,也就是Stringsasfactors=F;

然後對於幾個變數進行因子轉換,先用str函式看看各項指標的類別:

str(t1)
'data.frame':   50 obs. of  5 variables:
 $ sex  : chr  "男" "男" "男" "男" ...
 $ city : chr  "上海市" "北京市" "黃石市" "黃石市" ...
 $ gmv  : int  158 10 27 33 639 160 224 224 306 125 ...
 $ type : chr  "玩具樂器" "本地生活/旅遊出行" "食品飲料" "個護化妝" ...
 $ order: chr  "首單" "首單" "首單" "首單" ...

看到除了GMV是整數以外,其他的都是字元;

因為針對性別、城市、品類和下單屬性,後續會進行分類彙總,所以需要轉化為t2,轉化後的情況如下:

str(t2)
'data.frame':   50 obs. of  5 variables:
 $ sex  : Factor w/ 2 levels "男","女": 1 1 1 1 1 1 1 1 1 1 ...
 $ city : Factor w/ 18 levels "北京市","成都市",..: 12 1 10 10 13 6 6 6 6 5 ...
 $ gmv  : int  158 10 27 33 639 160 224 224 306 125 ...
 $ type : Factor w/ 13 levels "本地生活/旅遊出行",..: 11 1 8 3 2 8 2 2 6 5 ...
 $ order: Factor w/ 3 levels "非首單","首單",..: 2 2 2 2 2 2 2 2 2 2 ...

可以看到,其他四個變數都是factor了。

然而,針對order變數,我們只是想要看是否為首單使用者,但是看到:

levels(factor(t2$order))
[1] "非首單" "首單"   "未知"  

還有一個未知的種類,雖然在實際過程中,這個種類從SQL推出來的要麼是NULL,要麼匯入R中變成了NA,那麼需要刪除不想要的行:

t3<-subset(t2,order=='首單'|order=='非首單')

下面開始第二部:描述性頻數和相對頻率的分析。

R中最吸引人的就是作圖,同時,在以前,作圖是一個結果而非過程,比如在excel中,最後形成的圖形是為了放在ppt中展示的,所以一般已經有了一些預設的結論,而R中,個人傾向於利用圖形來解釋資料,不是給別人看的,就是給自己看的圖。那麼一般對於大資料來說(R中一般處理500W左右的資料還OK),描述性統計的圖形是一個很好的方法迅速瞭解資料情況。下面開始。

首先,可以利用summary函式粗略的看下各引數的分佈:

summary(t3)
 sex          city         gmv                 type       order:30   瀋陽市 :11   Min.   :  10.0   食品飲料  :10   非首單:26:17   北京市 : 4   1st Qu.: 101.5   電腦、辦公: 8   首單  :21  
         德州市 : 4   Median : 152.0   個護化妝  : 6   未知  : 0  
         福州市 : 4   Mean   : 768.2   家用電器  : 6              
         成都市 : 3   3rd Qu.: 508.5   圖書      : 5              
         廣州市 : 3   Max.   :6085.0   家居裝潢  : 3              
         (Other):18                    (Other)   : 9       

可以看到男的有30個、女的有17個,包括GMV的均值是700多,最大值是6000多,購買食品飲料品類的使用者最多等資訊。但是summary函式的各列都是孤立存在的,如果想要很直觀的判斷幾個變數間的差異,需要藉助圖形。

下面利用ggplot2包進行分析:

library(ggplot2)
ggplot(data=t3)+geom_bar(aes(x=type,y=..count..,fill=sex),stat='count',position='dodge')+
  labs(x='品類',y='個數')

這裡寫圖片描述
可有看到食品飲料品類上,男女差異最大。

但是仔細看就會想起來,本身男性性別的觀測數量就比女性要多,所以應該看相對差異,也就是按照男女的資料條數進行權重彙總,然後重新進行柱狀圖的繪製,在這裡新建一列(應該會有更容易的做法),並彙總,用到sqldf包,如下程式碼:

library(sqldf)

t3$weightsex<-as.numeric(as.character(factor(t3$sex,labels=c(1,30/17))))

t4<-sqldf('select type,sex,weightsex,sum(weightsex) as weight from t3 group by type,sex')

ggplot(data=t4)+geom_bar(aes(x=type,y=weight,fill=sex),stat='identity',position='dodge')

首先載入sqldf這個sql包,然後把原來的那一列性別的轉化為數字,本例中通過summary函式可以看到有30個男性觀測資料,17個女性觀測資料,如果按照權重來看,男性如果為1,女性為30/17(每一條觀測都是如此),然後先對factor進行character的轉化,然後再轉化為數字,可計算;

接下來新建一個資料集,就是按照權重加總和品類的資料集,如下:

t4
                type sex weightsex   weight
1           個護化妝  女  1.764706 5.294118
2           個護化妝  男  1.000000 3.000000
3           醫藥保健  女  1.764706 1.764706
4           醫藥保健  男  1.000000 1.000000
5               圖書  女  1.764706 3.529412
6               圖書  男  1.000000 3.000000
7           家居裝潢  女  1.764706 3.529412
8           家居裝潢  男  1.000000 1.000000
9           家用電器  女  1.764706 5.294118
10          家用電器  男  1.000000 3.000000
11              手機  女  1.764706 1.764706
12 本地生活/旅遊出行  男  1.000000 2.000000
13          玩具樂器  男  1.000000 1.000000
14              生鮮  男  1.000000 1.000000
15        電腦、辦公  女  1.764706 5.294118
16        電腦、辦公  男  1.000000 5.000000
17          運動戶外  女  1.764706 1.764706
18              酒類  男  1.000000 1.000000
19          食品飲料  女  1.764706 1.764706
20          食品飲料  男  1.000000 9.000000

然後進行ggplot圖形的繪製,圖形如下:

這裡寫圖片描述

按照這個圖形和上述圖形比較,其實電腦辦公品類上,加入了權重的影響後,看到男性的數量反而沒有女性多,但是食品飲料這個品類仍然差距最多;

在實際過程中,往往資料量很大,所以應該選擇差距最大的幾組資料,那麼另建一列並排序,進行篩選;這裡用到reshape包,但是我認為應該會有更簡單的方法。

library(reshape2)
t5<-cast(t4,type~sex,value='weight')
t5[is.na(t5)]<-0
t5$dif<-t5$男-t5$女

其中先把t4進行整形,然後新加一列,這一列計算同樣type的差值,然後發現會有NA值,把NA值變成0,t5如下:

t5
                type 男       女        dif
1  本地生活/旅遊出行  2 0.000000  2.0000000
2         電腦、辦公  5 5.294118 -0.2941176
3           個護化妝  3 5.294118 -2.2941176
4           家居裝潢  1 3.529412 -2.5294118
5           家用電器  3 5.294118 -2.2941176
6               酒類  1 0.000000  1.0000000
7               生鮮  1 0.000000  1.0000000
8           食品飲料  9 1.764706  7.2352941
9               手機  0 1.764706 -1.7647059
10              圖書  3 3.529412 -0.5294118
11          玩具樂器  1 0.000000  1.0000000
12          醫藥保健  1 1.764706 -0.7647059
13          運動戶外  0 1.764706 -1.7647059

其中的dif就是差值,然後就可以針對差值最大的和最小的進行排序,篩選出最大和最小的5個,然後作圖,程式碼如下:

t6.1<-melt(head(t5[order(t5$dif,decreasing=T),],5),id.vars=type)
ggplot(t6.1)+geom_bar(aes(x=type,y=value,fill=sex),stat='identity',position='dodge')
t6.2<-melt(tail(t5[order(t5$dif,decreasing=T),],5),id.vars=type)
ggplot(t6.2)+geom_bar(aes(x=type,y=value,fill=sex),stat='identity',position='dodge')

男性比女性購買頻率相差最大的品類

女性比男性購買頻率相差最大的品類

如果我們認為食品飲料,生活旅行等是男女差異最大的話,結果是不是這樣呢?這裡需要進行統計學檢驗從而進行下一步分析;這裡採用方差分析。

第三步:方差分析

t6<-melt(t5,id.vars=type)
fit1<-aov(value~sex+type,data=t6)
summary(fit1)

看到

Df Sum Sq Mean Sq F value Pr(>F)
sex          1   0.00   0.000   0.000  1.000
type        12  83.27   6.939   1.995  0.123
Residuals   12  41.73   3.477               

P值均不小於0.1,說明針對性別和品類,購買頻率沒有顯著差異;其實到這裡,這個維度的分析已經結束,因為我們看到方差分析的結果是不同性別的購買頻次沒有差異,也就是很大程度上都是統計的隨機差異;

但是既然到這裡了,補充針對原始資料進行方差分析,看看gmv和各類城市的差異:

summary(fit2)
            Df   Sum Sq Mean Sq F value   Pr(>F)    
sex          1  1479816 1479816   140.6 3.17e-10 ***
city        17 77883546 4581385   435.3  < 2e-16 ***
type        10 18059262 1805926   171.6  < 2e-16 ***
order        2 19986472 9993236   949.4  < 2e-16 ***
Residuals   19   199989   10526                     
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

這塊看到雖然購物頻率沒有差異,但是GMV,也就是購買的金額,在城市、類別和是否為首次購買都有很大差異;

如果最終需要給業務部門提出建議,比如市場擴充在哪個城市,既然有顯著差異,那麼看看具體的解釋和應用:

第一種可能:提供兩兩比較的解釋
假設現在有兩個部門爭論不休,分別是北京和深圳,看需要哪裡的資源投入更大,需要看這兩個城市的消費潛力,通過如下程式碼:

fit4<-TukeyHSD(fit3)
fit4$city[which(row.names(fit4$city)=='深圳市-北京市'),]

上面是按照Tukey方法看均值差異,後面擷取深圳和北京的差異的一行,看到結果是:

diff          lwr          upr        p adj 
4.186917e+03 8.277443e+02 7.546089e+03 4.658191e-03 

最後的調整P值看到北京和深圳的GMV有顯著差異,差異在diff下,是4200的GMV均值,最大可以達到7546的差異,所以既然深圳的GMV高於北京這麼多,如果投入相同的資源,也許深圳的GMV比北京發展要更好。

第二種可能:判斷市場方向:

判斷整個市場,就需要對所有的城市GMV進行比較,按照GMV的均值先排序看看:

attach(t2)
t2.1<-aggregate(gmv,by=list(city),FUN=mean)
t2.1[order(t2.1$x,decreasing=T),]

看到:

 Group.1         x
13  深圳市 4269.6667
8   杭州市 3999.0000
7   廣州市 2036.0000
2   成都市  431.2000
14  瀋陽市  427.6364
4   德州市  405.7500
6   福州市  228.5000
12  上海市  158.0000
5   東莞市  125.0000
11  江門市  120.0000
18  重慶市  115.0000
16  遂寧市  104.0000
9   衡陽市   95.0000
1   北京市   82.7500
17  中山市   66.0000
15  蘇州市   60.0000
3   承德市   52.0000
10  黃石市   30.0000

深圳的GMV最高,那麼是不是有顯著差異呢?

library(multcomp)
fit5<-glht(fit3,linfct=mcp(city='Tukey'))
par(mar=c(5,4,6,2))
plot(cld(fit5,level=.05),col='grey')

利用multcomp包,對城市採用95%置信區間的均值比較,採用Tukey方法,結果如下:
這裡寫圖片描述

圖形上方有相同的字母的組差異不顯著,看到深圳和廣州這個例子來看,深圳和上海差異不顯著,但是和北京、成都、瀋陽等差異均顯著;同時,廣州幾乎和所有城市差異均不顯著;

但是我們仍可以得出結論,深圳相對來說是一個比較良好的市場,使用者的GMV貢獻最多。

最後梳理下方法步驟:

**1. 清洗資料,處理缺失值、轉化因子等
2. 先看描述性統計結果,在不同的屬性下,看各類行為的表現,包含不限於和、頻率、均值、分位數等,儘可能掌握資料整體情況 ,並進行圖形化分析展示
3. 初步針對屬性對行為影響較高,或希望繼續分析的部分進行詳細分析,應用的方法包括不限於方差分析、t檢驗、迴歸模型等
4. 進行模型解釋,反饋到業務**

以上的方法適用於已經進行屬性分好類的情況,比如使用者已經分了男女、年輕層等,分類是個因子變數,從已經分好類上來看行為的差異,最後給出針對不同行為的分析,反饋業務;

但是現實過程中,很多屬性下的行為有一定的一致性,這就涉及到聚類、主成分提取等方法先確認分類,這塊有時間梳理清楚了再研究下。

相關文章