欢迎光临
我们一直在努力

助睿实验作业4-浏览器用户行为分析与流失预测-数据加工

一、实验目的

本次实验围绕互联网用户行为半结构化日志数据展开全流程数据加工与分析实操,核心学习与实操目标分为四大模块,全程贴合企业级数据处理流程与数据分析教学标准:

第一,熟悉数据集整体构成、字段规则与半结构化日志数据的核心特点,彻底掌握文本日志批量解析、杂乱字段拆分、无效数据剔除的实操方法,攻克半结构化数据无法直接分析的核心痛点。

第二,完成原始零散日志数据的全维度规整处理,通过字段筛选、格式统一、空值清洗、结构化转换等操作,将无固定行列、格式零散的原始文本日志,转化为格式统一、规则标准、可直接用于查询统计的结构化数据表,为后续数据分析筑牢数据基础。

第三,基于结构化基础数据表,实现多维度数据聚合统计、自定义字段衍生计算、跨数据表关联匹配,结合业务分析场景搭建完整、规范的数据分析指标体系,贴合用户行为分析的业务需求。

第四,完成机器学习前置特征工程全流程处理,对原始行为数据进行特征提取、筛选、规整与优化,最终产出标准化、高质量、可直接用于机器学习预测建模的数据集,支撑后续用户行为预测、流失分析等建模场景。

二、实验环境

本次实验依托线上一站式数智实验平台开展,全程采用零代码+少量代码辅助的实操模式,适配教学实训与企业轻量化数据加工场景,具体环境配置如下:

实验平台:助睿在线实验平台,访问地址为 https://lab.guilian.cn/

核心数据平台:助睿数智(Uniplore)一站式数据科学平台,官网地址为 https://www.uniplore.com/。该平台集成数据接入、ETL数据集成处理、数据清洗规整、机器学习建模、数据可视化展示全链路功能,支持零代码可视化操作,无需复杂编程即可完成大数据处理与分析,广泛应用于高校数据分析教学、企业轻量化数据加工与智能分析场景。

核心处理工具:助睿 ETL 数据集成平台,作为本次实验核心实操工具,支撑日志解析、字段处理、数据聚合、数据表创建与数据入库等全流程数据加工操作。

实验数据规模:数据集覆盖1000名实验用户,累计包含800万条以上电脑使用行为记录,整体数据解压后存储大小约825MB,数据量级贴合真实企业用户行为数据场景,具备极强的实操参考价值。

三、实验数据

本次实验数据源为首届中国互联网数据挖掘竞赛公开数据集,是行业内典型的计算机用户行为半结构化日志数据集,专门适用于互联网用户行为规律挖掘、使用习惯分析、活跃度预测、用户画像构建等研究场景,数据真实性、规范性、实用性极强。

3.1 数据集整体构成

完整数据集由两大核心数据模块组成,分别承载用户静态属性信息与动态行为信息,两大模块通过唯一标识实现精准关联,完整还原用户电脑使用全场景行为:

第一,用户基本信息表:文件名为demographic.csv,核心存储用户静态人口属性数据,包含用户唯一ID、性别、年龄、职业、教育程度、收入水平等核心基础字段,用于后续用户画像、分群差异分析。

第二,用户电脑行为日志数据:分为浏览器上网记录与软件使用记录两大类型。其中浏览器上网记录包含用户访问URL、网站域名、访问时间等核心行为字段;软件使用记录包含程序进程名、软件程序名、软件使用时长、窗口切换记录等操作字段,完整记录用户电脑全操作行为。

数据集整体参数:解压后总大小约825MB,原始有效行为记录超800万条,持续追踪1000名用户连续4周的电脑使用行为,数据采样横跨4个月,每月固定抽取1周完整数据,具体采样时间周期如下:

第1周:2012年05月07日—2012年05月13日

第2周:2012年06月04日—2012年06月10日

第3周:2012年07月02日—2012年07月08日

第4周:2012年08月06日—2012年08月12日

3.2 数据文件结构

所有实验数据统一分为两大存储模块,结构清晰、分类明确,便于针对性读取与处理:

第一,behavior/ 文件夹:按照自然日期分层归档存储,内部包含数万条TXT格式的用户行为日志文件,是本次实验核心处理的原始动态行为数据。

第二,demographic.csv 文件:独立存储用户静态属性信息,为后续行为数据与用户属性关联分析提供基础支撑。

两大数据文件通过user_id(用户唯一ID)实现一一对应、精准关联,可支撑后续跨表关联、多维度交叉分析。

3.3 日志文件命名规则

数据集内每一个TXT日志文件,对应一名用户单次电脑开机产生的全部操作行为记录,文件名具备固定标准化格式,可直接通过文件名解析核心基础信息,无需读取文件内容。

文件名通用格式:用户ID_日期_开机时间.txt

示例文件名称:0AB6BBBEDFF24EC8BAAC905F45AE314C_2012-05-07_21-22-38.txt

通过文件名可直接解析出三大核心字段:

user_id:用户唯一身份标识,全局唯一,用于关联用户属性数据与行为数据

file_date:日志对应的行为发生日期,用于后续按日、按月维度聚合分析

file_start_time:用户本次电脑开机时间,用于定义单次会话的起始时间

3.4 日志文件内部格式

所有TXT日志文件内部格式统一、结构固定,整体分为三部分,数据层级清晰,区分头部说明信息与核心行为数据:

第一行:Last<=>+数字,用于标识该日志文件中最后一条行为记录距离本次开机的总秒数,为全局时间校准参数。

第二行:L_Start<=>+时间,用于标识本次用户电脑开机的绝对标准时间,是会话时间的基准依据。

第三行及后续所有内容:为用户核心操作行为记录,是本次实验需要解析、处理、分析的核心数据源。

核心行为记录格式示例:T<=>177[=]P<=>360se.exe[=]I<=>5572[=]W<=>30378[=]V<=>4,1,6,6[=]N<=>360安全浏览器[=]C<=> 360.cn

日志采用双固定分隔符规则,精准区分字段与字段值、不同字段:

<=> :专属分隔符,用于区分单个字段的字段名与对应字段值

[=] :通用分隔符,用于分隔不同的字段单元

3.5 核心字段含义

本次实验所有日志核心字段固定,需熟练掌握各字段释义,为后续解析、拆分、聚合分析提供依据,具体字段说明如下:

T:行为发生距离本次电脑开机的秒数,用于精准定位单条行为的发生时间

P:软件进程名,如360se.exe、QQ.exe,是区分不同软件、浏览器的核心标识

I:进程唯一ID,用于区分同一软件的多进程运行场景

U:浏览器访问的URL网址,用于分析用户网站访问偏好

W:非浏览器类软件的窗口句柄,用于标识软件操作窗口

V:对应软件的程序版本号,记录软件使用版本信息

N:软件中文名称,仅在软件首次启动记录中出现,用于直观识别软件类型

C:软件开发公司名称,仅在软件首次启动记录中出现,用于辅助软件归类

A/B:浏览器专属窗口句柄,用于区分不同浏览器窗口操作行为

3.6 数据特点

本次实验所用数据集具备典型的互联网行为数据特征,具体特点如下:

1. 数据类型为半结构化数据,无固定行列结构、无标准化数据表格式,无法直接用于查询、统计与可视化分析,必须经过解析、拆分、规整后才能使用;

2. 数据体量庞大、文件高度分散,原始行为记录超800万条,数万条独立日志文件分散存储;

3. 全局格式统一、字段规则明确,所有日志文件的命名规则、内部字段、分隔符完全一致,可批量程序化解析处理,适配自动化数据加工流程。

四、实验步骤

4.1 创建实验项目

本次实验所有数据加工操作均基于独立项目开展,首先创建专属实验项目,步骤如下:

1. 登录助睿在线实验平台,进入数据集成操作页面,点击页面中的「新建项目」按钮;

2. 在项目名称输入框中填写标准项目名:互联网用户行为日志数据加工,确认信息无误后点击「确定」;

3. 系统自动完成项目创建,创建成功后,可在数据集成页面的项目列表中查看新建项目,后续所有数据处理、工作流创建、组件配置均在该项目内完成。

4.2 日志数据结构化转换

本环节为实验核心基础步骤,核心目标是将半结构化的TXT原始日志,通过批量采集、代码解析、字段规整、数据入库,转化为标准结构化数据库表数据,解决原始数据无法直接分析的问题。考虑到完整数据集体量过大,本次实验仅选取20个TXT样本日志开展实操学习,掌握全流程加工方法。

4.2.1 数据资源获取

实验所需的20条样本TXT日志已提前上传至平台公共资源空间,需将公共资源导入个人项目目录,方便后续调用处理,具体操作流程如下:

1. 打开已创建的「互联网用户行为日志数据加工」项目,点击项目右上角「…」更多按钮,选择「打开项目」,进入项目核心操作页面;

2. 项目左侧菜单栏包含三大核心模块:资源库、文件、元数据。其中资源库用于管理工作流的新建、修改、删除与调度;文件库用于存储实验所需原始文件与加工产出文件;元数据用于配置数据库、集群、运行参数等底层环境;

3. 点击左侧「文件库」,右键点击根目录文件夹,选择「新建目录」,目录名称填写:互联网用户行为日志数据集,点击「确定」完成目录创建;

4. 切换至平台「公共空间」页面,点击「数据资源」模块,找到本次实验对应的「互联网用户行为日志数据集」资源卡片;

5. 点击资源卡片右上角「更多」按钮,选择「导出」选项,在弹出的导出窗口中,选择导出路径为刚刚新建的项目专属目录「互联网用户行为日志数据集」;

6. 点击「确定」完成单条数据导出,重复上述操作,将实验所需的20个TXT样本日志全部导出至专属目录,完成实验数据资源初始化。

4.2.2 建立数据源连接

本次实验数据入库、数据查询均依赖团队私有数据库连接。此前《学生用户画像-考勤主题标签构建》实验已完成该数据库连接的创建与配置,本次实验无需重复搭建,可直接复用。若未创建数据库连接,可参考对应实验4.2.2小节完成数据源连接配置。

4.2.3 创建原始用户行为日志表

在解析日志数据前,需先在数据库中创建标准化数据表,用于存储结构化转换后的用户行为明细数据,具体操作如下:

1. 新建转换工作流,将工作流命名为「创建原始行为日志数据表」;

2. 在工作流画布中,拖拽「执行一个SQL脚本」核心组件,该组件用于通过SQL语句自动创建数据表;

3. 组件配置:选择数据库连接为「团队私有数据库」,保证脚本执行权限正常,其余参数保持平台默认配置,在脚本输入框中录入以下建表SQL语句:

CREATE TABLE behavior_events (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
    session_id VARCHAR(255) COMMENT '会话唯一ID',
    user_id VARCHAR(100) COMMENT '用户ID',
    session_start_time VARCHAR(50) COMMENT '会话开始时间',
    event_seconds INT COMMENT '事件发生秒数',
    process_name VARCHAR(255) COMMENT '进程名称',
    process_id VARCHAR(100) COMMENT '进程ID',
    url TEXT COMMENT '访问网址',
    addr_handle VARCHAR(255) COMMENT '地址栏句柄',
    tab_handle VARCHAR(255) COMMENT '标签页句柄',
    browser_version VARCHAR(100) COMMENT '浏览器版本',
    window_handle VARCHAR(255) COMMENT '窗口句柄',
    app_name VARCHAR(255) COMMENT '程序名称',
    company_name VARCHAR(255) COMMENT '开发公司',
    source_file VARCHAR(255) COMMENT '原始日志文件名',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
    INDEX idx_session_id (session_id),
    INDEX idx_user_id (user_id)
) COMMENT '用户行为事件明细表';

4. 确认组件配置无误后,点击运行转换流,画布下方实时刷新执行日志,待组件执行成功,即完成原始行为日志结构化存储表的创建,为后续数据入库提供标准载体。

核心处理逻辑:原始日志为半结构化文本,无法直接入库,因此先创建规范数据表,再通过批量解析、字段映射的方式,将文本数据转化为表结构数据,实现标准化存储。

4.2.4 获取文件名:日志文件批量采集

本步骤核心目的是批量定位并读取项目目录下的所有TXT日志文件,为后续批量解析提供文件路径支撑,具体操作如下:

1. 全新创建转换工作流,命名为「行为日志数据转为结构化数据」;

2. 在空白画布中拖拽「获取文件名」组件,用于批量采集指定目录下的所有日志文件信息;

3. 双击打开「获取文件名」配置窗口,点击文件目录后的「浏览文件」按钮,选中此前创建的「互联网用户行为日志数据集」专属目录;

4. 点击「增加」按钮,将目录路径添加至采集列表;

5. 确认路径无误后点击「确认」,完成日志文件批量采集配置,平台将自动识别目录下所有TXT日志文件。

4.2.5 Java 代码:日志解析与结构化转换

本环节是结构化转换的核心步骤,通过自定义Java代码,批量读取采集到的日志文件,解析文件名提取用户与会话信息,跳过文件无效头部内容,按照固定分隔符拆分半结构化行为记录,精准提取T、P、I、U、V、W、N、C等核心字段,完成半结构化文本到结构化数据的转换。具体操作如下:

1. 在画布中拖拽「Java 代码」组件,将「获取文件名」组件与「Java 代码」组件连线,连接线类型选择「主输出步骤」,实现文件信息向代码组件的传输;

2. 双击打开「Java 代码」组件配置页面,录入完整的日志解析Java代码,实现文件读取、文件名解析、字段拆分、数据封装全流程逻辑;

// 全局变量定义
String pathField;
String shortFilenameField;

public boolean processRow() throws HopException {
    if (first) {
        pathField = "filename";
        shortFilenameField = "short_filename";
        first = false;
    }

    Object[] r = getRow();
    if (r == null) {
        setOutputDone();
        return false;
    }

    String path = get(Fields.In, pathField).getString(r);
    String short_filename = get(Fields.In, shortFilenameField).getString(r);

    String user_id = "";
    String l_start = "";
    if (short_filename != null) {
        String name = short_filename.replace(".txt", "");
        String[] parts = name.split("_");
        if (parts.length >= 3) {
            user_id = parts[0];
            l_start = parts[1] + " " + parts[2].replace("-", ":");
        }
    }
    String session_id = user_id + "_" + l_start;

    java.io.BufferedReader br = null;
    try {
        br = new java.io.BufferedReader(new java.io.FileReader(path));
        String line = "";
       
        // 跳过前两行(Last和L_Start)
        br.readLine();
        br.readLine();

        while ((line = br.readLine()) != null) {
            if (line.trim().isEmpty()) {
                continue;
            }

            // 解析键值对
            String[] kvPairs = line.split("\\\\[=\\\\]");
            String t = "";
            String p = "";
            String i = "";
            String u = "";
            String a = "";
            String b = "";
            String v = "";
            String w = "";
            String n = "";
            String c = "";

            for (String kv : kvPairs) {
                int sepIdx = kv.indexOf("<=>");
                if (sepIdx == -1) {
                    continue;
                }
               
                String key = kv.substring(0, sepIdx).trim();
                String val = kv.substring(sepIdx + 3);
               
                if ("T".equals(key)) {
                        t = val;
                } else if ("P".equals(key)) {
                    p = val;
                } else if ("I".equals(key)) {
                    i = val;
                } else if ("U".equals(key)) {
                    u = val;
                } else if ("A".equals(key)) {
                    a = val;
                } else if ("B".equals(key)) {
                    b = val;
                } else if ("V".equals(key)) {
                    v = val;
                } else if ("W".equals(key)) {
                    w = val;
                } else if ("N".equals(key)) {
                    n = val;
                } else if ("C".equals(key)) {
                    c = val;
                }
            }

            // 创建输出行
            Object[] outRow = createOutputRow(r, data.outputRowMeta.size());
           
            get(Fields.Out, "session_id").setValue(outRow, session_id);
            get(Fields.Out, "user_id").setValue(outRow, user_id);
            get(Fields.Out, "l_start").setValue(outRow, l_start);
            get(Fields.Out, "t").setValue(outRow, t);
            get(Fields.Out, "p").setValue(outRow, p);
            get(Fields.Out, "i").setValue(outRow, i);
            get(Fields.Out, "u").setValue(outRow, u);
            get(Fields.Out, "a").setValue(outRow, a);
            get(Fields.Out, "b").setValue(outRow, b);
            get(Fields.Out, "v").setValue(outRow, v);
            get(Fields.Out, "w").setValue(outRow, w);
            get(Fields.Out, "n").setValue(outRow, n);
            get(Fields.Out, "c").setValue(outRow, c);
            get(Fields.Out, "source_file").setValue(outRow, short_filename);
 
            putRow(data.outputRowMeta, outRow);
        }

    } catch (Exception e) {
        logError(e.getMessage(), e);     
    } finally {
        try {
            if (br != null) {
                br.close();
            }
        } catch (Exception e) {
            // ignore
        }
    }

    return true;
}

3. 代码配置完成后,在组件字段配置表格中右键「插入」,逐行添加代码中定义的所有输出字段,严格匹配字段名与字段类型,具体配置如下:

session_id(String)、user_id(String)、l_start(String)、t(String)、p(String)、i(String)、u(String)、a(String)、b(String)、v(String)、w(String)、n(String)、c(String)、source_file(String)

4. 所有字段配置完成后,点击「确认」,完成日志解析核心配置。

4.2.6 字段选择:有效字段筛选与规整

Java代码解析完成后会输出大量系统冗余字段,不属于实验所需的业务字段,需通过「字段选择」组件完成冗余字段剔除、有效字段规整,具体操作如下:

1. 右键点击「Java 代码」组件,选择「预览输出字段」,查看所有输出字段,确认冗余字段范围;

2. 在画布中拖拽「字段选择」组件,将「Java 代码」组件与该组件连线,连接线类型为「主输出步骤」;

3. 双击打开「字段选择」配置页面,切换至「移除」标签页,在空白字段栏右键「获取字段」,自动加载上一步输出的所有字段;

4. 选中所有系统冗余字段,右键「删除选中的行」,仅保留实验所需的业务有效字段;

5. 确认字段规整无误后点击「确认」。

4.2.7 表输出:结构化数据表落地

字段规整完成后,需将标准化结构化数据批量写入数据库预设的数据表中,实现数据持久化存储,具体操作如下:

1. 画布中拖拽「表输出」组件,将「字段选择」组件与「表输出」组件连线,连接线类型为「主输出步骤」;

2. 双击打开「表输出」配置页面,数据库连接选择「团队私有数据库」,选择目标表为behavior_events;

3. 勾选「裁剪表」选项,确保每次运行工作流前清空表内历史数据,避免数据重复入库;勾选「指定数据库字段」,激活数据库字段映射配置页面,右键「获取字段」,自动加载数据表字段与流处理字段;

4. 手动匹配工作流处理字段与behavior_events数据表的对应字段,修正字段映射偏差,确保数据精准入库,配置完成后点击「确认」。

4.2.8 执行转换流与结果核验

1. 完成全流程组件配置与连线后,点击平台工具栏「执行」按钮,在弹出的执行配置窗口中保持默认参数,点击「启动」运行工作流;页面底部实时刷新工作流执行日志,观察组件运行状态,确认无报错、执行完成;

2. 数据结果核验:点击左侧「元数据」标签页,右键「团队私有数据库」选择「加载元数据」,同步最新数据表信息;

3. 进入数据探查页面,展开团队私有数据库,双击打开behavior_events数据表,切换至「查询」标签页,查看入库数据格式、字段内容是否完整、规范,确认半结构化日志结构化转换、数据入库全部完成。

4.3 数据分析方向确定

完成基础行为明细表构建后,需先通过宏观数据统计,从海量行为数据中筛选核心分析对象,明确后续数据分析核心方向,避免盲目分析。本次通过统计各进程软件的用户覆盖规模,锁定核心分析载体。

4.3.1 创建进程统计表

首先创建进程用户统计专属数据表,用于存储各软件进程的用户使用规模数据,操作步骤如下:

1. 新建转换工作流,命名为「创建进程统计表」;

2. 拖拽「执行一个SQL脚本」组件;

3. 选择「团队私有数据库」连接,录入建表SQL:

— 创建程序/软件统计表
CREATE TABLE program_stats (
    program_name VARCHAR(255) NOT NULL,        — 程序/软件名称
    user_count INT NOT NULL              — 使用用户数
);

4. 为适配大数据量运行需求,点击「元数据」,双击「团队私有数据库」,勾选「使用结果流」参数,避免数据量过大导致运行报错;

5. 保持其余参数默认,执行转换流,完成program_stats统计表创建。

4.3.2 统计进程用户规模

通过多组件联动,统计每款软件进程对应的独立使用用户数,量化各软件的用户覆盖度,具体流程如下:

1. 新建转换流,命名为「统计进程用户规模」;

2. 拖拽「表输入」组件;

3. 连接团队私有数据库,读取behavior_events明细表全部数据;

4. 拖拽「字段选择」组件并与表输入组件连线;

5. 进入字段移除配置页面,字段名称下方空白处右键点击「获取字段」;

6. 仅保留统计所需的user_id、process_name两个核心字段,删除所有冗余字段;

7. 拖拽「替换NULL值」组件;

8. 针对process_name字段做空值处理,将所有空值统一替换为「未知」,避免空值导致分组统计异常;

9. 拖拽「排序记录」组件;

10. 对处理后的数据按照process_name字段升序排序,规范数据顺序,保证后续分组聚合结果精准;

11. 拖拽「分组」组件;

12. 以process_name为分组依据,新增聚合指标user_count,统计规则为COUNT(user_id),即统计每个进程的独立使用用户数;

13. 拖拽「表输出」组件,与分组组件连线;

14. 配置数据库连接为「团队私有数据库」,勾选「裁剪表」和「指定数据库字段」;

15. 在数据库字段tab页,建立字段映射,将统计结果写入program_stats数据表;

16. 执行转换流,完成全量进程用户规模统计。

4.3.3 观察数据确定分析方向

借助平台助睿BI模块可视化展示统计结果,精准锁定核心分析对象:

1. 点击平台左侧「助睿BI」菜单,进入可视化分析页面;

2. 点击「数据集」菜单;

3. 在数据集页面点击「+」 – 「新建数据集」;

4. 命名为「进程用户数据统计」;

5. 绑定团队私有数据库中的program_stats数据表;

6. 将 program_stats 拖拽至画布中;

7. 为了方便观察,可以将字段备注修改为中文;

8. 保存并发布数据集;

9. 点击「工作表」;

10. 进入工作表页面后,点击「+」 – 「新建工作表」;

11. 命名为「进程用户数量分析」;

12. 数据集选择刚刚创建的数据集「进程用户数据统计」,图表类型选择「水平条图」;

13. 将program_name拖拽至Y轴、user_count拖拽至X轴,设置user_count降序排序;

可视化结果分析:浏览器类进程(chrome.exe、360chrome.exe、sogouexplorer.exe、QQBrowser.exe、iexplore.exe)的独立用户数远高于办公软件(QQ.exe、EXCEL.EXE、WINWORD.EXE),用户覆盖范围最广、样本数据充足;同时浏览器行为记录包含URL核心字段,可深度挖掘用户上网偏好、使用习惯等多维度信息。

综上,本次实验后续所有深度分析,统一锁定浏览器类软件为核心分析对象。

4.4 分析方案设计与数据确定

基于浏览器用户覆盖度最高的统计结论,围绕浏览器使用场景设计六大核心业务分析问题,同时规划配套的数据加工与可视化方案,明确后续数据加工的核心目标:

  • 浏览器市场格局分析:对比各主流浏览器的用户数量、累计使用时长,判断市场占有率差异;
  • 用户画像差异分析:探究不同浏览器的使用用户在年龄、职业维度的分布差异;
  • 使用时段习惯分析:挖掘用户使用各类浏览器的高峰时段、时段分布规律;
  • 用户迁移竞争分析:统计用户在不同浏览器之间的切换迁移行为,分析产品竞争关系;
  • 浏览器流失预测分析:精准识别可能停止使用iexplore.exe浏览器的流失用户;
  • 个性化推荐分析:基于用户历史网站访问记录,挖掘用户偏好,实现网站个性化推荐。

为支撑上述分析场景,规划10张标准化分析数据表,本次实验优先完成前2张核心数据表的加工,分别为browser_coverage(浏览器用户覆盖与时长统计表)、browser_hourly(浏览器小时活跃统计表)。

提前创建两张数据表的数据库结构,具体操作如下:

1. 新建转换流「创建浏览器的用户数总使用时长统计表」;

2. 通过「执行一个SQL脚本」组件录入建表语句:

CREATE TABLE `browser_coverage` (
    `browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器进程名',
    `user_count` INT NOT NULL COMMENT '使用用户数(去重)',
    `total_duration_sec` BIGINT NOT NULL COMMENT '总使用时长(秒)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浏览器用户覆盖率与总时长';

3. 执行转换流;

4. 新建转换流「创建每个浏览器按小时统计活跃用户数统计表」;

5. 录入建表语句:

CREATE TABLE `browser_hourly` (
    `browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器进程名',
    `hour` TINYINT NOT NULL COMMENT '小时(0-23)',
    `active_user_count` INT NOT NULL COMMENT '活跃用户数',
    PRIMARY KEY (`browser_name`, `hour`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浏览器按小时活跃用户数';

6. 执行转换流;

4.5 数据清洗、聚合与关联加工

结构化转换后的behavior_events明细表仅记录单条零散操作行为,无法直接支撑宏观趋势、用户习惯、时段规律分析。本环节基于明细数据,结合用户属性表,完成数据清洗、字段衍生、多维度聚合、跨表关联,提炼标准化分析指标,生成可直接用于可视化与业务分析的聚合数据集。

本次实验可直接调用公共数据库中完整的behavior_events明细数据,无需重复导入全量原始日志。

4.5.1 表输入:读取行为日志数据

1. 新建转换流「互联网用户行为日志数据清洗抽取」;

2. 在空白画布拖拽「表输入」组件;

3. 绑定「线上公共数据源」连接,读取behavior_events明细表全量数据,作为本次聚合加工的基础数据源。

4.5.2 字段选择:删除冗余字段

1. 拖拽「字段选择」组件与表输入组件连线;

2. 进入字段移除配置页面,通过「获取字段」加载全部字段;

3. 仅保留本次分析所需的session_id、user_id、session_start_time、process_name、url、event_seconds核心字段,删除所有无关冗余字段,精简数据体量。

4.5.3 过滤记录:筛选主流浏览器数据

本步骤精准筛选主流浏览器行为数据,剔除无关软件行为记录,聚焦核心分析对象:

1. 拖拽「过滤记录」组件,与字段选择组件主输出连线;

2. 拖拽「排序记录」组件(承接有效数据)到画布中,创建「过滤记录」组件到排序记录组件的连线,连接线类型选择「True输出」;

3. 拖拽「空操作(什么也不做)」组件(承接无效数据)到画布中,创建「过滤记录」组件到排序记录组件的连线,连接线类型选择「False输出」;

4. 配置过滤条件,发送匹配的结果给「排序记录」,发送不匹配的结果给「空操作(什么也不做)」;

5. 字段选择process_name,匹配规则选择IN LIST,匹配值设置为主流浏览器进程集合:iexplore.exe;360chrome.exe;360se.exe;chrome.exe;sogouexplorer.exe;EXCEL.EXE;WINWORD.EXE;AlilM.exe;QQBrowser.exe;仅保留匹配成功的浏览器行为数据,无效数据直接丢弃,完成数据精准筛选。

4.5.4 计算停留时长

原始日志仅记录行为发生的时间节点,无软件停留时长指标,需通过前后行为时间差衍生核心时长字段,为总使用时长统计提供依据,操作流程如下:

1. 排序规整:双击已拖拽的「排序记录」组件,按session_id(会话)+event_seconds(行为秒数)升序排序,保证同一会话内行为按时间先后有序排列;

2. 滞后取值:拖拽「分析查询」组件;

3. 分组字段为session_id,提取同一会话内下一行的event_seconds值,生成新字段next_event_seconds;

4. 时长计算:拖拽「计算器」组件;

5. 设置计算公式为【next_event_seconds – event_seconds】,生成核心衍生字段duration_sec(单条行为窗口停留时长),字段类型为Integer。

4.5.5 字段选择:保留必要字段

1. 拖拽「字段选择」组件;

2. 精简数据字段,最终仅保留user_id、process_name、session_start_time、url、duration_sec五个核心分析字段,彻底剔除无效字段,优化数据结构。

4.5.6 过滤记录:筛选有效时长数据

日志最后一条行为记录无下一条数据,会出现duration_sec≤0的无效时长数据,需通过「过滤记录」组件筛选剔除,仅保留duration_sec>0的有效行为记录,保证时长统计精准性。

4.5.7 剪切字符串:提取日期信息

基于session_start_time字段(yyyy-MM-dd HH:mm:ss格式),通过「剪切字符串」组件精准提取日期部分(yyyy-MM-dd),生成独立日期字段,为按日聚合分析提供基础字段。

4.5.8 字段选择:统一日期格式

原始session_start_time为字符串格式,无法进行时间维度计算,通过「字段选择」组件将该字段数据类型转换为Date标准日期格式,适配后续时段提取、时间聚合操作。

4.5.9 计算器:提取小时时段

通过「计算器」组件,从标准时间字段中精准提取小时维度(0-23),生成独立hour字段,支撑后续按小时统计用户活跃量的分析场景。

4.5.10 生成用户-日-浏览器-小时明细数据

原始单条行为记录粒度过细,需聚合为标准化分析粒度:

1. 拖拽「排序记录」组件,对处理后的完整数据进行全局排序,规范数据顺序;

2. 拖拽「分组」组件,以user_id、日期、process_name、hour为分组依据,聚合统计单用户、单日、单浏览器、单小时的使用行为数据,生成标准化细粒度分析数据集,为后续两大核心统计表提供数据支撑。

4.5.11 分支A:生成浏览器市场格局表(browser_coverage)

本分支用于统计各浏览器的用户覆盖规模与总使用时长,量化市场占有率:

1. 拖拽全新「分组」组件;

2. 继承上一步聚合后的明细数据,仅以process_name(浏览器进程名)为唯一分组维度,设置聚合指标:user_count=COUNT(user_id)(独立使用用户数)、total_duration_sec=SUM(duration_sec)(累计总使用时长);

3. 拖拽「表输出」组件;

4. 绑定团队私有数据库,勾选裁剪表;

5. 完成字段映射,将聚合结果写入browser_coverage数据表。

4.5.12 分支B:生成浏览器时段统计表(browser_hourly)

本分支用于统计各浏览器不同时段的用户活跃度,分析使用时段偏好:

1. 拖拽「排序记录」组件,复制上游明细数据;

2. 按process_name、hour双维度升序排序;

3. 拖拽全新「分组」组件;

4. 以process_name、hour为分组维度,以active_user_count=COUNT(user_id)(对应时段活跃用户数)为聚合指标;

5. 拖拽「表输出」组件;

6. 绑定目标数据表browser_hourly,完成数据落地入库。

4.5.13 执行转换流与结果核验

1. 确认双分支全流程组件配置、连线、字段映射无误后,点击运行按钮执行完整转换流;

2. 运行完成后,进入元数据页面,右键刷新团队私有数据库元数据,同步最新数据表数据;

3. 接着点击「数据探查」,可以看到团队私有数据库目录;

4. 分别打开browser_coverage、browser_hourly两张数据表,查询核验数据完整性、统计逻辑准确性,确认本次数据清洗、聚合、加工全部完成,产出标准化可分析数据集。

五、问题与解决

问题 1:Java 代码解析日志运行报错、字段匹配异常

问题现象:在使用 Java 代码组件对半结构化日志进行解析转换时,工作流执行报错,或解析后字段内容为空、字段错位,无法正常生成结构化行为数据。

问题原因:一是代码中分隔符、字段匹配规则与原始日志格式不匹配,符号转义错误导致无法正常拆分字段;二是 Java 代码内自定义输出字段与平台配置的字段名称、类型不一致,出现字段映射冲突;三是未正确跳过日志头部两行无效数据,读取异常内容导致程序终止。

解决方法:核对日志原生分隔符规则,修正代码中转义字符与字段匹配逻辑;逐一比对代码输出字段与平台手动配置字段,保证名称、类型完全统一;保留跳过前两行头部信息的代码逻辑,清理空行无效数据;修改后重新保存代码配置,重启工作流,预览输出字段确认解析正常。

问题 2:数据聚合统计结果为 0 或统计数据重复

问题现象:完成浏览器用户数、小时活跃数聚合加工后,数据表查询结果为空、统计数值为 0,或用户数量、使用时长存在大量重复统计,数据失真。

问题原因:一是分组聚合前未对数据排序,导致分组组件统计逻辑异常;二是未过滤duration_sec≤0的无效时长数据、process_name空值数据,干扰统计结果;三是表输出未勾选 “裁剪表”,历史脏数据残留,造成数据重复叠加。

解决方法:严格按照分组维度提前完成数据排序;过滤剔除无效时长、空进程数据,清洗脏数据;表输出配置中勾选裁剪表,清空历史数据;核对分组字段与聚合指标规则,重新执行转换流,核验数据表统计结果准确性。

六、实验总结

本次实验基于首届中国互联网数据挖掘竞赛公开用户行为数据集,依托助睿数智 Uniplore 平台与助睿 ETL 工具,完整完成了半结构化日志解析、数据结构化转换、数据清洗规整、字段衍生计算、多维度聚合统计、业务数据表构建的全流程数据加工实操。实验以用户电脑行为日志为基础,通过 Java 代码解析实现零散 TXT 日志的结构化落地,进一步完成浏览器行为数据筛选、使用时长计算、时段特征提取,最终加工生成浏览器市场格局、时段活跃分布两类核心分析数据集,顺利完成预设实验目标。

实验过程中,我系统掌握了半结构化日志数据的处理逻辑,熟练掌握了平台各类核心组件的实操用法,包括文件批量采集、代码解析、字段筛选、空值替换、排序分组、数据入库等关键操作,理解了大数据从原始零散数据→结构化数据→分析指标数据的完整加工链路。同时掌握了用户行为分析的核心思路,学会从海量行为数据中筛选核心分析对象、设计多维度统计指标,能够结合业务场景完成数据清洗与聚合优化。

本次实验也让我深刻认识到半结构化数据处理的难点,以及数据预处理、数据清洗、参数校验对最终结果准确性的重要性。通过排查代码解析报错、统计数据异常等问题,提升了我的问题排查能力与数据严谨性。整体实验流程完整、实操性强,不仅强化了我的零代码数据处理与代码辅助加工技能,也为后续用户画像分析、行为预测、可视化分析、机器学习特征工程建模奠定了扎实的实操基础。

正文中关于实验平台的相关说明信息:

  • 平台全称:助睿数智(Uniplore)一站式数据科学实验平台
  • 平台定位:覆盖数据接入、ETL处理、机器学习建模到可视化分析的全链路Agentic零代码数据智能
  • 产品官网:https://www.uniplore.com/
  • 实验平台地址:https://lab.guilian.cn/
赞(0)
未经允许不得转载:171主机测评 » 助睿实验作业4-浏览器用户行为分析与流失预测-数据加工
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址