水资源与农业水利用是全球面临的重要问题,尤其在经济快速发展的背景下,水资源的合理分配和使用成为各国政府和国际组织关注的焦点。粮农组织(FAO)通过AQUASTAT数据集提供了详细的水资源使用与农业数据,成为研究水资源管理和经济发展的宝贵资源。
本文将介绍如何通过数据分析技术,探索水资源使用与人均GDP之间的关系。通过对该数据集的处理和分析,能够揭示水资源在不同经济体中的分布规律和发展趋势,为实际政策的制定提供理论依据和数据支持。
案例概述
本案例数据地址 Food and Agriculture Organization 。
本教程基于一系列数据处理和分析案例,旨在帮助自学编程的读者通过实际数据分析步骤来掌握数据清洗、统计描述和业务应用分析的技术。这些脚本涵盖了从基础信息解释到业务需求分析的全过程,重点关注如何处理缺失数据、进行统计分析以及如何使用数据进行业务决策分析。读者可以从中学习到如何使用Python中的各种数据处理工具(如Pandas、Matplotlib、Seaborn)进行数据可视化、数据清理、数据挖掘以及建模等操作,帮助其在实际项目中实现高效的数据分析和决策支持。
模块名称 | 内容简介 | 所需技能 | 数据类型 | 应用场景 |
---|---|---|---|---|
案例概述 | 介绍了使用粮农组织(FAO)数据集进行水资源分析的背景与目的,并阐述了数据集中的核心变量及其含义。 | Python编程、数据处理 | 数据集(CSV格式) | 水资源管理、农业水利用分析 |
案例目标 | 目标是探索水的供应和使用是否与人均国内生产总值(GDP)相关,通过线性回归等方法进行探索性数据分析。 | 数据分析、假设检验 | 数值型数据(例如:人口、GDP) | 水资源和经济发展关系的探索 |
评价指标 | 主要通过数据完整性、变量之间的相关性以及目标变量(如人均GDP)的分布特征进行评估。 | 数据清理、统计描述 | 连续型数据(GDP、降水量等) | 数据质量评估、变量之间关系的评估 |
业务意义 | 为水资源管理和农业政策提供数据支持,帮助各国政府和组织做出更加科学的决策。 | 业务分析、数据可视化 | 时间序列数据、地理空间数据 | 政策制定、区域水资源管理、农业水利用优化等 |
数据详解
该数据集包含了与多个国家和地区的农业、土地使用和水资源相关的统计信息。数据包括多个领域,如总面积、人口数量、农业用地面积等,同时还包含了不同时间段的数据。通过分析这些数据,能够识别出不同国家和地区在农业、土地使用、以及水资源方面的差异和趋势。各字段的描述性统计提供了有用的信息,可以帮助理解不同变量的分布和变化趋势。
字段名称 | 类型/范围 | 描述信息 |
---|---|---|
country | 字符串(国家名称) | 数据记录的国家名称 |
region | 字符串(地区信息) | 该字段包含了国家所在的地区,如“亚洲”、“非洲”等 |
variable | 字符串(变量名称) | 该字段描述了测量的变量类型,如“total_area”表示总面积 |
variable_full | 字符串(变量描述) | 提供了对变量的详细描述,例如“Total area of the country (1000 ha)”表示国家总面积(1000公顷) |
time_period | 字符串(时间段) | 数据记录的时间段,例如“1958-1962”表示从1958年到1962年的时间段 |
year_measured | 数值(年份) | 实际测量数据的年份,例如“1962.0”表示1962年 |
value | 数值(变量数值) | 对应变量在特定时间段内的数值,如“65286.0”表示总面积的值 |
这段数据集涵盖了多个国家的农业及土地使用数据,通过对这些字段的深入分析,能够揭示各国在不同时期的变化趋势及其农业用地的规模。可以根据不同变量之间的关系进行进一步探索与建模。
案例分析
基础信息解释
这段代码旨在处理和分析来自粮农组织(FAO)的 AQUASTAT 数据集,探索水资源供应和使用与各国人均国内生产总值(GDP)之间的关系。通过导入所需的库、加载数据,并进行多种数据切片操作,探索不同国家、变量和时间段之间的关系。这段代码结合了数据预处理、变量研究、数据分析和可视化等步骤,最终生成一个面向自学编程的简洁、清晰的分析流程。
导入必要的库
get_ipython().run_line_magic('matplotlib', 'inline')
get_ipython().run_line_magic('config', "InlineBackend.figure_format='retina'")
import matplotlib as mpl
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import os, sys
import warnings
warnings.filterwarnings('ignore')
sns.set_context("poster", font_scale=1.3)
这一部分代码导入了数据分析所需的多个 Python 库,包括 matplotlib
和 seaborn
用于数据可视化,pandas
用于数据操作,numpy
用于数学计算等。warnings
用于忽略警告,sns.set_context
设置了 Seaborn 图表的显示参数。
加载数据集
data = pd.read_csv('aquastat.csv.gzip', compression='gzip')
这一行代码从一个压缩文件中读取 AQUASTAT 数据集,文件格式为 .csv.gzip
,并将其加载为一个 Pandas DataFrame。数据集包含了关于水资源使用、农业和经济等方面的信息。
查看数据的基本信息
data.head()
data.shape
data.info()
这些代码行展示了数据集的前几行、数据的形状(即行和列的数量)以及每一列的类型和缺失值情况。此步骤有助于初步了解数据的结构和质量,为后续处理提供基础。
研究变量
data[['variable','variable_full']].drop_duplicates()
这段代码展示了数据集中不同的变量名及其全名。drop_duplicates()
用于删除重复项,从而更清楚地显示出所有独特的变量。这一步有助于理解数据集中的各类指标,如总面积、耕地面积、人均国内生产总值等。
描述性统计分析
countries = data.country.unique()
len(countries)
代码用于获取数据集中包含的所有独特国家,并计算其总数。通过了解有哪些国家参与数据分析,分析者可以更清楚地了解数据集的覆盖范围。
时间段分析
time_period = data.time_period.nunique()
time_periods = data.time_period.unique()
这段代码获取了数据中所有不同的时间段及其总数。这是为了分析数据随时间的变化情况。时间段的划分是以 5 年为一个节点,从 1958 年开始。
时间切片操作
def time_slice(df, time_period):
df = df[df.time_period==time_period]
df = df.pivot(index='country', columns='variable', values='value')
df.columns.name = time_period
return df
time_slice
函数根据指定的时间段对数据进行切片,并将数据从长格式转换为宽格式(即每个国家成为一行,每个变量成为一列)。此操作帮助以时间为维度组织和查看数据。
按国家切片
def country_slice(df, country):
df = df[df.country==country]
df = df.pivot(index='variable', columns='time_period', values='value')
df.index.name = country
return df
country_slice
函数用于对某个特定国家的数据进行切片,查看该国家在不同时间段内的各个变量的变化情况。每个国家的数据按变量和时间段进行组织。
按变量切片
def variable_slice(df, variable):
df = df[df.variable==variable]
df = df.pivot(index='country', columns='time_period', values='value')
return df
variable_slice
函数用于根据特定变量(如总人口)对数据进行切片,将数据按国家和时间段进行组织。这帮助我们查看某一变量在所有国家和不同时间段的变化。
时间序列分析
def time_series(df, country, variable):
series = df[(df.country==country) & (df.variable==variable)]
series = series.dropna()[['year_measured', 'value']]
series.year_measured = series.year_measured.astype(int)
series.set_index('year_measured', inplace=True)
series.columns = [variable]
return series
time_series
函数通过选定特定的国家和变量,提取其在不同年份的时间序列数据。该函数还会处理缺失值,并将年份设为索引,以便后续进行趋势分析。
区域划分
data.region = data.region.apply(lambda x: simple_regions[x])
这行代码对数据中的区域(如亚洲、欧洲等)进行了重新分类。通过简化区域的分类,可以更方便地进行区域间的比较和模式识别。
通过区域切片
def subregion(data, region):
return data[data.region==region]
subregion
函数通过指定区域来从数据集中提取该区域的数据。这使得分析者能够聚焦于某个特定区域进行深入分析。
自动生成数据报告
import pandas_profiling
pandas_profiling.ProfileReport(time_slice(data, '2013-2017'))
通过 pandas_profiling
库生成关于数据集的详细报告。该报告包括变量的描述性统计、数据质量检查、缺失值分析等,有助于快速了解数据的结构和潜在问题。
缺失值数据的处理
这段代码通过加载数据集并进行数据质量评估,探索数据中的缺失值、变量间的关系、以及可能存在的数据问题。分析的核心是评估数据的完整性、变量之间的关系以及在不同时间段、不同国家或地区中丢失的数据。这些步骤有助于理解数据的质量,为后续的分析和建模工作提供基础。
get_ipython().run_line_magic('matplotlib', 'inline')
get_ipython().run_line_magic('config', "InlineBackend.figure_format='retina'")
import matplotlib as mpl
from matplotlib import pyplot as plt
import seaborn as sns
sns.set_context("poster", font_scale=1.3)
import folium
import os, sys
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import pivottablejs
import missingno as msno
import pandas_profiling
这段代码导入了多个常用的 Python 数据分析与可视化库,如 matplotlib
、seaborn
和 folium
用于绘图,pandas
用于数据处理,missingno
用于可视化缺失数据,pivottablejs
用于交互式数据透视表,pandas_profiling
用于生成数据概览报告。此外,warnings
被用来忽略一些不必要的警告。
加载数据集
data = pd.read_csv('aquastat.csv.gzip', compression='gzip')
这行代码将压缩的 CSV 文件读取到一个 Pandas DataFrame 中。数据集包含了与水资源使用、农业及经济发展相关的多维度数据,供进一步分析。
数据清洗和区域重分类
data.region = data.region.apply(lambda x: simple_regions[x])
这行代码通过 simple_regions
字典将数据中的复杂区域分类简化为更易于处理的几个大区,如“亚洲”、“欧洲”、“非洲”等。这样做能够帮助在后续分析中集中关注区域层面的趋势。
数据质量评估:缺失值可视化
recent = time_slice(data, '2013-2017')
msno.matrix(recent, labels=True)
这段代码通过 missingno.matrix
可视化了 2013-2017 年期间数据的缺失情况。缺失数据的模式能够帮助评估数据质量,识别哪些变量或时间段的数据缺失较多,进而考虑是否需要处理或删除这些数据。
缺失数据分析:水资源总量
msno.matrix(variable_slice(data, 'exploitable_total'), inline=False, sort='descending')
plt.xlabel('Time period')
plt.ylabel('Country')
plt.title('缺失的不同国家和时间段的可开发水资源总量数据 \n \n \n \n')
这行代码分析了“可开发水资源总量”这一变量的缺失数据情况。只有少数国家报告了这个变量的数据,并且这些数据大部分都缺失。因此,代码接着删除了该变量,以避免在后续分析中引入过多问题。
缺失数据分析:降雨指数
msno.matrix(variable_slice(data, 'national_rainfall_index'), inline=False, sort='descending')
plt.xlabel('Time period')
plt.ylabel('Country')
plt.title('缺失的各国和各时间段的国家降雨指数数据 \n \n \n \n')
这段代码展示了“全国降雨指数”变量的缺失数据情况,发现在2002年后该变量的数据几乎全部缺失。基于此,代码进一步删除了该变量的数据,以便优化数据集的质量。
分析不同地区的数据缺失情况
north_america = subregion(data, 'North America')
msno.matrix(msno.nullity_sort(time_slice(north_america, '2013-2017'), sort='descending').T, inline=False)
plt.title('Fraction of fields complete by country for North America \n \n')
这段代码通过 subregion
函数提取了“北美”地区的数据,并对这些数据进行缺失值可视化。它展示了该地区各国在2013-2017年期间的字段完整性,帮助识别哪些国家数据缺失较多。
对特定国家的缺失数据分析
msno.nullity_filter(country_slice(data, 'Bahamas').T, filter='bottom', p=0.1)
这段代码分析了“巴哈马”这一国家的缺失数据情况。通过过滤缺失数据,分析人员可以识别哪些字段的缺失最为严重,并探讨数据缺失的潜在原因。
按时间段分析缺失数据
fig, ax = plt.subplots(figsize=(16, 16))
sns.heatmap(data.groupby(['time_period', 'variable']).value.count().unstack().T , ax=ax)
plt.xticks(rotation=45)
plt.xlabel('Time period')
plt.ylabel('Variable')
plt.title('随着时间的推移,为每个变量报告数据的国家数量')
这段代码生成了一个热图,展示了随着时间的推移,每个变量在各个时间段中有多少个国家报告了数据。通过这种方式,分析者能够看到哪些时间段的数据更为完整,哪些变量的数据缺失较多。
数据概述报告:生成数据透视表
pivottablejs.pivot_ui(time_slice(data, '2013-2017'))
通过 pivottablejs
库,代码生成了一个交互式数据透视表,用户可以用它来更便捷地分析 2013-2017 年期间的数据。这个透视表帮助分析者深入了解各个变量、时间段和国家之间的关系。
这段代码通过对数据的缺失值、变量关系、时间维度及地区维度的分析,帮助理解数据的质量状况。它不仅显示了数据中缺失的模式,还帮助清理了无效的数据,从而为后续的深入分析奠定了基础。
统计描述数据
这段代码涉及到对 AQUASTAT 数据集的探索性数据分析(EDA)。它涵盖了从数据的基本统计描述、缺失数据的可视化,到对不同变量进行更深入的分析,包括人口、可再生水资源等。这一过程通过多种方式对数据进行探索和清洗,旨在帮助发现潜在的模式和数据质量问题。
代码导入了多个用于数据分析、可视化、交互式分析以及缺失值处理的库,如 matplotlib
, seaborn
, pandas
, missingno
, ipywidgets
等。然后,它对 aquastat.csv.gzip
文件中的数据进行了加载和预处理,并通过简化区域分类、删除部分无效数据等步骤对数据进行了清洗。
数据预处理和区域简化
data = pd.read_csv('aquastat.csv.gzip', compression='gzip')
data.region = data.region.apply(lambda x: simple_regions[x])
data = data.loc[~data.variable.str.contains('exploitable'), :]
data = data.loc[~(data.variable == 'national_rainfall_index')]
通过这段代码,数据集的区域字段被重新分类为更简洁的地区名称,去除了“可利用水资源”和“国家降雨指数”这两个变量的数据。这样清洗后的数据更易于进行后续的分析。
人口数据分析
recent[['total_pop', 'urban_pop', 'rural_pop']].describe().astype(int)
这段代码展示了 2013-2017 年期间的总人口、城市人口和农村人口的基本统计数据。接下来,通过对这些数据的排序和描述性统计分析,发现某些国家的农村人口数据存在问题,推测这可能是由于数据的偏差或错误。
偏度和峰度分析
recent[['total_pop', 'urban_pop', 'rural_pop']].apply(scipy.stats.skew)
recent[['total_pop', 'urban_pop', 'rural_pop']].apply(scipy.stats.kurtosis)
通过计算偏度和峰度,分析发现人口数据呈现出较强的偏斜和峰度,表明这些数据并未完全遵循正态分布,可能存在离群值。这为后续对数据进行变换提供了依据。
直方图和对数变换
fig, ax = plt.subplots(figsize=(12, 8))
ax.hist(recent.total_pop.values, bins=50)
ax.set_xlabel('Total population')
ax.set_ylabel('Number of countries')
ax.set_title('Distribution of population of countries 2013-2017')
生成的直方图表明,人口数据具有显著的偏斜。为了解决这一问题,对人口数据进行了对数变换:
recent[['total_pop']].apply(np.log).apply(scipy.stats.skew)
通过对数变换,数据的偏斜度有所降低,但仍然存在峰度问题。数据经过变换后,更适合用于建模分析,尤其是需要正态分布假设的模型。
标准化处理
recent['population_density'] = recent.total_pop.divide(recent.total_area)
通过计算人口密度,将总人口除以总面积,从而得到每个国家的平均人口密度。这为后续的分析提供了有价值的参考。
特定国家的分析
plt.plot(time_series(data, 'United States of America', 'total_pop'))
这段代码通过绘制美国人口随时间变化的趋势图,帮助确认数据单位和趋势是否符合预期,提供了对美国人口数据变化的直观理解。
区域性分析
north_america = time_slice(subregion(data, 'North America'), '1958-1962').sort_values('total_pop').index.tolist()
for country in north_america:
plt.plot(time_series(data, country, 'total_pop'), label=country)
对北美地区各国的人口变化进行可视化,展示了人口随时间的变化趋势。为了便于观察,代码将每个国家的人口数据标准化,使得每个国家的起始人口变化从 100% 开始。
可再生水资源的分布
plot_hist(recent, 'total_renewable', bins=50, xlabel='Total renewable water resources ($10^9 m^3/yr$)', ylabel='Number of countries', title='Distribution of total renewable water resources, 2013-2017')
通过直方图,展示了 2013-2017 年间各国的可再生水资源的分布情况,进一步了解了水资源的区域差异。
交互式分析
hist_over_var(recent, recent.columns, bins=20)
这一部分利用 ipywidgets
提供了交互式的变量选择功能,使得分析者可以选择不同的变量进行实时的直方图绘制。通过这种方式,可以更加灵活地探索数据集中的各类变量。
业务应用需求分析
这段代码的核心目的是通过多种可视化和统计分析方法评估不同变量与目标变量(人均GDP)之间的关系。代码涵盖了从简单的散点图到复杂的联合图、相关性分析以及基于分组的箱型图和直方图等各种数据可视化方式。它提供了对数据的深入理解,揭示了变量间的关系及其分布特征。
首先,代码加载了必需的库,包括 matplotlib
和 seaborn
用于绘图,pandas
用于数据处理,missingno
用于缺失值可视化,pivottablejs
和 ipywidgets
用于交互式数据分析。然后,数据集(aquastat.csv.gzip
)被加载,并进行了预处理,包括简化地区分类和删除不相关的变量。
散点图绘制
plt.scatter(recent.seasonal_variability, recent.gdp_per_capita)
plt.xlabel('Seasonal variability');
plt.ylabel('GDP per capita ($USD/person)');
通过这段代码,分析了季节性变化与人均GDP之间的关系。散点图展示了两者之间的潜在关系,帮助识别数据点的分布和趋势。
自定义散点图函数
def plot_scatter(df, x, y, xlabel=None, ylabel=None, title=None,
logx=False, logy=False, by=None, ax=None):
定义了一个通用的散点图绘制函数,支持根据不同变量绘制散点图并进行对数变换,进一步分析变量间的关系。通过 by
参数,代码还允许按类别分组,使用不同的颜色表示不同类别。
联合图
g = sns.JointGrid(x="seasonal_variability", y="gdp_per_capita", data=recent, ylim=gdpr)
g.ax_marg_x.hist(recent.seasonal_variability, range=svr)
g.ax_marg_y.hist(recent.gdp_per_capita, range=gdpr, bins=gdpbins, orientation="horizontal")
g.plot_joint(plt.hexbin, gridsize=25)
联合图(JointGrid
)将散点图和两个变量的边际分布(直方图)结合起来,帮助分析变量之间的关系以及各自的分布情况。使用 hexbin
绘制了数据的二维热图,以便更清晰地观察变量之间的聚集趋势。
相关性分析
recent_corr = recent.corr().loc['gdp_per_capita'].drop(['gdp','gdp_per_capita'])
通过计算皮尔逊相关系数,评估了 gdp_per_capita
与其他变量之间的线性关系。代码利用条形图展示了与人均GDP相关性较高和较低的变量,进一步帮助识别影响GDP的关键因素。
分类变量与连续变量之间的关系
recent[['gdp_bin','total_pop_access_drinking']].boxplot(by='gdp_bin');
人均GDP被划分为五个分位,并通过箱型图展示了每个分位的国家在饮用水普及率(total_pop_access_drinking
)方面的分布。此分析揭示了不同经济水平国家在基础设施方面的差异。
箱型图函数
def mult_boxplots(df, variable, category,
xlabel=None, ylabel=None, title=None,
ylim=None):
定义了一个通用的箱型图函数,帮助分析者查看不同类别(如按GDP分组)下连续变量(如洪水发生频率)的分布情况。通过箱型图,分析者可以快速识别不同类别间的变异性和潜在异常值。
GDP分位分析
recent['gdp_bin'] = pd.qcut(recent.gdp_per_capita, 5, capita_bins)
将人均GDP分为五个类别,并通过箱型图和直方图分析每个类别中其他变量的分布。这种分组方式有助于揭示不同经济水平下国家在水资源、基础设施等方面的差异。
直方图绘制
plot_hist(recent, 'gdp_per_capita', xlabel='GDP per capita ($)',
ylabel='Number of countries',
title='Distribution of GDP per capita, 2013-2017');
使用直方图展示了2013-2017年间各国人均GDP的分布,进一步揭示了其集中程度和偏态特征。
总结
通过粮农组织(FAO)提供的AQUASTAT数据集,本案例深入分析了水资源的使用与经济发展之间的关系,尤其是如何通过各国的水资源和农业用水数据与人均GDP之间的联系展开探讨。数据清洗、缺失值处理、描述性统计及可视化分析为探索这些关系提供了坚实基础。多种数据分析方法帮助识别了水资源管理中的关键因素,并为农业水利用和经济发展提供了支持。
未来的研究可以通过进一步的模型构建来预测水资源短缺的趋势,并根据区域性分析对不同经济体制定更为精准的水资源管理政策。同时,随着数据的不断丰富和处理技术的进步,这类分析有望为全球水资源管理与保护提供更有力的决策支持。