686 KiB
686 KiB
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# Set plotting style
plt.style.use('seaborn-v0_8-darkgrid')
plt.rcParams['figure.figsize'] = (14, 8)
plt.rcParams['font.size'] = 10
print("Libraries loaded successfully!")Libraries loaded successfully!
In [2]:
# Load the data from CSV files
ca_data = pd.read_csv('A124RC1A027NBEA.csv') # Current Account Balance
deficit_data = pd.read_csv('FYFSD.csv') # Federal Surplus or Deficit
gdp_data = pd.read_csv('FYGDP.csv') # GDP
private_savings_data = pd.read_csv('W986RC1A027NBEA.csv') # Net Private Savings
investment_data = pd.read_csv('GPDIA.csv') # Gross Private Domestic Investment
print("Data files loaded!")
print(f"\nDatasets overview:")
print(f" Current Account: {len(ca_data)} observations")
print(f" Federal Deficit: {len(deficit_data)} observations")
print(f" GDP: {len(gdp_data)} observations")
print(f" Private Savings: {len(private_savings_data)} observations")
print(f" Investment: {len(investment_data)} observations")Data files loaded! Datasets overview: Current Account: 96 observations Federal Deficit: 65 observations GDP: 64 observations Private Savings: 65 observations Investment: 65 observations
In [3]:
# Convert dates to datetime and extract year
for df in [ca_data, deficit_data, gdp_data, private_savings_data, investment_data]:
df['observation_date'] = pd.to_datetime(df['observation_date'])
df['year'] = df['observation_date'].dt.year
# Filter data from 1960 to 2024
ca_data = ca_data[(ca_data['year'] >= 1960) & (ca_data['year'] <= 2024)]
deficit_data = deficit_data[(deficit_data['year'] >= 1960) & (deficit_data['year'] <= 2024)]
gdp_data = gdp_data[(gdp_data['year'] >= 1960) & (gdp_data['year'] <= 2024)]
private_savings_data = private_savings_data[(private_savings_data['year'] >= 1960) & (private_savings_data['year'] <= 2024)]
investment_data = investment_data[(investment_data['year'] >= 1960) & (investment_data['year'] <= 2024)]
print("Data filtered for 1960-2024 period")Data filtered for 1960-2024 period
In [4]:
# Merge CA and deficit data
merged_data = pd.merge(ca_data[['year', 'A124RC1A027NBEA']],
deficit_data[['year', 'FYFSD']],
on='year',
how='inner')
# Rename columns for clarity
merged_data.columns = ['year', 'CA', 'Sg']
# Convert deficit from millions to billions to match CA
merged_data['Sg'] = merged_data['Sg'] / 1000
print(f"Merged dataset: {len(merged_data)} observations from {merged_data['year'].min()} to {merged_data['year'].max()}")
# Display first and last few rows
print("\nFirst few rows:")
print(merged_data.head())
print("\nLast few rows:")
print(merged_data.tail())Merged dataset: 65 observations from 1960 to 2024
First few rows:
year CA Sg
0 1960 3.171 0.301
1 1961 4.213 -3.335
2 1962 3.803 -7.146
3 1963 4.946 -4.756
4 1964 7.467 -5.915
Last few rows:
year CA Sg
60 2020 -564.620 -3132.456
61 2021 -869.245 -2775.350
62 2022 -1001.196 -1375.920
63 2023 -937.838 -1695.240
64 2024 -1179.852 -1832.816
In [5]:
# Split data before and after 1990
data_before_1990 = merged_data[merged_data['year'] < 1990]
data_after_1990 = merged_data[merged_data['year'] >= 1990]
# Calculate correlations
corr_before_1990 = data_before_1990['CA'].corr(data_before_1990['Sg'])
corr_after_1990 = data_after_1990['CA'].corr(data_after_1990['Sg'])
corr_overall = merged_data['CA'].corr(merged_data['Sg'])
# Statistical significance tests
corr_before, p_before = stats.pearsonr(data_before_1990['CA'], data_before_1990['Sg'])
corr_after, p_after = stats.pearsonr(data_after_1990['CA'], data_after_1990['Sg'])
print("="*80)
print("CORRELATION ANALYSIS")
print("="*80)
print(f"\nBefore 1990 (1960-1989):")
print(f" Observations: {len(data_before_1990)}")
print(f" Correlation: {corr_before_1990:.4f}")
print(f" P-value: {p_before:.4f}")
print(f" Significance: {'***' if p_before < 0.001 else '**' if p_before < 0.01 else '*' if p_before < 0.05 else 'Not significant'}")
print(f"\nAfter 1990 (1990-2024):")
print(f" Observations: {len(data_after_1990)}")
print(f" Correlation: {corr_after_1990:.4f}")
print(f" P-value: {p_after:.4f}")
print(f" Significance: {'***' if p_after < 0.001 else '**' if p_after < 0.01 else '*' if p_after < 0.05 else 'Not significant'}")
print(f"\nOverall (1960-2024):")
print(f" Observations: {len(merged_data)}")
print(f" Correlation: {corr_overall:.4f}")
print(f"\n{'='*80}")
print(f"Change in correlation: {corr_after_1990 - corr_before_1990:+.4f}")
print(f"Percentage change: {((corr_after_1990 - corr_before_1990) / abs(corr_before_1990)) * 100:+.2f}%")
print("="*80)================================================================================ CORRELATION ANALYSIS ================================================================================ Before 1990 (1960-1989): Observations: 30 Correlation: 0.8246 P-value: 0.0000 Significance: *** After 1990 (1990-2024): Observations: 35 Correlation: 0.5331 P-value: 0.0010 Significance: *** Overall (1960-2024): Observations: 65 Correlation: 0.6681 ================================================================================ Change in correlation: -0.2915 Percentage change: -35.35% ================================================================================
In [6]:
# Create visualization for Question 1
fig, axes = plt.subplots(2, 1, figsize=(14, 10))
# Plot 1: Time series of both variables
ax1 = axes[0]
ax1.plot(merged_data['year'], merged_data['CA'], 'b-', linewidth=2, label='Current Account (CA)', marker='o', markersize=3)
ax1.plot(merged_data['year'], merged_data['Sg'], 'r-', linewidth=2, label='Government Budget Balance (Sg)', marker='s', markersize=3)
ax1.axvline(x=1990, color='gray', linestyle='--', linewidth=1.5, label='1990', alpha=0.7)
ax1.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax1.set_xlabel('Year', fontsize=12)
ax1.set_ylabel('Billions of Dollars', fontsize=12)
ax1.set_title('US Government Budget Balance and Current Account Balance (1960-2024)', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11, loc='lower left')
ax1.grid(True, alpha=0.3)
# Add shaded regions
ax1.axvspan(1960, 1990, alpha=0.1, color='blue', label='Before 1990')
ax1.axvspan(1990, 2024, alpha=0.1, color='red', label='After 1990')
# Plot 2: Scatter plot
ax2 = axes[1]
scatter1 = ax2.scatter(data_before_1990['Sg'], data_before_1990['CA'],
color='blue', alpha=0.6, s=80, edgecolor='darkblue', linewidth=1,
label=f'Before 1990 (r={corr_before_1990:.3f}***)')
scatter2 = ax2.scatter(data_after_1990['Sg'], data_after_1990['CA'],
color='red', alpha=0.6, s=80, edgecolor='darkred', linewidth=1,
label=f'After 1990 (r={corr_after_1990:.3f}**)')
# Add trend lines
z_before = np.polyfit(data_before_1990['Sg'], data_before_1990['CA'], 1)
p_before = np.poly1d(z_before)
z_after = np.polyfit(data_after_1990['Sg'], data_after_1990['CA'], 1)
p_after = np.poly1d(z_after)
sg_range_before = np.linspace(data_before_1990['Sg'].min(), data_before_1990['Sg'].max(), 100)
sg_range_after = np.linspace(data_after_1990['Sg'].min(), data_after_1990['Sg'].max(), 100)
ax2.plot(sg_range_before, p_before(sg_range_before), 'b--', linewidth=2.5, alpha=0.8, label='Trend (Before 1990)')
ax2.plot(sg_range_after, p_after(sg_range_after), 'r--', linewidth=2.5, alpha=0.8, label='Trend (After 1990)')
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax2.axvline(x=0, color='black', linestyle='-', linewidth=0.5)
ax2.set_xlabel('Government Budget Balance (Sg) - Billions of Dollars', fontsize=12)
ax2.set_ylabel('Current Account (CA) - Billions of Dollars', fontsize=12)
ax2.set_title('Relationship between Government Budget and Current Account', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10, loc='lower right')
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('question1_twin_deficits.png', dpi=300, bbox_inches='tight')
plt.show()
print("✓ Graph saved as 'question1_twin_deficits.png'")✓ Graph saved as 'question1_twin_deficits.png'
In [7]:
# Summary statistics
print("="*80)
print("SUMMARY STATISTICS (Billions of Dollars)")
print("="*80)
print("\nBefore 1990 (1960-1989):")
print("\nCurrent Account (CA):")
print(data_before_1990['CA'].describe())
print("\nGovernment Budget Balance (Sg):")
print(data_before_1990['Sg'].describe())
print("\n" + "="*80)
print("\nAfter 1990 (1990-2024):")
print("\nCurrent Account (CA):")
print(data_after_1990['CA'].describe())
print("\nGovernment Budget Balance (Sg):")
print(data_after_1990['Sg'].describe())================================================================================ SUMMARY STATISTICS (Billions of Dollars) ================================================================================ Before 1990 (1960-1989): Current Account (CA): count 30.000000 mean -22.615767 std 50.596241 min -154.094000 25% -12.198750 50% 2.387500 75% 4.762750 max 19.828000 Name: CA, dtype: float64 Government Budget Balance (Sg): count 30.000000 mean -65.746100 std 73.872105 min -221.227000 25% -115.724750 50% -32.943500 75% -5.970000 max 3.242000 Name: Sg, dtype: float64 ================================================================================ After 1990 (1990-2024): Current Account (CA): count 35.000000 mean -446.923029 std 292.155707 min -1179.852000 25% -601.193500 50% -423.075000 75% -240.980500 max 7.886000 Name: CA, dtype: float64 Government Budget Balance (Sg): count 35.000000 mean -674.882800 std 779.343565 min -3132.456000 25% -1030.080500 50% -412.727000 75% -183.569000 max 236.241000 Name: Sg, dtype: float64
In [8]:
# Merge all data for Question 2
q2_data = pd.merge(private_savings_data[['year', 'W986RC1A027NBEA']],
investment_data[['year', 'GPDIA']],
on='year',
how='inner')
q2_data = pd.merge(q2_data,
gdp_data[['year', 'FYGDP']],
on='year',
how='inner')
# Rename columns
q2_data.columns = ['year', 'Private_Savings', 'Investment', 'GDP']
# Filter for 1960-2024
q2_data = q2_data[(q2_data['year'] >= 1960) & (q2_data['year'] <= 2024)]
# Calculate ratios (as percentages)
q2_data['Savings_GDP_Ratio'] = (q2_data['Private_Savings'] / q2_data['GDP']) * 100
q2_data['Investment_GDP_Ratio'] = (q2_data['Investment'] / q2_data['GDP']) * 100
q2_data['SI_Gap'] = q2_data['Savings_GDP_Ratio'] - q2_data['Investment_GDP_Ratio']
print(f"Question 2 dataset: {len(q2_data)} observations from {q2_data['year'].min()} to {q2_data['year'].max()}")
print("\nFirst few rows:")
print(q2_data.head())
print("\nLast few rows:")
print(q2_data.tail())Question 2 dataset: 64 observations from 1960 to 2023
First few rows:
year Private_Savings Investment GDP Savings_GDP_Ratio \
0 1960 37.850 86.477 534.325 7.083704
1 1961 44.386 86.584 546.575 8.120752
2 1962 46.702 96.977 585.675 7.974047
3 1963 47.099 103.284 618.200 7.618732
4 1964 55.282 112.150 661.700 8.354541
Investment_GDP_Ratio SI_Gap
0 16.184345 -9.100641
1 15.841193 -7.720441
2 16.558159 -8.584112
3 16.707214 -9.088483
4 16.948768 -8.594227
Last few rows:
year Private_Savings Investment GDP Savings_GDP_Ratio \
59 2019 1178.158 3893.734 21275.275 5.537686
60 2020 2661.768 3763.386 21292.400 12.501024
61 2021 2177.188 4246.545 22936.525 9.492231
62 2022 632.923 4844.333 25305.650 2.501113
63 2023 1159.240 5023.712 26982.375 4.296286
Investment_GDP_Ratio SI_Gap
59 18.301686 -12.764000
60 17.674785 -5.173762
61 18.514335 -9.022103
62 19.143286 -16.642173
63 18.618494 -14.322208
In [9]:
# Split data
before_1990_q2 = q2_data[q2_data['year'] < 1990]
after_1990_q2 = q2_data[q2_data['year'] >= 1990]
print("="*80)
print("SUMMARY STATISTICS: PRIVATE SAVINGS AND INVESTMENT (% of GDP)")
print("="*80)
print("\nBefore 1990 (1960-1989):")
print(f" Private Savings/GDP:")
print(f" Mean: {before_1990_q2['Savings_GDP_Ratio'].mean():.2f}%")
print(f" Median: {before_1990_q2['Savings_GDP_Ratio'].median():.2f}%")
print(f" Std: {before_1990_q2['Savings_GDP_Ratio'].std():.2f}%")
print(f" Min: {before_1990_q2['Savings_GDP_Ratio'].min():.2f}%")
print(f" Max: {before_1990_q2['Savings_GDP_Ratio'].max():.2f}%")
print(f"\n Investment/GDP:")
print(f" Mean: {before_1990_q2['Investment_GDP_Ratio'].mean():.2f}%")
print(f" Median: {before_1990_q2['Investment_GDP_Ratio'].median():.2f}%")
print(f" Std: {before_1990_q2['Investment_GDP_Ratio'].std():.2f}%")
print(f" Min: {before_1990_q2['Investment_GDP_Ratio'].min():.2f}%")
print(f" Max: {before_1990_q2['Investment_GDP_Ratio'].max():.2f}%")
print(f"\n S-I Gap:")
print(f" Mean: {before_1990_q2['SI_Gap'].mean():.2f}%")
print("\n" + "="*80)
print("\nAfter 1990 (1990-2024):")
print(f" Private Savings/GDP:")
print(f" Mean: {after_1990_q2['Savings_GDP_Ratio'].mean():.2f}%")
print(f" Median: {after_1990_q2['Savings_GDP_Ratio'].median():.2f}%")
print(f" Std: {after_1990_q2['Savings_GDP_Ratio'].std():.2f}%")
print(f" Min: {after_1990_q2['Savings_GDP_Ratio'].min():.2f}%")
print(f" Max: {after_1990_q2['Savings_GDP_Ratio'].max():.2f}%")
print(f"\n Investment/GDP:")
print(f" Mean: {after_1990_q2['Investment_GDP_Ratio'].mean():.2f}%")
print(f" Median: {after_1990_q2['Investment_GDP_Ratio'].median():.2f}%")
print(f" Std: {after_1990_q2['Investment_GDP_Ratio'].std():.2f}%")
print(f" Min: {after_1990_q2['Investment_GDP_Ratio'].min():.2f}%")
print(f" Max: {after_1990_q2['Investment_GDP_Ratio'].max():.2f}%")
print(f"\n S-I Gap:")
print(f" Mean: {after_1990_q2['SI_Gap'].mean():.2f}%")
print("\n" + "="*80)
print("\nCHANGE IN RATIOS (After - Before):")
print(f" Private Savings/GDP: {after_1990_q2['Savings_GDP_Ratio'].mean() - before_1990_q2['Savings_GDP_Ratio'].mean():.2f}%")
print(f" Investment/GDP: {after_1990_q2['Investment_GDP_Ratio'].mean() - before_1990_q2['Investment_GDP_Ratio'].mean():.2f}%")
print(f" S-I Gap: {after_1990_q2['SI_Gap'].mean() - before_1990_q2['SI_Gap'].mean():.2f}%")
savings_pct_change = ((after_1990_q2['Savings_GDP_Ratio'].mean() - before_1990_q2['Savings_GDP_Ratio'].mean()) /
before_1990_q2['Savings_GDP_Ratio'].mean()) * 100
print(f"\n Private Savings/GDP declined by: {abs(savings_pct_change):.1f}%")
print("="*80)================================================================================
SUMMARY STATISTICS: PRIVATE SAVINGS AND INVESTMENT (% of GDP)
================================================================================
Before 1990 (1960-1989):
Private Savings/GDP:
Mean: 8.05%
Median: 8.09%
Std: 1.20%
Min: 5.47%
Max: 10.21%
Investment/GDP:
Mean: 18.22%
Median: 18.17%
Std: 1.46%
Min: 15.84%
Max: 21.04%
S-I Gap:
Mean: -10.16%
================================================================================
After 1990 (1990-2024):
Private Savings/GDP:
Mean: 4.67%
Median: 4.35%
Std: 2.07%
Min: 1.63%
Max: 12.50%
Investment/GDP:
Mean: 17.70%
Median: 17.93%
Std: 1.58%
Min: 13.34%
Max: 20.15%
S-I Gap:
Mean: -13.03%
================================================================================
CHANGE IN RATIOS (After - Before):
Private Savings/GDP: -3.38%
Investment/GDP: -0.52%
S-I Gap: -2.87%
Private Savings/GDP declined by: 42.0%
================================================================================
In [10]:
# Create visualization for Question 2
fig, axes = plt.subplots(3, 1, figsize=(14, 12))
# Plot 1: Private Savings and Investment as % of GDP
ax1 = axes[0]
ax1.plot(q2_data['year'], q2_data['Savings_GDP_Ratio'], 'b-', linewidth=2,
label='Private Savings / GDP', marker='o', markersize=3)
ax1.plot(q2_data['year'], q2_data['Investment_GDP_Ratio'], 'g-', linewidth=2,
label='Investment / GDP', marker='s', markersize=3)
ax1.axvline(x=1990, color='gray', linestyle='--', linewidth=1.5, label='1990', alpha=0.7)
ax1.axvspan(1960, 1990, alpha=0.1, color='blue')
ax1.axvspan(1990, 2024, alpha=0.1, color='red')
ax1.set_xlabel('Year', fontsize=12)
ax1.set_ylabel('Percentage of GDP (%)', fontsize=12)
ax1.set_title('Private Savings and Investment as % of GDP (1960-2024)', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(True, alpha=0.3)
# Plot 2: Savings-Investment Gap
ax2 = axes[1]
ax2.plot(q2_data['year'], q2_data['SI_Gap'], 'purple', linewidth=2.5,
label='Savings - Investment Gap', marker='d', markersize=3)
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax2.axvline(x=1990, color='gray', linestyle='--', linewidth=1.5, label='1990', alpha=0.7)
ax2.fill_between(q2_data['year'], 0, q2_data['SI_Gap'],
where=(q2_data['SI_Gap'] >= 0), alpha=0.3, color='blue', label='Surplus')
ax2.fill_between(q2_data['year'], 0, q2_data['SI_Gap'],
where=(q2_data['SI_Gap'] < 0), alpha=0.3, color='red', label='Deficit')
ax2.set_xlabel('Year', fontsize=12)
ax2.set_ylabel('Percentage Points', fontsize=12)
ax2.set_title('Private Savings - Investment Gap (% of GDP)', fontsize=14, fontweight='bold')
ax2.legend(fontsize=11)
ax2.grid(True, alpha=0.3)
# Plot 3: Absolute values in billions
ax3 = axes[2]
ax3.plot(q2_data['year'], q2_data['Private_Savings'], 'b-', linewidth=2,
label='Private Savings', marker='o', markersize=3)
ax3.plot(q2_data['year'], q2_data['Investment'], 'g-', linewidth=2,
label='Investment', marker='s', markersize=3)
ax3.axvline(x=1990, color='gray', linestyle='--', linewidth=1.5, label='1990', alpha=0.7)
ax3.axvspan(1960, 1990, alpha=0.1, color='blue')
ax3.axvspan(1990, 2024, alpha=0.1, color='red')
ax3.set_xlabel('Year', fontsize=12)
ax3.set_ylabel('Billions of Dollars', fontsize=12)
ax3.set_title('Private Savings and Investment - Nominal Values (1960-2024)', fontsize=14, fontweight='bold')
ax3.legend(fontsize=11)
ax3.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('question2_savings_investment.png', dpi=300, bbox_inches='tight')
plt.show()
print("✓ Graph saved as 'question2_savings_investment.png'")✓ Graph saved as 'question2_savings_investment.png'
In [11]:
# Merge CA/Sg data with S/I data
integrated_data = pd.merge(merged_data, q2_data[['year', 'SI_Gap', 'Savings_GDP_Ratio', 'Investment_GDP_Ratio']],
on='year', how='inner')
print("="*80)
print("INTEGRATED ANALYSIS")
print("="*80)
# Relationship between S-I Gap and Current Account
integrated_before = integrated_data[integrated_data['year'] < 1990]
integrated_after = integrated_data[integrated_data['year'] >= 1990]
corr_si_ca_before = integrated_before['SI_Gap'].corr(integrated_before['CA'])
corr_si_ca_after = integrated_after['SI_Gap'].corr(integrated_after['CA'])
print("\nRelationship between S-I Gap and Current Account:")
print(f" Before 1990: r = {corr_si_ca_before:.4f}")
print(f" After 1990: r = {corr_si_ca_after:.4f}")
# Create integrated visualization
fig, axes = plt.subplots(2, 2, figsize=(16, 10))
# Plot 1: All four variables over time
ax1 = axes[0, 0]
ax1_twin = ax1.twinx()
l1 = ax1.plot(integrated_data['year'], integrated_data['CA'], 'b-', linewidth=2, label='Current Account')
l2 = ax1.plot(integrated_data['year'], integrated_data['Sg'], 'r-', linewidth=2, label='Gov Budget Balance')
l3 = ax1_twin.plot(integrated_data['year'], integrated_data['SI_Gap'], 'purple', linewidth=2,
label='S-I Gap (% GDP)', linestyle='--')
ax1.axvline(x=1990, color='gray', linestyle='--', linewidth=1.5, alpha=0.7)
ax1.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax1.set_xlabel('Year', fontsize=11)
ax1.set_ylabel('Billions of Dollars', fontsize=11)
ax1_twin.set_ylabel('Percentage Points', fontsize=11)
ax1.set_title('All Variables Over Time', fontsize=12, fontweight='bold')
lns = l1 + l2 + l3
labs = [l.get_label() for l in lns]
ax1.legend(lns, labs, fontsize=9, loc='lower left')
ax1.grid(True, alpha=0.3)
# Plot 2: CA vs Sg with periods
ax2 = axes[0, 1]
ax2.scatter(integrated_before['Sg'], integrated_before['CA'],
color='blue', alpha=0.6, s=60, label=f'Before 1990 (r={corr_before_1990:.3f})')
ax2.scatter(integrated_after['Sg'], integrated_after['CA'],
color='red', alpha=0.6, s=60, label=f'After 1990 (r={corr_after_1990:.3f})')
ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax2.axvline(x=0, color='black', linestyle='-', linewidth=0.5)
ax2.set_xlabel('Government Budget Balance (Billions)', fontsize=11)
ax2.set_ylabel('Current Account (Billions)', fontsize=11)
ax2.set_title('CA vs Government Balance', fontsize=12, fontweight='bold')
ax2.legend(fontsize=9)
ax2.grid(True, alpha=0.3)
# Plot 3: S-I Gap vs CA
ax3 = axes[1, 0]
ax3.scatter(integrated_before['SI_Gap'], integrated_before['CA'],
color='blue', alpha=0.6, s=60, label=f'Before 1990 (r={corr_si_ca_before:.3f})')
ax3.scatter(integrated_after['SI_Gap'], integrated_after['CA'],
color='red', alpha=0.6, s=60, label=f'After 1990 (r={corr_si_ca_after:.3f})')
ax3.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax3.axvline(x=0, color='black', linestyle='-', linewidth=0.5)
ax3.set_xlabel('S-I Gap (% of GDP)', fontsize=11)
ax3.set_ylabel('Current Account (Billions)', fontsize=11)
ax3.set_title('CA vs S-I Gap', fontsize=12, fontweight='bold')
ax3.legend(fontsize=9)
ax3.grid(True, alpha=0.3)
# Plot 4: Summary bar chart
ax4 = axes[1, 1]
categories = ['Private Savings\n/GDP (%)', 'Investment\n/GDP (%)', 'S-I Gap\n(% pts)', 'CA-Sg Corr']
before_vals = [
before_1990_q2['Savings_GDP_Ratio'].mean(),
before_1990_q2['Investment_GDP_Ratio'].mean(),
before_1990_q2['SI_Gap'].mean(),
corr_before_1990 * 10 # Scale for visibility
]
after_vals = [
after_1990_q2['Savings_GDP_Ratio'].mean(),
after_1990_q2['Investment_GDP_Ratio'].mean(),
after_1990_q2['SI_Gap'].mean(),
corr_after_1990 * 10 # Scale for visibility
]
x = np.arange(len(categories))
width = 0.35
ax4.bar(x - width/2, before_vals, width, label='Before 1990', color='blue', alpha=0.7)
ax4.bar(x + width/2, after_vals, width, label='After 1990', color='red', alpha=0.7)
ax4.set_ylabel('Value', fontsize=11)
ax4.set_title('Key Metrics Comparison', fontsize=12, fontweight='bold')
ax4.set_xticks(x)
ax4.set_xticklabels(categories, fontsize=9)
ax4.legend(fontsize=9)
ax4.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax4.grid(True, alpha=0.3, axis='y')
ax4.text(3, corr_after_1990 * 10 + 1, '(×10)', fontsize=8, ha='center')
plt.tight_layout()
plt.savefig('integrated_analysis.png', dpi=300, bbox_inches='tight')
plt.show()
print("\n✓ Graph saved as 'integrated_analysis.png'")================================================================================ INTEGRATED ANALYSIS ================================================================================ Relationship between S-I Gap and Current Account: Before 1990: r = 0.6356 After 1990: r = 0.3515
✓ Graph saved as 'integrated_analysis.png'
In [12]:
# Final summary table
summary_df = pd.DataFrame({
'Metric': [
'CA-Sg Correlation',
'Private Savings/GDP (%)',
'Investment/GDP (%)',
'S-I Gap (% pts)',
'Avg CA (Billions)',
'Avg Sg (Billions)'
],
'Before 1990': [
f"{corr_before_1990:.4f}",
f"{before_1990_q2['Savings_GDP_Ratio'].mean():.2f}",
f"{before_1990_q2['Investment_GDP_Ratio'].mean():.2f}",
f"{before_1990_q2['SI_Gap'].mean():.2f}",
f"{data_before_1990['CA'].mean():.2f}",
f"{data_before_1990['Sg'].mean():.2f}"
],
'After 1990': [
f"{corr_after_1990:.4f}",
f"{after_1990_q2['Savings_GDP_Ratio'].mean():.2f}",
f"{after_1990_q2['Investment_GDP_Ratio'].mean():.2f}",
f"{after_1990_q2['SI_Gap'].mean():.2f}",
f"{data_after_1990['CA'].mean():.2f}",
f"{data_after_1990['Sg'].mean():.2f}"
]
})
print("\n" + "="*80)
print("FINAL SUMMARY TABLE")
print("="*80)
print(summary_df.to_string(index=False))
print("="*80)
================================================================================
FINAL SUMMARY TABLE
================================================================================
Metric Before 1990 After 1990
CA-Sg Correlation 0.8246 0.5331
Private Savings/GDP (%) 8.05 4.67
Investment/GDP (%) 18.22 17.70
S-I Gap (% pts) -10.16 -13.03
Avg CA (Billions) -22.62 -446.92
Avg Sg (Billions) -65.75 -674.88
================================================================================