19. 案例分析:利用世界银行人口数据集进行北美地区人口增长研究

原始图表透视处理与绘制

第一部分、案例分析:利用世界银行人口数据集进行北美地区人口增长研究 作为一名在Global Demographic Analysis Center(全球人口分析中心,简称GDAC)工作的研究人员,假设您希望对北美地区的人口增长趋势进行深入研究。本文将引导您通过世界银行开放数据平台(World Bank Open Data)获取相关数据,并利用电商记交互式文档进行分析和可视化。 一、数据集概览 世界银行开放数据平台(World Bank Open Data)提供了全球各国从1960年到2023年的人口数据。这些数据依据联合国人口司《世界人口展望:2024年修订版》、各国国家统...…
19. 案例分析:利用世界银行人口数据集进行北美地区人口增长研究
分享此内容

第一部分、案例分析:利用世界银行人口数据集进行北美地区人口增长研究

作为一名在Global Demographic Analysis Center(全球人口分析中心,简称GDAC)工作的研究人员,假设您希望对北美地区的人口增长趋势进行深入研究。本文将引导您通过世界银行开放数据平台(World Bank Open Data)获取相关数据,并利用电商记交互式文档进行分析和可视化。

Screenshot%20from%202025-04-22%2020-45-42

一、数据集概览

世界银行开放数据平台(World Bank Open Data)提供了全球各国从1960年到2023年的人口数据。这些数据依据联合国人口司《世界人口展望:2024年修订版》、各国国家统计办公室的统计数据库和出版物、欧洲统计局人口统计数据以及联合国统计司人口和生命统计报告(各年份)等权威来源进行整理和发布,采用知识共享署名4.0国际许可协议(CC BY-4.0)授权。

为了方便研究,我们已在本文附录下提供了清洗后的数据集population.csv,以及对应的交互式文档。该数据集包含国家名称(Country Name)、年份(从1960到2023)以及对应的人口数量等信息。

Untitled-2025-04-22-00

二、原始图表透视处理与绘制

首先介绍一个三段式提示词框架,您可以用于任何数据分析场景。

在开始分析之前,您可以先尝试绘制一个原始图表,展示从1960年到2023年所有国家和大洲的人口趋势线。以下是使用电商记交互式文档编写Deepseek提示词来自动生成图表代码的基本步骤。

(一)三段式编写Deepseek提示词

  1. 数据加载提示词

    • 任务:从本地CSV文件加载人口数据
    • 提示词:
      我需要从pyodide文件系统的根目录加载一个名为population.csv的CSV文件。该文件包含从1960年到2023年各国的人口数据,其中第一列是国家名称(Country Name)、其它每一列都是具体年份的各国人口数量。表格示例参看《资料》。请生成相应的代码,使用pandas库读取这个CSV文件,并将其存储到一个名为df的DataFrame中。
    • 在此之前,用户应将population.csv上传到pyhon内存文件系统(pyodide MemFS)中。

      Untitled-2025-04-22-02

      Untitled-2025-04-22-01

      Untitled-2025-04-22-04

  2. 数据预处理提示词

    • 任务:将数据透视,将年份作为独立列,并确保年份列为整数类型
    • 提示词:

      已经成功加载了人口数据(参看《各国人口数据示例》)到DataFrame df中。现在,我需要将数据进行透视处理,将年份作为独立的列(列名为Year),同时保留Country Name列。此外,我还需要将Year列的数据类型转换为整数。请生成相应的代码,使用pandas库来完成这一任务,并将处理后的数据存储回一个名为df2的DataFrame中。

      Untitled-2025--04-22-05

      运行这段Python代码后,DataFrame变量“df2”存放了我们下一步要显示的数据。

  3. 图表绘制提示词

    • 任务:使用VegaLite语言绘制所有国家和大洲的人口趋势线图表
    • 提示词:
      我已经完成了人口数据的加载和预处理。现在,我想使用VegaLite语言绘制一个折线图,展示从1960年到2023年所有国家和大洲的人口趋势线。x轴表示年份(Year),y轴表示人口数量(Population),并根据国家或大洲名称(Country Name)进行颜色区分。请生成相应的VegaLite JSON代码。

      Untitled-2025-04-22-07

Untitled-2025-04-22-06

4.总结

我们在附录中提供了对应第二章的交互式文档,您可以用自己的浏览器打开后运行提示词,体会“数据加载、数据预处理、图表绘制”这种三段式提示词框架生成代码的方便之处。

Untitled-2025-04-22-08

(二)问题与改进方向

当您执行上述提示词生成的代码并绘制出原始图表后,您可能会发现图表存在以下问题:

  • 国家过多:图表中包含了全球所有国家和大洲的数据,导致线条过于密集,难以分辨北美地区的人口趋势。
  • 颜色过多:由于国家和大洲数量庞大,图表使用了过多的颜色来区分不同的线条,使得图表视觉效果混乱,难以解读。
  • 焦点不明确:图表没有聚焦于北美地区,无法直观地展示该地区的人口增长情况。

为了解决这些问题,我们可以借鉴 DIKW 金字塔(Data - Information - Knowledge - Wisdom,数据 - 信息 - 知识 - 智慧)模型,从第一步“将数据转化为信息”开始,逐步优化我们的分析和可视化过程。

第二部分、从数据到信息的提示词流程:分析与可视化按大陆洲划分的全球人口数据

在本文中,我们将探讨如何使用七个AI提示词构成从数据到信息的流程,自动生成Python分析并可视化按大陆洲划分的全球人口数据,数据范围从1960年到2023年。我们将展示如何使用pandas进行数据处理,并利用Vega-Lite语言进行可视化,帮助商业分析师更好地理解数据趋势。

1. 引言:AI数据分析在商业中的重要性

数据驱动的决策已经成为商业智能的核心。对于商业分析师和数据科学家而言,如何将原始数据转化为有用的信息是一项至关重要的技能。数据可视化是分析大量数据的有效方法,它能够帮助我们发现潜在的趋势、模式和洞察力。

在本文中,我们将使用全球不同国家的人口数据,数据从1960年到2023年,内容包括国家名称、年份以及每年的人口数。我们将重点对这些数据进行大陆洲分组处理,转化为易于分析的长格式数据,并最终通过图表展示各大陆洲的人口变化趋势。

每个 [提示词] 单元格中的AI提示词都针对数据分析过程中的一个特定步骤,目的是为下一步生成相应的Python代码和VegaLite JSON代码。用户只需按顺序点击运行提示词单元格、Python单元格、Vega单元格即可。通过这种方式,AI能够帮助用户高效地处理数据、进行分析,并生成可视化图表。

Untitled-2025-04-23-02

visualization%20%2814%29

资料单元格:《各国人口数据示例》

在第一个[提示词]单元格之前,有一个[资料]单元格,内容提供了一个关于各国人口数据的示例,数据从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:类似于“东非和南非”,这是代表“西非和中非”的区域。此数据是该区域所有国家人口的总和。

用途:

这个数据集的结构说明了如何组织按年份和地理位置(国家或区域)划分的时间序列数据。通过这种结构,分析师能够:

  1. 比较不同国家或地区在不同年份的人口增长情况。
  2. 对多个国家/地区的数据进行汇总与分析,例如统计整个区域的总人口。
  3. 进一步应用数据清洗、转换和可视化技术,以便生成关于人口变化趋势的有意义的图表。

在实际应用中的意义:

在实际数据分析过程中,我们可以将类似的CSV数据导入到Python中进行处理,使用像 pandas 这样的库来读取数据并进行清理(例如处理缺失数据、处理不同国家/地区的命名方式等),然后对数据进行进一步分析(例如计算每个大陆洲的年度人口变化趋势,绘制折线图等)。

2. 数据处理:加载与转换数据

任何数据分析项目的第一步都是获取并准备数据。以下是我们处理人口数据的步骤概览。

2.1 加载数据

我们首先加载存储在CSV文件中的人口数据。该数据的第一列是国家名称,接下来的每一列是各年份的各国人口数据。

第一个 [提示词] 单元格

我需要从pyodide文件系统的根目录加载一个名为population.csv的CSV文件。该文件包含从1960年到2023年各国的人口数据,其中第一列是国家名称(Country Name)、其它每一列都是具体年份的各国人口数量。表格示例参看《资料》。请生成相应的代码,使用pandas库读取这个CSV文件,并将其存储到一个名为df的DataFrame中。

解释:

这是一个请求生成 Python 代码的提示词。用户的需求是:

  1. 加载数据:用户需要从文件系统中加载一个名为 population.csv 的CSV文件。这个文件包含的内容是各国的年度人口数据。
  2. 数据格式:CSV文件的第一列是国家名称,后续列表示从1960年到2023年各年份的各国人口数据。
  3. 数据处理:用户希望使用 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 中提取所有的国家名称。具体需求是:

  1. 列出国家名称:提取 df 中名为 “Country Name” 的列,并将其转换为一个列表。
  2. 数据来源:这部分操作是基于用户之前加载的数据框 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。

解释:

这个提示词的目的是:

  1. 映射国家到大陆洲:根据国家/地区的名称,将其对应到地理位置上的大陆洲(东亚、南亚、北美等)。对于无法明确分类的条目,需要将其映射为空字符串。
  2. 生成 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中增加一个字段“大陆洲”。

解释:

这个提示词要求:

  1. 使用字典进行映射:使用先前生成的 country_to_continent 字典,将每个国家名称映射到大陆洲。
  2. 增加新列:在 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中。

解释:

这个提示词要求将数据从宽格式转换为长格式。具体步骤是:

  1. 数据透视:将每一年的列转换为单独的行,新的列包括 YearPopulation,保持 Country Name大陆洲 两列。
  2. 数据格式转换:将 Year 列的数据类型转换为整数,以便进行后续分析。
  3. 存储到新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代码。

解释:

这个提示词要求:

  1. 数据过滤:去除大陆洲为空或空字符串的记录,确保只处理有效的数据。
  2. 统计汇总:对数据按 大陆洲Year 进行分组,并计算每组的总人口。
  3. 存储结果:将处理后的结果存储到新的 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年各大陆洲的人口趋势。以下是主要的需求:

  1. 目标图表:用户要求绘制的是一个折线图,用于展示不同大陆洲的年人口变化趋势。
  2. 数据来源:图表的数据来自 df3 DataFrame,这个数据框已经通过之前的步骤进行处理,包含了按大陆洲和年份分组的人口总和。
  3. 图表要求
    • x轴:表示年份(Year)。
    • y轴:表示人口数量(Population)。
    • 颜色区分:根据大陆洲名称(大陆洲)对不同大陆洲的人口趋势进行颜色区分。
  4. 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
    }
  }
}

代码详解:

  1. "$schema":指定Vega-Lite的版本和模式,确保JSON的结构符合Vega-Lite的规范。

  2. "description":图表的描述信息,方便理解图表的主题。

  3. "width""height":定义图表的宽度和高度,确保图表的可视化效果适中。

  4. "data"

    • "values":指定数据源,应该替换为实际的 df3 数据。df3 是已处理过的DataFrame,包含按大陆洲和年份分组的总人口数据。
  5. "mark"

    • "type": "line":表示图表类型为折线图。
    • "strokeWidth": 3:设置折线的宽度。
    • "tooltip": true:启用图表的悬浮提示功能,当用户将鼠标悬停在折线上时,会显示该点的详细信息。
  6. "encoding"

    • "x":x轴映射到数据中的 Year 字段,表示年份。
    • "y":y轴映射到数据中的 Population 字段,表示人口数量,且格式化为可读的数值(自动转换为百万或十亿单位)。
    • "color":通过颜色区分不同的大洲,field大陆洲type 为名义型(nominal),即类别数据。使用 category20 调色板为每个大洲分配不同的颜色。
  7. "config"

    • "view":设置视图的配置,移除边框(stroke: "transparent")。
    • "legend":设置图例的配置,调整图例的排列方式(两列排列),去除标题。

总结:

这个提示词要求通过Vega-Lite创建一个清晰的折线图,展示从1960年到2023年所有大陆洲的人口趋势。Vega-Lite语言提供了灵活的编码方式,使得即使是复杂的数据也能通过少量代码高效可视化。在实际应用中,这种类型的图表对于展示时间序列数据、对比多个类别(如各大洲)的人口变化趋势非常有帮助。

visualization%20%2814%29

3.3 自定义图表

在上面的图表中,我们展示了各大陆洲的人口变化趋势。x轴代表年份,y轴代表人口数量,颜色编码区分了不同的大洲,使得图表更加直观。

我们可以进一步自定义图表,例如调整坐标轴的标签、颜色方案,甚至聚焦特定的大洲或年份。

4. 结论:将数据转化为可操作的洞察

通过本文中的步骤,商业分析师可以将原始的人口数据转化为有价值的可视化信息。使用Python进行数据处理和Vega-Lite进行可视化,不仅能帮助我们高效地分析复杂数据,还能将分析结果呈现得更加清晰和易于理解。这种方法不仅适用于人口数据分析,还能用于任何其他需要清晰呈现数据趋势的领域。

将数据转化为信息,并进一步转化为知识,是商业智能中的关键技能。无论是探索人口趋势、财务数据,还是市场增长,掌握这些数据分析与可视化技巧将有助于你做出基于数据的决策,推动组织的未来发展。

我们在附录中提供了对应第二部分的交互式文档,您可以用自己的浏览器打开后运行提示词,体会七个提示词流程完成从数据到信息的自动化步骤。

Screenshot%20from%202025-04-23%2015-26-08