1、业务背景
Adventure Works Cycle是国内一家制造公司,该公司生产和销售金属和复合材料自行车在全国各个市场。销售方式主要有两种,前期主要是分销商模式,但是2018年公司实现财政收入目标后,2019就开始通过公司自有网站获取线上商户进一步扩大市场。
2、业务需求
2019年12月5日线上业务经理,需要向公司CEO汇报2019年11月自行车销售情况,所以数据部门要提供11月份线上自行业务数据分析报告。
2.1 业务分析指标
- 从整体的角度:自行车整体销售表现
- 从地域的角度:11月每个区域销售量表现、11月TOP10城市销售量表现
- 从产品的角度:11月类别产品销售量表现、11月细分产品销售量表现
- 热销产品:11月TOP10产品销量榜、11月TOP10销量增速榜
- 用户的角度:11月用户年龄分布及每个年龄段产品购买喜好、11月男女用户分布以及男女产品购买喜好
2.2 具体流程
3、数据分析
利用Python结合pandas和numpy从整体、地域、产品、热销产品和用户5个角度来计算每一块的业务指标,部分代码如下
自行车整体销售量表现部分:
自行车区域销售量变现:
部分powerbi画图如下:
最终的分析报告见:
链接:https://pan.baidu.com/s/1_nHIZO8kuPuhENiCvsQjjA
提取码:3txr
4、面对大数量的业务时怎么办
随着公司数据量增大,利用Python处理数据会变的很困难,考虑使用hive来进行数据聚合的操作。具体的流程如下
- 通过sqoop将数据导入hive数据库
以导入订单明细表为例sqoop_ods_sales_orders.sh文件如下,在Linux服务器上执行该文件。
hive -e "truncate table ods.ods_sales_orders"
sqoop import \
--hive-import \
--connect "jdbc:mysql://ip:port/adventure_ods?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&dontTrackOpenResources=true&defaultFetchSize=50000&useCursorFetch=true" \
--driver com.mysql.jdbc.Driver \
--username username \
--password password \
--query \
"select * from ods_sales_orders where "'$CONDITIONS'" " \
--fetch-size 50000 \
--hive-table ods.ods_sales_orders \
--hive-drop-import-delims \
--delete-target-dir \
--target-dir /user/hadoop/sqoop/ods_sales_orders \
-m 1
-
使用hive进行数据处理
涉及订单明细表ods_sales_orders和用户表ods_customer,表结构如下
计算了如下指标:
用户的回购率和复购率
-- 复购率
SELECT
umonth
, COUNT(1) as customes_cons
, SUM(if(ct > 1, 1, 0)) / COUNT(1) AS fgl
FROM (
SELECT
customer_key,
date_format(create_date,'YYYY-MM') as umonth,
COUNT(customer_key) AS ct
FROM ods_sales_orders
GROUP BY customer_key,date_format(create_date,'YYYY-MM')
) t
group by umonth;
-- 回购率
SELECT
a.umonth,
concat(round(COUNT(b.customer_key) / COUNT(a.customer_key) * 100, 2), '%') AS hgl
FROM (
SELECT
customer_key,
date_format(create_date,'YYYY-MM') AS umonth
FROM ods_sales_orders
GROUP BY customer_key, date_format(create_date,'YYYY-MM')
) a
left JOIN (
SELECT
customer_key,
date_format(create_date,'YYYY-MM') AS umonth
FROM ods_sales_orders
GROUP BY customer_key, date_format(create_date,'YYYY-MM')
) b
ON a.customer_key = b.customer_key
AND concat(a.umonth,'-01') = add_months(concat(b.umonth,'-01'),-1)
GROUP BY a.umonth;
统计各个省份所属城市下最受欢迎的Top 3产品和其销量
SELECT chinese_province
,chinese_city
,cpzl_zw
FROM (
SELECT chinese_province
,chinese_city
,cpzl_zw
,cp_count
,row_number() OVER (
PARTITION BY chinese_city
,chinese_city ORDER BY cp_count DESC
) AS cp_num
FROM (
SELECT t2.chinese_province
,t2.chinese_city
,t1.cpzl_zw
,count(t1.customer_key) AS cp_count
FROM ods_sales_orders t1
INNER JOIN ods_customer t2 ON t1.customer_key = t2.customer_key
GROUP BY t2.chinese_province
,t2.chinese_city
,t1.cpzl_zw
) t1
WHERE cp_count > 0
) t2
WHERE cp_num <= 3 ;
商品的销售数量top10,排名需考虑并列排名的情况
SELECT product_key
,cp_count
,cp_rank
FROM (
SELECT product_key
,cp_count
,dense_rank() OVER (
ORDER BY cp_count DESC
) AS cp_rank
FROM (
SELECT product_key
,count(cpzl_zw) AS cp_count
FROM ods_sales_orders
GROUP BY product_key
) t1
) t2
WHERE cp_rank <= 10;
计算累计和(统计2019年1-12月的累积销量,即1月为1月份的值,2月为1、2月份值的和,3月为1、2、3月份的和,12月为1-12月份值的和)
SELECT date_format(create_date, 'YYYY-MM') AS umonth
,count(sales_order_key) AS ucount
,sum(count(sales_order_key)) OVER (
ORDER BY date_format(create_date, 'YYYY-MM') ASC rows BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
) AS cumulative_amount
FROM ods_sales_orders
WHERE year(create_date) = '2019'
GROUP BY date_format(create_date, 'YYYY-MM')
ORDER BY umonth;
计算客户平均购买一次商品的间隔时间
SELECT customer_key
,avg(create_date2) AS avgdate
FROM (
SELECT customer_key
,create_date
,lead(create_date, 1, 0) OVER (
PARTITION BY customer_key ORDER BY create_date ASC
) AS create_date1
,datediff(lead(create_date, 1, 0) OVER (
PARTITION BY customer_key ORDER BY create_date ASC
), create_date) AS create_date2
FROM ods_sales_orders
) t1
WHERE create_date2 > 0
GROUP BY customer_key ;
- 通过sqoop将数据从hive导入MySQL数据库
以导出订单表dw_order_by_day为例
sqoop export --connect "jdbc:mysql://ip:port/database" \
--username username \
--password password \
--table dw_order_by_day \
--export-dir /user/hive/warehouse/ods.db/dw_order_by_day \
--input-null-string "\\\\N" \
--input-null-non-string "\\\\N" \
--input-fields-terminated-by "\001" \
--input-lines-terminated-by "\\n" \
-m 1
后面powerbi可连接MySQL数据库进行可视化工作,最后生成数据分析报告。