如何用Python快速分析中国县域经济数据?以1997-2018年统计年鉴为例
Python实战:县域经济数据深度分析指南(1997-2018)
当我们需要理解中国基层经济脉络时,县域数据就像显微镜下的细胞切片。这份指南将带您用Python工具链,从近百万条原始记录中提炼出区域经济发展的黄金洞察。
1. 数据准备与环境搭建
工欲善其事,必先利其器。我们首先构建一个可复用的分析环境:
# 基础环境配置 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import MinMaxScaler plt.style.use('seaborn') pd.set_option('display.max_columns', 50)县域数据通常存在几个典型特征:
- 行政区划变更:1997-2018年间大量县改区、县级市升格
- 指标口径差异:不同年份的统计指标可能存在计算方式变化
- 缺失值模式:经济欠发达地区部分指标记录不全
建议使用以下方法加载数据:
def load_county_data(path): df = pd.read_csv(path, encoding='gb18030') # 统一关键字段命名 df = df.rename(columns={ '年份': 'year', '省份': 'province', '县区市': 'county' }) # 处理特殊字符 df['county'] = df['county'].str.replace(r'\(.*?\)', '', regex=True) return df提示:遇到编码问题时,可尝试
chardet库自动检测文件编码,县域数据常用GB18030编码
2. 数据清洗实战技巧
原始数据如同未经雕琢的玉石,需要专业处理才能展现价值。以下是关键清洗步骤:
2.1 异常值检测与处理
建立数据质量检查清单:
- 范围校验:GDP不应为负值
- 逻辑校验:第一产业增加值 ≤ 农业增加值
- 波动校验:相邻年份经济指标突变检查
# 示例:GDP增长率异常检测 def detect_gdp_outliers(df): df = df.sort_values(['province', 'county', 'year']) df['gdp_growth'] = df.groupby(['province', 'county'])['地区生产总值'].pct_change() outliers = df[(df['gdp_growth'] > 2) | (df['gdp_growth'] < -0.5)] return outliers[['year', 'province', 'county', '地区生产总值', 'gdp_growth']]2.2 缺失值智能填补
根据数据特性选择填补策略:
| 缺失类型 | 推荐方法 | 适用场景 |
|---|---|---|
| 随机缺失 | 均值/中位数填补 | 工业增加值等经济指标 |
| 连续缺失 | 线性插值 | 人口类时间序列数据 |
| 区块缺失 | 同类区域均值 | 欠发达地区部分指标 |
# 分组插值示例 df['工业增加值'] = df.groupby(['province', 'county'])['工业增加值'].transform( lambda x: x.interpolate(limit_direction='both') )3. 核心经济指标分析
3.1 区域经济差异雷达图
通过多维指标对比区域发展特点:
def plot_radar_chart(metrics, titles): angles = np.linspace(0, 2*np.pi, len(metrics), endpoint=False) metrics = np.concatenate((metrics, [metrics[0]])) angles = np.concatenate((angles, [angles[0]])) fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111, polar=True) ax.plot(angles, metrics, 'o-', linewidth=2) ax.fill(angles, metrics, alpha=0.25) ax.set_thetagrids(angles * 180/np.pi, titles) ax.set_title('县域经济指标雷达图', y=1.1) plt.show() # 示例使用 metrics = [0.7, 0.9, 0.6, 0.8, 0.5] # 标准化后的指标值 titles = ['GDP规模', '财政收入', '工业占比', '农业效率', '服务业发展'] plot_radar_chart(metrics, titles)3.2 产业结构演进分析
观察县域经济转型轨迹:
def plot_industry_evolution(df, county_name): temp = df[df['county'] == county_name].sort_values('year') temp[['第一产业增加值','第二产业增加值','第三产业增加值']].plot( kind='area', stacked=True, figsize=(10,6), title=f'{county_name}产业结构变迁(1997-2018)' ) plt.ylabel('增加值(万元)') plt.show()注意:分析产业结构时建议使用可比价计算,避免价格因素干扰
4. 空间经济格局可视化
4.1 经济密度热力图
def plot_economic_density(df, year): plt.figure(figsize=(12,8)) temp = df[df['year'] == year] sns.scatterplot( data=temp, x='人均GDP', y='地均GDP', size='地区生产总值', hue='province', sizes=(20, 200), alpha=0.7 ) plt.xscale('log') plt.yscale('log') plt.title(f'{year}年县域经济密度分布') plt.show()4.2 区域经济聚类分析
使用机器学习方法识别发展模式:
from sklearn.cluster import KMeans def county_clustering(df, year, n_clusters=5): temp = df[df['year'] == year] features = temp[['人均GDP', '工业化率', '财政自给率', '城镇化率']].dropna() # 数据标准化 scaler = MinMaxScaler() X = scaler.fit_transform(features) # K-means聚类 kmeans = KMeans(n_clusters=n_clusters, random_state=42) clusters = kmeans.fit_predict(X) # 结果可视化 pca = PCA(n_components=2) components = pca.fit_transform(X) plt.figure(figsize=(10,6)) sns.scatterplot( x=components[:,0], y=components[:,1], hue=clusters, palette='viridis', s=50 ) plt.title(f'{year}年县域经济聚类结果') plt.show() return clusters5. 时间序列建模实战
5.1 经济增长趋势分解
from statsmodels.tsa.seasonal import STL def decompose_growth(df, county_name): temp = df[df['county'] == county_name].sort_values('year') ts = temp.set_index('year')['地区生产总值'] # STL分解 res = STL(ts, period=5).fit() fig, (ax1,ax2,ax3,ax4) = plt.subplots(4,1,figsize=(12,8)) res.observed.plot(ax=ax1, title='Observed') res.trend.plot(ax=ax2, title='Trend') res.seasonal.plot(ax=ax3, title='Seasonal') res.resid.plot(ax=ax4, title='Residual') plt.tight_layout() plt.show()5.2 县域经济预测模型
构建ARIMA预测示例:
from statsmodels.tsa.arima.model import ARIMA def forecast_gdp(df, county_name, steps=3): temp = df[df['county'] == county_name].sort_values('year') ts = temp.set_index('year')['地区生产总值'] # 对数差分处理 log_ts = np.log(ts) diff_ts = log_ts.diff().dropna() # 模型拟合 model = ARIMA(log_ts, order=(1,1,1)) results = model.fit() # 预测 forecast = results.get_forecast(steps=steps) conf_int = forecast.conf_int() # 可视化 plt.figure(figsize=(10,6)) plt.plot(log_ts.index, log_ts, label='实际值') plt.plot(forecast.predicted_mean.index, forecast.predicted_mean, color='r', label='预测值') plt.fill_between(conf_int.index, conf_int.iloc[:,0], conf_int.iloc[:,1], color='pink', alpha=0.3) plt.title(f'{county_name}GDP对数预测') plt.legend() plt.show()6. 分析成果输出策略
6.1 自动化报告生成
from jinja2 import Environment, FileSystemLoader def generate_report(df, county_name, template_path='templates'): env = Environment(loader=FileSystemLoader(template_path)) template = env.get_template('report_template.html') county_data = df[df['county'] == county_name] stats = { 'gdp_growth': county_data['地区生产总值'].pct_change().mean() * 100, 'industry_ratio': county_data['第二产业增加值'].mean() / county_data['地区生产总值'].mean(), # 其他计算指标... } html = template.render( county_name=county_name, stats=stats, plots={ 'trend_plot': 'output/trend.png', 'structure_plot': 'output/structure.png' } ) with open(f'reports/{county_name}_report.html', 'w') as f: f.write(html)6.2 交互式可视化仪表盘
使用Plotly构建动态看板:
import plotly.express as px def create_dashboard(df): fig = px.scatter( df, x='人均GDP', y='财政收入占比', animation_frame='year', size='地区生产总值', color='province', hover_name='county', log_x=True, range_x=[1000,100000], range_y=[0,0.5] ) fig.update_layout( title='县域经济发展动态(1997-2018)', width=1000, height=600 ) fig.show()在实际分析云南省县域数据时,我发现行政区划变更是最大的数据陷阱——2016年撤销的晋宁县在数据中会同时存在新旧名称记录。最佳实践是建立行政区划映射表,用最新版名称统一所有历史数据。
