BAT综合总结:数据分析 | 数据可视化图表,BI工具构建逻辑

一、数据可视化

1、基础概念

数据可视化,是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出来的信息,包括相应信息单位的各种属性和变量。

如果说的实际贴切的话:系统开发中常见的数据报表统计,将数据用图表或表格的形式呈现出来,帮助运营或者决策人员了解这些数据的规律或者价值,就是简单的可视化应用。

从开发角度来看,把系统中的核心数据,用一定的手段进行统计,在借助一些精美的图表样式,展示出来,或者把一系列图表组装成一个数据大屏,格调十足。

但是从运营人员的角度看,更多的是借助可视化数据分析业务场景,得到有价值的参考数据,为后续的决策或者开展活动提供指导。所以随着业务线的不断发展,对数据分析的要求越来越高,也就诞生现在比较常见的BI分析工具和BI分析师。

2、数据可视化价值

准确高效直观的传递传递数据中的规律和信息;

实时监控系统各项数据指标,实现数据的自解释;

基于可视化洞察数据规律,指定精准的运营策略;

3、基础构建原则

简单的步骤如下:基于业务需求,完成可视化数据处理(收集,规则,定时任务等)。借助常用的图表进行组合展示,但是也有一些注意事项如下:

可视化的数据要关联核心的有业务价值的数据;

图表的展现注意简单,明了,图表的本质就是让数据更直观;

不要为了追求系统花哨,可以大批量添加图表;

二、常用图表设计

1、常见基础图表

柱状图

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

折线图

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

饼状图

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

漏斗图

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

组合图

特点:多种基础图表组合,某些特殊业务数据,需要结合两种图或者更多种图表,强调装载该业务报表的关键组合信息。

2、数据大屏

顾名思义,放在大屏幕的报表,一般有多种丰富的业务数据,自然需要多种报表展现形式,比较有立体感和视觉上的冲击力。

絮叨一句:数据大屏在更多时候所追求的是让人印象深刻,这才是最关键的,懂的都懂。

三、常用统计方式

1、SQL分析语句

在报表类业务中,经常使用SQL分析语句,常用的几个方法:

count:数据求和,求总数,例如多少用户;

sum:求和函数,例如总销量,总成本等;

group-by:分组统计,分组结果就是轴标识;

average:平均值计算,例如平均每天销量;

业务类的报表虽然复杂,但是报表相关的数据接口相对而言简单,基于一些基础的统计SQL,生成报表数据。

2、基础案例

产品和纬度表

CREATETABLE`vc_product_info`(

`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键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`datetimeDEFAULTNULLCOMMENT'创建时间',

PRIMARYKEY(`id`)

)ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='产品信息表';

CREATETABLE`vc_product_detail`(

`id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'主键ID',

`product_id`INT(11)NOTNULLCOMMENT'产品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`datetimeDEFAULTNULLCOMMENT'创建时间',

PRIMARYKEY(`id`)

)ENGINE=INNODBDEFAULTCHARSET= utf8COMMENT='产品维度表';

基础查询语句

<!-- 商品种类 -->

SELECT COUNT(product_name) FROM vc_product_info

<!-- 销售总额度 -->

SELECT SUM(sales_amount) FROM vc_product_info

<!-- 分组求和 -->

SELECT product_sort,SUM(sales_amount) FROM vc_product_info GROUP BY product_sort

<!-- 平均单价 -->

SELECT AVG(price) FROM vc_product_info

四、自定义工具

1、数据集

数据集概念

DataSet是一个数据的集合,通常以列表形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。在统计分析的业务中,通常称为大宽表,方便业务分析。

数据集生成

视图方式

基于视图的方式,生成一个单表的数据集,方便简化操作。该方式不提倡,视图在大部分公司里是禁止使用的,这里只是单纯演示。

基于上述产品信息表和维度表,通过视图手段生成数据集,单纯为了简化业务分析的操作难度,因为多表联合简化成感觉上的单表。

CREATEORREPLACE

VIEWdata_set_viewASSELECT

t1.*, t2.place_origin,

t2.weight,

t2.color,

t2.high_praise,

t2.low_praise

FROM vc_product_info t1

LEFTJOINvc_product_detail t2ONt1.id = t2.product_id

任务方式

通过定时任务,获取要分析的数据结构,不断注入到分析表中,这是业务开发中最常见的报表数据集生成方式,有的甚至通过定时任务直接统计出报表需要的数据,不适应于大数据场景。

离线或实时计算

通过大数据分析手段,离线计算或者实时计算,获取业务报表数据,注入OLAP实时分析计算库,使用大数据分析场景。

2、定制化BI工具

BI工具可以快速对业务数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决策。商业智能的概念最早在1996年提出。当时将商业智能定义为一类由数据仓库(或数据集市)、查询报表、数据分析、数据挖掘、数据备份和恢复等部分组成的、以帮助企业决策为目的技术及其应用。

基本搭建思路:

管理数据源,建立数据表之间关系,维护特定数据集;

创建可拖拉拽的报告面板,用来承载单个图表组合;

封装不同的图表的处理逻辑,规则展示,关联数据集字段;

封装图表样式,例如大小、颜色、背景、交互等可配置;

图表关联分析数据集,报告面板组合多个图表生成报告;

实际的开发过程是非常复杂的,管理各个业务线的数据源,联合分析,适配各种图表规范和样式,都是一个十分漫长的过程。

3、基础案例

接口入参

承接上述业务场景,这里参数都需要动态传入,例如操作的:数据集、图表、参数归属轴、或者业务产品参数等。

@RestController

publicclassDefineController{

@Resource

privateDataSetService dataSetService ;

/**

    * 自定义可视化报告入参

    */

@GetMapping("/getDefChart")

publicMap> getDefChart (){

List chartParamList =newArrayList<>() ;

chartParamList.add(newChartParam("X",1,"data_set_view","product_sort")) ;

chartParamList.add(newChartParam("X",1,"data_set_view","product_name")) ;

chartParamList.add(newChartParam("Y",2,"data_set_view","high_praise")) ;

chartParamList.add(newChartParam("Y",2,"data_set_view","low_praise")) ;

chartParamList.add(newChartParam("Z",3,"data_set_view","inventory",1)) ;

chartParamList.add(newChartParam("Z",3,"data_set_view","total_sales",1)) ;

returndataSetService.analyData(chartParamList);

}

}

参数解析

根据各种动态参数,解析查询条件,获取查询结果。

@Service

publicclassDataSetServiceImplimplementsDataSetService{

@Resource

privateDataSetMapperdataSetMapper;

// 分析任务划分

    @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工具产生价值。

文章结束了,分享给大家一些Java架构师的学习教程(仅展示部分图片)。需要的小伙伴记得添加W❤:bjmsb07 免费获取奥!

感谢大家的阅读,看到最后了,希望大家给小编个关注,多多转发收藏哈。咱们下一篇不见不散!需要资料的小伙伴记得添加W❤:bjmsb07 免费获取奥!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342