京公网安备 11010802034615号
经营许可证编号:京B2-20210330
用R语言分析报表访问的相关性
用R语言分析报表访问的相关性
1.起因
公司有几个提供数据系统,我负责其中一些系统的日常运维。其中最大的一个系统(有上千张的报表、清单)偶尔会有一些状况出现。而如果早上有问题,客服中心(呼叫中心)立即会对此进行严重投诉,并强调所有坐席都受到影响。印象中此类投诉一般出现在上午9点,而到了其他时间段,就算系统出现状况,他们也不会有投诉了。所以一直想分析一下客服中心的访问模式、访问重点是什么。另外,对于报表的总体访问情况也一直很有兴趣看一看。
这个工作一直没有去做。原因多种多样。最近有点时间,就打算用R来分析一下看看会有什么结果。
2.实战
a.数据整理。
进行数据分析,不能避免的第一步就是数据提取和整理。报表的每次点击都会有日志存放在数据库中,从最近一次系统升级到现在经过了19个月,一共有38万次点击,点击记录、点击用户、用户所属单位等信息分别存放在不同的表中。初始的关联工作我就利用数据库来完成了。也尝试过倒出来用R的merge函数,但是发现运行后R崩溃了。感觉是几十万的数据进行merge对我的机器来说可能太大了一些。既然手边有数据库,那很多初期工作就可以交给sql了,然后再利用R对初步整理好的数据框进行后续的各种处理。
最后生成的数据文件是如下格式的(csv文件)(部分字段进行了处理,以下是的简化版,呃.....实际折腾数据的过程总是有点复杂的):
"date","yyyymm","yyyy","mm","dd","day","hour","rpt_name","tag","dept"
"20120627","201206","2012","06","27","4","10","EVT_电话记录","事务报表","客户服务中心"
"20120627","201206","2012","06","27","4","10","SSR_投诉清单","投诉报表","东区"
....
字段的含义很明确,依次是:日期、年月、年、月、日、星期(1代表周日,2代表周一,etc)、小时、报表名、二级单位。
将数据读入。由于每个字段都有分析价值,所以每个字段都设为因子,并按照字符方式读入:
rptd <- read.csv("vis130730.csv",head=TRUE,stringsAsFactors=TRUE,sep=",",na.strings=" ",colClasses=c("character"))
读入数据后,用str(rptd)检查数据框结构时,发现所有的字段都不是因子。这是为什么?我不是已经设定stringsAsFactors=TRUE了么?看了一下手册,原来对于指定了字段类型的字段都将作为非因子读入,该选项无效。那就先这样吧,等需要的时候再进行因子化。
好了,数据初步整理完毕,接下来就要借助可视化分析了。这应该是R的强项之一了。
加载所需的加装包:
library(plyr)
library(reshape)
library(ggplot2)
b.客服中心在一天之中的报表访问情况是什么样的呢?
筛选出客服中心的数据(约有接近8万条,是总访问量的20%):
rptdkf <- rptd[rptd$dept=="客户服务中心",]
然后按照小时来绘图:
qplot(hour,data=rptdkf,xlab="小时",ylab="访问次数")
我们看到这样的结果:

有点令人失望。虽然大量访问集中在上午,但是并没有出现我预想中的“访问非常集中在8-9点”这样的情况,而是符合一般上午时点访问最多(8-11点,8点段访问少于9点段,应该是因为8:30才上班),中午休息,然后下午有一定访问量这种模式。
那么,在8-10点之间访问最多的报表是哪些呢?这些报表应该是维护的重中之重吧。我们再次进行筛选,并统计所有报表在这段时间的访问次数,按照访问次数的高低进行排序,可以看到有几张报表的访问频次远远超过其他报表:
rptdkf1 <- rptd[(rptdkf$hour=="08" | rptdkf$hour=="09" ),]
cnt <- ddply(rptdkf,.(rpt_name),nrow)
cnt <- cnt[order(cnt$V1,decreasing=TRUE),]
cnt
(结果略,可以发现有5张报表的访问量是其他报表的几倍、十几倍)
可以预计这些数据对于客服中心的人员是最重要,这些可以作为大家运行保障的重点(嗯,这话很像领导的口气)。这个信息当然也可以通过用户访谈得到,但是用户可能出于各种原因夸大重点报表的范围,对运维形成误导。而通过访问数据来分析就可能更准确地反映问题了。这并不是说访谈不重要,可能确实有些报表是少量管理人员每天上班要重点关注的,这需要通过访谈来甄别发现。这个工作就暂略了。
c.总体访问情况:
按照月份绘制了报表总体曲线,如下:
qplot(yyyymm, data=rptd,xlab="月份",ylab="访问次数")

可以看到访问量今年有所减少。13年的每个月对应12年的相应月份看也是在减少。这个可能是其他新的报表系统的替代作用。所以如果结合对其他报表系统访问情况的分析能看出一些其他的信息来。
分公司对报表的访问量占到了总访问量的60%,我们来看看他们的访问模式是什么样的。由于市场部等管理部门对各个分公司的工作有管理、指导的职责,所以我们将他们(他们占总访问量占10%)也纳入分析,我们用%in%筛选出这些单位,并按照个单位作图。
我们按照按照各个分公司绘制了按月的访问曲线:
rptdsub <- rptd[rptd$dept %in% c("宝山","北区","崇明","东区","奉贤","嘉定","金山","南区","浦东","青浦","莘闵","松江","西区","中区","市场部","政企客户部","公众客户部"),]
qplot(yyyymm, data = rptdsub,xlab="小时",ylab="访问次数") + facet_wrap(~ dept)

可以看到各个单位的访问量是有很大差异,虽然总体的访问次数是略有下降的,但是对应到不同的单位,可以看到有的在增加。或许这些访问在增加的单位加大了数据分析的力度,也可能是他们有分析的需求,但是对其他新的数据系统不够了解,所以没有好好利用新系统,而只能重点使用该系统。我们还可以看到浦东分公司的访问量最大(实际上超过了管理部门之和),中区分公司的访问量下降最明显。另外市区公司的访问量普遍高于郊区公司。这个可能和郊区竞争不激烈、人员配备较少有关。
再按照访问的钟点作图:
qplot(hour, data = rptdsub,xlab="小时",ylab="访问次数") + facet_wrap(~ dept)

我们还可以看到有些单位(金山、宝山)上班可能比标准时间早半个小时,因为他们在8点档的访问量超过9点档,与其他单位明显不同。有些单位下了班后就没有点击量了,有些单位明显勤快很多。另外,我们还可以注意到有些单位8点档几乎没有访问量,而到了9点的访问量也不是很多(呃,就不点名了,可能是他们的工作重点有所不同吧.....)
d.访问相关性。
最后,我们来看看分公司和市场等管理部门之间的访问相关性。我们采用多维定标(MDS)算法(参考《机器学习:实用案例解析》)。
首先我们需要建立一个访问矩阵,每行是各个单位,每列是各张报表。如果某个单位访问了某张报表,则对应的单元格填1,如果没有就填0。这个操作在数据库上好像很不好办(我不知道简单的实现办法,如果有人知道,烦请赐教)。原来想用循环的方式来做,忽然想到了reshape包的cast命令应该能完成这样的工作:
mds1 <- cast(mdsd, abbr~rpt_name)
第一列是单位的名称,我们需要将其剔除,剩余部分转化为一个矩阵。第一列转化为行名,原来的字段名(剔除第一个的dept)作为列名:
mds.m <- as.matrix(mds[,2:ncol(mds)])
row.names(mds.m) <- t(as.matrix(mds[,1]))[1,]
colnames(mds.m) <- colnames(mds)[2:ncol(mds)]
矩阵做好了,代码非常简洁,我相信,光凭reshape包,R就物超所值了。看了一下,发现交叉点上的值不是0和1,而是访问次数。我们再将所有非0的值都赋为1:
mds.m[mds.m>0] <- 1
好了,我们得到我们要的矩阵了,以下就是按部就班的操作:计算距离并作图:
mds.mute <- mds.m %*% t(mds.m)
mds.dist <-dist(mds.mute)
mds.g <- cmdscale(mds.dist)
plot(mds.g, type='n')
text(mds.g, row.names(mds.g))
最终看到的图如下:

真是令人意外:各个分公司与管理部门之间所看的报表情况竟然如此旗帜鲜明地分成两个聚类。这说明什么呢?二级公司与管理部门之间的分析思路和重点不同?管理部门没有将管理思路贯彻到各个分公司?还是说管理部门有秘而不宣的武器呢?
另外,分公司之间也有比较明显的区分:市区公司和郊区公司的关注重点明显有一定的差异。这个在IT部门以后开发支持分公司经营的数据应用时,也可以作为调研访谈的参考吧。
对于报表点击情况的简要分析就到此为止了。我到达了分析的目标,也顺便演练了数据筛选、作图、相关性分析等工作。除掉数据整理的工作,核心代码也就不到二十句,就做出了有点意思的功能了。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
指标体系是企业数字化分析、业务监控、经营决策的核心基础框架,是将零散数据转化为可衡量、可对比、可落地业务价值的关键体系。 ...
2026-10-08随着市场竞争日趋饱和,同质化低价竞争逐渐陷入内卷僵局,传统以价格、渠道、促销为核心的营销模式边际效益持续递减。在此背景下 ...
2026-10-08 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-10-08你有没有想过,手机里点外卖、刷社交软件、转一笔账,背后到底是谁在替你"记着账"? 答案其实很简单:数据库,以及跟它对话的那 ...
2026-10-07CDA数据分析师 出品 作者:李诗怡 一、数据分析四大思维 1. 对比思维:没有对比就没有分析 核心观点:单独一个数字没有意义,有 ...
2026-10-05Kimball 是方法,星型模型是它产出的形状。 很多人把"Kimball vs 星型模型"当成一道选择题——这本身就是个误会:Kimball 是动词 ...
2026-10-05写在开头 老板在微信上甩来一句: "帮我看下为什么销量跌了。" ” 你回工位,打开 SQL,开始写。查订单表、拉近三个月、按 ...
2026-10-03CDA数据分析师 出品 作者:李诗怡 1. 事实表 vs 维度表 对比维度 事实表 维度表 核心问题 记录“业务发生了什么事” 描述 ...
2026-10-02做数据聚合时,PySpark的groupBy()确实能完成统计,这也是它的本职工作。但它有一个根本性局限:每一组数据,最终只能返回一行 ...
2026-10-01热力地图是数据可视化中极具辨识度与实用性的空间分析图表,结合地理空间维度与数据密度特征,通过颜色深浅、色阶渐变直观展示数 ...
2026-09-30 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-09-30同样是“银行数据岗”,在国有大行总行数据中心、在一家城商行的零售部、在银行系金融科技子公司、在保险公司,工作内容、成长节 ...
2026-09-29在数据分析与统计学研究中,数据往往不是独立存在的,不同变量之间普遍存在相互关联、相互影响的关系。相关性统计分析是挖掘变量 ...
2026-09-29 导读:大多数人只把 dataclasses 当成偷懒工具,用来少写 __init__、__repr__ 这类魔法方法。但它的能力远不止于此。本文带 ...
2026-09-29 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-09-29在MySQL数据库运维与业务开发中,行业普遍存在“数据达到千万级就必须分表”的说法。但在实际生产环境中,千万条数据并不是强制 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 5W1H 分析法 定义:经典系统性思维框架,通过六个核心维度对问题进行全方位拆解与剖析,确 ...
2026-09-28 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 用户标签体系 定义: 通过一系列高度精炼的特征标识,对用户属性、行为与偏好进行量化刻画 ...
2026-09-24Pandas是Python生态中用于表格数据处理的核心库,广泛应用于数据清洗、统计运算、报表输出、数据分析建模等场景。在处理极大数值 ...
2026-09-24