數(shù)據(jù)分析項(xiàng)目-電商銷售活動(dòng)復(fù)盤總結(jié)
使用工具:Anaconda-jupyter、mysql
老師指路->http://www.itdecent.cn/u/1f32f227da5f
分析流程:
- 1、總體運(yùn)營(yíng)指標(biāo)
- 2、從價(jià)格區(qū)間找出表現(xiàn)不好的產(chǎn)品,優(yōu)化商品結(jié)構(gòu)
- 3、從折扣區(qū)間來(lái)找出表現(xiàn)不好的產(chǎn)品,優(yōu)化商品結(jié)構(gòu)
此次分析的目標(biāo):
評(píng)估促銷活動(dòng)的結(jié)果,并根據(jù)情況優(yōu)化商品結(jié)構(gòu),以便讓自己的商品賣的更好。
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
#不顯示警告
讀取各部分?jǐn)?shù)據(jù)集、合并
import sqlalchemy
engine = sqlalchemy.create_engine('mysql+pymysql://username:password@localhost:3306/froghd')
# 讀取數(shù)據(jù)
# 商品信息表
sql_cmd = "select * from sales_info1"
# 執(zhí)行sql語(yǔ)句,獲取數(shù)據(jù)
dt1 = pd.read_sql(sql=sql_cmd, con=engine)
dt1.rename(columns={"sale_name":"商品名",
"sale_price":"售賣價(jià)",
"tag_price":"吊牌價(jià)",
"discout":"折扣率",
"stocks":"庫(kù)存量",
"stocks_value":"貨值",
"cost_price":"成本價(jià)",
"profit_rate":"利潤(rùn)率",
"skus":"SKU"},
inplace=True)
dt1.head()
#engine = create_engine('dialect+driver://username:password@host:port/database')
#dialect -- 數(shù)據(jù)庫(kù)類型
#driver -- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)選擇
#username -- 數(shù)據(jù)庫(kù)用戶名
#password -- 用戶密碼
#host 服務(wù)器地址
#port 端口
#database 數(shù)據(jù)庫(kù)

# 讀取數(shù)據(jù)
# 商品熱度表
sql_cmd = "select * from sales_info2"
# 執(zhí)行sql語(yǔ)句,獲取數(shù)據(jù)
dt2 = pd.read_sql(sql=sql_cmd, con=engine)
dt2.rename(columns={"sale_name":"商品名",
"uvs":"UV數(shù)",
"collections":"收藏?cái)?shù)",
"carts":"加購(gòu)物車數(shù)"},
inplace=True)
dt2.head()

# 讀取數(shù)據(jù)
# 商品銷售明細(xì)表
sql_cmd = "select * from sales_info3"
# 執(zhí)行sql語(yǔ)句,獲取數(shù)據(jù)
dt3 = pd.read_sql(sql=sql_cmd, con=engine)
dt3.rename(columns={"user_id":"用戶id",
"buy_date":"購(gòu)買日期",
"sale_name":"商品名",
"buy_cons":"購(gòu)買數(shù)量",
"buy_price":"購(gòu)買單價(jià)",
"cost_price":"購(gòu)買金額",
"is_tui":"是否退貨",
"tui_cons":"退貨件數(shù)",
"tui_price":"退貨金額"},
inplace=True)
dt3['是否退貨']=dt3["是否退貨"].map({"是":1,"否":0})
#是否退貨用數(shù)字表示,便于統(tǒng)計(jì)
dt3.head()

合并商品信息表和商品熱度表數(shù)據(jù)
# 把商品信息加上該商品的熱度信息
# 得到基礎(chǔ)的商品信息,以及商品的一些熱度信息:加購(gòu)物車數(shù)量,收藏?cái)?shù)量、uv數(shù)
dt_product = dt1.merge(dt2,how="left",on="商品名")
#左連接,顯示全部信息
dt_product.head()

合并商品信息表和商品熱度表和用戶銷售明細(xì)表
# 統(tǒng)計(jì)每個(gè)商品的一個(gè)銷售情況
product_sales = dt3.groupby("商品名").agg({"購(gòu)買數(shù)量":"sum",
"購(gòu)買金額":"sum",
"退貨件數(shù)":"sum",
"退貨金額":"sum",
"購(gòu)買單價(jià)":"mean",
"用戶id":pd.Series.nunique}).reset_index()
product_sales.rename(columns={"購(gòu)買數(shù)量":"商品銷售數(shù)量",
"購(gòu)買金額":"商品銷售金額",
"是否退貨":"商品退貨數(shù)量",
"退貨金額":"商品退貨金額",
"購(gòu)買單價(jià)":"商品銷售單價(jià)",
"用戶id":"購(gòu)買用戶數(shù)量"},inplace=True)
product_sales.head()

# 合并商品信息(三個(gè)表格數(shù)據(jù))
dt_product_sales = dt_product.merge(product_sales,how="left",on="商品名")
dt_product_sales.head()

一、總體運(yùn)營(yíng)情況評(píng)價(jià)
總體運(yùn)營(yíng)部分,主要關(guān)注銷售額、售賣比、UV、轉(zhuǎn)化率等指標(biāo),其他指標(biāo)作為輔助指標(biāo)。銷售額用來(lái)和預(yù)期目標(biāo)做對(duì)比,售賣比用來(lái)看商品流轉(zhuǎn)情況。
- GMV:銷售額,在平臺(tái)里稱為到手價(jià)。
- 實(shí)銷:GMV – 拒退金額。
- 銷量:累計(jì)銷售量(含拒退)。
- 客單價(jià):GMV / 客戶數(shù),客單價(jià)與毛利率息息相關(guān),一般客單價(jià)越高,毛利率越高。
- UV:商品所在頁(yè)面的獨(dú)立訪問數(shù)。
- 轉(zhuǎn)化率:客戶數(shù) / UV。
- 折扣率:GMV / 吊牌總額(吊牌總額 = 吊牌價(jià) * 銷量),在日常工作中,吊牌額是必不可少的。
- 備貨值:吊牌價(jià) * 庫(kù)存數(shù)。
- 售賣比:又稱售罄率,GMV / 備貨值。
- 收藏?cái)?shù):收藏某款商品的用戶數(shù)量。
- 加購(gòu)數(shù):加購(gòu)物車人數(shù)。
- SKU數(shù):促銷活動(dòng)中的SKU計(jì)數(shù)(一般指貨號(hào))。
- SPU數(shù):促銷活動(dòng)中的SPU計(jì)數(shù)(一般指款號(hào))。
- 拒退量:拒收和退貨的總數(shù)量。
- 拒退額:拒收和退貨的總金額。
#1、GMV:銷售額,包含退貨的金額
gmv = dt_product_sales["商品銷售金額"].sum()
#2、實(shí)際銷售額=GMV - 退貨金額
return_sales = dt_product_sales["商品退貨金額"].sum()
return_money = gmv - return_sales
#3、銷量:累計(jì)銷售量(含拒退)
all_sales = dt_product_sales["商品銷售數(shù)量"].sum()
#4、客單價(jià):GMV / 客戶數(shù),客單價(jià)與毛利率息息相關(guān),一般客單價(jià)越高,毛利率越高。
# dt3.user_id.unique().count()
custom_price = gmv / dt_product_sales["購(gòu)買用戶數(shù)量"].sum()
# 5、UV:商品所在頁(yè)面的獨(dú)立訪問數(shù)
uv_cons = dt_product_sales["UV數(shù)"].sum()
# 6、轉(zhuǎn)化率:客戶數(shù) / UV。
uv_rate = dt_product_sales["購(gòu)買用戶數(shù)量"].sum() / dt_product_sales["UV數(shù)"].sum()
# 7、折扣率:GMV / 吊牌總額(吊牌總額 = 吊牌價(jià) * 銷量),在日常工作中,吊牌額是必不可少的。
tags_sales = np.sum(dt_product_sales["吊牌價(jià)"] * dt_product_sales["商品銷售數(shù)量"])
discount_rate= gmv / tags_sales
# 8、備貨值:吊牌價(jià) * 庫(kù)存數(shù)。
goods_value = dt_product_sales["貨值"].sum()
# 9、售賣比:又稱售罄率,GMV / 備貨值。
sales_rate = gmv / goods_value
# 10、收藏?cái)?shù):收藏某款商品的用戶數(shù)量。
coll_cons = dt_product_sales["收藏?cái)?shù)"].sum()
# 11、加購(gòu)數(shù):加購(gòu)物車人數(shù)。
add_shop_cons = dt_product_sales["加購(gòu)物車數(shù)"].sum()
# 12、SKU數(shù):促銷活動(dòng)中的最小品類單元(一般指貨號(hào))。
sku_cons = dt_product_sales["SKU"].sum()
# 13、SPU數(shù):促銷活動(dòng)中的SPU計(jì)數(shù)(一般指款號(hào))。
spu_cons = len(dt_product_sales["商品名"].unique())
# 14、拒退量:拒收和退貨的總數(shù)量。退貨件數(shù)
reject_cons = dt_product_sales["退貨件數(shù)"].sum()
# 15、拒退額:拒收和退貨的總金額。
reject_money = dt_product_sales["商品退貨金額"].sum()
匯總統(tǒng)計(jì),與去年銷售情況比較
sales_state_dangqi = pd.DataFrame(
{"GMV":[gmv,],"實(shí)際銷售額":[return_money,],"銷量":[all_sales,],"客單價(jià)":[custom_price,],
"UV數(shù)":[uv_cons,],"UV轉(zhuǎn)化率":[uv_rate,],"折扣率":[discount_rate,],"貨值":[goods_value,],
"售賣比":[sales_rate,],"收藏?cái)?shù)":[coll_cons,],"加購(gòu)數(shù)":[add_shop_cons,],"sku數(shù)":[sku_cons,],
"spu數(shù)":[spu_cons,],"拒退量":[reject_cons,],"拒退額":[reject_money,],},
) #index=["今年雙11",]
# 去年的數(shù)據(jù)已經(jīng)統(tǒng)計(jì)好了,不需要計(jì)算
sales_state_tongqi = pd.DataFrame(
{"GMV":[2261093,],"實(shí)際銷售額":[1464936.517,],"銷量":[7654,],"客單價(jià)":[609.34567,],
"UV數(shù)":[904694,],"UV轉(zhuǎn)化率":[0.0053366,],"折扣率":[0.46,],"貨值":[12610930,],
"售賣比":[0.1161,],"收藏?cái)?shù)":[4263,],"加購(gòu)數(shù)":[15838,],"sku數(shù)":[82,],
"spu數(shù)":[67,],"拒退量":[2000,],"拒退額":[651188.57,],},
) #index=["去年雙11",]
#sales_state = pd.concat([sales_state_dangqi, sales_state_tangqi])
sales_state_dangqi_s = pd.DataFrame(sales_state_dangqi.stack()).reset_index().iloc[:,[1,2]]
sales_state_dangqi_s.columns = ["指標(biāo)","今年雙11"]
#數(shù)據(jù)置成列,新命名字段
sales_state_tongqi_s = pd.DataFrame(sales_state_tongqi.stack()).reset_index().iloc[:,[1,2]]
sales_state_tongqi_s.columns = ["指標(biāo)","去年雙11"]
#數(shù)據(jù)置成列,新命名字段
sales_state = pd.merge(sales_state_dangqi_s, sales_state_tongqi_s,on="指標(biāo)")
#通過(guò) 指標(biāo) 關(guān)聯(lián)兩張表
sales_state["同比"] = (sales_state["今年雙11"] - sales_state["去年雙11"]) / sales_state["去年雙11"]
sales_state

二、從價(jià)格區(qū)間來(lái)優(yōu)化商品結(jié)構(gòu)
需要做的是,深入探究不同區(qū)間的數(shù)據(jù),以此來(lái)優(yōu)化后期的促銷結(jié)構(gòu)。
首先需要找到在本次促銷中此區(qū)間的銷售源數(shù)據(jù),源數(shù)據(jù)要求顯示具體的款號(hào)、銷售額、銷量等信息。
第二步,計(jì)算出每個(gè)款的轉(zhuǎn)化率、折扣率等數(shù)據(jù)。
# 劃分價(jià)格區(qū)間段
#設(shè)置切分區(qū)域
listBins = [0,200, 400, 100000]
#設(shè)置切分后對(duì)應(yīng)標(biāo)簽
listLabels = ['1_200','200_400','400及以上']
#利用pd.cut進(jìn)行數(shù)據(jù)離散化切分,注意分組標(biāo)簽和分組數(shù)要一致
"""
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
x:需要切分的數(shù)據(jù)
bins:切分區(qū)域
right : 是否包含右端點(diǎn)默認(rèn)True,包含
labels:對(duì)應(yīng)標(biāo)簽,用標(biāo)記來(lái)代替返回的bins,若不在該序列中,則返回NaN
retbins:是否返回間距bins
precision:精度
include_lowest:是否包含左端點(diǎn),默認(rèn)False,不包含
"""
dt_product_sales['價(jià)格分組'] = pd.cut(dt_product_sales['售賣價(jià)'], bins=listBins, labels=listLabels, include_lowest=True)
dt_product_sales.head()

價(jià)格區(qū)間銷售情況統(tǒng)計(jì)
- 價(jià)格區(qū)間
- 貨值
- 貨值占比
- 銷售額
- 售賣比
- 銷售占比
- 銷量
- 客單價(jià)
- UV
- 收藏?cái)?shù)
- 加購(gòu)數(shù)
- 轉(zhuǎn)化率
dt_product_sales_info = dt_product_sales.groupby("價(jià)格分組").agg({
"貨值":"sum",
"商品銷售金額":"sum",
"商品銷售數(shù)量":"sum",
"UV數(shù)":"sum",
"購(gòu)買用戶數(shù)量":"sum",
"收藏?cái)?shù)":"sum",
"加購(gòu)物車數(shù)":"sum"
}).reset_index()
# 貨值占比、銷售占比、客單價(jià)、轉(zhuǎn)化率
dt_product_sales_info["貨值占比"]=dt_product_sales_info["貨值"]/dt_product_sales_info["貨值"].sum()
dt_product_sales_info["銷售占比"]=dt_product_sales_info["商品銷售金額"]/dt_product_sales_info["商品銷售金額"].sum()
dt_product_sales_info["客單價(jià)"]=dt_product_sales_info["商品銷售金額"]/dt_product_sales_info["購(gòu)買用戶數(shù)量"]
dt_product_sales_info["轉(zhuǎn)化率"]=dt_product_sales_info["購(gòu)買用戶數(shù)量"]/dt_product_sales_info["UV數(shù)"]
dt_product_sales_info

取出400及以上價(jià)格區(qū)間的數(shù)據(jù)內(nèi)容
product_400 = dt_product_sales[dt_product_sales["價(jià)格分組"]=='400及以上']
計(jì)算商品指標(biāo)
- 銷售額
- 銷量
- 件單價(jià)
- 客戶數(shù)
- UV
- 轉(zhuǎn)換率=客戶數(shù) / UV
- 庫(kù)存
- 備貨值=吊牌價(jià) * 庫(kù)存數(shù)
- 售賣比=又稱售罄率,GMV / 備貨值
# 轉(zhuǎn)換率=客戶數(shù) / UV
product_400['轉(zhuǎn)換率'] = product_400["購(gòu)買用戶數(shù)量"]/product_400["UV數(shù)"]
# 備貨值=吊牌價(jià) * 庫(kù)存數(shù)
product_400["備貨值"] = product_400["吊牌價(jià)"]*product_400["商品銷售數(shù)量"]
product_400["售賣比"] = product_400["商品銷售金額"]/product_400["備貨值"]
product_400[["商品名","商品銷售金額","商品銷售數(shù)量","商品銷售單價(jià)","購(gòu)買用戶數(shù)量","UV數(shù)",'轉(zhuǎn)換率',"庫(kù)存量","備貨值","售賣比"]]

優(yōu)化方案:
轉(zhuǎn)化率大于0.7%的商品,暫時(shí)保留,用于下次促銷活動(dòng);
轉(zhuǎn)化率小于0.7%的商品,但是售賣比大于36%的商品予以保留參加下次促銷活動(dòng),
轉(zhuǎn)化率小于0.7%的商品,并且售賣比小于36%的商品進(jìn)行清倉(cāng)處理。
# 挑選合格的商品:
# 1、保留商品:轉(zhuǎn)化率大于0.7%的商品予以保留
stay_stocks571 = product_400[product_400["轉(zhuǎn)換率"]>0.007]
# 售賣比=又稱售罄率,GMV / 備貨值
product_400["售賣比"] = product_400["商品銷售金額"]/product_400["備貨值"]
# 挑選合格的商品:
# 2、保留商品:找出轉(zhuǎn)化率小于0.7% 但是 售賣比大于36%的部分予以保留
stay_stocks573 = product_400[(product_400["售賣比"]>=0.36)&(product_400["轉(zhuǎn)換率"]<0.007)
# 3、清倉(cāng)處理商品,找出轉(zhuǎn)化率小于0.7%并且售賣比小于36%的部分
stay_stocks574 = product_400[(product_400["售賣比"]<0.36)&(product_400["轉(zhuǎn)換率"]<0.007)]
三、從折扣區(qū)間來(lái)優(yōu)化商品結(jié)構(gòu)
折扣區(qū)間銷售情況統(tǒng)計(jì)
- 價(jià)格區(qū)間
- 貨值
- 貨值占比
- 銷售額
- 售賣比
- 銷售占比
- 銷量
- 客單價(jià)
- UV
- 收藏?cái)?shù)
- 加購(gòu)數(shù)
- 轉(zhuǎn)化率
1、劃分價(jià)格區(qū)間段
2、取出0.35-0.4價(jià)格區(qū)間(表現(xiàn)好的折扣區(qū)間)的數(shù)據(jù)內(nèi)容
3、計(jì)算商品指標(biāo)
- 銷售額
- 銷量
- 件單價(jià)
- 客戶數(shù)
- UV
- 轉(zhuǎn)換率=客戶數(shù) / UV
- 庫(kù)存
- 貨值=吊牌價(jià) * 庫(kù)存數(shù)
- 售賣比=又稱售罄率,GMV / 備貨值
優(yōu)化方案:
折扣率大于37%的部分找出售賣比大于36.5%且轉(zhuǎn)化率大于0.7%的商品予以保留,其余進(jìn)行清倉(cāng)處理;
折扣率小于37%的部分找出售賣比大于36.5%且轉(zhuǎn)化率大于0.7%的部分予以保留,其余進(jìn)行清倉(cāng)處理。