文章目录

  • 前言
  • 一、项目背景介绍
  • 二、需求分析与实现
    • 项目目标:
    • 项目任务:
    • 1.理解公司提供的数据以及之间的关系和逻辑
    • 2.罗列重要指标,布局BI
    • 3.Python处理数据
    • 4.Tableau链接Mysql数据库
    • 5.制作报表

前言

本文是对Adventure Works报告的一个总结,记录了整个项目需求分析与实现的过程。该项目主要任务是要对Adventure Works的总体销售数据进行可视化,涉及到使用Pyhton提取数据库中数据并进行加工处理,将处理后的数据放入数据库并连接到Tableau实现可视化。

分析成果的链接:销售报表

一、项目背景介绍

项目数据来源:数据来源于adventure Works Cycles公司的的样本数据库。

Adventure Works Cycles是一家大型跨国制造公司,基地在美国洛杉矶。该公司生产和销售自行车以及自行车相关物品,销售至全球各个地区。该公司2019年开始,对中国授权四个渠道代理商进行代理销售自家产品。该样本数据为2019年1月1日至今的销售相关数据,项目旨在帮助Adventure Works Cycles针对中国市场进行数据分析。

同时为了更好地理解该公司业务,以下附上一些简单介绍。

  1. 代理商介绍
    这家公司在中国有四个代理商,Adventure Works Cycles对代理商的基本要求:
    (1). 公司规模不小于200人,并且在中国有10年以上分销代理经验;
    (2). 必须能涉足线上以及线下去进行销售。

  2. 产品介绍
    这家公司主要有下面三个产品线:
    (1). Adventure Works Cycles生产的自行车,该产品线为公司主要产品,利润最大;
    (2). 自行车配件,如:轮胎、自行车架、自行车看台等;
    (3). 相关服饰,如运动衫、头盔、手套等。

二、需求分析与实现

项目目标:

通过现有数据,从渠道维度、产品维度、消费者维度分析重要指标,并获取最新的商品销售趋势,以及消费者画像,为公司的制造和销售提供指导性建议,以增加公司的收益。

项目任务:

  1. 理解公司数据库,梳理个数据表中的关系和逻辑
  2. 探索数据库并罗列分析指标
  3. 汇总数据建立数据仓库,并且搭建可视化监控数据

1.理解公司提供的数据以及之间的关系和逻辑

数据:
拿到的是ODS(Operation Data Store)层里,ods表和fact事实表的数据,即操作性储存数据。把数据整理成如下数据字典:

用户表:

表名 表注释 字段 字段注释
ods_customer 每日新增用户表 customer_key 客户主键
ods_customer 每日新增用户表 agent_key 代理商编号
ods_customer 每日新增用户表 create_date 创建日期
ods_customer 每日新增用户表 birth_date 生日
ods_customer 每日新增用户表 marital_status 是否结婚(M:是,S:否)
ods_customer 每日新增用户表 yearly_income 年收入
ods_customer 每日新增用户表 chinese_territory 所在区域(华北、华东…)
ods_customer 每日新增用户表 chinese_province 所在省份
ods_customer 每日新增用户表 chinese_city 所在城市
ods_customer 每日新增用户表 chinese_longitude 经度
ods_customer 每日新增用户表 chinese_latitude 纬度

产品表:

表名 表注释 字段 字段注释
ods_product 产品表 product_key 产品主键
ods_product 产品表 cpzl_zw 产品类别
ods_product 产品表 cplb_zw 产品子类
ods_product 产品表 cp_name 产品名
ods_product 产品表 unit_cost 产品成本
ods_product 产品表 unit_price 产品单价

代理商表:

表名 表注释 字段 字段注释
ods_distributor 代理商表 dist_key 代理商主键
ods_distributor 代理商表 dist_name 代理商全称
ods_distributor 代理商表 dist_contact 代理商联系方式
ods_distributor 代理商表 dist_email 代理商邮件
ods_distributor 代理商表 dist_address 代理商公司地址
ods_distributor 代理商表 from_date 开始合作时间
ods_distributor 代理商表 to_date 结束合作时间
ods_distributor 代理商表 dist_website 代理商线上商场网页
ods_distributor 代理商表 dist_POS_no 代理商拥有门店数

订单表:

表名 表注释 字段 字段注释
fact_sales_orders 订单明细表 sales_order_key 订单主键
fact_sales_orders 订单明细表 create_date 订单日期
fact_sales_orders 订单明细表 customer_key 客户主键
fact_sales_orders 订单明细表 dist_key 代理商主键
fact_sales_orders 订单明细表 product_key 产品主键
fact_sales_orders 订单明细表 sales_channel 购买渠道(线上/线下)

关系:

  1. 订单明细表的每条记录都有customer_key、dist_key、product_key去链接其他三个表。
  2. 一个代理商可能有零或多个用户,但一个用户必须属于一个代理商。当一个用户从不同代理商购物时,他会被默认成为一个新的用户。

2.罗列重要指标,布局BI

由于该公司生产的主要产品是耐用品,更换频率不高,top10%的客户才购买两件或两件以上,于是对消费者数的关注度不大。

dw_customer_orders["customer_key"].value_counts().describe(percentiles=[0.8,0.85,0.9])
"""
结果:
count   289581.00000
mean         1.13746
std          0.40705
min          1.00000
50%          1.00000
80%          1.00000
85%          1.00000
90%          2.00000
max          8.00000
Name: customer_key, dtype: float64
"""

主要关注整体的销量和销售额,并且对这两个指标的整体趋势,以及需要关注消费者特征(地域分布、消费能力等)。

  1. 销量=∑订单数
  2. 销售额=∑单个产品金额*购买客户数

同时还有成本、利润,并且根据实际情况,公司会有给不同代理商不同渠道不同产品设定目标,我随机创建了目标数据,在作图的时候体现出目标与实际的差距。

  1. 销量目标完成率=销量/目标销量
  2. 销售额目标完成率=销售额/目标销售额

随机生成目标的代码:

sum_amount_goal_list = []
sum_order_goal_list = []
for i in range(dw_by_day.shape[0]):sum_amount_goal = round(random.uniform(0.85, 1.15),2)sum_order_goal = round(random.uniform(0.85, 1.1),2)sum_amount_goal_list.append(sum_amount_goal)sum_order_goal_list.append(sum_order_goal)sum_amount_goal_list=pd.DataFrame({"目标销售额":sum_amount_goal_list})
sum_order_goal_list=pd.DataFrame({"目标销量":sum_order_goal_list})dw_by_day=pd.concat([dw_by_day,sum_amount_goal_list],axis=1)
dw_by_day=pd.concat([dw_by_day,sum_order_goal_list],axis=1)dw_by_day["目标销售额"]=dw_by_day["目标销售额"]*dw_by_day["总价"]
dw_by_day["目标销量"]=dw_by_day["目标销量"]*dw_by_day["订单数"]
dw_by_day["目标销量"]=dw_by_day["目标销量"].astype(int)

3.Python处理数据

代码如下(示例):

读取数据:

engine=create_engine('数据库类型+数据库驱动选择://数据库 用户名:数据库密码@服务器地址:端口/数据库?编码')sales_orders=pd.read_sql("select * from fact_sales_orders;",engine)

筛选数据:

#sales_orders里只要2019年-2020年sales_orders=sales_orders[(sales_orders["create_date"]>=datetime.date(2019, 1, 1)) & (sales_orders["create_date"]<=datetime.date(2020, 9, 30))]

合并表格:

dw_customer_orders=pd.merge(sales_orders,ods_customer,on="customer_key",how="left",validate="many_to_one")

创建一个时间维度表:

创建的目的是为了方便同比环比等指标计算


date_start=datetime.date(2019, 1, 1)
date_end=datetime.date(2020, 9, 30)date_list=[]
while date_start<=date_end:date_list.append(date_start)date_start+=datetime.timedelta(days=1)dim_date=pd.DataFrame({"create_date":date_list})dim_date["create_year_month"]=dim_date["create_date"].apply(lambda x:x.strftime("%Y-%m"))#增加年、月、日
dim_date["year"]=dim_date["create_date"].apply(lambda x: x.year)
dim_date["month"]=dim_date["create_date"].apply(lambda x: x.month)
dim_date["day"]=dim_date["create_date"].apply(lambda x: x.day)#增加季度
def quarter(month):if month in [1,2,3]:return 1elif month in [4,5,6]:return 2elif month in [7,8,9]:return 3elif month in [10,11,12]:return 4dim_date["quarter"]=dim_date["month"].apply(lambda x: quarter(x))#week_of_year:一年中的第几周
dim_date["week_of_year"]=dim_date["create_date"].apply(lambda x:x.isocalendar()[1])
#day_of_week:1表示星期一,2表示星期二,以此类推
dim_date["day_of_week"]=dim_date["create_date"].apply(lambda x:x.isocalendar()[2])#每个月有多少天
dim_date["days_in_month"]=dim_date.apply(lambda x:calendar.monthrange(x["year"],x["month"])[1],axis=1)dim_date["week_of_2year"]=dim_date["week_of_year"]
dim_date.loc[dim_date["create_date"]>=datetime.date(2019, 12, 30),"week_of_2year"]+=52'''
结果:create_date   create_year_month   year    month   day quarter week_of_year    day_of_week days_in_month   week_of_2year
0   2019-01-01  2019-01 2019    1   1   1   1   2   31  1
1   2019-01-02  2019-01 2019    1   2   1   1   3   31  1
2   2019-01-03  2019-01 2019    1   3   1   1   4   31  1
3   2019-01-04  2019-01 2019    1   4   1   1   5   31  1
4   2019-01-05  2019-01 2019    1   5   1   1   6   31  1
... ... ... ... ... ... ... ... ... ... ...
634 2020-09-26  2020-09 2020    9   26  3   39  6   30  91
635 2020-09-27  2020-09 2020    9   27  3   39  7   30  91
636 2020-09-28  2020-09 2020    9   28  3   40  1   30  92
637 2020-09-29  2020-09 2020    9   29  3   40  2   30  92
638 2020-09-30  2020-09 2020    9   30  3   40  3   30  92
'''

聚合数据:


#以下代码为字段更名后
#dw_customer_orders为fact_sales_orders表聚合了产品表、代理商表、时间维度表、客户表中的所需字段。dw_by_day=dw_customer_orders.groupby(["创建日期","星期","渠道","代理商","商品类别"]).agg({"客户ID":pd.Series.nunique,"订单ID":"count","价格":"sum"}).reset_index()dw_by_day.rename(columns={"客户ID":"客户数","订单ID":"销量","价格":"销售额"},inplace=True)

计算重要指标:


#环比
dw_by_day[["客户数环比","销量环比","销售额环比"]]=dw_by_day[["客户数","销量","销售额"]].pct_change()#同比
#这里用星期数,如这周一和上周一对比、这周二和上周二对比#加一列辅助列,用户计算每个代理商每个渠道每个商品类别的同比
use_for_tongbi=dw_by_day["计算同比"]=dw_by_day.apply(lambda x: str(x["代理商"]) + "-" + str(x["渠道"]) + "-" + str(x["商品类别"]),axis=1)week_no=dw_by_day["星期"].unique().tolist()
dist_channel_product=dw_by_day["计算同比"].unique().tolist()
customers_diff=pd.Series([])
orders_diff=pd.Series([])
amount_diff=pd.Series([])
for m in week_no:for n in dist_channel_product:customers_change=pd.Series([])customers_change=dw_by_day[(dw_by_day["星期"]==m) & (dw_by_day["计算同比"]==n)]["客户数"].pct_change()customers_diff=customers_diff.append(customers_change)orders_change=pd.Series([])orders_change=dw_by_day[(dw_by_day["星期"]==m) & (dw_by_day["计算同比"]==n)]["订单数"].pct_change()orders_diff=orders_diff.append(orders_change)amount_change=pd.Series([])amount_change=dw_by_day[(dw_by_day["星期"]==m) & (dw_by_day["计算同比"]==n)]["总价"].pct_change()amount_diff=amount_diff.append(amount_change)dw_by_day["客户数同比"]=customers_diff
dw_by_day["订单数同比"]=orders_diff
dw_by_day["总价同比"]=amount_diff#由于某些天无销售记录,会在第二天的环比数据中算出inf,无意义。于是用nan代替
dw_by_day.replace(np.inf,np.nan,inplace=True)
#把用于计算同比的列删掉
dw_by_day=dw_by_day.drop(["计算同比"],axis=1)

4.Tableau链接Mysql数据库

参考:Tableau链接Mysql数据库

5.制作报表

主页:

  1. 显示主要指标
  2. 筛选查看日期范围


趋势页:

  1. 显示销量、销售额趋势
  2. 销量、销售额和目标值的对比
  3. 显示同比以及同比趋势
  4. 可筛选查看日期范围
  5. 可筛选也日、月、季度为时间维度

消费者页:

  1. 消费者主要特征:年龄层、性别、购买渠道的偏好、消费能力等
  2. 热门地域
  3. 可筛选查看日期范围
  4. 可按产品筛选购买该产品的消费者特征


数据分析案例 自行车公司相关推荐

  1. 数据分析案例-航空公司满意度数据可视化

  2. python数据分析实战案例-Python数据分析案例实战

    原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...

  3. 26个数据分析案例——第二站:基于Hive的民航客户价值分析

    26个数据分析案例--第二站:基于Hive的民航客户价值分析 实验所需环境 • Python: Python 3.x: • Hadoop2.7.2环境: • Hive2.2.0 数据说明 资料包 链接 ...

  4. 视频教程-Python数据分析案例实战 视频课程-Python

    Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...

  5. 电商数据分析案例 与 职责要求

    一.数据分析的流程.数据分析的流程主要分为六步骤, 遵循这种方法,一个完整的数据分析项目就出来了. (1)明确分析目的:我们接到一个分析任务,首先要弄清楚我们分析的对象是什么,要达成怎样的目的,不能陷 ...

  6. python 数据分析 实际案例-Python数据分析案例实战

    原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...

  7. 数据分析案例学习---关于“线上教育提升毛利额问题

    数据分析案例学习-关于"线上教育提升毛利额问题"思路总结如下 一.背景分析拆解: 1.某教育公司成立于1999年,早年发展线下职业教育,已做到一定规模,有一定的群众基础.近年,互联 ...

  8. 3星|《数据思维:从数据分析到商业价值》:有趣的数据分析案例

    3星|<数据思维:从数据分析到商业价值>:有趣的数据分析案例 Posted on 2017-11-24 19:59 左其盛 阅读(118) 评论(0) 编辑 收藏 数据思维(从数据分析到商 ...

  9. 五十五、手把手教你从零到一,完成淘宝数据分析案例

    这是之前投稿的文章. 数据集下载 链接:https://pan.baidu.com/s/1eibGBqA7Whj73R3oEBYs2w 提取码:sbxs 淘宝数据分析案例 假设,老板是做服装的行业的. ...

最新文章

  1. etal斜体吗 参考文献_论文格式与论文参考文献格式
  2. 在职计算机答辩没有通过,在职研究生论文答辩没通过可以重新申请吗?
  3. 吴恩达朋友圈宣布“喜讯”:AI专家王冬岩加入Landing AI...
  4. Java内存之栈与堆
  5. 用 Go 构建一个区块链 -- Part 6: 交易(2)
  6. gtk+-hello,world
  7. java 同步中的线程出现异常会放弃锁吗
  8. Yet Another Counting Problem CodeForces - 1342C(规律+前缀和)
  9. cf1555B. Two Tables
  10. 渝粤教育 陕西师范大学 《初级微观经济学》作业
  11. [html] 你知道什么是粘性布局吗?
  12. 25条div+CSS编程提醒及小技巧整理
  13. 大数据分析对企业运营的价值体现
  14. Android中文URL乱码问题 解决
  15. 大型网站技术架构读书笔记
  16. vscode代码对比功能
  17. redis主从故障自动切换IP漂移
  18. seo网站优化,SEO优化费用
  19. 猜年龄python实现
  20. 数字信号处理相关4(FPGA实现FIR滤波器)

热门文章

  1. Android 蓝牙开发(一) -- 传统蓝牙聊天室
  2. J2EE、J2SE、J2ME的区别
  3. Win10激活提示“连接到internet激活windows”的最佳解决方法
  4. HOUDINI TIP | USING HOU MODULE IN VISUAL STUDIO CODE_手动在vscode里设置houdiniPython模块
  5. Android视频解码及渲染
  6. TREC Precision Medicine 使用Terrier进行信息检索
  7. 1.oracle的dump理解一 BH buffer header
  8. 3ds max照片级效果图渲染设置分享
  9. ros安装(一键最简安装,吹爆鱼香ROS,请叫我鱼吹)
  10. 图书管理系统之读者信息管理实现