言做雙十一銷(xiāo)售數(shù)據(jù)分析:從數(shù)據(jù)清洗到可視化實(shí)戰(zhàn))
簡(jiǎn)介雙十一銷(xiāo)售數(shù)據(jù)分析是R語(yǔ)言入門(mén)的經(jīng)典實(shí)戰(zhàn)場(chǎng)景。這套資源為R語(yǔ)言學(xué)習(xí)者、數(shù)據(jù)分析初學(xué)者以及需要完成課程設(shè)計(jì)/大作業(yè)的學(xué)生提供了一條完整分析鏈路從數(shù)據(jù)導(dǎo)入、缺失值與異常值清洗到基于dplyr的篩選分組匯總再到線性回歸探索銷(xiāo)售影響因素、forecast包進(jìn)行時(shí)間序列預(yù)測(cè)并通過(guò)ggplot2制作折線圖、散點(diǎn)圖與箱線圖等可視化圖表。壓縮包共5個(gè)文件包含csv銷(xiāo)售數(shù)據(jù)集、R腳本、RData數(shù)據(jù)文件、Rhistory命令歷史以及doc說(shuō)明文檔總大小18.07MB結(jié)構(gòu)簡(jiǎn)潔清晰。說(shuō)明文檔梳理了項(xiàng)目目標(biāo)、方法流程和最終結(jié)論讀者可對(duì)照R腳本與數(shù)據(jù)文件完整復(fù)現(xiàn)也可借用其中的建模思路遷移到其他電商數(shù)據(jù)分析場(chǎng)景。目前已有8043人學(xué)習(xí)/下載內(nèi)容難度適中適合想在真實(shí)銷(xiāo)售數(shù)據(jù)上快速上手R語(yǔ)言統(tǒng)計(jì)建模和數(shù)據(jù)可視化的初學(xué)者。 每年雙十一一過(guò)運(yùn)營(yíng)和市場(chǎng)部就會(huì)扔過(guò)來(lái)一堆銷(xiāo)售數(shù)據(jù)問(wèn)的問(wèn)題基本都一樣今年賣(mài)得怎么樣哪個(gè)品爆發(fā)了用戶都是誰(shuí)這些問(wèn)題聽(tīng)起來(lái)簡(jiǎn)單但真拿R語(yǔ)言處理起來(lái)從數(shù)據(jù)清洗到可視化每個(gè)環(huán)節(jié)都有不少講究。我今年用R語(yǔ)言完整地跑了一遍雙十一銷(xiāo)售數(shù)據(jù)分析從訂單明細(xì)到用戶分層再到商品結(jié)構(gòu)今天把整個(gè)分析流程和踩過(guò)的坑都整理出來(lái)。這篇文章適合剛接觸R語(yǔ)言數(shù)據(jù)分析的人也適合已經(jīng)會(huì)用dplyr和ggplot2但想看看別人怎么組織分析思路的讀者。我不會(huì)堆砌一堆復(fù)雜的模型而是從一個(gè)真實(shí)可落地的分析框架出發(fā)把銷(xiāo)售數(shù)據(jù)常見(jiàn)的分析維度、R語(yǔ)言實(shí)現(xiàn)方式以及實(shí)際操作中容易忽略的細(xì)節(jié)都講清楚。1. 雙十一數(shù)據(jù)到手后先別急著建模把業(yè)務(wù)問(wèn)題拆清楚拿到銷(xiāo)售數(shù)據(jù)的第一件事不是打開(kāi)RStudio就開(kāi)始寫(xiě)代碼而是先想明白一個(gè)問(wèn)題這份數(shù)據(jù)到底要回答什么。雙十一的數(shù)據(jù)分析如果只輸出一張總銷(xiāo)售額的數(shù)字那基本等于沒(méi)做。運(yùn)營(yíng)真正關(guān)心的是結(jié)構(gòu)銷(xiāo)售額由什么構(gòu)成、流量進(jìn)來(lái)了多少變成了購(gòu)買(mǎi)、哪些商品撐起了大盤(pán)、哪些用戶貢獻(xiàn)了核心收入。所以我在動(dòng)手之前會(huì)先列一個(gè)分析框架把數(shù)據(jù)拆成幾個(gè)層面整體層面總銷(xiāo)售額、總訂單量、客單價(jià)、支付轉(zhuǎn)化率的變化趨勢(shì)。商品層面哪些SKU是爆款哪些是長(zhǎng)尾各品類對(duì)銷(xiāo)售額的貢獻(xiàn)占比。用戶層面新老客比例、復(fù)購(gòu)情況、不同消費(fèi)層級(jí)用戶的貢獻(xiàn)分布。時(shí)間層面大促期間的銷(xiāo)售節(jié)奏是開(kāi)局爆發(fā)還是尾段沖高不同時(shí)段轉(zhuǎn)化率差異。渠道層面如果數(shù)據(jù)里有渠道字段可以進(jìn)一步拆解不同渠道的轉(zhuǎn)化效率和客單價(jià)差異。這個(gè)框架定下來(lái)之后再回頭去看手頭的數(shù)據(jù)文件。通常從電商后臺(tái)導(dǎo)出的數(shù)據(jù)會(huì)包含訂單編號(hào)、下單時(shí)間、支付時(shí)間、商品ID、商品名稱、類目、數(shù)量、單價(jià)、實(shí)付金額、用戶ID、省份城市等字段。雙十一的數(shù)據(jù)量級(jí)一般不會(huì)太小幾萬(wàn)到幾十萬(wàn)行的訂單明細(xì)都很正常千萬(wàn)級(jí)別才會(huì)需要考慮用data.table或數(shù)據(jù)庫(kù)方案。R語(yǔ)言處理這個(gè)量級(jí)的數(shù)據(jù)tidyverse這套組合完全夠用。字段確認(rèn)完之后還有一個(gè)關(guān)鍵動(dòng)作是同步業(yè)務(wù)口徑。不同平臺(tái)導(dǎo)出的數(shù)據(jù)在字段定義上差異很大比如“實(shí)付金額”有的含運(yùn)費(fèi)有的不含有的包含退款訂單有的不包含。今年的數(shù)據(jù)里有明顯的未支付訂單和退款訂單如果不提前過(guò)濾掉后面所有聚合結(jié)果都會(huì)失真。我習(xí)慣在分析前先和數(shù)據(jù)提供方確認(rèn)好口徑如果沒(méi)有條件確認(rèn)就在代碼里通過(guò)訂單狀態(tài)字段做過(guò)濾并且在結(jié)果報(bào)告里明確注明統(tǒng)計(jì)口徑。2. 數(shù)據(jù)清洗與字段工程這里花的每一分鐘都在給后面的分析省時(shí)間很多初學(xué)者拿到數(shù)據(jù)之后第一件事就是算總銷(xiāo)售額結(jié)果發(fā)現(xiàn)數(shù)字和后臺(tái)對(duì)不上原因就出在清洗環(huán)節(jié)。雙十一銷(xiāo)售數(shù)據(jù)的臟數(shù)據(jù)來(lái)源非常典型值得單獨(dú)拿出來(lái)說(shuō)。2.1 讀取階段就要處理的編碼與類型問(wèn)題從電商平臺(tái)導(dǎo)出的CSV文件最常見(jiàn)的問(wèn)題就是中文亂碼和字段類型識(shí)別錯(cuò)誤。R語(yǔ)言里用read.csv()讀取時(shí)我一般會(huì)加上fileEncoding UTF-8或GBK具體看導(dǎo)出系統(tǒng)用的什么編碼。Windows系統(tǒng)導(dǎo)出的文件很多是GBKmacOS和Linux下通常是UTF-8。判斷方法很簡(jiǎn)單用文本編輯器打開(kāi)原始文件看中文是否正常顯示如果亂碼就換個(gè)編碼試試。字段類型問(wèn)題更隱蔽。訂單號(hào)、用戶ID這類字段如果超過(guò)15位或者包含字母會(huì)被自動(dòng)識(shí)別成數(shù)值型導(dǎo)致精度丟失。我見(jiàn)過(guò)有人因?yàn)橛脩鬒D被轉(zhuǎn)成科學(xué)計(jì)數(shù)法導(dǎo)致去重后人數(shù)少了一大截。解決辦法是在讀取時(shí)直接用colClasses參數(shù)指定列類型orders - read.csv(double11_orders.csv, fileEncoding UTF-8, colClasses c(order_id character, user_id character, product_id character))2.2 時(shí)間字段的標(biāo)準(zhǔn)化處理雙十一數(shù)據(jù)的時(shí)間字段有下單時(shí)間和支付時(shí)間兩個(gè)這兩個(gè)字段都有坑。下單時(shí)間可能是用戶加入購(gòu)物車(chē)后很久才支付的也可能是預(yù)售訂單最后一天付尾款。我在分析時(shí)一般以支付時(shí)間為準(zhǔn)因?yàn)橹挥兄Ц读瞬潘阏娴匿N(xiāo)售額。R語(yǔ)言處理時(shí)間用lubridate包非常順手library(lubridate) orders$pay_time - ymd_hms(orders$pay_time) orders$pay_hour - hour(orders$pay_time) orders$pay_date - date(orders$pay_time)這里有個(gè)細(xì)節(jié)值得注意如果數(shù)據(jù)包含雙十一前后幾天的時(shí)間記錄需要先過(guò)濾出11月11日當(dāng)天的數(shù)據(jù)還是把預(yù)熱期也算進(jìn)去這取決于你要分析什么。如果是看大促整體的銷(xiāo)售節(jié)奏就保留11月10日晚8點(diǎn)到11月12日凌晨的完整數(shù)據(jù)如果只關(guān)注雙十一當(dāng)天的爆發(fā)情況就過(guò)濾出11月11日0點(diǎn)到23點(diǎn)59分。我通常會(huì)保留完整時(shí)間段然后通過(guò)時(shí)間字段做動(dòng)態(tài)篩選這樣同一個(gè)分析腳本既能看全天節(jié)奏也能看分時(shí)段表現(xiàn)。2.3 訂單狀態(tài)、異常值與邏輯校驗(yàn)雙十一訂單數(shù)據(jù)里至少要處理三類異常未支付訂單很多用戶下單后沒(méi)有付款這些單子不會(huì)產(chǎn)生真實(shí)銷(xiāo)售額必須剔除。退款訂單大促后退貨率普遍偏高如果數(shù)據(jù)里有退款狀態(tài)標(biāo)記需要謹(jǐn)慎處理。我的做法是做一個(gè)“是否包含退款”的開(kāi)關(guān)跑核心指標(biāo)時(shí)用不含退款的凈銷(xiāo)售額跑運(yùn)營(yíng)分析時(shí)用含退款的下單金額兩個(gè)口徑都跑一遍看差異。測(cè)試訂單和超低價(jià)訂單金額為0或異常的訂單極可能是測(cè)試單需要按金額閾值過(guò)濾。比如實(shí)付金額低于1元的訂單基本都可以判定為無(wú)效數(shù)據(jù)。我用dplyr處理這些邏輯非常順手library(dplyr) clean_orders - orders %% filter(order_status paid) %% filter(refund_status ! refunded) %% filter(pay_amount 1)除了這些顯性的異常還有一個(gè)經(jīng)常被忽略的校驗(yàn)步驟單價(jià)乘以數(shù)量是否等于訂單金額。很多系統(tǒng)在促銷(xiāo)時(shí)會(huì)拆單一個(gè)訂單拆成多個(gè)子訂單或者有滿減分?jǐn)傔壿媽?dǎo)致明細(xì)行的金額之和與訂單總金額對(duì)不上。我一般會(huì)做一個(gè)字段校驗(yàn)clean_orders - clean_orders %% mutate(calc_amount unit_price * quantity) %% mutate(amount_diff abs(calc_amount - pay_amount))如果amount_diff的分布太大說(shuō)明有滿減或優(yōu)惠券分?jǐn)傔壿嬤@時(shí)候就不能簡(jiǎn)單用單價(jià)乘數(shù)量而是直接用訂單級(jí)別的實(shí)付金額避免重復(fù)計(jì)算。2.4 衍生變量從原始字段里挖出更多分析維度清洗完成之后為了讓后續(xù)分析更順暢我會(huì)先構(gòu)建一批衍生變量。這些變量看起來(lái)簡(jiǎn)單但能省掉后面大量重復(fù)的group_by邏輯clean_orders - clean_orders %% mutate(order_value_group case_when( pay_amount 100 ~ 低客單, pay_amount 500 ~ 中客單, pay_amount 500 ~ 高客單 )) %% group_by(user_id) %% mutate(user_order_count n()) %% mutate(is_new_user ifelse(user_order_count 1, 新客, 老客)) %% ungroup()這里要特別注意is_new_user的判定邏輯。如果用的是當(dāng)天數(shù)據(jù)只能判斷當(dāng)天是否首購(gòu)如果要判斷真正意義上的新老客得聯(lián)合歷史訂單數(shù)據(jù)。如果沒(méi)有歷史數(shù)據(jù)建議在報(bào)告里注明這是“當(dāng)日新客”避免誤導(dǎo)。3. 四個(gè)必做的核心分析維度從銷(xiāo)售額表象拆到業(yè)務(wù)歸因數(shù)據(jù)干凈了字段也準(zhǔn)備好了這時(shí)候才開(kāi)始真正的分析。以下四個(gè)維度是我每次做雙十一分析都會(huì)做的每一步都對(duì)業(yè)務(wù)有直接指導(dǎo)意義不是那種“為了分析而分析”的花架子。3.1 分鐘級(jí)和小時(shí)級(jí)的銷(xiāo)售節(jié)奏分析雙十一的銷(xiāo)售節(jié)奏和其他大促完全不同。從開(kāi)場(chǎng)爆發(fā)到尾段沖刺每個(gè)時(shí)段的意義都不一樣。把支付時(shí)間聚合成小時(shí)級(jí)數(shù)據(jù)能清晰看到全天的銷(xiāo)售曲線hourly_sales - clean_orders %% group_by(pay_hour) %% summarise( orders n(), sales sum(pay_amount, na.rm TRUE) ) %% arrange(pay_hour)這張表輸出之后我一般會(huì)再去算每個(gè)小時(shí)的客單價(jià)和訂單量占比找到“高峰期走量”“低谷期走客單價(jià)”的規(guī)律。比如今年我看到的情況是凌晨0點(diǎn)到1點(diǎn)是第一波爆發(fā)訂單量全天的20%左右客單價(jià)卻很低說(shuō)明大家都在搶預(yù)售和秒殺品上午10點(diǎn)到12點(diǎn)是第二波高峰客單價(jià)開(kāi)始回升晚上20點(diǎn)到23點(diǎn)是最后的沖刺很多用戶趕在結(jié)束前下單。這個(gè)節(jié)奏分析可以直接指導(dǎo)運(yùn)營(yíng)復(fù)盤(pán)比如流量投放的時(shí)段分配、客服排班的合理性、庫(kù)存補(bǔ)貨的時(shí)間節(jié)點(diǎn)。3.2 商品維度的爆款識(shí)別與庫(kù)存分析商品維度的分析核心是找到“二八法則”里的那個(gè)二。把銷(xiāo)售額按商品聚合排序計(jì)算累計(jì)占比就能看到頭部商品對(duì)整個(gè)大盤(pán)的貢獻(xiàn)product_sales - clean_orders %% group_by(product_id, product_name) %% summarise( sales sum(pay_amount, na.rm TRUE), quantity sum(quantity, na.rm TRUE), orders n() ) %% arrange(desc(sales)) %% mutate(cum_sales cumsum(sales), cum_pct cum_sales / sum(sales) * 100)跑完這個(gè)之后我習(xí)慣把所有商品按銷(xiāo)售額分成三個(gè)層級(jí)頭部爆款前5%的商品貢獻(xiàn)約50%銷(xiāo)售額這些商品要確認(rèn)庫(kù)存是否充足有沒(méi)有補(bǔ)貨空間。腰部商品貢獻(xiàn)約30%-40%銷(xiāo)售額這些是潛力款可以繼續(xù)做關(guān)聯(lián)推薦。尾部長(zhǎng)尾數(shù)量多但單款貢獻(xiàn)小分析這些商品是否有清倉(cāng)需求是否浪費(fèi)了展示位。商品維度還有一個(gè)重要的角度是價(jià)格帶分布。把商品按照支付金額分桶看哪個(gè)價(jià)格區(qū)間的商品銷(xiāo)量最高、哪個(gè)區(qū)間銷(xiāo)售額貢獻(xiàn)最大。這比單純看爆款更有業(yè)務(wù)價(jià)值因?yàn)閮r(jià)格帶分析能直接指導(dǎo)后續(xù)的選品和定價(jià)策略。3.3 用戶維度新老客、消費(fèi)層級(jí)和復(fù)購(gòu)用戶分析這塊我一般從三個(gè)角度切第一是新老客結(jié)構(gòu)。大促期間通常拉新效果明顯但新客的轉(zhuǎn)化率和客單價(jià)往往低于老客。把用戶分成新老客之后對(duì)比兩個(gè)群體的客單價(jià)和訂單數(shù)量能看出這次大促是“拉新成功但收割不夠”還是“老客復(fù)購(gòu)強(qiáng)勁”。第二是消費(fèi)層級(jí)分布。把用戶按支付金額分層看高價(jià)值用戶的占比和貢獻(xiàn)。這里我會(huì)用到分位數(shù)user_value - clean_orders %% group_by(user_id) %% summarise(total_paid sum(pay_amount, na.rm TRUE)) %% mutate(level case_when( total_paid quantile(total_paid, 0.25) ~ 低消費(fèi), total_paid quantile(total_paid, 0.75) ~ 中消費(fèi), TRUE ~ 高消費(fèi) ))第三是復(fù)購(gòu)行為。雙十一的復(fù)購(gòu)分析要區(qū)分“同一個(gè)用戶購(gòu)買(mǎi)多個(gè)商品”和“同一個(gè)sku重復(fù)購(gòu)買(mǎi)”前者代表連帶銷(xiāo)售能力強(qiáng)后者代表囤貨行為明顯。通過(guò)統(tǒng)計(jì)單用戶購(gòu)買(mǎi)次數(shù)分布可以看到有多少用戶只是買(mǎi)了一件就離開(kāi)有多少用戶產(chǎn)生了多單購(gòu)買(mǎi)。3.4 品類連帶銷(xiāo)售與結(jié)構(gòu)變化如果數(shù)據(jù)里有類目字段建議做一次品類維度的交叉分析。具體做法是找出每個(gè)訂單里同時(shí)出現(xiàn)的品類組合統(tǒng)計(jì)常見(jiàn)搭配。R語(yǔ)言里處理這種“訂單內(nèi)商品組合”問(wèn)題可以用split和lapply組合也可以把訂單明細(xì)按訂單ID展開(kāi)后做自連接library(tidyr) order_pairs - clean_orders %% select(order_id, category) %% distinct() %% group_by(order_id) %% mutate(item_id row_number()) %% pivot_wider(names_from item_id, values_from category)品類連帶分析的結(jié)果能直接用在客服話術(shù)優(yōu)化、推薦位調(diào)整和跨品類優(yōu)惠券發(fā)送上。比如今年我發(fā)現(xiàn)某個(gè)美妝品牌的兩款產(chǎn)品在同一訂單中出現(xiàn)的概率非常高這個(gè)信息給到運(yùn)營(yíng)之后他們直接把這兩款產(chǎn)品做成了捆綁套裝。4. ggplot2可視化呈現(xiàn)讓銷(xiāo)售數(shù)據(jù)自己會(huì)說(shuō)話分析做完之后最關(guān)鍵的環(huán)節(jié)是呈現(xiàn)。一堆數(shù)字表格沒(méi)人愿意看但三張圖就能把信息講清楚。我用的可視化工本文還有配套的精品資源點(diǎn)擊獲取