基于ETL与蓝图编辑器的浏览器用户行为大屏可视化实践
1 实验目的
本实验基于“用户–日–浏览器–小时”明细表,完成数据大屏所需的各项统计表加工,包括:
·浏览器市场格局统计(覆盖率、使用时长)
·浏览器周活跃趋势统计
·浏览器使用频率分布统计
·用户浏览器使用数量分布统计
·浏览器工作日与周末使用对比统计
·用户画像统计(性别、年龄、学历、职业、收入、居住地类型、省份分布)
2 实验环境
·实验平台:助睿在线实验平台 https://lab.guilian.cn/
本次实验使用助睿数智(Uniplore)作为一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学与企业数据加工场景。
助睿数智官网为https://www.uniplore.com/
·数据处理:助睿 ETL 数据集成平台
·建模平台:助睿 AI 人工智能平台
·数据规模:1000 用户,800 万 + 条行为记录,约 825MB
3 实验数据
本实验基于上个实验《浏览器用户行为分析与流失预测–数据加工》产出的数据,以及原始数据 demographic用户属性表。
上个实验已输出的数据:
·daily_browser_detail:用户–日–浏览器–小时明细表(将在本实验第4.1节中输出)
·browser_coverage:浏览器市场覆盖率统计表
·browser_hourly:浏览器时段活跃统计表
4 整体分析框架
4.1 我们要回答什么业务问题?
在制作数据大屏之前,我们需要先明确一个问题:大屏上要展示什么?
大屏的每个图表、每个数字,都需要有对应的数据来源。我们不能在大屏上直接查询原始明细表( behavior_events),因为:
1.原始明细表数据量大,查询慢,影响大屏加载速度
2.大屏需要的是聚合后的统计结果,不是原始明细
3.多个图表可能共用同一份聚合数据,提前加工可以避免重复计算
因此,在设计大屏之前,我们首先需要明确:我们要通过数据分析回答哪些业务问题?
|
业务问题 |
为什么重要 |
|
哪个浏览器用户最多? |
了解市场领导者,判断自身产品的市场地位 |
|
哪个浏览器用户用得最久? |
用户数多不代表粘性高,使用时长方能反映真实依赖度 |
|
用户活跃度在增长还是下降? |
判断产品生命周期,及时发现衰退信号 |
|
用户什么时候最活跃? |
优化推送和运营时机,在正确时间触达用户 |
|
用户是重度使用还是偶尔打开? |
区分核心用户和边缘用户,制定差异化运营策略 |
|
用户同时用几个浏览器? |
了解用户忠诚度,判断是否存在被竞品替代的风险 |
|
用户还用什么其他浏览器? |
识别主要竞争对手,制定针对性竞争策略 |
|
工作日和周末使用习惯有何不同? |
区分工作场景和娱乐场景,优化产品功能 |
|
核心用户是谁?(性别、年龄、职业) |
明确目标用户群体,指导产品设计和营销方向 |
|
用户的教育水平如何? |
影响产品复杂度设计,高学历用户可能接受更复杂的功能 |
|
用户的收入水平如何? |
影响商业化策略,高收入用户付费意愿更强 |
|
用户分布在哪里?(城市、省份) |
指导区域市场拓展和资源投放 |
4.2 选择哪些分析维度来回答这些问题?
根据上述业务问题,我们可以分为2个部分:市场分析与用户画像,这2个部分可以选择以下分析维度:
大屏一:浏览器市场行为分析
|
维度 |
回答的业务问题 |
核心指标 |
|
市场格局 |
哪个浏览器用户最多?哪个用得最久? |
用户数、使用时长占比、人均时长 |
|
周活跃趋势 |
用户活跃度在增长还是下降? |
每周活跃用户数 |
|
时段偏好 |
用户什么时候最活跃? |
24小时活跃分布 |
|
使用频率 |
用户是重度还是轻度使用? |
轻/中/重度用户占比 |
|
浏览器使用数量 |
用户同时用几个浏览器? |
1种/2种/3种及以上用户占比 |
|
竞品重叠 |
用户还用什么其他浏览器? |
同时使用两个浏览器的用户数 |
|
工作日vs周末 |
工作和娱乐时使用习惯有何不同? |
工作日/周末使用时长对比 |
大屏一:浏览器用户画像分析
|
维度 |
回答的业务问题 |
核心指标 |
|
性别分布 |
男女用户比例如何? |
男性/女性用户数及占比 |
|
年龄分布 |
哪个年龄段的用户最多? |
各年龄段用户数及占比 |
|
学历分布 |
用户教育水平如何? |
各学历层次用户数及占比 |
|
职业分布 |
哪些职业的用户最多? |
各职业用户数及占比 |
|
收入分布 |
用户收入水平如何? |
各收入段用户数及占比 |
|
居住地类型分布 |
城市用户还是乡镇用户多? |
城市/城郊/乡村用户占比 |
|
地域分布 |
用户分布在哪些省份? |
各省份用户数 |
4.3 需要加工哪些目标表?
根据上述分析维度,我们反推出需要加工的目标表:
大屏一目标表:
|
目标表 |
对应维度 |
数据来源 |
|
browser_overview |
核心指标 |
daily_browser_detail |
|
browser_coverage |
市场格局 |
daily_browser_detail |
|
browser_weekly_active |
周活跃趋势 |
daily_browser_detail |
|
browser_hourly |
时段偏好 |
daily_browser_detail |
|
browser_frequency_stats |
使用频率 |
daily_browser_detail |
|
browser_multi_usage |
浏览器使用数量 |
daily_browser_detail |
|
browser_cooccurrence |
竞品重叠 |
daily_browser_detail |
|
browser_weekday_weekend |
工作日vs周末 |
daily_browser_detail |
大屏二目标表:
|
目标表 |
对应维度 |
数据来源 |
|
user_profile_stats |
性别、年龄、学历、职业、收入、省份、居住地类型 |
demographic、daily_browser_detail |
4.4 目标表与数据来源关系
暂时无法在飞书文档外展示此内容
5 各目标表加工说明
|
目标表 |
用途 |
加工逻辑 |
数据来源 |
|
browser_coverage |
回答“哪个浏览器用户最多?哪个用得最久?” |
按 browser_name 分组,统计用户数、总时长、人均时长 |
daily_browser_detail(已在上个实验输出) |
|
browser_hourly |
回答“用户什么时候最活跃?” |
按 browser_name、hour 分组,统计活跃用户数 |
daily_browser_detail(已在上个实验输出) |
|
browser_weekly_active |
回答“用户活跃度在增长还是下降?” |
按 browser_name 和周编号分组,统计每周活跃用户数 |
daily_browser_detail |
|
browser_frequency_stats |
回答“用户是重度还是轻度使用?” |
计算每个用户的周使用时长,按阈值(轻度<3h、中度3-10h、重度>10h)划分等级,再按浏览器分组统计 |
daily_browser_detail |
|
browser_multi_usage |
回答“用户同时用几个浏览器?” |
统计每个用户使用多少种不同的浏览器,按1种、2种、3种及以上分组 |
daily_browser_detail |
|
browser_cooccurrence |
回答“用户还用什么其他浏览器?” |
统计每对浏览器被同一用户使用的人数 |
daily_browser_detail |
|
browser_weekday_weekend |
回答“工作日和周末使用习惯有何不同?” |
按浏览器和日期类型(工作日/周末)分组,统计人均使用时长 |
daily_browser_detail |
|
user_profile_stats |
回答“核心用户是谁?用户教育/收入水平如何?”… |
按性别、年龄、学历、职业、收入、省份、居住地类型分组统计 |
demographic、daily_browser_detail |
6 实验步骤
6.1 准备用户–日–浏览器–小时明细表
上个实验中的“互联网用户行为日志数据清洗抽取”转换流已经包含了生成明细数据的完整逻辑,但只输出了分支A和B(browser_coverage和 browser_hourly)。我们需要将其复制一份,改为输出明细表,作为本实验后续加工的基础。
6.1.1 创建用户_日_浏览器_小时明细表
首先,我们先在团队私有数据库中创建用于存放 用户–日–浏览器–小时 明细表的数据表
打开上个实验创建的项目“互联网用户行为日志”

新建转换流“创建用户_日_浏览器_小时明细表”,拖入“执行一个SQL脚本”组件

双击“执行一个SQL脚本”组件,数据库连接选择“团队私有数据库”,并输入以下SQL:
CREATE TABLEIFNOTEXISTS`daily_browser_detail` (
`user_id`VARCHAR(50)NOT NULLCOMMENT'用户ID',
`usage_date`DATENOT NULLCOMMENT'使用日期',
`browser_name`VARCHAR(50)NOT NULLCOMMENT'浏览器名称',
`hour` TINYINTNOT NULLCOMMENT'小时',
`total_duration_sec`INTNOT NULLCOMMENT'总使用时长(秒)',
`active_count`INTNOT NULLCOMMENT'活跃次数'
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='用户_日_浏览器_小时明细表';

右键根目录,点击“粘贴”
粘贴后右键重命名为“输出用户日浏览器小时明细表”

6.1.3 浏览器名称映射
在分组组件后添加“值映射”组件,“值映射”组件连接到原分支A的分组 1组件、复制发送到原分支B的排序记录 2组件

这里需要注意:上个实验的“4.5.3 过滤记录:筛选进程为主要浏览器的数据”步骤中
·如果匹配条件是process_name IN LIST “iexplore.exe;360chrome.exe;360se.exe;chrome.exe;sogouexplorer.exe;QQBrowser.exe”,则继续下一步骤
·如果匹配条件与以上不同,则删除匹配值中的EXCEL.EXE、WINWORD.EXE、AlilM.exe,因为这3个不是浏览器

双击“表输出”组件,配置如下:
·数据库连接:选择“团队私有数据库”
·目标表:daily_browser_detail
·勾选“裁剪表”,清空原有数据
·勾选“指定数据库字段”,建立字段映射

6.1.6 执行转换流
击“运行”按钮,执行转换流

双击“执行一个SQL脚本”组件,数据库连接选择“团队私有数据库”,并输入以下SQL,使用DROP TABLE可以避免需要重新建表时语句报错:
-- 1.核心指标概览表
DROP TABLE IF EXISTS `browser_overview`;
CREATE TABLE `browser_overview` (
`metric_name` VARCHAR(50) NOT NULL COMMENT '指标名称',
`metric_value` DECIMAL(12,2) NOT NULL COMMENT '指标值'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='核心指标概览表';
-- 2.各浏览器周活跃趋势表
DROP TABLE IF EXISTS browser_weekly_active;
CREATE TABLE `browser_weekly_active` (
`browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器名称',
`week_range` VARCHAR(20) NOT NULL COMMENT '周日期范围',
`active_user_count` INT NOT NULL COMMENT '活跃用户数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='各浏览器周活跃趋势表';
-- 3.浏览器使用频率分布表
DROP TABLE IF EXISTS browser_frequency_stats;
CREATE TABLE `browser_frequency_stats` (
`browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器名称',
`usage_level` VARCHAR(10) NOT NULL COMMENT '使用等级',
`user_count` INT NOT NULL COMMENT '用户数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浏览器使用频率分布表';
-- 4.用户使用浏览器数量分布表
DROP TABLE IF EXISTS browser_multi_usage;
CREATE TABLE `browser_multi_usage` (
`browser_count` VARCHAR(10) NOT NULL COMMENT '使用浏览器数量',
`user_count` DECIMAL(5,2) NOT NULL COMMENT '用户数量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户使用浏览器数量分布表';
-- 5.浏览器工作日周末对比表
DROP TABLE IF EXISTS browser_weekday_weekend;
CREATE TABLE `browser_weekday_weekend` (
`browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器名称',
`day_type` VARCHAR(10) NOT NULL COMMENT '工作日/周末',
`avg_duration_sec` INT NOT NULL COMMENT '人均使用时长(秒)',
`total_duration_hour` BIGINT NOT NULL COMMENT '总使用时长(小时)',
`user_count` INT NOT NULL COMMENT '用户数'
) COMMENT '浏览器工作日周末对比表';
-- 6.用户画像统计表
DROP TABLE IF EXISTS `user_profile_stats`;
CREATE TABLE `user_profile_stats` (
`browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器名称',
`gender` VARCHAR(10) COMMENT '性别',
`age_group` VARCHAR(10) COMMENT '年龄段',
`edu` VARCHAR(50) COMMENT '学历',
`job` VARCHAR(50) COMMENT '职业',
`income` VARCHAR(50) COMMENT '收入',
`city_type` VARCHAR(10) COMMENT '居住地类型',
`province` VARCHAR(50) COMMENT '省份',
`user_count` INT NOT NULL COMMENT '用户数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像统计表';

6.3 各浏览器周活跃趋势表数据抽取执行
目标:统计每个浏览器在第1-4周的每周活跃用户数
新建转换流“各浏览器周活跃趋势表数据抽取”,拖拽“表输入”组件画布中,数据库连接选择“团队私有数据库”,点击“获取SQL查询语句”,选择daily_browser_detail 获取所有查询语句

双击字段选择组件,点击“元数据”,右键插入,输入字段名称usage_date,类型为Date,格式为“yyyy-MM-dd”

双击值映射组件,使用的字段名选择“usage_date”,目标字段名(空=覆盖)输入“week_range”,表示创建新字段week_range用来存储映射结果,接下来就插入行,将每个日期映射为对应的周区间

排序记录组件设置为按照browser_name、week_range 升序排序

分组字段为browser_name、week_range,聚合时对user_id进行去重计数,得到active_user_count,因此,聚合配置中输入字段“active_user_count”,subject 为“user_id”,类型为“统计不同值的数量(N)”


6.4 各浏览器使用频率分布表数据抽取
目标:按轻/中/重度划分用户使用频率
新建转换流“使用频率分布数据抽取”,拖拽“表输入”组件画布中,数据库连接选择“团队私有数据库”,点击“获取SQL查询语句”,选择daily_browser_detail 获取所有查询语句

排序记录组件设置为按照 user_id、browser_name 升序排序

分组组件的分组字段为 user_id、browser_name,总使用时长 = 每天总使用时长 total_duration_sec 求和

增加常量组件配置中增加新字段“hour_m_s”,将其类型设置为 Integer ,并且值固定为 3600,如下

通过计算器,计算小时,新增使用时长单位为小时的字段“total_hours”,计算公式为“A / B”,字段A为“total_seconds”,字段B为“hour_m_s”,保留2位小数

双击JavaScript代码组件,如下以下代码,点击”获取变量”,自动获取代码中的变量
var total_hours = total_hours;
varusage_level ='';
if(total_hours <3) {
usage_level ='轻度';
}elseif(total_hours >=3&& total_hours <10) {
usage_level ='中度';
}else{
usage_level ='重度';
}

接下来,我们就可以统计每个浏览器的各使用等级的用户数了
同样的,先拖入排序记录组件,将数据按照 browser_name、usage_level 升序排序

最后拖入表输出组件,将分组聚合结果入库,表输出组件配置为:
·数据库连接:选择“团队私有数据库”
·目标表:browser_frequency_stats
·勾选“裁剪表”,清空原有数据
·勾选“指定数据库字段”,建立字段映射

执行转换流:

接下来,我们统计每个用户使用各浏览器的种类数量,拖拽排序记录组件到画布中,创建表输入组件到排序记录组件的连线

排序后拖拽分组组件,排序记录组件连接到分组组件

接下来,我们划分浏览器数量等级。拖入JavaScript代码组件,计算器组件连接到JavaScript代码组件
<img width=”690″ height=”348″ src=”data:image/png;base64,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” style=”outline: 0px; object-fit: cover; object-position: center top; max-width: 100%; display:inline-block; aspect-ratio: 690 / 348; border-bottom-style:none; border-left-style:none; border-right-style:none; border-top-style:none; height:auto; vertical-align:middle;” ‘=”” data-base62-sha1=”8G0K8D4aXk3XPMdJM9I6kCxx3wT” role=”presentation” srcset=”https://community.uniplore.com/uploads/default/optimized/1X/3cd125b34f935566fdf474c016c0db6872ac484b_2_690x348.png, https://community.uniplore.com/uploads/default/optimized/1X/3cd125b34f935566fdf474c016c0db6872ac484b_2_1035x522.png 1.5x, https://community.uniplore.com/uploads/default/optimized/1X/3cd125b34f935566fdf474c016c0db6872ac484b_2_1380x696.png 2x” data-dominant-color=”F5F6F7″ loading=”lazy” v:shapes=”_x0000_i1076″>
双击JavaScript代码组件,如下以下代码,点击”获取变量”,自动获取代码中的变量
var browser_cnt = browser_cnt;
varbrowser_count ='';
if(browser_cnt ==1) {
browser_count ='1种';
}elseif(browser_cnt ==2) {
browser_count ='2种';
}else{
browser_count ='3种及以上';
}

再拖入分组组件,按 browser_count 分组,统计 user_count(user_id去重计数)


6.6 各浏览器工作日周末对比表数据抽取
目标:统计各浏览器工作日周末使用时长对比
新建转换流“浏览器工作日周末对比数据抽取”,拖拽“表输入”组件画布中,数据库连接选择“团队私有数据库”,点击“获取SQL查询语句”,选择daily_browser_detail 获取所有查询语句

双击JavaScript代码组件,如下以下代码,点击”获取变量”,自动获取代码中的变量
// 获取日期
var date = usage_date;
// 获取星期几(0=周日, 1=周一, ..., 6=周六)
var dayOfWeek = date.getDay();
// 判断工作日还是周末
varday_type ="";
if(dayOfWeek >=1&& dayOfWeek <=5) {
day_type ="工作日";
}else{
day_type ="周末";
}

将数据按照 browser_name、 day_type升序排序

平均使用时长单位是秒的数值不会太大,是比较好观察,但是总使用时长的单位是秒的话数值很大,不够直观,所以将其转为小时,参考“6.4 各浏览器使用频率分布表数据抽取”种计算小时的方法,使用增加常量组件和计算器组件来实现

在计算过程中出现了一些中间字段,我们使用字段选择组件来删除冗余字段


6.7 核心指标数据抽取
目标:将大屏顶部四个指标卡的数据存入一张通用的键值对表中
在以上数据抽取中,我们已经获取了各浏览器的用户数、使用时长、活跃用户数、重度用户数,但我们设计的核心指标是全局数据,除了使用时长,其他用户数相关的数据在不同浏览器之间是存在重叠的,所以需要重新计算。
用一个表输入组件,直接SQL一次性算出所有指标,然后通过列转行将一行转为四行
新建转换流“”,拖入表输入组件,数据库连接团队私有数据库,在SQL语句框中输入以下SQL:
SELECT
ROUND(SUM(total_duration_sec)/3600,2)AStotal_hours,
ROUND(SUM(total_duration_sec)/3600/COUNT(DISTINCTuser_id),2)ASavg_hours,
ROUND(
(SELECTCOUNT(DISTINCTuser_id)FROMdaily_browser_detail
WHEREusage_dateBETWEEN'2012-08-06'AND'2012-08-12'
)*100.0/COUNT(DISTINCTuser_id),2
)ASactive_ratio,
ROUND(
(SELECTCOUNT(*)FROM(
SELECTuser_idFROMdaily_browser_detail
WHEREusage_dateBETWEEN'2012-05-07'AND'2012-07-08'
GROUPBYuser_id
HAVINGSUM(total_duration_sec)/3600>30
) t)*100.0/COUNT(DISTINCTuser_id),2
)ASheavy_ratio
FROM daily_browser_detail

|
字段名称 |
key值 |
value字段 |
|
total_hours |
total_hours |
metric_value |
|
avg_hours |
avg_hours |
metric_value |
|
active_ratio |
active_ratio |
metric_value |
|
heavy_ratio |
heavy_ratio |
metric_value |
接下来使用值映射组件将指标名称映射为中文


点击tab选项“数据资源”,可以看到 demographic.csv

选择导出到的目录,例如根目录

刷新文件库的根目录,即可看到 demographic.csv

双击“CSV文件输入”组件,点击“浏览文件”按钮,在弹出的窗口中选择 demographic.csv,然后点击“确定”

往下滑一点,在空白表格处右键点击“获取字段”

6.8.3 年龄分段
原人口属性数据中没有年龄字段,但是有出生年份,因此我们可以通过计算获取用户的年龄属性
首先我们拖入增加常量组件,增加常量字段“year”,值设为“2012”(数据是2012年的)

接下来我们将年龄划分为四段:<18、18-25、26-35、>35
拖入JavaScript代码组件,计算器组件连接到JavaScript代码组件

6.8.4 表输入:读取用户_日_浏览器_小时明细数据
拖入“表输入”组件到画布中

在弹出的窗口中,选择用户_日_浏览器_小时明细表daily_browser_detail

获取SQL查询语句后点击“确认”、

我们先拖拽2个“排序记录”组件到画布中,分别创建“表输入”组件到“排序记录 1”组件的连线、“CSV文件输入”组件到“排序记录”组件的连线,其中“CSV文件输入”组件到“排序记录”组件的连线类型选择“主输出步骤”

仅保留“user-id”,其他字段选中后右键点击“删除选中的行”

同样的双击“排序记录”组件,命名为“用户属性数据按用户ID排序”,设置按 USERID 升序排序

双击“记录集连接”组件,第一个Transform选择“明细数据按用户ID排序”,第二个Transform选择“用户属性数据按用户ID排序”,连接类型选择“LEFT OUTER”

2个数据是通过用户ID关联的,所以第一个Transform的连接字段保留“user_id”,第二个Transform的连接字段保留“USERID”,其他字段通过删除选中的行来删除

拖入分组组件,排序记录组件连接到分组组件,按browser_name、GENDER、EDU、JOB、INCOME、PROVINCE、ISCITY、age_group 分组,聚合 user_count = user_id (统计不同值的数量(N))


6.8.9 查看结果数据
点击“元数据”tab选项,右键团队私有数据库,点击“加载元数据”

1 实验目的
本实验基于上两个实验《浏览器市场与用户画像分析–数据加工》产出的各项统计表,使用助睿Max数据大屏制作浏览器市场行为分析大屏。
通过本实验,学生应掌握:
·根据业务问题设计大屏布局与图表选型
·将已加工的聚合表接入可视化工具
·生成可交互的数据大屏,并提炼业务结论
2 实验环境
·实验平台:助睿在线实验平台 https://lab.guilian.cn/
本次实验使用助睿数智(Uniplore)作为一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学与企业数据加工场景。
助睿数智官网为 https://www.uniplore.com/
·可视化工具:助睿Max(数据大屏)
3 实验数据
本实验直接使用上一实验加工完成的大屏一(市场行为分析)目标表,聚焦浏览器本身的市场格局、使用行为、时段偏好、竞争关系。
|
模块 |
子模块 |
指标项 |
组件 |
关联数据表 |
备注 |
|
数据概览 |
浏览器市场 |
总使用时长 |
指标卡 |
browser_coverage |
所有用户累计使用时长(小时) |
|
人均使用时长 |
指标卡 |
browser_coverage |
总使用时长 / 覆盖用户数(小时/周) |
||
|
活跃用户占比 |
指标卡 |
browser_coverage |
周活跃用户数 / 覆盖用户数 |
||
|
重度用户占比 |
指标卡 |
browser_frequency_stats |
使用时长>10小时/周的用户占比 |
||
|
市场格局 |
用户规模 |
用户数 |
柱状图 |
browser_coverage |
展示6个浏览器用户数 |
|
使用规模 |
使用时长 |
饼图 |
browser_coverage |
展示各浏览器使用时长占比 |
|
|
使用粘性 |
人均使用时长 |
柱状图 |
browser_coverage |
||
|
用户行为 |
时间趋势 |
周活跃趋势 |
折线图 |
browser_weekly_active |
展示第1-4周各浏览器活跃用户数变化 |
|
使用习惯 |
使用频率分布 |
堆叠柱状图 |
browser_frequency_stats |
轻/中/重度用户在各浏览器的占比 |
|
|
时段偏好 |
全天时段 |
24小时活跃分布 |
折线图 |
browser_hourly |
X轴小时,Y轴活跃用户数,不同颜色代表不同浏览器 |
|
周内对比 |
工作日vs周末 |
分组柱状图 |
daily_browser_detail |
对比工作日和周末的使用时长 |
|
|
竞争关系 |
使用数量 |
浏览器使用数量分布 |
饼图 |
browser_multi_usage |
用户使用1种/2种/3种及以上浏览器的比例 |
4 整体分析框架
4.1 业务问题
我们希望通过大屏回答以下核心业务问题:
|
业务问题 |
对应的分析维度 |
|
哪个浏览器用户最多?哪个用得最久? |
市场格局 |
|
用户活跃度在增长还是下降? |
周活跃趋势 |
|
用户什么时候最活跃? |
时段偏好 |
|
用户是重度使用还是偶尔打开? |
使用频率 |
|
用户同时用几个浏览器? |
浏览器使用数量 |
|
用户还用什么其他浏览器? |
竞品重叠 |
|
工作日和周末使用习惯有何不同? |
工作日vs周末 |
4.2 大屏设计原则
·从上到下、从左到右的叙事顺序:先整体后局部,先趋势后细节
·核心指标突出显示:顶部放置关键指标卡(覆盖用户数、总时长、人均时长、活跃占比、重度占比)
·图表类型与数据性质匹配:趋势用折线图,对比用条形图/柱状图,分布用环形图/饼图
·颜色规范:6个浏览器使用固定颜色标识(IE蓝、Chrome红、360绿等),便于识别
·交互支持:提供浏览器筛选器,支持查看全部或单个浏览器
4.3 大屏布局草图
暂时无法在飞书文档外展示此内容
参考图:

进入子平台——助睿数据大屏可视化平台

在模板选择中点击“空白模板”

我们输入“市场分析”,然后点击下一步,自动跳转到“市场分析”大屏的制作界面

5.2 设置大屏样式
5.2.1 背景设置
想修改设置助睿数据大屏的背景,可以通过修改背景图片来完成
助睿数据大屏中使用到的图片元素均使用oss-browser存储,并获取存储链接。本次实验用到的图片链接会在文后汇总,若同学有新图片使用需求,可以联系@谭萍处理。
本次数据大屏的背景图片链接为:

其他设置可以保持默认
5.2.2 标题设置
大屏的标题可以通过组件自己设计,也可以自行设计一个图片来实现。本次实验我们预先设计好了标题图,链接:

大屏画布中自动出现图片组件

输入“标题banner”

点开“基础属性”,可以设置长宽、位置等属性,我们设置如下:

这样标题banner就设置好了,我们点击“保存”


除了直接设置属性值,也可以通过拖拽和缩放来设置组件的大小和位置
按钮上的文字我们使用“通用标题”来实现,点击文字分类下的“通用标题”,重命名为“市场分析”

点开基本设置,修改标题名为“市场分析”

文字即显示为我们修改的文字

第二个大屏的导航可以复制这个按钮的设置

现在,只需修改“用户画像按钮背景”和“用户画像”组件的横坐标,如下:

保存预览一下

这个组命名为“顶部”

将区域背景图片链接:https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/public-material/area-bg.png 粘贴到背景图链接中

添加通用标题组件,重命名为“标题”,按照参考图,调整大小和位置,标题名修改为“浏览器用户数”,对齐方式为左对齐,其他设置参考如下:

重命名为“浏览器用户数柱状图”,调整大小和位置

这时候我们会发现,柱子和图例的距离过小,影响美观,我们可以点开“全局样式”来调整
将柱子上边距调大即可

5.3.2 使用规模–浏览器使用时长占比
复制上一小节制作的“浏览器用户数”组,重命名为“浏览器使用时长”

复制的组件内容可能会不显示,重新刷新数据即可

浏览器使用时长占比图表类型为饼图,我们删除复制的柱状图,重新添加饼图。助睿数据大屏提供多样不同样式的饼图,可根据需求选择,这里我们选择“多维度饼图”,调整位置大小,名重命名为“浏览器使用时长占比”

将标签类目设置为可见

将饼图组件拖到“浏览器使用时长”组中,并及时保存
5.3.3 使用粘性–浏览器人均使用时长
复制5.3.1小节制作的“浏览器用户数”组,重命名为“浏览器人均使用时长”

复制的组件内容可能会不显示,重新刷新数据即可

浏览器人均使用时长图表类型为柱状图,因此无需修改图表类型,将复制的柱状图重命名为“人均使用时长柱状图”即可
5.3.4 指标区
复制5.3.1小节制作的“浏览器用户数”组,重命名为“数据概览”

可以看到标题背景被拉伸了,因为我们使用的是短的标题背景图,现在需要换成长的标题背景图:

将标题名修改为“数据概览”,并刷新数据

添加数据翻牌器组件,重命名为“总使用时长”,并调整大小、位置

点开“翻牌器”设置,水平对齐改为“居中对齐”,其他设置如下:
暂时无法在飞书文档外展示此内容

复制3个“总使用时长”组,分别重命名为“人均使用时长”、“活跃用户占比”、“重度用户占比”,其中“活跃用户占比”、“重度用户占比”两个组中的图标背景图链接更改为: https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/library-data/degree-thesis.png
修改翻牌器标题、后缀,最后调整位置如下:

参考布局草图,拖拽“周内对比”组到合适位置

将柱状图删除,重新添加“分组柱状图”,命名为“工作日vs周末使用时长分组柱状图”,并调整大小,位置如下:

其他样式调整参考如下:
暂时无法在飞书文档外展示此内容
效果:

参考布局草图,拖拽“24小时活跃分布”组到合适位置

将标题名修改为“24小时活跃用户数分布”,并刷新数据

样式调整参考如下,参考颜色为#29F1FA:
暂时无法在飞书文档外展示此内容
效果:

5.3.8 使用习惯–使用频率分布
复制上一小节制作的“浏览器周活跃用户数变化”组,重命名为“使用频率分布”,参考以上的实验,调整位置、标题并更换图表类型为“垂直基本柱图”

基本饼图样式调整参考如下:

至此,市场分析大屏的静态布局已完成,下一实验我们将使用蓝图编辑器,完成数据接入。
附录:图片链接
|
素材 |
链接 |
|
页面背景 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/public-material/bg-2.png |
|
导航按钮 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/comprehensive-data/navigation-bg-1.png |
|
banner标题 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/practice/browser-analysis/banner01.png |
|
短标题背景 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/public-material/title-bg-short.png |
|
长标题背景 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/public-material/title-bg-long.png |
|
图表区域背景 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/public-material/area-bg.png |
|
时长指标 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/library-data/audio-video.png |
|
用户指标 |
https://gzu-edu-quality-max-studio.oss-cn-chengdu.aliyuncs.com/library-data/degree-thesis.png |
1 实验目的
本实验基于上一实验《浏览器市场分析–数据大屏静态布局制作》完成的大屏布局,使用助睿Max的蓝图编辑器,将之前实验加工好的数据表接入到大屏的各个图表组件中,使图表能够动态展示真实数据。
通过本实验,学生应掌握:
·理解蓝图编辑器的基本概念(数据源、触发器、动作)
·创建数据库数据源连接
·为图表组件编写SQL查询语句
·将查询结果绑定到图表组件
2 实验环境
·实验平台:助睿在线实验平台 https://lab.guilian.cn/
本次实验使用助睿数智(Uniplore)作为一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学与企业数据加工场景。
助睿数智官网为 https://www.uniplore.com/
·可视化工具:助睿Max(数据大屏)
·数据来源:团队私有数据库(MySQL)
3 实验数据
本实验使用上一实验加工完成的大屏一目标表,共6张表:
|
表名 |
用途 |
关联图表 |
|
browser_coverage |
浏览器市场覆盖率统计 |
指标卡、柱状图、饼图 |
|
browser_hourly |
浏览器时段活跃统计 |
24小时活跃分布折线图 |
|
browser_weekly_active |
各浏览器周活跃趋势 |
周活跃趋势折线图 |
|
browser_frequency_stats |
浏览器使用频率分布 |
使用频率堆叠柱状图 |
|
browser_multi_usage |
用户浏览器使用数量分布 |
浏览器使用数量饼图 |
|
browser_weekday_weekend |
浏览器工作日周末对比 |
工作日vs周末分组柱状图 |
4 蓝图编辑器概述
4.1 什么是蓝图编辑器?
蓝图编辑器是助睿Max中用于配置数据流和交互逻辑的可视化编程工具。它采用“节点–连线”的方式,帮助您自由管理可视化应用中多个组件之间的交互关系。
蓝图编辑器的优势:
·蓝图编辑器可以保证交互和数据的实时性和同步性。
·蓝图编辑器支持数据请求合并和数据分发的功能。
·蓝图编辑器可模块化拆分,专注单个的交互链路,不需要考虑代码的整理和规范,只需要专注于业务规则和交互需求即可。
4.2 核心概念
|
概念 |
说明 |
|
数据源 |
数据库连接配置,定义数据从哪里来 |
|
查询 |
SQL语句,定义取什么数据 |
|
触发器 |
触发数据加载的事件(如页面加载、组件点击、定时刷新等) |
|
动作 |
触发器执行后的操作(如查询数据、刷新图表) |
|
变量 |
用于在查询之间传递参数(如筛选器选中的浏览器名称) |
5 实验步骤
5.1 创建数据库数据源
首先,我们需要创建链接团队私有数据库的数据源,进入数据大屏平台后,点击“我的数据”

输出团队私有数据库的信息后,点击“立即添加”

5.2 组件导出到蓝图编辑器
只有当组件导入到蓝图编辑器后,才可以为该组件配置交互。
打开上一实验制作的“市场分析”数据大屏

同样的,依次把所有需要接入数据的组件导出到蓝图编辑器中
导出成功后,单击“蓝图编辑器”图标切换到蓝图编辑器页面,可在导入节点列表中查看对应的节点。列表内所有节点都可供后续配置交互使用。

5.3 添加全局节点
在蓝图编辑器里,在逻辑节点面板中,将需要使用的逻辑节点单击拖入中间画布中。逻辑节点包括了全局节点、数据处理类节点、流程控制类节点以及输入设备类节点。
首先,我们全局节点,画布中自动添加1个全局节点,全局节点可用于在大屏打开时自动执行后续操作(如加载数据)

点击“SQL请求”节点,在配置面板中,数据源选择“团队私有数据库”,SQL类型为“查询”,处理方法的代码框中,输入以下SQL,一次性查询来源为browser_coverage 的数据:
let sql = `
select
browser_nameasx,
user_countasy1,
round(total_duration_sec/3600,0)asy2,
round((total_duration_sec/3600)/user_count,1)asy3
fromlabs.browser_coverage
orderbybrowser_name`
return sql

接下来根据每个图表的数据接口映射格式处理查询到的数据,在画布编辑器界面,选择图表,可以在数据tab选项中查看数据接口映射:
暂时无法在飞书文档外展示此内容
根据查询结果,三个图表需要的字段
·浏览器用户数柱状图:x(浏览器名称)、y1(用户数)
·浏览器使用时长占比:name(浏览器名称)、value(使用时长)
·人均使用时长柱状图:x(浏览器名称)、y3(人均时长)
因此,并行数据处理的3个处理方法的代码如下,分别粘贴到对应的代码块中即可:
各浏览器用户数
returndata.map(item => ({
x: item.x,
y: item.y1,
s:'用户数'
}));
各浏览器总使用时长
returndata.map(item => ({
name: item.x,
value: item.y2
}));
各浏览器人均使用时长
returndata.map(item => ({
x: item.x,
y: item.y3,
s:'人均时长(小时)'
}));
5.4.3 添加图表节点
点击浏览器用户数柱状图、浏览器使用时长占比、人均使用时长柱状图这3个节点,将它们添加到画布中,再将并行数据处理的3个处理方法的输出接口连接到对应的图表的“导入数据接口”,如下:

可以看到,数据已经更新为数据库中的数据了
预览出现下图情况

饼图的样式可以调整一下,使其更协调
在画布编辑器中选择浏览器使用时长占比饼图,在数据系列中调整每个系列的内外半径,实现类似的以下效果:
5.5 为指标区域图表配置数据
5.5.1 添加SQL请求节点
从逻辑节点面板中,点击“SQL请求”节点,并将全局节点的“页面初始化完成”输出接口连接到“SQL 请求”节点的“执行SQL”输入接口

该查询返回一个数组,格式如下:
[
{"metric_name":"总使用时长","metric_value":456800.00},
{"metric_name":"人均使用时长","metric_value":8.20},
{"metric_name":"活跃用户占比","metric_value":71.30},
{"metric_name":"重度用户占比","metric_value":23.50}
]
5.5.2 并行数据处理
添加并行数据处理组件,并在其处理方法中再增加3个处理方法,一共4个处理方法,分别命名为:总使用时长、人均使用时长、活跃用户占比、重度用户占比
SQL请求节点的执行成功输出接口分别连接到并行数据处理的4个处理方法接口,如下:

其中,name字段我们已经在数据翻牌器中设置好了,现在只需处理value 字段的映射关系根据查询结果:
总使用时长
varitem =data.find(d => d.metric_name ==='总使用时长');
return[{ value: item ? item.metric_value :0}];
人均使用时长
varitem =data.find(d => d.metric_name ==='人均使用时长');
return[{ value: item ? item.metric_value :0}];
活跃用户占比
varitem =data.find(d => d.metric_name ==='活跃用户占比');
return[{ value: item ? item.metric_value :0}];
重度用户占比
varitem =data.find(d => d.metric_name ==='重度用户占比');
return[{ value: item ? item.metric_value :0}];
每个分支的输出格式为[{ value: xxx }],指标卡组件直接读取value字段显示数值。指标名称已预先配置在指标卡组件的标题中
5.5.3 添加图表节点
点击4个数字翻牌器组件的节点,将它们添加到画布中,再将并行数据处理的4个处理方法的输出接口连接到对应的图表的“导入数据接口”,如下:

点击保存,预览数据是否符合预期
5.7 为24小时活跃用户分布图表配置数据
5.7.1 添加SQL请求节点
参考以上SQL请求节点的配置步骤,完成SQL请求节点配置,查询代码如下:
let sql = `
selecthourasx,
active_user_countasy,
browser_nameass
from labs.browser_hourly
orderbybrowser_name, hour
`
return sql
5.7.2 添加图表节点
点击24小时活跃用户分布节点,将它添加到画布中,再SQL请求节点的执行成功输出接口连接到“导入数据接口”,如下:

设置完成后,效果如下:

点击保存,预览数据是否符合预期

设置完成后,效果如下:

点击保存,预览数据是否符合预期
5.10 为浏览器使用数量分布图表配置数据
5.10.1 添加SQL请求节点
参考以上SQL请求节点的配置步骤,完成SQL请求节点配置,查询代码如下:
let sql = `
select
browser_countasname,
user_countasvalue
fromlabs.browser_multi_usage
orderbybrowser_count
`
return sql
5.10.2 添加图表节点
点击浏览器使用数量分布节点,将它添加到画布中,再SQL请求节点的执行成功输出接口连接到“导入数据接口”,如下:

预览确认无误后,单击大屏页面右上角的发布图标

单击分享链接右侧的复制按钮

夜雨聆风