本文資料集來源:Baby Goods Info Data
資料庫:MySQL
資料庫管理軟體:DataGrip
可視化分析軟體:Tableau
本文sql檔案、可視化分析源檔案位址:DataScience
文章目錄
- 資料預處理與導入
-
- 導入資料到資料庫
- 資料探索:
-
- Trade表
-
- 統計缺失值資訊
- 使用者數量:
- 統計不同購買數量的使用者
- 商品類别
- 每次購買數量
- 時間跨度
- babyinfo表
-
- 缺失值統計
- 有資訊的使用者數量
- 不同性别嬰兒的數量
- 探索分析
-
- 銷量資訊
-
- 按天統計每天的銷量和活躍的使用者數量
- 觀察銷量在一周内的變化
- 分析按月購買的情況:
- 2015年春節前後銷量詳細分析
-
- 通過篩選器,觀察每年臘月初一到臘月十五的銷售額
- 往年臘月的銷售額與同比增速
- 觀察2014年和2015年臘月初一到臘月十五各産品大類的銷量與同比增速
- 臘月每天的銷量變化
- 對比每月新出生人數:
- 銷量與季度
- 産品類别分析
-
- 每個大類奶粉的購買情況
- 找到熱銷的子類資訊
- 嬰兒階段分析
-
- 每個年齡段的嬰兒數量和購買量:
- 各年齡購買情況
- 産品使用者畫像
-
- **不同産品大類的使用者群體分布**
- 不同使用者的産品購買比例
- 不同産品子類的使用者群體分布
- 複購情況分析
-
- 建立複購使用者的視圖
- 計算複購率
- 查詢有重複購買行為使用者複購的是否是同一小類的奶粉
- 查詢有重複購買行為使用者複購的是否是同一大類的奶粉
- 分析結果彙總
-
- 銷售趨勢分析
- 春節銷量低谷分析
- 銷售周期性分析
- 不同類别産品銷量占比分析
- 各年齡段銷售差異
資料預處理與導入
導入資料到資料庫
- 建立Trade表
create table trade
(
user_id varchar(20) not null comment '使用者id',
auction_id varchar(20) not null comment '購買行為編号',
cat_id varchar(20) null comment '商品所屬的大類下的子類',
cat1 varchar(15) null comment '商品所屬的大類',
property text null comment '商品屬性',
buy_mount int null comment '購買數量',
day varchar(8) null comment '購買日期'
);
- 使用DataGrip将
導入trade表(sample)sam_tianchi_mum_baby_trade_history.csv
- 建立babyinfo表
create table babyinfo
(
user_id varchar(20) not null,
birthday varchar(8) null,
gender char null
);
- 使用DataGrip将
導入babyinfo表(sample)sam_tianchi_mum_baby.csv
- 然後再在DataGrip修改日期資料的資料格式為date格式
- 定義表格時,直接使用date格式,導入會出現錯誤
資料探索:
Trade表
- buy_mount (購買數量/銷量)
- user_id(使用者id)
- auction_id(購買行為編号)
- cat1(商品所屬的大類)
- cat_id(cat1的子類,是更細分的類别)
- property(商品屬性)
- day(購買時間)
統計缺失值資訊
select
sum(user_id is null)
,sum(auction_id is null)
,sum(cat1 is null)
,sum(cat_id is null)
,sum(trade.property is null)
,sum(trade.buy_mount is null)
,sum(trade.day is null)
from trade;
- 隻有144條記錄的商品屬性property有缺失
使用者數量:
select
count(user_id)
,count(distinct user_id)
from trade;
- 29971條購買記錄中,卻有29944個使用者,說明隻有不到30個使用者購買超過兩次,說明奶粉類産品的複購率不是很高。
統計不同購買數量的使用者
select
buy_num
,count(user_id) as user_num
from
(
select
user_id
,count(user_id) as buy_num
from trade
group by user_id
)as tem
group by buy_num
order by user_num;
- 99.92%的使用者都隻購買了一次
商品類别
select
cat1,
count(distinct cat_id) as 子類數量
from trade
group by cat1
order by 子類數量;
- 總共有六個大類,每個大類下面分别由數量不一的子類構成
每次購買數量
select
buy_mount 每次購買數量
,count(user_id) 消費次數
from trade
group by buy_mount
order by 消費次數;
時間跨度
select max(day),
min(day)
from trade;
- 可以看到銷售資料從2012年7月開始,到2015年2月結束,其中2015年2月隻有5天的資料,資料不完整,在下面的聚類運算中,統計量會比較小
babyinfo表
- user_id(使用者id)
- birthday(出生日期)
- gender:性别(0 男孩,1 女孩,2性别不明)
缺失值統計
select sum(user_id is null),
sum(birthday is null),
sum(gender is null)
from babyinfo;
有資訊的使用者數量
select count(distinct user_id) -- 有資訊的使用者數量
from babyinfo;
- 雖然隻有3.2%的使用者有詳細的嬰兒年齡等資訊,但是考慮到資料抽樣的随機性,仍能反映出整體分布的一些規律資訊
不同性别嬰兒的數量
select gender, -- 不同性别的數量
count(gender)
from babyinfo
group by gender;
探索分析
銷量資訊
按天統計每天的銷量和活躍的使用者數量
- sql查詢語句
select day,
sum(buy_mount) as 銷量,
count(distinct user_id) as 使用者數量
from mytest.trade
group by day
order by day
- 使用tableau進行可視化
- 從圖中可以看到,在部分日期的銷量和使用者數量是平時資料幾千倍,可能會有異常,需要進行查明
- 查詢銷量異常記錄:
-- 查詢單次購買超過100的記錄數
select user_id,day,
buy_mount
from trade
where buy_mount>100
order by buy_mount desc;
- 從結果中可以看到,有不少使用者的一次購買量超過了100罐,甚至有一次購買10000罐的,很有可能是批發商購買或者是刷單行為,需要對這些記錄進行篩選剔除
經調查: 嬰幼兒在0-1歲時,理論上一共需要81罐400g奶粉,假設使用者除“雙十一”、“618”外其他時間每次隻購買1罐,那麼兩個購物節平均需要承擔27罐奶粉,向上取整後,以單筆銷量超過30罐奶粉作異常值處理。
- 更改連接配接sql語句,剔除異常銷量資料,重新查詢後,銷量使用者數量圖如下:
select day,
sum(buy_mount) as 銷量,
count(distinct user_id) as 使用者數量
from mytest.trade
where buy_mount < 30
group by day
order by day
- 1 從銷量圖上可以看出,每年的銷量高峰是雙十一和雙十二購物期間
- 2 在春節期間,銷量出現了明顯的低谷
- 3 購物節的銷量呈現逐年增加的趨勢
觀察銷量在一周内的變化
-- 分析按星期的銷量,使用者量
select dayname(day) as D,
sum(buy_num) as 銷量,
sum(user_num) as 活躍使用者量
from
(
select
day,
sum(buy_mount ) as buy_num,
count(distinct user_id) as user_num
from trade
where buy_mount<30
group by day
) as tem
group by D,dayofweek(day)
order by dayofweek(day) ;
- 可以看到周六日的銷量和活躍使用者數量都明顯小于工作日,很有可能是部分父母在周末需要帶孩子,而在工作日進行購買奶粉
分析按月購買的情況:
-- 分析按月購買的情況
select
月份,
max(if(年份 = 2012,buy_num,0)) as 2012年,
max(if(年份 = 2013,buy_num,0)) as 2013年,
max(if(年份 = 2014,buy_num,0)) as 2014年,
max(if(年份 = 2015,buy_num,0)) as 2015年
from
(
select
month(day) as 月份,
year(day) as 年份,
sum(buy_mount ) as buy_num,
count(distinct user_id) as user_num
from trade
where buy_mount<30
group by year(day), month(day)
) as tem
group by 月份
order by 月份;
- 在每年中,銷量主要呈現出兩個大的周期
- 周期1:2-5月銷量上升,5-7月銷量下降
- 周期2:7-11月銷量上升,11-2月份銷量下降
- 主要可能影響因素:
- 1 不同月份新生兒數量不同
- 2 不同月份的促銷力度不同
- 每年的1,2月份的銷量資料相對都比較低,可能是受到春節的影響,在後面需要對春節前後的銷量進行細緻分析,來采取2015年2月中後期的銷售決策
2015年春節前後銷量詳細分析
- 2013年春節:2月9日-2月15日
- 2014年春節:1月30日-2月6日
- 2015年春節:2月19日-2月25日
- 目前的資料隻截至到了2015年2月5日(臘月十七)
- 可以通過調用往年臘月的銷售資料,來輔助2015年臘月的銷售決策
通過篩選器,觀察每年臘月初一到臘月十五的銷售額
- 可以看到,2015年的臘月初一到十五的銷量雖然仍然很大,但是相比于去年的同比增速,今年的增速有所下降
往年臘月的銷售額與同比增速
- 截至目前2015年2月5日(據春節還有14天),已完成銷量已經超過了去年的臘月銷量,但是要想超過去年的增長率,仍然有
罐的銷售額需要完成,平均每天需要完成1029✖(1.7741)-1129= 696
罐的銷售目标。696/14=49.7
觀察2014年和2015年臘月初一到臘月十五各産品大類的銷量與同比增速
- 觀察可知,隻有28大類的銷售同比增速超過了去年,38大類産品增速基本與去年平均增速持平,二其他大類的增速都比較低于預期,需要詳細分析營銷政策。
臘月每天的銷量變化
- 可以看到,臘月十五過後,銷量會逐漸下降,是以需要在接下來1-2周内,馬上采取一定的促銷活動,來保證本月的銷售量達到或超過去年的同比增速。
對比每月新出生人數:
- 資料生成參考嬰兒資訊一節
- 通過與上圖比較可以看出,5月份的銷量高峰,很可能是受到8月份出生人數增加的影響,父母為了提前準備,進而提前購買了奶粉
- 11月的銷量高峰,是受到打折促銷的影響
銷量與季度
- 每年都是第一季度的銷量最少(春節影響),第二、第三季度銷量中等,第四季度銷量最高(打折促銷,為過年囤貨)。
産品類别分析
每個大類奶粉的購買情況
-- 每個大類奶粉的購買情況
select
cat1 as 類别,
sum(buy_mount) as 銷量,
count(distinct user_id) as 使用者數
from trade
where buy_mount<30
group by cat1
order by cat1;
- 50008168、28、50014815都是銷量比較大的産品類别,相比而言,其他類别的銷量比較少
- 銷量排名基本與使用者數量相同,除了38産品,雖然銷量排名第四,但是使用者量卻比較少,可能是使用者單次購買量較大,或者店家的滿減促銷做的比較好,需要進一步調查。
找到熱銷的子類資訊
-- 尋找熱銷子類(銷量前十或使用者數量前十)
select
tem1.*,
使用者量排名, 使用者量
from
(select cat_id,
@j := @j + 1 as 銷量排名,
銷量
from (select @j := 0) as t,
(
select cat_id,
sum(buy_mount) as 銷量
from trade
where buy_mount < 30
group by cat_id
order by sum(buy_mount) desc) as n
) as tem1
join
(select cat_id,
@i := @i + 1 as 使用者量排名,
使用者量
from (select @i := 0) as t,
(
select cat_id,
count(distinct user_id ) as 使用者量
from trade
where buy_mount < 30
group by cat_id
order by count(distinct user_id ) desc) as m
) as tem2
on tem1.cat_id = tem2.cat_id
where 銷量排名<10 or 使用者量排名<10;
- 可以看到,銷量比較高的奶粉子類的銷量,都基本上都在逐年增加,其中50010558的銷量增長迅速,可以在今年進行優先推廣。
- 通過tableau可以清晰地檢視不同子類銷售量的變化趨勢,進而采取不同的措施,來提高銷量
嬰兒階段分析
- 1段:0-6個月(4-6月已可食用輔食)
- 2段:6-12個月(6月大:可食用糊狀或泥狀的食物;9月大:可食用有硬度食物)
- 3段:1-3歲
- 4段:3-7歲(已經符合入讀公辦幼稚園的年齡,此階段奶類流質食物已經不是主流)
-- 建立年齡段資訊視圖
create view mytest.age_info as
(
select
b.user_id,
cat1,
cat_id,
buy_mount,
day as buy_day,
birthday,
(
case
when datediff(day,birthday)/30<0 then '未出生'
when datediff(day,birthday)/30<6 then '0-6個月'
when datediff(day,birthday)/365<1 then '6-12個月'
when datediff(day,birthday)/365<3 then '1-3歲'
when datediff(day,birthday)/365<7 then '3-7歲'
else '大于七歲'
end
) as 年齡分段,
if((floor(((to_days(`t`.`day`) - to_days(`b`.`birthday`)) / 365)) < 0), '未出生',
floor(((to_days(`t`.`day`) - to_days(`b`.`birthday`)) / 365))) AS `年齡`,
(
case gender
when 0 then '男'
when 1 then '女'
else '不明'
end
) as 性别
from babyinfo b
join trade t
on b.user_id = t.user_id
where t.buy_mount<30
);
每個年齡段的嬰兒數量和購買量:
-- 每個年齡段的人數和購買量:
select
年齡分段,
count(distinct user_id) as 人數,
sum(buy_mount) as 購買總量
from age_info
group by 年齡分段
order by field(年齡分段,'未出生','0-6個月','6-12個月','1-3歲','3-7歲','大于七歲');
- 1.在整個食用奶粉的各個階段中,1-3歲對奶粉的需求量最大
- 2.可以看到,有相當一部分家長,購買奶粉都是在孩子出生前購買的,可以考慮針對這種提前購買的行為,有針對性地展開銷售
各年齡購買情況
- 可以看到,0-1歲的使用者量和奶粉銷量都最高,随着年齡的上升,嬰兒逐漸能夠食用其他食物,奶粉需求逐漸下降
産品使用者畫像
不同産品大類的使用者群體分布
不同使用者的産品購買比例
不同産品子類的使用者群體分布
複購情況分析
建立複購使用者的視圖
create view mytest.multi_info
as
(
select
user_id,
cat_id,
cat1,
buy_mount,
day
from trade
where
user_id in
(
select
user_id
from trade
where buy_mount<30
group by user_id
having count(auction_id)>1
)
order by user_id,day);
計算複購率
-- 計算複購率
select
a.num1/count(distinct user_id) as 複購率
from
(select count(distinct user_id) as num1 from multi_info) as a ,
trade b;
查詢有重複購買行為使用者複購的是否是同一小類的奶粉
-- 查詢有重複購買行為使用者複購的是否是同一小類的奶粉
select
t.num as 複購産品種類數,
count(user_id) as 使用者數
from
(select
user_id,count(distinct cat_id) as num
from multi_info
group by user_id) as t
group by t.num;
查詢有重複購買行為使用者複購的是否是同一大類的奶粉
-- 查詢有重複購買行為使用者複購的是否是同一大類的奶粉
select
t.num as 複購産品種類數,
count(user_id) as 使用者數
from
(select
user_id,count(distinct cat1) as num
from multi_info
group by user_id) as t
group by t.num;
分析結果彙總
銷售趨勢分析
- 可以看到每年的銷售高峰在雙十一,雙十二兩個高峰,其他時間銷售量變化比較平穩
- 銷售量呈現逐年增加的趨勢,并且增速逐年增加
- 每年的春節期間,會出現銷量低谷
春節銷量低谷分析
- 截至目前2015年2月5日(據春節還有14天),已完成銷量已經超過了去年的臘月銷量,但是要想超過去年的增長率,仍然有
罐的銷售額需要完成,平均每天需要完成1029✖(1.7741)-1129= 696
罐的銷售目标。696/14=49.7
- 隻有28大類的銷售同比增速超過了去年,38大類産品增速基本與去年平均增速持平,二其他大類的增速都比較低于預期,需要詳細分析營銷政策。
- 臘月十五之後,銷量就會逐漸下降,是以需要在接下來一周内,采取營銷措施,來刺激銷量,進而達到去年的增長率
銷售周期性分析
- 在每年中,銷量主要呈現出兩個大的周期
- 周期1:2-5月銷量上升,5-7月銷量下降
- 周期2:7-11月銷量上升,11-2月份銷量下降
- 可以看到周六日的銷量和活躍使用者數量都明顯小于工作日,很有可能是部分父母在周末需要帶孩子,而在工作日進行購買奶粉
- 5月份的銷量高峰,很可能是受到8月份出生人數增加的影響,父母為了提前準備,進而提前購買了奶粉
不同類别産品銷量占比分析
各年齡段銷售差異
參考資料:
1隻會環比下降3%的資料分析師還有救嗎?
2電商嬰兒用品資料分析(SQL)