๐Ÿ“Š ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ Python: ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”

Geondong Kimยท3์ผ ์ „
post-thumbnail

๐Ÿ“Š ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ฐ Matplotlib, Seaborn, Folium

1. ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” (Data Visualization)

1.1 ์ •์˜

๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ž€ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจํŠธ, ๊ทธ๋ž˜ํ”„, ์ง€๋„ ๋“ฑ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ๊ฐ„์˜ ๋‡Œ๋Š” ํ…์ŠคํŠธ๋ณด๋‹ค ์ด๋ฏธ์ง€๋ฅผ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์†์—์„œ ํŒจํ„ด, ์ถ”์„ธ, ์ด์ƒ์ง•ํ›„๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

1.2 ์ค‘์š”์„ฑ

  • ๋น ๋ฅธ ์˜์‚ฌ๊ฒฐ์ •: ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜์—ฌ ์‹ ์†ํ•œ ํŒ๋‹จ์„ ๋•์Šต๋‹ˆ๋‹ค.
  • ์Šคํ† ๋ฆฌํ…”๋ง: ๋ฐ์ดํ„ฐ ๋’ค์— ์ˆจ๊ฒจ์ง„ ์ด์•ผ๊ธฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํŒจํ„ด ๋ฐœ๊ฒฌ: ์—‘์…€ ํ‘œ๋งŒ์œผ๋กœ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ์ƒ๊ด€๊ด€๊ณ„๋‚˜ ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.3 ํ•„์š”์„ฑ

  • ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ์˜ ์ง๊ด€์  ์ดํ•ด.
  • ํŒจํ„ด, ํŠธ๋ Œ๋“œ, ์ด์ƒ์น˜(Outlier) ๋ฐœ๊ฒฌ.
  • ํšจ๊ณผ์ ์ธ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋„๊ตฌ (๋น„์ „๋ฌธ๊ฐ€๋„ ์ดํ•ด ๊ฐ€๋Šฅ).

1.4 ์‹œ๊ฐํ™” ์œ ํ˜• ๋ฐ ์„ ํƒ

๋ฐ์ดํ„ฐ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ฐจํŠธ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์„ ๋ชฉ์ ์ถ”์ฒœ ์ฐจํŠธ์„ค๋ช…
๋น„๊ต (Comparison)๋ง‰๋Œ€ ์ฐจํŠธ (Bar Chart)ํ•ญ๋ชฉ ๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ ๊ฐ€์žฅ ๋ณดํŽธ์ ์ž…๋‹ˆ๋‹ค.
์ถ”์„ธ (Trend)๋ผ์ธ ์ฐจํŠธ (Line Chart)์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๋น„์ค‘ (Composition)ํŒŒ์ด ์ฐจํŠธ (Pie Chart)์ „์ฒด์—์„œ ๊ฐ ๋ถ€๋ถ„์ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๊ด€๊ณ„ (Relationship)์‚ฐ์ ๋„ (Scatter Plot)๋‘ ๋ณ€์ˆ˜ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ถ„ํฌ (Distribution)ํžˆ์Šคํ† ๊ทธ๋žจ (Histogram), Box Plot๋ฐ์ดํ„ฐ์˜ ๋นˆ๋„ ๋ถ„ํฌ๋ฅผ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ง€๋ฆฌ ์ •๋ณด๋งต (Map)์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€๋„ ์œ„์— ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

2. Matplotlib (ํŒŒ์ด์ฌ ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

2.1 ๊ฐœ์š”

  • Matplotlib์€ Python์—์„œ ์ •์ , ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋Œ€ํ™”ํ˜• ์‹œ๊ฐํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ด๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • MATLAB์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, NumPy์™€ Pandas์™€ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ ๊ณผํ•™ ๋ถ„์•ผ์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2.2 Pyplot ๋ชจ๋“ˆ

  • matplotlib.pyplot์€ Matplotlib์„ ๋งˆ์น˜ MATLAB์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ plt๋ผ๋Š” ๋ณ„์นญ(alias)์œผ๋กœ import ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
import matplotlib.pyplot as plt
import numpy as np

2.3 ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• ๋ฐ ์ฃผ์š” ํ•จ์ˆ˜

1) ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ (plot)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์„  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
# x,y: array-like, float. 
# fmt: str, <color><marker><line> ์ˆœ์„œ ์ƒ๊ด€ ์—†์Œ. kwargs๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ 
# scalex, scaley: bool 
# data: indexable object. ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ, x,y์— label name์ด ์™€์•ผ ํ•จ.

matplotlib_output1.png

x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
plt.plot(x, y)
plt.show()

2) ์‚ฐ์ ๋„ ๊ทธ๋ฆฌ๊ธฐ (scatter)

x์™€ y์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์ ์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

matplotlib.pyplot.scatter(x, y, s=None, c=None, *, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None, colorizer=None, plotnonfinite=False, data=None, **kwargs)
# x, y: float, array-like (shape (n,))
# s: float, array-like. ์ œ๊ณฑ๊ฐ’ 
# c: array-like, list of color, color 
# marker: MarkerStyle, Default 'o' 
# cmap: str, Colormap 
# norm: str, Normalize 
# alpha: float[0, 1]. Transparency

matplotlib_output2.png

plt.scatter(x, y)
plt.show()

3) ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ (bar)

๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ง‰๋Œ€๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
# x: float, array-like 
# height: float, array-like 
# width: float, array-like 
# bottom: float, array-like. Default 0. 
# align: 'center', 'edge'. edge๋Š” bar์˜ ์™ผ์ชฝ์„ ๋งž์ถค. ์˜ค๋ฅธ์ชฝ์„ ๋งž์ถ”๋ ค๋ฉด width๋ฅผ ์Œ์ˆ˜๋กœ.

matplotlib_output3.png

categories = ['A', 'B', 'C']
values = [100, 200, 150]
plt.bar(categories, values)
plt.show()

4) ๊ทธ๋ž˜ํ”„ ๊พธ๋ฏธ๊ธฐ (Customization)

  • ์ œ๋ชฉ ๋ฐ ๋ ˆ์ด๋ธ”:
    plt.title("Graph Title")
    plt.xlabel("X-axis Label")
    plt.ylabel("Y-axis Label")
  • ์Šคํƒ€์ผ ๋ฐ ์ƒ‰์ƒ: ์„ ์˜ ์ข…๋ฅ˜(linestyle), ์ƒ‰์ƒ(color), ๋งˆ์ปค(marker) ๋“ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ”๋ก€ (Legend): plt.legend()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ผ๋ฒจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • Grid: plt.grid(True)๋กœ ๊ฒฉ์ž๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5) ์ข…ํ•ฉ ํ™œ์šฉ

matplotlib_output5.png

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)  # 0๋ถ€ํ„ฐ 2๊นŒ์ง€ 100๊ฐœ์˜ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆˆ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

plt.figure(figsize=(5, 2.7)) # ๊ทธ๋ž˜ํ”„ ํฌ๊ธฐ ์„ค์ • (์ธ์น˜ ๋‹จ์œ„)
plt.plot(x, x, label='linear')  # ์„ ํ˜• ๊ทธ๋ž˜ํ”„
plt.plot(x, x**2, label='quadratic') # 2์ฐจ ํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„
plt.xlabel('x label')      # x์ถ• ๋ผ๋ฒจ
plt.ylabel('y label')      # y์ถ• ๋ผ๋ฒจ
plt.title("Simple Plot")   # ๊ทธ๋ž˜ํ”„ ์ œ๋ชฉ
plt.legend()               # ๋ฒ”๋ก€ ํ‘œ์‹œ
plt.show()                 # ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅ

2.4 ์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ (Subplots)

ํ•˜๋‚˜์˜ ํ™”๋ฉด(Figure) ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„(Axes)๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

matplotlib_output6.png

# x ๋ฐ์ดํ„ฐ ์ƒ์„ฑ : 0๋ถ€ํ„ฐ 10๊นŒ์ง€ 100๊ฐœ์˜ ์ 
x = np.linspace(0, 10, 100)

# 2ํ–‰ 1์—ด์˜ ๊ตฌ์กฐ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„, ์ถ•(frame) ์—†์• ๊ธฐ
# OO-style๋กœ Axes(ax1, ax2)๋ฅผ ์ƒ์„ฑ
# OO-style: Figure์™€ Axes๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ method๋ฅผ ํ˜ธ์ถœ
ax1 = plt.subplot(2, 1, 1, frameon=False)
plt.plot(x, x, label='linear')  # ์„ ํ˜• ๊ทธ๋ž˜ํ”„

# 2ํ–‰ 1์—ด์˜ ๊ตฌ์กฐ ์ค‘ ๋‘ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„, ์ถ•(frame) ๋ณด์ด๊ธฐ
ax2 = plt.subplot(2, 1, 2, frameon=True)
plt.plot(x, [i**2 for i in x], label='quadratic') # 2์ฐจ ํ•จ์ˆ˜ ๊ทธ๋ž˜ํ”„

plt.show()

3. Seaborn: ํ†ต๊ณ„์  ์‹œ๊ฐํ™”์˜ ๊ฐ•์ž

Matplotlib์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ์„ธ๋ จ๋œ ์Šคํƒ€์ผ๊ณผ ํ†ต๊ณ„์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ณ ์ˆ˜์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Pandas DataFrame๊ณผ ํ˜ธํ™˜์„ฑ์ด ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

3.1 ์ฃผ์š” ํŠน์ง•

  • ์„ธ๋ จ๋œ ์Šคํƒ€์ผ: ๊ธฐ๋ณธ ํ…Œ๋งˆ๊ฐ€ ์˜ˆ์˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ํ†ต๊ณ„ ๊ธฐ๋Šฅ: ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ, ํšŒ๊ท€์„  ๋“ฑ์„ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ค๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ฐจํŠธ: relplot (๊ด€๊ณ„), displot (๋ถ„ํฌ), catplot (๋ฒ”์ฃผํ˜•) ๋“ฑ ๋ชฉ์ ์— ๋งž๋Š” ํ•จ์ˆ˜ ์ œ๊ณต.

3.2 ์‹ค์Šต ์ฝ”๋“œ ์„ค๋ช…

1) ๊ธฐ๋ณธ ์˜ˆ์ œ (Relational Plot)

ํŒ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๊ธˆ์•ก๊ณผ ํŒ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

seaborn_output1.png

import seaborn as sns

# ๊ธฐ๋ณธ ํ…Œ๋งˆ ์ ์šฉ
sns.set_theme()

# ์˜ˆ์ œ ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ (ํŒ ๋ฐ์ดํ„ฐ)
tips = sns.load_dataset("tips")

# ๊ด€๊ณ„ํ˜• ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ (Relational Plot)
sns.relplot(
    data=tips,
    x="total_bill", y="tip",   # x์ถ•: ์ด ๊ธˆ์•ก, y์ถ•: ํŒ
    col="time",                # ์‹œ๊ฐ„๋Œ€(์ ์‹ฌ/์ €๋…)๋ณ„๋กœ ์ปฌ๋Ÿผ ๋ถ„๋ฆฌ
    hue="smoker",              # ํก์—ฐ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ƒ‰์ƒ ๋‹ค๋ฅด๊ฒŒ
    style="smoker",            # ํก์—ฐ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋งˆ์ปค ๋ชจ์–‘ ๋‹ค๋ฅด๊ฒŒ
    size="size",               # ์ธ์›์ˆ˜์— ๋”ฐ๋ผ ์  ํฌ๊ธฐ ๋‹ค๋ฅด๊ฒŒ
)

2) Violin Plot (๋ถ„ํฌ ์‹œ๊ฐํ™”)

Box Plot๊ณผ KDE(๋ฐ€๋„) ๊ทธ๋ž˜ํ”„๋ฅผ ํ•ฉ์นœ ํ˜•ํƒœ๋กœ, ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๋ฅผ ํ’๋ถ€ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

seaborn_output2.png

# ์š”์ผ(day)๋ณ„ ์ „์ฒด ๊ธˆ์•ก(total_bill) ๋ถ„ํฌ๋ฅผ ๋ฐ”์ด์˜ฌ๋ฆฐ ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”
sns.violinplot(
    data=tips,
    x="day", y="total_bill",
    hue="smoker",        # ํก์—ฐ ์—ฌ๋ถ€๋กœ ์ชผ๊ฐœ์„œ ๋น„๊ต
    split=True,          # ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ๋ฐ˜์œผ๋กœ ๊ฐˆ๋ผ ์–‘์ชฝ์— ํ‘œ์‹œ
    inner="quart",       # ๋‚ด๋ถ€์— ์‚ฌ๋ถ„์œ„์ˆ˜ ํ‘œ์‹œ
)

3.3 Seaborn ํ•จ์ˆ˜ ๋ถ„๋ฅ˜

  • Figure Level: relplot, displot, catplot (์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌ)
  • Axes Level: scatterplot, lineplot, histplot, barplot, boxplot ๋“ฑ (๊ฐœ๋ณ„ ๊ทธ๋ž˜ํ”„)

4. Folium: ์ง€๋ฆฌ ์ •๋ณด ์‹œ๊ฐํ™” (์ง€๋„)

Python ๋ฐ์ดํ„ฐ๋ฅผ Leaflet.js ๊ธฐ๋ฐ˜์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ง€๋„๋กœ ์‹œ๊ฐํ™”ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

4.1 ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

ํ™”๋ฉด ์บก์ฒ˜ 2026-01-14 010420.jpg

import folium

# ์ง€๋„ ์ƒ์„ฑ (์œ„๋„, ๊ฒฝ๋„ ์ค‘์‹ฌ)
m = folium.Map(location=[37.5665, 126.9780], zoom_start=16)

# ๋งˆ์ปค ์ถ”๊ฐ€
folium.Marker(
    [37.5665, 126.9780],
    popup='Seoul City Hall', # ํด๋ฆญ ์‹œ ๋‚˜์˜ค๋Š” ํŒ์—…
    tooltip='Click me!'      # ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ์‹œ ๋‚˜์˜ค๋Š” ํˆดํŒ
).add_to(m)

# ์ง€๋„ ์ถœ๋ ฅ (Jupyter Notebook ํ™˜๊ฒฝ)
m

4.2 ๋„ํ˜• ๊ทธ๋ฆฌ๊ธฐ (CircleMarker vs Circle)

  • CircleMarker: ์คŒ ๋ ˆ๋ฒจ๊ณผ ์ƒ๊ด€์—†์ด ํ™”๋ฉด์ƒ ํฌ๊ธฐ(Pixel)๊ฐ€ ๊ณ ์ •๋จ.
  • Circle: ์ง€๋„์ƒ์˜ ์‹ค์ œ ๋ฐ˜๊ฒฝ(Meter)์„ ๊ฐ€์ง (์คŒ์ธํ•˜๋ฉด ์ปค์ง).

ํ™”๋ฉด ์บก์ฒ˜ 2026-01-14 010258.jpg

import folium

m = folium.Map(location=[37.5105, 127.0150], zoom_start=14)

# ํ™”๋ฉด์ƒ ํฌ๊ธฐ ๊ณ ์ • (50 ํ”ฝ์…€)
folium.CircleMarker(
    location=[37.5, 127.0],
    radius=50,
    color="blue",
    fill=True
).add_to(m)

# ์‹ค์ œ ์ง€๋ฆฌ์  ๋ฐ˜๊ฒฝ ๊ณ ์ • (1000 ๋ฏธํ„ฐ = 1km)
folium.Circle(
    location=[37.52, 127.02],
    radius=1000,
    color="red",
    fill=True
).add_to(m)

m

4.3 ๋“ฑ์น˜์„ ๋„ (Choropleth Map)

์ง€์—ญ๋ณ„ ํ†ต๊ณ„์น˜(์˜ˆ: ์ธ๊ตฌ ๋ฐ€๋„, ์‹ค์—…๋ฅ )๋ฅผ ์ƒ‰์ƒ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ง€๋„์ž…๋‹ˆ๋‹ค. GeoJSON ๋ฐ์ดํ„ฐ(์ง€๋„ ๊ฒฝ๊ณ„)์™€ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ(CSV ๋“ฑ)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฉด ์บก์ฒ˜ 2026-01-14 010315.jpg

import json
import requests
import folium

df = pd.read_csv('data/code_bas.csv')

r = requests.get('https://raw.githubusercontent.com/southkorea/seoul-maps/master/kostat/2013/json/seoul_municipalities_geo_simple.json')
c = r.content
seoul_geo = json.loads(c)

m = folium.Map(
    location=[37.559819, 126.963895],
    zoom_start=11, 
)

folium.GeoJson(
    seoul_geo,
    name='์ง€์—ญ๊ตฌ'
).add_to(m)

m

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ (References)

๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ด๋ก 

๋„๊ตฌ ์‚ฌ์šฉ๋ฒ•

0๊ฐœ์˜ ๋Œ“๊ธ€