๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/58
[์๊ฐํ ๋ถ์ ํ๋ก์ ํธ] 2-2 ์งํ์ฒ ์น๊ฐ์๊ฐ ๋ง์ ๋ ?
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/57 https://silvercoding.tistory.com/56 https://silvercoding.tistory.com/55 https://silvercoding.tistory.com/54 https://silvercoding...
silvercoding.tistory.com
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ & ์ดํด๋ณด๊ธฐ
import pandas as pd
raw = pd.read_excel('./data/subway_raw.xlsx')
2-1 ํฌ์คํ ์์ ํฉ๋ณํด ๋์ 2019๋ 1์ - 6์ ์งํ์ฒ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค.
raw.info()
์ด 99342 ๊ฐ์ row๊ฐ ์กด์ฌํ๊ณ , null ๊ฐ์ด ์๋ ๊ฒ์ ํ์ธํ์๋ค.
์ด๋ ์ญ์์ , ์ธ์ ์งํ์ฒ ์ ๊ฐ์ฅ ๋ง์ด ํ๊น ?
1. ์น๊ฐ์ด ๊ฐ์ฅ ๋ง์ด ํ๋ ์ญ
data_station = raw.pivot_table(index = '์ญ๋ช
', values = '์น์ฐจ์ด์น๊ฐ์', aggfunc='sum')
data_station = data_station.sort_values(by = '์น์ฐจ์ด์น๊ฐ์', ascending = False)
data_station.head(10) # ์น์ฐจ์น๊ฐ์๊ฐ ๊ฐ์ฅ ๋ง์ ์ญ ์์ 10๊ฐ
์ญ๋ณ๋ก ์น์ฐจ์ด์น๊ฐ์๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ ํผ๋ฒํ ์ด๋ธ์ด๋ค. ์์ 10๊ฐ ์ญ์ ์ถ๋ ฅํ์๊ณ , 2019๋ ์๋ฐ๊ธฐ ๊ฐ์ฅ ๋ง์ ์น๊ฐ์๊ฐ ์์๋ ์ญ์ ์ ์ค์ญ์์ ์ ์ ์๋ค.
2. ์๊ฐํ : ๋ ธ์ ๋ณ (1-9ํธ์ ) ์ญ๋ณ/์์ผ๋ณ ์น๊ฐ์ ๋น๊ตํด ๋ณด๊ธฐ
* ํํธ๋งต
- sns.heatmap(data, annot = True, fmt = '.0f', cmap = "RdBu_r")
- annot : True ์ผ๊ฒฝ์ฐ ๊ฐ์ ๊ทธ๋ํ์ ํ์
- fmt : ๊ฐ ํ์ ํํ.
- ex) 'f' : ์ค์๋ก ํํ(default ๋ก ๊ฐ์ด ์๋ ์์ ์๋ฆฌ๊น์ง ํ์๋จ)
- ex) '.0f' : ์ค์๋ก ํํํด๋ฌ๋ผ (์์ 0๋ฒ์งธ ์๋ฆฌ๊น์ง๋ง == ์ ์์๋ฆฌ๋ง )
- ex) '.1f' : ์ค์๋ก ํํํด๋ฌ๋ผ (์์ 1๋ฒ์งธ ์๋ฆฌ๊น์ง๋ง)
- ex) .1% ๋ ํผ์ผํธ(์์ ์ฒซ๋ฒ์งธ ์๋ฆฌ๊น์ง ํ์)
- cmap : ์์ ์ฐจํธ. _r ์ผ๋ก ๋๋๋ ์ฐจํธ๋ ์์ ๋ฐฉํฅ ๋ฐ๋๋ก ๋์ด์๋ ๋ฒ์ ์(์๋ ์ปฌ๋ฌ ๋ฆฌ์คํธ ์ฐธ๊ณ )
* cmap ์ข ๋ฅ
Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, icefire, icefire_r, inferno, inferno_r, jet, jet_r, magma, magma_r, mako, mako_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, rocket, rocket_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, twilight, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, vlag, vlag_r, winter, winter_r
- 1ํธ์ ๋ง ์๊ฐํ ํด๋ณด๊ธฐ
line = '1ํธ์ '
data_line = raw[raw['๋
ธ์ ๋ช
'] == line]
# ํผ๋ฒํ
์ด๋ธ: ๋
ธ์ ์ ์ญ ์์์ ๋ง์ถฐ ์ ๋ฆฌํ๊ธฐ ์ํด ์ญID๋ ์ธ๋ฑ์ค์ ํฌํจ
df_pivot = data_line.pivot_table(index = ['์ญID', '์ญ๋ช
'], columns = '์์ผ', values = '์น์ฐจ์ด์น๊ฐ์',aggfunc = 'sum')
df_pivot = df_pivot[['์','ํ','์','๋ชฉ','๊ธ','ํ ','์ผ']] # ์ปฌ๋ผ ์์๋ฅผ ์์ผ์ ๋ง๊ฒ ์ ๋ฆฌ
df_pivot = df_pivot / 10000 # ๋ง๋ช
๋จ์๋ก ํํํ๊ธฐ ์ํด ๋ฐ์ดํฐํ๋ ์ ์ ์ฒด๋ฅผ 1๋ง์ผ๋ก ๋๋๊ธฐ
df_pivot
์ญ๋ณ ์์ผ๋ณ ์น์ฐจ์ด๊ฐ์๋ฅผ ์ง๊ณํ ํผ๋ฒํ ์ด๋ธ์ด๋ค. ์์ผ์ด ๋ค์ฃฝ๋ฐ์ฃฝ ๋์ค๊ธฐ ๋๋ฌธ์ ๋ค์ ์ ํํ์ฌ ์์๋๋ก ์ ๋ฆฌํด ์ค๋ค.
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import font_manager, rc
import platform
# ํ๊ธ ํฐํธ ์ฌ์ฉ
if platform.system() == 'Windows':
path = 'c:/Windows/Fonts/malgun.ttf'
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
elif platform.system() == 'Darwin':
rc('font', family='AppleGothic')
fig, ax = plt.subplots( figsize=(6,5) ) # ๊ทธ๋ํ ์ฌ์ด์ฆ ์ง์
plt.title(f"{line} ์ญ๋ณ/์์ผ๋ณ ์น๊ฐ์", fontsize = 20) # for title
sns.heatmap(df_pivot, cmap = "Reds",
annot = True, fmt = '.0f')
1ํธ์ ์ ์ญ๋ณ ์์ผ๋ณ ์น๊ฐ์ ํํธ๋งต๋๋ค. ์์ธ์ญ๊ณผ ์ข ๊ฐ์ญ์ ์น๊ฐ์๊ฐ ๊ฐ์ฅ ๋ง์๋ณด์ด๊ณ , ๊ทธ์ค์์๋ ์์ธ์ญ์ ๊ธ์์ผ์ ์น๊ฐ์๊ฐ ๊ฐ์ฅ ๋ง์ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ๋ ธ์ ์ ์๊ฐํํ์ฌ ๋น๊ต ํด ๋ณด์.
- 1ํธ์ ~9ํธ์ ์๊ฐํ ํ์ฌ ๋น๊ต ํด๋ณด๊ธฐ
raw['๋
ธ์ ๋ช
'].unique()
์ด๋ ๊ฒ ๋ง์ ๋ ธ์ ์ด ์๋๋ฐ , ๋ณธ ํฌ์คํ ์์๋ 1ํธ์ ~ 9ํธ์ ๋ง์ ์๊ฐํ ํ๋ค.
line_seoul_list = [ ]
for line in raw['๋
ธ์ ๋ช
'].unique():
if line[1:] == 'ํธ์ ': # xํธ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ํ.
line_seoul_list.append(line)
line_seoul_list
for line in sorted(line_seoul_list):
# ๋ฐ์ดํฐ ์ ๋ฆฌํ๊ธฐ
data_line = raw[raw['๋
ธ์ ๋ช
'] == line]
df_pivot = data_line.pivot_table(index = ['์ญID', '์ญ๋ช
'], columns = '์์ผ', values = '์น์ฐจ์ด์น๊ฐ์',aggfunc = 'sum')
df_pivot = df_pivot[['์','ํ','์','๋ชฉ','๊ธ','ํ ','์ผ']]
df_pivot = df_pivot / 10000 # ๋ง๋ช
๋จ์๋ก ์์
# ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
fig, ax = plt.subplots( figsize=(6,len(df_pivot)/3 ) ) # ๊ทธ๋ํ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ์ฌ, ์ญ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ ์ธ๋ก๋ฅผ ๊ธธ๊ฒ ํํ
plt.title(f"{line} ์ญ๋ณ/์์ผ๋ณ ์น๊ฐ์", fontsize = 20) # for title
sns.heatmap(df_pivot, cmap = "Reds",
annot = True, fmt = '.0f')
์งํ ๋นจ๊ฐ์์ผ ์๋ก ์น๊ฐ์๊ฐ ๋ง์ ๊ฒ์ ์๋ฏธํ๋ค. ์น๊ฐ์๊ฐ ๋ง์ ์ญ์ ๋ชจ๋ ์์ผ์ด ๋์ฒด์ ์ผ๋ก ์์ด ์งํ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด์ ํฌ์คํ ์์ ์ ์ฒด์ ์ผ๋ก ๊ธ์์ผ์ ์น๊ฐ์๊ฐ ๊ฐ์ฅ ๋ง๊ณ , ์ฃผ๋ง์ด ๋๋ฉด ์น๊ฐ์๊ฐ ๋จ์ด์ง๋ ๊ฒฝํฅ์ด ์์๋๋ฐ , ์ญ ๋ณ๋ก ๋ณด๋ ์ฃผ๋ง์ด ๋ ๋ง์ ์ญ๋ ๋ฐ๊ฒฌํ ์ ์์๋ค. ( ex, ์ดํ์, ๊ณ ์ํฐ๋ฏธ๋, ํ๋์ ๊ตฌ )