데이터 크롤링 맛보기

yfinance
plotly
Author

강신성

Published

2023-11-27

야후 파이낸셜을 이용하여 출산률 자료를 시각화해보자!

1. 라이브러리 imports

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
  • 교수님 의견

현존하는 시각화 툴 중에서 가장 뛰어난 것은 excel이라고 생각이 된다.

but, pandas를 더 잘 다루는 사람이 처리속도가 더 빠르다고 생각이 됨. 높은 숙련도를 가진다면 엑셀 사용자보다 더 높은 퍼포먼스를 보여줄 수 있을 것!

2. yfinance를 이용한 주식 자료 시각화

A. 크롤링 + 데이터 정리


야후 파이낸셜에서 원하는 종목을 검색해서 그 코드를 가져와보았다…

Apple : AAPL

삼성전자 : 005930.KS

- 관심있는 데이터를 크롤링하는 코드

symbols = ['AMZN','AAPL','GOOG','MSFT','NFLX','NVDA','TSLA']    ## 관심있는 주식들
start = '2020-01-01'    ## 수집 시점
end = '2023-11-06'    ## 수집 종점
df = yf.download(symbols,start,end)
[*********************100%%**********************]  7 of 7 completed
df
Adj Close Close ... Open Volume
AAPL AMZN GOOG MSFT NFLX NVDA TSLA AAPL AMZN GOOG ... NFLX NVDA TSLA AAPL AMZN GOOG MSFT NFLX NVDA TSLA
Date
2020-01-02 73.152664 94.900497 68.368500 154.779510 329.809998 59.749290 28.684000 75.087502 94.900497 68.368500 ... 326.100006 59.687500 28.299999 135480400 80580000 28132000 22622100 4485800 23753600 142981500
2020-01-03 72.441475 93.748497 68.032997 152.852264 325.899994 58.792946 29.534000 74.357498 93.748497 68.032997 ... 326.779999 58.775002 29.366667 146322800 75288000 23728000 21116200 3806900 20538400 266677500
2020-01-06 73.018684 95.143997 69.710503 153.247330 335.829987 59.039501 30.102667 74.949997 95.143997 69.710503 ... 323.119995 58.080002 29.364668 118387200 81236000 34646000 20813700 5663100 26263600 151995000
2020-01-07 72.675278 95.343002 69.667000 151.850067 330.750000 59.754280 31.270666 74.597504 95.343002 69.667000 ... 336.470001 59.549999 30.760000 108872000 80898000 30054000 21634100 4703200 31485600 268231500
2020-01-08 73.844345 94.598503 70.216003 154.268814 339.260010 59.866348 32.809334 75.797501 94.598503 70.216003 ... 331.489990 59.939999 31.580000 132079200 70160000 30560000 27746500 7104500 27710800 467164500
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2023-10-30 170.065933 132.710007 125.750000 336.626770 410.079987 411.609985 197.360001 170.289993 132.710007 125.750000 ... 402.350006 410.869995 209.279999 51131000 72485500 24165600 22828100 5317100 38802800 136448200
2023-10-31 170.545319 133.089996 125.300003 337.425140 411.690002 407.799988 200.839996 170.770004 133.089996 125.300003 ... 409.239990 404.500000 196.119995 44846000 51589400 21123400 20265300 3877600 51796900 118068300
2023-11-01 173.741104 137.000000 127.570000 345.369019 420.190002 423.250000 205.660004 173.970001 137.000000 127.570000 ... 414.769989 408.839996 204.039993 56934900 61529400 26536600 28158800 4806100 43759300 121661700
2023-11-02 177.336380 138.070007 128.580002 347.614471 424.709991 435.059998 218.509995 177.570007 138.070007 128.580002 ... 421.170013 433.279999 212.970001 77334800 52236700 24091700 24348100 4476000 40917200 125987600
2023-11-03 176.417572 138.600006 130.369995 352.085388 432.359985 450.049988 219.960007 176.649994 138.600006 130.369995 ... 428.760010 440.200012 221.149994 79763700 44007200 19517900 23624000 3664800 42385500 119281000

968 rows × 42 columns

wide data로 들어가 있어서 작업이 필요한 모습이다.

df.stack()
Adj Close Close High Low Open Volume
Date
2020-01-02 AAPL 73.249031 75.087502 75.150002 73.797501 74.059998 135480400
AMZN 94.900497 94.900497 94.900497 93.207497 93.750000 80580000
GOOG 68.368500 68.368500 68.406998 67.077499 67.077499 28132000
MSFT 155.093689 160.619995 160.729996 158.330002 158.779999 22622100
NFLX 329.809998 329.809998 329.980011 324.779999 326.100006 4485800
... ... ... ... ... ... ... ...
2023-11-03 GOOG 130.369995 130.369995 130.729996 129.009995 129.089996 19517900
MSFT 352.799988 352.799988 354.390015 347.329987 349.630005 23624000
NFLX 432.359985 432.359985 434.820007 425.529999 428.760010 3664800
NVDA 450.049988 450.049988 453.089996 437.230011 440.200012 42385500
TSLA 219.960007 219.960007 226.369995 218.399994 221.149994 119281000

6776 rows × 6 columns

- 이 중 조정된 종가(Adj Close)만을 알아보고 싶다면?

df.stack().loc[:, 'Adj Close'].reset_index()
## df.stack()['Adj Close'].reset_index()
Date level_1 Adj Close
0 2020-01-02 AAPL 73.249031
1 2020-01-02 AMZN 94.900497
2 2020-01-02 GOOG 68.368500
3 2020-01-02 MSFT 155.093689
4 2020-01-02 NFLX 329.809998
... ... ... ...
6771 2023-11-03 GOOG 130.369995
6772 2023-11-03 MSFT 352.799988
6773 2023-11-03 NFLX 432.359985
6774 2023-11-03 NVDA 450.049988
6775 2023-11-03 TSLA 219.960007

6776 rows × 3 columns

- 다른 방법(멀티 인덱스 이용)

df.columns
MultiIndex([('Adj Close', 'AAPL'),
            ('Adj Close', 'AMZN'),
            ('Adj Close', 'GOOG'),
            ('Adj Close', 'MSFT'),
            ('Adj Close', 'NFLX'),
            ('Adj Close', 'NVDA'),
            ('Adj Close', 'TSLA'),
            (    'Close', 'AAPL'),
            (    'Close', 'AMZN'),
            (    'Close', 'GOOG'),
            (    'Close', 'MSFT'),
            (    'Close', 'NFLX'),
            (    'Close', 'NVDA'),
            (    'Close', 'TSLA'),
            (     'High', 'AAPL'),
            (     'High', 'AMZN'),
            (     'High', 'GOOG'),
            (     'High', 'MSFT'),
            (     'High', 'NFLX'),
            (     'High', 'NVDA'),
            (     'High', 'TSLA'),
            (      'Low', 'AAPL'),
            (      'Low', 'AMZN'),
            (      'Low', 'GOOG'),
            (      'Low', 'MSFT'),
            (      'Low', 'NFLX'),
            (      'Low', 'NVDA'),
            (      'Low', 'TSLA'),
            (     'Open', 'AAPL'),
            (     'Open', 'AMZN'),
            (     'Open', 'GOOG'),
            (     'Open', 'MSFT'),
            (     'Open', 'NFLX'),
            (     'Open', 'NVDA'),
            (     'Open', 'TSLA'),
            (   'Volume', 'AAPL'),
            (   'Volume', 'AMZN'),
            (   'Volume', 'GOOG'),
            (   'Volume', 'MSFT'),
            (   'Volume', 'NFLX'),
            (   'Volume', 'NVDA'),
            (   'Volume', 'TSLA')],
           )
## df.loc[:, ('Adj Close', 'AAPL'):('Adj Close', 'TSLA')]
df.loc[:, 'Adj Close']
AAPL AMZN GOOG MSFT NFLX NVDA TSLA
Date
2020-01-02 73.249031 94.900497 68.368500 155.093689 329.809998 59.749298 28.684000
2020-01-03 72.536888 93.748497 68.032997 153.162460 325.899994 58.792942 29.534000
2020-01-06 73.114883 95.143997 69.710503 153.558350 335.829987 59.039497 30.102667
2020-01-07 72.771027 95.343002 69.667000 152.158279 330.750000 59.754265 31.270666
2020-01-08 73.941635 94.598503 70.216003 154.581909 339.260010 59.866344 32.809334
... ... ... ... ... ... ... ...
2023-10-30 170.289993 132.710007 125.750000 337.309998 410.079987 411.609985 197.360001
2023-10-31 170.770004 133.089996 125.300003 338.109985 411.690002 407.799988 200.839996
2023-11-01 173.970001 137.000000 127.570000 346.070007 420.190002 423.250000 205.660004
2023-11-02 177.570007 138.070007 128.580002 348.320007 424.709991 435.059998 218.509995
2023-11-03 176.649994 138.600006 130.369995 352.799988 432.359985 450.049988 219.960007

968 rows × 7 columns

멀티 인덱스 중 첫 번째 인덱스를 지정하여 뽑아낼 수 있다.

- 애플(AAPL)만 뽑고 싶을 때

df.loc[:, 'AAPL']  ## 이건 안된다.
KeyError: ignored

하지만 뒤에껀 인식하지 못하는 모습.

- 굳이 위와 같은 방법으로 쓰고 싶다면…(df.swaplevel())

df.stack().stack().swaplevel(i=1, j=2)    ## 인덱스의 순서를 바꿀 수 있음.
Date                       
2020-01-02  Adj Close  AAPL    7.315266e+01
            Close      AAPL    7.508750e+01
            High       AAPL    7.515000e+01
            Low        AAPL    7.379750e+01
            Open       AAPL    7.406000e+01
                                   ...     
2023-11-03  Close      TSLA    2.199600e+02
            High       TSLA    2.263700e+02
            Low        TSLA    2.184000e+02
            Open       TSLA    2.211500e+02
            Volume     TSLA    1.192810e+08
Length: 40656, dtype: float64
df.stack().stack().swaplevel(i=1, j=2).unstack().unstack()
AAPL AMZN ... NVDA TSLA
Adj Close Close High Low Open Volume Adj Close Close High Low ... High Low Open Volume Adj Close Close High Low Open Volume
Date
2020-01-02 73.249031 75.087502 75.150002 73.797501 74.059998 135480400.0 94.900497 94.900497 94.900497 93.207497 ... 59.977501 59.180000 59.687500 23753600.0 28.684000 28.684000 28.713333 28.114000 28.299999 142981500.0
2020-01-03 72.536888 74.357498 75.144997 74.125000 74.287498 146322800.0 93.748497 93.748497 94.309998 93.224998 ... 59.457500 58.525002 58.775002 20538400.0 29.534000 29.534000 30.266666 29.128000 29.366667 266677500.0
2020-01-06 73.114883 74.949997 74.989998 73.187500 73.447502 118387200.0 95.143997 95.143997 95.184502 93.000000 ... 59.317501 57.817501 58.080002 26263600.0 30.102667 30.102667 30.104000 29.333332 29.364668 151995000.0
2020-01-07 72.771027 74.597504 75.224998 74.370003 74.959999 108872000.0 95.343002 95.343002 95.694504 94.601997 ... 60.442501 59.097500 59.549999 31485600.0 31.270666 31.270666 31.441999 30.224001 30.760000 268231500.0
2020-01-08 73.941635 75.797501 76.110001 74.290001 74.290001 132079200.0 94.598503 94.598503 95.550003 94.321999 ... 60.509998 59.537498 59.939999 27710800.0 32.809334 32.809334 33.232666 31.215334 31.580000 467164500.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2023-10-30 170.289993 170.289993 171.169998 168.869995 169.020004 51131000.0 132.710007 132.710007 133.000000 128.559998 ... 417.660004 404.809998 410.869995 38802800.0 197.360001 197.360001 210.880005 194.669998 209.279999 136448200.0
2023-10-31 170.770004 170.770004 170.899994 167.899994 169.350006 44846000.0 133.089996 133.089996 133.570007 131.710007 ... 408.790009 392.299988 404.500000 51796900.0 200.839996 200.839996 202.800003 194.070007 196.119995 118068300.0
2023-11-01 173.970001 173.970001 174.229996 170.119995 171.000000 56934900.0 137.000000 137.000000 137.350006 133.710007 ... 423.809998 408.690002 408.839996 43759300.0 205.660004 205.660004 205.990005 197.850006 204.039993 121661700.0
2023-11-02 177.570007 177.570007 177.779999 175.460007 175.520004 77334800.0 138.070007 138.070007 138.809998 136.470001 ... 438.839996 428.940002 433.279999 40917200.0 218.509995 218.509995 219.199997 211.449997 212.970001 125987600.0
2023-11-03 176.649994 176.649994 176.820007 173.350006 174.240005 79763700.0 138.600006 138.600006 139.490005 137.449997 ... 453.089996 437.230011 440.200012 42385500.0 219.960007 219.960007 226.369995 218.399994 221.149994 119281000.0

968 rows × 42 columns

이러면 상호가 멀티인덱스의 앞에 생기게 되어 잘 된다.

df.swaplevel(i=0, j=1, axis = 1)
AAPL AMZN GOOG MSFT NFLX NVDA TSLA AAPL AMZN GOOG ... NFLX NVDA TSLA AAPL AMZN GOOG MSFT NFLX NVDA TSLA
Adj Close Adj Close Adj Close Adj Close Adj Close Adj Close Adj Close Close Close Close ... Open Open Open Volume Volume Volume Volume Volume Volume Volume
Date
2020-01-02 73.249031 94.900497 68.368500 155.093689 329.809998 59.749298 28.684000 75.087502 94.900497 68.368500 ... 326.100006 59.687500 28.299999 135480400 80580000 28132000 22622100 4485800 23753600 142981500
2020-01-03 72.536888 93.748497 68.032997 153.162460 325.899994 58.792942 29.534000 74.357498 93.748497 68.032997 ... 326.779999 58.775002 29.366667 146322800 75288000 23728000 21116200 3806900 20538400 266677500
2020-01-06 73.114883 95.143997 69.710503 153.558350 335.829987 59.039497 30.102667 74.949997 95.143997 69.710503 ... 323.119995 58.080002 29.364668 118387200 81236000 34646000 20813700 5663100 26263600 151995000
2020-01-07 72.771027 95.343002 69.667000 152.158279 330.750000 59.754265 31.270666 74.597504 95.343002 69.667000 ... 336.470001 59.549999 30.760000 108872000 80898000 30054000 21634100 4703200 31485600 268231500
2020-01-08 73.941635 94.598503 70.216003 154.581909 339.260010 59.866344 32.809334 75.797501 94.598503 70.216003 ... 331.489990 59.939999 31.580000 132079200 70160000 30560000 27746500 7104500 27710800 467164500
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2023-10-30 170.289993 132.710007 125.750000 337.309998 410.079987 411.609985 197.360001 170.289993 132.710007 125.750000 ... 402.350006 410.869995 209.279999 51131000 72485500 24165600 22828100 5317100 38802800 136448200
2023-10-31 170.770004 133.089996 125.300003 338.109985 411.690002 407.799988 200.839996 170.770004 133.089996 125.300003 ... 409.239990 404.500000 196.119995 44846000 51589400 21123400 20265300 3877600 51796900 118068300
2023-11-01 173.970001 137.000000 127.570000 346.070007 420.190002 423.250000 205.660004 173.970001 137.000000 127.570000 ... 414.769989 408.839996 204.039993 56934900 61529400 26536600 28158800 4806100 43759300 121661700
2023-11-02 177.570007 138.070007 128.580002 348.320007 424.709991 435.059998 218.509995 177.570007 138.070007 128.580002 ... 421.170013 433.279999 212.970001 77334800 52236700 24091700 24348100 4476000 40917200 125987600
2023-11-03 176.649994 138.600006 130.369995 352.799988 432.359985 450.049988 219.960007 176.649994 138.600006 130.369995 ... 428.760010 440.200012 221.149994 79763700 44007200 19517900 23624000 3664800 42385500 119281000

968 rows × 42 columns

이렇게 바꿔도 됨(정리는 안 되어있는데, 일단 되긴 함.)

- 제일 편한 거(타이디데이터로 만들고 정리)

df.stack().reset_index().rename({'level_1' : 'Subject'}, axis =1)  ## 타이디데이터로 만듦
##.loc[lambda _df : _df.Subject == 'AAPL']
Date Subject Adj Close Close High Low Open Volume
0 2020-01-02 AAPL 73.249031 75.087502 75.150002 73.797501 74.059998 135480400
1 2020-01-02 AMZN 94.900497 94.900497 94.900497 93.207497 93.750000 80580000
2 2020-01-02 GOOG 68.368500 68.368500 68.406998 67.077499 67.077499 28132000
3 2020-01-02 MSFT 155.093689 160.619995 160.729996 158.330002 158.779999 22622100
4 2020-01-02 NFLX 329.809998 329.809998 329.980011 324.779999 326.100006 4485800
... ... ... ... ... ... ... ... ...
6771 2023-11-03 GOOG 130.369995 130.369995 130.729996 129.009995 129.089996 19517900
6772 2023-11-03 MSFT 352.799988 352.799988 354.390015 347.329987 349.630005 23624000
6773 2023-11-03 NFLX 432.359985 432.359985 434.820007 425.529999 428.760010 3664800
6774 2023-11-03 NVDA 450.049988 450.049988 453.089996 437.230011 440.200012 42385500
6775 2023-11-03 TSLA 219.960007 219.960007 226.369995 218.399994 221.149994 119281000

6776 rows × 8 columns

### B. 시각화

- Adj Close를 기반으로 tidydata를 생성

df.loc[:,'Adj Close'].reset_index().set_index('Date').stack().reset_index().rename({'level_1' : 'Company', 0 : 'Price'}, axis = 1)
Date Company Price
0 2020-01-02 AAPL 73.249031
1 2020-01-02 AMZN 94.900497
2 2020-01-02 GOOG 68.368500
3 2020-01-02 MSFT 155.093689
4 2020-01-02 NFLX 329.809998
... ... ... ...
6771 2023-11-03 GOOG 130.369995
6772 2023-11-03 MSFT 352.799988
6773 2023-11-03 NFLX 432.359985
6774 2023-11-03 NVDA 450.049988
6775 2023-11-03 TSLA 219.960007

6776 rows × 3 columns

- 시각화 : 판다스 데이터프레임 자체 함수를 이용

df.loc[:,'Adj Close'].reset_index().set_index('Date').stack().reset_index().rename({'level_1' : 'Company', 0 : 'Price'}, axis = 1)\
.plot.line(x = 'Date', y = 'Price', color = 'Company', backend = 'plotly')  ## plotly라는 녀석으로 그리고 싶음

- df.plot()은 라인 플랏을 디폴트로 한다.

df.loc[:,'Adj Close'].reset_index().set_index('Date').stack().reset_index().rename({'level_1' : 'Company', 0 : 'Price'}, axis = 1)\
.plot(x = 'Date', y = 'Price', color = 'Company', backend = 'plotly')  ## 얘도 똑같음, 디폴트가 line plot

plotly : 상당히 강력한 툴임, 아무튼 이미지적으로 지원하는 게 되게 많음.

  • 무슨 데이터이든 타이디데이터로 만들어두기만 하면 그래프로 그리는 것은 쉬운 과정이다. 그래프의 옵션같은 것들은 단순 암기나 검색, ChatGPT등을 통해 해결되는 부분이므로 데이터 가공 능력이 훨씬 중요하다.

3. 출산률 시각화

A. 크롤링 + 데이터 정리


- 대한민국의 저출산 문제

ref: https://ko.wikipedia.org/wiki/대한민국의_저출산

- 위의 url에서 3, 5번째 테이블을 읽고 싶다.

  • 3번째 테이블 : 시도별 출산율
  • 5번째 테이블 : 시도별 출생아 수

url을 긁어서 그대로 읽으면 된다.

df_lst = pd.read_html('https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%A0%80%EC%B6%9C%EC%82%B0')
df_lst
[      연도    출산율
 0   2002  1.178
 1   2003  1.191
 2   2004  1.164
 3   2005  1.085
 4   2006  1.132
 5   2007  1.259
 6   2008  1.192
 7   2009  1.149
 8   2010  1.226
 9   2011  1.244
 10  2012  1.297
 11  2013  1.187
 12  2014  1.205
 13  2015  1.239
 14  2016  1.172
 15  2017  1.052
 16  2018  0.977
 17  2019  0.918
 18  2020  0.837
 19  2021  0.810,
           지역  출생아 수(천명)  조출생률  합계출산율  인구(2021년 기준)
 0         서울       47.4   5.0  0.642       9588711
 1         부산       15.1   4.5  0.747       3369704
 2         대구       11.2   4.6  0.807       2406296
 3         대전        7.5   5.1  0.829       1457619
 4         광주        7.3   5.1  0.811       1444787
 5         인천       16.0   5.5  0.829       2936214
 6        경기도       77.8   5.9  0.878      13479798
 7       전라북도        8.2   4.5  0.909       1796331
 8       경상남도       16.8   5.1  0.945       3329623
 9       충청북도        8.6   5.4  0.983       1596303
 10        울산        6.6   5.8  0.984       1128163
 11      경상북도       12.9   4.9  1.003       2635896
 12       제주도        4.0   6.0  1.021        674484
 13      충청남도       11.9   5.7  1.029       2116452
 14       강원도        7.8   5.1  1.036       1536175
 15      전라남도        9.7   5.3  1.145       1844148
 16        세종        3.5  10.0  1.277        361396
 17  대한민국(전체)      272.4   5.3  0.837      51702100,
    지역/연도[6]  2005 2006[7]  2007 2008[8] 2009[9]  2010  2011  2012  2013  2014  \
 0        서울  0.92    0.97  1.06    1.01    0.96  1.02  1.01  1.06  0.97  0.98   
 1        부산  0.88    0.91  1.02    0.98    0.94  1.05  1.08  1.14  1.05  1.09   
 2        대구  0.99    1.00  1.13    1.07    1.03  1.11  1.15  1.22  1.13  1.17   
 3        인천  1.07    1.11  1.25    1.19    1.14  1.21  1.23  1.30  1.20  1.21   
 4        광주  1.10    1.14  1.26    1.20    1.14  1.22  1.23  1.30  1.17  1.20   
 5        대전  1.10    1.15  1.27    1.22    1.16  1.21  1.26  1.32  1.23  1.25   
 6        울산  1.18    1.24  1.40    1.34    1.31  1.37  1.39  1.48  1.39  1.44   
 7        세종     -       -     -       -       -     -     -  1.60  1.44  1.35   
 8        경기  1.17    1.23  1.35    1.29    1.23  1.31  1.31  1.36  1.23  1.24   
 9        강원  1.18    1.19  1.35    1.25    1.25  1.31  1.34  1.37  1.25  1.25   
 10       충북  1.19    1.22  1.39    1.32    1.32  1.40  1.43  1.49  1.37  1.36   
 11       충남  1.26    1.35  1.50    1.44    1.41  1.48  1.50  1.57  1.44  1.42   
 12       전북  1.17    1.20  1.37    1.31    1.28  1.37  1.41  1.44  1.32  1.33   
 13       전남  1.28    1.33  1.53    1.45    1.45  1.54  1.57  1.64  1.52  1.50   
 14       경북  1.17    1.20  1.36    1.31    1.27  1.38  1.43  1.49  1.38  1.41   
 15       경남  1.18    1.25  1.43    1.37    1.32  1.41  1.45  1.50  1.37  1.41   
 16       제주  1.30    1.36  1.48    1.39    1.38  1.46  1.49  1.60  1.43  1.48   
 17       전국  1.08    1.13  1.25    1.19    1.15  1.23  1.24  1.30  1.19  1.21   
 
     2015  2016  2017  2018  2019  2020  2021  
 0   1.00  0.94  0.84  0.76  0.72  0.64  0.63  
 1   1.14  1.10  0.98  0.90  0.83  0.75  0.73  
 2   1.22  1.19  1.07  0.99  0.93  0.81  0.78  
 3   1.22  1.14  1.01  1.01  0.94  0.83  0.78  
 4   1.21  1.17  1.05  0.97  0.91  0.81  0.90  
 5   1.28  1.19  1.08  0.95  0.88  0.81  0.81  
 6   1.49  1.42  1.26  1.13  1.08  0.99  0.94  
 7   1.89  1.82  1.67  1.57  1.47  1.28  1.28  
 8   1.27  1.19  1.07  1.00  0.94  0.88  0.85  
 9   1.31  1.24  1.12  1.07  1.08  1.04  0.98  
 10  1.41  1.36  1.24  1.17  1.05  0.98  0.95  
 11  1.48  1.40  1.28  1.19  1.11  1.03  0.96  
 12  1.35  1.25  1.15  1.04  0.97  0.91  0.85  
 13  1.55  1.47  1.33  1.24  1.23  1.15  1.02  
 14  1.46  1.40  1.26  1.17  1.09  1.00  0.97  
 15  1.44  1.36  1.23  1.12  1.05  0.95  0.90  
 16  1.48  1.43  1.31  1.22  1.15  1.02  0.95  
 17  1.24  1.17  1.05  0.98  0.92  0.84  0.81  ,
    지역/연도[6]  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020
 0        서울   9.2   9.0   9.3   8.4   8.4   8.4   7.7   6.7   6.0   5.6   5.0
 1        부산   7.8   7.9   8.2   7.4   7.5   7.7   7.2   6.2   5.6   5.0   4.5
 2        대구   8.3   8.3   8.6   7.8   7.8   7.9   7.4   6.6   5.9   5.4   4.6
 3        인천   9.5   9.5   9.9   9.0   9.0   8.8   8.1   7.0   6.9   6.3   5.5
 4        광주   9.7   9.6   9.9   8.7   8.7   8.5   7.9   6.9   6.3   5.8   5.1
 5        대전   9.6   9.9  10.1   9.3   9.2   9.1   8.3   7.2   6.3   5.7   5.1
 6        울산  10.2  10.3  10.7   9.9  10.0  10.1   9.4   8.1   7.1   6.6   5.8
 7        세종     -     -  10.2   9.5   9.7  14.8  14.6  13.4  12.5  11.7  10.0
 8        경기  10.5  10.4  10.5   9.3   9.2   9.2   8.4   7.4   6.9   6.4   5.9
 9        강원   8.2   8.2   8.2   7.2   7.0   7.1   6.5   5.8   5.4   5.4   5.1
 10       충북   9.6   9.6   9.8   8.8   8.5   8.6   8.1   7.2   6.7   5.9   5.4
 11       충남   9.9   9.8  10.2   9.2   8.9   9.0   8.3   7.5   6.8   6.3   5.7
 12       전북   8.7   8.7   8.7   7.8   7.7   7.6   6.8   6.1   5.5   4.9   4.5
 13       전남   8.7   8.7   9.0   8.1   7.8   8.2   7.4   6.5   6.0   5.8   5.3
 14       경북   8.9   9.1   9.2   8.3   8.2   8.3   7.7   6.7   6.0   5.5   4.9
 15       경남   9.9   9.9  10.1   8.9   9.0   8.9   8.1   7.1   6.3   5.7   5.1
 16       제주  10.0   9.9  10.4   9.1   9.3   9.2   8.7   7.8   7.3   6.8   6.0
 17       전국   9.4   9.4   9.6   8.6   8.6   8.6   7.9   7.0   6.4   5.9   5.3,
    지역/연도[6]    2010    2011        2012        2013        2014    2015  \
 0        서울   93266   91526   93914.000   84066.000   83711.000   83005   
 1        부산   27415   27759   28673.000   25831.000   26190.000   26645   
 2        대구   20557   20758   21472.000   19340.000   19361.000   19438   
 3        인천   25752   20758   21472.000   25560.000   25786.000   25491   
 4        광주   13979   13916   14392.000   12729.000   12729.000   12441   
 5        대전   14314   14808   15279.000   14099.000   13962.000   13774   
 6        울산   11432   11542   12160.000   11330.000   11556.000   11732   
 7        세종       -       -    1054.000    1111.000    1344.000    2708   
 8        경기  121753  122027  124746.000  112129.000     112.169  113495   
 9        강원   12477   12408   12426.000   10980.000   10662.000   10929   
 10       충북   14670   14804   15139.000   13658.000   13366.000   13563   
 11       충남  20.242  20.398      20.448      18.628   18200.000   18604   
 12       전북   16100   16175   16238.000   14555.000   14231.000   14087   
 13       전남   16654   16612   16990.000   15401.000   14817.000   15061   
 14       경북   23700   24250   24635.000   22206.000   22062.000   22310   
 15       경남   32203   32536   33211.000   29504.000   29763.000   29537   
 16       제주    5657    5628    5992.000    5328.000    5526.000    5600   
 17       전국  470171  471265  484550.000  436455.000  435435.000  438420   
 
           2016    2017    2018        2019    2020    2021  
 0       75.536   65389   58074      53.673   47400   45531  
 1    24906.000   21480   19152   17049.000   15100   14446  
 2    18298.000   15946   14400   13233.000   11200   10661  
 3    23609.000   20445   20087   18522.000   16000   14947  
 4    11580.000   10120    9105    8364.000    7300    7956  
 5    12436.000   10851    9337    8410.000    7500    7414  
 6    10910.000    9381    8149    7539.000    6600    6127  
 7     3297.000    3504    3703    3819.000    3500    3570  
 8   105643.000   94088   83198      83.198   77800   76139  
 9    10058.000    9958    8351    8283.000    7800    7357  
 10   12742.000   11394   10586    9333.000    8600    8190  
 11   17302.000   15670   14380   13228.000   11900   10984  
 12   12698.000   11348   10001    8971.000    8200    7745  
 13   13980.000   12354   11238   10832.000    9700    8430  
 14   20616.000   17957   16079   14472.000   12900   12045  
 15   27138.000   23849   21224   19250.000   16800   15562  
 16    5494.000    5037    4781    4500.000    4000    3728  
 17  406243.000  357771  326822  302676.000  272400  260562  ,
             0        1        2        3        4
 0          연도     2042     2050     2060     2067
 1   0~14세 구성비     9.7%     9.0%     8.2%     8.2%
 2  15~64세 구성비    55.1%    51.1%    48.0%    45.7%
 3  65세 이상 구성비    35.2%    39.9%    43.8%    46.1%
 4         총인구  4909만 명  4614만 명  4096만 명  3727만 명,
             0        1        2        3        4
 0          연도     2042     2050     2060     2067
 1   0~14세 구성비     8.6%     7.9%     6.9%     6.5%
 2  15~64세 구성비    55.1%    50.4%    46.5%    43.5%
 3  65세 이상 구성비    36.3%    41.6%    46.6%    50.0%
 4         총인구  4994만 명  4723만 명  4204만 명  3812만 명,
         0                            1                    2  \
 0    인구유형                           정의                   범위   
 1     총인구  일정 시점에 일정한 지역내에 살고 있는 모든 인구  국내 상주 내국인 국내 상주 외국인   
 2  내국인 인구       90일 이상 국내거주 대한민국 국적 인구            국내 상주 내국인   
 
                            3  
 0                       관련통계  
 1        주민등록인구 총조사인구 장래추계인구  
 2  국회예산정책처(NABO) 내국인 인구 시범추계  ,
                   0          1        2        3        4        5
 0               NaN        NaN     2017     2020     2030     2040
 1      통계청 내국인 인구전망      합계출산율    1.05명    0.90명    1.15명    1.27명
 2      통계청 내국인 인구전망     내국인 인구  4994만 명  5005만 명  4980만 명  4857만 명
 3      통계청 내국인 인구전망  65세 이상 비율    14.0%    16.1%    25.5%    34.3%
 4  NABO 내국인 인구 시범추계      합계출산율    1.09명    0.87명    0.73명    0.73명
 5  NABO 내국인 인구 시범추계     내국인 인구  4988만 명  5001만 명  4921만 명  4716만 명
 6  NABO 내국인 인구 시범추계  65세 이상 비율    14.1%    15.9%    26.2%    36.9%,
          0          1        2        3        4
 0      NaN        NaN     2020     2030     2040
 1   시나리오 1      합계출산율    0.87명    0.73명    0.73명
 2   시나리오 1     내국인 인구  5001만 명  4921만 명  4716만 명
 3   시나리오 1  65세 이상 비율    15.9%    26.2%    36.9%
 4   시나리오 2      합계출산율    0.91명    0.72명    0.53명
 5   시나리오 2     내국인 인구  5001만 명  4939만 명  4718만 명
 6   시나리오 2  65세 이상 비율    15.9%    26.1%    36.9%
 7   시나리오 3      합계출산율    0.87명    0.87명    0.87명
 8   시나리오 3     내국인 인구  5001만 명  4945만 명  4764만 명
 9   시나리오 3  65세 이상 비율    15.9%    26.1%    36.5%
 10  시나리오 4      합계출산율    0.91명    1.15명    1.70명
 11  시나리오 4     내국인 인구  5001만 명  4958만 명  4900만 명
 12  시나리오 4  65세 이상 비율    15.9%    26.0%    35.5%,
       0                                       1         2         3
 0  시나리오                                    출산가정    기대수명가정    국제이동가정
 1    S1                 출산율 2040년 1.80명 도달 후 지속  통계청 중위추계  통계청 중위추계
 2    S2                 출산율 2040년 1.45명 도달 후 지속  통계청 중위추계  통계청 중위추계
 3    S3  출산율 2040년 1.27명 도달 후 지속(통계청 중위 추계와 동일)  통계청 중위추계  통계청 중위추계
 4    S4                 출산율 2021년 0.86명 도달 후 지속  통계청 중위추계  통계청 중위추계
 5    S5                출산율 2061년 0.73명으로 감소세 지속  통계청 중위추계  통계청 중위추계
 6  S3_1  출산율 2040년 1.27명 도달 후 지속(통계청 중위 추계와 동일)  통계청 고위추계  통계청 중위추계
 7  S3_2  출산율 2040년 1.27명 도달 후 지속(통계청 중위 추계와 동일)  통계청 중위추계  통계청 고위추계,
       0        1        2        3        4        5
 0   총인구     2017     2020     2040     2050     2065
 1    S1  5136만 명  5190만 명  5270만 명  5068만 명  4537만 명
 2    S2  5136만 명  5186만 명  5175만 명  4898만 명  4233만 명
 3    S3  5136만 명  5178만 명  5086만 명  4774만 명  4028만 명
 4    S4  5136만 명  5178만 명  4946만 명  4547만 명  3673만 명
 5    S5  5136만 명  5178만 명  4907만 명  4485만 명  3578만 명
 6  S3_1  5136만 명  5180만 명  5133만 명  4847만 명  4113만 명
 7  S3_2  5136만 명  5187만 명  5197만 명  4945만 명  4299만 명,
       0       1       2       3       4       5
 0   유소년    2017    2020    2040    2050    2065
 1    S1  672만 명  642만 명  627만 명  584만 명  540만 명
 2    S2  672만 명  640만 명  543만 명  474만 명  404만 명
 3    S3  672만 명  630만 명  498만 명  424만 명  322만 명
 4    S4  672만 명  630만 명  367만 명  287만 명  192만 명
 5    S5  672만 명  630만 명  332만 명  252만 명  158만 명
 6  S3_1  672만 명  630만 명  499만 명  425만 명  322만 명
 7  S3_2  672만 명  630만 명  518만 명  452만 명  359만 명,
       0        1        2        3        4        5
 0  생산연령     2017     2020     2040     2050     2065
 1    S1  3757만 명  3736만 명  2918만 명  2581만 명  2137만 명
 2    S2  3757만 명  3736만 명  2907만 명  2522만 명  1970만 명
 3    S3  3757만 명  3736만 명  2863만 명  2446만 명  1846만 명
 4    S4  3757만 명  3736만 명  2854만 명  2357만 명  1621만 명
 5    S5  3757만 명  3736만 명  2850만 명  2330만 명  1560만 명
 6  S3_1  3757만 명  3736만 명  2871만 명  2455만 명  1855만 명
 7  S3_2  3757만 명  3743만 명  2941만 명  2561만 명  2015만 명,
       0       1       2        3        4        5
 0    노인    2017    2020     2040     2050     2065
 1    S1  707만 명  813만 명  1724만 명  1903만 명  1860만 명
 2    S2  707만 명  813만 명  1724만 명  1903만 명  1860만 명
 3    S3  707만 명  813만 명  1724만 명  1903만 명  1860만 명
 4    S4  707만 명  813만 명  1724만 명  1903만 명  1860만 명
 5    S5  707만 명  813만 명  1724만 명  1903만 명  1860만 명
 6  S3_1  707만 명  814만 명  1763만 명  1966만 명  1936만 명
 7  S3_2  707만 명  813만 명  1738만 명  1932만 명  1926만 명,
        0      1      2      3      4      5
 0  노인 비율   2017   2020   2040   2050   2065
 1     S1  13.8%  15.7%  32.7%  37.6%  41.0%
 2     S2  13.8%  15.7%  33.3%  38.9%  43.9%
 3     S3  13.8%  15.7%  33.9%  39.9%  46.2%
 4     S4  13.8%  15.7%  34.9%  41.9%  50.6%
 5     S5  13.8%  15.7%  35.1%  42.4%  52.0%
 6   S3_1  13.8%  15.7%  34.3%  40.6%  47.1%
 7   S3_2  13.8%  15.7%  33.4%  39.1%  44.8%,
              0       1          2      3              4
 0   (유엔 중위 추계)  평균 출산율  65세 이상 비율  중위 연령            총인구
 1    2020-2025   1.08명      15.8%  43.7세        5126만 명
 2    2025-2030   1.09명      20.2%  46.5세        5133만 명
 3    2030-2035   1.18명      24.7%  49.1세        5115만 명
 4    2035-2040   1.25명      29.0%  51.4세        5068만 명
 5    2040-2045   1.32명      32.9%  54.9세        4978만 명
 6    2045-2050   1.39명      35.8%  56.5세        4848만 명
 7    2050-2055   1.44명      38.1%  57.7세        4683만 명
 8    2055-2060   1.48명      39.2%  58.5세        4485만 명
 9    2060-2065   1.52명      40.9%  58.5세        4270만 명
 10   2065-2070   1.56명      42.1%  58.3세        4056만 명
 11   2070-2075   1.58명      41.9%  57.9세        3854만 명
 12   2075-2080   1.61명      41.5%  57.1세        3666만 명
 13   2080-2085   1.63명      41.3%  56.2세        3493만 명
 14   2085-2090   1.64명      40.5%  55.7세        3335만 명
 15   2090-2095   1.65명      39.5%  55.1세        3191만 명
 16   2095-2100   1.67명      38.7%  54.6세  3062만 명 (2095,
              0       1          2      3              4
 0   (유엔 저위 추계)  평균 출산율  65세 이상 비율  중위 연령            총인구
 1    2020-2025   0.83명      15.8%  43.7세        5126만 명
 2    2025-2030   0.69명      20.4%  46.8세        5093만 명
 3    2030-2035   0.68명      25.3%  49.8세        5012만 명
 4    2035-2040   0.75명      30.1%  52.6세        4893만 명
 5    2040-2045   0.82명      34.6%  55.2세        4740만 명
 6    2045-2050   0.89명      38.1%  57.2세        4552만 명
 7    2050-2055   0.94명      41.1%  59.0세        4333만 명
 8    2055-2060   0.98명      43.1%  60.8세        4081만 명
 9    2060-2065   1.02명      45.9%  62.5세        3804만 명
 10   2065-2070   1.06명      48.5%  64.0세        3519만 명
 11   2070-2075   1.08명      49.8%  64.9세        3241만 명
 12   2075-2080   1.11명      51.0%  65.7세        2980만 명
 13   2080-2085   1.13명      52.7%  66.6세        2737만 명
 14   2085-2090   1.14명      53.7%  67.4세        2513만 명
 15   2090-2095   1.15명      53.0%  67.4세        2303만 명
 16   2095-2100   1.17명      51.6%  66.4세  2106만 명 (2095,
              시행일                                           주요 개정 내용
 0   2008. 2. 29.  ▪ 저출산ㆍ고령사회 정책에 관한 중요정책 결정의 신속성을 제고하고, 부처 중심의 책...
 1    2012. 2. 5.  ▪ 매년 7월 11일을 인구의 날로 지정하고, 국가와 지자체는 인구의 날 취지에 적...
 2  2012. 11. 24.  ▪ 저출산ㆍ고령사회 정책 관련 사업수행 체계를 일원화하고, 관련 부처 간의 정책적 ...
 3   2014. 3. 18.     ▪ 국민 건강증진을 위한 시책을 강구하는데 있어 성별에 따른 특성도 반영하도록 개정,
                    분야                   세부 분야  \
 0   출산과 양육에 유리한 환경 조성    결혼ㆍ출산ㆍ양육에 대한 사회책임 강화   
 1   출산과 양육에 유리한 환경 조성  일ㆍ가정 양립 및 가족친화 사회문화 조성   
 2   출산과 양육에 유리한 환경 조성             건전한 미래세대 육성   
 3  고령사회 삶의 질 향상 기반 구축             노후소득보장체계 강화   
 4  고령사회 삶의 질 향상 기반 구축       건강하고 보호받는 노후생활 보장   
 5  고령사회 삶의 질 향상 기반 구축    노인의 사회참여와 노후준비 기반 조성   
 6  고령사회 삶의 질 향상 기반 구축            고령친화 생활환경 조성   
 7          미래 성장동력 확보  여성ㆍ고령자 등 잠재인력 활용 기반 구축   
 8          미래 성장동력 확보      인적자원의 경쟁력 및 활용도 제고   
 9          미래 성장동력 확보               고령친화사업 육성   
 
                                                주요 과제   재정 규모 (2006-2010)  
 0  ▪ 결혼ㆍ출산 주 연령층에 대한 결혼정보 제공 및 지원 ▪ 보육ㆍ교육비 지원의 선진...  19.1조 원 (총 96개 과제)  
 1  ▪ 육아휴직제도 활성화 및 근로형태 유연화 ▪ 가족친화기업인증제 확산 ▪ 가족 가치...  19.1조 원 (총 96개 과제)  
 2  ▪ 아동학대 예방 및 방임 아동 보호체계 구축 ▪ 지역사회 아동․청소년 방과후 서비...  19.1조 원 (총 96개 과제)  
 3         ▪ 국민연금 내실화 및 사각지대 해소 ▪ 퇴직연금제도 확대, 개인연금 활성화    15조 원 (총 66개 과제)  
 4  ▪ 노인질환에 대한 종합 지원 강화 ▪ 치매노인에 대한 종합적 관리 및 지원체계 구...    15조 원 (총 66개 과제)  
 5                      ▪ 노인적합형 일자리 창출 ▪ 노인의 여가문화 활성화    15조 원 (총 66개 과제)  
 6  ▪ 저소득 고령자를 위한 주택공급 확대 ▪ 고령자에게 편리한 교통환경 조성 ▪ 지역...    15조 원 (총 66개 과제)  
 7  ▪ 여성의 직업능력 개발 및 취업 지원 ▪ 고령자 고용촉진 지원 강화 ▪ 우수 외국...   6.2조 원 (총 75개 과제)  
 8           ▪ 수요자 중심의 직업능력개발 기회 확대 ▪ 산업현장의 안전, 보건 증진   6.2조 원 (총 75개 과제)  
 9           ▪ 고령친화 제품 기술개발 촉진 ▪ 역모기지제도 및 자산운용산업의 활성화   6.2조 원 (총 75개 과제)  ,
                   분야                  세부 분야  \
 0             저출산 대책         청년 일자리ㆍ주거대책 강화   
 1             저출산 대책  난임 등 출생에 대한 사회적 책임 강화   
 2             저출산 대책        맞춤형 돌봄 확대․교육 개혁   
 3             저출산 대책        일ㆍ가정 양립 사각지대 해소   
 4            고령사회 대책              노후소득보장 강화   
 5            고령사회 대책         활기차고 안전한 노후 실현   
 6            고령사회 대책  여성, 중ㆍ고령자, 외국인력 활용 확대   
 7            고령사회 대책            고령친화경제로의 도약   
 8   저출산․고령사회 대응기반 강화       민간ㆍ지역ㆍ정부 협력체계 강화   
 9   저출산․고령사회 대응기반 강화            홍보ㆍ인식개선 활성화   
 10  저출산․고령사회 대응기반 강화         중앙ㆍ지방의 추진기반 강화   
 
                                                 주요 과제    재정 규모 (2016-2020)  
 0   ▪ 노동 개혁을 통한 고용 창출과 일자리의 질 제고 ▪ 청년․예비부부 주거 지원 강...  108.4조 원 (총 47개 과제)  
 1   ▪ 임신ㆍ출산 의료비 대폭 경감 ▪ 난임부부 종합지원체계 구축 ▪ 다문화 가정 맞춤...  108.4조 원 (총 47개 과제)  
 2   ▪ 보육ㆍ돌봄 사각지대 해소 ▪ 지역사회 내 돌봄 여건 확충 ▪ 공교육의 역량 강화...  108.4조 원 (총 47개 과제)  
 3            ▪ 일ㆍ가정 양립을 위한 기업 문화 확산 ▪ 육아기 근로시간 단축 활성화  108.4조 원 (총 47개 과제)  
 4            ▪ 공적연금 강화, 주택ㆍ농지연금 대폭 확산 ▪ 퇴직ㆍ개인연금 확산ㆍ정착   89.1조 원 (총 78개 과제)  
 5   ▪ 노인 의료비 부담 경감 ▪ 고령자 문화ㆍ여가 인프라 개선 ▪ 고령자를 위한 임대...   89.1조 원 (총 78개 과제)  
 6   ▪ 경력단절여성 재취업 지원체계 강화 ▪ 중ㆍ고령자 취업 지원 활성화 ▪ 해외우수인...   89.1조 원 (총 78개 과제)  
 7   ▪ 고령친화 관광산업 및 식품산업 육성 ▪ 대학구조개혁 추진 등 인구다운사이징 대비 강화   89.1조 원 (총 78개 과제)  
 8              ▪ 사회 각 부문별 저출산 극복 운동 추진 ▪ 국민 참여 통로 다각화     0.0조 원 (총 9개 과제)  
 9               ▪ 저출산 극복을 위한 인식개선ㆍ홍보 강화 ▪ 고비용 결혼문화 개선     0.0조 원 (총 9개 과제)  
 10                  ▪ 저출산ㆍ고령사회 영향평가제도 도입 ▪ 저출산위 기능 강화     0.0조 원 (총 9개 과제)  ,
                   분야                              세부 분야  \
 0             저출산 대책                      출산ㆍ양육비 부담 최소화   
 1             저출산 대책                    아이와 함께하는 시간 최대화   
 2             저출산 대책                   촘촘하고 안전한 돌봄체계 구축   
 3             저출산 대책              모든 아동 존중과 포용적 가족문화 조성   
 4             저출산 대책      2040세대 안정적인 삶의 기반(일ㆍ주거ㆍ교육) 조성   
 5            고령사회 대책                   다층적 노후소득보장체계 내실화   
 6            고령사회 대책                  신중년의 새로운 인생 출발 지원   
 7            고령사회 대책                고령자의 다양한 사회참여 기회 확대   
 8            고령사회 대책               지역사회 중심의 건강․돌봄 환경 구축   
 9            고령사회 대책                  성숙한 노년기를 위한 기반 마련   
 10  저출산․고령사회 대응기반 강화                         사회시스템 및 지역   
 11  저출산․고령사회 대응기반 강화  인구 변화 대응 기반 강화 (총 10개 과제) 및 인식 개선   
 
                                                 주요 과제   재정 규모 (2019-2020)  
 0   ▪ 의료비 제로화, 아동수당 지급, 안전한 출산 ▪ 다자녀 지원 확대, 출산휴가급여...  77.3조 원 (총 96개 과제)  
 1   ▪ 생애주기별 근로시간 단축, 남성 육아참여 확대 ▪ 일․생활 균형 환경 조성, 육...  77.3조 원 (총 96개 과제)  
 2   ▪ 보육의 공공성 및 유치원 공공성 강화 ▪ 온종일 돌봄, 가정 내 돌봄 지원, 지...  77.3조 원 (총 96개 과제)  
 3             ▪ 모든 아동 대상 차별 없는 보호 여건 마련 ▪ 포용적 가족문화 조성  77.3조 원 (총 96개 과제)  
 4   ▪ 안정된 일자리, 차별 없는 일자리 조성 ▪ 청년ㆍ신혼부부 등 맞춤형 주거지원 강...  77.3조 원 (총 96개 과제)  
 5   ▪ 다층적 노후보장소득체계 내실화, 공적연금 역할 강화 ▪ 사적연금 실효성 제고, ...    42조 원 (총 57개 과제)  
 6   ▪ 인생 3모작 기반 구축을 통한 신중년 일자리 기회 확대 ▪ 활기찬 노후를 준비하...    42조 원 (총 57개 과제)  
 7          ▪ 노인일자리 80만 개 창출․지원 ▪ 고령자 대상 여가 및 교육 기회 확대    42조 원 (총 57개 과제)  
 8                        ▪ 의료․건강 관리, 돌봄․요양 및 주거․환경 조성    42조 원 (총 57개 과제)  
 9     ▪ 존엄하게 삶을 마무리할 수 있는 기반 마련 ▪ 노인자살 예방을 위한 적극적인 대응    42조 원 (총 57개 과제)  
 10  ▪ 인구구조 변화 대응 핵심분야 대책 마련 ▪ 지역 정책 패러다임 전환 및 인구 대...   0.0조 원 (총 10개 과제)  
 11              ▪ 인구정책 추진체계 구축 ▪ 인식 개선을 위한 홍보 및 교육 강화   0.0조 원 (총 10개 과제)  ]

모든 데이터프레임 형식의 자료를 다 가져온 상황

- 두 번째 데이터프레임 호출(시도별 합계출산율)

df_lst[2]   ## 시도별 합계출산율
지역/연도[6] 2005 2006[7] 2007 2008[8] 2009[9] 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
0 서울 0.92 0.97 1.06 1.01 0.96 1.02 1.01 1.06 0.97 0.98 1.00 0.94 0.84 0.76 0.72 0.64 0.63
1 부산 0.88 0.91 1.02 0.98 0.94 1.05 1.08 1.14 1.05 1.09 1.14 1.10 0.98 0.90 0.83 0.75 0.73
2 대구 0.99 1.00 1.13 1.07 1.03 1.11 1.15 1.22 1.13 1.17 1.22 1.19 1.07 0.99 0.93 0.81 0.78
3 인천 1.07 1.11 1.25 1.19 1.14 1.21 1.23 1.30 1.20 1.21 1.22 1.14 1.01 1.01 0.94 0.83 0.78
4 광주 1.10 1.14 1.26 1.20 1.14 1.22 1.23 1.30 1.17 1.20 1.21 1.17 1.05 0.97 0.91 0.81 0.90
5 대전 1.10 1.15 1.27 1.22 1.16 1.21 1.26 1.32 1.23 1.25 1.28 1.19 1.08 0.95 0.88 0.81 0.81
6 울산 1.18 1.24 1.40 1.34 1.31 1.37 1.39 1.48 1.39 1.44 1.49 1.42 1.26 1.13 1.08 0.99 0.94
7 세종 - - - - - - - 1.60 1.44 1.35 1.89 1.82 1.67 1.57 1.47 1.28 1.28
8 경기 1.17 1.23 1.35 1.29 1.23 1.31 1.31 1.36 1.23 1.24 1.27 1.19 1.07 1.00 0.94 0.88 0.85
9 강원 1.18 1.19 1.35 1.25 1.25 1.31 1.34 1.37 1.25 1.25 1.31 1.24 1.12 1.07 1.08 1.04 0.98
10 충북 1.19 1.22 1.39 1.32 1.32 1.40 1.43 1.49 1.37 1.36 1.41 1.36 1.24 1.17 1.05 0.98 0.95
11 충남 1.26 1.35 1.50 1.44 1.41 1.48 1.50 1.57 1.44 1.42 1.48 1.40 1.28 1.19 1.11 1.03 0.96
12 전북 1.17 1.20 1.37 1.31 1.28 1.37 1.41 1.44 1.32 1.33 1.35 1.25 1.15 1.04 0.97 0.91 0.85
13 전남 1.28 1.33 1.53 1.45 1.45 1.54 1.57 1.64 1.52 1.50 1.55 1.47 1.33 1.24 1.23 1.15 1.02
14 경북 1.17 1.20 1.36 1.31 1.27 1.38 1.43 1.49 1.38 1.41 1.46 1.40 1.26 1.17 1.09 1.00 0.97
15 경남 1.18 1.25 1.43 1.37 1.32 1.41 1.45 1.50 1.37 1.41 1.44 1.36 1.23 1.12 1.05 0.95 0.90
16 제주 1.30 1.36 1.48 1.39 1.38 1.46 1.49 1.60 1.43 1.48 1.48 1.43 1.31 1.22 1.15 1.02 0.95
17 전국 1.08 1.13 1.25 1.19 1.15 1.23 1.24 1.30 1.19 1.21 1.24 1.17 1.05 0.98 0.92 0.84 0.81
df_lst[4]   ## 시도별 출생아 수
지역/연도[6] 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
0 서울 93266 91526 93914.000 84066.000 83711.000 83005 75.536 65389 58074 53.673 47400 45531
1 부산 27415 27759 28673.000 25831.000 26190.000 26645 24906.000 21480 19152 17049.000 15100 14446
2 대구 20557 20758 21472.000 19340.000 19361.000 19438 18298.000 15946 14400 13233.000 11200 10661
3 인천 25752 20758 21472.000 25560.000 25786.000 25491 23609.000 20445 20087 18522.000 16000 14947
4 광주 13979 13916 14392.000 12729.000 12729.000 12441 11580.000 10120 9105 8364.000 7300 7956
5 대전 14314 14808 15279.000 14099.000 13962.000 13774 12436.000 10851 9337 8410.000 7500 7414
6 울산 11432 11542 12160.000 11330.000 11556.000 11732 10910.000 9381 8149 7539.000 6600 6127
7 세종 - - 1054.000 1111.000 1344.000 2708 3297.000 3504 3703 3819.000 3500 3570
8 경기 121753 122027 124746.000 112129.000 112.169 113495 105643.000 94088 83198 83.198 77800 76139
9 강원 12477 12408 12426.000 10980.000 10662.000 10929 10058.000 9958 8351 8283.000 7800 7357
10 충북 14670 14804 15139.000 13658.000 13366.000 13563 12742.000 11394 10586 9333.000 8600 8190
11 충남 20.242 20.398 20.448 18.628 18200.000 18604 17302.000 15670 14380 13228.000 11900 10984
12 전북 16100 16175 16238.000 14555.000 14231.000 14087 12698.000 11348 10001 8971.000 8200 7745
13 전남 16654 16612 16990.000 15401.000 14817.000 15061 13980.000 12354 11238 10832.000 9700 8430
14 경북 23700 24250 24635.000 22206.000 22062.000 22310 20616.000 17957 16079 14472.000 12900 12045
15 경남 32203 32536 33211.000 29504.000 29763.000 29537 27138.000 23849 21224 19250.000 16800 15562
16 제주 5657 5628 5992.000 5328.000 5526.000 5600 5494.000 5037 4781 4500.000 4000 3728
17 전국 470171 471265 484550.000 436455.000 435435.000 438420 406243.000 357771 326822 302676.000 272400 260562

세종시의 경우 중간에 지역이 추가된 경우라 결측치가 이상하게 들어가있음.

df = df_lst[4]
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18 entries, 0 to 17
Data columns (total 13 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   지역/연도[6]  18 non-null     object 
 1   2010      18 non-null     object 
 2   2011      18 non-null     object 
 3   2012      18 non-null     float64
 4   2013      18 non-null     float64
 5   2014      18 non-null     float64
 6   2015      18 non-null     int64  
 7   2016      18 non-null     float64
 8   2017      18 non-null     int64  
 9   2018      18 non-null     int64  
 10  2019      18 non-null     float64
 11  2020      18 non-null     int64  
 12  2021      18 non-null     int64  
dtypes: float64(5), int64(5), object(3)
memory usage: 2.0+ KB

전부다 float이나 int여야 하는데, 0ㅡ1ㅡ2는 object임

df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()  ## 첫 열은 적용시키기 애매하니 인덱스로 빼버림.
지역 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
0 서울 93266.000 91526.000 93914.000 84066.000 83711.000 83005.0 75.536 65389.0 58074.0 53.673 47400.0 45531.0
1 부산 27415.000 27759.000 28673.000 25831.000 26190.000 26645.0 24906.000 21480.0 19152.0 17049.000 15100.0 14446.0
2 대구 20557.000 20758.000 21472.000 19340.000 19361.000 19438.0 18298.000 15946.0 14400.0 13233.000 11200.0 10661.0
3 인천 25752.000 20758.000 21472.000 25560.000 25786.000 25491.0 23609.000 20445.0 20087.0 18522.000 16000.0 14947.0
4 광주 13979.000 13916.000 14392.000 12729.000 12729.000 12441.0 11580.000 10120.0 9105.0 8364.000 7300.0 7956.0
5 대전 14314.000 14808.000 15279.000 14099.000 13962.000 13774.0 12436.000 10851.0 9337.0 8410.000 7500.0 7414.0
6 울산 11432.000 11542.000 12160.000 11330.000 11556.000 11732.0 10910.000 9381.0 8149.0 7539.000 6600.0 6127.0
7 세종 0.000 0.000 1054.000 1111.000 1344.000 2708.0 3297.000 3504.0 3703.0 3819.000 3500.0 3570.0
8 경기 121753.000 122027.000 124746.000 112129.000 112.169 113495.0 105643.000 94088.0 83198.0 83.198 77800.0 76139.0
9 강원 12477.000 12408.000 12426.000 10980.000 10662.000 10929.0 10058.000 9958.0 8351.0 8283.000 7800.0 7357.0
10 충북 14670.000 14804.000 15139.000 13658.000 13366.000 13563.0 12742.000 11394.0 10586.0 9333.000 8600.0 8190.0
11 충남 20.242 20.398 20.448 18.628 18200.000 18604.0 17302.000 15670.0 14380.0 13228.000 11900.0 10984.0
12 전북 16100.000 16175.000 16238.000 14555.000 14231.000 14087.0 12698.000 11348.0 10001.0 8971.000 8200.0 7745.0
13 전남 16654.000 16612.000 16990.000 15401.000 14817.000 15061.0 13980.000 12354.0 11238.0 10832.000 9700.0 8430.0
14 경북 23700.000 24250.000 24635.000 22206.000 22062.000 22310.0 20616.000 17957.0 16079.0 14472.000 12900.0 12045.0
15 경남 32203.000 32536.000 33211.000 29504.000 29763.000 29537.0 27138.000 23849.0 21224.0 19250.000 16800.0 15562.0
16 제주 5657.000 5628.000 5992.000 5328.000 5526.000 5600.0 5494.000 5037.0 4781.0 4500.000 4000.0 3728.0
17 전국 470171.000 471265.000 484550.000 436455.000 435435.000 438420.0 406243.000 357771.0 326822.0 302676.000 272400.0 260562.0
df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index().info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18 entries, 0 to 17
Data columns (total 13 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   지역      18 non-null     object 
 1   2010    18 non-null     float64
 2   2011    18 non-null     float64
 3   2012    18 non-null     float64
 4   2013    18 non-null     float64
 5   2014    18 non-null     float64
 6   2015    18 non-null     float64
 7   2016    18 non-null     float64
 8   2017    18 non-null     float64
 9   2018    18 non-null     float64
 10  2019    18 non-null     float64
 11  2020    18 non-null     float64
 12  2021    18 non-null     float64
dtypes: float64(12), object(1)
memory usage: 2.0+ KB

지역만 object, 나머지는 float으로 잘 들어갔다.

### B. 시각화1 : 전국 출생아 수 시각화

전국으로 따로 집계가 되어있긴 하지만, 따로 집계를 해서 산출

df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)
지역 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
0 서울 93266.000 91526.000 93914.000 84066.000 83711.000 83005.0 75.536 65389.0 58074.0 53.673 47400.0 45531.0
1 부산 27415.000 27759.000 28673.000 25831.000 26190.000 26645.0 24906.000 21480.0 19152.0 17049.000 15100.0 14446.0
2 대구 20557.000 20758.000 21472.000 19340.000 19361.000 19438.0 18298.000 15946.0 14400.0 13233.000 11200.0 10661.0
3 인천 25752.000 20758.000 21472.000 25560.000 25786.000 25491.0 23609.000 20445.0 20087.0 18522.000 16000.0 14947.0
4 광주 13979.000 13916.000 14392.000 12729.000 12729.000 12441.0 11580.000 10120.0 9105.0 8364.000 7300.0 7956.0
5 대전 14314.000 14808.000 15279.000 14099.000 13962.000 13774.0 12436.000 10851.0 9337.0 8410.000 7500.0 7414.0
6 울산 11432.000 11542.000 12160.000 11330.000 11556.000 11732.0 10910.000 9381.0 8149.0 7539.000 6600.0 6127.0
7 세종 0.000 0.000 1054.000 1111.000 1344.000 2708.0 3297.000 3504.0 3703.0 3819.000 3500.0 3570.0
8 경기 121753.000 122027.000 124746.000 112129.000 112.169 113495.0 105643.000 94088.0 83198.0 83.198 77800.0 76139.0
9 강원 12477.000 12408.000 12426.000 10980.000 10662.000 10929.0 10058.000 9958.0 8351.0 8283.000 7800.0 7357.0
10 충북 14670.000 14804.000 15139.000 13658.000 13366.000 13563.0 12742.000 11394.0 10586.0 9333.000 8600.0 8190.0
11 충남 20.242 20.398 20.448 18.628 18200.000 18604.0 17302.000 15670.0 14380.0 13228.000 11900.0 10984.0
12 전북 16100.000 16175.000 16238.000 14555.000 14231.000 14087.0 12698.000 11348.0 10001.0 8971.000 8200.0 7745.0
13 전남 16654.000 16612.000 16990.000 15401.000 14817.000 15061.0 13980.000 12354.0 11238.0 10832.000 9700.0 8430.0
14 경북 23700.000 24250.000 24635.000 22206.000 22062.000 22310.0 20616.000 17957.0 16079.0 14472.000 12900.0 12045.0
15 경남 32203.000 32536.000 33211.000 29504.000 29763.000 29537.0 27138.000 23849.0 21224.0 19250.000 16800.0 15562.0
16 제주 5657.000 5628.000 5992.000 5328.000 5526.000 5600.0 5494.000 5037.0 4781.0 4500.000 4000.0 3728.0
df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)\
.set_index('지역').stack().reset_index().rename({'level_1' : '연도', 0 : '출생아 수'}, axis = 1)
지역 연도 출생아 수
0 서울 2010 93266.0
1 서울 2011 91526.0
2 서울 2012 93914.0
3 서울 2013 84066.0
4 서울 2014 83711.0
... ... ... ...
199 제주 2017 5037.0
200 제주 2018 4781.0
201 제주 2019 4500.0
202 제주 2020 4000.0
203 제주 2021 3728.0

204 rows × 3 columns

df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)\
.set_index('지역').stack().reset_index().rename({'level_1' : '연도', 0 : '출생아 수'}, axis = 1)\
.groupby('연도').aggregate({'출생아 수' : 'sum'}).reset_index()
연도 출생아 수
0 2010 449949.242
1 2011 445527.398
2 2012 457813.448
3 2013 417845.628
4 2014 323378.169
5 2015 438420.000
6 2016 330782.536
7 2017 358771.000
8 2018 321845.000
9 2019 165941.871
10 2020 272300.000
11 2021 260832.000
df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)\
.set_index('지역').stack().reset_index().rename({'level_1' : '연도', 0 : '출생아 수'}, axis = 1)\
.groupby('연도').aggregate({'출생아 수' : 'sum'}).reset_index()\
.plot.line(x = '연도', y = '출생아 수', backend = 'plotly')
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2033454686.py:1: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

C. 시각화2 : 시도별 출생아 수 시각화(line)


df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)\
.set_index('지역').stack().reset_index().rename({'level_1' : '연도', 0 : '출생아 수'}, axis = 1)\
.pivot_table(index = ['지역', '연도'], values = '출생아 수', aggfunc = 'sum').reset_index()  ## 똑같음(이미 타이디임)
지역 연도 출생아 수
0 강원 2010 12477.0
1 강원 2011 12408.0
2 강원 2012 12426.0
3 강원 2013 10980.0
4 강원 2014 10662.0
... ... ... ...
199 충북 2017 11394.0
200 충북 2018 10586.0
201 충북 2019 9333.0
202 충북 2020 8600.0
203 충북 2021 8190.0

204 rows × 3 columns

df.rename({'지역/연도[6]' : '지역'}, axis = 1).set_index('지역').applymap(lambda x : float(x) if x != '-' else 0).reset_index()\
.drop(17, axis = 0)\
.set_index('지역').stack().reset_index().rename({'level_1' : '연도', 0 : '출생아 수'}, axis = 1)\
.plot.line(x = '연도', y = '출생아 수', color = '지역', backend = 'plotly')
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2734995546.py:1: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

두 가지 line plot 따로 장단점이 있음; 그래서 그 둘을 합쳐서 해보면 어떻게 될까.

### D. 시각화 3 : 시도별 출생아수 시각화(area)

df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역']).applymap(lambda x: float(x) if not x=='-' else 0)\
.drop('전국',axis=0)\
.stack().reset_index().set_axis(['지역','연도','출생아수'],axis=1)\
.plot.area(x='연도',y='출생아수',color='지역',backend='plotly')   ## plot.area()
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\3490384095.py:2: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

어떻게 변화하는지 전체를 시각화할 수 있음.

누적된 정도를 파악한다.

- 2014 경기, 2016 서울, 2019 서울ㆍ경기 : 출생아가 없었음. 왜 없었는가?

df
지역/연도[6] 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
0 서울 93266 91526 93914.000 84066.000 83711.000 83005 75.536 65389 58074 53.673 47400 45531
1 부산 27415 27759 28673.000 25831.000 26190.000 26645 24906.000 21480 19152 17049.000 15100 14446
2 대구 20557 20758 21472.000 19340.000 19361.000 19438 18298.000 15946 14400 13233.000 11200 10661
3 인천 25752 20758 21472.000 25560.000 25786.000 25491 23609.000 20445 20087 18522.000 16000 14947
4 광주 13979 13916 14392.000 12729.000 12729.000 12441 11580.000 10120 9105 8364.000 7300 7956
5 대전 14314 14808 15279.000 14099.000 13962.000 13774 12436.000 10851 9337 8410.000 7500 7414
6 울산 11432 11542 12160.000 11330.000 11556.000 11732 10910.000 9381 8149 7539.000 6600 6127
7 세종 - - 1054.000 1111.000 1344.000 2708 3297.000 3504 3703 3819.000 3500 3570
8 경기 121753 122027 124746.000 112129.000 112.169 113495 105643.000 94088 83198 83.198 77800 76139
9 강원 12477 12408 12426.000 10980.000 10662.000 10929 10058.000 9958 8351 8283.000 7800 7357
10 충북 14670 14804 15139.000 13658.000 13366.000 13563 12742.000 11394 10586 9333.000 8600 8190
11 충남 20.242 20.398 20.448 18.628 18200.000 18604 17302.000 15670 14380 13228.000 11900 10984
12 전북 16100 16175 16238.000 14555.000 14231.000 14087 12698.000 11348 10001 8971.000 8200 7745
13 전남 16654 16612 16990.000 15401.000 14817.000 15061 13980.000 12354 11238 10832.000 9700 8430
14 경북 23700 24250 24635.000 22206.000 22062.000 22310 20616.000 17957 16079 14472.000 12900 12045
15 경남 32203 32536 33211.000 29504.000 29763.000 29537 27138.000 23849 21224 19250.000 16800 15562
16 제주 5657 5628 5992.000 5328.000 5526.000 5600 5494.000 5037 4781 4500.000 4000 3728
17 전국 470171 471265 484550.000 436455.000 435435.000 438420 406243.000 357771 326822 302676.000 272400 260562

경기 2013의 경우 소수점 존재, 서울 2016도, 등등… 정리가 좀 잘 안되어있음.

E. 시각화 1,2,3 수정


df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역'])\
.applymap(lambda x: float(x) if not x=='-' else 0)
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
지역
서울 93266.000 91526.000 93914.000 84066.000 83711.000 83005.0 75.536 65389.0 58074.0 53.673 47400.0 45531.0
부산 27415.000 27759.000 28673.000 25831.000 26190.000 26645.0 24906.000 21480.0 19152.0 17049.000 15100.0 14446.0
대구 20557.000 20758.000 21472.000 19340.000 19361.000 19438.0 18298.000 15946.0 14400.0 13233.000 11200.0 10661.0
인천 25752.000 20758.000 21472.000 25560.000 25786.000 25491.0 23609.000 20445.0 20087.0 18522.000 16000.0 14947.0
광주 13979.000 13916.000 14392.000 12729.000 12729.000 12441.0 11580.000 10120.0 9105.0 8364.000 7300.0 7956.0
대전 14314.000 14808.000 15279.000 14099.000 13962.000 13774.0 12436.000 10851.0 9337.0 8410.000 7500.0 7414.0
울산 11432.000 11542.000 12160.000 11330.000 11556.000 11732.0 10910.000 9381.0 8149.0 7539.000 6600.0 6127.0
세종 0.000 0.000 1054.000 1111.000 1344.000 2708.0 3297.000 3504.0 3703.0 3819.000 3500.0 3570.0
경기 121753.000 122027.000 124746.000 112129.000 112.169 113495.0 105643.000 94088.0 83198.0 83.198 77800.0 76139.0
강원 12477.000 12408.000 12426.000 10980.000 10662.000 10929.0 10058.000 9958.0 8351.0 8283.000 7800.0 7357.0
충북 14670.000 14804.000 15139.000 13658.000 13366.000 13563.0 12742.000 11394.0 10586.0 9333.000 8600.0 8190.0
충남 20.242 20.398 20.448 18.628 18200.000 18604.0 17302.000 15670.0 14380.0 13228.000 11900.0 10984.0
전북 16100.000 16175.000 16238.000 14555.000 14231.000 14087.0 12698.000 11348.0 10001.0 8971.000 8200.0 7745.0
전남 16654.000 16612.000 16990.000 15401.000 14817.000 15061.0 13980.000 12354.0 11238.0 10832.000 9700.0 8430.0
경북 23700.000 24250.000 24635.000 22206.000 22062.000 22310.0 20616.000 17957.0 16079.0 14472.000 12900.0 12045.0
경남 32203.000 32536.000 33211.000 29504.000 29763.000 29537.0 27138.000 23849.0 21224.0 19250.000 16800.0 15562.0
제주 5657.000 5628.000 5992.000 5328.000 5526.000 5600.0 5494.000 5037.0 4781.0 4500.000 4000.0 3728.0
전국 470171.000 471265.000 484550.000 436455.000 435435.000 438420.0 406243.000 357771.0 326822.0 302676.000 272400.0 260562.0
df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역'])\
.applymap(lambda x: float(x) if not x=='-' else 0)\
.applymap(lambda x : x if str(x)[-1] == '0' else x*1000)
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
지역
서울 93266.0 91526.0 93914.0 84066.0 83711.0 83005.0 75536.0 65389.0 58074.0 53673.0 47400.0 45531.0
부산 27415.0 27759.0 28673.0 25831.0 26190.0 26645.0 24906.0 21480.0 19152.0 17049.0 15100.0 14446.0
대구 20557.0 20758.0 21472.0 19340.0 19361.0 19438.0 18298.0 15946.0 14400.0 13233.0 11200.0 10661.0
인천 25752.0 20758.0 21472.0 25560.0 25786.0 25491.0 23609.0 20445.0 20087.0 18522.0 16000.0 14947.0
광주 13979.0 13916.0 14392.0 12729.0 12729.0 12441.0 11580.0 10120.0 9105.0 8364.0 7300.0 7956.0
대전 14314.0 14808.0 15279.0 14099.0 13962.0 13774.0 12436.0 10851.0 9337.0 8410.0 7500.0 7414.0
울산 11432.0 11542.0 12160.0 11330.0 11556.0 11732.0 10910.0 9381.0 8149.0 7539.0 6600.0 6127.0
세종 0.0 0.0 1054.0 1111.0 1344.0 2708.0 3297.0 3504.0 3703.0 3819.0 3500.0 3570.0
경기 121753.0 122027.0 124746.0 112129.0 112169.0 113495.0 105643.0 94088.0 83198.0 83198.0 77800.0 76139.0
강원 12477.0 12408.0 12426.0 10980.0 10662.0 10929.0 10058.0 9958.0 8351.0 8283.0 7800.0 7357.0
충북 14670.0 14804.0 15139.0 13658.0 13366.0 13563.0 12742.0 11394.0 10586.0 9333.0 8600.0 8190.0
충남 20242.0 20398.0 20448.0 18628.0 18200.0 18604.0 17302.0 15670.0 14380.0 13228.0 11900.0 10984.0
전북 16100.0 16175.0 16238.0 14555.0 14231.0 14087.0 12698.0 11348.0 10001.0 8971.0 8200.0 7745.0
전남 16654.0 16612.0 16990.0 15401.0 14817.0 15061.0 13980.0 12354.0 11238.0 10832.0 9700.0 8430.0
경북 23700.0 24250.0 24635.0 22206.0 22062.0 22310.0 20616.0 17957.0 16079.0 14472.0 12900.0 12045.0
경남 32203.0 32536.0 33211.0 29504.0 29763.0 29537.0 27138.0 23849.0 21224.0 19250.0 16800.0 15562.0
제주 5657.0 5628.0 5992.0 5328.0 5526.0 5600.0 5494.0 5037.0 4781.0 4500.0 4000.0 3728.0
전국 470171.0 471265.0 484550.0 436455.0 435435.0 438420.0 406243.0 357771.0 326822.0 302676.0 272400.0 260562.0
df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역'])\
.applymap(lambda x: float(x) if not x=='-' else 0)\
.applymap(lambda x : x if str(x)[-1] == '0' else x*1000)\
.stack().reset_index().set_axis(['지역','연도','출생아수'],axis=1)\
.groupby('연도').agg({'출생아수' : 'sum'}).reset_index()\
.plot.line(x = '연도', y = '출생아수', backend = 'plotly')
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2074312662.py:3: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2074312662.py:4: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

정상적으로 이해 가능함

df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역'])\
.applymap(lambda x: float(x) if not x=='-' else 0)\
.applymap(lambda x : x if str(x)[-1] == '0' else x*1000)\
.stack().reset_index().set_axis(['지역','연도','출생아수'],axis=1)\
.plot.line(x = '연도', y = '출생아수', color = '지역', backend = 'plotly')
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\3259186193.py:3: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\3259186193.py:4: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.
df.rename({'지역/연도[6]':'지역'},axis=1)\
.set_index(['지역']).applymap(lambda x: float(x) if not x=='-' else 0)\
.applymap(lambda x: x*1000 if x<1000 else x)\
.drop('전국',axis=0)\
.stack().reset_index().set_axis(['지역','연도','출생아수'],axis=1)\
.plot.line(x='연도',y='출생아수',color='지역',backend='plotly')
C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2415151748.py:2: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.

C:\Users\hollyriver\AppData\Local\Temp\ipykernel_1244\2415151748.py:3: FutureWarning:

DataFrame.applymap has been deprecated. Use DataFrame.map instead.