數(shù)據(jù)來自kaggle闻镶,地址:https://www.kaggle.com/carrie1/ecommerce-data
數(shù)據(jù)集可以下載到本地再使用铆农,訪問Kaggle的話墩剖,還可以看看其他人是如何來分析的
好了岭皂,這個(gè)數(shù)據(jù)集爷绘,我們前面其實(shí)用過购对,上一次是為了練習(xí)pandas陶因,這一次我們要從數(shù)據(jù)分析的角度來解幽,看看我們能了解什么毅否。
了解我們的數(shù)據(jù)
data_path = r'C:\Users\A\OneDrive\python\datasets\Online Retail.csv'
df = pd.read_csv(data_path , encoding='ISO-8859-1')
df.head()
記錄數(shù)很多,有50萬+吞琐,一共8個(gè)字段
InvoiceNo:訂單號(hào)
StockCode:商品編號(hào)
Description:商品名稱/描述
Quantity:商品數(shù)量
InvoiceDate:訂單日期
UnitPrice:商品單價(jià)
CustomerID:用戶ID
Country:國(guó)家
為了更好的了解數(shù)據(jù)站粟,我們還可以使用info
函數(shù)和describe
函數(shù)看看
df.info()
df.describe()
這里的Quantity
和UnitPrice
中有負(fù)值助被,可能是退貨的記錄揩环,我們需要注意下
df.query('Quantity<0').head()
df.query('UnitPrice<0').head()
通過現(xiàn)有數(shù)據(jù)丰滑,我們想探索些什么褒墨?
這是很典型的交易型數(shù)據(jù)郁妈,所以還是有很多角度可以去探索的
我們直接可以發(fā)現(xiàn)的維度:
- 商品維度
- 時(shí)間維度
- 用戶維度
- 國(guó)家維度
指標(biāo)的話噩咪,就有數(shù)量拘央、銷售額灰伟、用戶數(shù)這些基本的栏账,再延伸下挡爵,就有銷往的國(guó)家數(shù)茶鹃,單均GMV闭翩,人均GMV,每個(gè)國(guó)家的GMV等等等
1. 一共有多少筆訂單蕉汪?多少用戶逞怨?
df.nunique()
對(duì)數(shù)據(jù)去重之后宛渐,我們可以知道:
** 訂單數(shù)是25900,用戶數(shù)是4372寇蚊,國(guó)家數(shù)是38**
但是這個(gè)商品種類數(shù)有點(diǎn)問題仗岸,我理解的話扒怖,這個(gè)StockCode
應(yīng)該和Description
去重?cái)?shù)一樣蚂蕴,但是不一樣,這說明一個(gè)商品編碼對(duì)應(yīng)了多個(gè)描述鸟整?
我們確認(rèn)下
df2 = df.groupby(by=['StockCode'])['Description'].nunique()
df2[df2>1]
這里還是有很多的不一致的篮条,我們隨便找一條看看
df.query('StockCode == "10080"')['Description'].unique()
這的確是對(duì)應(yīng)了多個(gè)描述,但是我們上面去重后的差異也就200多,這里有600多條重復(fù)的蚓胸,還是哪里不太對(duì)
df[df['Description'].isnull()]
居然這里還有好多描述為空的
然后,我又隨便看了看锹安,發(fā)現(xiàn)這個(gè)單價(jià)為0的記錄剔除之后,還有一種情況
df.query('StockCode == "16156L"')['Description']
這種編碼一樣倚舀,但是描述一樣叹哭,但是格式不一致的情況
好了,隨后還是把Description
就當(dāng)做描述好了痕貌,還是以StockCode
為主吧
這個(gè)數(shù)據(jù)質(zhì)量风罩,哈哈哈
這里我們需要確認(rèn)下,這些單價(jià)為0舵稠,數(shù)量為負(fù)的記錄超升,我們到底要不要室琢,就這樣留著雹熬,還是說替換掉?
恩,先留著吧
2. 總銷量和總GMV
我們先用單價(jià)和數(shù)量算一個(gè)商品金額
df['sku_amount'] = df['Quantity']*df['UnitPrice']
df[['Quantity','sku_amount']].sum()/10000
結(jié)合上一題,我們這里就可以算出來很多均類指標(biāo):
單均銷量、單均GMV
人均銷量柬帕、人均GMV
件均GMV(件單價(jià))
這里我就不算了,哈哈哈
單個(gè)維度
3. 商品維度:每種商品的銷量饶火、銷售額、購(gòu)買人數(shù)
從商品維度來分析的話,比如看看哪些是暢銷品,哪些是滯銷品(賣的不好的)
記得上面我們看過,有銷量為負(fù)的商品,暫且把他們當(dāng)做是退貨,我們先看看正常訂單好了
df_1 = df.query('Quantity>0')
df_2 = df_1.groupby('StockCode').agg({'Quantity':'sum' , 'sku_amount':'sum' , 'CustomerID':'nunique'})
df_2.sort_values('Quantity' , ascending=False).head()
這里吵聪,我們就根據(jù)商品編碼,對(duì)銷量和銷售和做了合計(jì)驹尼,對(duì)用戶數(shù)做了去重統(tǒng)計(jì)
然后愁拭,我順便加了個(gè)排名看看许赃,商品再銷量技羔、銷售額、購(gòu)買人數(shù)上的排列怎么樣
df_2['Quantity_rank'] = df_2['Quantity'].rank(method='min' , ascending=False)
df_2['sku_amount_rank'] = df_2['sku_amount'].rank(method='min', ascending=False)
df_2['CustomerID_rank'] = df_2['CustomerID'].rank(method='min', ascending=False)
df_2.sort_values('Quantity' , ascending=False).head()
針對(duì)商品,我們?cè)僬归_一下的話趁曼,比如,對(duì)商品做個(gè)分類,ABC分類愉舔,或者根據(jù)上面3個(gè)指標(biāo)做一個(gè)商品價(jià)值總分
貢獻(xiàn)度80%銷售額的有哪些商品火的,都是一些探索的角度
還有治力,這里我們其實(shí)忽略了商品的價(jià)格,商品的價(jià)格和商品的笑臉、銷售額废亭、購(gòu)買人數(shù)之間是否有關(guān)系呢?
這個(gè)價(jià)格的我還真想看一下哈
df_3 = df_1.groupby('UnitPrice').agg({'Quantity':'sum' , 'sku_amount':'sum' , 'CustomerID':'nunique'})
df_3.reset_index(inplace=True)
然后宁玫,我們畫個(gè)散點(diǎn)圖瞧一瞧
df_3.plot.scatter(x='UnitPrice' , y='Quantity')
這單價(jià)都很低呦
順便來個(gè)累計(jì)值吧
df_3['Quantity_累計(jì)'] = df_3['Quantity'].cumsum()
df_3.plot.line(x='UnitPrice', y='Quantity_累計(jì)')
這個(gè)貌似看不出啥蚀狰,看看累計(jì)占比吧嚎尤,80%的銷量集中在什么地方
df_3['Quantity_累計(jì)占比'] = df_3['Quantity_累計(jì)']/df_3['Quantity'].sum()
df_3.query('Quantity_累計(jì)占比<=0.8')
4. 時(shí)間維度:每天荔仁、月、年的銷量、銷售額乏梁、購(gòu)買人數(shù)
要看時(shí)間的話次洼,我們得看看這個(gè)日期的字段類型
df_1.info()
使用to_datetime轉(zhuǎn)換一下
df_1['InvoiceDate'] = pd.to_datetime(df_1['InvoiceDate'])
我這里出來一個(gè)警告,不知道有沒有影響
我們先天看一下
df_1.resample('D' , on='InvoiceDate')['Quantity'].sum().plot.line()
這里可以發(fā)現(xiàn)1月多少號(hào)是一個(gè)峰值哎遇骑,1月份西方有什么重大節(jié)日嗎卖毁?
再按照月看看
df_1.resample('M' , on='InvoiceDate')['Quantity'].sum().plot.line()
看來,下半年是業(yè)績(jī)高峰落萎,尤其是11月份
時(shí)間維度可以拓展很多亥啦,比如看看星期,看看小時(shí)
這里遇到個(gè)問題模暗,我想把周幾和小時(shí)拿出來禁悠,但是不想要高維度的信息,我研究一下
df_1.resample('H' , on='InvoiceDate')['Quantity'].sum()
這里的天信息也在兑宇,其實(shí)我不需要碍侦,我咋只把小時(shí)拿出來呢?
df_1.groupby(df_1['InvoiceDate'].dt.hour)['Quantity'].sum().plot.line()
這里按銷量看的隶糕,基本都集中在中午左右
5. 國(guó)家維度:每個(gè)國(guó)家的銷量瓷产、銷售額、購(gòu)買人數(shù)
不行枚驻,有點(diǎn)兒搞不動(dòng)了濒旦,思路其實(shí)都差不多,看看訂單都集中在哪些國(guó)家再登,哪些國(guó)家的用戶數(shù)最多等等尔邓,從銷售額看看哪些國(guó)家貢獻(xiàn)的最多,人均貢獻(xiàn)額啥的
6. 用戶維度:用戶的訂單數(shù)锉矢、銷量(購(gòu)買件數(shù))梯嗽、銷售額、商品種類數(shù)
用戶可以看的信息也很多沽损,對(duì)用戶做一個(gè)分類灯节,比如RFM,打一個(gè)價(jià)值分绵估,復(fù)購(gòu)炎疆?復(fù)購(gòu)周期等
多個(gè)維度交叉
比如看看不同國(guó)家購(gòu)買的商品是否一致,不同國(guó)家的購(gòu)物時(shí)間是否一致等等
好了国裳,這一篇就到這形入,下次繼續(xù)