数据分析 | 数据可视化图表,BI工具构建逻辑
本文源码:GitHub·点这里 || GitEE·点这里
一、数据可视化
1、基础概念
数据可视化,是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出来的信息,包括相应信息单位的各种属性和变量。
如果说的实际贴切的话:系统开发中常见的数据报表统计,将数据用图表或表格的形式呈现出来,帮助运营或者决策人员了解这些数据的规律或者价值,就是简单的可视化应用。
从开发角度来看,把系统中的核心数据,用一定的手段进行统计,在借助一些精美的图表样式,展示出来,或者把一系列图表组装成一个数据大屏,格调十足。
但是从运营人员的角度看,更多的是借助可视化数据分析业务场景,得到有价值的参考数据,为后续的决策或者开展活动提供指导。所以随着业务线的不断发展,对数据分析的要求越来越高,也就诞生现在比较常见的BI分析工具和BI分析师。
2、数据可视化价值
- 准确高效直观的传递传递数据中的规律和信息;
- 实时监控系统各项数据指标,实现数据的自解释;
- 基于可视化洞察数据规律,指定精准的运营策略;
3、基础构建原则
简单的步骤如下:基于业务需求,完成可视化数据处理(收集,规则,定时任务等)。借助常用的图表进行组合展示,但是也有一些注意事项如下:
- 可视化的数据要关联核心的有业务价值的数据;
- 图表的展现注意简单,明了,图表的本质就是让数据更直观;
- 不要为了追求系统花哨,可以大批量添加图表;
二、常用图表设计
1、常见基础图表
柱状图

特点:一般展现分组数据,直观展示各组数据差异,例如常见以每周,每月,或者不同客户端划分为轴的数据。
折线图

特点:重点展现数据的变化趋势,常见以时间为轴,展示时间下的数据趋势。
饼状图

特点:不注重数据明细,强调数据中各项占总体的百分比,或者分布情况,注重模块模块之间的对比。
漏斗图

特点:强调数据之间的转化关系和递进规律,经典常见就是用户浏览量,点击量,到订单支付数量。
组合图

特点:多种基础图表组合,某些特殊业务数据,需要结合两种图或者更多种图表,强调装载该业务报表的关键组合信息。
2、数据大屏
顾名思义,放在大屏幕的报表,一般有多种丰富的业务数据,自然需要多种报表展现形式,比较有立体感和视觉上的冲击力。

絮叨一句:数据大屏在更多时候所追求的是让人印象深刻,这才是最关键的,懂的都懂。
三、常用统计方式
1、SQL分析语句
在报表类业务中,经常使用SQL分析语句,常用的几个方法:
- count:数据求和,求总数,例如多少用户;
- sum:求和函数,例如总销量,总成本等;
- group-by:分组统计,分组结果就是轴标识;
- average:平均值计算,例如平均每天销量;
业务类的报表虽然复杂,但是报表相关的数据接口相对而言简单,基于一些基础的统计SQL,生成报表数据。
2、基础案例
产品和纬度表
CREATE TABLE `vc_product_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`product_sort` varchar(20) DEFAULT '' COMMENT '产品分类',
`product_name` varchar(50) DEFAULT '' COMMENT '产品名称',
`inventory` int(11) DEFAULT '0' COMMENT '库存剩余',
`price` decimal(10,2) DEFAULT '0.00' COMMENT '单价',
`total_sales` int(11) DEFAULT '0' COMMENT '销售总量',
`sales_amount` decimal(10,2) DEFAULT '0.00' COMMENT '销售总额',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品信息表';
CREATE TABLE `vc_product_detail` (
`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`product_id` INT (11) NOT NULL COMMENT '产品ID',
`place_origin` VARCHAR (50) DEFAULT '' COMMENT '产品产地',
`weight` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '重量',
`color` VARCHAR (50) DEFAULT '' COMMENT '颜色',
`high_praise` INT (11) DEFAULT '0' COMMENT '好评数量',
`low_praise` INT (11) DEFAULT '0' COMMENT '差评数量',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '产品维度表';
基础查询语句
<mapper namespace="com.visual.chart.mapper.ProductInfoMapper">
<!-- 商品种类 -->
<select id="countNum" resultType="java.lang.Integer">
SELECT COUNT(product_name) FROM vc_product_info
</select>
<!-- 销售总额度 -->
<select id="sumAll" resultType="java.lang.Double">
SELECT SUM(sales_amount) FROM vc_product_info
</select>
<!-- 分组求和 -->
<select id="groupSum" resultType="java.util.Map">
SELECT product_sort,SUM(sales_amount) FROM vc_product_info GROUP BY product_sort
</select>
<!-- 平均单价 -->
<select id="average" resultType="java.lang.Double">
SELECT AVG(price) FROM vc_product_info
</select>
</mapper>
四、自定义工具
1、数据集
数据集概念
DataSet是一个数据的集合,通常以列表形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。在统计分析的业务中,通常称为大宽表,方便业务分析。
数据集生成
视图方式
基于视图的方式,生成一个单表的数据集,方便简化操作。该方式不提倡,视图在大部分公司里是禁止使用的,这里只是单纯演示。
基于上述产品信息表和维度表,通过视图手段生成数据集,单纯为了简化业务分析的操作难度,因为多表联合简化成感觉上的单表。

CREATE OR REPLACE
VIEW data_set_view AS SELECT
t1.*, t2.place_origin,
t2.weight,
t2.color,
t2.high_praise,
t2.low_praise
FROM vc_product_info t1
LEFT JOIN vc_product_detail t2 ON t1.id = t2.product_id
任务方式
通过定时任务,获取要分析的数据结构,不断注入到分析表中,这是业务开发中最常见的报表数据集生成方式,有的甚至通过定时任务直接统计出报表需要的数据,不适应于大数据场景。
离线或实时计算
通过大数据分析手段,离线计算或者实时计算,获取业务报表数据,注入OLAP实时分析计算库,使用大数据分析场景。
2、定制化BI工具

BI工具可以快速对业务数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决策。商业智能的概念最早在1996年提出。当时将商业智能定义为一类由数据仓库(或数据集市)、查询报表、数据分析、数据挖掘、数据备份和恢复等部分组成的、以帮助企业决策为目的技术及其应用。
基本搭建思路:
- 管理数据源,建立数据表之间关系,维护特定数据集;
- 创建可拖拉拽的报告面板,用来承载单个图表组合;
- 封装不同的图表的处理逻辑,规则展示,关联数据集字段;
- 封装图表样式,例如大小、颜色、背景、交互等可配置;
- 图表关联分析数据集,报告面板组合多个图表生成报告;
实际的开发过程是非常复杂的,管理各个业务线的数据源,联合分析,适配各种图表规范和样式,都是一个十分漫长的过程。
3、基础案例
接口入参
承接上述业务场景,这里参数都需要动态传入,例如操作的:数据集、图表、参数归属轴、或者业务产品参数等。
@RestController
public class DefineController {
@Resource
private DataSetService dataSetService ;
/**
* 自定义可视化报告入参
*/
@GetMapping("/getDefChart")
public Map<Integer, List<ChartParam>> getDefChart (){
List<ChartParam> chartParamList = new ArrayList<>() ;
chartParamList.add(new ChartParam("X",1,"data_set_view","product_sort")) ;
chartParamList.add(new ChartParam("X",1,"data_set_view","product_name")) ;
chartParamList.add(new ChartParam("Y",2,"data_set_view","high_praise")) ;
chartParamList.add(new ChartParam("Y",2,"data_set_view","low_praise")) ;
chartParamList.add(new ChartParam("Z",3,"data_set_view","inventory",1)) ;
chartParamList.add(new ChartParam("Z",3,"data_set_view","total_sales",1)) ;
return dataSetService.analyData(chartParamList);
}
}
参数解析
根据各种动态参数,解析查询条件,获取查询结果。
@Service
public class DataSetServiceImpl implements DataSetService {
@Resource
private DataSetMapper dataSetMapper ;
// 分析任务划分
@Override
public Map<Integer, List<ChartParam>> analyData(List<ChartParam> chartParamList) {
Map<Integer, List<ChartParam>> dataMap = chartParamList.stream()
.collect(Collectors
.groupingBy(ChartParam::getDataType));
for (Integer dataType:dataMap.keySet()){
switch (dataType){
case 1: // Count 风格数据
taskCount(dataMap.get(dataType));
break;
case 2: // Sum 风格数据
taskSum(dataMap.get(dataType));
break;
case 3: // Percent 风格数据
taskPercent(dataMap.get(dataType));
break;
default:
break;
}
}
return dataMap ;
}
// Count 数据执行
private void taskCount (List<ChartParam> chartParamList){
for (ChartParam chartParam:chartParamList){
chartParam.setResultNum(dataSetMapper.taskCount(chartParam.getColumnName(),
chartParam.getTableName()));
}
}
// Sum 数据执行
private void taskSum (List<ChartParam> chartParamList){
for (ChartParam chartParam:chartParamList){
chartParam.setResultNum(dataSetMapper.taskSum(chartParam.getColumnName(),
chartParam.getTableName()));
}
}
// Percent 数据执行
private void taskPercent (List<ChartParam> chartParamList){
for (ChartParam chartParam:chartParamList){
chartParam.setResultNum(dataSetMapper.taskPercent(chartParam.getColumnName(),
chartParam.getTableName(),
chartParam.getProductId()));
}
}
}
总结一句:数据可视化工具建设是个漫长过程,不仅仅可以分析自己公司的业务,也可以作为开放BI工具产生价值。
五、源代码地址
GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

推荐阅读:《架构设计系列》,萝卜青菜,各有所需
| 序号 | 标题 |
|---|---|
| 01 | 架构设计:单服务.集群.分布式,基本区别和联系 |
| 02 | 架构设计:分布式业务系统中,全局ID生成策略 |
| 03 | 架构设计:分布式系统调度,Zookeeper集群化管理 |
| 04 | 架构设计:接口幂等性原则,防重复提交Token管理 |
| 05 | 架构设计:缓存管理模式,监控和内存回收策略 |
数据分析 | 数据可视化图表,BI工具构建逻辑的更多相关文章
- Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)
Webstorm+Webpack+echarts ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...
- ECharts-基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表
ECharts http://ecomfe.github.com/echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算 ...
- Python调用matplotlib实现交互式数据可视化图表案例
交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...
- Excel数据可视化图表设计需要注意的几个问题
大数据发展迅速的时代,数据分析驱动商业决策.对于庞大.无序.复杂的数据要是没经过合适的处理,价值就无法体现. 可以想象一本没有图片的教科书.没有图表.图形或是带有箭头和标签的插图或流程图,那么这门学 ...
- 数据可视化图表ECharts
介绍: ECharts是一个基于ZRender(轻量级Canvas类库)的纯javascript图表库,提供可交互.个性化的数据可视化图表. ECharts提供了折线图.柱状图.散点图.饼图.K线图, ...
- 百度数据可视化图表套件echart实战
最近我一直在做数据可视化的前端工作,我用的最多的绘图工具是d3.d3有点像photoshop,功能很强大,例子也很多,但是学习成本也不低,做项目是需要较大人力投入的.3月底由在亚马逊工作的同学介绍下使 ...
- Caravel–一款开源OLAP+数据可视化分析前端工具,支持Druid和Kylin
参考此文:http://lxw1234.com/archives/2016/06/681.htm
- 📈📈📈📈📈iOS 图表框架 AAChartKit ---强大的高颜值数据可视化图表框架,支持柱状图、条形图、折线图、曲线图、折线填充图、曲线填充图、气泡图、扇形图、环形图、散点图、雷达图、混合图
English Document
- [Java]数据分析--数据可视化
时间序列 需求:将一组字符顺序添加到时间序列中 实现:定义时间序列类TimeSeries,包含静态类Entry表示序列类中的各项,以及add,get,iterator,entry方法 TimeSeri ...
随机推荐
- 【Scala】什么是隐式转换?它又能用来干嘛?该怎么用
文章目录 定义 隐式参数 隐式转换 隐式值:给方法提供参数 隐式视图 将Int和Double类型转换为String 狗狗学技能(使用别的类中的方法) 使用规则 定义 隐式参数 隐式参数指在函数或者方法 ...
- 使用 React hooks 转化 class 的一些思考
Hooks 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 使用 React hooks 转化 class 的一些思考 ...
- Hexo 博客利用 Nginx 实现中英文切换
本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中 ...
- spring boot构建restful服务
使用spring boot快速构建出restful服务 JPA实现REST 创建spring boot项目,在项目文件pom.xml中添加以下依赖: <dependency> <gr ...
- python 数据类型: 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary
#python中标准数据类型 字符串String 列表List 元组Tuple 集合Set 字典Dictionary 铭记:变量无类型,对象有类型 #单个变量赋值 countn00 = '; #整数 ...
- 移动端纯css超出盒子出现横向滚动条
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- SpringMVC 类型转换错误自定义返回
在SpringMVC捕获异常只需要实现接口org.springframework.web.servlet.HandlerExceptionResolver,即可自定义返回异常,如:属性转换异常 @Re ...
- PC、APP、H5三端测试的区别
一,针对同一个系统功能的测试,三端所测的业务流程是一样的 二,一般情况下手机端和PC端都对应一套后台服务,比如说笔者公司所开发的互联网金融平台,整个平台做了分布式服务架构,后台服务包括用户服务.交易服 ...
- python mysql数据库基本操作方法
实现:使用Python实现用户登录,如果用户存在(数据库表中存在)则登录成功(假设该用户已在数据库中) import pymysql username = input('输入用户名:').strip( ...
- 基于Memcached的Nginx服务器集群session共享
原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...