數(shù)據(jù)分析項目-電商銷售活動復(fù)盤總結(jié)
使用工具:Anaconda-jupyter大州、mysql
老師指路->http://www.reibang.com/u/1f32f227da5f
分析流程:
- 1涩赢、總體運營指標
- 2逛艰、從價格區(qū)間找出表現(xiàn)不好的產(chǎn)品煌茬,優(yōu)化商品結(jié)構(gòu)
- 3址否、從折扣區(qū)間來找出表現(xiàn)不好的產(chǎn)品局蚀,優(yōu)化商品結(jié)構(gòu)
此次分析的目標:
評估促銷活動的結(jié)果麦锯,并根據(jù)情況優(yōu)化商品結(jié)構(gòu),以便讓自己的商品賣的更好琅绅。
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
#不顯示警告
讀取各部分數(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語句,獲取數(shù)據(jù)
dt1 = pd.read_sql(sql=sql_cmd, con=engine)
dt1.rename(columns={"sale_name":"商品名",
"sale_price":"售賣價",
"tag_price":"吊牌價",
"discout":"折扣率",
"stocks":"庫存量",
"stocks_value":"貨值",
"cost_price":"成本價",
"profit_rate":"利潤率",
"skus":"SKU"},
inplace=True)
dt1.head()
#engine = create_engine('dialect+driver://username:password@host:port/database')
#dialect -- 數(shù)據(jù)庫類型
#driver -- 數(shù)據(jù)庫驅(qū)動選擇
#username -- 數(shù)據(jù)庫用戶名
#password -- 用戶密碼
#host 服務(wù)器地址
#port 端口
#database 數(shù)據(jù)庫
# 讀取數(shù)據(jù)
# 商品熱度表
sql_cmd = "select * from sales_info2"
# 執(zhí)行sql語句千扶,獲取數(shù)據(jù)
dt2 = pd.read_sql(sql=sql_cmd, con=engine)
dt2.rename(columns={"sale_name":"商品名",
"uvs":"UV數(shù)",
"collections":"收藏數(shù)",
"carts":"加購物車數(shù)"},
inplace=True)
dt2.head()
# 讀取數(shù)據(jù)
# 商品銷售明細表
sql_cmd = "select * from sales_info3"
# 執(zhí)行sql語句料祠,獲取數(shù)據(jù)
dt3 = pd.read_sql(sql=sql_cmd, con=engine)
dt3.rename(columns={"user_id":"用戶id",
"buy_date":"購買日期",
"sale_name":"商品名",
"buy_cons":"購買數(shù)量",
"buy_price":"購買單價",
"cost_price":"購買金額",
"is_tui":"是否退貨",
"tui_cons":"退貨件數(shù)",
"tui_price":"退貨金額"},
inplace=True)
dt3['是否退貨']=dt3["是否退貨"].map({"是":1,"否":0})
#是否退貨用數(shù)字表示,便于統(tǒng)計
dt3.head()
合并商品信息表和商品熱度表數(shù)據(jù)
# 把商品信息加上該商品的熱度信息
# 得到基礎(chǔ)的商品信息澎羞,以及商品的一些熱度信息:加購物車數(shù)量髓绽,收藏數(shù)量、uv數(shù)
dt_product = dt1.merge(dt2,how="left",on="商品名")
#左連接煤痕,顯示全部信息
dt_product.head()
合并商品信息表和商品熱度表和用戶銷售明細表
# 統(tǒng)計每個商品的一個銷售情況
product_sales = dt3.groupby("商品名").agg({"購買數(shù)量":"sum",
"購買金額":"sum",
"退貨件數(shù)":"sum",
"退貨金額":"sum",
"購買單價":"mean",
"用戶id":pd.Series.nunique}).reset_index()
product_sales.rename(columns={"購買數(shù)量":"商品銷售數(shù)量",
"購買金額":"商品銷售金額",
"是否退貨":"商品退貨數(shù)量",
"退貨金額":"商品退貨金額",
"購買單價":"商品銷售單價",
"用戶id":"購買用戶數(shù)量"},inplace=True)
product_sales.head()
# 合并商品信息(三個表格數(shù)據(jù))
dt_product_sales = dt_product.merge(product_sales,how="left",on="商品名")
dt_product_sales.head()
一梧宫、總體運營情況評價
總體運營部分,主要關(guān)注銷售額摆碉、售賣比塘匣、UV、轉(zhuǎn)化率等指標巷帝,其他指標作為輔助指標忌卤。銷售額用來和預(yù)期目標做對比,售賣比用來看商品流轉(zhuǎn)情況楞泼。
- GMV:銷售額驰徊,在平臺里稱為到手價。
- 實銷:GMV – 拒退金額堕阔。
- 銷量:累計銷售量(含拒退)棍厂。
- 客單價:GMV / 客戶數(shù),客單價與毛利率息息相關(guān)超陆,一般客單價越高牺弹,毛利率越高。
- UV:商品所在頁面的獨立訪問數(shù)。
- 轉(zhuǎn)化率:客戶數(shù) / UV张漂。
- 折扣率:GMV / 吊牌總額(吊牌總額 = 吊牌價 * 銷量)晶默,在日常工作中,吊牌額是必不可少的航攒。
- 備貨值:吊牌價 * 庫存數(shù)磺陡。
- 售賣比:又稱售罄率,GMV / 備貨值漠畜。
- 收藏數(shù):收藏某款商品的用戶數(shù)量币他。
- 加購數(shù):加購物車人數(shù)。
- SKU數(shù):促銷活動中的SKU計數(shù)(一般指貨號)盆驹。
- SPU數(shù):促銷活動中的SPU計數(shù)(一般指款號)圆丹。
- 拒退量:拒收和退貨的總數(shù)量。
- 拒退額:拒收和退貨的總金額躯喇。
#1、GMV:銷售額硝枉,包含退貨的金額
gmv = dt_product_sales["商品銷售金額"].sum()
#2廉丽、實際銷售額=GMV - 退貨金額
return_sales = dt_product_sales["商品退貨金額"].sum()
return_money = gmv - return_sales
#3、銷量:累計銷售量(含拒退)
all_sales = dt_product_sales["商品銷售數(shù)量"].sum()
#4妻味、客單價:GMV / 客戶數(shù)正压,客單價與毛利率息息相關(guān),一般客單價越高责球,毛利率越高焦履。
# dt3.user_id.unique().count()
custom_price = gmv / dt_product_sales["購買用戶數(shù)量"].sum()
# 5、UV:商品所在頁面的獨立訪問數(shù)
uv_cons = dt_product_sales["UV數(shù)"].sum()
# 6雏逾、轉(zhuǎn)化率:客戶數(shù) / UV嘉裤。
uv_rate = dt_product_sales["購買用戶數(shù)量"].sum() / dt_product_sales["UV數(shù)"].sum()
# 7、折扣率:GMV / 吊牌總額(吊牌總額 = 吊牌價 * 銷量)栖博,在日常工作中屑宠,吊牌額是必不可少的。
tags_sales = np.sum(dt_product_sales["吊牌價"] * dt_product_sales["商品銷售數(shù)量"])
discount_rate= gmv / tags_sales
# 8仇让、備貨值:吊牌價 * 庫存數(shù)典奉。
goods_value = dt_product_sales["貨值"].sum()
# 9、售賣比:又稱售罄率丧叽,GMV / 備貨值卫玖。
sales_rate = gmv / goods_value
# 10、收藏數(shù):收藏某款商品的用戶數(shù)量踊淳。
coll_cons = dt_product_sales["收藏數(shù)"].sum()
# 11假瞬、加購數(shù):加購物車人數(shù)。
add_shop_cons = dt_product_sales["加購物車數(shù)"].sum()
# 12、SKU數(shù):促銷活動中的最小品類單元(一般指貨號)笨触。
sku_cons = dt_product_sales["SKU"].sum()
# 13懦傍、SPU數(shù):促銷活動中的SPU計數(shù)(一般指款號)。
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)計寸认,與去年銷售情況比較
sales_state_dangqi = pd.DataFrame(
{"GMV":[gmv,],"實際銷售額":[return_money,],"銷量":[all_sales,],"客單價":[custom_price,],
"UV數(shù)":[uv_cons,],"UV轉(zhuǎn)化率":[uv_rate,],"折扣率":[discount_rate,],"貨值":[goods_value,],
"售賣比":[sales_rate,],"收藏數(shù)":[coll_cons,],"加購數(shù)":[add_shop_cons,],"sku數(shù)":[sku_cons,],
"spu數(shù)":[spu_cons,],"拒退量":[reject_cons,],"拒退額":[reject_money,],},
) #index=["今年雙11",]
# 去年的數(shù)據(jù)已經(jīng)統(tǒng)計好了,不需要計算
sales_state_tongqi = pd.DataFrame(
{"GMV":[2261093,],"實際銷售額":[1464936.517,],"銷量":[7654,],"客單價":[609.34567,],
"UV數(shù)":[904694,],"UV轉(zhuǎn)化率":[0.0053366,],"折扣率":[0.46,],"貨值":[12610930,],
"售賣比":[0.1161,],"收藏數(shù)":[4263,],"加購數(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 = ["指標","今年雙11"]
#數(shù)據(jù)置成列串慰,新命名字段
sales_state_tongqi_s = pd.DataFrame(sales_state_tongqi.stack()).reset_index().iloc[:,[1,2]]
sales_state_tongqi_s.columns = ["指標","去年雙11"]
#數(shù)據(jù)置成列偏塞,新命名字段
sales_state = pd.merge(sales_state_dangqi_s, sales_state_tongqi_s,on="指標")
#通過 指標 關(guān)聯(lián)兩張表
sales_state["同比"] = (sales_state["今年雙11"] - sales_state["去年雙11"]) / sales_state["去年雙11"]
sales_state
二、從價格區(qū)間來優(yōu)化商品結(jié)構(gòu)
需要做的是邦鲫,深入探究不同區(qū)間的數(shù)據(jù)灸叼,以此來優(yōu)化后期的促銷結(jié)構(gòu)。
首先需要找到在本次促銷中此區(qū)間的銷售源數(shù)據(jù)庆捺,源數(shù)據(jù)要求顯示具體的款號古今、銷售額、銷量等信息滔以。
第二步捉腥,計算出每個款的轉(zhuǎn)化率、折扣率等數(shù)據(jù)你画。
# 劃分價格區(qū)間段
#設(shè)置切分區(qū)域
listBins = [0,200, 400, 100000]
#設(shè)置切分后對應(yīng)標簽
listLabels = ['1_200','200_400','400及以上']
#利用pd.cut進行數(shù)據(jù)離散化切分抵碟,注意分組標簽和分組數(shù)要一致
"""
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
x:需要切分的數(shù)據(jù)
bins:切分區(qū)域
right : 是否包含右端點默認True,包含
labels:對應(yīng)標簽坏匪,用標記來代替返回的bins拟逮,若不在該序列中,則返回NaN
retbins:是否返回間距bins
precision:精度
include_lowest:是否包含左端點剥槐,默認False唱歧,不包含
"""
dt_product_sales['價格分組'] = pd.cut(dt_product_sales['售賣價'], bins=listBins, labels=listLabels, include_lowest=True)
dt_product_sales.head()
價格區(qū)間銷售情況統(tǒng)計
- 價格區(qū)間
- 貨值
- 貨值占比
- 銷售額
- 售賣比
- 銷售占比
- 銷量
- 客單價
- UV
- 收藏數(shù)
- 加購數(shù)
- 轉(zhuǎn)化率
dt_product_sales_info = dt_product_sales.groupby("價格分組").agg({
"貨值":"sum",
"商品銷售金額":"sum",
"商品銷售數(shù)量":"sum",
"UV數(shù)":"sum",
"購買用戶數(shù)量":"sum",
"收藏數(shù)":"sum",
"加購物車數(shù)":"sum"
}).reset_index()
# 貨值占比、銷售占比粒竖、客單價颅崩、轉(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["客單價"]=dt_product_sales_info["商品銷售金額"]/dt_product_sales_info["購買用戶數(shù)量"]
dt_product_sales_info["轉(zhuǎn)化率"]=dt_product_sales_info["購買用戶數(shù)量"]/dt_product_sales_info["UV數(shù)"]
dt_product_sales_info
取出400及以上價格區(qū)間的數(shù)據(jù)內(nèi)容
product_400 = dt_product_sales[dt_product_sales["價格分組"]=='400及以上']
計算商品指標
- 銷售額
- 銷量
- 件單價
- 客戶數(shù)
- UV
- 轉(zhuǎn)換率=客戶數(shù) / UV
- 庫存
- 備貨值=吊牌價 * 庫存數(shù)
- 售賣比=又稱售罄率,GMV / 備貨值
# 轉(zhuǎn)換率=客戶數(shù) / UV
product_400['轉(zhuǎn)換率'] = product_400["購買用戶數(shù)量"]/product_400["UV數(shù)"]
# 備貨值=吊牌價 * 庫存數(shù)
product_400["備貨值"] = product_400["吊牌價"]*product_400["商品銷售數(shù)量"]
product_400["售賣比"] = product_400["商品銷售金額"]/product_400["備貨值"]
product_400[["商品名","商品銷售金額","商品銷售數(shù)量","商品銷售單價","購買用戶數(shù)量","UV數(shù)",'轉(zhuǎn)換率',"庫存量","備貨值","售賣比"]]
優(yōu)化方案:
轉(zhuǎn)化率大于0.7%的商品蕊苗,暫時保留沿后,用于下次促銷活動;
轉(zhuǎn)化率小于0.7%的商品朽砰,但是售賣比大于36%的商品予以保留參加下次促銷活動尖滚,
轉(zhuǎn)化率小于0.7%的商品喉刘,并且售賣比小于36%的商品進行清倉處理。
# 挑選合格的商品:
# 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撼唾、清倉處理商品廉邑,找出轉(zhuǎn)化率小于0.7%并且售賣比小于36%的部分
stay_stocks574 = product_400[(product_400["售賣比"]<0.36)&(product_400["轉(zhuǎn)換率"]<0.007)]
三、從折扣區(qū)間來優(yōu)化商品結(jié)構(gòu)
折扣區(qū)間銷售情況統(tǒng)計
- 價格區(qū)間
- 貨值
- 貨值占比
- 銷售額
- 售賣比
- 銷售占比
- 銷量
- 客單價
- UV
- 收藏數(shù)
- 加購數(shù)
- 轉(zhuǎn)化率
1倒谷、劃分價格區(qū)間段
2蛛蒙、取出0.35-0.4價格區(qū)間(表現(xiàn)好的折扣區(qū)間)的數(shù)據(jù)內(nèi)容
3、計算商品指標
- 銷售額
- 銷量
- 件單價
- 客戶數(shù)
- UV
- 轉(zhuǎn)換率=客戶數(shù) / UV
- 庫存
- 貨值=吊牌價 * 庫存數(shù)
- 售賣比=又稱售罄率渤愁,GMV / 備貨值
優(yōu)化方案:
折扣率大于37%的部分找出售賣比大于36.5%且轉(zhuǎn)化率大于0.7%的商品予以保留牵祟,其余進行清倉處理;
折扣率小于37%的部分找出售賣比大于36.5%且轉(zhuǎn)化率大于0.7%的部分予以保留抖格,其余進行清倉處理诺苹。