创业公司做数据分析(二)运营数据系统

??作为系列文章的第二篇,本文将首先来探讨应用层中的运营数据系统,因为运营数据几乎是所有互联网创业公司开始做数据的起点,也是早期数据服务的主要对象。本文将着重回顾下我们做了哪些工作、遇到过哪些问题、如何解决并实现了相应的功能。

早期数据服务

??产品上线开始推广后不久,后台研发人员便会经常收到运营同事的私信:“能不能查一下有多少用户注册了,来自哪里?……..”。几次之后,大家便觉得这样的效率太低了:研发人员需要在繁忙的开发任务中抽时间来做数据查询、统计,而运营同事则需要等很久才能拿到数据。于是,大家开始协商更好的方法,最终达成一致:由运营同事提供所需的数据模板,后台研发人员根据模板将数据导入Excel文件,运营同事可根据自身需求自己分析统计。这便是早期的数据服务了,其组成结构如下图所示。

??这样的做法简单明了,后台研发人员根据数据模板写一个Python脚本,从业务数据库中将数据捞出来,做些分析、整合后,将结果输出到一个Excel文件,然后发送邮件通知运营同事接收文件。然而,随着需求的增加和细化、数据量的增加,暴露的问题越来越多,这里先罗列出来,这些问题有的会在本文提出解决方案,有的则会在后面的文章中陆续提出解决方案。

  • Worker越来越多,分布在多个地方,存在很多重复的劳动和代码,某个逻辑的修改需要改很多文件。
  • 由于使用ORM来访问数据库,很多代码只考虑逻辑,没考虑到查询数据的效率问题,导致有些报告需要跑十几个小时才能出结果(在循环查询数据的性能问题及优化一文有讲解)。
  • 中间计算结果流失,数据没有共享,每个Worker都要跑自己的逻辑去算一遍。
  • Woker依靠crontab来控制触发,没有监管,经常由于脏数据导致中断,需要等到运营同事发现后报过来才知道。

运营数据Dashboard

??随着业务的发展,以数据报表的形式来提供数据服务逐渐不能满足需求了。一方面,高层期望每天一早便能看到清晰的数据,搞清楚最近的运营效果和趋势;另一方面,虽然数据报表提供了详细的数据,但是还是需要手动去过滤、统计一下才有结果,所有想看数据的人都需要做一遍才行,而业务人员处理Excel的水平层次不齐。

??于是,我们开始筹划Dashboard系统,以Web的形式提供数据可视化服务。可是,Dashboard要做成什么样子?由于产品经理和设计人员都忙于产品业务,所以只能自己考虑要做什么、怎么做。好在笔者之前用过百度统计,对那里面的一些统计服务比较清楚,结合公司的业务,形成了一些思路:

  • 数据内容上,包含:核心指标数据和图表分析两部分。前者以曲线图为主,要能快速显示数量和趋势,比如注册日增量趋势图;后者使用各种图表来展现某个时间段内的分析结果,比如10月份的TOP10用户感兴趣品牌。
  • 数据类型上,包含:C端核心指标、B端核心指标、核心分析和专题活动指标与分析。前两者是分别针对C端和B端的指标数据,核心分析是一些综合的分析,比如转化率分析,专题活动是针对一些特定的大型运营活动。
  • 数据维度上,包含:时间维度、城市维度和B端品牌维度。时间是最基本最重要的维度,城市维度可以分析各个运营大区的状态,B端品牌维度主要是针对B端上的业务。

??整理后便形成了下图所示的Mockup(简化版),基本涵盖了上述的思路。虽然在美观上相对欠缺,但是毕竟是内部使用嘛,重要的数据显示要能准确、快速。

??搞清楚了要做什么,接下来就是要将想法落地,考虑如何实现了。

整体架构

??系统的整体架构如下图所示,主要基于这么几点考虑:

  • 前后端分离。前端只负责加载图表、请求数据并显示,不做任何数据逻辑处理;后端负责产出数据,并提供REST API与前端交互。
  • 离线与实时计算并存。为了提高数据获取的速度,曲线指标数据采用离线计算的方式,提供历史数据供前端展示;图表分析类数据采用实时计算的方式,其速度取决于所选时间段内的数据量,必要时进行缓存。

前端实现

??Dashboard系统的前端并不复杂,前面也提到我们不会做太多样式上的工作,重点是数据的显示。那么,第一件事就是要寻找一款图表库。笔者这里选择的是百度ECharts,其提供了丰富的图表类型,可视化效果很棒,对移动端的支持很友好,重要的是有详细的示例和文档。事实证明ECharts确实很强大,很好的满足了我们的各种需求。

??选好了图表库,接下来的问题是如何优雅的加载几十个图表,甚至更多。这就需要找到图表显示共性的地方(行为和属性),进行抽象。通常,使用ECharts显示一个数据图表需要四步(官方文档):第一步,引入ECharts的JS文件;第二步,声明一个DIV作为图表的容器;第三步,初始化一个echart实例,将其与DIV元素绑定,并初始化配置项;第四步,加载图表的数据并显示。可以发现,行为上主要分为初始化和更新数据两个,属性上主要是初始配置项和数据。

??基于此,笔者使用“Pattern+Engine”的思想来实现前端数据加载。首先,在JS中使用JSON对每个图表进行配置,即写Pattern。例如,下面的配置便对应了一个图表,elementId是DIV的id,title是图表的标题,names是图表的曲线名称,url提供了获取数据的API,loader表示要加载的图表Engine。而一个页面的图表便由一组这样的配置项组成。

{
        elementId: ‘register_status_app_daily‘,
        title: ‘App注册统计(日增量)‘,
        names: [‘用户数‘],
        url: ‘/api/dashboard/register_status_daily/‘,
        loader: ‘line_loader‘
}

??页面加载时,根据Pattern中的配置项生成相应的Loader Engine实例,用来初始化图表和更新数据。每个Loader对应一个ECharts图表类型,因为不同图表类型的初始化和加载数据的方法不同。程序类图如下所示。

后端实现

??前面提到在早期的数据服务中,存在很多重复劳动和代码,因此在Dashboard系统的后端实现中,笔者开始考虑构建数据分析的公共库,这块占据了很大一部分工作量。底层公共库不针对任何特殊业务需求,主要负责三件事:第一,封装数据源连接方法;第二,封装时间序列的生成方法,产生以天、周、月为间隔的时间序列;第三,封装基础的数据查询、清洗、统计、分析方法,形成格式化的数据,这部分是最重要的。

??完成了底层公共库的构建后,整个代码结构一下子就清爽了很多。在其基础上,开始构建上层的Analyzer。Analyzer用于完成具体的数据分析需求,每个Analyzer负责一个或多个数据指标的产出,每个曲线图/图表的数据由一个Analyzer来负责。离线计算与实时计算,则是分别在Schedule和Web请求的触发下,调用对应的Analyzer来完成数据产出。因此,整个后台系统分为三层来实现,如下图所示。

??最后谈一谈离线数据的问题。目前离线计算是由Schedule来触发,每日零点计算前一日的数据,数据按照“每个指标在不同维度上每天一个数据点”的原则来生成,由上述的Analyzer来负责产出格式化的数据,存入MongoDB中。由于查询规则简单,只需建立一个组合索引就可以解决效率问题了。目前数据量在500W左右,暂时没有出现性能问题,后期可以考虑将部分历史数据迁移,当然这是后话。

数据报表

??Dashboard上线后,我们开始考虑将早期的数据报表服务逐步停下来,减少维护的成本。而运营同事希望能继续保留部分报表,因为Dashboard虽然提供了很多数据指标和分析,但是有些工作需要更精细的数据信息来做,比如给带来微信注册的校园代理结算工资、对新注册用户电话回访等等。经过一番梳理和协商,最终保留了六个数据报表。另一方面,B端的商家期望能在后台导出自己的相关数据。综合两方面需求,笔者构建了新的数据报表系统。

??新的数据报表系统,按照流程来划分为三部分:触发、执行与通知。内部数据报表依旧由Schedule触发,启动相应的Worker进程来执行;而提供给外部的报表由Web前端通过REST API来触发,将相应的任务加入Celery任务队列中执行。执行体由一组Exporter来完成,Exporter负责获取数据、生成适合写入Excel的数据格式、写Excel文件,数据获取部分依赖前面所述的底层公共库。最后,统一发送邮件通知。

??考虑到早期数据服务中经常遇到异常导致生成报表失败的问题,笔者在新的数据报表系统中做了两点与异常相关的处理:

  • 使用Airflow对Schedule触发的任务进行监控(后续文章会有详细介绍),手动触发的任务则由Celery进行监控,遇到异常便发送邮件通知到开发人员。
  • 如果一个Excel数据文件由多个Sheet组成,当某个Sheet出现异常时,通常由两种处理方法:一是丢弃整个文件,二是保留其他Sheet信息继续生成Excel文件。这里,内部报告使用了第二种处理方法,外部报告相对严谨,使用了第一种。

??以上便是笔者所在公司的运营数据系统的发展历程和现状,目前Dashboard与数据报表两个系统已经趋于稳定,基本提供了90%以上的运营数据服务。当然,随着数据量的增长、业务需求的发展,一定会面临更多新的挑战。

(本文完,地址:http://blog.csdn.net/zwgdft/article/details/53467974

Bruce,2016/12/07

时间: 2024-10-29 19:09:48

创业公司做数据分析(二)运营数据系统的相关文章

创业公司做数据分析(转载)

最近看到这个系列觉得不错,想转一下. 不管是小公司,还是大公司里面的不跟传统IT混的分析团队(就是我..),都可以借鉴. 创业公司做数据分析(一)开篇 创业公司做数据分析(二)运营数据系统 创业公司做数据分析(三)用户行为数据采集系统 创业公司做数据分析(四)ELK日志系统 创业公司做数据分析(五)微信分享追踪系统 创业公司做数据分析(六)数据仓库的建设 另外总结下最近的“工具栈” 讲故事:PPT / Keynote 理思路:MindNode / Axure / Sketch 展现层:Table

创业公司做数据分析(五)微信分享追踪系统

??作为系列文章的第五篇,本文重点探讨数据采集层中的微信分享追踪系统.微信分享,早已成为移动互联网运营的主要方向之一,以Web H5页面(下面称之为微信海报)为载体,利用微信庞大的好友关系进行传播,实现宣传.拉新等营销目的.以下图为例,假设有一个海报被分享到了微信中,用户A与B首先看到了这个海报,浏览后又分享给了自己的好友,用户C看到了A分享的海报,浏览后继续分享给了自己的好友.这便形成了一个简单的传播链,其中蕴含了两种数据: 行为,指的是用户对微信海报的操作,比如打开.分享. 关系,指的是在海

【转】如何快速入门网站数据分析与运营?

原文链接:http://www.36dsj.com/archives/66362 一.如何入门互联网数据分析 1.网站分析是一种能力36大数据(http://www.36dsj.com/) 对于大部分人互联网从业者而言,网站分析是一种能力,因为基于网站分析之上的结论可以指导运营.产品.设计.技术的同事的工作. 2.网站分析解决的问题36大数据(http://www.36dsj.com/) 即分析出:36大数据(http://www.36dsj.com/) 用户是谁(目标用户), 从哪里来(流量从

如何做数据分析自动化?

很多做数据统计小伙伴总避免不了使用Excel,尤其是专门做数据分析的,需要周期性的得出分析数据,即便可以做Excel模板,重复分析多了还是会让人感觉到很枯燥.我是Myb,在这里我告诉大家数据分析自动化是可以办到的.下面是自动化的方法. 一:简易数据分析自动化(发送xlsx文件到指定邮箱): 语言:Python(处理数据).SQL(数据库提取数据) 方法:用Python的pymysql模块连接数据库读取最新数据,用xlsxwriter模块制作excel,用smtp模块发送邮件给指定的人.如果加上定

项目开发流程,以及什么是数据分析平台,再者为什么要做数据分析平台,数据来源,数据处理流程

一:项目开发流程 1.项目调研 了解项目的初始需求,然后结合市场的技术,看一下能否完成 2.需求分析 明确一个项目到底需要做什么? 最终做出的是什么样子? 重要性:一个好的需求分析能够明确项目的后续发展主题方向 3.方案设计 概要设计: 项目结构,技术选型 详细设计: 按照模块设计 4.编码实现 具体实现 5.测试 功能测试:功能是否达到了需求 集成测试:模块之间的兼容性 压力测试:高并发,多用户下,系统是否可以运行 用户测试:根据用户的建议进行修改 6.上线 试运行阶段:新系统与老系统同时在线

为什么需要数据可视化,如何用图表讲故事?【做数据分析的必看】

我们为什么数要数据可视化,如何用图表讲故事?# 大家经常需要做数据可视化,然后用PPT来说服高层或者做各类决策,今天分享一些做PPT的技巧! 温馨提示:用派代APP看的派友,请在有WIFI的网络下观看,图多会打开比较慢哦~ 先看个数据可视化视频: -------------------------------------------华丽丽的分割线--------------------------------------------- 一.  图表在沟通中扮演重要的角色 1. 主要角色(图下)

数据分析与BI的联系,BI是如何做数据分析的

BI就是数据分析吗?两者的关系是怎样的?BI是如何进行数据分析的?要知道,数据分析与BI并不是完全等同的关系.本文就来解读数据分析与BI. 一.名词解释 BI是Business Intelligence的英文缩写,即商务智能.广义上,BI是指商务智能的一套整体解决方案:狭义上,BI是指可视化BI 产品,例如FineBI. 数据分析(DA)是用适当的统计分析原理,在专业系统和软件的帮助下,检查数据集,以计算出它们包含的有用信息.大数据分析技术广泛应用于商业领域,支持组织做出更明智的业务决策. 二.

什么是php二次开发,怎么做php二次开发?

什么是php二次开发 所谓的二次开发,简单的说就是修改别人的东西,变成你想要的东西,插件基本属于高端了,根据现有的程序的不足,加以改进修饰,然后达到自己想要实现的功能和效果. 怎么做php二次开发 二次开发和一次开发不同的地方在于你是要先看懂别人的代码再去做,二次开发,首先你需要知道自己对什么程序进行二次开发,比如一些招聘信息上会写Discuz二次开发,ShopEX二次开发.这些都是对已经成型的程序进行的功能性扩展开发. 第一,你要有这个开 源 产 品的所用语言的语言基础,就是能看懂代码是最基本

offer选择:是做软件开发还是做数据分析?

题目:最近有两个offer,A是某取款机公司的软件开发岗,主要是做.NET,B是在一个小公司做数据分析.背景:A公司是合资,在北京,不算大,因为取款机系统不必要经常更新,所以工作相对稳定,B公司在数据分析也属于初级阶段,项目经理具有8年的数据分析经验,数据分析是时下比较热门的职业,自己也比较感兴趣.纠结点:A的工作不是很感兴趣,而且一般都说做软开的都要转行管理,我对管理也不感兴趣,工资在北京来说不算高,1W吧,但是工作一年后会比较稳定,有熟人在. B公司的数据分析我比较感兴趣,但是因为这是新兴的