用 Altair 和 AI 进行数据叙事——数据叙事入门

93 阅读19分钟

本章内容包括

  • 什么是数据叙事
  • 数据叙事的重要性
  • 为什么在数据叙事中使用 Python 的 Altair 与生成式 AI 工具
  • 何时 Altair 与生成式 AI 工具适用于数据叙事
  • 如何阅读本书
  • 数据—信息—知识—智慧(DIKW)金字塔

购买本书,意味着你决定踏上一条充满刺激的道路:把数据叙事、Python 与生成式 AI结合起来。你很可能已具备一定的数据可视化基础,希望学到改进图表的新技巧,并了解如何在制图过程中使用生成式 AI。简单说,你希望通过阅读本书学习如何借助生成式 AI 做数据叙事。先说明,本书不仅仅是数据叙事与生成式 AI 的背景知识;贯穿全书,你还会学到一套方法论,让你能够系统化地创作基于数据的故事。因此,这不会只是另一本文例与代码的书;我会在必要处补充理论基础,好让你据此实现自己的数据驱动故事。本书融合理论与实践,便于你把学到的方法迁移到其他情境中。

全书(包括本章)的示例都力求简洁,目的是帮助你理解一套可操作的方法。读到最后你会发现:与其说你“实现了几个示例”,不如说你掌握了一种工作方法。因此,请不要因示例的“简单”而失望;请关注其背后的方法论以及如何将其应用到你现实工作中(那往往比书中的示例复杂得多)。现在,让我们启程吧!

1.1 数据叙事的艺术

数据叙事是一种把数据洞见转化为叙事故事来分享的强大方式。无论是政府、教育、金融、娱乐还是医疗,都可应用。数据叙事不仅属于数据科学家和分析师——任何想用数据讲述故事的人都可以用。

数据可视化走向数据叙事,你需要转换视角:不再仅从自己的角度看数据,而是从受众的角度看。图 1.1 展示了从数据到受众的旅程:左侧是熟练数据科学家的视角,右侧是翘首以盼的受众。流程包含三大阶段:数据探索、分析、呈现。每个方框的大小反映该阶段投入的时间。数据科学家与受众共享同一目标(真正把握数据要义),但达成路径不同:数据科学家在“探索”阶段理解数据;而在“呈现”阶段,受众成为主角。

image.png

数据叙事能帮助数据从业者呈现并沟通分析结果。它仿佛数据科学生命周期的压轴:把前序阶段的成果转化为一个有效传达分析结果的叙事。与其依赖枯燥的图表,数据叙事让数据“活起来”,以更具说服力的方式传达洞见;它让受众在追随目标的过程中产生情感共鸣、体验起伏。

更正式地说,数据叙事是在数据支撑下构建引人入胜的故事,使分析师和数据科学家能以有趣、可交互的方式呈现并分享洞见。其终极目标是吸引受众并激发其行动。有时(尤其在商业场景),并非先有数据,而是先有一个叙事或假设,再去找数据验证或证伪。在这种情况下同样可以做数据叙事,但务必警惕为迎合假设而篡改数据。叙事培训顾问 Brent Dykes 建议:“当你从叙事而非数据出发时,需要纪律与开放。此时的主要风险是确认偏误——你会倾向于挑选支持你观点的数据,忽略与之相悖的数据。”(Dykes, 2023)务必建立在准确与无偏的分析之上,并时刻审视所用数据。

不久前,我参与了一个文化遗产项目:需要自动分析 1700–1800 年间姓名登记簿的转录文本中的实体,计算常见名字、按年出生数等统计。坐在电脑前,我计算并可视化这些统计。项目还要把这些人和他们的墓地关联,构建交互式墓园地图。某天我去实地走访,成排墓碑让我驻足。那一刻我猛然意识到:刻在石上的每个名字都是一段人生。先前在数据集中反复琢磨的数字,突然变成了真实的故事。这彻底改变了我的工作方式——这就是数据叙事的真正力量:不仅是“做漂亮图表”,而是让数据背后的人鲜活起来。作为数据讲述者,我们有使命为这些被淹没在数字中的人发声,把他们的故事带到台前

在本书中,你将学习两种把数据转化为故事的技术:Python Vega-Altair(简称 Altair)生成式 AI 工具。Altair 是 Python 的数据可视化库,与 Matplotlib、Seaborn 等不同,它是声明式的:你只需描述“想看什么”,而非“如何画出来”。这有利于快速构建数据故事而不必纠结绘制细节。Altair 还支持交互,便于用户直接探索数据。

第二类技术是生成式 AI。本书聚焦于:用 ChatGPT 生成文本、用 DALL·E 生成图像、用 GitHub Copilot 自动生成 Altair 代码。我选择 Copilot 来生代码,而非 ChatGPT,是因为 Copilot 受训于领域特定文本(含 GitHub 与 Stack Overflow 代码),而 ChatGPT 更偏通用。在写作时,生成式 AI 仍在快速演进中,其本质是把规格或动作的描述翻译成文本

数据叙事不止是“传达数据”;它还在于激励受众、促成行动。出色的数据叙事需要艺术与科学的结合:艺术在于找到合适的故事,科学在于用数据支撑这个故事。若运用得当,数据叙事是推动改变的有力工具。下文我们将简要回答三个基础问题。

1.1.1 为什么要做数据叙事?

数据叙事让你以受众易于理解的叙事方式传达数据分析结果。本书将给出诸多示例与案例研究。比如,你会看到如何把图 1.2 的原始图表转化为图 1.3 的数据故事

image.png

image.png

数据叙事弥合了“只做可视化”与“面向受众沟通”之间的鸿沟;它能提升沟通能力,并使沟通过程标准化、简化,便于人们理解与记忆。它还会训练你更有效地与他人沟通,改善个人与职业关系。

当你想要:

  • 聚焦关键信息,使数据更易懂、更可共鸣
  • 清晰而有说服力的方式把发现传达给他人;
  • 与受众建立情感连接,提高其采取行动的可能性;
  • 通过帮助他人更深入理解数据来启发更好的决策
    请使用数据叙事。

1.1.2 数据叙事能解决什么问题?

当你要以报告写作、演示汇报、仪表板构建等形式向受众传达内容时,请使用数据叙事。

撰写报告
设想你要写一份零售公司的销售报告。与其罗列原始数字,不如围绕不同品类的表现编织故事。先识别最关键的方面:畅销产品、趋势变化、季节性波动等;再用可视化、案例、合理的叙事逻辑呈现信息。围绕数据构建叙事——引入问题、制造悬念、落到可执行建议——能让报告更生动、更易懂。

做演示
假设你要展示多个营销活动的成效。别用一堆图表和统计**“砸”观众,而是用一个连贯的叙事引导他们理解活动的展开过程与对目标受众的影响,最后给出潜在的下一步**。演示中用数据叙事能更好地吸引受众并强化信息理解

搭建仪表板
如果你在做销售绩效仪表板,与其堆叠大量数据,不如以叙事引导用户浏览,凸显关键洞见。用数据叙事打造更友好、更有信息含量的仪表板。

1.1.3 数据叙事有哪些挑战?

要打造有吸引力且信息密度高的数据故事并不容易:这需要时间,也需要团队协作——把不同背景、专长、视角的人组织在一起共创。这种协作具有挑战,但对编织连贯而有影响力的故事至关重要。概言之,数据叙事的两大挑战是:时间团队合作。在这两方面的投入,是打动受众、有效传达洞见的关键。

现在,我们已了解何时使用数据叙事、它能解决什么问题以及它的独特之处,接下来就可以讨论本书的两件工具:Python Altair生成式 AI。我们将在下一节展开。

1.2 为什么在数据叙事中使用 Python Altair 与生成式 AI?

Python 提供了许多数据可视化库。包括 Matplotlib、Seaborn 在内的大量库是命令式(imperative)的——你必须逐步定义如何绘制一张图。Altair 则是声明式(declarative)的——你只需声明想要看到什么。在数据叙事场景下,使用 Altair 往往能更快地搭建可视化。

例如,用 Matplotlib 画折线图时,你需要显式指定 x、y 坐标,设置标题、轴标签,并定制外观。

代码清单 1.1 命令式库

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

plt.plot(x, y)
plt.title('Square Numbers')
plt.xlabel('X')
plt.ylabel('Y')

plt.show()

以上在 Matplotlib 中绘制折线图。你需要按步骤构建图表:(1) 设标题;(2) 设 x 轴;(3) 设 y 轴。

声明式的 Altair 允许你直接描述期望结果,无需写出实现细节。比如,用 Altair 只需给出数据并声明 x、y 映射,其余如坐标轴、标签、样式由库处理,代码更简洁直观

代码清单 1.2 声明式库

import altair as alt
import pandas as pd

df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [1, 4, 9, 16, 25]})

chart = alt.Chart(df).mark_line().encode(
    x='x',
    y='y'
).properties(
    title='Square Numbers'
)

chart.save('chart.png')

这里在 Altair 中绘制折线图。你需要做的是:指定图表类型(mark_line)、变量映射,以及标题。

在命令式的 Matplotlib 中,你必须以特定方式定义坐标轴并交由库渲染;而在声明式库中,你用 x、y 变量及其轴标签与样式直接表达意图,从而在创作与拓展图表时更为明确而高效

生成式 AI是人工智能的一类方法,能够基于既有数据中的模式与样例生成新的内容,输出可以是文本、图像,甚至代码。本书聚焦以下工具:用于文本ChatGPT、用于图像DALL·E,以及在编码时辅助你的 GitHub Copilot

  • ChatGPT——由 OpenAI 开发的高级语言模型(基于 GPT-3.5 或 GPT-4),可进行类人对话并提供智能回答。
  • DALL·E——OpenAI 的生成模型,结合了 GPT-3 的能力与图像生成,能把文本描述转换为独特、逼真的图像。
  • GitHub Copilot——由 OpenAI Codex 驱动的编码助手。你用自然语言描述程序应执行的步骤,Copilot 便在你偏好的语言中生成可运行的代码。掌握 Copilot 的关键在于如何清晰描述动作序列。它是付费工具,但本书的方法同样适用于其他流行的 AI 编码助手。

Python Altair生成式 AI结合,可更快地在 Python 中写出有说服力的数据故事。例如,你可以用 Copilot 自动补全代码片段(导入库、设置绘图、标注坐标轴等)。借助其上下文理解,它还能给出相关定制建议(如添加图例、调整配色),节省查文档与搜示例的时间与精力。

尽管生成式 AI 仍处于早期,一些数据已显示它能提升生产力。以语言学习应用 Duolingo 的研究为例:在公司内部使用 Copilot 让开发者速度提升 25% (Duolingo and GitHub Enterprise, 2022)。数字媒体与科技公司 Compass UOL 要求资深开发者在三个阶段完成同一用例(分析、设计、实现、测试、部署):无 AI(78 小时)使用 2022 年前后的 AI 工具(56 小时)使用新一代生成式 AI(如 ChatGPT,36 小时) 。相较无 AI 阶段,生成式 AI 将速度提升到 +53.85% (见图 1.4)。

image.png

图 1.4 Compass UOL 测试结果

1.2.1 在数据科学生命周期所有阶段使用 Python 的好处

许多数据科学家/分析师使用 Python 来分析数据,因此用 Python 产出最终报告理应顺理成章。然而,现实中大家往往只在生命周期中段使用 Python,到了最终呈现阶段则切换到 Tableau、Power BI 等工具(见图 1.5)。这会引入导出/导入等额外工作。本身成本不高,但一旦在制报时发现数据处理有误,就得回到 Python 修正、再导出、再导入。若频繁往返,管理开销会显著上升,直至难以为继。

image.png

图 1.5 传统做法:不同阶段使用不同技术

本书倡导在生命周期的每一阶段都使用 Python(见图 1.6),避免最后阶段导出到外部工具的断点。好处是:程序员在中间阶段就能直接生成报告原型,无需把数据迁移到 Tableau/Power BI,从而减少时间浪费与工具切换成本。

image.png

图 1.6 本书方法:各阶段使用同一技术栈(Python)

1.2.2 在数据叙事中使用生成式 AI 的好处

总体上,生成式 AI 可贯穿数据科学生命周期的各环节;但本书聚焦其在数据呈现(数据叙事)阶段的应用。将生成式 AI 引入呈现环节,可把省下的时间与精力投入到叙事与表达上,从而得到更好的结果。凭借这些工具,你能在更短时间内构建更优图表,帮助受众理解你的信息(见图 1.7)。接下来,我们将简要讨论何时这些工具并不适用的情境。

image.png

图 1.7 在呈现阶段引入生成式 AI:更快做出更好的图表,提升受众理解度

1.3 何时 Altair 与生成式 AI 不适用于数据叙事

尽管 Python Altair 与生成式 AI 工具能很快搭建数据故事,但在处理**大数据(如 GB 级数据)**时并不合适。以下任务不建议使用它们:

  • 复杂的探索性数据分析(EDA) ——用于概括数据集特征、识别变量关系、检测离群点,常见于大体量高维数据。
  • 大数据分析——需要访问大规模数据、强算力以及专用分析软件,来挖掘模式与趋势。
  • 汇总大数据的复杂报告——生成详尽报告通常需要健壮的数据处理能力与高级报表工具,尤其在面对大数据时。

Altair 能较快绘制≤ 5,000 行的数据集;超过该规模也能画,但会变慢。若要做复杂分析,优先考虑 Tableau、Power BI 等更专业的平台。话虽如此,若通过数据预处理能将数据缩减至 5,000 行以内,则 Altair + 生成式 AI 仍是不错的叙事组合。另外,生成式 AI 工具多为付费,预算不足时应避免依赖。

1.4 使用 DIKW(金字塔)做数据叙事

本书聚焦一个关键概念——数据—信息—知识—智慧(DIKW)金字塔(图 1.8)。我们认为它为数据科学家与分析师提供了构建数据故事的宏观步骤。第 5 章将更全面展开,这里先做引入,因为用 DIKW 来组织数据故事是本书的基础方法。

image.png

图 1.8 DIKW 金字塔

DIKW 金字塔给出了把数据逐步转化为智慧的路径,中间经过信息知识阶段。其元素包括:

  • Data(数据) ——位于底层的“原料”,通常量大且或多或少已清洗。
  • Information(信息) ——从数据中提炼洞见,使其有组织、易理解
  • Knowledge(知识) ——在上下文中对信息进行解释与理解,为数据赋予背景。
  • Wisdom(智慧) ——在知识之上叠加价值与行动伦理,引导下一步行动

本书将把 DIKW 的各层作为渐进步骤,教你把数据转化为有说服力的故事。此思路并非首次提出(见 Berengueres 与 Sandell,2019),本书的创新在于将 DIKW + Python Altair + 生成式 AI 结合使用。本节先介绍 DIKW 的基础,并说明如何逐级“登塔”。

1.4.1 从数据到信息

要把数据转成信息,就要提炼洞见。设想一个宠物主题活动:主办方统计将参与的宠物类型。针对不同类别,他们在对应的垂直网站上投放宣传。主办方让你做一份快速报告。表 1.1 给出各类别的参与数量投放网站数。你首先关注参与数量,画出图 1.9 的柱状图。

image.png

图 1.9 参与活动的宠物数量柱状图

表 1.1 活动相关的宠物数据

PetNumber of ParticipantsNumber of Advertised Websites
Cat1138150
Dog13028
Other17147

图 1.9 并未超越表 1.1 的信息量——它只是把表格可视化了一下;对某些数据而言,表格反而更清楚。

要把数据变成信息,先理解数据,问自己:

  • 我的受众是谁?
  • 他们想要什么信息?
  • 哪些数据与上述问题相关

来回答这些问题:受众是活动主办方;他们想知道当前参赛宠物的情况,并可能据此制定促销方案以提高参与度。

看表中原始数据,远多于,而 Other 几乎无人参与。可据此选择两条路:

  • 认为 Other 不相关,剔除
  • 聚焦 Other,提出提升参与的策略。

先按第一种思路,计算各类别参与占比(表 1.2)。

表 1.2 按参与占比重排的活动数据

PetNumber of ParticipantsPercentage
Cat1,13888.56
Dog13010.12

结果显示:猫 88.56% 、狗 10.12% 。面向终端受众时可近似为猫 90%、狗 10% 。由此得到的信息/洞见是:每 10 只宠物中 9 只是猫、1 只是狗

图 1.10 的堆叠柱状图很好地表达了这一点——读者一眼就明白。你已把“数据”提炼成信息

image.png

图 1.10 参与宠物当前占比的堆叠柱状图

1.4.2 从信息到知识

要把信息升格为知识,需要加入上下文(context) ——即围绕数据的事件、情境与细节。加入上下文能帮助受众更好理解数据。

延续猫狗的例子:你已知道猫的占比更高。加入上下文可从第三列入手(表 1.1、表 1.3):投放网站数量。猫为 150,狗为 28。这就是上下文:它解释了为何猫比狗多。

计算参与/网站比率(participants-to-website rate),见表 1.3。

表 1.3 强调参与率的活动数据

PetNumber of ParticipantsPercentageNumber of Advertised WebsitesParticipants-to-website rate (# participants / # websites)
Cat113888.561507.59
Dog13010.12284.64

猫的比率 7.59(≈8) ,狗 4.64(≈5) 。该比率帮助受众理解参与数量背后的情境与原因

图 1.11 在图 1.10 的基础上加入上下文

  • 标题——概括图表内容;
  • 页眉——说明投放网站数量;
  • 两张示意图——猫与狗,便于阅读。

image.png

图 1.11 加入上下文后、展示当前占比的堆叠柱状图

与图 1.9 相比,图 1.11 更易读易懂。通过加入上下文,我们已把信息提升为知识

1.4.3 从知识到智慧

知识提升为智慧,意味着加入行动号召(call to action) ,邀请受众基于已发现的知识采取行动。行动号召有助于促进转化,效果显著。示例如下:

  • 我们可以做出哪些改变?
  • 我们拥有哪些机会?
  • 我们的方案具有什么优势?
  • 我们可以勾勒出哪些情景?
  • 有哪些情景示例?

你也可以对上述问题提出可行的解决方案,或邀请受众讨论并倾听他们的建议与回答——讨论就在这里展开。

受众常常需要表达观点与提建议的机会,有时他们还会提出一个或多个问题。

继续回到“猫与狗”的例子。要加入行动号召,可以把标题从“每 10 只宠物中有 9 只是猫”改为“加强在与狗相关网站上的投放! ”。图 1.12 展示了加入行动号召后的图表(将行动号召体现在标题中)。

image.png

图 1.12 带有行动号召标题的堆叠柱状图:展示当前参与宠物的占比

这一“宠物”示例演示了如何把数据转化为智慧:首先,我们拿到的是原始参与数量;随后,我们提炼出信息——“10 个参与者中 1 个是狗、其余 9 个是猫”;接着,我们加入上下文,解释了为何狗主人对活动兴趣不高——与狗相关的投放不足;最后,我们加入行动号召,邀请受众加大对狗的广告投放

在本章中,你学习了数据叙事的基本概念,以及如何借助 DIKW 金字塔把数据转化为故事。下一章你将看到如何用 Python Altair生成式 AI 来实现 DIKW 方法。

小结(Summary)

  • 数据叙事是一种强有力的工具,可更高效地传达你的数据;使用得当,它能让复杂数据更贴近人心、易于理解
  • 做数据叙事需要将视角从“自我”转变为“受众”。
  • Python Altair生成式 AI是打造精彩数据故事的利器。
  • 若要进行大数据分析或撰写汇总大数据的复杂报告不宜使用 Altair 与生成式 AI。
  • 运用 DIKW 金字塔把数据转化为智慧:从原始数据(Data)出发,先为数据赋义提炼出信息(Information) ;再加上上下文形成知识(Knowledge) ;最后加入行动,升华为智慧(Wisdom)