中国各省份的经济产业结构差异分析
前言
中国各省份的经济产业结构具有一定的差异性。这种差异性可能受到自然条件、社会环境、历史因素的多方面影响。为了更好的理解经济发展规律,基于国家统计局整理的1992年到2020年的中国各省份分行业的GDP数据,对各地区的经济产业结构差异性进行分析。
摘要
中国各省份的经济产业结构存在差异性。以2020年为例:
- 以中国自然地理的自西向东,各地区的工业占GDP比重逐渐上升,农林牧渔业占比逐渐减少。
- 有少数省份的经济产业结构非常特殊,如有着最高的农林牧渔业占比的黑龙江和海南、以及有着最高建筑业占比的西藏。
中国各省份的经济产业结构的变化存在差异性。观察从2014年到2019年的变化:
- 以服务业为主的其他行业的增长是这几年各省份的普遍的主要拉动增长因素。省份间差异主要体现在服务业和工业的拉动增长的水平上。这方面存在较明显的南北和东西地理差异。
数据说明
根据数据源的划分,行业分为
- 农林牧渔业
- 工业
- 建筑业
- 批发和零售业
- 交通运输仓储邮政业
- 住宿和餐饮业
- 房地产业
- 金融业
- 其他行业
这里的其他行业,主要包括一些服务业行业。根据国民经济行业分类(GB/T 4754—2017)应该包括:
- 信息传输、软件和信息技术服务业
- 租赁和商务服务业
- 科学研究和技术服务业
- 水利、环境和公共设施管理业
- 居民服务、修理和其他服务业
- 教育
- 卫生和社会工作
- 文化、体育和娱乐业
- 公共管理、社会保障和社会组织
- 国际组织
注意,下文中提到的其他行业,均是这里定义的其他行业,而非为指其他的行业。为避免歧义,对其他行业都使用粗体表示。
环境和数据准备
import re
import pandas as pd
import altair as alt
from matplotlib import pyplot as plt
data_path = "/home/mw/input/12414215505/1992-2020年中国各省份分行业GDP增加值.csv"
df = pd.read_csv(data_path)
def parse_region(x):
_x = re.sub(r"[\W\d]","",x)
if _x[:3] in ["黑龙江","内蒙古"]:
return _x[:3]
else:
return _x[:2]
df["year"] = df["year"].map(lambda x:int(str(x).replace("年","")))
df["region"] = df["region"].map(parse_region)
df.head()
df['industry']
经济产业结构的地区差异
各省的GDP排名是怎么样的?
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline
t1 = Timeline()
for i in range(1992, 2021):
sub_df = df.query(f"year == {i}").groupby("region").agg(gdp=("gdp","sum")).round(0)
sub_df = sub_df.sort_values("gdp",ascending=True).tail(15)
regions = sub_df.index.values.tolist()
gdp_values = sub_df["gdp"].values.flatten().tolist()
gdp_values_with_color = [opts.BarItem(
name=regions[i],
value=v
) for i,v in enumerate(gdp_values)]
bar = (
Bar()
.add_xaxis(regions)
.add_yaxis("GDP(亿元)",gdp_values_with_color , label_opts=opts.LabelOpts(position="right"))
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts("各省份GDP排名Top15(时间: {} 年)".format(i)),
xaxis_opts=opts.AxisOpts(max_=120000)
)
)
t1.add(bar, "{}年".format(i))
t1.add_schema(play_interval=600,is_loop_play=False)
t1.render_notebook()
上图显示了中国各省份GDP排名从1992年到2020年的变化,许多省份的GDP在此期间发生了数十倍的增长。
其中,在1995年到2020年的16年时间里,GDP排名前5的省份一直保持不变,体现了经济强省在经济发展上的稳定性。
各省的经济产业结构有什么差异?
下面以不同行业对GDP的占比来分析经济产业结构。
# 构建统一排序的行业字段列表,用于保证后续可视化效果的一致
SORTED_INDUSRY_COLUMNS = df.groupby("industry").agg({"gdp":"sum"}).sort_values("gdp",ascending=False).index.values.tolist()
from pyecharts.charts import Bar
def province_gdp_stack_bar():
cdf = df.query("year == 2020").pivot(index="region",columns="industry",values="gdp")
cdf = cdf.assign(gdp_sum=cdf.sum(axis=1)).sort_values("gdp_sum").drop("gdp_sum",axis=1)
bar = Bar(init_opts=opts.InitOpts(width="800px",height="700px")).add_xaxis(list(cdf.index.values))
for column in SORTED_INDUSRY_COLUMNS:
bar.add_yaxis(column,list(cdf[column].values),stack="gdp")
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).reversal_axis().set_global_opts(
title_opts=opts.TitleOpts(title="2020年各省经济产业结构分布"),
legend_opts=opts.LegendOpts(pos_bottom="20%",pos_right="10%",orient="vertical",selected_mode="multiple"),
)
return bar
province_gdp_stack_bar().render_notebook()
可以看出
- 各省的GDP的行业构成普遍以工业和其他行业为主。
- 上海市、北京市、天津市的农林牧渔业占比非常低,但上海市和北京市有着较高的金融行业占比。而北京市更是有着非常大比例的其他行业占比。
from pyecharts.charts import Bar
def province_gdp_norm_stack_bar():
cdf = df.query("year == 2020").pivot(index="region",columns="industry",values="gdp")
cdf = cdf.assign(gdp_sum=cdf.sum(axis=1)).sort_values("gdp_sum").drop("gdp_sum",axis=1)
cdf = ((cdf.T/cdf.sum(1)).T).round(4)
bar = Bar(init_opts=opts.InitOpts(width="800px",height="700px")).add_xaxis(list(cdf.index.values))
for column in SORTED_INDUSRY_COLUMNS:
bar.add_yaxis(column,list(cdf[column].values),stack="gdp")
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False)).reversal_axis().set_global_opts(
title_opts=opts.TitleOpts(title="2020年各省的经济产业结构占比"),
legend_opts=opts.LegendOpts(pos_bottom="20%",pos_right="0",orient="vertical",selected_mode="multiple"),
)
return bar
province_gdp_norm_stack_bar().render_notebook()
可以看到:
- 北京有着最高的其他行业的占比,而工业的占比较低。
- 黑龙江省和海南省有着最高的农林牧渔业占比。
- 西藏有着最高的建筑业占比。
region_gdp_2020 = df.query("year == 2020").pivot(index="region",columns="industry",values="gdp")
region_gdp_per_2020 = (region_gdp_2020.T/region_gdp_2020.sum(axis=1)).T
region_gdp_per_2020.head(2)
plt.figure(figsize=(16,5))
region_gdp_per_2020.boxplot()
plt.title("各个行业在各省的GDP占比分布箱线图",fontdict={"size":16})
从各个行业的角度来看:
- 工业在各省的平均占比最高,达到30%左右。约75%的省份能够达到25%到33%之间的比例,最高能够达到38%。其中有三个省份占比非常低,只有10%左右。参照前面的图表可以发现是西藏、北京和海南三个省份。
- 其他行业的平均占比为23%左右,75%的省份都在22%到26%之间,各省之间差异相对工业来说更小。
- 剩余的各个行业的平均占比都在10%以下。
为了更好的理解各省的经济产业结构差异,下面对各省的经济结构进行聚类,将省份划分到几个组中。
各省的经济产业结构可以归为几组?
首先使用PCA对数据进行降维
from sklearn.decomposition import PCA
n_dim = 3
pca = PCA(n_components=n_dim)
X = region_gdp_per_2020.values
pca.fit(X)
region_gdp_per_2020_pca = pd.DataFrame(pca.transform(X),columns=[f"dim{i}" for i in range(1,n_dim+1)],index=region_gdp_per_2020.index.values)
然后使用层次聚类对降维后的数据进行聚类
from scipy.cluster import hierarchy
from matplotlib import pyplot as plt
def draw_dendrogram(data, featureNames):
model = hierarchy.linkage(data, "ward")
# print(c)
plt.figure(figsize=(16, 9))
plt.title("地区之间的经济产业结构层次聚类图")
# plt.xlabel("distance")
plt.ylabel("keyword")
hierarchy.dendrogram(
model,
leaf_rotation=0,
leaf_font_size=8.0,
labels=featureNames,
orientation="right",
)
plt.show()
return model
model = draw_dendrogram(region_gdp_per_2020_pca.values,region_gdp_per_2020_pca.index.values)
最后根据聚类结果进行分组统计。这里设定分为7组。
gtable = region_gdp_per_2020.assign(
group = hierarchy.cut_tree(model,7)+1
).sort_values("group")
def get_group_stats(table):
group_stats = table.groupby("group").mean().round(2)
group_member = table.reset_index().groupby("group").agg(members=("region",lambda x:",".join(x)))
return pd.concat([group_stats,group_member],axis=1)
get_group_stats(gtable)
在分成7组之后,我们看到:
有些组只有一两个省份,例如第1组只有上海和天津,第4组只有北京。这说明这些省份的经济产业结构和其他省份差异很大。
而大部分的省份被归到了第2、3、5组。
- 第 2 组:以新疆、青海、广西、四川等西部省份为主,特点是平均26%的工业比例和13%的农林牧渔业比例。
- 第 3 组:以河南、河北、安徽、江西等中部省份为主,特点是平均33%的工业比例和9%的农林牧渔业比例。
- 第 5 组:包括广东、江苏、浙江、陕西,特点是平均最高的36%工业比例和较低的5%的农林牧渔业比例。
由此可见,省份之间的产业结构差异主要体现工业比例和农林牧渔业比例上,且有明显的线性关系。
from sklearn.linear_model import LinearRegression
def lrfit():
lr = LinearRegression()
sub_table = gtable.query("group in [2,3,5]")
X,y = sub_table[["农林牧渔业"]].values,sub_table["工业"].values
lr.fit(X,y)
print(f"Score: {lr.score(X,y)}")
print(f"工业 = {lr.coef_[0]:.2f} X 农林牧渔业 + {lr.intercept_:.2f}")
lrfit()
通过观察图表以及进行线性回归的拟合,可以发现工业和农林牧渔业在第2、3、5组代表的大多数(25/31)省份中,存在明显的线性关系。可以理解为每增加1%的农林牧渔业占比,则会使得工业大约减少1%的占比,工业和农林牧渔业的占比之和保持着约40%的水平。这或许体现了二者在一些稀缺资源上存在着竞争关系。抑或是剩余的行业的比例之和总是稳定在60%左右,使得工业和农林牧渔业只能共享40%。
下面是具体看看后各个省份的经济产业占比图
import re
from pyecharts import options as opts
from pyecharts.charts import Map
def province_group_map():
map_chart = Map()
# for group in set(gtable["group"].values):
# sub_gtable = gtable.query(f"group == {group}")
data = [list(x) for x in zip(gtable.index.values,gtable["group"].values * 1.0)]
map_chart.add(f"分组", data, maptype="china", is_roam=False,is_map_symbol_show=False,label_opts=opts.LabelOpts())
custom_pieces = [{"value":i,"label":f"{i}组"} for i in range(1,8)]
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="中国经济产业结构分组地图"),
visualmap_opts=opts.VisualMapOpts(max_=7,is_piecewise=True,split_number=7,pieces=custom_pieces,pos_bottom="20%",pos_right="10%"),
legend_opts=opts.LegendOpts(is_show=False)
)
return map_chart.render_notebook()
province_group_map()
从地图上可以发现:
- 同一个分组的省份在地理上具有一定的连续性,西部省份多归为第2组,其有着较高的农业占比。中部省份多归为第3组,农业占比下降而工业占比上升。这体现了自然地理对于经济的影响。
- 上海、天津、北京等直辖市迥异于周边的经济结构,体现了这些直辖市的政策对于经济的重要影响。
地区经济产业结构的历史变化差异
之前的分析都是针对2020年的横截面分析。后面将对经济结构的历史数据进行回溯,比较不同地区经济行业结构的历史变化差异。
从具体省份看经济产业结构的历史变化
def display_region_history(region_name):
cdf = df.query(f"region == '{region_name}'").pivot(index="year",columns="industry",values="gdp").sort_index()
bar = Bar().add_xaxis(cdf.index.values.tolist())
for column in SORTED_INDUSRY_COLUMNS:
bar.add_yaxis(column, cdf[column].values.tolist(),stack="gdp")
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=opts.TitleOpts(title=f"1992-2020年逐年GDP经济结构变化 - {region_name}"),
legend_opts=opts.LegendOpts(pos_bottom="30%",pos_left="20%",orient="vertical",selected_mode="multiple"),
)
return bar.render_notebook()
display_region_history("黑龙江")
display_region_history("广东")
display_region_history("青海")
display_region_history("西藏")
为了更加量化不同行业对于GDP增长的影响,下面重点分析拉动增长率这个指标。
拉动增长率
局部的增长对于整体经济的增长的影响经常使用增长贡献率和拉动增长率来表示。
增长贡献率贡献率局部的增量整体的增量拉动增长率拉动率局部的增量整体的基期量增长贡献率整体增长率增长贡献率=贡献率=局部的增量整体的增量拉动增长率=拉动率=局部的增量整体的基期量=增长贡献率×整体增长率
因为增长贡献率会受到整体增量的影响,而增量可能很小,甚至可能为负,使得贡献率的值很不稳定,难以进行不同地区之间的比较。所以后面将用拉动增长率来比较不同行业对GDP增长的影响。
参考:许宪春:我国若干经济增长分析指标的计算方法及其数据表现
def calc_contribution(df, target_year, compare_year):
'''
计算增长贡献率和拉动增长率
'''
target_df = df.query(f"year == {target_year}").drop("year",axis=1)
compare_df = df.query(f"year == {compare_year}").drop("year",axis=1)
mdf = pd.merge(target_df,compare_df,on=["region","industry"],suffixes=["_target","_compare"])
mdf["gdp_diff"] = mdf["gdp_target"] - mdf["gdp_compare"]
mdf_total = mdf.groupby("region").agg(gdp_total_target=("gdp_target","sum"),gdp_total_compare=("gdp_compare","sum"))
mdf_total["gdp_total_diff"] = mdf_total["gdp_total_target"] - mdf_total["gdp_total_compare"]
mmdf = pd.merge(mdf, mdf_total.reset_index(),on=["region"])
mmdf["share_of_contribution"] = (mmdf["gdp_diff"]/mmdf["gdp_total_diff"])
mmdf["contribution_of_growth"] = (mmdf["gdp_diff"]/mmdf["gdp_total_compare"])
output_columns = ['region', 'industry','gdp_target', 'gdp_compare', 'gdp_diff',
'gdp_total_target', 'gdp_total_compare', 'gdp_total_diff',
'share_of_contribution', 'contribution_of_growth']
return mmdf[output_columns]
考虑到2020年疫情的影响,为更好反映各地区GDP增长的规律,所以首先选择分析2019年对比2018年的GDP增长情况。calc_contribution 函数可以计算任意两年之间的各个地区和行业的拉动增长率。
上图的纵坐标就是拉动增长率,此图可以查看具体地区的具体拉动增长率,而更加通用的做法是使用箱线图进行分析。如下图。
def get_cog_table(start_year,end_year):
contri_df = calc_contribution(df, end_year,start_year)
cog_table = pd.pivot(contri_df,"region","industry","contribution_of_growth")
return cog_table
def show_cog_box(start_year,end_year):
plt.figure(figsize=(16,5))
cog_table = get_cog_table(start_year,end_year)
plt.title(f"{start_year}年到{end_year}年各行业对各地区GDP增长的拉动增长率箱线图",size=20)
return cog_table.boxplot()
show_cog_box(2018,2019)
可以看到
- 其他行业的拉动增长率在各省份都较高,所有省份的拉动增长率都在1%以上,平均的拉动增长率在2.2%左右,最高拉动增长率为北京和西藏,超过4%。这也是所有地区所有行业中拉动增长率最高的。
- 工业的拉动增长率作用仅次于其他行业,平均的拉动增长率在1.4%左右。数据的分布相对其他行业来说更加分散。
- 农林牧渔业以及剩余的行业的平均贡献率都在1%以下,但也有少量地区可以在这些行业达到1%以上的拉动增长率。例如上海、北京的金融业对于GDP的拉动增长率可以达到约1.8%。
综上所述,以服务业为主的其他行业和工业的GDP增长是2018年到2019年各地区GDP增长的主要拉动因素。
疫情对于各行业的影响
show_cog_box(2019,2020)
观察2020年对比2019年的经济增长,可以发现:相比于2019对2018年,大量的行业的拉动增长率下降,甚至达到负增长。特别是在住宿和餐饮业。这体现了当年新冠疫情带来的影响。
各行业的拉动增长率的历史变化
show_cog_box(2014,2019)
show_cog_box(2009,2014)
show_cog_box(2004,2009)
可以看到:
- 在更早的时间,如在2004年到2009年这个时间段,工业是拉动增长率最高的行业。而随着时间的推移,以服务业为主的其他行业的比重逐渐上升,取代了工业成为拉动增长率的第一要素。
ctrib_df_list = []
for year in range(1993,2021):
ctrib_df = calc_contribution(df, year,year-1)
ctrib_df["target_year"] = year
ctrib_df_list.append(ctrib_df)
ctrib_df_roll = pd.concat(ctrib_df_list)
ctrib_df_roll.head()
from pyecharts.charts import Line
def plot_industry_cog_roll():
cdf = ctrib_df_roll.groupby(["industry","target_year"]).agg(
cog_mean=("contribution_of_growth","mean"),
cog_median=("contribution_of_growth","median")).round(4).reset_index()
cdf = cdf.pivot(index="target_year",columns="industry",values="cog_mean")
# print(cdf)
line = Line(init_opts=opts.InitOpts(width="1200px"))
line.add_xaxis([str(x) for x in cdf.index.values.tolist()])
for column in SORTED_INDUSRY_COLUMNS:
line.add_yaxis(column, cdf[column].values.tolist())
line.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
line.set_global_opts(
title_opts=opts.TitleOpts(title="各行业对各地区的平均拉动增长率的逐年变化"),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=True,interval=1,axistick_opts=opts.AxisTickOpts(is_align_with_label=True)),
legend_opts=opts.LegendOpts(pos_bottom="50%",pos_right="0",orient="vertical",selected_mode="multiple"),
)
return line.render_notebook()
plot_industry_cog_roll()
上述体现了各行业的拉动增长率的均值和中位数的历史变化。可以看到
- 从在2013年开始,以服务业为主的其他行业的拉动增长率开始超过工业。但从图表可以看出,与其说是其他行业超过工业,更不如说是工业的拉动增长率的下降导致的。
我们注意工业的拉动增长率的波动非常大。到从2003年开始的快速上升,2009年的大幅下降,2012年的下降,2017年的回升。结合一些重要经济事件的时间点,如2001年中国加入世界贸易组织,2008年发生了全球金融危机。初步推测工业增长非常容易受到国内外经济环境的影响。
各省的经济产业结构的变化可以归为几组?
这里选用从2014年到2019年的各个行业的拉动增长率作为分组的指标,对各个省份进行分组。
cog_2019_2014 = get_cog_table(2014,2019)
cog_2019_2014.head()
首先对数据进行降维
n_dim = 3
pca = PCA(n_components=n_dim)
X = cog_2019_2014.values
pca.fit(X)
cog_2019_2014_pca = pd.DataFrame(pca.transform(X),columns=[f"dim{i}" for i in range(1,n_dim+1)],index=cross_table2020.index.values)
cog_2019_2014_pca.head()
然后使用层级聚类进行分组
from scipy.cluster import hierarchy
from matplotlib import pyplot as plt
cog_model = draw_dendrogram(cog_2019_2014.values,cog_2019_2014.index.values)
最后进行分组统计。这里设定分为7组。
gcog = cog_2019_2014.assign(
group = hierarchy.cut_tree(cog_model,7)+1
).sort_values("group")
get_group_stats(gcog)
def province_group_map():
map_chart = Map()
data = [list(x) for x in zip(gcog.index.values,gcog["group"].values * 1.0)]
map_chart.add(f"分组", data, maptype="china", is_roam=False,is_map_symbol_show=False,label_opts=opts.LabelOpts())
custom_pieces = [{"value":i,"label":f"{i}组"} for i in range(1,8)]
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="经济产业结构变化的分组地图"),
visualmap_opts=opts.VisualMapOpts(max_=7,is_piecewise=True,split_number=7,pieces=custom_pieces,pos_bottom="20%",pos_right="10%"),
legend_opts=opts.LegendOpts(is_show=False)
)
return map_chart.render_notebook()
province_group_map()
可以看到
有些组只有一两个省份,这说明这些省份的经济产业结构和其他省份差异很大。除此之外的大部分的省份被归到了第2、3、4组。
- 第 2 组:以新疆、广西、重庆等西部省份为主,特点是平均18%的其他行业拉动增长率和9%的工业拉动增长率。
- 第 3 组:以辽宁、山东、天津等北方省份为主,特点是平均14%的其他行业拉动增长率,剩余的行业的拉动增长率比例都低于5%。
- 第 4 组:包括广东、江苏、浙江、福建等南方省份为主,特点是25%的其他行业拉动增长率,和16%工业拉动增长率比例。
相对于经济产业结构的差异,在经济产业结构的变化上,南北差异会更加明显。
我们还可以发现经济结构的变化和当前经济结构的存在一定的差异性。有些地区的一些产业虽然有着较高的比重,但不一定有着较高的GDP拉动增长率。下面具体分析。
经济产业结构和经济产业结构变化之间的关系
def group_stack(table,value_column_name):
left = table.drop("group",axis=1).stack().reset_index().rename({0:value_column_name},axis=1)
right = table["group"].reset_index()
return pd.merge(left,right,on="region")
gdp_per_table = gtable
# gdp_per_table[SORTED_INDUSRY_COLUMNS] = ((gdp_per_table[SORTED_INDUSRY_COLUMNS]).T/gdp_per_table[SORTED_INDUSRY_COLUMNS].sum(axis=1)).T
mtable = pd.merge(
group_stack(gdp_per_table,value_column_name="pecentage_of_gdp"),
group_stack(gcog,value_column_name="contribution_of_growth"),
on=["region","industry"],
suffixes=["_pog","_cog"]
)
mtable.head()
from pyecharts.charts import Scatter,Tab
from pyecharts.options import ScatterItem
def top3_industry_compare_chart():
label_opts=opts.LabelOpts(
formatter="{b}",
position="left"
)
tab = Tab()
for i,industry in enumerate(['工业','其他行业','农林牧渔业']):
sca = Scatter()
cdf = mtable.query(f"industry == '{industry}'").round(4)
sca.add_xaxis([],)
for group in set(mtable["group_cog"].values):
group_cdf = cdf.query(f"group_cog == {group}")
sc_items = [ScatterItem(name=x,value=(y,z),label_opts=label_opts) for x,y,z in group_cdf[["region","pecentage_of_gdp","contribution_of_growth"]].values]
sca.add_yaxis(str(group),sc_items)
sca.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
sca.set_global_opts(
xaxis_opts=opts.AxisOpts(
name="2020年GDP占比",
type_="value", splitline_opts=opts.SplitLineOpts(is_show=True),
),
yaxis_opts=opts.AxisOpts(
name="对2014年-2019年GDP的拉动增长率",
type_="value", splitline_opts=opts.SplitLineOpts(is_show=True)
),
title_opts=opts.TitleOpts(
title=f"{industry}GDP占比和其对GDP的拉动增长率的关系图",
),
legend_opts=opts.LegendOpts(pos_bottom="20%",pos_right="10%",orient="vertical",selected_mode="multiple"),
)
tab.add(sca,industry)
return tab.render_notebook()
top3_industry_compare_chart()
根据上图可以发现:
- 存在这样的趋势,某产业在某地区GDP占比越高,则其对GDP的拉动增长率业也倾向于越高。
- 有部分地区会偏离上述的趋势。例如山西省虽然有着所有省份中最高的工业GDP占比,但是工业的拉动增长率较低;青海省和贵州省虽然工业占比不高,但是工业的劳动增长率较高。
- 各地区在工业和农林牧渔业上差异更为显著,在其他产业上的GDP占比和对GDP的拉动增长率相接近。