2022/01/15/SAT
• 31 min read
import numpy as np
import pandas as pd
import warnings
from IPython.display import HTML
def show(fig):
return HTML(fig.to_html(include_plotlyjs='cdn',include_mathjax=False, config=dict({'scrollZoom':False})))
df = pd.read_csv('https://raw.githubusercontent.com/kalilurrahman/datasets/main/mobilephonemktshare2020.csv')
df # 지금은 인덱스가 0~12로 되어있으니 아래 셀에서 Date로 인덱스를 변경해줄것임
| Date | Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-10 | 31.49 | 22.09 | 10.02 | 7.79 | 4.10 | 3.15 | 2.41 | 2.40 | 9.51 | 0.54 | 2.35 | 0.95 | 0.96 | 0.70 | 0.84 | 0.74 |
| 1 | 2019-11 | 31.36 | 22.90 | 10.18 | 8.16 | 4.42 | 3.41 | 2.40 | 2.40 | 9.10 | 0.78 | 0.66 | 0.97 | 0.97 | 0.73 | 0.83 | 0.75 |
| 2 | 2019-12 | 31.37 | 24.79 | 9.95 | 7.73 | 4.23 | 3.19 | 2.50 | 2.54 | 8.13 | 0.84 | 0.75 | 0.90 | 0.87 | 0.74 | 0.77 | 0.70 |
| 3 | 2020-01 | 31.29 | 24.76 | 10.61 | 8.10 | 4.25 | 3.02 | 2.42 | 2.40 | 7.55 | 0.88 | 0.69 | 0.88 | 0.86 | 0.79 | 0.80 | 0.69 |
| 4 | 2020-02 | 30.91 | 25.89 | 10.98 | 7.80 | 4.31 | 2.89 | 2.36 | 2.34 | 7.06 | 0.89 | 0.70 | 0.81 | 0.77 | 0.78 | 0.80 | 0.69 |
| 5 | 2020-03 | 30.80 | 27.03 | 10.70 | 7.70 | 4.30 | 2.87 | 2.35 | 2.28 | 6.63 | 0.93 | 0.73 | 0.72 | 0.74 | 0.78 | 0.76 | 0.66 |
| 6 | 2020-04 | 30.41 | 28.79 | 10.28 | 7.60 | 4.20 | 2.75 | 2.51 | 2.28 | 5.84 | 0.90 | 0.75 | 0.69 | 0.71 | 0.80 | 0.76 | 0.70 |
| 7 | 2020-05 | 30.18 | 26.72 | 10.39 | 8.36 | 4.70 | 3.12 | 2.46 | 2.19 | 6.31 | 1.04 | 0.70 | 0.73 | 0.77 | 0.81 | 0.78 | 0.76 |
| 8 | 2020-06 | 31.06 | 25.26 | 10.69 | 8.55 | 4.65 | 3.18 | 2.57 | 2.11 | 6.39 | 1.04 | 0.68 | 0.74 | 0.75 | 0.77 | 0.78 | 0.75 |
| 9 | 2020-07 | 30.95 | 24.82 | 10.75 | 8.94 | 4.69 | 3.46 | 2.45 | 2.03 | 6.41 | 1.13 | 0.65 | 0.76 | 0.74 | 0.76 | 0.75 | 0.72 |
| 10 | 2020-08 | 31.04 | 25.15 | 10.73 | 8.90 | 4.69 | 3.38 | 2.39 | 1.96 | 6.31 | 1.18 | 0.63 | 0.74 | 0.72 | 0.75 | 0.73 | 0.70 |
| 11 | 2020-09 | 30.57 | 24.98 | 10.58 | 9.49 | 4.94 | 3.50 | 2.27 | 1.88 | 6.12 | 1.45 | 0.63 | 0.74 | 0.67 | 0.81 | 0.69 | 0.67 |
| 12 | 2020-10 | 30.25 | 26.53 | 10.44 | 9.67 | 4.83 | 2.54 | 2.21 | 1.79 | 6.04 | 1.55 | 0.63 | 0.69 | 0.65 | 0.85 | 0.67 | 0.64 |
df.set_index('Date')
| Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Date | ||||||||||||||||
| 2019-10 | 31.49 | 22.09 | 10.02 | 7.79 | 4.10 | 3.15 | 2.41 | 2.40 | 9.51 | 0.54 | 2.35 | 0.95 | 0.96 | 0.70 | 0.84 | 0.74 |
| 2019-11 | 31.36 | 22.90 | 10.18 | 8.16 | 4.42 | 3.41 | 2.40 | 2.40 | 9.10 | 0.78 | 0.66 | 0.97 | 0.97 | 0.73 | 0.83 | 0.75 |
| 2019-12 | 31.37 | 24.79 | 9.95 | 7.73 | 4.23 | 3.19 | 2.50 | 2.54 | 8.13 | 0.84 | 0.75 | 0.90 | 0.87 | 0.74 | 0.77 | 0.70 |
| 2020-01 | 31.29 | 24.76 | 10.61 | 8.10 | 4.25 | 3.02 | 2.42 | 2.40 | 7.55 | 0.88 | 0.69 | 0.88 | 0.86 | 0.79 | 0.80 | 0.69 |
| 2020-02 | 30.91 | 25.89 | 10.98 | 7.80 | 4.31 | 2.89 | 2.36 | 2.34 | 7.06 | 0.89 | 0.70 | 0.81 | 0.77 | 0.78 | 0.80 | 0.69 |
| 2020-03 | 30.80 | 27.03 | 10.70 | 7.70 | 4.30 | 2.87 | 2.35 | 2.28 | 6.63 | 0.93 | 0.73 | 0.72 | 0.74 | 0.78 | 0.76 | 0.66 |
| 2020-04 | 30.41 | 28.79 | 10.28 | 7.60 | 4.20 | 2.75 | 2.51 | 2.28 | 5.84 | 0.90 | 0.75 | 0.69 | 0.71 | 0.80 | 0.76 | 0.70 |
| 2020-05 | 30.18 | 26.72 | 10.39 | 8.36 | 4.70 | 3.12 | 2.46 | 2.19 | 6.31 | 1.04 | 0.70 | 0.73 | 0.77 | 0.81 | 0.78 | 0.76 |
| 2020-06 | 31.06 | 25.26 | 10.69 | 8.55 | 4.65 | 3.18 | 2.57 | 2.11 | 6.39 | 1.04 | 0.68 | 0.74 | 0.75 | 0.77 | 0.78 | 0.75 |
| 2020-07 | 30.95 | 24.82 | 10.75 | 8.94 | 4.69 | 3.46 | 2.45 | 2.03 | 6.41 | 1.13 | 0.65 | 0.76 | 0.74 | 0.76 | 0.75 | 0.72 |
| 2020-08 | 31.04 | 25.15 | 10.73 | 8.90 | 4.69 | 3.38 | 2.39 | 1.96 | 6.31 | 1.18 | 0.63 | 0.74 | 0.72 | 0.75 | 0.73 | 0.70 |
| 2020-09 | 30.57 | 24.98 | 10.58 | 9.49 | 4.94 | 3.50 | 2.27 | 1.88 | 6.12 | 1.45 | 0.63 | 0.74 | 0.67 | 0.81 | 0.69 | 0.67 |
| 2020-10 | 30.25 | 26.53 | 10.44 | 9.67 | 4.83 | 2.54 | 2.21 | 1.79 | 6.04 | 1.55 | 0.63 | 0.69 | 0.65 | 0.85 | 0.67 | 0.64 |
df.set_index('Date').plot.pie(y='Apple')
<AxesSubplot:ylabel='Apple'>
df.set_index('Date').plot.pie(x='2019-10')
이렇게 하면 y축도 내놓으라해서 그냥 아래로 T변환후에 시각화해주는 듯
df.set_index('Date').T
| Date | 2019-10 | 2019-11 | 2019-12 | 2020-01 | 2020-02 | 2020-03 | 2020-04 | 2020-05 | 2020-06 | 2020-07 | 2020-08 | 2020-09 | 2020-10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Samsung | 31.49 | 31.36 | 31.37 | 31.29 | 30.91 | 30.80 | 30.41 | 30.18 | 31.06 | 30.95 | 31.04 | 30.57 | 30.25 |
| Apple | 22.09 | 22.90 | 24.79 | 24.76 | 25.89 | 27.03 | 28.79 | 26.72 | 25.26 | 24.82 | 25.15 | 24.98 | 26.53 |
| Huawei | 10.02 | 10.18 | 9.95 | 10.61 | 10.98 | 10.70 | 10.28 | 10.39 | 10.69 | 10.75 | 10.73 | 10.58 | 10.44 |
| Xiaomi | 7.79 | 8.16 | 7.73 | 8.10 | 7.80 | 7.70 | 7.60 | 8.36 | 8.55 | 8.94 | 8.90 | 9.49 | 9.67 |
| Oppo | 4.10 | 4.42 | 4.23 | 4.25 | 4.31 | 4.30 | 4.20 | 4.70 | 4.65 | 4.69 | 4.69 | 4.94 | 4.83 |
| Mobicel | 3.15 | 3.41 | 3.19 | 3.02 | 2.89 | 2.87 | 2.75 | 3.12 | 3.18 | 3.46 | 3.38 | 3.50 | 2.54 |
| Motorola | 2.41 | 2.40 | 2.50 | 2.42 | 2.36 | 2.35 | 2.51 | 2.46 | 2.57 | 2.45 | 2.39 | 2.27 | 2.21 |
| LG | 2.40 | 2.40 | 2.54 | 2.40 | 2.34 | 2.28 | 2.28 | 2.19 | 2.11 | 2.03 | 1.96 | 1.88 | 1.79 |
| Others | 9.51 | 9.10 | 8.13 | 7.55 | 7.06 | 6.63 | 5.84 | 6.31 | 6.39 | 6.41 | 6.31 | 6.12 | 6.04 |
| Realme | 0.54 | 0.78 | 0.84 | 0.88 | 0.89 | 0.93 | 0.90 | 1.04 | 1.04 | 1.13 | 1.18 | 1.45 | 1.55 |
| 2.35 | 0.66 | 0.75 | 0.69 | 0.70 | 0.73 | 0.75 | 0.70 | 0.68 | 0.65 | 0.63 | 0.63 | 0.63 | |
| Nokia | 0.95 | 0.97 | 0.90 | 0.88 | 0.81 | 0.72 | 0.69 | 0.73 | 0.74 | 0.76 | 0.74 | 0.74 | 0.69 |
| Lenovo | 0.96 | 0.97 | 0.87 | 0.86 | 0.77 | 0.74 | 0.71 | 0.77 | 0.75 | 0.74 | 0.72 | 0.67 | 0.65 |
| OnePlus | 0.70 | 0.73 | 0.74 | 0.79 | 0.78 | 0.78 | 0.80 | 0.81 | 0.77 | 0.76 | 0.75 | 0.81 | 0.85 |
| Sony | 0.84 | 0.83 | 0.77 | 0.80 | 0.80 | 0.76 | 0.76 | 0.78 | 0.78 | 0.75 | 0.73 | 0.69 | 0.67 |
| Asus | 0.74 | 0.75 | 0.70 | 0.69 | 0.69 | 0.66 | 0.70 | 0.76 | 0.75 | 0.72 | 0.70 | 0.67 | 0.64 |
df.set_index('Date').T.plot.pie(y='2019-10',legend=False)
<AxesSubplot:ylabel='2019-10'>
df.set_index('Date').T.plot.pie(legend=False,subplots=True,layout=(4,4),figsize=(20,20))
array([[<AxesSubplot:ylabel='2019-10'>, <AxesSubplot:ylabel='2019-11'>,
<AxesSubplot:ylabel='2019-12'>, <AxesSubplot:ylabel='2020-01'>],
[<AxesSubplot:ylabel='2020-02'>, <AxesSubplot:ylabel='2020-03'>,
<AxesSubplot:ylabel='2020-04'>, <AxesSubplot:ylabel='2020-05'>],
[<AxesSubplot:ylabel='2020-06'>, <AxesSubplot:ylabel='2020-07'>,
<AxesSubplot:ylabel='2020-08'>, <AxesSubplot:ylabel='2020-09'>],
[<AxesSubplot:ylabel='2020-10'>, <AxesSubplot:>, <AxesSubplot:>,
<AxesSubplot:>]], dtype=object)
- plotly, matplotlib 백엔드 모두 지원
df = pd.read_csv('https://raw.githubusercontent.com/kalilurrahman/datasets/main/mobilephonemktshare2020.csv')
df
| Date | Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-10 | 31.49 | 22.09 | 10.02 | 7.79 | 4.10 | 3.15 | 2.41 | 2.40 | 9.51 | 0.54 | 2.35 | 0.95 | 0.96 | 0.70 | 0.84 | 0.74 |
| 1 | 2019-11 | 31.36 | 22.90 | 10.18 | 8.16 | 4.42 | 3.41 | 2.40 | 2.40 | 9.10 | 0.78 | 0.66 | 0.97 | 0.97 | 0.73 | 0.83 | 0.75 |
| 2 | 2019-12 | 31.37 | 24.79 | 9.95 | 7.73 | 4.23 | 3.19 | 2.50 | 2.54 | 8.13 | 0.84 | 0.75 | 0.90 | 0.87 | 0.74 | 0.77 | 0.70 |
| 3 | 2020-01 | 31.29 | 24.76 | 10.61 | 8.10 | 4.25 | 3.02 | 2.42 | 2.40 | 7.55 | 0.88 | 0.69 | 0.88 | 0.86 | 0.79 | 0.80 | 0.69 |
| 4 | 2020-02 | 30.91 | 25.89 | 10.98 | 7.80 | 4.31 | 2.89 | 2.36 | 2.34 | 7.06 | 0.89 | 0.70 | 0.81 | 0.77 | 0.78 | 0.80 | 0.69 |
| 5 | 2020-03 | 30.80 | 27.03 | 10.70 | 7.70 | 4.30 | 2.87 | 2.35 | 2.28 | 6.63 | 0.93 | 0.73 | 0.72 | 0.74 | 0.78 | 0.76 | 0.66 |
| 6 | 2020-04 | 30.41 | 28.79 | 10.28 | 7.60 | 4.20 | 2.75 | 2.51 | 2.28 | 5.84 | 0.90 | 0.75 | 0.69 | 0.71 | 0.80 | 0.76 | 0.70 |
| 7 | 2020-05 | 30.18 | 26.72 | 10.39 | 8.36 | 4.70 | 3.12 | 2.46 | 2.19 | 6.31 | 1.04 | 0.70 | 0.73 | 0.77 | 0.81 | 0.78 | 0.76 |
| 8 | 2020-06 | 31.06 | 25.26 | 10.69 | 8.55 | 4.65 | 3.18 | 2.57 | 2.11 | 6.39 | 1.04 | 0.68 | 0.74 | 0.75 | 0.77 | 0.78 | 0.75 |
| 9 | 2020-07 | 30.95 | 24.82 | 10.75 | 8.94 | 4.69 | 3.46 | 2.45 | 2.03 | 6.41 | 1.13 | 0.65 | 0.76 | 0.74 | 0.76 | 0.75 | 0.72 |
| 10 | 2020-08 | 31.04 | 25.15 | 10.73 | 8.90 | 4.69 | 3.38 | 2.39 | 1.96 | 6.31 | 1.18 | 0.63 | 0.74 | 0.72 | 0.75 | 0.73 | 0.70 |
| 11 | 2020-09 | 30.57 | 24.98 | 10.58 | 9.49 | 4.94 | 3.50 | 2.27 | 1.88 | 6.12 | 1.45 | 0.63 | 0.74 | 0.67 | 0.81 | 0.69 | 0.67 |
| 12 | 2020-10 | 30.25 | 26.53 | 10.44 | 9.67 | 4.83 | 2.54 | 2.21 | 1.79 | 6.04 | 1.55 | 0.63 | 0.69 | 0.65 | 0.85 | 0.67 | 0.64 |
- 점유율의 차이를 구하자.
df.set_index('Date').diff()
| Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Date | ||||||||||||||||
| 2019-10 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2019-11 | -0.13 | 0.81 | 0.16 | 0.37 | 0.32 | 0.26 | -0.01 | 0.00 | -0.41 | 0.24 | -1.69 | 0.02 | 0.01 | 0.03 | -0.01 | 0.01 |
| 2019-12 | 0.01 | 1.89 | -0.23 | -0.43 | -0.19 | -0.22 | 0.10 | 0.14 | -0.97 | 0.06 | 0.09 | -0.07 | -0.10 | 0.01 | -0.06 | -0.05 |
| 2020-01 | -0.08 | -0.03 | 0.66 | 0.37 | 0.02 | -0.17 | -0.08 | -0.14 | -0.58 | 0.04 | -0.06 | -0.02 | -0.01 | 0.05 | 0.03 | -0.01 |
| 2020-02 | -0.38 | 1.13 | 0.37 | -0.30 | 0.06 | -0.13 | -0.06 | -0.06 | -0.49 | 0.01 | 0.01 | -0.07 | -0.09 | -0.01 | 0.00 | 0.00 |
| 2020-03 | -0.11 | 1.14 | -0.28 | -0.10 | -0.01 | -0.02 | -0.01 | -0.06 | -0.43 | 0.04 | 0.03 | -0.09 | -0.03 | 0.00 | -0.04 | -0.03 |
| 2020-04 | -0.39 | 1.76 | -0.42 | -0.10 | -0.10 | -0.12 | 0.16 | 0.00 | -0.79 | -0.03 | 0.02 | -0.03 | -0.03 | 0.02 | 0.00 | 0.04 |
| 2020-05 | -0.23 | -2.07 | 0.11 | 0.76 | 0.50 | 0.37 | -0.05 | -0.09 | 0.47 | 0.14 | -0.05 | 0.04 | 0.06 | 0.01 | 0.02 | 0.06 |
| 2020-06 | 0.88 | -1.46 | 0.30 | 0.19 | -0.05 | 0.06 | 0.11 | -0.08 | 0.08 | 0.00 | -0.02 | 0.01 | -0.02 | -0.04 | 0.00 | -0.01 |
| 2020-07 | -0.11 | -0.44 | 0.06 | 0.39 | 0.04 | 0.28 | -0.12 | -0.08 | 0.02 | 0.09 | -0.03 | 0.02 | -0.01 | -0.01 | -0.03 | -0.03 |
| 2020-08 | 0.09 | 0.33 | -0.02 | -0.04 | 0.00 | -0.08 | -0.06 | -0.07 | -0.10 | 0.05 | -0.02 | -0.02 | -0.02 | -0.01 | -0.02 | -0.02 |
| 2020-09 | -0.47 | -0.17 | -0.15 | 0.59 | 0.25 | 0.12 | -0.12 | -0.08 | -0.19 | 0.27 | 0.00 | 0.00 | -0.05 | 0.06 | -0.04 | -0.03 |
| 2020-10 | -0.32 | 1.55 | -0.14 | 0.18 | -0.11 | -0.96 | -0.06 | -0.09 | -0.08 | 0.10 | 0.00 | -0.05 | -0.02 | 0.04 | -0.02 | -0.03 |
df.set_index('Date').diff().dropna().boxplot(figsize=(20,5))
<AxesSubplot:>
- 위와 동일한 그림을 plotly backend로도 그릴수 있음 (plotly가 조금 융통성이 있음)
# show(fig)
- 회사를 색깔별로 구분하여 범주를 만들고 싶다?
df.set_index('Date').diff().dropna()
| Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Date | ||||||||||||||||
| 2019-11 | -0.13 | 0.81 | 0.16 | 0.37 | 0.32 | 0.26 | -0.01 | 0.00 | -0.41 | 0.24 | -1.69 | 0.02 | 0.01 | 0.03 | -0.01 | 0.01 |
| 2019-12 | 0.01 | 1.89 | -0.23 | -0.43 | -0.19 | -0.22 | 0.10 | 0.14 | -0.97 | 0.06 | 0.09 | -0.07 | -0.10 | 0.01 | -0.06 | -0.05 |
| 2020-01 | -0.08 | -0.03 | 0.66 | 0.37 | 0.02 | -0.17 | -0.08 | -0.14 | -0.58 | 0.04 | -0.06 | -0.02 | -0.01 | 0.05 | 0.03 | -0.01 |
| 2020-02 | -0.38 | 1.13 | 0.37 | -0.30 | 0.06 | -0.13 | -0.06 | -0.06 | -0.49 | 0.01 | 0.01 | -0.07 | -0.09 | -0.01 | 0.00 | 0.00 |
| 2020-03 | -0.11 | 1.14 | -0.28 | -0.10 | -0.01 | -0.02 | -0.01 | -0.06 | -0.43 | 0.04 | 0.03 | -0.09 | -0.03 | 0.00 | -0.04 | -0.03 |
| 2020-04 | -0.39 | 1.76 | -0.42 | -0.10 | -0.10 | -0.12 | 0.16 | 0.00 | -0.79 | -0.03 | 0.02 | -0.03 | -0.03 | 0.02 | 0.00 | 0.04 |
| 2020-05 | -0.23 | -2.07 | 0.11 | 0.76 | 0.50 | 0.37 | -0.05 | -0.09 | 0.47 | 0.14 | -0.05 | 0.04 | 0.06 | 0.01 | 0.02 | 0.06 |
| 2020-06 | 0.88 | -1.46 | 0.30 | 0.19 | -0.05 | 0.06 | 0.11 | -0.08 | 0.08 | 0.00 | -0.02 | 0.01 | -0.02 | -0.04 | 0.00 | -0.01 |
| 2020-07 | -0.11 | -0.44 | 0.06 | 0.39 | 0.04 | 0.28 | -0.12 | -0.08 | 0.02 | 0.09 | -0.03 | 0.02 | -0.01 | -0.01 | -0.03 | -0.03 |
| 2020-08 | 0.09 | 0.33 | -0.02 | -0.04 | 0.00 | -0.08 | -0.06 | -0.07 | -0.10 | 0.05 | -0.02 | -0.02 | -0.02 | -0.01 | -0.02 | -0.02 |
| 2020-09 | -0.47 | -0.17 | -0.15 | 0.59 | 0.25 | 0.12 | -0.12 | -0.08 | -0.19 | 0.27 | 0.00 | 0.00 | -0.05 | 0.06 | -0.04 | -0.03 |
| 2020-10 | -0.32 | 1.55 | -0.14 | 0.18 | -0.11 | -0.96 | -0.06 | -0.09 | -0.08 | 0.10 | 0.00 | -0.05 | -0.02 | 0.04 | -0.02 | -0.03 |
df.set_index('Date').diff().dropna().melt()
| variable | value | |
|---|---|---|
| 0 | Samsung | -0.13 |
| 1 | Samsung | 0.01 |
| 2 | Samsung | -0.08 |
| 3 | Samsung | -0.38 |
| 4 | Samsung | -0.11 |
| ... | ... | ... |
| 187 | Asus | -0.01 |
| 188 | Asus | -0.03 |
| 189 | Asus | -0.02 |
| 190 | Asus | -0.03 |
| 191 | Asus | -0.03 |
192 rows × 2 columns
#plot.box(backend='plotly',x='variable',color='variable',y='value')
#show(fig)
import plotly.express as px
df = px.data.tips() # 내장된 data인가봄
df # 타이디 데이터
| total_bill | tip | sex | smoker | day | time | size | |
|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
| 1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
| 2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
| 3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
| 4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 239 | 29.03 | 5.92 | Male | No | Sat | Dinner | 3 |
| 240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2 |
| 241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2 |
| 242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2 |
| 243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2 |
244 rows × 7 columns
- 팁은 대체로 얼마나 받는지?
# show(fig)
- 점심/저녁에 따라서 팁의 분포가 다를까?
# show(fig)
- 저녁에 좀더 잘주는것 같음
- 성별에 따라서도 팁을 주는것이 다를까?
# show(fig)
- points='all'
# show(fig)
- boxplot의 아웃라이어가 사라지고, 데이터를 더 리치하게 볼 수 있다.
- 요일에 따라서도 달라질까?
#show(fig)
- 흡연유무에 따라서도 달라질까?
#show(fig)
- tidydata로 한번 만들어 두니 너무 쉽게 생각하는 대로 구현가능
tidydata가 확실히 고차원 자료를 그리기에 유리함. matplotlib은 위와 같은 형태를 그리는것 자체가 불가능
- 시뮬레이션예제: 정규분포를 만들어서 제곱한뒤에 3개씩, 4개씩, ... , 10개까지 더함 $\to$ 카이제곱분포
- 일단 3개부터 구현해보자.
X = np.random.normal(size=(1000,3),loc=0,scale=1)
X
array([[ 1.55206654, -0.63914829, 1.57183278],
[ 0.68304602, -0.20688318, 0.35819181],
[ 1.47085428, 0.81133151, -0.5744874 ],
...,
[ 1.40359129, -0.65010241, 0.47624468],
[ 0.03466939, -0.7774873 , 0.68491511],
[-1.21877598, 0.05928286, 1.32481268]])
X**2 # 이제 카이제곱 분포를 따른다
array([[2.40891054e+00, 4.08510541e-01, 2.47065829e+00],
[4.66551869e-01, 4.28006512e-02, 1.28301370e-01],
[2.16341231e+00, 6.58258819e-01, 3.30035776e-01],
...,
[1.97006850e+00, 4.22633142e-01, 2.26808996e-01],
[1.20196631e-03, 6.04486503e-01, 4.69108708e-01],
[1.48541489e+00, 3.51445752e-03, 1.75512863e+00]])
- 코드를 정리하면
# ((np.random.normal(size=(1000,4),loc=0,scale=1))**2).sum(axis=1)
# ...
# ((np.random.normal(size=(1000,10),loc=0,scale=1))**2).sum(axis=1)
_arr = [3,4,5,6,7,8,9,10]
df= pd.DataFrame([((np.random.normal(size=(1000,_arr[i]),loc=0,scale=1))**2).sum(axis=1).tolist() for i in range(len(_arr))]).T
df
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 5.196671 | 2.073253 | 7.256207 | 0.912066 | 6.190578 | 6.594515 | 7.069170 | 12.084896 |
| 1 | 8.763815 | 2.773966 | 3.015868 | 4.860482 | 4.146444 | 7.742799 | 16.964332 | 9.376459 |
| 2 | 3.293716 | 3.043589 | 1.294319 | 4.905373 | 8.232812 | 10.626497 | 5.012941 | 10.656208 |
| 3 | 1.162761 | 1.256967 | 2.704866 | 9.572457 | 7.053241 | 5.572123 | 3.280732 | 9.305952 |
| 4 | 4.195460 | 3.777258 | 12.706358 | 3.889861 | 4.839483 | 6.489378 | 24.064284 | 10.843205 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | 4.723027 | 2.775728 | 0.886107 | 1.453307 | 5.658189 | 2.890155 | 20.358523 | 27.900246 |
| 996 | 5.916433 | 4.379810 | 4.450089 | 3.111495 | 2.695229 | 7.811263 | 5.052450 | 11.098986 |
| 997 | 0.661397 | 3.076920 | 9.576774 | 9.713117 | 8.424721 | 9.593768 | 7.854476 | 17.334970 |
| 998 | 0.445096 | 7.051000 | 4.651447 | 9.421335 | 7.365830 | 6.639832 | 5.496892 | 9.536662 |
| 999 | 2.615014 | 7.536859 | 2.548289 | 10.028903 | 6.195696 | 6.076087 | 5.851520 | 25.364383 |
1000 rows × 8 columns
- 컬럼 0이 의미하는것은 정규분포를 제곱하여 3개씩 더하여 나온값이고 컬럼1이 의미하는것은 정규분포를 제곱해서 4개씩 더해서 나온값임 $\to$ 열의 이름을 지어주자.
df.columns = _arr
df
| 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 5.196671 | 2.073253 | 7.256207 | 0.912066 | 6.190578 | 6.594515 | 7.069170 | 12.084896 |
| 1 | 8.763815 | 2.773966 | 3.015868 | 4.860482 | 4.146444 | 7.742799 | 16.964332 | 9.376459 |
| 2 | 3.293716 | 3.043589 | 1.294319 | 4.905373 | 8.232812 | 10.626497 | 5.012941 | 10.656208 |
| 3 | 1.162761 | 1.256967 | 2.704866 | 9.572457 | 7.053241 | 5.572123 | 3.280732 | 9.305952 |
| 4 | 4.195460 | 3.777258 | 12.706358 | 3.889861 | 4.839483 | 6.489378 | 24.064284 | 10.843205 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | 4.723027 | 2.775728 | 0.886107 | 1.453307 | 5.658189 | 2.890155 | 20.358523 | 27.900246 |
| 996 | 5.916433 | 4.379810 | 4.450089 | 3.111495 | 2.695229 | 7.811263 | 5.052450 | 11.098986 |
| 997 | 0.661397 | 3.076920 | 9.576774 | 9.713117 | 8.424721 | 9.593768 | 7.854476 | 17.334970 |
| 998 | 0.445096 | 7.051000 | 4.651447 | 9.421335 | 7.365830 | 6.639832 | 5.496892 | 9.536662 |
| 999 | 2.615014 | 7.536859 | 2.548289 | 10.028903 | 6.195696 | 6.076087 | 5.851520 | 25.364383 |
1000 rows × 8 columns
- 분포를 그려보자.
df.plot.hist()
<AxesSubplot:ylabel='Frequency'>
- bins와 투명도 조절
df.plot.hist(alpha=0.2,bins=50)
<AxesSubplot:ylabel='Frequency'>
- 서브플랏
import matplotlib.pyplot as plt
df.plot.hist(alpha=0.2,bins=50,layout=(2,4),subplots=True,figsize=(15,5))
plt.tight_layout()
- kde 플랏
df.plot.kde(layout=(2,4),subplots=True,figsize=(15,5))
plt.tight_layout()
df.plot.kde(layout=(2,4),subplots=True,bw_method=0.01,figsize=(15,5))
plt.tight_layout()
df.plot.kde(layout=(2,4),subplots=True,bw_method=5,figsize=(15,5))
plt.tight_layout()
df.plot.kde(layout=(2,4),subplots=True,figsize=(15,5),ls='--')
plt.tight_layout()
- 다시 tips 예제로 돌아오자.
import plotly.express as px
df = px.data.tips()
df
| total_bill | tip | sex | smoker | day | time | size | |
|---|---|---|---|---|---|---|---|
| 0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
| 1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
| 2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
| 3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
| 4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 239 | 29.03 | 5.92 | Male | No | Sat | Dinner | 3 |
| 240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2 |
| 241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2 |
| 242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2 |
| 243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2 |
244 rows × 7 columns
- 성별에 따라서 팁을 주는게 다를까?
# show(fig)
- 빈도가 잘 보인다는 측면에서 박스플랏보다 좋은것 같음
- 시간에 따라서도 다른지?
# show(fig)
- tidydata가 확실히 자료를 처리하기 편리함
- 주류플랏은 아님
- 다시 핸드폰예제
df = pd.read_csv('https://raw.githubusercontent.com/kalilurrahman/datasets/main/mobilephonemktshare2020.csv')
df
| Date | Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-10 | 31.49 | 22.09 | 10.02 | 7.79 | 4.10 | 3.15 | 2.41 | 2.40 | 9.51 | 0.54 | 2.35 | 0.95 | 0.96 | 0.70 | 0.84 | 0.74 |
| 1 | 2019-11 | 31.36 | 22.90 | 10.18 | 8.16 | 4.42 | 3.41 | 2.40 | 2.40 | 9.10 | 0.78 | 0.66 | 0.97 | 0.97 | 0.73 | 0.83 | 0.75 |
| 2 | 2019-12 | 31.37 | 24.79 | 9.95 | 7.73 | 4.23 | 3.19 | 2.50 | 2.54 | 8.13 | 0.84 | 0.75 | 0.90 | 0.87 | 0.74 | 0.77 | 0.70 |
| 3 | 2020-01 | 31.29 | 24.76 | 10.61 | 8.10 | 4.25 | 3.02 | 2.42 | 2.40 | 7.55 | 0.88 | 0.69 | 0.88 | 0.86 | 0.79 | 0.80 | 0.69 |
| 4 | 2020-02 | 30.91 | 25.89 | 10.98 | 7.80 | 4.31 | 2.89 | 2.36 | 2.34 | 7.06 | 0.89 | 0.70 | 0.81 | 0.77 | 0.78 | 0.80 | 0.69 |
| 5 | 2020-03 | 30.80 | 27.03 | 10.70 | 7.70 | 4.30 | 2.87 | 2.35 | 2.28 | 6.63 | 0.93 | 0.73 | 0.72 | 0.74 | 0.78 | 0.76 | 0.66 |
| 6 | 2020-04 | 30.41 | 28.79 | 10.28 | 7.60 | 4.20 | 2.75 | 2.51 | 2.28 | 5.84 | 0.90 | 0.75 | 0.69 | 0.71 | 0.80 | 0.76 | 0.70 |
| 7 | 2020-05 | 30.18 | 26.72 | 10.39 | 8.36 | 4.70 | 3.12 | 2.46 | 2.19 | 6.31 | 1.04 | 0.70 | 0.73 | 0.77 | 0.81 | 0.78 | 0.76 |
| 8 | 2020-06 | 31.06 | 25.26 | 10.69 | 8.55 | 4.65 | 3.18 | 2.57 | 2.11 | 6.39 | 1.04 | 0.68 | 0.74 | 0.75 | 0.77 | 0.78 | 0.75 |
| 9 | 2020-07 | 30.95 | 24.82 | 10.75 | 8.94 | 4.69 | 3.46 | 2.45 | 2.03 | 6.41 | 1.13 | 0.65 | 0.76 | 0.74 | 0.76 | 0.75 | 0.72 |
| 10 | 2020-08 | 31.04 | 25.15 | 10.73 | 8.90 | 4.69 | 3.38 | 2.39 | 1.96 | 6.31 | 1.18 | 0.63 | 0.74 | 0.72 | 0.75 | 0.73 | 0.70 |
| 11 | 2020-09 | 30.57 | 24.98 | 10.58 | 9.49 | 4.94 | 3.50 | 2.27 | 1.88 | 6.12 | 1.45 | 0.63 | 0.74 | 0.67 | 0.81 | 0.69 | 0.67 |
| 12 | 2020-10 | 30.25 | 26.53 | 10.44 | 9.67 | 4.83 | 2.54 | 2.21 | 1.79 | 6.04 | 1.55 | 0.63 | 0.69 | 0.65 | 0.85 | 0.67 | 0.64 |
df.set_index('Date').plot.area(figsize=(20,10),alpha=0.6)
<AxesSubplot:xlabel='Date'>
- 시간에 따른 점유을의 변화를 보기에 적절한것 같다.
- plotly를 쓰기 위해서 tidydata로 바꾸자
df
| Date | Samsung | Apple | Huawei | Xiaomi | Oppo | Mobicel | Motorola | LG | Others | Realme | Nokia | Lenovo | OnePlus | Sony | Asus | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-10 | 31.49 | 22.09 | 10.02 | 7.79 | 4.10 | 3.15 | 2.41 | 2.40 | 9.51 | 0.54 | 2.35 | 0.95 | 0.96 | 0.70 | 0.84 | 0.74 |
| 1 | 2019-11 | 31.36 | 22.90 | 10.18 | 8.16 | 4.42 | 3.41 | 2.40 | 2.40 | 9.10 | 0.78 | 0.66 | 0.97 | 0.97 | 0.73 | 0.83 | 0.75 |
| 2 | 2019-12 | 31.37 | 24.79 | 9.95 | 7.73 | 4.23 | 3.19 | 2.50 | 2.54 | 8.13 | 0.84 | 0.75 | 0.90 | 0.87 | 0.74 | 0.77 | 0.70 |
| 3 | 2020-01 | 31.29 | 24.76 | 10.61 | 8.10 | 4.25 | 3.02 | 2.42 | 2.40 | 7.55 | 0.88 | 0.69 | 0.88 | 0.86 | 0.79 | 0.80 | 0.69 |
| 4 | 2020-02 | 30.91 | 25.89 | 10.98 | 7.80 | 4.31 | 2.89 | 2.36 | 2.34 | 7.06 | 0.89 | 0.70 | 0.81 | 0.77 | 0.78 | 0.80 | 0.69 |
| 5 | 2020-03 | 30.80 | 27.03 | 10.70 | 7.70 | 4.30 | 2.87 | 2.35 | 2.28 | 6.63 | 0.93 | 0.73 | 0.72 | 0.74 | 0.78 | 0.76 | 0.66 |
| 6 | 2020-04 | 30.41 | 28.79 | 10.28 | 7.60 | 4.20 | 2.75 | 2.51 | 2.28 | 5.84 | 0.90 | 0.75 | 0.69 | 0.71 | 0.80 | 0.76 | 0.70 |
| 7 | 2020-05 | 30.18 | 26.72 | 10.39 | 8.36 | 4.70 | 3.12 | 2.46 | 2.19 | 6.31 | 1.04 | 0.70 | 0.73 | 0.77 | 0.81 | 0.78 | 0.76 |
| 8 | 2020-06 | 31.06 | 25.26 | 10.69 | 8.55 | 4.65 | 3.18 | 2.57 | 2.11 | 6.39 | 1.04 | 0.68 | 0.74 | 0.75 | 0.77 | 0.78 | 0.75 |
| 9 | 2020-07 | 30.95 | 24.82 | 10.75 | 8.94 | 4.69 | 3.46 | 2.45 | 2.03 | 6.41 | 1.13 | 0.65 | 0.76 | 0.74 | 0.76 | 0.75 | 0.72 |
| 10 | 2020-08 | 31.04 | 25.15 | 10.73 | 8.90 | 4.69 | 3.38 | 2.39 | 1.96 | 6.31 | 1.18 | 0.63 | 0.74 | 0.72 | 0.75 | 0.73 | 0.70 |
| 11 | 2020-09 | 30.57 | 24.98 | 10.58 | 9.49 | 4.94 | 3.50 | 2.27 | 1.88 | 6.12 | 1.45 | 0.63 | 0.74 | 0.67 | 0.81 | 0.69 | 0.67 |
| 12 | 2020-10 | 30.25 | 26.53 | 10.44 | 9.67 | 4.83 | 2.54 | 2.21 | 1.79 | 6.04 | 1.55 | 0.63 | 0.69 | 0.65 | 0.85 | 0.67 | 0.64 |
df.melt(id_vars='Date')
| Date | variable | value | |
|---|---|---|---|
| 0 | 2019-10 | Samsung | 31.49 |
| 1 | 2019-11 | Samsung | 31.36 |
| 2 | 2019-12 | Samsung | 31.37 |
| 3 | 2020-01 | Samsung | 31.29 |
| 4 | 2020-02 | Samsung | 30.91 |
| ... | ... | ... | ... |
| 203 | 2020-06 | Asus | 0.75 |
| 204 | 2020-07 | Asus | 0.72 |
| 205 | 2020-08 | Asus | 0.70 |
| 206 | 2020-09 | Asus | 0.67 |
| 207 | 2020-10 | Asus | 0.64 |
208 rows × 3 columns
# show(fig)
- 상당히 raw한 dataset
df=pd.read_html('https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC')[19]
df
| 행정구역별 | 2021. 06 | 2015 | 2010 | 2005 | 2000 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 행정구역별 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | |
| 0 | 전국 | 16.7 | 8652198 | 13.1 | 6775101 | 10.9 | 5506352 | 8.9 | 4324524 | 7.0 | 3355614 |
| 1 | 서울특별시 | 16.4 | 1568769 | 12.6 | 1262436 | 9.7 | 1002770 | 7.2 | 731349 | 5.4 | 558566 |
| 2 | 부산광역시 | 19.8 | 666644 | 14.6 | 514630 | 11.3 | 401784 | 8.3 | 302784 | 6.0 | 229075 |
| 3 | 대구광역시 | 17.0 | 408235 | 12.7 | 316122 | 10.0 | 252084 | 7.8 | 195419 | 5.9 | 149045 |
| 4 | 인천광역시 | 14.4 | 422658 | 10.7 | 312905 | 8.6 | 237805 | 6.9 | 178602 | 5.4 | 138316 |
| 5 | 광주광역시 | 14.5 | 208879 | 11.3 | 166389 | 9.0 | 130457 | 7.1 | 99389 | 5.6 | 77325 |
| 6 | 대전광역시 | 14.8 | 215997 | 10.9 | 165528 | 8.7 | 130245 | 6.9 | 99811 | 5.5 | 75769 |
| 7 | 울산광역시 | 13.1 | 147811 | 8.8 | 103205 | 6.8 | 76800 | 5.3 | 57797 | 4.0 | 42119 |
| 8 | 세종특별자치시 | 10.0 | 36194 | 10.6 | 22399 | - | - | - | - | - | - |
| 9 | 경기도 | 13.5 | 1825846 | 10.5 | 1318882 | 8.7 | 1022456 | 7.1 | 755511 | 5.7 | 524807 |
| 10 | 강원도 | 21.2 | 325579 | 16.9 | 261671 | 14.8 | 226505 | 12.1 | 183471 | 9.3 | 143945 |
| 11 | 충청북도 | 18.4 | 294530 | 14.8 | 234813 | 13.2 | 204470 | 11.3 | 168670 | 9.1 | 136160 |
| 12 | 충청남도 | 19.5 | 412504 | 16.4 | 341214 | 14.9 | 308556 | 13.3 | 261800 | 11.2 | 215059 |
| 13 | 전라북도 | 21.8 | 391178 | 17.8 | 333524 | 15.2 | 284373 | 12.9 | 243721 | 10.3 | 205807 |
| 14 | 전라남도 | 23.9 | 440014 | 20.5 | 391837 | 18.3 | 350900 | 15.6 | 306439 | 11.9 | 254370 |
| 15 | 경상북도 | 22.2 | 585088 | 17.7 | 479634 | 15.6 | 418858 | 13.4 | 360068 | 10.7 | 300614 |
| 16 | 경상남도 | 17.9 | 594154 | 13.8 | 464019 | 11.8 | 388648 | 10.2 | 323898 | 8.4 | 261303 |
| 17 | 제주특별자치도 | 16.0 | 108118 | 13.8 | 85893 | 12.2 | 69641 | 10.0 | 55795 | 8.0 | 43334 |
- 첫번째 row(=전국)는 일단 제외
df.iloc[1:]
| 행정구역별 | 2021. 06 | 2015 | 2010 | 2005 | 2000 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 행정구역별 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | |
| 1 | 서울특별시 | 16.4 | 1568769 | 12.6 | 1262436 | 9.7 | 1002770 | 7.2 | 731349 | 5.4 | 558566 |
| 2 | 부산광역시 | 19.8 | 666644 | 14.6 | 514630 | 11.3 | 401784 | 8.3 | 302784 | 6.0 | 229075 |
| 3 | 대구광역시 | 17.0 | 408235 | 12.7 | 316122 | 10.0 | 252084 | 7.8 | 195419 | 5.9 | 149045 |
| 4 | 인천광역시 | 14.4 | 422658 | 10.7 | 312905 | 8.6 | 237805 | 6.9 | 178602 | 5.4 | 138316 |
| 5 | 광주광역시 | 14.5 | 208879 | 11.3 | 166389 | 9.0 | 130457 | 7.1 | 99389 | 5.6 | 77325 |
| 6 | 대전광역시 | 14.8 | 215997 | 10.9 | 165528 | 8.7 | 130245 | 6.9 | 99811 | 5.5 | 75769 |
| 7 | 울산광역시 | 13.1 | 147811 | 8.8 | 103205 | 6.8 | 76800 | 5.3 | 57797 | 4.0 | 42119 |
| 8 | 세종특별자치시 | 10.0 | 36194 | 10.6 | 22399 | - | - | - | - | - | - |
| 9 | 경기도 | 13.5 | 1825846 | 10.5 | 1318882 | 8.7 | 1022456 | 7.1 | 755511 | 5.7 | 524807 |
| 10 | 강원도 | 21.2 | 325579 | 16.9 | 261671 | 14.8 | 226505 | 12.1 | 183471 | 9.3 | 143945 |
| 11 | 충청북도 | 18.4 | 294530 | 14.8 | 234813 | 13.2 | 204470 | 11.3 | 168670 | 9.1 | 136160 |
| 12 | 충청남도 | 19.5 | 412504 | 16.4 | 341214 | 14.9 | 308556 | 13.3 | 261800 | 11.2 | 215059 |
| 13 | 전라북도 | 21.8 | 391178 | 17.8 | 333524 | 15.2 | 284373 | 12.9 | 243721 | 10.3 | 205807 |
| 14 | 전라남도 | 23.9 | 440014 | 20.5 | 391837 | 18.3 | 350900 | 15.6 | 306439 | 11.9 | 254370 |
| 15 | 경상북도 | 22.2 | 585088 | 17.7 | 479634 | 15.6 | 418858 | 13.4 | 360068 | 10.7 | 300614 |
| 16 | 경상남도 | 17.9 | 594154 | 13.8 | 464019 | 11.8 | 388648 | 10.2 | 323898 | 8.4 | 261303 |
| 17 | 제주특별자치도 | 16.0 | 108118 | 13.8 | 85893 | 12.2 | 69641 | 10.0 | 55795 | 8.0 | 43334 |
- 서울~제주를 인덱스로 설정하고 다시 스택해보자
df.iloc[1:].columns
# columns 이름이 튜플 형태로 저장되어 있음
# MultiIndex
MultiIndex([( '행정구역별', '행정구역별'),
('2021. 06', '비율'),
('2021. 06', '인구'),
( '2015', '비율'),
( '2015', '인구'),
( '2010', '비율'),
( '2010', '인구'),
( '2005', '비율'),
( '2005', '인구'),
( '2000', '비율'),
( '2000', '인구')],
)
df.iloc[1:].set_index(('행정구역별','행정구역별'))
| 2021. 06 | 2015 | 2010 | 2005 | 2000 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | |
| (행정구역별, 행정구역별) | ||||||||||
| 서울특별시 | 16.4 | 1568769 | 12.6 | 1262436 | 9.7 | 1002770 | 7.2 | 731349 | 5.4 | 558566 |
| 부산광역시 | 19.8 | 666644 | 14.6 | 514630 | 11.3 | 401784 | 8.3 | 302784 | 6.0 | 229075 |
| 대구광역시 | 17.0 | 408235 | 12.7 | 316122 | 10.0 | 252084 | 7.8 | 195419 | 5.9 | 149045 |
| 인천광역시 | 14.4 | 422658 | 10.7 | 312905 | 8.6 | 237805 | 6.9 | 178602 | 5.4 | 138316 |
| 광주광역시 | 14.5 | 208879 | 11.3 | 166389 | 9.0 | 130457 | 7.1 | 99389 | 5.6 | 77325 |
| 대전광역시 | 14.8 | 215997 | 10.9 | 165528 | 8.7 | 130245 | 6.9 | 99811 | 5.5 | 75769 |
| 울산광역시 | 13.1 | 147811 | 8.8 | 103205 | 6.8 | 76800 | 5.3 | 57797 | 4.0 | 42119 |
| 세종특별자치시 | 10.0 | 36194 | 10.6 | 22399 | - | - | - | - | - | - |
| 경기도 | 13.5 | 1825846 | 10.5 | 1318882 | 8.7 | 1022456 | 7.1 | 755511 | 5.7 | 524807 |
| 강원도 | 21.2 | 325579 | 16.9 | 261671 | 14.8 | 226505 | 12.1 | 183471 | 9.3 | 143945 |
| 충청북도 | 18.4 | 294530 | 14.8 | 234813 | 13.2 | 204470 | 11.3 | 168670 | 9.1 | 136160 |
| 충청남도 | 19.5 | 412504 | 16.4 | 341214 | 14.9 | 308556 | 13.3 | 261800 | 11.2 | 215059 |
| 전라북도 | 21.8 | 391178 | 17.8 | 333524 | 15.2 | 284373 | 12.9 | 243721 | 10.3 | 205807 |
| 전라남도 | 23.9 | 440014 | 20.5 | 391837 | 18.3 | 350900 | 15.6 | 306439 | 11.9 | 254370 |
| 경상북도 | 22.2 | 585088 | 17.7 | 479634 | 15.6 | 418858 | 13.4 | 360068 | 10.7 | 300614 |
| 경상남도 | 17.9 | 594154 | 13.8 | 464019 | 11.8 | 388648 | 10.2 | 323898 | 8.4 | 261303 |
| 제주특별자치도 | 16.0 | 108118 | 13.8 | 85893 | 12.2 | 69641 | 10.0 | 55795 | 8.0 | 43334 |
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack()
| 2000 | 2005 | 2010 | 2015 | 2021. 06 | ||
|---|---|---|---|---|---|---|
| (행정구역별, 행정구역별) | ||||||
| 서울특별시 | 비율 | 5.4 | 7.2 | 9.7 | 12.6 | 16.4 |
| 인구 | 558566 | 731349 | 1002770 | 1262436.0 | 1568769.0 | |
| 부산광역시 | 비율 | 6.0 | 8.3 | 11.3 | 14.6 | 19.8 |
| 인구 | 229075 | 302784 | 401784 | 514630.0 | 666644.0 | |
| 대구광역시 | 비율 | 5.9 | 7.8 | 10.0 | 12.7 | 17.0 |
| 인구 | 149045 | 195419 | 252084 | 316122.0 | 408235.0 | |
| 인천광역시 | 비율 | 5.4 | 6.9 | 8.6 | 10.7 | 14.4 |
| 인구 | 138316 | 178602 | 237805 | 312905.0 | 422658.0 | |
| 광주광역시 | 비율 | 5.6 | 7.1 | 9.0 | 11.3 | 14.5 |
| 인구 | 77325 | 99389 | 130457 | 166389.0 | 208879.0 | |
| 대전광역시 | 비율 | 5.5 | 6.9 | 8.7 | 10.9 | 14.8 |
| 인구 | 75769 | 99811 | 130245 | 165528.0 | 215997.0 | |
| 울산광역시 | 비율 | 4.0 | 5.3 | 6.8 | 8.8 | 13.1 |
| 인구 | 42119 | 57797 | 76800 | 103205.0 | 147811.0 | |
| 세종특별자치시 | 비율 | - | - | - | 10.6 | 10.0 |
| 인구 | - | - | - | 22399.0 | 36194.0 | |
| 경기도 | 비율 | 5.7 | 7.1 | 8.7 | 10.5 | 13.5 |
| 인구 | 524807 | 755511 | 1022456 | 1318882.0 | 1825846.0 | |
| 강원도 | 비율 | 9.3 | 12.1 | 14.8 | 16.9 | 21.2 |
| 인구 | 143945 | 183471 | 226505 | 261671.0 | 325579.0 | |
| 충청북도 | 비율 | 9.1 | 11.3 | 13.2 | 14.8 | 18.4 |
| 인구 | 136160 | 168670 | 204470 | 234813.0 | 294530.0 | |
| 충청남도 | 비율 | 11.2 | 13.3 | 14.9 | 16.4 | 19.5 |
| 인구 | 215059 | 261800 | 308556 | 341214.0 | 412504.0 | |
| 전라북도 | 비율 | 10.3 | 12.9 | 15.2 | 17.8 | 21.8 |
| 인구 | 205807 | 243721 | 284373 | 333524.0 | 391178.0 | |
| 전라남도 | 비율 | 11.9 | 15.6 | 18.3 | 20.5 | 23.9 |
| 인구 | 254370 | 306439 | 350900 | 391837.0 | 440014.0 | |
| 경상북도 | 비율 | 10.7 | 13.4 | 15.6 | 17.7 | 22.2 |
| 인구 | 300614 | 360068 | 418858 | 479634.0 | 585088.0 | |
| 경상남도 | 비율 | 8.4 | 10.2 | 11.8 | 13.8 | 17.9 |
| 인구 | 261303 | 323898 | 388648 | 464019.0 | 594154.0 | |
| 제주특별자치도 | 비율 | 8.0 | 10.0 | 12.2 | 13.8 | 16.0 |
| 인구 | 43334 | 55795 | 69641 | 85893.0 | 108118.0 |
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index()
| (행정구역별, 행정구역별) | level_1 | 2000 | 2005 | 2010 | 2015 | 2021. 06 | |
|---|---|---|---|---|---|---|---|
| 0 | 서울특별시 | 비율 | 5.4 | 7.2 | 9.7 | 12.6 | 16.4 |
| 1 | 서울특별시 | 인구 | 558566 | 731349 | 1002770 | 1262436.0 | 1568769.0 |
| 2 | 부산광역시 | 비율 | 6.0 | 8.3 | 11.3 | 14.6 | 19.8 |
| 3 | 부산광역시 | 인구 | 229075 | 302784 | 401784 | 514630.0 | 666644.0 |
| 4 | 대구광역시 | 비율 | 5.9 | 7.8 | 10.0 | 12.7 | 17.0 |
| 5 | 대구광역시 | 인구 | 149045 | 195419 | 252084 | 316122.0 | 408235.0 |
| 6 | 인천광역시 | 비율 | 5.4 | 6.9 | 8.6 | 10.7 | 14.4 |
| 7 | 인천광역시 | 인구 | 138316 | 178602 | 237805 | 312905.0 | 422658.0 |
| 8 | 광주광역시 | 비율 | 5.6 | 7.1 | 9.0 | 11.3 | 14.5 |
| 9 | 광주광역시 | 인구 | 77325 | 99389 | 130457 | 166389.0 | 208879.0 |
| 10 | 대전광역시 | 비율 | 5.5 | 6.9 | 8.7 | 10.9 | 14.8 |
| 11 | 대전광역시 | 인구 | 75769 | 99811 | 130245 | 165528.0 | 215997.0 |
| 12 | 울산광역시 | 비율 | 4.0 | 5.3 | 6.8 | 8.8 | 13.1 |
| 13 | 울산광역시 | 인구 | 42119 | 57797 | 76800 | 103205.0 | 147811.0 |
| 14 | 세종특별자치시 | 비율 | - | - | - | 10.6 | 10.0 |
| 15 | 세종특별자치시 | 인구 | - | - | - | 22399.0 | 36194.0 |
| 16 | 경기도 | 비율 | 5.7 | 7.1 | 8.7 | 10.5 | 13.5 |
| 17 | 경기도 | 인구 | 524807 | 755511 | 1022456 | 1318882.0 | 1825846.0 |
| 18 | 강원도 | 비율 | 9.3 | 12.1 | 14.8 | 16.9 | 21.2 |
| 19 | 강원도 | 인구 | 143945 | 183471 | 226505 | 261671.0 | 325579.0 |
| 20 | 충청북도 | 비율 | 9.1 | 11.3 | 13.2 | 14.8 | 18.4 |
| 21 | 충청북도 | 인구 | 136160 | 168670 | 204470 | 234813.0 | 294530.0 |
| 22 | 충청남도 | 비율 | 11.2 | 13.3 | 14.9 | 16.4 | 19.5 |
| 23 | 충청남도 | 인구 | 215059 | 261800 | 308556 | 341214.0 | 412504.0 |
| 24 | 전라북도 | 비율 | 10.3 | 12.9 | 15.2 | 17.8 | 21.8 |
| 25 | 전라북도 | 인구 | 205807 | 243721 | 284373 | 333524.0 | 391178.0 |
| 26 | 전라남도 | 비율 | 11.9 | 15.6 | 18.3 | 20.5 | 23.9 |
| 27 | 전라남도 | 인구 | 254370 | 306439 | 350900 | 391837.0 | 440014.0 |
| 28 | 경상북도 | 비율 | 10.7 | 13.4 | 15.6 | 17.7 | 22.2 |
| 29 | 경상북도 | 인구 | 300614 | 360068 | 418858 | 479634.0 | 585088.0 |
| 30 | 경상남도 | 비율 | 8.4 | 10.2 | 11.8 | 13.8 | 17.9 |
| 31 | 경상남도 | 인구 | 261303 | 323898 | 388648 | 464019.0 | 594154.0 |
| 32 | 제주특별자치도 | 비율 | 8.0 | 10.0 | 12.2 | 13.8 | 16.0 |
| 33 | 제주특별자치도 | 인구 | 43334 | 55795 | 69641 | 85893.0 | 108118.0 |
- 시각화를 위해서 비율만 선택하도록 하자.
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index().\
query('level_1=="비율"')
| (행정구역별, 행정구역별) | level_1 | 2000 | 2005 | 2010 | 2015 | 2021. 06 | |
|---|---|---|---|---|---|---|---|
| 0 | 서울특별시 | 비율 | 5.4 | 7.2 | 9.7 | 12.6 | 16.4 |
| 2 | 부산광역시 | 비율 | 6.0 | 8.3 | 11.3 | 14.6 | 19.8 |
| 4 | 대구광역시 | 비율 | 5.9 | 7.8 | 10.0 | 12.7 | 17.0 |
| 6 | 인천광역시 | 비율 | 5.4 | 6.9 | 8.6 | 10.7 | 14.4 |
| 8 | 광주광역시 | 비율 | 5.6 | 7.1 | 9.0 | 11.3 | 14.5 |
| 10 | 대전광역시 | 비율 | 5.5 | 6.9 | 8.7 | 10.9 | 14.8 |
| 12 | 울산광역시 | 비율 | 4.0 | 5.3 | 6.8 | 8.8 | 13.1 |
| 14 | 세종특별자치시 | 비율 | - | - | - | 10.6 | 10.0 |
| 16 | 경기도 | 비율 | 5.7 | 7.1 | 8.7 | 10.5 | 13.5 |
| 18 | 강원도 | 비율 | 9.3 | 12.1 | 14.8 | 16.9 | 21.2 |
| 20 | 충청북도 | 비율 | 9.1 | 11.3 | 13.2 | 14.8 | 18.4 |
| 22 | 충청남도 | 비율 | 11.2 | 13.3 | 14.9 | 16.4 | 19.5 |
| 24 | 전라북도 | 비율 | 10.3 | 12.9 | 15.2 | 17.8 | 21.8 |
| 26 | 전라남도 | 비율 | 11.9 | 15.6 | 18.3 | 20.5 | 23.9 |
| 28 | 경상북도 | 비율 | 10.7 | 13.4 | 15.6 | 17.7 | 22.2 |
| 30 | 경상남도 | 비율 | 8.4 | 10.2 | 11.8 | 13.8 | 17.9 |
| 32 | 제주특별자치도 | 비율 | 8.0 | 10.0 | 12.2 | 13.8 | 16.0 |
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index().\
query('level_1=="비율"').set_index(('행정구역별','행정구역별'))
| level_1 | 2000 | 2005 | 2010 | 2015 | 2021. 06 | |
|---|---|---|---|---|---|---|
| (행정구역별, 행정구역별) | ||||||
| 서울특별시 | 비율 | 5.4 | 7.2 | 9.7 | 12.6 | 16.4 |
| 부산광역시 | 비율 | 6.0 | 8.3 | 11.3 | 14.6 | 19.8 |
| 대구광역시 | 비율 | 5.9 | 7.8 | 10.0 | 12.7 | 17.0 |
| 인천광역시 | 비율 | 5.4 | 6.9 | 8.6 | 10.7 | 14.4 |
| 광주광역시 | 비율 | 5.6 | 7.1 | 9.0 | 11.3 | 14.5 |
| 대전광역시 | 비율 | 5.5 | 6.9 | 8.7 | 10.9 | 14.8 |
| 울산광역시 | 비율 | 4.0 | 5.3 | 6.8 | 8.8 | 13.1 |
| 세종특별자치시 | 비율 | - | - | - | 10.6 | 10.0 |
| 경기도 | 비율 | 5.7 | 7.1 | 8.7 | 10.5 | 13.5 |
| 강원도 | 비율 | 9.3 | 12.1 | 14.8 | 16.9 | 21.2 |
| 충청북도 | 비율 | 9.1 | 11.3 | 13.2 | 14.8 | 18.4 |
| 충청남도 | 비율 | 11.2 | 13.3 | 14.9 | 16.4 | 19.5 |
| 전라북도 | 비율 | 10.3 | 12.9 | 15.2 | 17.8 | 21.8 |
| 전라남도 | 비율 | 11.9 | 15.6 | 18.3 | 20.5 | 23.9 |
| 경상북도 | 비율 | 10.7 | 13.4 | 15.6 | 17.7 | 22.2 |
| 경상남도 | 비율 | 8.4 | 10.2 | 11.8 | 13.8 | 17.9 |
| 제주특별자치도 | 비율 | 8.0 | 10.0 | 12.2 | 13.8 | 16.0 |
df_=df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index().\
query('level_1=="비율"').set_index(('행정구역별','행정구역별')).iloc[:,1:].T
df_
# matplotlib로 그리려면 .T해줘야 함
# for wide form
| (행정구역별, 행정구역별) | 서울특별시 | 부산광역시 | 대구광역시 | 인천광역시 | 광주광역시 | 대전광역시 | 울산광역시 | 세종특별자치시 | 경기도 | 강원도 | 충청북도 | 충청남도 | 전라북도 | 전라남도 | 경상북도 | 경상남도 | 제주특별자치도 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2000 | 5.4 | 6.0 | 5.9 | 5.4 | 5.6 | 5.5 | 4.0 | - | 5.7 | 9.3 | 9.1 | 11.2 | 10.3 | 11.9 | 10.7 | 8.4 | 8.0 |
| 2005 | 7.2 | 8.3 | 7.8 | 6.9 | 7.1 | 6.9 | 5.3 | - | 7.1 | 12.1 | 11.3 | 13.3 | 12.9 | 15.6 | 13.4 | 10.2 | 10.0 |
| 2010 | 9.7 | 11.3 | 10.0 | 8.6 | 9.0 | 8.7 | 6.8 | - | 8.7 | 14.8 | 13.2 | 14.9 | 15.2 | 18.3 | 15.6 | 11.8 | 12.2 |
| 2015 | 12.6 | 14.6 | 12.7 | 10.7 | 11.3 | 10.9 | 8.8 | 10.6 | 10.5 | 16.9 | 14.8 | 16.4 | 17.8 | 20.5 | 17.7 | 13.8 | 13.8 |
| 2021. 06 | 16.4 | 19.8 | 17.0 | 14.4 | 14.5 | 14.8 | 13.1 | 10.0 | 13.5 | 21.2 | 18.4 | 19.5 | 21.8 | 23.9 | 22.2 | 17.9 | 16.0 |
df_.info()
<class 'pandas.core.frame.DataFrame'> Index: 5 entries, 2000 to 2021. 06 Data columns (total 17 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 서울특별시 5 non-null object 1 부산광역시 5 non-null object 2 대구광역시 5 non-null object 3 인천광역시 5 non-null object 4 광주광역시 5 non-null object 5 대전광역시 5 non-null object 6 울산광역시 5 non-null object 7 세종특별자치시 5 non-null object 8 경기도 5 non-null object 9 강원도 5 non-null object 10 충청북도 5 non-null object 11 충청남도 5 non-null object 12 전라북도 5 non-null object 13 전라남도 5 non-null object 14 경상북도 5 non-null object 15 경상남도 5 non-null object 16 제주특별자치도 5 non-null object dtypes: object(17) memory usage: 720.0+ bytes
- 세종시의 - 가 문제가 될듯 $\to$ 자료형도 이상함
- 데이터프레임의 모든 원소에 변환을 수행해야 한다. (applymap)
- 문자형을 숫자형으로 바꾸라
- 그런데 문자가 - 라면 None으로 바꿔라
df_2=df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index().\
query('level_1=="비율"').set_index(('행정구역별','행정구역별')).iloc[:,1:].T.\
applymap(lambda x: float(x) if x!='-' else None)
df_2
| (행정구역별, 행정구역별) | 서울특별시 | 부산광역시 | 대구광역시 | 인천광역시 | 광주광역시 | 대전광역시 | 울산광역시 | 세종특별자치시 | 경기도 | 강원도 | 충청북도 | 충청남도 | 전라북도 | 전라남도 | 경상북도 | 경상남도 | 제주특별자치도 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2000 | 5.4 | 6.0 | 5.9 | 5.4 | 5.6 | 5.5 | 4.0 | NaN | 5.7 | 9.3 | 9.1 | 11.2 | 10.3 | 11.9 | 10.7 | 8.4 | 8.0 |
| 2005 | 7.2 | 8.3 | 7.8 | 6.9 | 7.1 | 6.9 | 5.3 | NaN | 7.1 | 12.1 | 11.3 | 13.3 | 12.9 | 15.6 | 13.4 | 10.2 | 10.0 |
| 2010 | 9.7 | 11.3 | 10.0 | 8.6 | 9.0 | 8.7 | 6.8 | NaN | 8.7 | 14.8 | 13.2 | 14.9 | 15.2 | 18.3 | 15.6 | 11.8 | 12.2 |
| 2015 | 12.6 | 14.6 | 12.7 | 10.7 | 11.3 | 10.9 | 8.8 | 10.6 | 10.5 | 16.9 | 14.8 | 16.4 | 17.8 | 20.5 | 17.7 | 13.8 | 13.8 |
| 2021. 06 | 16.4 | 19.8 | 17.0 | 14.4 | 14.5 | 14.8 | 13.1 | 10.0 | 13.5 | 21.2 | 18.4 | 19.5 | 21.8 | 23.9 | 22.2 | 17.9 | 16.0 |
df_2.info()
<class 'pandas.core.frame.DataFrame'> Index: 5 entries, 2000 to 2021. 06 Data columns (total 17 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 서울특별시 5 non-null float64 1 부산광역시 5 non-null float64 2 대구광역시 5 non-null float64 3 인천광역시 5 non-null float64 4 광주광역시 5 non-null float64 5 대전광역시 5 non-null float64 6 울산광역시 5 non-null float64 7 세종특별자치시 2 non-null float64 8 경기도 5 non-null float64 9 강원도 5 non-null float64 10 충청북도 5 non-null float64 11 충청남도 5 non-null float64 12 전라북도 5 non-null float64 13 전라남도 5 non-null float64 14 경상북도 5 non-null float64 15 경상남도 5 non-null float64 16 제주특별자치도 5 non-null float64 dtypes: float64(17) memory usage: 720.0+ bytes
- 전에 존재했던 세종특별자치시의 3개의 - 값은 NaN값으로 들어갔고 자료형도 float형태로 바뀐 것을 알 수 있음
- 이제 그리자
import warnings
warnings.filterwarnings('ignore')
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().reset_index().\
query('level_1=="비율"').set_index(('행정구역별','행정구역별')).iloc[:,1:].T.\
applymap(lambda x: float(x) if x!='-' else None).\
plot.area(figsize=(10,10))
<AxesSubplot:>
- plotly 그리기 위해서우선 타이디한 자료를 만들자.
df
| 행정구역별 | 2021. 06 | 2015 | 2010 | 2005 | 2000 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 행정구역별 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | 비율 | 인구 | |
| 0 | 전국 | 16.7 | 8652198 | 13.1 | 6775101 | 10.9 | 5506352 | 8.9 | 4324524 | 7.0 | 3355614 |
| 1 | 서울특별시 | 16.4 | 1568769 | 12.6 | 1262436 | 9.7 | 1002770 | 7.2 | 731349 | 5.4 | 558566 |
| 2 | 부산광역시 | 19.8 | 666644 | 14.6 | 514630 | 11.3 | 401784 | 8.3 | 302784 | 6.0 | 229075 |
| 3 | 대구광역시 | 17.0 | 408235 | 12.7 | 316122 | 10.0 | 252084 | 7.8 | 195419 | 5.9 | 149045 |
| 4 | 인천광역시 | 14.4 | 422658 | 10.7 | 312905 | 8.6 | 237805 | 6.9 | 178602 | 5.4 | 138316 |
| 5 | 광주광역시 | 14.5 | 208879 | 11.3 | 166389 | 9.0 | 130457 | 7.1 | 99389 | 5.6 | 77325 |
| 6 | 대전광역시 | 14.8 | 215997 | 10.9 | 165528 | 8.7 | 130245 | 6.9 | 99811 | 5.5 | 75769 |
| 7 | 울산광역시 | 13.1 | 147811 | 8.8 | 103205 | 6.8 | 76800 | 5.3 | 57797 | 4.0 | 42119 |
| 8 | 세종특별자치시 | 10.0 | 36194 | 10.6 | 22399 | - | - | - | - | - | - |
| 9 | 경기도 | 13.5 | 1825846 | 10.5 | 1318882 | 8.7 | 1022456 | 7.1 | 755511 | 5.7 | 524807 |
| 10 | 강원도 | 21.2 | 325579 | 16.9 | 261671 | 14.8 | 226505 | 12.1 | 183471 | 9.3 | 143945 |
| 11 | 충청북도 | 18.4 | 294530 | 14.8 | 234813 | 13.2 | 204470 | 11.3 | 168670 | 9.1 | 136160 |
| 12 | 충청남도 | 19.5 | 412504 | 16.4 | 341214 | 14.9 | 308556 | 13.3 | 261800 | 11.2 | 215059 |
| 13 | 전라북도 | 21.8 | 391178 | 17.8 | 333524 | 15.2 | 284373 | 12.9 | 243721 | 10.3 | 205807 |
| 14 | 전라남도 | 23.9 | 440014 | 20.5 | 391837 | 18.3 | 350900 | 15.6 | 306439 | 11.9 | 254370 |
| 15 | 경상북도 | 22.2 | 585088 | 17.7 | 479634 | 15.6 | 418858 | 13.4 | 360068 | 10.7 | 300614 |
| 16 | 경상남도 | 17.9 | 594154 | 13.8 | 464019 | 11.8 | 388648 | 10.2 | 323898 | 8.4 | 261303 |
| 17 | 제주특별자치도 | 16.0 | 108118 | 13.8 | 85893 | 12.2 | 69641 | 10.0 | 55795 | 8.0 | 43334 |
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack()
| 2000 | 2005 | 2010 | 2015 | 2021. 06 | ||
|---|---|---|---|---|---|---|
| (행정구역별, 행정구역별) | ||||||
| 서울특별시 | 비율 | 5.4 | 7.2 | 9.7 | 12.6 | 16.4 |
| 인구 | 558566 | 731349 | 1002770 | 1262436.0 | 1568769.0 | |
| 부산광역시 | 비율 | 6.0 | 8.3 | 11.3 | 14.6 | 19.8 |
| 인구 | 229075 | 302784 | 401784 | 514630.0 | 666644.0 | |
| 대구광역시 | 비율 | 5.9 | 7.8 | 10.0 | 12.7 | 17.0 |
| 인구 | 149045 | 195419 | 252084 | 316122.0 | 408235.0 | |
| 인천광역시 | 비율 | 5.4 | 6.9 | 8.6 | 10.7 | 14.4 |
| 인구 | 138316 | 178602 | 237805 | 312905.0 | 422658.0 | |
| 광주광역시 | 비율 | 5.6 | 7.1 | 9.0 | 11.3 | 14.5 |
| 인구 | 77325 | 99389 | 130457 | 166389.0 | 208879.0 | |
| 대전광역시 | 비율 | 5.5 | 6.9 | 8.7 | 10.9 | 14.8 |
| 인구 | 75769 | 99811 | 130245 | 165528.0 | 215997.0 | |
| 울산광역시 | 비율 | 4.0 | 5.3 | 6.8 | 8.8 | 13.1 |
| 인구 | 42119 | 57797 | 76800 | 103205.0 | 147811.0 | |
| 세종특별자치시 | 비율 | - | - | - | 10.6 | 10.0 |
| 인구 | - | - | - | 22399.0 | 36194.0 | |
| 경기도 | 비율 | 5.7 | 7.1 | 8.7 | 10.5 | 13.5 |
| 인구 | 524807 | 755511 | 1022456 | 1318882.0 | 1825846.0 | |
| 강원도 | 비율 | 9.3 | 12.1 | 14.8 | 16.9 | 21.2 |
| 인구 | 143945 | 183471 | 226505 | 261671.0 | 325579.0 | |
| 충청북도 | 비율 | 9.1 | 11.3 | 13.2 | 14.8 | 18.4 |
| 인구 | 136160 | 168670 | 204470 | 234813.0 | 294530.0 | |
| 충청남도 | 비율 | 11.2 | 13.3 | 14.9 | 16.4 | 19.5 |
| 인구 | 215059 | 261800 | 308556 | 341214.0 | 412504.0 | |
| 전라북도 | 비율 | 10.3 | 12.9 | 15.2 | 17.8 | 21.8 |
| 인구 | 205807 | 243721 | 284373 | 333524.0 | 391178.0 | |
| 전라남도 | 비율 | 11.9 | 15.6 | 18.3 | 20.5 | 23.9 |
| 인구 | 254370 | 306439 | 350900 | 391837.0 | 440014.0 | |
| 경상북도 | 비율 | 10.7 | 13.4 | 15.6 | 17.7 | 22.2 |
| 인구 | 300614 | 360068 | 418858 | 479634.0 | 585088.0 | |
| 경상남도 | 비율 | 8.4 | 10.2 | 11.8 | 13.8 | 17.9 |
| 인구 | 261303 | 323898 | 388648 | 464019.0 | 594154.0 | |
| 제주특별자치도 | 비율 | 8.0 | 10.0 | 12.2 | 13.8 | 16.0 |
| 인구 | 43334 | 55795 | 69641 | 85893.0 | 108118.0 |
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().applymap(lambda x: float(x) if x!='-' else None).\
stack()
(행정구역별, 행정구역별)
서울특별시 비율 2000 5.4
2005 7.2
2010 9.7
2015 12.6
2021. 06 16.4
...
제주특별자치도 인구 2000 43334.0
2005 55795.0
2010 69641.0
2015 85893.0
2021. 06 108118.0
Length: 164, dtype: float64
df.iloc[1:].set_index(('행정구역별','행정구역별')).stack().applymap(lambda x: float(x) if x!='-' else None).\
stack().reset_index()
| (행정구역별, 행정구역별) | level_1 | level_2 | 0 | |
|---|---|---|---|---|
| 0 | 서울특별시 | 비율 | 2000 | 5.4 |
| 1 | 서울특별시 | 비율 | 2005 | 7.2 |
| 2 | 서울특별시 | 비율 | 2010 | 9.7 |
| 3 | 서울특별시 | 비율 | 2015 | 12.6 |
| 4 | 서울특별시 | 비율 | 2021. 06 | 16.4 |
| ... | ... | ... | ... | ... |
| 159 | 제주특별자치도 | 인구 | 2000 | 43334.0 |
| 160 | 제주특별자치도 | 인구 | 2005 | 55795.0 |
| 161 | 제주특별자치도 | 인구 | 2010 | 69641.0 |
| 162 | 제주특별자치도 | 인구 | 2015 | 85893.0 |
| 163 | 제주특별자치도 | 인구 | 2021. 06 | 108118.0 |
164 rows × 4 columns
_df = _
_df.columns = pd.Index(['city','type','year','value'])
_df
| city | type | year | value | |
|---|---|---|---|---|
| 0 | 서울특별시 | 비율 | 2000 | 5.4 |
| 1 | 서울특별시 | 비율 | 2005 | 7.2 |
| 2 | 서울특별시 | 비율 | 2010 | 9.7 |
| 3 | 서울특별시 | 비율 | 2015 | 12.6 |
| 4 | 서울특별시 | 비율 | 2021. 06 | 16.4 |
| ... | ... | ... | ... | ... |
| 159 | 제주특별자치도 | 인구 | 2000 | 43334.0 |
| 160 | 제주특별자치도 | 인구 | 2005 | 55795.0 |
| 161 | 제주특별자치도 | 인구 | 2010 | 69641.0 |
| 162 | 제주특별자치도 | 인구 | 2015 | 85893.0 |
| 163 | 제주특별자치도 | 인구 | 2021. 06 | 108118.0 |
164 rows × 4 columns
- 이제 그려보자.
# show(fig)
즉 와이드 폼(.T 활용)은 plot이용해서 그릴 때, 타이디한 롱폼은 backend를 plotly로 그릴 때
T 활용해서 타이디 데이터 만들 수도 있음