数据分析案例 自行车公司
文章目录
- 前言
- 一、项目背景介绍
- 二、需求分析与实现
- 项目目标:
- 项目任务:
- 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针对中国市场进行数据分析。
同时为了更好地理解该公司业务,以下附上一些简单介绍。
代理商介绍
这家公司在中国有四个代理商,Adventure Works Cycles对代理商的基本要求:
(1). 公司规模不小于200人,并且在中国有10年以上分销代理经验;
(2). 必须能涉足线上以及线下去进行销售。产品介绍
这家公司主要有下面三个产品线:
(1). Adventure Works Cycles生产的自行车,该产品线为公司主要产品,利润最大;
(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 | 购买渠道(线上/线下) |
关系:
- 订单明细表的每条记录都有customer_key、dist_key、product_key去链接其他三个表。
- 一个代理商可能有零或多个用户,但一个用户必须属于一个代理商。当一个用户从不同代理商购物时,他会被默认成为一个新的用户。
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
"""
主要关注整体的销量和销售额,并且对这两个指标的整体趋势,以及需要关注消费者特征(地域分布、消费能力等)。
- 销量=∑订单数
- 销售额=∑单个产品金额*购买客户数
同时还有成本、利润,并且根据实际情况,公司会有给不同代理商不同渠道不同产品设定目标,我随机创建了目标数据,在作图的时候体现出目标与实际的差距。
- 销量目标完成率=销量/目标销量
- 销售额目标完成率=销售额/目标销售额
随机生成目标的代码:
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.制作报表
主页:
- 显示主要指标
- 筛选查看日期范围
趋势页:
- 显示销量、销售额趋势
- 销量、销售额和目标值的对比
- 显示同比以及同比趋势
- 可筛选查看日期范围
- 可筛选也日、月、季度为时间维度
消费者页:
- 消费者主要特征:年龄层、性别、购买渠道的偏好、消费能力等
- 热门地域
- 可筛选查看日期范围
- 可按产品筛选购买该产品的消费者特征
数据分析案例 自行车公司相关推荐
- 数据分析案例-航空公司满意度数据可视化
- python数据分析实战案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 26个数据分析案例——第二站:基于Hive的民航客户价值分析
26个数据分析案例--第二站:基于Hive的民航客户价值分析 实验所需环境 • Python: Python 3.x: • Hadoop2.7.2环境: • Hive2.2.0 数据说明 资料包 链接 ...
- 视频教程-Python数据分析案例实战 视频课程-Python
Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...
- 电商数据分析案例 与 职责要求
一.数据分析的流程.数据分析的流程主要分为六步骤, 遵循这种方法,一个完整的数据分析项目就出来了. (1)明确分析目的:我们接到一个分析任务,首先要弄清楚我们分析的对象是什么,要达成怎样的目的,不能陷 ...
- python 数据分析 实际案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 数据分析案例学习---关于“线上教育提升毛利额问题
数据分析案例学习-关于"线上教育提升毛利额问题"思路总结如下 一.背景分析拆解: 1.某教育公司成立于1999年,早年发展线下职业教育,已做到一定规模,有一定的群众基础.近年,互联 ...
- 3星|《数据思维:从数据分析到商业价值》:有趣的数据分析案例
3星|<数据思维:从数据分析到商业价值>:有趣的数据分析案例 Posted on 2017-11-24 19:59 左其盛 阅读(118) 评论(0) 编辑 收藏 数据思维(从数据分析到商 ...
- 五十五、手把手教你从零到一,完成淘宝数据分析案例
这是之前投稿的文章. 数据集下载 链接:https://pan.baidu.com/s/1eibGBqA7Whj73R3oEBYs2w 提取码:sbxs 淘宝数据分析案例 假设,老板是做服装的行业的. ...
最新文章
- etal斜体吗 参考文献_论文格式与论文参考文献格式
- 在职计算机答辩没有通过,在职研究生论文答辩没通过可以重新申请吗?
- 吴恩达朋友圈宣布“喜讯”:AI专家王冬岩加入Landing AI...
- Java内存之栈与堆
- 用 Go 构建一个区块链 -- Part 6: 交易(2)
- gtk+-hello,world
- java 同步中的线程出现异常会放弃锁吗
- Yet Another Counting Problem CodeForces - 1342C(规律+前缀和)
- cf1555B. Two Tables
- 渝粤教育 陕西师范大学 《初级微观经济学》作业
- [html] 你知道什么是粘性布局吗?
- 25条div+CSS编程提醒及小技巧整理
- 大数据分析对企业运营的价值体现
- Android中文URL乱码问题 解决
- 大型网站技术架构读书笔记
- vscode代码对比功能
- redis主从故障自动切换IP漂移
- seo网站优化,SEO优化费用
- 猜年龄python实现
- 数字信号处理相关4(FPGA实现FIR滤波器)
热门文章
- Android 蓝牙开发(一) -- 传统蓝牙聊天室
- J2EE、J2SE、J2ME的区别
- Win10激活提示“连接到internet激活windows”的最佳解决方法
- HOUDINI TIP | USING HOU MODULE IN VISUAL STUDIO CODE_手动在vscode里设置houdiniPython模块
- Android视频解码及渲染
- TREC Precision Medicine 使用Terrier进行信息检索
- 1.oracle的dump理解一 BH buffer header
- 3ds max照片级效果图渲染设置分享
- ros安装(一键最简安装,吹爆鱼香ROS,请叫我鱼吹)
- 图书管理系统之读者信息管理实现