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