尋找零售密碼 | 神奇的黃氏曲線與單位權重值曲線趣析(附 Python 實現)

在這裏插入圖片描述

引言

  筆者在商場購物時,無意聽見某潮牌店員工們的對話 “上一個月拼得太猛了,現在月初我想放鬆一下…” “對,是該好好放鬆了,上個月底前的一段時間我的分店就完成了銷售任務,就提前放鬆啦,達標了還那麼拼的話,本月銷售做得太多下月目標就會被老闆拔高”。

  上面這兩種情況在零售行業被稱爲 “月初放鬆 & 月末踩剎車(零售業術語)”,這兩種現象對銷售最大化都是一種傷害,零售業的銷售額是靠大家每天不斷的努力和辛苦付出換來的(怎麼感覺自己像個傳銷…),總之出現了類似心態的化管理者也有原因,根據利他思維,一個不懂得爲員工們考慮的老闆只希望員工瘋狂幹活,在薪酬和福利上又拼命剝削,員工出現這樣的心理也很正常。另外,以下幾種幼稚但人之常情的原因也可導致銷售額數據異常

  • 發現月底根本完不成目標,於是提前給自己判刑,不再努力了。
  • 店鋪員工藏銷售,本該本月錄入系統的銷售,人爲轉移到下月初才錄入系統
  • 親自採訪筆者堂哥的妻子,在老家珠寶店做銷售,發現月末完不成了,店鋪內的員工便合夥用自己的錢購買,下月初纔將虛增部分做退貨處理
  • 店員賺黑心錢,顧客沒有會員卡,店員用自己開的會員卡進行結賬,然後把差價收入自己的囊中,我恨

  上面這幾段引出了神奇的黃氏曲線——單位權重(銷售)值曲線的其中一個經典作用:追蹤銷售過程,當然這神奇的曲線還可用到促銷活動的分析及評估,特殊事件量化處理,新品上市的分析及評估,評估對手等。單位權重這種概念屬於零售業中比較精細化的管理概念,要想使用好這些概念,首要的條件是必須精通業務,所以需要分析師們多去業務現場。事不宜遲,快開始!(文末有精彩延伸)

趙四跳舞

  當然,在正式開始本博文的閱讀前,我們最好已經熟悉以下密碼的獲得方式,當然,直接開始也沒問題。尋找零售密碼 | Python 實現周權重指數計算&可視化

單位權重(銷售)值曲線

  直接拿週一的銷售值與週六對比顯然不合理,畢竟週六大家下班了,休息了,有時間出來玩了,銷售額比周一要高也在情理之中,除非你是週末休息的寫字樓和一些特殊的奢侈品店。但只要我們在比較時將兩者都除以它對應的日權重,效果就會好很多:高銷售額÷高權重 VS 中銷售額÷中權重 VS 低銷售額÷低權重 ,這麼一看合理多了。

把每一天的銷售額分別除以當日的權重指數,就變成了單位權重(銷售)值曲線了
在這裏插入圖片描述

  所以銷售額曲線可以是一條波動幅度比較大的曲線,而權重曲線則顯得相對平穩。如果一個零售店鋪的每日銷售額是絕對服從周權重指數的規律,那對應的權重曲線則將是一條絕對的水平直線,而這種情況是根本不可能出現的,正常的權重曲線是一條圍繞某個值變化的曲線,正是這種變化給我們提供了去東西某些營運現象的可能,比如某月的某個 週六銷售額÷週六權重 < 週一銷售額÷週一權重,那證明週一的銷售情況相對優於週六,如果後者比前者大很多,那可能該月的這個週一有些事情發生了,這種變化說明有某種業務邏輯暗含其中,相面我們將他們拆開看,放入一些業務場景


銷售追蹤

下面這幅圖從左至右來看,展示了引言中說到的疑似月末踩剎車,月末虛增銷售,月初放鬆等現象

在這裏插入圖片描述

怎麼預防??

  銷售首先是追蹤出來的,其次纔是分析出來的。目前還沒有辦法預測這種現象的發生(想想也正常,預測個銷量還有得說,這麼複雜的人類行爲怎麼預測),管理人員可以再發現權重曲線數據向下突變的第一天就應該去找原因,連續兩天突變就應該請這個店長喝茶和談心了。所以我們可以這麼來看,偶爾1~2天的這種突變是店長的問題,超過兩天還出現這種情況就是管理者的問題了,因爲管理者沒有去中止這種損害銷售額的事情。


特殊事件的量化處理

在這裏插入圖片描述

  上圖是某店鋪三八婦女節促銷活動的銷售權重曲線情況(整個3月),不過單看銷售曲線和單位權重曲線還是會有些不夠直觀,如果把權重曲線換一種表達方式——黃氏曲線(黃氏曲線爲權重曲線同時間段的平均值,以後會再詳細講計算,python 沒有這樣的函數,可以自己按需構造),這樣就很明顯了,並且這條曲線只是和相鄰的時期對比,所以時效性和可對比性都很強。促銷爆發度和促銷衰減度


促銷活動的分析與評估

  促銷活動的結果通常有幾種情況,下圖的黃氏曲線類型會一一展示,但要注意的是,無論是線上還是線下的促銷活動,大多存在以下一些數據分析方面的誤區:

  • 只和促銷目標對比,完成目標的促銷活動就算成功
  • 只進行促銷期的數據對比,且對比誤差較大
  • 只關注促銷前和促銷中的數據,從來不關注促銷後的數據

  這也不難理解,比如一些軟文促銷,9.9 訓練營,標題黨等,短時間內吸引了大量用戶購買,促銷期結束後因爲質量原因導致口碑下降,一下子把品牌搞壞了,呈現比促銷錢還差勁的銷量也就不足爲奇了(相當於透支了後期銷售的促銷活動)。

在這裏插入圖片描述

我卸載網易和今日頭條並不是沒有有原因的。

在這裏插入圖片描述在這裏插入圖片描述

  通過這種分析可以發現什麼類型的促銷更適合什麼類型的店鋪或品類。


新品上市

  在使用這種方法時,不能簡單地將爆發或衰減看成促銷的影響,有可能在促銷的同時還有諸如新品上市等其他因素的作用,雖然黃氏曲線的處理方法已經儘量降低了其他因素的影響度,但還是需要綜合分析。另外促銷前和促銷後的週期一般取7天,特殊情況例外。(一句話:使用黃氏曲線時一定要注意是“突發”狀態,要有非常清晰的時間節點、非常明確的時間信息狀態纔可以使用;建議同時畫出權重曲線和黃氏曲線)

在這裏插入圖片描述


項目實戰

流程拆解

生成周權重指數

在這裏插入圖片描述

拼接兩表,創建權重曲線
在這裏插入圖片描述

可視化

在這裏插入圖片描述

在這裏插入圖片描述

數據是筆者自己僞造的,只爲展示思路,真實情況大多也這麼用


自寫庫快捷實現

在這裏插入圖片描述


源碼呈現

源碼是筆者自己寫的,技術不精,還有許多值得優化的地方,用到的都是 Python 數據分析中的基本操作,關鍵是看思路和一些處理的細節,加油!

import pandas as pd
import numpy as np
# 提高輸出效率庫
from IPython.core.interactiveshell import InteractiveShell # 實現 notebook 的多行輸出
InteractiveShell.ast_node_interactivity = 'all' #默認爲'last'

# 動態可視化庫們的使用
# cufflinks 實現子圖佈局需要付出的努力
import cufflinks as cf
""" 下面幾行爲示例,想不起來的時候看,都是爲了佈局 """
# from plotly import tools 
# import chart_studio.plotly as cp
# import plotly.graph_objs as go
# fig = tools.make_subplots(rows=3, cols=1)
# # 子圖佈局
# fig.add_traces(p1); fig.add_traces(p2); fig.add_traces(p3)
# # Decorations
# fig['layout'].update(hight=900, width=600)
# cy.plot(fig)

# ---------------------- 周權重指數 -----------------------------
def weightCreated(data, standard=None):
    """ 傳入指定格式的數據,返回該分店的周權重表,可自定義標準 """
    daily_mean = {'Mon': np.mean(data['Mon']), 'Tue': np.mean(data['Tue'])
                  , 'Wed': np.mean(data['Wed']), 'Thu': np.mean(data['Thu'])
                  , 'Fri': np.mean(data['Fri']), 'Sau': np.mean(data['Sau'])
                  , 'Sun': np.mean(data['Sun'])}
    weight_index = ['平均日銷售額', '日銷售權重指數']
    weight_columns = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sau', 'Sun']
    weight = pd.DataFrame(data=daily_mean, 
                          index=weight_index, columns=weight_columns)
    weight['Total'] = np.sum(weight.loc['平均日銷售額', :])

    if standard:
        weight.loc['日銷售權重指數', :] = \
    weight.loc['平均日銷售額', :]*standard / weight.loc['平均日銷售額', 'Total']
        return weight
    
    # 若沒有標準將銷售中銷售額最低一天的數據的日權重指數設置爲 1.0,其餘參照
    base = weight.iloc[0, :].min()
    weight.loc['日銷售權重指數', :] = weight.loc['平均日銷售額', :] / base

    return weight

# ------------------------- 單位權重(銷售)值曲線 ----------------------
def weight_curve_Created(month_data, weight_table):
    """ 傳入指定格式的某分店的 月銷售數據 與 該分店周權重指數表
    return 黃氏曲線表,用於後續可視化 """
    # 添加周次
    month_data['時間'] = pd.to_datetime(month_data['時間'])
    month_data['weekday'] = month_data['時間'].dt.weekday # 匹配出來後還應該加1(中國文化)
    month_data['weekday'] = month_data['weekday'] + 1

    # week_label
    week_label = {1:'Mon', 2:'Tue', 3:'Wed', 4:'Thu', 5:'Fri', 6:'Sau', 7:'Sun'}
    month_data.weekday = month_data.weekday.map(week_label)

    # daily_weight
    daily_weight = weight_table.T['日銷售權重指數'][:-1].reset_index()
    daily_weight.rename(columns = {'index': 'weekday'}, inplace=True)

    weight_curve = pd.merge(month_data, daily_weight, on='weekday', how='inner')
    # 排序,因 merge 後時間列順序自行被分組了,有點亂,所以需要重新排序
    weight_curve = weight_curve.sort_values(by='時間')
    # 單位權重(銷售)值
    weight_curve['權重值曲線'] = weight_curve['日銷售額'] / weight_curve['日銷售權重指數']
    # 構造更好的 x 軸座標
    weight_curve['month_day'] = \
        weight_curve['時間'].apply(lambda x : x.strftime('%m-%d'))
    # 字符串化一行後再拼接
    weight_curve['month_day_week'] = \
        weight_curve['month_day'].str.cat(weight_curve['weekday'], sep='-')
    
    return weight_curve

推薦閱讀

  學會提問 | 個人爆發式成長 | Excel 大表格

  一句話成爲心上人特別的存在

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章