溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

發(fā)布時間:2020-08-10 01:46:33 來源:ITPUB博客 閱讀:199 作者:知了一笑 欄目:編程語言

本文源碼: GitHub·點這里 || GitEE·點這里

一、數(shù)據(jù)可視化

1、基礎(chǔ)概念

數(shù)據(jù)可視化,是關(guān)于數(shù)據(jù)視覺表現(xiàn)形式的科學(xué)技術(shù)研究。其中,這種數(shù)據(jù)的視覺表現(xiàn)形式被定義為,一種以某種概要形式抽取出來的信息,包括相應(yīng)信息單位的各種屬性和變量。

如果說的實際貼切的話:系統(tǒng)開發(fā)中常見的數(shù)據(jù)報表統(tǒng)計,將數(shù)據(jù)用圖表或表格的形式呈現(xiàn)出來,幫助運營或者決策人員了解這些數(shù)據(jù)的規(guī)律或者價值,就是簡單的可視化應(yīng)用。

從開發(fā)角度來看,把系統(tǒng)中的核心數(shù)據(jù),用一定的手段進(jìn)行統(tǒng)計,在借助一些精美的圖表樣式,展示出來,或者把一系列圖表組裝成一個數(shù)據(jù)大屏,格調(diào)十足。

但是從運營人員的角度看,更多的是借助可視化數(shù)據(jù)分析業(yè)務(wù)場景,得到有價值的參考數(shù)據(jù),為后續(xù)的決策或者開展活動提供指導(dǎo)。所以隨著業(yè)務(wù)線的不斷發(fā)展,對數(shù)據(jù)分析的要求越來越高,也就誕生現(xiàn)在比較常見的BI分析工具和BI分析師。

2、數(shù)據(jù)可視化價值

  • 準(zhǔn)確高效直觀的傳遞傳遞數(shù)據(jù)中的規(guī)律和信息;
  • 實時監(jiān)控系統(tǒng)各項數(shù)據(jù)指標(biāo),實現(xiàn)數(shù)據(jù)的自解釋;
  • 基于可視化洞察數(shù)據(jù)規(guī)律,指定精準(zhǔn)的運營策略;

3、基礎(chǔ)構(gòu)建原則

簡單的步驟如下:基于業(yè)務(wù)需求,完成可視化數(shù)據(jù)處理(收集,規(guī)則,定時任務(wù)等)。借助常用的圖表進(jìn)行組合展示,但是也有一些注意事項如下:

  • 可視化的數(shù)據(jù)要關(guān)聯(lián)核心的有業(yè)務(wù)價值的數(shù)據(jù);
  • 圖表的展現(xiàn)注意簡單,明了,圖表的本質(zhì)就是讓數(shù)據(jù)更直觀;
  • 不要為了追求系統(tǒng)花哨,可以大批量添加圖表;

二、常用圖表設(shè)計

1、常見基礎(chǔ)圖表

柱狀圖

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

特點:一般展現(xiàn)分組數(shù)據(jù),直觀展示各組數(shù)據(jù)差異,例如常見以每周,每月,或者不同客戶端劃分為軸的數(shù)據(jù)。

折線圖

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

特點:重點展現(xiàn)數(shù)據(jù)的變化趨勢,常見以時間為軸,展示時間下的數(shù)據(jù)趨勢。

餅狀圖

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

特點:不注重數(shù)據(jù)明細(xì),強(qiáng)調(diào)數(shù)據(jù)中各項占總體的百分比,或者分布情況,注重模塊模塊之間的對比。

漏斗圖

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

特點:強(qiáng)調(diào)數(shù)據(jù)之間的轉(zhuǎn)化關(guān)系和遞進(jìn)規(guī)律,經(jīng)典常見就是用戶瀏覽量,點擊量,到訂單支付數(shù)量。

組合圖

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

特點:多種基礎(chǔ)圖表組合,某些特殊業(yè)務(wù)數(shù)據(jù),需要結(jié)合兩種圖或者更多種圖表,強(qiáng)調(diào)裝載該業(yè)務(wù)報表的關(guān)鍵組合信息。

2、數(shù)據(jù)大屏

顧名思義,放在大屏幕的報表,一般有多種豐富的業(yè)務(wù)數(shù)據(jù),自然需要多種報表展現(xiàn)形式,比較有立體感和視覺上的沖擊力。

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

絮叨一句:數(shù)據(jù)大屏在更多時候所追求的是讓人印象深刻,這才是最關(guān)鍵的,懂的都懂。

三、常用統(tǒng)計方式

1、SQL分析語句

在報表類業(yè)務(wù)中,經(jīng)常使用SQL分析語句,常用的幾個方法:

  • count:數(shù)據(jù)求和,求總數(shù),例如多少用戶;
  • sum:求和函數(shù),例如總銷量,總成本等;
  • group-by:分組統(tǒng)計,分組結(jié)果就是軸標(biāo)識;
  • average:平均值計算,例如平均每天銷量;

業(yè)務(wù)類的報表雖然復(fù)雜,但是報表相關(guān)的數(shù)據(jù)接口相對而言簡單,基于一些基礎(chǔ)的統(tǒng)計SQL,生成報表數(shù)據(jù)。

2、基礎(chǔ)案例

產(chǎn)品和緯度表

CREATE TABLE `vc_product_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `product_sort` varchar(20) DEFAULT '' COMMENT '產(chǎn)品分類',
  `product_name` varchar(50) DEFAULT '' COMMENT '產(chǎn)品名稱',
  `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 '創(chuàng)建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='產(chǎn)品信息表';
CREATE TABLE `vc_product_detail` (
    `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
    `product_id` INT (11) NOT NULL COMMENT '產(chǎn)品ID',
    `place_origin` VARCHAR (50) DEFAULT '' COMMENT '產(chǎn)品產(chǎn)地',
    `weight` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '重量',
    `color` VARCHAR (50) DEFAULT '' COMMENT '顏色',
    `high_praise` INT (11) DEFAULT '0' COMMENT '好評數(shù)量',
    `low_praise` INT (11) DEFAULT '0' COMMENT '差評數(shù)量',
    `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
    PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '產(chǎn)品維度表';

基礎(chǔ)查詢語句

<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、數(shù)據(jù)集

數(shù)據(jù)集概念

DataSet是一個數(shù)據(jù)的集合,通常以列表形式出現(xiàn)。每一列代表一個特定變量。每一行都對應(yīng)于某一成員的數(shù)據(jù)集的問題。在統(tǒng)計分析的業(yè)務(wù)中,通常稱為大寬表,方便業(yè)務(wù)分析。

數(shù)據(jù)集生成

視圖方式

基于視圖的方式,生成一個單表的數(shù)據(jù)集,方便簡化操作。該方式不提倡,視圖在大部分公司里是禁止使用的,這里只是單純演示。

基于上述產(chǎn)品信息表和維度表,通過視圖手段生成數(shù)據(jù)集,單純?yōu)榱撕喕瘶I(yè)務(wù)分析的操作難度,因為多表聯(lián)合簡化成感覺上的單表。

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

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

任務(wù)方式

通過定時任務(wù),獲取要分析的數(shù)據(jù)結(jié)構(gòu),不斷注入到分析表中,這是業(yè)務(wù)開發(fā)中最常見的報表數(shù)據(jù)集生成方式,有的甚至通過定時任務(wù)直接統(tǒng)計出報表需要的數(shù)據(jù),不適應(yīng)于大數(shù)據(jù)場景。

離線或?qū)崟r計算

通過大數(shù)據(jù)分析手段,離線計算或者實時計算,獲取業(yè)務(wù)報表數(shù)據(jù),注入OLAP實時分析計算庫,使用大數(shù)據(jù)分析場景。

2、定制化BI工具

數(shù)據(jù)分析 | 數(shù)據(jù)可視化圖表,BI工具構(gòu)建邏輯

BI工具可以快速對業(yè)務(wù)數(shù)據(jù)進(jìn)行有效的整合,快速準(zhǔn)確的提供報表并提出決策依據(jù),幫助企業(yè)做出明智的業(yè)務(wù)經(jīng)營決策。商業(yè)智能的概念最早在1996年提出。當(dāng)時將商業(yè)智能定義為一類由數(shù)據(jù)倉庫(或數(shù)據(jù)集市)、查詢報表、數(shù)據(jù)分析、數(shù)據(jù)挖掘、數(shù)據(jù)備份和恢復(fù)等部分組成的、以幫助企業(yè)決策為目的技術(shù)及其應(yīng)用。

基本搭建思路:

  • 管理數(shù)據(jù)源,建立數(shù)據(jù)表之間關(guān)系,維護(hù)特定數(shù)據(jù)集;
  • 創(chuàng)建可拖拉拽的報告面板,用來承載單個圖表組合;
  • 封裝不同的圖表的處理邏輯,規(guī)則展示,關(guān)聯(lián)數(shù)據(jù)集字段;
  • 封裝圖表樣式,例如大小、顏色、背景、交互等可配置;
  • 圖表關(guān)聯(lián)分析數(shù)據(jù)集,報告面板組合多個圖表生成報告;

實際的開發(fā)過程是非常復(fù)雜的,管理各個業(yè)務(wù)線的數(shù)據(jù)源,聯(lián)合分析,適配各種圖表規(guī)范和樣式,都是一個十分漫長的過程。

3、基礎(chǔ)案例

接口入?yún)?/strong>

承接上述業(yè)務(wù)場景,這里參數(shù)都需要動態(tài)傳入,例如操作的:數(shù)據(jù)集、圖表、參數(shù)歸屬軸、或者業(yè)務(wù)產(chǎn)品參數(shù)等。

@RestController
public class DefineController {
    @Resource
    private DataSetService dataSetService ;
    /**
     * 自定義可視化報告入?yún)?     */
    @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);
    }
}

參數(shù)解析

根據(jù)各種動態(tài)參數(shù),解析查詢條件,獲取查詢結(jié)果。

@Service
public class DataSetServiceImpl implements DataSetService {
    @Resource
    private DataSetMapper dataSetMapper ;
    // 分析任務(wù)劃分
    @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 風(fēng)格數(shù)據(jù)
                    taskCount(dataMap.get(dataType));
                    break;
                case 2: // Sum 風(fēng)格數(shù)據(jù)
                    taskSum(dataMap.get(dataType));
                    break;
                case 3: // Percent 風(fēng)格數(shù)據(jù)
                    taskPercent(dataMap.get(dataType));
                    break;
                default:
                    break;
            }
        }
        return dataMap ;
    }
    // Count 數(shù)據(jù)執(zhí)行
    private void taskCount (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskCount(chartParam.getColumnName(),
                                                            chartParam.getTableName()));
        }
    }
    // Sum 數(shù)據(jù)執(zhí)行
    private void taskSum (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskSum(chartParam.getColumnName(),
                                                          chartParam.getTableName()));
        }
    }
    // Percent 數(shù)據(jù)執(zhí)行
    private void taskPercent (List<ChartParam> chartParamList){
        for (ChartParam chartParam:chartParamList){
            chartParam.setResultNum(dataSetMapper.taskPercent(chartParam.getColumnName(),
                                                              chartParam.getTableName(),
                                                              chartParam.getProductId()));
        }
    }
}

總結(jié)一句:數(shù)據(jù)可視化工具建設(shè)是個漫長過程,不僅僅可以分析自己公司的業(yè)務(wù),也可以作為開放BI工具產(chǎn)生價值。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI