数据新闻

第七章 数据新闻

伴随着大数据时代的到来和人类计算能力的提高,尤其是传统新闻行业面对互联网信息浪潮的冲击,数据新闻近年来已经成为全球新闻行业中最重要领域。数据新闻(data journalism)或数据驱动新闻(data-driven journalism)是计算传播学在新闻生产过程的应用,强调了运用各种计算方法从数据中寻找故事并进行数据叙事,具体过程包括确定数据新闻选题、获取和分析数据、可视化呈现。其中,数据尤其是开放数据(open data)是数据新闻存在的基础。缺乏数据支撑的数据新闻选题和可视化必然是空洞无力的。

数据新闻强调了批判思维、计算思维、可视化思维的三种能力的结合,对于新闻生产者提出了更高的要求,往往需要数据新闻编辑、程序员、设计师三者的密切合作才能完成。与精确新闻和计算机辅助报道相比,数据新闻对于数据挖掘和可视化呈现的要求更高。就目前的全球新闻传播学院的数据新闻教学而言,基于编程的数据获取、清洗、过滤、分析和挖掘相对薄弱。

一、 产生背景

数据新闻产生的根源在于新闻是一种社会知识,因而新闻传播并非简单的传播信息,更重要的是发掘和传播知识。经典的新闻生产和传播的基本逻辑是收集、编辑和传递信息。然而,当人类进入信息社会之后,尤其是伴随着数字媒体(互联网、手机)的发展,人类社会的信息规模爆炸式增长。与之相对,人们的注意力非常有限。因而赫伯特西蒙在1971年就指出:“随着信息的发展,有价值的不是信息,而是注意力。”

伴随着大数据时代的到来,这一危机迫在眉睫。公众对于规模巨大的碎片化信息缺乏理解,无法洞察数据的结构和隐藏的意思,无法捕捉到对他们有重要性和相关性的信息。解决这一问题的根源在于让新闻回归本质。诚如“数据新闻的创立者”、《华盛顿邮报》的软件开发人员阿德里安哈罗瓦提(Adrian Holovaty)所倡导的:新闻媒体应当“结束以叙述故事为核心的世界观”,通过计算机处理原始数据,为公众提供更重要、更有价值的报道,使之更深刻地理解世界。对此,英国记者亚当韦斯特布鲁克(Adam Westbrook)认为媒体应当“挖掘公众无暇处理的信息,核实信息,理清信息的内涵后将之发布给公众”。

方洁写道“在被信息淹没的时代,从‘信息传播’向‘知识传播’转型要求媒体不能仅做片段和碎片式的报道,更要挖掘信息背后的价值,赋予其正确的解释,使受众可以更富有成果的思考,从而让‘信息’升华为对受众更具参考价值的‘知识’。大数据背景下整个社会充斥着数据信息,如果没有媒体作为沟通的桥梁,公众就无法理解这些庞大、零散的信息到底有何意思。媒体有责任帮助公众进行信息的提纯和加工,采用科学的方法分析数据,从纷繁复杂的数据云中理出头绪和规律,告知公众这些数据对之意味着什么,与之有何联系。” 人类面临的最大挑战是如何应对即将到来的数据风暴。Albert Cairo在《The Functional Art》一书中强调需要从信息升华到智慧。人类认识世界的过程存在一个“数据-信息-知识-智慧金字塔”(DIKW pyramid),也被简称为“智慧金字塔”(wisdom pyramid),。 能够被感知或检测到的任何现象都可以称作信息,其中未被建构的信息代表社会现实。从未被建构的信息到建构后的信息需要经过一条数据鸿沟。数据是对观测现象的记录,实现了对现实的第一次编码,例如将一个人的年龄表达为具体的数字,例如1、2、3、13、25、37、44等。从数据过渡到建构后的信息则需要经过第二次编码,数据被表达为文字、表格、图形等形式,表达数据中隐藏的模式。传播者需要连接外部世界和受众,将为建构的信息通过数据分析得到建构后的信息。当受众感知和理解传播者建构后的信息的时候(受众解码),能够获得关于社会现实的新知识。当受众深入理解这些知识后将知识与个人的经验相结合,知识就可能升华为智慧。Wurman认为需要产生一个专门的职业—信息架构师—来帮助用户跨越数据与知识间的黑洞,在海量的未知与有限的已知之间的的缺口日益扩大的今天,帮助用户远离焦虑。

现在机器人新闻写作已经开始成为现实,未来的新闻是什么样子?伴随着人工智能和虚拟现实技术的发展,可以想象未来的人类可以在新闻发生的第一时间,借助于虚拟现实等技术“置身”与新闻现场,真切地感受到新闻事件的发生过程。对于社会事件的描述,机器可以比人类更快更好地实现。以传递信息为目标的新闻产业在未来的媒介环境下是无法生存的,因为信息传递的渠道越来越多,独家的信息越来越少。过去的人们要靠读报看电视获取信息,今天信息通过种方式涌入人的生活。因而,未来仍主要依赖信息传递为主的媒介将会消亡。媒介即信息成为对未来媒体的诅咒。

未来的媒介不能仅仅是信息,那么是什么呢?数据新闻给出的答案是“知识”和“艺术”。未来的新闻应当服务公众利益,不应当以娱乐核心,可以仰赖的生存方式就定位为发掘和传播知识,同时让公众在阅读新闻的过程中满足其艺术审美的需求。因此,数据新闻定位为从数据出发,挖掘知识,发现隐藏在海量信息中的价值;同时需要将信息以艺术的方式表达,彰显创意,吸引眼球。数据新闻相比与传统新闻的核心优势恰在于此。

另外,数据新闻崛起更直接的原因来自于新闻媒体的经营危机。数字化媒体的技术的浪潮在推动了新闻媒体的发展的同时,也带来了21世纪全球新闻产业的市场危机:面对互联网新闻和各种娱乐性信息的挑战,新闻产业如何盈利?如何将新闻网站的流量的变现?新闻产业的创新往往受到新闻产业危机的影响。例如,19世纪末美国报业的竞争非常激烈,为了赢得报业竞争诞生了黄色新闻的新闻报道方式。黄色新闻具有夸张、煽情、耸人听闻、捏造事实等特征,虽然实现了短期的盈利,但因为破坏了新闻的真实性原则,对新闻业造成沉重的打击。为改变黄色新闻对于美国新闻业的打击、恢复公众对于媒体的信任、增加媒体收入、传递有效的信息,以《纽约时报》为代表的报业选择了严肃新闻作为新闻产业的出路。从黄色新闻过渡到严肃新闻所确立的新闻生产的基本原则构成了西方新闻专业主义的主要元素。面对21世纪的新闻产业危机,数据新闻代表了一种重要的尝试,试图让新闻回到挖掘知识和传播知识的本质,试图通过可视化的力量来吸引受众的注意力。毫无疑问,数据新闻所代表的这种新闻变革也将重塑我们对于新闻专业主义的理解。

二、 理论源流

数据新闻的历史来源受益于新闻产业和新闻传播学研究的发展,同时更多地受到了社会科学、统计学、计算机科学、数据科学以及可视化技术的影响。跨学科的影响通过“精确新闻”(precision journalism)、“计算机辅助报道”(computer-assisted report)、新闻可视化、数据科学和开放数据运动等形式持续推动了数据新闻的发展。我们将数据新闻的历史源流概括为两条主要的脉络:第一条是计算驱动的新闻报道,集中体现了社会科学、统计学、计算机科学、数据科学等科学逻辑的影响,以精确新闻和计算机辅助报道为代表;第二条主要的脉络是可视化驱动的新闻报道,主要体现了可视化理论和技术的艺术设计思路。这两条脉络的逻辑交汇点在于通过数据讲故事,即数据叙事。

一、计算驱动的新闻报道

社会科学研究方法和统计学方法构成了数据新闻发展的较早的推动力,对数据新闻的影响集中体现在“精确新闻”提出和发展。精确新闻是由菲利普迈耶在20世纪60年代提出的,就是将社会科学的研究方法,比如抽样调查、内容分析、实验等方法引入到新闻报道当中,来实现资料收集、分析和新闻报道的思路。1967年,美国底特律市爆发了严重的种族暴乱。当时流行的观点认为骚乱的根源在于在美国南部长大的黑人无法融入美国北部的文化。为了验证这一假设,迈耶和他的同事采用随机抽样的方法,对种族暴乱地区的400多位黑人进行问卷调查。迈耶将数据导入电脑进行了统计分析,结果表明南方人骚乱参与率是8%,而北方人的骚乱参与率高达25%,因而参与骚乱的人多数在北方长大,否定了流行的错误观点。根据调查数据的分析结果,迈耶写了一系列的新闻报道,发表于《底特律自由报》,并将这种新闻报道方式称之为“精确新闻”。1968年,迈耶关于底特律骚乱的系列报道赢得了普利策新闻奖。1973年迈耶出版了《精确新闻》一书,奠定了精确新闻从实践到理论的基础。

精确新闻引起媒体的关注的一个重要原因来源于媒体开展民意调查的诉求,以远离对于政客和商业利益的过度依赖。尤其是20世纪80年代之后,媒体不再轻易相信政客给出的民意调查结果。民意调查依赖于科学的抽样理论和统计方法。媒体涉足抽样调查也就意味着新闻学汲取社会科学的研究方法,因而新闻学本身应当是一门科学,寻找事实的能力是新闻记者力量的源泉。精确新闻报道就是科学的新闻学。迈耶认为社会科学的研究方法可以帮助记者“击败经验猜测、无用行为以及过去的随意性的数据收集。科学方法仍然是人类创造出来的一种应对偏见、痴心妄想和感性忽略的好办法。新闻学缺失需要这些方法,现在比以往更需要,因为这些技能在努力保持着新闻的特性,以免成为娱乐和广告的变体。”。

需要指出的是,早期的新闻客观性要求新闻记者和编辑自身远离数据分析,处于一种被动无知的状态,保证新闻的客观性。而精确新闻则要求新闻记者和编辑自身具备研究能力,能够设计抽样调查方案并进行数据分析,因而超越了简单的客观性。理想的客观性被打破推动了新新闻学(new journalism)在20世纪60年代被提出,“这把记者从客观性的束缚中解放了出来,允许在新闻报道中增加艺术性的内容使其成为讲故事的人”。但是,新新闻学将新闻推向艺术,助长了编造新闻故事的不良风气,因而不是最适合的理论框架,迈耶依然主张采用科学作为新闻学的主要分析框架。

精确新闻的本质是了解如何处理数据。精确新闻对数据处理的流程包括数据收集、数据存储、数据检索、数据分析、数据清洗和最后的传播。这种对于精确新闻的描述方式与现在在数据新闻工作流程惊人的一致。虽然数据新闻的影响遍布全球,影响范围更大,但是数据新闻虽然继承了精确新闻对于社会科学研究方法和数据的高度重视。作为科学的新闻将理解和解释社会事实作为最重要的目标。

与精确新闻类似,计算机辅助报道是另外一个与数据新闻紧密相关的概念,主要是指采用计算机来帮助记者收集和处理信息。从二战之后计算机发明以来,新闻与计算机技术紧密地关联在一起。伴随着20世纪50年代的大型计算机的出现,计算机辅助报道主要用来处理政府数据;20世纪80年代之后,个人计算机开始逐渐普及和计算能力的提高,计算机辅助报道的领域拓展到商业等诸多领域;到而20世纪90年代之后,伴随着互联网的发展和普及,计算机辅助报道开始涉及利用互联网来辅助数据收集和分析。总体而言,计算机辅助报道经历的历史过程更加漫长,体现了新闻对于数字化技术的依赖。事实上,在1973年《精确新闻》一书出版给读者留下的第一印象是对于电脑的使用,美国计算机辅助报道学会每年都会颁发“菲利普·迈耶新闻奖”。例如,2017年的菲利普·迈耶新闻奖第一名颁发给了《芝加哥论坛报》关于美国药品安全缺口的报道《危险的剂量》(Dangerous Doses);ProPublica揭露破产保护政策中种族差异的报道获得第二名;巴伐利亚广播公司与《明镜周刊》关于德国房地产市场歧视外国人的报道获得三位。

无论多可靠的处方药,都可能因与其它药物搭配的方式对患者产生致命危险。但是,人们对于多数药物组合所能产生的不良效果并不清楚,是困扰科学家数十年的问题。《芝加哥论坛报》(Chicago Tribune)与哥伦比亚大学医学中心科研人员展开合作,运用大数据技术和复杂的算法分析食品与药物管理局的数据,查出引起心脏病征兆的药物投诉记录。然后,通过药物组合实验来逐一验证哪些药物确实会导致危险反应。此外,论坛报还派出15名记者拿着医生处方前往多个药房,看是否会被告知相关药物组合的潜在风险。伊利诺伊州很快公布了新的安全规定,在全国范围内的大型连锁药店也开始采取措施,这些举措有望挽救无数生命。聚焦于重大问题、将数据挖掘与实验、实地走访相结合是《危险的剂量》这一新闻报道的亮点。

二、可视化驱动的新闻报道

数据可视化是数据新闻的另外一条主要的历史源流。如果说数据驱动的新闻报道的思路体现了科学研究的逻辑的话,可视化驱动的新闻报道则体现了新闻报道对于视觉之美的追求。数据新闻就理论而言依然是一种传播形式,需要关注传播效果的问题,而可视化传播提供了一条理想的道路。视觉传播的首要目的是“作为协助我们的眼睛和大脑发掘现象背后隐藏信息的一种工具”。

数据可视化是一种高效的信息传播方式,可以利用很小的视觉空间实现最小的视线移动和鼠标滚动,并达到展示一组数据的目的。比如,1950年以来的标准普尔500指数(S&P500)、纳斯达克指数、道琼斯工业指数的三组时间序列,其中包含了超过8万个数据点,可以通过一张简单的时间序列图直接展示出来。读者可以轻松地了解股票价格的长期的起落走势、三种指数之间的关联和差异等信息。但如果读者面对一张超过8万个原始数据点的表格,很难直接从整体层面感知数据所传递的信息。从受众的角度来讲,数据可视化之所以有效,主要归功于人类高效的模式识别和趋势发现的能力。人类这种强大的模式识别能力来源于人类的进化过程。当原始人类看到草丛中的狮子后,可以在几分之一秒内逃跑。一个具有清晰模式的图像往往具有很强的局部特征(locality),比如构成狮子眼睛的像素局部内具有强关联,而构成眼睛部分的像素与狮子身体其它部分或自然环境的像素之间的关联很低。人类的神经网络可以较好地捕捉这种局部特征,实现快速的模式识别。但是人类执行高效视觉搜索的过程通常只能保持几分钟。图形化的符号可将用户注意力引导到重要的目标,高效地传递信息。

一个展现数据可视化传播效果的案例来自于南丁格尔玫瑰图的故事。1853年,奥斯曼帝国与俄国爆发克里米亚战争,次年3月英法两国为援助奥斯曼帝国向俄罗斯宣战。克里米亚战争一直持续到1956年2月,参战人数超过165万,其中90万人死亡。英国军队因为缺乏医护人员、卫生条件恶劣、供给稀缺,伤员死亡率高达42%。弗罗伦斯·南丁格尔(Florence Nightingale)在结束了护理伦敦霍乱患者的工作后,于1854年10月21日和38位护士到克里米亚半岛援助。她分析了堆积如山的军事档案,指出在克里米亚战役中,英军死亡的原因是在战场外感染疾病,及在战场上受伤后没有适当的护理而伤重致死,真正死在战场上的人反而不多。她立即给请前线指挥官致函英国政府,改善前线卫生情况,做好食品和药品保障。但因为前线指挥官发给英国政府的文件过于冗长,充满医学术语,一直没有得到批复。南丁格尔决定自己亲自动手,为了让人更容易发现重点,她绘制了著名的“东部军队死亡原因图”(见图7-1)。南丁格尔玫瑰图以饼状图为基础,采用极坐标将图形均分为12份(12个玫瑰花瓣)用来代表12个月,每一个玫瑰花瓣的半径代表总的死亡人数。其中,三种颜色代表三种死亡原因:蓝色代表感染可以预防或者并不严重的疾病,红色代表负伤,黑色代表其它原因。南丁格尔玫瑰图图一目了然地描述了造成士兵死亡的主要原因是本可治愈的疾病。因为南丁格尔的可视化效果非常好,她建议的军队医疗卫生改革很快得到批准。在军队进行卫生改革后,从1955年四月以后非必要死亡大幅下降。


图7-1 东部军队死亡原因图

x1 x2 x3 x4 y1 y2 y3 y4 10 10 10 8 8.04 9.14 7.46 6.58 8 8 8 8 6.95 8.14 6.77 5.76 13 13 13 8 7.58 8.74 12.74 7.71 9 9 9 8 8.81 8.77 7.11 8.84 11 11 11 8 8.33 9.26 7.81 8.47 14 14 14 8 9.96 8.1 8.84 7.04 6 6 6 8 7.24 6.13 6.08 5.25 4 4 4 19 4.26 3.1 5.39 12.5 12 12 12 8 10.84 9.13 8.15 5.56 7 7 7 8 4.82 7.26 6.42 7.91 5 5 5 8 5.68 4.74 5.73 6.89

表7-1安斯库姆数据

数据可视化对于统计分析而言同样非常重要。安斯库姆数据(Anscombe dataset),又被称之为安斯库姆四重奏(Anscombe’s quartet),通常被用来说明数据可视化对统计分析的重要性。这个数据在R软件的基础库里就可以找到,这个数据包含了四个数据,每一个数据都有11个(x, y)数据点,如表7-1所示。我们做简单的统计分析会发现这四组数据中,x值的平均数都是9.0,y值的平均数都是7.5,x值的方差都是10.0,y值的方差都是3.75。此外,它们的相关系数都是0.816,线性回归方程都可以表达为y=3+0.5x。也就是说单从这些统计数字上看来,四组数据所反映出的实际情况非常相近,而事实上,这四组数据有着天壤之别。采用R语言中的ggplot2软件包可以非常容易地可视化安斯库姆这四组数据。如图7-2所示,安斯库姆A数据中的x和y之间具有较好的线性关系;而B数据中的x和y则具有明显的非线性关系;在C数据中存在一个明显的异常值,剔除这个异常值之后相关系数将会明显低于0.816;最后,D数据则是一个更极端的例子,其异常值导致了平均数、方差、相关度、线性回归线等所有统计量全部发生偏差。四重奏仍然经常被用来说明在根据特定类型的关系进行分析之前, 必须以图表形式进行数据可视化的重要性, 以及描述现实数据集的基本统计量(如均值、方差、相关系数、简单线性回归)不足。

图7-2安斯库姆数据可视化

作为视觉传播的可视化建构了受众阅读的文本,这种文本如同其他的传播内容一样,也具有自身的框架;受众作为观察者花费时间来理解图像传达的信息,通过与图像文本互动而产生了对于信息的理解。因为文本本身就已经有了叙事框架,就有可能偏离社会真实情况,因而任何数据可视化都可能是有偏见的。用现代数据可视化先驱Edward R. Tufte的话来说,“毫无疑问一些图像的确会曲解其背后的数据,使得观看的人无法了解真相”。因而,可以评估数据可视化在多大程度上与真实情况存在差别,并计算一个可视化作品的撒谎因子。按照塔夫特的定义,撒谎因子 = 图像中呈现的效果值/数据中的效果值。例如,某中等城市房价由2015年的5000元每平米增长到2017年10000米每平米,数据中的房价增幅为(10000-5000)/5000 = 100%。假设数据可视化通过图像中的房子高度来表示房价大小,2015年图像中的房子高度为5cm, 2017年房子高度为15cm,那么图像中呈现的增幅为(15-5)/ 5 = 200%。这样一个数据可视化的撒谎因子 = 200%/100% = 2。当数据可视化偏离数据驱动的方向,充满过多的随意性的时候,就很容易违反“图像诚实”(Graphic integrity)的基本原则。

数据可视化可以分为探索性可视化和解释性可视化。探索性可视化主要应用于数据分析阶段,数据分析研究人员通过可视化手段快速发现数据中的信号、特征、模式、趋势、异常;解释性可视化则主要存在于视觉呈现阶段,传播者采用可视化工具和手段将已经发现的知识传递给公众。优秀的可视化(优图, graphical excellence)致力于使用有限的空间清晰、准确、高效地传播复杂的想法。更进一步,塔夫特提出好的可视化应该做的九个方面的事情:1. 展现数据;2. 引导读者思考数据;3. 避免歪曲数据所表达的内容;4. 使用有限的空间展现尽量多的数字;5. 保持大数据集的一致性;6. 鼓励眼睛比较数据中的不同部分;7. 从整体到精细结构,从多个层面展示数据;8. 服务于一个明确的目的(描述、探索、解释、装饰);9. 数据可视化要结合对于数据的统计描述和文字描述。

数据可视化对于理解复杂的时空结构和变化过程具有重要的作用。查尔斯约瑟夫密纳德的可视化作品“拿破仑在1812年俄罗斯战役中的灾难性损失”是一个典型的代表。如图7-3所示,它采用流地图的形式(后来称之为“桑基图”)巧妙地展现了拿破仑在1812年入侵俄罗斯战争中进军和撤退过程中的军队规模,以及他们返回时的温度(零下30度)。 这张图表显示42万2000人与拿破仑一起穿越纳曼河。其中有2万2千人负责在战役初期进攻北方,其中6000人从最初佯中幸存下来。剩下的40万人分兵两路继续前进,一路兵员锐减,只有10万人幸存下来并从莫斯科返回。但这10万人从莫斯科返回的过程中遭遇了持续下降的温度,只有4000人幸存下来;加上佯攻北方幸存的6000人,最后只有1万人安全返回。在有限的空间中,密纳德展示了六个维度的数据:拿破仑军队规模、进军距离、温度、经纬度、进军方向、特定日期所对应的地点。其中,温度和特定日期在地图下方展示,地图和温度之间通过特地的日期连接起来。


图7-3拿破仑1812年在俄罗斯战役中的灾难性损失

采用数据可视化展现空间结构的另外一个经典的例子来自于约翰斯诺(John Snow)所绘制的伦敦布罗德街街霍乱地图。19世纪中叶,伦敦多次爆发霍乱,大量的穷人因此死亡,但人们找不到疫情的源头。其中比较流行的理论是“瘴气致病论”,即认为城市的污水池中的人畜粪便腐烂产生恶臭,经由空气扩散传播被人吸入呼吸系统是造成霍乱的源头。通过研究患者的症状,斯诺发现,大多数患者的第一症状是恶心呕吐,即消化道出现问题。斯诺由此判断霍乱是在饮食被污染的食物或水之后被感染的,即“污水致病论”。1849年8月,斯诺自费出版了一本小册子《论霍乱的传播模式》,提出霍乱是一种由毒素引起的传染性疾病,主要的传播途径就是被这种毒素污染的水。1854年8月,伦敦苏活区的布罗德街再次爆发霍乱,这是伦敦历史上最严重的疫情之一。不到两个星期,就有五百多人死亡,很多人逃离了这个地区。为了证明自己的观点,斯诺跟踪调查了这一次的疫情。他绘制了这次霍乱的地图,在图中标出了13处公共水井和578例霍乱死亡案例的地点。由该地图可以看到霍乱围绕着布罗德街的一个浅水井。斯诺经过走访发现,83%的死者习惯于使用压水井喝布罗德街水井里的水(见图7-4)。同时,斯诺采用显微镜观察了从布罗德街水泵汲取的水样,发现微小的白色絮状凝固例子。但囿于当时的技术条件,并不能确定这就是致病菌。通过进一步调查,斯诺发现有些住户无人死亡。原来这些人都在剑桥街7号的酒馆里打工,酒馆为他们提供免费啤酒喝,因此他们没有喝从水泵抽上来的水。斯诺还发现距布劳得街水泵不远的波兰街济贫院共有530多名贫民,但只有5例霍乱死亡病例,原因就在于济贫院有自己的水井,饮水不需要从水泵中取水。最有说服力的证据来自于一个居住地距离布罗德街很远而孤立的霍乱病例苏珊娜艾莉(Susannah Eley)。艾莉喜欢喝布罗德街水井中的水,虽然她离开了布罗德街,但依然饮用那里的水。她在喝下8月31日送去水后于9月2日去世。一系列的证据指向公共水井受到污染是造成霍乱爆发的主要原因。根据这些证据,斯诺成功说服当地市政将压水井的手柄卸掉,缓解了疫情。约翰斯诺因此被认为是现代流行病学和公共卫生医学的奠基人之一。


图7-4 采用热力图的方式重新绘制的1854年伦敦霍乱地图

综上,我们介绍了数据新闻的两大理论脉络。需要指出的是这两者之间并非泾渭分明、毫无联系的,比如运用可视化进行数据分析的作品也被称之为统计图(statistical graphics)。密纳德的“拿破仑1812年在俄罗斯战役中的灾难性损失图”、斯诺的“伦敦霍乱地图”和南丁格尔的“东部军队死亡原因图”是统计图的经典案例。在密纳德、斯诺和南丁格尔构思其可视化作品的时候,都借助了统计学的工具和方法。例如密纳德试图捕捉温度下降和兵员锐减之间的相关关系,斯诺和南丁格尔都采用实地走访调查的方法,南丁格尔还分析了大量的医疗档案。将新闻选题、计算、可视化三者相结合构成了数据新闻的基本工作流程。

三、 制作流程

从数据新闻的生产过程来看,一般由四个步骤组成:第一步,确定数据新闻选题;第二步,数据的收集和整理;第三步,数据的分析和解读;第四步,数据新闻写作与可视化呈现。数据新闻生产的核心是数据驱动。这有两方面的原因构成:一、重大新闻选题需要有高质量数据的支撑才能够更好地实现。“巧妇难为无米之炊”,没有数据或者数据缺失某一个关键维度的信息都会导致无法完成该选题;二、有一部分数据新闻(尤其是探索性的数据新闻)的选题是在探索数据的过程中逐步产生的。因此,数据新闻生产过程并非一个简单的线性进行的过程。基于数据新闻的类型差异,所选择的具体制作流程也会有差异。因此,数据新闻生产流程更应当被看成是一种网络,即任意两个步骤之间都存在前馈和反馈的关系。

图7-5 数据新闻生产过程

米尔科劳伦斯将数据驱动的数据新闻生产看作一个数据价值提升的过程,它从数据开始,经过过滤与可视化后,最终形成故事。从数据价值的角度来看,原始数据杂乱无章,很少有读者会愿意逐条读取每一项干巴巴的原始数据(data);经过清洗(过滤)(filter)之后的数据,虽然变得有序,但仍停留在了表象层面;经过可视化(visualize)的处理,读者可以简单了解到数据背后的模式和不同影响因素之间的关联,可是依然无法明白整个故事的前因后果;只有到最后成文的数据可视化报道(story)才能最大化数据的价值,使读者最终了解事实背后的机制。经过这一过程,数据对公众的价值提升。

英国记者保罗布拉德肖(Paul Bradshaw)在其博客中依照传统的新闻叙事结构“倒金字塔”提出了数据新闻的金字塔架构。第一,数据新闻的生产是一个倒金字塔,从汇编(compile)问题和数据开始,然后进入到清理数据(clean)开始,同时需要理解社会情境(context),最终组合成文(combine)。第二,数据新闻的传播(communicate)过程是读者阅览数据可视化报道时的正金字塔结构,这是读者获取到数据新闻价值的过程,这和劳伦斯总结的数据新闻生产环节对公众的价值提升的过程是一致的。数据通过可视化(visualize)形成的新闻叙事(narrate)后,在各个平台发布实现社交化(socialize),这体现了人性化(humanize)需求,之后按照读者个人(personalise)的兴趣和需求加以应用(utilize)。数据新闻通过在社会中的传播来影响社会政策和个体决策,因而制约数据新闻扩散过程的可视化、叙事、社交化、人性化、个性化和应用化值得在数据新闻生产过程中就受到更多重视。

布拉德肖认为数据新闻生产开始于一个汇编问题和数据的过程,即一个数据新闻选题往往具有一个新闻选题,需要一个数据来支撑其想法,或者从一个数据出发,需要找到其中值得分析的问题。只有将新闻选题和数据“汇编”到一起,才能具备完成数据新闻产品的基本条件。另外,布拉德肖强调了数据新闻在传播过程中的基本机制,尤其是可视化对于启动传播过程的价值。

英国《卫报》“数据博客”前主编西蒙罗杰斯则更加强调开放数据在数据新闻生产过程中的作用,他认为数据新闻工作流程分为四步:分享数据、清洗数据、分析数据、呈现数据。首先,从突发新闻报道、政府数据、记者的调查等各种途径获取数据;然后,开始研究可以用这些数据做些什么,尤其是否需要增加新的数据,如何更好地展现变化;之后需要认真清理这些数据;接着,就可以对数据进行计算,看看是否存在一个故事在里面,并且反复检查可能存在的为问题;最后是输出,比如分享原始数据、讲一个故事、做一个可视化。“数据博客”所报道的很多数据新闻作品都提供原始数据。

对于数据可视化为主的数据新闻生产而言,会更加强调可视化的设计过程。例如信息图的设计同样由设计师、编辑、数据分析师三方协同完成,共分为十步。第一步,由编辑和设计师一起选择一个主题;第二步,由编辑开展调查和研究;第三步,由编辑和设计师一起搜集数据;第四步,由编辑、设计师和数据分析师一起分析数据;第五步,由三方一起选择表现形式;第六步,由设计师绘制创意草图;第七步,由三方一起修改编辑;第八步,由设计师完成设计;第九步,由三方进行检查;第十步,最终完成。


图7-6 信息图设计过程

接下来我们来介绍一些案例,帮助我们理解数据新闻的制作过程。第一个案例来自于汉斯罗斯林(Hans Rosling)和他所创建的Gapminder。在过去的六七十年里,我们所身处的世界已经发生巨大的变化,但我们对于世界的理解依然停留在西方国家(发达国家)和第三世界(发展中国家)的二元对立的划分方法。罗斯林从世界银行、联合国等众多来源系统地收集了全世界各个国家的数据,他感兴趣的是一些衡量国家发展水平的变量,例如生育数量和人均寿命的关系。更重要的是,他希望可以引入时间作为新的维度,衡量国家发展水平随着时间的变化。采用Gapminder软件,罗斯林非常生动且有说服力地说明了世界的发展变化。在十九世纪初,全世界各个国家之间的发展水平差距并不大(见图7-7)。比如在1800年,日本的生育数量略大于4,英国为5,中国为5.5,美国为7。。伴随着现代化的发展,在1960年代,世界基本上可以划分为两个阵营。与第三世界国家相比,西方国家的确在人口寿命上更长,剩余数量更少(见图7-8),例如日本的生育数量下降到2,英国下降到2.6,美国下降到3.7,日本、英国和美国的人均寿命在70岁左右;但在过去的60多年里,第三世界国家开始向西方国家的方向移动,生育数量大幅度降低,人均寿命大幅度提高,形成了一个连续变化的谱系(见图7-7),例如,此时中国的生育数量已经接近1,人均寿命超过75岁。罗斯林从一个让自己感到困惑的数据出发,系统地收集数据,采用创新的动态可视化方法,讲述了数据背后的国家发展的故事。此外,罗斯林还是一个非常优秀的传播者,从2006年到2014年9年间,他在TED做了十次演讲,取得了前所未有的成功。更重要的是,他将所收集的丰富的国家数据和Gapminder软件在Gapminder网站上对公众开放,感兴趣的同学可以下载这些数据和Gapminder软件的线下版本练习。

图7-7 世界各国女性生育数量与人均寿命(1800年)

图7-8 世界各国女性生育数量与人均寿命(1960年)

图7-9 世界各国女性生育数量与人均寿命(2015年)

另外一个例子来自于美国数据新闻调查网站ProPublica所做的题为“金钱医生”(Dollar for Docs)的数据新闻产品。自2009年以来, 17家制药公司及其附属机构披露了 ProPublica 的 Docs 美元数据库, 其中包含了大约40亿美元给医生、其他医疗服务提供商和医疗保健机构。ProPublica定位关注有关公众利益的重要社会问题,因而其数据新闻选题具有重要的意义;ProPublica使用这些数据建立了一个数据库,用户可以输入医生的姓名进行查询,每个人都可以查询自己的医生是否收受来自制药公司的贿赂,因而其选题具有很高的贴近性。2009年至2012年的数据由 ProPublica 收集,2013年的大部分数据是由 Obsidian HDS 公司提供。2009年至2012年早期的数据是由17家医药公司在各自的网站上发布的。因为数据的格式不统一,往往也不提供开放下载。ProPublica被迫采用计算机编程的方法抓取这些数据。例如,通过编写计算机程序,ProPublica从辉瑞制药公司网页下载了4800多条记录。

图7-10 ProPublica建立的“金钱医生”数据库(2013-2015)

ProPublica的报道产生了深远的社会影响,发表了大量的新闻报道,推动了《医生付费阳光法案》(The Physician Payment Sunshine Act)的出台。根据这一法案,制药和医疗设备公司公开支付医生10美元以上的信息将在政府网站上公布; 第一份报告将涵盖2013年8月至12月期间。得益于该法案,2016年,ProPublica更新了Dollar for Docs的数据,使之涵盖了从2013年8月到2015年12月两年多的时间,涉及1866家医疗行业的公司、近625亿美元、超过80万名医生和1171家医院。数据显示,2013至2015年,医疗公司每年向618,000名医生支付大约20亿美元的总支出, 此外还有每年6亿美元用于教学医院。 一般付款包括促销演讲、咨询、餐饮、旅游、礼品和版税, 但不包括研究费用。从2014年到2015年, 收到付款的特定医生发生了很大的变化; 在2015年收到付款的医生中有四分之一在2014年没有收到付款, 反之亦然。从医药公司获得报酬的医生往往比那些没有收到贿赂的医生开出更多的品牌药物。上千家医药公司的贿赂数据来自于美国医疗保险和医疗补助服务中心的“开放支付数据”。其中2016年的数据已经更新,感兴趣的同学可以下载该数据并进行分析。在较早的版本中,ProPublica也曾报道过关于17家医药公司付款情况的调查。虽然这些公司的市场份额超过50%,但是这些数据可能并不能完全代表整个行业。通过早期报道制药公司和医疗器械公司为医生支付的资金的情况,ProPublica推动了整个行业的透明化,并反过来是的进一步的数据新闻报道更加系统和全面。

最后,我们来看一下英国《卫报》关于伦敦骚乱的数据新闻报道。2011年的伦敦骚乱开始于8月4日,伦敦北部托特纳姆区29岁的黑人男青年马克达根因非法持有枪械被警察击毙。他的家人于8月6日举行和平抗议,要求警方公布案情详细信息。后来,和平抗议演变为持续五天时间的骚乱,在10个警察下去内发生了超过5000件与骚乱相关的犯罪事件,共有1984人被审讯。然而,人们对于引起骚乱的根本的社会原因并不清楚。首相大卫卡梅伦和保守政客认为政客认为劫掠者都是惯犯,与贫困无关,他们转而责备社交媒体是引起骚乱的渊薮,因为参与骚乱者有可能通过社交媒体组织活动,因而建议暂时关闭社交媒体。对于导致骚乱的原因一直没有定论。为了更好地解读骚乱,《卫报》与伦敦政治经济学院合作,采用定性研究与定量分析相结合的方式,了解人们对于骚乱的看法和背后的动机。第一个阶段,共采访了270名承认参加过骚乱的人,分析了推特上257万条关于伦敦骚乱的信息;第二个阶段,采访了130名警察、40名骚乱受害者、75名律师和皇家检察署工作人员。

参与骚乱者将导致骚乱的原因归因为贫穷(86%)、警察暴行(85%)、政府政策(80%)等原因,而《卫报》ICM调查的一般受众认为犯罪(86%)、家教缺失(86%)、道德水准下降(82%),形成鲜明对比。这进一步说明社会对于骚乱的认识并不同意,有可能存在严重的偏见。与政客的意见相反,数据表明贫穷是导致骚乱的重要原因。内政部的数据表明法庭上的被告大多来自贫穷的群体。其中35%的成年人在申请失业救济,42%的年轻人在学校享用免费伙食。将参与骚乱者的居住地与多重社会剥夺指数在地图上相互叠加,进一步证实参与骚乱者多来自于贫困地区。就教育程度而言,参与骚乱者的教育程度不高,获得大学学位的人很少,其中44%的还在上学。同时,居住地和骚乱地点具有一段距离,因而多为“流窜”作案。《卫报》的调查发现63%的人有前科(受到过警告或惩罚),超过70%的人被逮捕过。这与司法部的数据一致。因而,骚乱参与者确为“有前科的社会底层”。

种族问题再一次成为媒体关注的热点。司法部记录的因骚乱出庭的被告人中黑人占43%,亚裔为7%,白人为33%,基本与人口中的种族比例一致。其中,曼彻斯特等地的骚乱参与者主要是白人。因而没有理由种族是主要的原因。针对推特上关于伦敦骚乱的分析发现谣言具有一个完整的生成、扩散、消亡的过程,社交媒体具有一定的自我澄清机制,随着时间演化谣言很快湮灭。另一方面,反对骚乱者也通过社交媒体组织清扫街道行动。

四、 实战练习

一、维基解密阿富汗战争日志

我们从一些具体的案例来练习数据新闻的制作流程。第一个案例来自于《卫报》关于维基解密阿富汗战争日志的报道。维基解密向《卫报》提供了阿富汗战争日志数据、伊拉克战争日志数据和美国大使馆密电丑闻数据。这些数据均来自美国军方重大行动数据库(SIGACTS)。《卫报》的调查新闻报道团队对于这个数据感到抓狂,它共有92201行数据,对于习惯于处理小规模数据的人而言,这是一个不小的挑战。为了让专业的记者团队可以更好地挖掘数据提炼新闻选题,《卫报》还和《纽约时报》、《明镜周刊》共享了维基解密“阿富汗战争日志数据”,希望通过数据分析,全景展现战争的真实情况。

为了更好的检索数据,《卫报》的开发团队建设了一个简单的内部数据库,提供在线检索服务。这样,记者就可以根据关键词和事件主题在数据库中进行搜索。为了系统地分析这些数据,开发团队还进行了大量的数据清洗,优化数据结构,将每个事件从时间、日期、概述、伤亡人数、经纬度等变量进行描述。

从2004年到2009年,阿富汗战争期间发生了大量的爆炸和伏击事件。维基解密数据记录了7500条临时爆炸装置(Improvised Explosive Device, IED)爆炸或伏击事件,另外还有8000个发现炸弹后拆弹的记录。根据这些数据,《卫报》做了题为“近六年发生的临时爆炸装置袭击”的数据新闻报道,试图去分析这些爆炸有什么变化、相互之间有什么区别,并分享了这部分临时爆炸装置袭击数据, 。我们使用这些公开的数据,来复现《卫报》的数据分析。

我们主张采用开源的编程工具(比如python)来完成数据获取、清洗、分析和初步的可视化,互动可视化可以采用ECharts或D3.js来完成,信息图和其它平面设计则可以通过Adobe illustrator等工具来完成。其中,Python是一个非常好的数据科学编程工具,伴随着数据科学和深度学习技术的普及,Python社区不断发展。Python是一种面向对象的、解释型的程序设计脚本语言。它的语法简洁而清晰,具有非常强大的标准库和丰富的第三方模块,是TIOBE编程语言排行榜中的“2010年度编程语言”。2017年2月,python正式迁移到GitHub维护,成为2017年最流行编程语言(2016年排名第三),在2017年8月数据挖掘资讯网站KDnuggets做的一项调查显示Python超过R,成为数据科学和机器学习最常用语言。

采用Anaconda可以非常方便地安装Python软件,推荐安装3.0以上版本。Anaconda集成了jupyter notebook、numpy、scipy、pandas、sklearn等众多的工具。其中jupyter notebook使得用户可以在网页端互动式地编写Python语言,运行结果会被很好地保存下来,便于理解、交流和传播,提高了编程的可复制性。安装anaconda后,打开电脑的终端,输入jupyter notebook,就会进入到jupyter notebook的编程界面。

首先,导入需要的工具包,包括matplotlib、seaborn、pandas。

%matplotlib inline import matplotlib.pyplot as plt

   import numpy as np

import pandas as pd import seaborn as sns

然后,就可以读入数据。我们使用Pandas来读入ExplodedIED.xls这个Excel数据。原始数据可以从《卫报》下载;为方便使用,大家可以直接从下面代码中给出的百度盘下载。我将数据和jupyter notebook文件放在同一个路电脑文件夹中,就不需要再指明文件在具体的哪一个路径下面。我们使用pandas中的read_excel命令就可以很好地读入数据。读入数据后,就可以使用head命令来查看数据的样式。使用len命令可以很方便地查看数据的行数(7527)。
    # download the data from https://pan.baidu.com/s/1jKjBXOy

df = pd.read_excel('ExplodedIED.xls') df.head() len(df) df.columns

使用columns命令,就可以查看所有的列的名字(变量名)。包括以下各列:'ReportKey', 'DateOccurred', 'Type', 'Category', 'TrackingNumber', 'Title', 'Summary', 'Region', 'AttackOn', 'ComplexAttack', 'ReportingUnit', 'UnitName', 'TypeOfUnit', 'FriendlyWIA', 'FriendlyKIA', 'HostNationWIA', 'HostNationKIA', 'CivilianWIA', 'CivilianKIA', 'EnemyWIA', 'EnemyKIA', 'EnemyDetained', 'MGRS', 'Latitude', 'Longitude', 'OriginatorGroup', 'UpdatedByGroup', 'CCIR', 'Sigact', 'Affiliation', 'DColor'。 接下来就进入到数据清洗的环节。我们可以看到DateOccurred代表袭击事件发生的时间,包括了年月日小时分钟秒的信息,比如“2004-01-06 00:00:00”。我们在统计事件发生的时间的时候,只需要月份级别的时间颗粒度就可以了。因此,我们构造了一个新的变量叫做time, time的每个元素来自于DateOccurred,但是只取其年份和月份的信息,日期的信息统一修改为“01”。另外,需要注意的是,这个数据里的时间有少量的错误,我们将其替换为缺失值。此处的缺失值使用numpy库中的nan命令来表示。最后,我们需要使用pandas中的to_datetime命令将time由字符串格式更改为日期格式。类似的逻辑,我们可以构造一个名为year的变量,用来表示袭击事件是在哪一年发生的。

df['time'] = [str(i)[:8]+'01' for i in df.DateOccurred] df['time'] = [i if '200' in i else np.nan for i in df.time ] df['time'] = pd.to_datetime(df.time, format = '%Y-%m-%d') df['year'] = [str(i)[:4] for i in df.DateOccurred] df['year'] = [int(i) if '200' in i else np.nan for i in df.year] df = df.dropna(subset = ['Latitude','Longitude'])

   接下来,就可以对数据进行分析和可视化。我们从分析袭击事件发生的地点开始。在df数据集当中,Region表示事件发生的方位,共南部(SOUTH)、东部(EAST)、北部(NORTH)、西部(WEST)、首都(CAPITAL)和未知(UNKNOWN)六种情况,使用pandas中的value_count可以计算每一个方位有多少袭击事件。具体命令为:df.Region.value_counts()。结果表明南部地区(N = 3644)和东部(N = 2869)地区最多,其它地区较少,西部、北部、首都地区各有356、253、215件袭击事件,此外还有9个缺失地区信息的袭击事件。我们也如同卫报一样采用饼状图对事件进行可视化。Pandas基于matplotlib提供了更加定制化的可视化功能。

plt.figure(figsize = (8, 8)) explode = (0.1, 0.1, 0.2, 0.1, 0.2, 0.3) df.Region.value_counts().plot(kind='pie', explode = explode,

       autopct='%0.1f%%',
       pctdistance=0.5, shadow=True)

plt.show()

   其中,matplotlib.pyplot为python数据可视化提供了最为基础的工具。例如,通过figure函数可以定义所绘制图形的基本属性,例如图片的大小在这个例子里被指定为figsize = (5, 5)。我们将df.Region.value_counts()所输出的结果采用plot函数绘制出来,指定图片的类型(kind)为饼状图(pie)。设置饼状图每个部分偏离圆心的比例(explode)分别为0.1、0.1、0.2、0.1、0.2、0.3;设置每一个部分的比例(autopct)精确到小数点后1位数;设置每部分比例的文字距离圆心的位置(pctdistance)在半径的0.5处;此外还可使指定绘制出来每一个部分的阴影(shadow)。


图7-11 阿富汗战争中袭击事件所在区域的饼状图

在阿富汗战争IED袭击数据中另外一个非常值得挖掘的信息是爆炸和袭击事件随着时间的变化。如同统计事件发生地区的数量一样,此处我们依然使用value_count命令来对df.time变量进行处理;然后,使用plot命令就绘制出来。当然了,这里我们需要把图表类型设置为线型图(kind = ‘line’)。我们从数据中可以发现在2009年8月,袭击事件的数量最多,这是以为2009年8月20日是阿富汗总统选举,因此其前后的袭击事件最多。我们需要使用idxmax命令来提取df.time.value_counts()取值为最大值ymax时的x轴取值xmax。然后,就可以使用matplotlib中的vlines函数来绘制一条红色的线来标示出袭击事件最多的时间。我们进一步使用matplotlib中的annotate来注释一下导致这一个峰值的原因为8月的阿富汗总统选举,见图7-12。

df.time.value_counts().plot(kind = 'line', figsize = (15, 5)) xmax = df.time.value_counts().idxmax() ymax = df.time.value_counts().max() plt.vlines(x=xmax, ymin = 0, ymax = ymax, color='r') plt.annotate('The presidential election \n 2018 Aug 20',

            xytext=(pd.Timestamp('2007-06-01 00:00:00'), ymax),
            xy=(xmax, ymax),
           arrowprops=dict(facecolor='green', shrink=0.05),
           fontsize = 20)

plt.show()


图7-12 阿富汗战争中袭击事件的时间序列图

对于袭击事件发生地区的分析告诉我们空间分布的不均匀性,对于袭击事件的时间序列分析同样揭示了在时间上同样存在不均匀的特性。接下来我们就尝试将每一年的袭击事件通过地图的形式进行更为具体的分析。我们将使用到的一个主要的工具是geopandas。这个工具需要通过pip install geopandas代码在电脑终端中进行安装。 我们绘制袭击事件发生地点的基本逻辑如下:首先,我们需要阿富汗这个国家的形状数据country来作为绘图的背景;然后,我们需要袭击事件发生地点数据places。最后,将袭击地点places覆盖到国家背景上去就可以得到需要的可视化效果。 我们从人类冲突实证研究项目网站(The Empirical Studies of Conflict Project, ESOC)下载所需要的阿富汗国家形状文件(shapefile)。此处,使用的是阿富汗398个区的形状文件。然后,就可以通过geopandas的GeoDataFrame下的子命令from_file来读取这个形状数据,将其命名为country。类似于pandas集成了matplotlib的绘图功能,geopandas同样做了类似的优化,因此使用geopandas绘图同样非常简单,只需要使用plot函数就可以根据country绘制出国家背景图片,如图7-13所示。

  1. Read file using gpd.read_file()

import geopandas as gpd country = gpd.GeoDataFrame.from_file('afghanistan_district398.shp') country.plot(figsize = (15, 15), color = 'grey') plt.show()



图7-13 阿富汗国家398个区的可视化 def plot_points_on_shapefile(year, ax):

   from shapely.geometry import Point
   import geopandas as gpd
   country = gpd.GeoDataFrame.from_file('afghanistan_district398.shp')
   # Create a DataFrame with some cities, including their location
   places = df'TrackingNumber', 'Latitude', 'Longitude', 'year'[df.year == year]
   # Create the geometry column from the coordinates
   # Remember that longitude is east-west (i.e. X) and latitude is north-south (i.e. Y)
   places["geometry"] = places.apply(lambda row: Point(row["Longitude"], row["Latitude"]), axis=1)
   del(places["Latitude"], places["Longitude"], places["year"] )
   # Convert to a GeoDataFrame
   places = gpd.GeoDataFrame(places, geometry="geometry")
   ## Declare the coordinate system for the places GeoDataFrame
   # GeoPandas doesn't do any transformations automatically
   # CRS (WGS84) transformation is needed.
   places.crs = {"init": "epsg:4326"}
   country.crs = {"init": "epsg:4326"}
   ## Perform the spatial join
   country.plot(ax=ax, color="#cccccc")
   places.plot(ax=ax, markersize=5, color="#cc0000")
   plt.axis('off')
   plt.title(str(year))

接下来,我们将按年提取每一年所需用到的经纬度数据为places。然后在places这个数据框中增加米归纳为geometry的一列数据,它的取值形式为POINT (64.46125793 32.41791916),其中POINT表示这是这是空间中的一个点,64.46125793为维度,32.41791916为经度。为了要得到这样格式的一列数,我们需要用到shapely工具包中的子命令Point,同时也用到了apply语句和lambda语句。构造出需要的变量geometry之后,就可以使用del命令来删除places当中的其它不需要的列。接着,需要使用geopandas中的GeoDataFrame来将places从普通的pandas数据框编程geopandas下的地理位置数据框。 此时,我们已经有了国家地理形状数据country和袭击事件地理位置数据places,在我们绘图之前,我们还需要确保它们使用的是同一个参考系。默认的参考系为WGS84, 我们这里采用crs命令为country和places指定采用epsg:4326这样一种投影方式。 然后,把这两个数据画在一起(使用同一个ax)就可以了。为了更简洁明了,我们使用plt.axis(‘off’)命令来去掉坐标轴,使用plt.title命令来加上图片标题。因为我们有六年的数据需要画,为避免重复,需要将以上代码写成一个简单的函数,即为plot_points_on_shapefile。这个函数需要输入两个参数,分别是年份year和子图ax。最后,我们调用这个函数,写一个简单的for循环,就可以把2004到2009年的图片画在一起,如图7-14所示。

fig = plt.figure(figsize=(12, 8),facecolor='white') year = [2004+i for i in range(6)] for k, i in enumerate(year):

   ax = fig.add_subplot(2,3,k+1)
   plot_points_on_shapefile(i, ax)

plt.tight_layout()


图7-14 阿富汗战争爆炸袭击事件的时空特征

同样可以采用Python来绘制基于网页的地理空间可视化展示。我们需要使用到一个叫做folium的第三方包。使用pip install folium即可在电脑终端安装好folium。我们首先调用folium及其插件plugins。这些插件中一个非常好的应用为热力图HeatMap,顾名思义,它可以帮助我们绘制袭击事件地点分布的热力图。 首先,我们需要使用for循环构造一个名为nodes的列表,列表中的每一个元素是一个元组,每一个元组由经度和维度两个数值组成。 其次,就可以使用folium的Map函数将阿富汗地理位置作为背景绘制出来。大需要输入一个经纬度坐标locatio,我们采用数据df中经度的均值和维度的均值作为location,我们选择使用'cartodbpositron'作为底图风格,选择初始状态的缩放比例为5.4。图片绘制出来之后,读者可以自己选择自己喜欢的缩放。 然后,使用add_child命令加入热力图数据信息;而热力图数据来自于HeatMap这个插件对于经纬度数据nodes处理的结果。 最后,使用fit_bounds和get_bounds来根据袭击事件地理位置信息选择一个最优的缩放。 这样就可以得到一个袭击事件地理位置分布的热力图。可以将这个热力图通过save命令保存为一个网页文件,或者直接在jupyter notebook中展示出来,如图7-15所示。

import folium from folium import plugins print(folium.__file__) print(folium.__version__)

nodes = [(df.Latitude[i], df.Longitude[i]) for i in df.index] map_osm = folium.Map( location=[df.Latitude.mean(), df.Longitude.mean() ], tiles = 'cartodbpositron',

    zoom_start=5.4)

map_osm.add_child(plugins.HeatMap(nodes)) map_osm.fit_bounds(map_osm.get_bounds()) map_osm.save('heatmap.html') map_osm


当然了,也可以使用folium将所有袭击事件的地点逐年绘制出来,并保存为网页文件。此处不再赘述。以上分析所使用到的所有数据、代码、可视化结果都可以通过Github网站获取。


图7-15 阿富汗战争爆炸袭击事件的热力图

二、奥运会数据分析和ECharts的使用

我们将通过第二个实战练习来学习制作一个关于奥运会的数据新闻,并简要介绍ECharts的使用。在奥运赛场上,总有些国家长踞固定项目的榜首,在自己的传统强势项目上持续发光发热。早在1992年巴塞罗那奥运会,囊括了当时几乎所有的NBA顶尖选手的美国男篮表现得如梦如幻,被人们冠以“梦之队”的称号。之后这一说法渐渐流行起来,那些在单项上的地位长期无法为其他国家所撼动的实力无人能比的队伍也开始被称赞为“梦之队”,其中最常见的除了美国篮球,还有中国乒乓球队、中国跳水队和韩国射箭队。“梦之队”们凭借着自身的强势,成为各自项目的霸主对该项目进行着不同时间段的“统治”,也就是实现了对一些奥运项目的垄断。然而奥运中的这些垄断现象并不仅仅与体育运动项目本身相关,还与国家的实力相关,在更大程度上奥运会是大国“秀肌肉”的舞台。

回答以上所有问题的根本依然在于高质量的数据和计算。我们将采用《卫报》数据博客在机器学习比赛网站Kaggle上发布的奥运会数据,大家可以在Kaggle下载这个数据。这个数据记录了1896到2014年间奥林比赛运动的获奖情况,包括了三个数据文件,分别为dictionary.csv、summer.csv、winter.csv。其中,dictionary.csv为国家数据,包括国家名字、代码、人口、人均GDP四列;summer.csv和winter.csv分别是夏季奥运会和冬季奥运会的数据。我们主要分析夏季奥运会,在summer.csv数据中包括年份(Year),城市(City),运动类型(Sport),比赛领域(Discipline),运动员姓名(Athlete),国家(Country),性别(Gender),比赛事件(Event),奖牌类型(Medal)这些信息。 我们首先使用pandas的read_csv命令读入两个比赛数据和国家数据,分别命名为game和country。

%matplotlib inline import pandas as pd import numpy as np import matplotlib.pyplot as plt

  1. Data https://www.kaggle.com/the-guardian/olympic-games

game = pd.read_csv('summer.csv') country = pd.read_csv('dictionary.csv')

然后,就可以对各国在某一个比赛事件(Event)中的奖牌数。我们希望统计金、银、铜三种奖牌数量。并根据不同的奖牌给性,给这个国家一个比赛分数,比如一个简单的方法是铜牌是1分,银牌是2分,金牌是4分。我们采用以下代码来实现这样一个过程,初始阶段让gold、silver、bronze、score都为0,然后依据其得奖类型和数量赋值。

game['gold']=0 game['silver']=0 game['bronze']=0 game['score']=0 game['gold'][game['Medal']=='Gold'] = 1 game['silver'][game['Medal']=='Silver'] = 1 game['bronze'][game['Medal']=='Bronze'] = 1 game['score'][game['Medal']=='Gold'] = 4 game['score'][game['Medal']=='Silver'] = 2 game['score'][game['Medal']=='Bronze'] = 1

这样,我们就可以统计各国获得的金银铜三种奖牌的数量以及总的分数。实现这一步需要使用pandas中的groupby命令,接着对汇总后的数据按照得分score进行降序排列,并查看前二十名。分别为美国、苏联、英国、意大利、法国、德国、匈牙利、澳大利亚、瑞典、东德、中国、荷兰、俄罗斯、日本、挪威、加拿大、罗马尼亚、韩国、丹麦、西德。

gsb = game.groupby(['Country']).sum()'gold', 'silver', 'bronze', 'score' gsb = gsb.sort_values(['score'], ascending = False) gsb[:20]

衡量一个领域的竞争状况的基本方法是看各个国家在这个领域的累积奖牌数或者得分是否均匀,一种常用的被垄断程度的测量是基尼系数。基尼系数越大,表示不平等程度越高。基尼系数是根据洛伦兹曲线来定义的。洛伦兹曲线是为了研究国民收入分配问题提出的,将所有人按照贫困到富有进行从低到高排序,计算各个人口百分比所对应的收入百分比的曲线即为洛伦兹曲线。理想的情况是人口比例与财富比例完全相等,也就是一条从穿过原点、斜率是45度角的直线。理想情况和实际的洛伦兹曲线之间的差异所占的比例即为基尼系数。

def gini_coefficient(v):

   bins = np.linspace(0., 100., 11)
   total = float(np.sum(v))
   yvals = []
   for b in bins:
       bin_vals = v[v <= np.percentile(v, b)]
       bin_fraction = (np.sum(bin_vals) / total) * 100.0
       yvals.append(bin_fraction)
   # perfect equality area
   pe_area = np.trapz(bins, x=bins)
   # lorenz area
   lorenz_area = np.trapz(yvals, x=bins)
   gini_val = (pe_area - lorenz_area) / float(pe_area)
   return bins, yvals, gini_val

按照基尼系数的定义,就可以定义一个名为gini_coefficient的函数,这个函数输入参数就是各个国家的奖牌数或者得分v。首先,使用numpy的函数linspace构造从0到100的11个分位数bins。总奖牌数或者总分数total,将v的各个取值使用sum命令累加起来就可以获得。然后,即可以计算11个分位数各自对应的纵轴取值的概率,记为yvals。此时,使用numpy中的trapz命令就可以得到理想直线所覆盖的面积pe_area以及洛伦兹曲线下的面积lorenz_area,也就可以计算出基尼系数。

我们将各国的总分数计算出来,调用定义好的gini_coefficient函数,就可以计算出来基尼系数为0.794,这意味着整个奥运会比赛被垄断的情况非常严重。为了更好展示这样一个计算过程,我们将理想直线和洛伦兹曲线绘制出来。

score_all = game.groupby(['Country']).sum()['score'] bins, result, gini_val = gini_coefficient(score_all)

plt.plot(bins, result, label="$observed$") plt.plot(bins, bins, '--', label="$perfect\; eq.$") plt.xlabel("$Fraction\; of\; Countries$") plt.ylabel("$Fraction\; of \;Olympic Score$") plt.title("$GINI: %.4f$" %(gini_val)) plt.legend(loc=0) plt.show()

图7-16奥运会比赛的基尼系数

更有意思的是,我们可以计算每一年奥运会比赛各国得分的基尼系数,这样就可以分析随着时间变化奥运会被垄断情况是如何变化的。首先,按年和国家对得分进行汇总;然后对每一年各国得分计算一个基尼系数;最后,将每年的基尼系数和年份绘制出来就得到一条时间序列。结果显示初始二十年里基尼系数变化剧烈,非常不稳定。例如,第一届奥运会比赛的基尼系数较低,之后两届基尼系数非常高。到了1920年之后,每一年的基尼系数就相对稳定,随着时间变化稳定上涨。到了1980年之后,基本稳定在0.7左右。我们可以认为现在的奥运会比赛已经进入到了一个成熟期,虽然垄断程度较高,但这种垄断相对非常稳定。

ggy = game.groupby(['Year', 'Country']).sum()['score'] years = game.Year.unique() gini = [gini_coefficient(ggy[i])[2] for i in years] fig = plt.figure(figsize=(12, 4),facecolor='white') plt.plot(years, gini, 'r-o') plt.ylabel(r'$Gini\; Coefficients$', fontsize = 20) plt.show()


图7-16奥运会比赛被垄断程度随时间的变化

除了以上内容之外,针对奥运会数据还可以分析很多有趣的话题,比如在单项比赛项目上的垄断情况,可以尝试找到那些领域的霸主。此外,可以看霸主的更迭如何发生。最后,还可以看在奥运会上的地位与国家实力(人口、人均GDP等)的关系。对于经过数据分析得到的可视化结果可以采用ECharts或D3等javascript工具进行可视化。其中,ECharts的使用比较简单。在ECharts官方网站上提供了一个五分钟上手ECharts的例子,将制作ECharts图表分为简单的三步:

第一步,下载ECharts,在官方网站下载即可。 第二步,新建一个html文件,使用script标签引入ECharts。

<!DOCTYPE html> <html> <head>

   <meta charset="utf-8">
   <script src="echarts.min.js"></script>

</head> </html>

第三步,绘制图表。

首先,需要在body中建立一个文档对象模型(DOM)的容器,可以通过div标签增加一个id为“main”(或者其它名字)的容器,指定它的宽度和高度。例如:

<body>

</body>

然后,基于准备好的DOM,初始化ECharts实例,指定图表的配置项和数据,并使用指定的配置和数据显示图表就可以了。

<!DOCTYPE html> <html> <head>

   <meta charset="utf-8">
   <title>ECharts</title>
   <script src="echarts.min.js"></script>

</head> <body>

   <script type="text/javascript">
       // 基于准备好的dom,初始化echarts实例
       var myChart = echarts.init(document.getElementById('main'));
       // 指定图表的配置项和数据
       var option = {
           title: {
               text: 'ECharts 入门示例'
           },
           tooltip: {},
           legend: {
               data:['销量']
           },
           xAxis: {
               data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
           },
           yAxis: {},
           series: [{
               name: '销量',
               type: 'bar',
               data: [5, 20, 36, 10, 10, 20]
           }]
       };
       // 使用刚指定的配置项和数据显示图表。
       myChart.setOption(option);
   </script>

</body> </html>

在http://echarts.baidu.com/examples/这里提供了大量的官方例子,每个例子都给出了option的内容。当我们作图的时候,只需要对option进行简单修改就可以了。例如http://echarts.baidu.com/examples/editor.html?c=line-simple 给出的是绘制简单直线的方法。想要可以得到奥运会得分基尼系数随时间变化的曲线,只需要在这个页面左方的option部分进行以下操作: 1. 将X轴的日期替换为奥运会的年份数据。 2. 将Y轴的数值数据替换为每一年的基尼系数。 3. 点击这个页面右下方的Download按钮,就可以将生成的html文件下载下来。


图7-17 ECharts图表制作

五. 结语

综上,本章介绍了数据新闻的基本定义、产生背景、理论源流、制作流程和实战练习。需要强调的是具备批判思维、计算思维和可视化思维是学习数据新闻的重要方面。数据新闻以数据为核心,需要更多的编程技能、统计知识和数据可视化的能力。在数据新闻的制作过程中,首先,必须找到数据,这可能需要像 MySQL 或者 Python 这样的专业技能;然后,能够进行数据分析和挖掘,着需要了解统计学的基本知识;最后,使用开源工具进行数据可视化。要有意识地选修社会统计课程、数据分析课程,学习数据科学的编程工具(推荐R和Python),学习网络爬虫的编写,经常写博客积累一些知识,使用Github保存和分享代码,使用stack overflow进行提问。

不同背景的人在学习数据新闻的时候面临的困难是不一样的。计算机背景的同学可能在艺术设计方面有所缺陷,也可能在批判思维的方面有所不足;对新闻学院的同学而言,新闻选题和可视化设计的训练是必修课,计算思维则可能是短板,因而需要花费更多的时间去训练。从计算思维的训练角度来讲,编写代码对于年轻的学习者而言不可避免。首先,虽然有很多打包好的现成的工具可以使用,每当我们试图去做一点个性化的改变的时候,而使用者无法优化打包好的软件工具,此时编写代码的优势就体现出来了。其次,很多工作需要重复进行,采用编写代码的方式可以减少这种重复所造成的时间浪费;最后,编写的代码容易分享,也方便记录下来操作过程,有利于检查错误。

数据新闻是一个迅速发展的领域,尤其注重实践练习,向业界学习数据新闻的经验。要经常关注国内外的数据新闻团队的作品,关注每一年颁发的数据新闻奖获奖作品,分析其设计理念、数据来源、呈现技术、优缺点等方面。数据新闻不是靠一个人就能完成的工作,它涉及到新闻选题策划、数据的收集、清洗、分析和可视化等多个方面,需要新闻编辑、数据分析师、可视化设计师组成数据新闻团队,相互协同,一起努力。学习数据新闻需要训练合作意识和分享意识,增强团队协同能力。在数据新闻学习的过程中,可以积极地使用Github开放数据、分享代码、传播数据新闻作品。数据新闻人才是独角兽,非常稀缺,但成长为一个合格的数据新闻人才并不容易。如果你决定要成为一名数据新闻生产者,就要以更高的标准要求自己,需要更勤奋、更专注、更开放。


  1. 方洁 (2015) 数据新闻概论. 北京:中国人民大学出版社. 第12页.
  2. Albert Cairo (2015) 不只是美:信息图表设计. 人民邮电出版社. 北京. 第12-13页.
  3. Rowley, J. (2007). The wisdom hierarchy: representations of the dikw hierarchy. Journal of Information Science, 33(2), 163-180.
  4. David Weinberg (2010) The problem with the data-information-knowledge-wisdom hierarchy. Havard Business Review. February.
  5. https://ire.org/awards/philip-meyer-awards/2017-philip-meyer-award-winners/
  6. Albert Cairo (2015) 不只是美:信息图表设计. 人民邮电出版社. 北京. 第6页.
  7. Randy Krum (2014) 可视化沟通:用信息图表设计让数据说话. 电子工业出版社. 北京. 第2-18页
  8. 陈为、张嵩、鲁爱东 (2013) 数据可视化的基本原理与方法. 北京:科学出版社. 第3页.
  9. https://en.wikipedia.org/wiki/Florence_Nightingale#/media/File:Nightingale-mortality.jpg
  10. Anscombe, F.J. (1973).Graphs in Statistical Analysis. The American Statistician, Vol. 27, No. 1., pp. 17-21.
  11. 具体R代码见计算传播网:https://computational-communication.com/why-vis/
  12. Edward R. Tufte (1983). The visual display of quantitative information (2nd editon). Graphics Press. Cheshire, Connecticut.
  13. https://sickcityproject.wordpress.com/2013/03/11/john-snow-and-cholera/
  14. http://www.selkirkgis.com/blog/tag/program-collaboration/
  15. Lorenz, Mirko. (2010). Data driven journalism: What is there to learn? Presented at IJ-7 Innovation Journalism Conference, 7–9 June 2010, Stanford, CA
  16. Paul Bradshaw (2011) The inverted pyramid of data journalism. https://onlinejournalismblog.com/2011/07/07/the-inverted-pyramid-of-data-journalism/
  17. https://www.theguardian.com/news/datablog/2011/apr/07/data-journalism-workflow
  18. https://www.gapminder.org/
  19. https://www.gapminder.org/data/
  20. https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen
  21. https://www.ted.com/speakers/hans_rosling
  22. https://www.cms.gov/OpenPayments/Explore-the-Data/Dataset-Downloads.html
  23. https://projects.propublica.org/d4d-archive/
  24. https://www.theguardian.com/news/datablog/interactive/2011/aug/16/riots-poverty-map
  25. https://www.theguardian.com/uk/interactive/2011/dec/07/london-riots-twitter
  26. https://www.theguardian.com/news/datablog/2010/jul/27/wikileaks-afghanistan-data-datajournalism
  27. https://www.theguardian.com/world/datablog/2010/jul/26/wikileaks-afghanistan-ied-attacks
  28. 卫报公布的维基解密阿富汗数据 https://pan.baidu.com/s/1jKjBXOy
  29. http://continuum.io/downloads.html