文章目录

  • 具体场景列举
  • 问题背景
  • 分析和数据准备
  • 成功率分析
  • 成功率统计的简化方法
  • 失败情况假设符合度分析
  • 最终数据展示

具体场景列举

使用到的场景包括
场景1、针对VLOOKUP使用时,同一个检索字段存在多个实际匹配结果时,需要返回所有的匹配结果的场景,提供一种曲线救国的方法。
场景2、对同一个字段下不同值的出现情况进行统计,提供一种上述vlookup的复杂用法的实现,以及另一种基于常规数据透视图的方法。
场景3、COUNTIFS函数的使用,对多列同时匹配某些不同条件的场景进行判断统计。
场景4、多条件排序的应用
场景5、筛选后选择复制
场景6、分列的应用
场景7:通过子母表来展现结果
如果需要了解对应场景的使用方法,可直接根据 “场景X” 类似的形式搜索即可。

问题背景


在工作中涉及到一种IoT的应用场景,就是app端通过某种发现手段,发现局域网中未添加的设备,将其添加到app端的管理设备中。因该流程是使用设备的最先步骤,如果失败,会严重影响用户体验。故而希望进行数据收集,来考察该流程的一次成功率,如果一次成功率不及预期,则需要对问题进行分析,确认是环境影响还是系统bug,通过优化UI界面来引导或是解决技术问题来提高成功率,优化用户首次添加设备的使用体验。

分析和数据准备


因完成设备添加的流程需要设备端和app端双端合作,如果设备处于未就绪的状态,app自然无法添加设备。故而需要设备端和app端同时上传日志,并通过某种方式将一次完整流程中双端上传的日志进行关联。这里很自然的想法是让设备端和app端通过某个random ID(简称RID,表格中也会出现associationID关联ID,与此同义)进行关联,在成功添加设备后,由app触发设备上传日志,同时app自身也上传日志。故而我们需要对两端同时上传的日志进行基于RID进行关联分析,得到用户环境下,实际发现流程的一次成功率。

本次分析假设app添加设备失败的主要原因是由于设备尚未启动就绪,数据处理围绕证明该点假设展开。

设备端上传的数据主要为设备就绪时间点。
app端上传的数据主要为对每一次执行发现任务的时间节点和结果进行记录。比如一次成功即为Yes;前2次失败,第3次成功,则记录为No,No,Yes; 3次失败,则记录为No,No,No。上述三类均分别属于3次发现过程,每次分别拥有同样的RID。

目标主要包含2个,一个是一次成功率,一个是含有失败的情况是否符合上述假设。

成功率分析


  • 数据观察,部分原始数据如下截图所示,可以看到部分情况下发现任务一次成功,部分情况下发现任务在多次失败后的某一次成功,也有部分情况下发现任务一直失败。

  • 故而我们需要对结果RID 基于包含YES和NO的数量进行分类。但是基于常规的透视表,我们只能得到统计的结果,即针对每个RID,YES和NO那一栏的数量,比如如下的形式,此处的行是RID关键字,值是searchResult列的计数项。(但其实后面介绍同时对行列进行透视即可得到结果)

  • 故而这里需要用到一种基于VLOOKUP字段匹配的曲线救国的方式,该种方式其实主要不应用于当前场景,而是应用于针对VLOOKUP使用时,同一个检索字段存在多个实际匹配结果时,对所有的匹配结果进行返回的场景。

VLOOKUP匹配函数,根据查找值,在数据表的首列搜索指定的查找值,并返回指定的查找值所在行中  的  指定列处的值
VLOOKUP(lookup_value, table_array, col_index_num,range_lookup)|                     |                     |                          | 根据什么值查找      |                     |                         精确匹配(0),模糊匹配(非0)在哪里查找,        |数据表区域           |找到第几列的值——《谁说菜鸟不会数据分析》 p75
类似于数据库中的select操作,只是这里规定的匹配的列为首列,同时返回的结果也只能是索引指定的特定列。

场景1、针对VLOOKUP使用时,同一个检索字段存在多个实际匹配结果时,需要返回所有的匹配结果的场景,提供一种曲线救国的方法。

a) 先要把上述的一维的RID数据转化为基于RID的二维数据表,类似如下格式:

那么如何做到呢?
核心思路是将RID进行细分,一个RID比如RIDA,对应了多个记录,比如No,No,Yes, 原来是RIDA:YES,RIDA:NO,RIDA:NO。现在拆分为RIDA1:NO,RIDA2:NO,RIDA3:YES。根据RID在表格中出现的次序,加上出现序号的尾缀,区分出不同的RIDA,得到类似如下表显示的结果

A10的公式
=B10&COUNTIF($B$2:B10,B10)COUNTIF(range,criteria) 对满足单个指定条件的单元格进行计数
range: 要计数的单元格范围
criteria: 计算条件,可以是数字,文本或表达式。 32,"32",">32","NO" 。数字和文本都是配置值,表达式则是匹配逻辑表达式。
——《谁说菜鸟不会数据分析》 p62
$B$2 表示绝对位置 B2
&表示拼接字符串

通过找到整个B列中到当前行的 当前单元格的值的个数,来确定当前单元格是出现的第几次,并把这个次序拼接到单元格值的末尾。

然后在查找的时候,每一列填充各个序号的RIDA的值,得到基于RID的二维数据表
来看看G2单元格的公式

G2
=IFERROR(VLOOKUP($F2&COLUMN(A1),$A:$C,3,FALSE),"")
H2
=IFERROR(VLOOKUP($F2&COLUMN(B1),$A:$C,3,FALSE),"")IFERROR(value,value_if_error)
该函数仅为提供value值无法计算时的默认显示结果,此处为“”空字符串,为保证整个界面结果美观。

查找范围是A列到C列,即上述图表中的列,要匹配的值是F2单元格的值加上A1的列名,即1。H2的公式由G2递推得到,列为B1,即2。查找的值在第三列,即searchResult,YES或者NO的结果。将该公式应用到尽可能多的列,即可得到一个基于RID的完整二维数据表

b) 然后便可基于YES或者NO的次数进行利用COUNTIF公式进行统计计数,得到YES或者NO的数量,

D20公式
=COUNTIF(G2:AJ2,"NO")
D21公式
=COUNTIF(G2:AJ2,"YES")

得到类似如下的图表

c) 再对得到的D和E的列进行二次的COUNTIF公式应用,即可得到我们预期的只包含YES的RID的数量,以及同时包含NO和YES的RID的数量。不过COUNTIF公式只能对单一的范围进行统计。COUNTIFS公式可以统计符合多重条件的单元格数量
场景3、COUNTIFS函数的使用,对多列同时匹配某些不同条件的场景进行判断统计

COUNTIFS(range1,criteria1,[range2,criteria2],...) 对满足单个指定条件的单元格进行计数
range[12...] 和 criteria[1,2,...] 的含义同COUNTIF函数
但注意range的范围要一致,否则比对结果的值会是非法的。

这里把数据放到一张新的表格上,对YES和NO的列进行条件统计得到左上角的结果(为保密,此处数据做脱敏处理),按照如下公式进行多重条件统计。

只有成功
=COUNTIFS(G21:G631,"=0",H21:H631,">0")

得到了该统计数据后,便可以计算出成功率。

成功率统计的简化方法

场景2、对同一个字段下不同值的出现情况进行统计,一种基于常规数据透视图的方法。
后续研究发现使用二维数据透视表其实能很方便地实现针对不同RID的YES和NO的统计。

以RID此处即为associationID为行,searchResult为列,同时searchResult也为结果

再通过上述COUNTIFS函数进行统计即可。

失败情况假设符合度分析

设备的日志与app端日志为分开上传到kibana服务器,需要将app端的最后一次执行搜索失败的时间A与对应的那次设备的启动成功的时间B进行比较。如果 A < B 则证明假设成立,设备尚未启动时即执行搜索当然会出现失败的情况。

场景4、多条件排序的应用:
首先需要根据app端的日志,得到最后一次执行搜索失败失败的时间A,即最后一次返回为NO的时间。这里需要先应用筛选,找到所有为NO的结果,然后需要应用到多条件排序的机制。因为需要区分每一次的搜索,再在每一次的搜索内找到最后一次为NO,即时间最大的一次,并在后续的查找结果中返回,因为VLOOKUP只返回匹配到的第一个结果,故而需要将时间按照降序排列。可看到实际执行的配置如下,先依据ID进行主要排序,再根据时间降序排列

场景5、筛选后选择复制
为了不影响原始数据,同时便于后续应用VLOOKUP函数 (因VLOOKUP的查找匹配列默认为首列) 应将筛选排序后的结果复制到一个新的表格中,这里常规的复制是不行的,那样只会选择所有行。需选中后使用ctrl+G,进行定位

并选择定位条件到可见单元格

通过app端的日志,能够选中所有筛选过的列,此时ctrl+C即可复制这些特定列。然后通过同样的方式获取唯一的ID的列表,根据如下公式即可从原表中筛选得到app端对应id的失败时间戳。

=VLOOKUP(C4,失败改造后原始表!A:K,3,FALSE)

接下来处理的是设备端的启动时间数据,将其与app端的失败时间进行关联即可得到结果。但是设备上传的内容默认是不带关联ID,该ID是隐含在url中的,故而需要对url进行分列,得到id,格式如下:

http://a.b.c.d:xyz/log/2021-03-09/39/50/89/DEVICEA_LAN_login_9e5fac7364fc8da55d2a4892b36665ae.csv

场景6、分列的应用

选中单元格(最好是新建一列,因为分列会修改原始值)
根据必要的分隔符,此处是 _ 进行分割

针对不需要的列,勾选不导入对应列即可。

最终可得到一列的值均为关联ID,类似:9e5fac7364fc8da55d2a4892b36665ae,将该列作为第一列。

=VLOOKUP(C4,设备总表!A:S,6,)

根据VLOOKUP即可将url填写到 app和设备的关联表,再通过url下载设备结果,得到对应时间戳,即可和app的时间戳进行比较,使用COUNTIF进行统计即可得到比例。

最终数据展示

因为结果涉及到对成功失败比例的体现,以及失败中不同类型的展示,为了方便观察,采用字母表的形式来展示结果。

场景7:通过子母表来展现结果

选择数据区域后,选择如下插入饼图的二维图表中子母饼图即可

会得到如下的子母图结果,根据原始数据区域得到

界定子母的标准即哪些数据列放入子饼图,可通过右键 设置图表区域格式选项进行修改,或者直接选中饼图修改结果亦可

分割依据可选择位置,值,百分比和自定义。
此处选择位置 -第二绘图区的值=3,即第二绘图区中包含3个值。所有选中区域的值的合计为100%,此处一共有4项,即4项合计100%,第二绘图区占4项中的3项。

记录数据处理流程中用到的excel工具相关推荐

  1. 医疗大数据处理流程_我们需要数据来大规模改善医疗流程

    医疗大数据处理流程 Note: the fictitious examples and diagrams are for illustrative purposes ONLY. They are ma ...

  2. Java导入导出Excel工具类ExcelUtil

    前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...

  3. 宏基因组单个样本数据处理流程笔记

    宏基因组单个样本数据处理流程笔记 前言 数据预处理 质量控制 去除接头序列 去除宿主序列 物种注释 Kraken2注释 Krona制图 序列组装 MEGAHIT序列组装 SPAdes序列组装 功能注释 ...

  4. 珞珈一号01星(luojia1-01)的夜间灯光影像数据处理流程

    珞珈一号01星(luojia1-01)的夜间灯光影像数据处理流程 书接上回,我们爬取了山东省的珞珈一号夜间灯光影像数据,现在我们来对数据进行预处理,以分区获取区域夜间灯光亮度值. (1)加载珞珈一号夜 ...

  5. 面向大数据处理的数据流编程模型和工具综述

    点击上方蓝字关注我们 面向大数据处理的数据流编程模型和工具综述 邹骁锋, 阳王东, 容学成, 李肯立, 李克勤 湖南大学信息科学与工程学院,湖南 长沙 410008 论文引用格式: 邹骁锋, 阳王东, ...

  6. 计算机会计数据处理流程是怎样的,实现会计电算化后,会计数据的处理流程依旧和手工..._高级会计师_帮考网...

    bangkafan 高分答主 06-16 TA获得超过8931个赞 一.手工与电算化会计信息系统的数据处理流程: 1.相同点: ①数据处理步骤相似: ②会计信息相同且最终目标一致: ③遵守的会计法规和 ...

  7. 读写Excel工具类ExcelUtil

    突然要用到Excel的读写操作,自己写太过麻烦,在网上找了好久找到个还不错的工具类,怕自己忘掉,分享出来,也留个记录,以后可以直接拿来用. 这个工具类分三个部分: ExcelUtil.java  // ...

  8. JAVA工具类(17)--Java导入导出Excel工具类ExcelUtil

    实战 导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空.有重复行等,我自定义 ...

  9. 遥感数据处理流程新概念(一) ——RSD的面向任务

    目录 一 创建任务... 2 二 为任务添加数据... 3 三 拼接... 5 四 剪切... 11 五 不落地继续分类?... 13 六 创建/保存任务目录... 13 七 讨论... 14 提到了 ...

最新文章

  1. JUnit报initializationError的解决方法
  2. 微信开发教程(4)——高级群发接口
  3. 内存延时cl_内存频率和CL延迟哪个重要
  4. word 段显示在页面最下方_Word你说的白是什么白
  5. Jenkins安装目录说明
  6. 15.8.2 泛型数组
  7. Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
  8. python之模块之shutil模块
  9. redis基础类型:string
  10. JavaScript内置对象之Array对象总结(附实例)
  11. 使用treeNMS管理及监控Redis
  12. lwip---(六)ARP表
  13. java 双向链表循环_(java实现)双向循环链表
  14. 柯尔莫哥洛夫微分方程
  15. C++面试宝典 知识点集锦
  16. 光速掌握史上最全--计算机数制转换
  17. cocos creator 显示截图并保存图片到手机
  18. ArcGIS 矢量数据拓扑编辑
  19. 816墨盒计算机无法与,西通PG-815、CL-816兼容墨盒和总结
  20. T045基于51单片机温湿度检测系统无线蓝牙传输Proteus仿真原理图PCB

热门文章

  1. Titanic 生存预测详细笔记
  2. 计算机学术期刊、会议分类等级
  3. cc2530串口操作
  4. windows10清除弹框广告
  5. python学习笔记(一)Python 简单介绍
  6. aelf上线跨链Sushi项目Sashimi 并非SushiSwap平台的分叉
  7. Android中显示网络图片
  8. 计算机科学与技术与智能化建筑建造论文,浅析智能建筑与智能化系统
  9. 【FineReport】帆软报表平台的安装与连接 SAP HANA 数据库
  10. behavior3go行为树节点类型介绍