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})))

pie

예제1 (matplotlib)

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 Google 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 Google 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
Google 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)

boxplot

- plotly, matplotlib 백엔드 모두 지원

예제1(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 Google 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 Google 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:>

예제2 (plotly)

- 위와 동일한 그림을 plotly backend로도 그릴수 있음 (plotly가 조금 융통성이 있음)

# show(fig)

- 회사를 색깔별로 구분하여 범주를 만들고 싶다?

df.set_index('Date').diff().dropna()
Samsung Apple Huawei Xiaomi Oppo Mobicel Motorola LG Others Realme Google 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)

예제3 (plotly)

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은 위와 같은 형태를 그리는것 자체가 불가능

hist, kde, density

예제1 (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()

예제2 (plotly)

- 다시 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가 확실히 자료를 처리하기 편리함

area plot

- 주류플랏은 아님

예제1 (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 Google 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'>
  • 시간에 따른 점유을의 변화를 보기에 적절한것 같다.

예제2 (plotly)

- plotly를 쓰기 위해서 tidydata로 바꾸자

df
Date Samsung Apple Huawei Xiaomi Oppo Mobicel Motorola LG Others Realme Google 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)

예제3 (matplotlib)

  • 상당히 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:>

예제2 (plotly)

- 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 활용해서 타이디 데이터 만들 수도 있음