第一部分、案例分析:利用世界银行人口数据集进行北美地区人口增长研究
作为一名在Global Demographic Analysis Center(全球人口分析中心,简称GDAC)工作的研究人员,假设您希望对北美地区的人口增长趋势进行深入研究。本文将引导您通过世界银行开放数据平台(World Bank Open Data)获取相关数据,并利用电商记交互式文档进行分析和可视化。
一、数据集概览
世界银行开放数据平台(World Bank Open Data)提供了全球各国从1960年到2023年的人口数据。这些数据依据联合国人口司《世界人口展望:2024年修订版》、各国国家统计办公室的统计数据库和出版物、欧洲统计局人口统计数据以及联合国统计司人口和生命统计报告(各年份)等权威来源进行整理和发布,采用知识共享署名4.0国际许可协议(CC BY-4.0)授权。
为了方便研究,我们已在本文附录下提供了清洗后的数据集population.csv,以及对应的交互式文档。该数据集包含国家名称(Country Name)、年份(从1960到2023)以及对应的人口数量等信息。
二、原始图表透视处理与绘制
首先介绍一个三段式提示词框架,您可以用于任何数据分析场景。
在开始分析之前,您可以先尝试绘制一个原始图表,展示从1960年到2023年所有国家和大洲的人口趋势线。以下是使用电商记交互式文档编写Deepseek提示词来自动生成图表代码的基本步骤。
(一)三段式编写Deepseek提示词
-
数据加载提示词
- 任务:从本地CSV文件加载人口数据
- 提示词:
我需要从pyodide文件系统的根目录加载一个名为population.csv的CSV文件。该文件包含从1960年到2023年各国的人口数据,其中第一列是国家名称(Country Name)、其它每一列都是具体年份的各国人口数量。表格示例参看《资料》。请生成相应的代码,使用pandas库读取这个CSV文件,并将其存储到一个名为df的DataFrame中。
-
在此之前,用户应将population.csv上传到pyhon内存文件系统(pyodide MemFS)中。
-
数据预处理提示词
- 任务:将数据透视,将年份作为独立列,并确保年份列为整数类型
-
提示词:
已经成功加载了人口数据(参看《各国人口数据示例》)到DataFrame df中。现在,我需要将数据进行透视处理,将年份作为独立的列(列名为Year),同时保留Country Name列。此外,我还需要将Year列的数据类型转换为整数。请生成相应的代码,使用pandas库来完成这一任务,并将处理后的数据存储回一个名为df2的DataFrame中。
运行这段Python代码后,DataFrame变量“df2”存放了我们下一步要显示的数据。
-
图表绘制提示词
- 任务:使用VegaLite语言绘制所有国家和大洲的人口趋势线图表
- 提示词:
我已经完成了人口数据的加载和预处理。现在,我想使用VegaLite语言绘制一个折线图,展示从1960年到2023年所有国家和大洲的人口趋势线。x轴表示年份(Year),y轴表示人口数量(Population),并根据国家或大洲名称(Country Name)进行颜色区分。请生成相应的VegaLite JSON代码。
4.总结
我们在附录中提供了对应第二章的交互式文档,您可以用自己的浏览器打开后运行提示词,体会“数据加载、数据预处理、图表绘制”这种三段式提示词框架生成代码的方便之处。
(二)问题与改进方向
当您执行上述提示词生成的代码并绘制出原始图表后,您可能会发现图表存在以下问题:
- 国家过多:图表中包含了全球所有国家和大洲的数据,导致线条过于密集,难以分辨北美地区的人口趋势。
- 颜色过多:由于国家和大洲数量庞大,图表使用了过多的颜色来区分不同的线条,使得图表视觉效果混乱,难以解读。
- 焦点不明确:图表没有聚焦于北美地区,无法直观地展示该地区的人口增长情况。
为了解决这些问题,我们可以借鉴 DIKW 金字塔(Data - Information - Knowledge - Wisdom,数据 - 信息 - 知识 - 智慧)模型,从第一步“将数据转化为信息”开始,逐步优化我们的分析和可视化过程。
第二部分、从数据到信息的提示词流程:分析与可视化按大陆洲划分的全球人口数据
在本文中,我们将探讨如何使用七个AI提示词构成从数据到信息的流程,自动生成Python分析并可视化按大陆洲划分的全球人口数据,数据范围从1960年到2023年。我们将展示如何使用pandas进行数据处理,并利用Vega-Lite语言进行可视化,帮助商业分析师更好地理解数据趋势。
1. 引言:AI数据分析在商业中的重要性
数据驱动的决策已经成为商业智能的核心。对于商业分析师和数据科学家而言,如何将原始数据转化为有用的信息是一项至关重要的技能。数据可视化是分析大量数据的有效方法,它能够帮助我们发现潜在的趋势、模式和洞察力。
在本文中,我们将使用全球不同国家的人口数据,数据从1960年到2023年,内容包括国家名称、年份以及每年的人口数。我们将重点对这些数据进行大陆洲分组处理,转化为易于分析的长格式数据,并最终通过图表展示各大陆洲的人口变化趋势。
每个 [提示词]
单元格中的AI提示词都针对数据分析过程中的一个特定步骤,目的是为下一步生成相应的Python代码和VegaLite JSON代码。用户只需按顺序点击运行提示词单元格、Python单元格、Vega单元格即可。通过这种方式,AI能够帮助用户高效地处理数据、进行分析,并生成可视化图表。
资料单元格:《各国人口数据示例》
在第一个[提示词]
单元格之前,有一个[资料]
单元格,内容提供了一个关于各国人口数据的示例,数据从1960年开始,每一年记录了多个国家和地区的总人口数。这个示例用于展示数据的结构和内容,帮助理解如何处理和分析类似的数据集。
数据结构:
-
第一列:Country Name(国家名称)
包含了多个国家或地区的名称。这些名称包括具体的国家名(如阿富汗)以及一些地区性或群体性的名称(如“非洲东部和南部”)。这种命名方式对于大范围地理区域的统计非常重要,例如,当多个国家被合并为一个区域时(如“非洲西部和中部”),它们的总人口被合并计算。 -
接下来的列:年份(1960、1961、1962、1963)
每个国家或地区的每一年的具体人口数。每一列对应一个年份,记录了各国或各区域在该年的总人口数量。
数据示例内容:
Country Name | 1960 | 1961 | 1962 | 1963 |
---|---|---|---|---|
Aruba | 54922 | 55578 | 56320 | 57002 |
Africa Eastern and Southern | 130072080 | 133534923 | 137171659 | 140945536 |
Afghanistan | 9035043 | 9214083 | 9404406 | 9604487 |
Africa Western and Central | 97630925 | 99706674 | 101854756 | 104089175 |
解释:
- Aruba:这是一个国家,示例中显示了阿鲁巴在1960到1963年每年的总人口数量。
- Africa Eastern and Southern:这个条目并不是单个国家,而是代表一个地理区域——“东非和南非”。示例中给出了这个区域在1960到1963年之间每年的人口总和。
- Afghanistan:这是另一个具体的国家(阿富汗),也提供了其在1960到1963年间的每年人口数。
- Africa Western and Central:类似于“东非和南非”,这是代表“西非和中非”的区域。此数据是该区域所有国家人口的总和。
用途:
这个数据集的结构说明了如何组织按年份和地理位置(国家或区域)划分的时间序列数据。通过这种结构,分析师能够:
- 比较不同国家或地区在不同年份的人口增长情况。
- 对多个国家/地区的数据进行汇总与分析,例如统计整个区域的总人口。
- 进一步应用数据清洗、转换和可视化技术,以便生成关于人口变化趋势的有意义的图表。
在实际应用中的意义:
在实际数据分析过程中,我们可以将类似的CSV数据导入到Python中进行处理,使用像 pandas
这样的库来读取数据并进行清理(例如处理缺失数据、处理不同国家/地区的命名方式等),然后对数据进行进一步分析(例如计算每个大陆洲的年度人口变化趋势,绘制折线图等)。
2. 数据处理:加载与转换数据
任何数据分析项目的第一步都是获取并准备数据。以下是我们处理人口数据的步骤概览。
2.1 加载数据
我们首先加载存储在CSV文件中的人口数据。该数据的第一列是国家名称,接下来的每一列是各年份的各国人口数据。
第一个 [提示词]
单元格
我需要从pyodide文件系统的根目录加载一个名为population.csv的CSV文件。该文件包含从1960年到2023年各国的人口数据,其中第一列是国家名称(Country Name)、其它每一列都是具体年份的各国人口数量。表格示例参看《资料》。请生成相应的代码,使用pandas库读取这个CSV文件,并将其存储到一个名为df的DataFrame中。
解释:
这是一个请求生成 Python 代码的提示词。用户的需求是:
- 加载数据:用户需要从文件系统中加载一个名为
population.csv
的CSV文件。这个文件包含的内容是各国的年度人口数据。 - 数据格式:CSV文件的第一列是国家名称,后续列表示从1960年到2023年各年份的各国人口数据。
- 数据处理:用户希望使用
pandas
库来读取该CSV文件,并将其存储到一个名为df
的 DataFrame 中。
这个提示词的目的是通过AI生成相应的Python代码,能够从指定路径加载CSV文件并将其转化为 pandas
DataFrame 格式,便于后续的数据分析。
生成的代码:
import pandas as pd
# 从pyodide的根文件系统读取CSV文件
df = pd.read_csv('/population.csv')
print(df)
这段代码通过 pd.read_csv()
方法加载了名为 population.csv
的文件,并将其存储为 df
,最后打印了DataFrame内容。
2.2 提取国家名称
接下来,我们将提取所有国家名称,方便后续将它们映射到各自的大陆洲。我们使用pandas的tolist()
方法将国家名称提取为列表。
第二个 [提示词]
单元格
我需要从df中列出所有国家名称,表格示例参看《各国人口数据示例》,请生成Python代码。
解释:
这个提示词要求生成代码来从已经加载的数据 df
中提取所有的国家名称。具体需求是:
- 列出国家名称:提取
df
中名为 “Country Name” 的列,并将其转换为一个列表。 - 数据来源:这部分操作是基于用户之前加载的数据框
df
。
AI需要生成一段Python代码,提取DataFrame中的 Country Name
列,并将其转换为一个列表格式,这对于后续分析非常有用。
生成的代码:
# 提取国家名称列并转换为列表
country_list = df['Country Name'].tolist()
这里通过 df['Country Name'].tolist()
提取了 Country Name
列并将其转化为列表 country_list
,便于后续使用。
2.3 将国家名称映射到大陆洲
一旦我们拥有了所有的国家名称,就可以将每个国家映射到对应的大洲。我们通过一个字典实现这个映射,字典的键是国家名称,值是大陆洲名称。对于一些模糊或无法明确分类的区域,我们可以将它们留空。
第三个 [提示词]
单元格
根据这个国家列表,将每个国家/地区名按照其地理位置对应到大陆洲四部分(东南西北)并生成Python JSON对象。无法明确分类的条目保留为空字符串。生成一个Python JSON对象country_to_continent。
解释:
这个提示词的目的是:
- 映射国家到大陆洲:根据国家/地区的名称,将其对应到地理位置上的大陆洲(东亚、南亚、北美等)。对于无法明确分类的条目,需要将其映射为空字符串。
- 生成 JSON 对象:生成一个字典(Python中的JSON对象),其中键是国家名称,值是对应的大陆洲名称。
这个操作是通过一个字典来完成的,字典的每个条目是一个国家及其对应的大陆洲。
生成的代码:
country_to_continent = {
"Aruba": "",
"Africa Eastern and Southern": "",
"Afghanistan": "南亚",
"Africa Western and Central": "",
"Angola": "中非",
# 此处省略其他国家和地区的映射
"Yemen, Rep.": "西亚",
"South Africa": "南非",
"Zambia": "东非",
"Zimbabwe": "东非"
}
在这个字典中,每个国家或地区名称都被映射到了相应的大陆洲。如果无法确定大陆洲,值会为空字符串。
2.4 添加大陆洲列
在映射了大陆洲之后,我们可以向DataFrame中添加一个新的列,用于存储每个国家所属的大陆洲信息。
第四个 [提示词]
单元格
根据country_to_continent字典和DataFrame变量df中的字段“Country Name”,在df中增加一个字段“大陆洲”。
解释:
这个提示词要求:
- 使用字典进行映射:使用先前生成的
country_to_continent
字典,将每个国家名称映射到大陆洲。 - 增加新列:在
df
数据框中添加一个新的列大陆洲
,该列存储每个国家对应的大陆洲名称。
AI需要生成一段代码,通过 map()
方法将字典中的大陆洲信息添加到原始数据 df
中。
生成的代码:
# 使用map方法根据国家名称映射对应的大陆洲
df['大陆洲'] = df['Country Name'].map(country_to_continent)
这段代码使用 pandas
中的 map()
方法,将 country_to_continent
字典中的大陆洲信息映射到 df
数据框中的新列 大陆洲
。
2.5 转换数据格式
接下来,我们需要将数据从宽格式转换为长格式。在原始数据中,每一年都是一个独立的列,而我们希望将年份作为一个独立的列,以便于后续处理。使用pandas的melt()
函数,我们可以将数据转换为长格式。
第五个 [提示词]
单元格
将数据进行透视处理,将原始的宽格式数据转换为长格式,将年份作为独立的列(列名为Year),保留“Country Name”和“大陆洲”两列,每年人口的value值则作为独立的“Population”列。将来可用于绘制每个大陆洲每年人口变化折线图。此外,我还需要将Year列的数据类型转换为整数。请生成相应的代码,使用pandas库来完成这一任务,并将处理后的数据存储回一个名为df2的DataFrame中。
解释:
这个提示词要求将数据从宽格式转换为长格式。具体步骤是:
- 数据透视:将每一年的列转换为单独的行,新的列包括
Year
和Population
,保持Country Name
和大陆洲
两列。 - 数据格式转换:将
Year
列的数据类型转换为整数,以便进行后续分析。 - 存储到新DataFrame:将转换后的数据存储到名为
df2
的新的 DataFrame 中。
AI需要生成一段代码,利用 pandas
中的 melt()
函数将数据从宽格式转换为长格式。
生成的代码:
# 将宽格式数据转换为长格式,生成Year列
df2 = df.melt(
id_vars=['Country Name', '大陆洲'],
var_name='Year',
value_name='Population'
)
# 将Year列的数据类型转换为整数
df2['Year'] = df2['Year'].astype(int)
这里通过 melt()
函数将 df
中的年份列转换为一个名为 Year
的列,并将人口数据存储在 Population
列中。
2.6 数据筛选
我们将过滤掉大陆洲信息为空或缺失的记录,以确保只处理有效的数据。
第六个 [提示词]
单元格
我要把df2作进一步处理,大陆洲为空值(包括空字符串)的记录直接筛选掉,然后统计出大陆洲各国每年的人口数量总和,并将处理后的数据存储回一个名为df3的DataFrame中。请生成Python代码。
解释:
这个提示词要求:
- 数据过滤:去除大陆洲为空或空字符串的记录,确保只处理有效的数据。
- 统计汇总:对数据按
大陆洲
和Year
进行分组,并计算每组的总人口。 - 存储结果:将处理后的结果存储到新的 DataFrame
df3
中。
AI需要生成一段代码来实现数据过滤和汇总。
生成的代码:
# 过滤掉大陆洲为空值或空字符串的记录
df_filtered = df2[df2['大陆洲'].notna() & (df2['大陆洲'] != '')]
# 按大陆洲和年份分组,计算人口总和
df3 = df_filtered.groupby(['大陆洲', 'Year'])['Population'].sum().reset_index()
这段代码首先过滤掉大陆洲为空的记录,然后按大陆洲和年份分组,计算每组的总人口。
3. 数据可视化:按大陆洲绘制人口趋势图
数据处理完毕后,接下来是数据可视化阶段。通过可视化人口趋势,我们能够清晰地比较不同大陆洲在不同时间点的人口变化。
3.1 Vega-Lite简介
Vega-Lite是一种强大的可视化工具,它允许我们以极少的代码创建美观的交互式图表。它特别适合商业分析师,用来快速清晰地展示数据洞察。接下来,我们将使用Vega-Lite语言创建一个折线图,展示各大陆洲从1960年到2023年的人口变化趋势。
3.2 创建折线图
利用处理好的DataFrame df3
,我们将创建一个折线图,具备以下特点:
- x轴表示年份。
- y轴表示人口数量。
- 颜色区分不同的大陆洲。
第7个 [提示词]
单元格解释
我已经完成了人口数据的加载和处理。现在,我想使用VegaLite语言绘制一个折线图,展示从1960年到2023年所有大陆洲的人口趋势线。x轴表示年份(Year),y轴表示人口数量(Population),并根据大陆洲名称进行颜色区分。数据来自df3变量。请生成相应的VegaLite JSON代码。
解释:
在这个提示词中,用户已经完成了人口数据的加载和处理,当前的任务是使用Vega-Lite语言来生成一个折线图,展示从1960年到2023年各大陆洲的人口趋势。以下是主要的需求:
- 目标图表:用户要求绘制的是一个折线图,用于展示不同大陆洲的年人口变化趋势。
- 数据来源:图表的数据来自
df3
DataFrame,这个数据框已经通过之前的步骤进行处理,包含了按大陆洲和年份分组的人口总和。 - 图表要求:
- x轴:表示年份(
Year
)。 - y轴:表示人口数量(
Population
)。 - 颜色区分:根据大陆洲名称(
大陆洲
)对不同大陆洲的人口趋势进行颜色区分。
- x轴:表示年份(
- Vega-Lite格式:用户希望AI生成对应的Vega-Lite JSON代码,Vega-Lite是一种简洁且强大的图表定义语言,特别适合用于交互式数据可视化。
生成的Vega-Lite JSON代码:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"description": "全球人口趋势(1960-2023)",
"width": 800,
"height": 500,
"data": {
"values": "df3" // 您的实际数据应替换此处
},
"mark": {
"type": "line",
"strokeWidth": 3,
"tooltip": true
},
"encoding": {
"x": {
"field": "Year",
"type": "quantitative",
"axis": {
"title": "年份",
"labelFlush": false
}
},
"y": {
"field": "Population",
"type": "quantitative",
"title": "人口数量",
"axis": {
"format": "~s" // 自动转换为百万/十亿单位
}
},
"color": {
"field": "大陆洲",
"type": "nominal",
"title": "国家/大洲",
"scale": {
"scheme": "category20" // 使用20色分类调色板
}
}
},
"config": {
"view": {
"stroke": "transparent"
},
"legend": {
"columns": 2,
"symbolType": "stroke",
"title": null
}
}
}
代码详解:
-
"$schema"
:指定Vega-Lite的版本和模式,确保JSON的结构符合Vega-Lite的规范。 -
"description"
:图表的描述信息,方便理解图表的主题。 -
"width"
和"height"
:定义图表的宽度和高度,确保图表的可视化效果适中。 -
"data"
:"values"
:指定数据源,应该替换为实际的df3
数据。df3
是已处理过的DataFrame,包含按大陆洲和年份分组的总人口数据。
-
"mark"
:"type": "line"
:表示图表类型为折线图。"strokeWidth": 3
:设置折线的宽度。"tooltip": true
:启用图表的悬浮提示功能,当用户将鼠标悬停在折线上时,会显示该点的详细信息。
-
"encoding"
:"x"
:x轴映射到数据中的Year
字段,表示年份。"y"
:y轴映射到数据中的Population
字段,表示人口数量,且格式化为可读的数值(自动转换为百万或十亿单位)。"color"
:通过颜色区分不同的大洲,field
为大陆洲
,type
为名义型(nominal
),即类别数据。使用category20
调色板为每个大洲分配不同的颜色。
-
"config"
:"view"
:设置视图的配置,移除边框(stroke: "transparent"
)。"legend"
:设置图例的配置,调整图例的排列方式(两列排列),去除标题。
总结:
这个提示词要求通过Vega-Lite创建一个清晰的折线图,展示从1960年到2023年所有大陆洲的人口趋势。Vega-Lite语言提供了灵活的编码方式,使得即使是复杂的数据也能通过少量代码高效可视化。在实际应用中,这种类型的图表对于展示时间序列数据、对比多个类别(如各大洲)的人口变化趋势非常有帮助。
3.3 自定义图表
在上面的图表中,我们展示了各大陆洲的人口变化趋势。x轴代表年份,y轴代表人口数量,颜色编码区分了不同的大洲,使得图表更加直观。
我们可以进一步自定义图表,例如调整坐标轴的标签、颜色方案,甚至聚焦特定的大洲或年份。
4. 结论:将数据转化为可操作的洞察
通过本文中的步骤,商业分析师可以将原始的人口数据转化为有价值的可视化信息。使用Python进行数据处理和Vega-Lite进行可视化,不仅能帮助我们高效地分析复杂数据,还能将分析结果呈现得更加清晰和易于理解。这种方法不仅适用于人口数据分析,还能用于任何其他需要清晰呈现数据趋势的领域。
将数据转化为信息,并进一步转化为知识,是商业智能中的关键技能。无论是探索人口趋势、财务数据,还是市场增长,掌握这些数据分析与可视化技巧将有助于你做出基于数据的决策,推动组织的未来发展。
我们在附录中提供了对应第二部分的交互式文档,您可以用自己的浏览器打开后运行提示词,体会七个提示词流程完成从数据到信息的自动化步骤。