본문 바로가기
데이터분석/경제

고갈위기 국민연금, 과연 나는 받을 수 있을까?

by 바른 곰 2025. 3. 30.

 

고갈위기 국민연금... 과연 나는 받을 수 있을까?


주제 선정 배경

2024년 대한민국 합계출산율 " 0.74 "

 

대한민국의 인구피라미드가 뒤집혔다. 인구피라미드가 뒤집히면서 국민연금이 뜨거운 감자로 떠올랐다.

낼 사람은 없는데 받아야 할 사람은 많은 국민연금. 이대로 놔두면 기금 고갈은 시간문제였다.

그에따라 최근 일명 "더 내고 더 받기" 국민연금 개혁안이 국회 본회의를 통과했다. 안그래도 혐오와 비난이 난무하는 이 시대에 세대간의 갈등까지 극에 치달으니 정말 아쉽다.

 

정부는 현행 보험요율 9% 소득대체율 40%의 국민연금 고갈시기를 2055년에서 2057년으로 예상했다. 

 

그걸보고 나는 내가 직접 국민연금 고갈시기를 예측해보고 싶어졌다.
한번 확인해보자

활용 데이터

  • 성 및 연령별 추계인구 - KOSIS
    • 통계청에서 예측한 2072년 까지의 성별, 연령별 대한민국 추계인구 수를 나타내는 데이터

  • 국민연금 수급자 수 - e나라지표
    • 2002 ~ 2023년 까지의 국민연금 수급자 수를 나타낸 데이터

  • 국민연금 가입자 수 - 성인지통계시스템
    • 1988 ~ 2023년 까지의 국민연금 가입자 수를 나타낸 데이터

  • 연령대별 소득 - KOSIS
    • 2016 ~ 2023년 까지의 연령대별 평균소득, 중위소득을 나타낸 데이터

  • 30년간 대한민국 연평균 물가상승률 4.5%
  • 30년간 대한민국 연평균 임금상승률 5%
  • 30년간 국민연금 연평균 기금운용수익률 6.8%

분석 과정 요약

1. 추계인구, 국민연금 가입자 수 및 수급자 수 데이터를 이용해 미래 국민연금의 가입자 수 와 수급자 수를 예측한다.

 

2. 2023년 중위소득에 매년 5%(연평균 임금상승률)를 곱해 미래 중위소득을 계산한다. 계산한 중위소득에 9%(현행 국민연금 보험요율)을 곱한 후 가입자 수를 곱해 연도별 미래 기금 유입 총액을 계산한다.

 

3. 2025년 월평균 국민연금 수급액에 매년 4.5%(연평균 물가상승률)를 곱해 미래 국민연금 수급액을 계산한다. 계산한 수급액에 수급자 수를 곱해 연도별 미래 기금 유출 총액을 계산한다.

 

4. 남아있는 국민연금 기금에 연도별 유입 총액을 더하고, 유출 총액을 뺀 뒤 6.8%(연평균 기금운용수익률)을 곱해나가며 잔여기금이 0이되는 년도를 확인한다.


세부 분석 내용

1. 미래 국민연금 수급자 수 예측

국민연금은 65세 이상부터 수령이 가능하다. 미래 추계인구 중 65세 이상 인구를 국민연금 수급가능 추계인구로 설정했다.

65세 이상 추계인구와 수급자 수의 상관계수를 확인해보았다.

 

상관계수가 거의 1에 가까웠다. 따라서 미래 국민연금 수급자 수를 예측하는 모형으로 선형회귀를 채택했다.

 

선형회귀를 이용하여 미래 수급자 수를 예측한 결과 추계인구를 잘 따라가는 모양을 나타냈다.

 

2. 연도별 국민연금 기금유출액 계산

2025년의 1인당 국민연금 연평균 수급액은 8,040,000원이다. 해당 금액에 대한민국의 지난 30년간 물가상승률의 평균 4.5%를 곱해가며 2072년까지의 연평균 수급액을 계산했다.

계산한 1인당 연평균 수급액에 선형회귀로 예측한 수급자 수를 곱해 연도별 국민연금 기금유출 총액을 계산했다.

3. 미래 국민연금 가입자 수 예측

미성년자와 국민연금 수급자를 제외한 20세 ~ 64세를 국민연금 가입가능자 즉, 경제활동이 가능한 추계인구로 설정했다.

경제활동 가능 추계인구와 국민연금 가입자 수의 상관관계 또한 확인했다.

 

이 또한 선형관계를 가지고 있어 미래 국민연금 가입자 수를 예측하는 모형 또한 선형회귀를 채택했다.

모형 학습에 사용할 변수들의 스케일이 너무 컸기 때문에 가입자 수를 예측할 때는 로그변환을 적용했다.

로그변환 적용 후 선형회귀를 이용하여 미래 가입자 수를 예측한 결과 추계인구를 잘 따라가는 모양을 나타냈다.

 

4. 연도별 국민연금 기금유입액 계산

2023년의 20 ~ 64세의 1인당 연간 중위소득의 평균은 39,249,000원 이다. 해당 금액에 대한민국의 지난 30년간의 연평균 임금상승률 5%를 곱해가며 2072년 까지의 연간 중위소득의 평균을 계산했다. 계산한 중위소득에 국민연금 보험요율 9%를 곱해 1인당 연평균 국민연금 납부액을 계산했다.

계산한 1인당 연평균 국민연금 납부액에 선형회귀로 예측한 가입자 수를 곱해 연도별 국민연금 기금유입 총액을 계산했다.

 

5. 국민연금 기금 유출 · 입 총액 예측 결과 확인

예측한 기금의 유입액과 유출액을 시각화한 결과 해를 거듭할수록 국민연금의 유입보다 유출이 많아지는 것을 볼 수 있다. 국민연금을 납부할 사람은 적어지고 수령할 사람은 많아지는 현재의 상황과 예측 결과가 맞아 떨어진다.

 

6. 국민연금 기금 운용 수익률 반영 및 고갈 시기 계산

국민연금은 쌓인 기금을 운용하여 30년간 연평균 6.8%의 수익률을 내고 있다. 2024년 12월 기준 1212.9조 규모의 기금을 운용하고 있다. 잔여 기금에서 수입액을 더하고 수급액을 뺀 후 수익률을 곱해가며 기금이 고갈되는 시기를 확인했다.

 

이 부분에서 계산 순서가 중요하다. 수익률을 먼저 곱하고 수입 · 급액을 증감시킨 계산결과와,  수입 · 급액을 증감시키고 수익률을 곱하는 계산결과가 명확히 다르다. 따라서 하루 이자율과 하루 수입 · 급액 계산해 하루씩 쪼개서 계산을 진행했다.

 

계산 과정에서 잔여 기금이 음수가 되는 연도를 찾았고, 그 해가 내가 예측한 국민연금이 고갈되는 시점이다.

balance = 1212900000000000

for i in range(len(data)):
  # 하루 단위 변환
  daily_income = data['국민연금총수입액'][i] / 365  # 하루 수입액
  daily_payout = data['국민연금총수급액'][i] / 365  # 하루 수급액
  daily_return = (1 + 0.068) ** (1 / 365)  # 1일 이자율

  for day in range(365):
    balance += daily_income # 잔여기금에 하루 수입액 추가
    balance -= daily_payout # 잔여기금에서 하루 수급액 제외
    balance *= daily_return # 잔여기금에 하루 수익률 곱함

  if balance < 0:
    break
    
print(f"국민연금은 {data['년도'][i] - 1}년 에서 {data['년도'][i]}년 사이에 고갈됨")

 


결론

 

계산결과 국민연금 기금은 2066년에서 2067년 사이에 고갈될 것으로 예측된다

 

 

정부가 제시한 국민연금의 고갈시기는 2055 ~ 2057년 사이로 내 계산결과와 10년정도 차이가 난다. 하지만 기금의 추이가 비슷한 것으로 보아 만족할 만한 결과를 얻었다고 말할 수 있다.

 

내가 직접 예측한 국민연금 고갈시기는 2066년에서 2067년 사이이다.
그때 내 나이는 68세다. 
30년을 내고 3년을 받아가게 되는건데...

모든 세대가 만족할 수 있는 개혁이 이루어 지길 간절히 바랄 뿐이다

쿠키

고갈시기가 " 2066 " 년이라면... 그때 내 나이는...? ( 내 예측 )

출생연도 고갈시기 본인 나이
1980 87
1985 82
1990 77
1995 72
2000 67
2005 62

 

고갈시기가 " 2055 " 년이라면... 그때 내 나이는...? ( 정부 예측 )

출생연도 고갈시기 본인 나이
1975 81
1980 76
1985 71
1990 66
1995 61

마무리

  • 국회 본회의를 통과한 보험요율 13%, 소득대체율 43% 개혁안으로 계산을 해봤으나 아쉽게도 고갈시기가 추계인구 데이터의 마지막 예측연도인 2072년을 넘어갔다. 추후에 추계인구 데이터가 더 추가된다면 다시 분석해보고 싶다.

 

  • 국민연금은 노령연금만 있는 것이 아니다. 장애연금, 유족연금 등 다양하다. 하지만 나이만 가지고 국민연금 수급자를 분류해 내야 했기 때문에 노령연금 수급가능 연령인 65세 이상으로만 수급가능추계인구를 설정했다.

 

  • 평균에는 함정이 존재한다. 이상치에 민감하다는 것인데, 마이클조던이 노스캐롤라이나대학교 경제학과를 졸업생의 평균 연봉 1억 3천만원으로 올려놓은 것이 그 예시이다. 이를 방지하기 위해 우리는 평균과 분산을 함께 확인하거나, 중위수를 사용한다. 소득 같은 경우는 평균의 함정에 빠지기 쉽기 때문에 중위소득을 사용했다.

 

  • 많은 시행착오가 있었다. 시계열 모형인 VAR로 미래 가입자 수를 예측해보기도 하고, 특정 연도를 기준으로 지난 10년간의 물가상승률, 임금상승률의 평균을 이용해 미래의 수급액, 소득을 예측해보기도 했다. 해당 아이디어는 만족스러운 결과가 아니었기에 기각되었지만 추계인구가 없을때의 예측방안 등 새로운 아이디어를 떠올릴 수 있었던 좋은 경험이었다.

최종코드

국민연금 수급자 수 예측

# 추계인구 계산
data = pd.read_excel('/content/drive/MyDrive/공모전/블로그/국민연금 분석데이터/추계인구_KOSIS.xlsx')
국민연금수급가능추계인구 = data.iloc[14:, 17:].sum().to_frame().T # 국민연금 수급가능연령 65세 이상 총 추계인구 수
국민연금수급가능추계인구.columns = 국민연금수급가능추계인구.columns.astype('int')
국민연금수급가능추계인구 = 국민연금수급가능추계인구.T.reset_index(names='년도')
국민연금수급가능추계인구.columns = ['년도', '국민연금수급가능추계인구']

# 수급자 수 계산
data = pd.read_excel('/content/drive/MyDrive/공모전/블로그/국민연금 분석데이터/국민연금_수급자수_e나라지표.xlsx')
국민연금수급자수 = data.iloc[:, 1:]
국민연금수급자수.columns = 국민연금수급자수.columns.astype('int')
국민연금수급자수 = 국민연금수급자수.T.reset_index()
국민연금수급자수.columns = ['년도', '국민연금수급자수']

df_pension = 국민연금수급자수.copy()
df_population = 국민연금수급가능추계인구.copy()

df = pd.merge(df_population, df_pension, on = '년도', how = 'left')

# 수급자 수 예측 모델링
# train 과 예측 프레임 분리
train = df.loc[df['년도'] < 2024]
predict = df.loc[df['년도'] >= 2024]

x = train.iloc[:, 0: 2]
y = train['국민연금수급자수']

predict_x = predict.iloc[:, 0: 2]
predict_y = predict['국민연금수급자수']

lr = LinearRegression()

lr.fit(x, y)

predict['국민연금수급자수'] = lr.predict(predict_x)

국민연금수급자수 = predict[['년도', '국민연금수급자수']].reset_index(drop = True).iloc[1:, :]

 

국민연금 수급 총액 계산

price = pd.DataFrame()
# 예측 연도 범위
future_years = range(2025, 2073)

# 2070년까지 예측 진행
for year in future_years:
    avg_growth_rate = 0.045
    # 다음 연도 예측
    price[year] = avg_growth_rate

# 시작값 설정 (2025년 기준)
initial_value = 670000 * 12

# 예측 데이터프레임 생성
predicted_price = pd.DataFrame(columns=price.columns)

# 2025년 시작값 설정
predicted_price.loc[0, 2025] = initial_value

# 이후 연도 예측 (누적 곱)
for year in price.columns[1:]:  # 2026년부터 시작
    prev_year = year - 1  # 이전 연도
    predicted_price[year] = (predicted_price[prev_year] * (1 + 0.045)).round() # 평균물가상승률

# 결과 출력
predicted_price = predicted_price.T.reset_index()
predicted_price.columns = ['년도', '연평균수급액']

국민연금총수급액 = pd.merge(국민연금수급자수, predicted_price)
국민연금총수급액['국민연금총수급액'] = 국민연금총수급액['국민연금수급자수'] * 국민연금총수급액['연평균수급액']
국민연금총수급액.head()

 

국민연금 가입자 수 예측

# 추계인구 계산
data = pd.read_excel('/content/drive/MyDrive/공모전/블로그/국민연금 분석데이터/추계인구_KOSIS.xlsx')
경제활동가능추계인구 = data.iloc[5:14, 3:].sum().to_frame().T # 20 ~ 64 세 데이터만 추출
경제활동가능추계인구.columns = 경제활동가능추계인구.columns.astype('int')
경제활동가능추계인구 = 경제활동가능추계인구.T.reset_index(names='년도')
경제활동가능추계인구.columns = ['년도', '경제활동가능추계인구']

# 가입자 수 계산
data = pd.read_excel('/content/drive/MyDrive/공모전/블로그/국민연금 분석데이터/국민연금_가입자수_성인지통계시스템.xlsx')
국민연금가입자수 = data.iloc[3:, 2:].sum().to_frame().T
국민연금가입자수.columns = 국민연금가입자수.columns.astype('int')
국민연금가입자수 = 국민연금가입자수.T.reset_index()
국민연금가입자수.columns = ['년도', '국민연금가입자수']

df_pension = 국민연금가입자수.copy()
df_population = 경제활동가능추계인구.copy()

df = pd.merge(df_population, df_pension, on = '년도', how = 'left')

# 가입자 수 예측 모델링
# train 과 예측 프레임 분리
train = df.loc[(df['년도'] < 2024) & (df['년도'] > 2005)]
predict = df.loc[df['년도'] >= 2024]

x = np.log1p(train.iloc[:, 0: 2]) # 로그변환 적용
y = np.log1p(train['국민연금가입자수'].astype(float))

predict_x = np.log1p(predict.iloc[:, 0: 2])
predict_y = np.log1p(predict['국민연금가입자수'].astype(float))

lr = LinearRegression()

lr.fit(x, y)

predict['국민연금가입자수'] = np.expm1(lr.predict(predict_x)) # 로그변환 된 값 다시 복구

국민연금가입자수 = predict[['년도', '국민연금가입자수']].reset_index(drop = True)

국민연금 수입 총액 계산

data = pd.read_excel('/content/drive/MyDrive/공모전/블로그/국민연금 분석데이터/연령대별_중위소득_KOSIS.xlsx') #단위 만원
data.head()

# 필요없는 열, 행 제거
# 국민연금은 4대보험 가입자가 내기때문에 평균 취업연령인 27세가 포함되어있는 25~29세부터 시작
data = data.iloc[2:10, 2:].reset_index(drop = True)

# 연평균 임금으로 전환
# 단위 "만원" 에서 "원" 으로 변환
data *= 10000 * 12
data

data = data.iloc[:, 1:]
data.columns = data.columns.astype('int')

data.iloc[:, 1:].columns = data.iloc[:, 1:].columns.astype('int')

# 예측 연도 범위
future_years = range(2024, 2073)  # 2024년부터 2073년까지 예측

# 2070년까지 예측 진행
for year in future_years:
    avg_growth_rate = 0.05 # 평균임금상승률

    # 다음 연도 예측
    data[year] = (data[year-1] * (1 + avg_growth_rate))

# 매년 걷어질 국민연금 액수

salary = data.copy()
salary = salary.iloc[:, 7:]

salary = salary.mean().to_frame().reset_index()
salary.columns = ['년도', '연평균중위소득']

국민연금총수입액 = pd.merge(국민연금가입자수, salary)
국민연금총수입액['국민연금총수입액'] = 국민연금총수입액['국민연금가입자수'] * (국민연금총수입액['연평균중위소득'] * 0.09)

 

 

최종 국민연금 고갈시기 계산

# 최종 데이터 셋 생성
data = pd.merge(국민연금총수입액, 국민연금총수급액)[['년도', '국민연금총수입액', '국민연금총수급액']].astype(int)

# 고갈시기 계산
age = int(input('출생연도 입력 :'))
balance = 1212900000000000

for i in range(len(data)):
  # 하루 단위 변환
  daily_income = data['국민연금총수입액'][i] / 365  # 하루 수입액
  daily_payout = data['국민연금총수급액'][i] / 365  # 하루 수급액
  daily_return = (1 + 0.068) ** (1 / 365)  # 1일 이자율

  for day in range(365):
    balance += daily_income
    balance -= daily_payout
    balance *= daily_return

  if balance < 0:
    break

print(f"국민연금은 {data['년도'][i] - 1}년 에서 {data['년도'][i]}년 사이에 고갈됨")
print(f"고갈시기의 본인 나이는 {data['년도'][i] - 1 - age + 1}임")