import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf데이터 크롤링 맛보기
야후 파이낸셜을 이용하여 출산률 자료를 시각화해보자!
1. 라이브러리 imports
- 교수님 의견
현존하는 시각화 툴 중에서 가장 뛰어난 것은 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.columnsMultiIndex([('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.