1. Matplotlib ์‹œ๊ฐํ™” ๊ธฐ์ดˆ

1.1 Matplotlib ๊ฐœ์š”

Matplotlib์€ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ์„ , ๋ง‰๋Œ€, ์›ํ˜• ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Pandas์˜ plot() ๋ฉ”์„œ๋“œ์™€๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค.

import pandas as pd
import matplotlib.pyplot as plt

1.2 ๊ธฐ๋ณธ ์„  ๊ทธ๋ž˜ํ”„ (Line Plot)

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ์‹œ๊ฐํ™” ํ˜•ํƒœ.
๋ฐ์ดํ„ฐ์˜ ์ถ”์„ธ(trend)๋ฅผ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.

x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]

plt.plot(x, y, color='royalblue', marker='o', linestyle='--')
plt.title('๊ธฐ๋ณธ ์„  ๊ทธ๋ž˜ํ”„ ์˜ˆ์‹œ')
plt.xlabel('X์ถ•')
plt.ylabel('Y์ถ•')
plt.grid(True)
plt.show()

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • color: ์„  ์ƒ‰์ƒ ์ง€์ • ('r', 'b', 'g', ํ˜น์€ 'hex ์ฝ”๋“œ')
  • marker: ์  ํ˜•ํƒœ ์ง€์ • ('o', '^', 's')
  • linestyle: ์„  ์Šคํƒ€์ผ ('-', '--', ':')
  • plt.grid(True): ๋ฐฐ๊ฒฝ ๊ฒฉ์ž ํ‘œ์‹œ

1.3 Pandas์™€์˜ ํ†ตํ•ฉ

Pandas DataFrame์—์„œ๋„ ์ง์ ‘ .plot()์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

df = pd.DataFrame({
    '์›”': [1, 2, 3, 4, 5],
    '๋งค์ถœ์•ก': [250, 310, 400, 390, 520]
})
df.plot(x='์›”', y='๋งค์ถœ์•ก', kind='line', color='green', marker='s', title='์›”๋ณ„ ๋งค์ถœ ์ถ”์„ธ')
plt.show()

Pandas์˜ .plot()์€ ๋‚ด๋ถ€์ ์œผ๋กœ Matplotlib์„ ํ˜ธ์ถœํ•œ๋‹ค.


2. ์‹ค๋ฌด ๋ฐ์ดํ„ฐ ํ™œ์šฉ โ€” ์•ผํ›„ ๊ธˆ์œต ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”

2.1 ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ

pandas_datareader๋กœ ์•ผํ›„ ๊ธˆ์œต ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

!pip install pandas_datareader
from pandas_datareader import data as pdr
import datetime

start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2024, 12, 31)
apple = pdr.get_data_yahoo('AAPL', start, end)
apple.head()

2.2 ์ข…๊ฐ€(Closing Price) ์‹œ๊ฐํ™”

plt.figure(figsize=(12, 6))
plt.plot(apple.index, apple['Close'], label='AAPL', color='navy')
plt.title('Apple ์ฃผ๊ฐ€ ์ถ”์„ธ (2020โ€“2024)')
plt.xlabel('๋‚ ์งœ')
plt.ylabel('์ฃผ๊ฐ€ ($)')
plt.legend()
plt.show()

Tip:

  • ๊ธˆ์œต ์‹œ๊ณ„์—ด ์‹œ๊ฐํ™”์—๋Š” rolling()์„ ์ด์šฉํ•œ ์ด๋™ํ‰๊ท ์„ (MA) ํ‘œ์‹œ๊ฐ€ ํšจ๊ณผ์ ์ด๋‹ค.
apple['MA30'] = apple['Close'].rolling(30).mean()
apple[['Close', 'MA30']].plot(figsize=(12,6), title='Apple ์ฃผ๊ฐ€ & 30์ผ ์ด๋™ํ‰๊ท ')

3. ๋‹ค์ค‘ ๊ทธ๋ž˜ํ”„์™€ Subplots

3.1 ๋‹ค์ค‘ ๊ทธ๋ž˜ํ”„ (Multiple Plots)

ํ•˜๋‚˜์˜ Figure์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

plt.figure(figsize=(10, 6))
plt.plot(apple['Close'], label='Close', color='blue')
plt.plot(apple['Open'], label='Open', color='orange')
plt.title('Open vs Close')
plt.legend()
plt.show()

3.2 Subplots (๋‹ค์ค‘ ์˜์—ญ ๊ทธ๋ž˜ํ”„)

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํ–‰ยท์—ด๋กœ ๋ฐฐ์น˜.

fig, axes = plt.subplots(2, 1, figsize=(10, 8))

axes[0].plot(apple['Close'], color='green')
axes[0].set_title('Close Price')

axes[1].plot(apple['Volume'], color='gray')
axes[1].set_title('Trading Volume')

plt.tight_layout()
plt.show()

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • plt.subplots(nrows, ncols) : ๊ทธ๋ž˜ํ”„ ๊ฒฉ์ž ์ƒ์„ฑ
  • axes[row][col] ์ ‘๊ทผ์œผ๋กœ ๊ฐœ๋ณ„ ์„ค์ •
  • plt.tight_layout() : ๊ฒน์นจ ๋ฐฉ์ง€

4. ์ฃผ์š” ์ฐจํŠธ ์ข…๋ฅ˜

4.1 ์‚ฐ์ ๋„ (Scatter Plot)

๋ณ€์ˆ˜ ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ํƒ์ƒ‰์— ์‚ฌ์šฉ.

plt.scatter(apple['Open'], apple['Close'], alpha=0.5, color='purple')
plt.title('Open vs Close Scatter Plot')
plt.xlabel('Open Price')
plt.ylabel('Close Price')
plt.show()

alpha๋กœ ํˆฌ๋ช…๋„ ์กฐ์ ˆ ๊ฐ€๋Šฅ โ€” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์œ ์šฉ.


4.2 ์›ํ˜• ๊ทธ๋ž˜ํ”„ (Pie Chart)

๋น„์œจ ์‹œ๊ฐํ™”์— ์œ ์šฉํ•˜๋‹ค.

labels = ['Apple', 'Microsoft', 'Google', 'Amazon']
sizes = [35, 30, 25, 10]

plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, colors=['#007AFF', '#FF9500', '#34C759', '#FF3B30'])
plt.title('Tech ๊ธฐ์—… ์‹œ์žฅ ์ ์œ ์œจ')
plt.show()

์ฃผ์š” ์˜ต์…˜

  • autopct: ํผ์„ผํŠธ ํ‘œ์‹œ ํฌ๋งท
  • startangle: ํšŒ์ „ ์‹œ์ž‘ ๊ฐ๋„

4.3 ํžˆ์Šคํ† ๊ทธ๋žจ (Histogram)

๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ์‹œ๊ฐํ™”.

import numpy as np
data = np.random.randn(1000)

plt.hist(data, bins=30, color='skyblue', edgecolor='black')
plt.title('๋ฐ์ดํ„ฐ ๋ถ„ํฌ ํžˆ์Šคํ† ๊ทธ๋žจ')
plt.xlabel('๊ฐ’')
plt.ylabel('๋นˆ๋„์ˆ˜')
plt.show()

ํ™œ์šฉ ์˜ˆ์‹œ:

  • ์—ฐ๋ น๋Œ€ ๋ถ„ํฌ
  • ๊ฐ€๊ฒฉ๋Œ€ ๋ถ„ํฌ
  • ์‹œํ—˜ ์ ์ˆ˜ ๋ถ„์„

5. Seaborn โ€” ๊ณ ๊ธ‰ ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

5.1 Seaborn ์†Œ๊ฐœ

Matplotlib ๊ธฐ๋ฐ˜์˜ ๊ณ ๊ธ‰ ํ†ต๊ณ„ ์‹œ๊ฐํ™” ํŒจํ‚ค์ง€๋กœ, ์Šคํƒ€์ผยทํŒ”๋ ˆํŠธยท๋ ˆ์ด์•„์›ƒ์ด ์ž๋™ ์ ์šฉ๋œ๋‹ค.

import seaborn as sns
sns.set_theme(style='whitegrid')

5.2 ์‚ฐ์ ๋„ & ์นด์šดํŠธํ”Œ๋กฏ

tips = sns.load_dataset('tips')

sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex', size='size', palette='coolwarm')
plt.title('์‹์‚ฌ ๊ธˆ์•ก vs ํŒ (์„ฑ๋ณ„/์ธ์›๋ณ„)')
plt.show()
  • hue: ์ƒ‰์ƒ ๊ตฌ๋ถ„ ๋ณ€์ˆ˜
  • size: ๋งˆ์ปค ํฌ๊ธฐ ๋ณ€์ˆ˜
  • palette: ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ('viridis', 'coolwarm', 'Set2' ๋“ฑ)

์นด์šดํŠธ ํ”Œ๋กฏ

sns.countplot(data=tips, x='day', hue='sex')
plt.title('์š”์ผ๋ณ„ ๋ฐฉ๋ฌธ์ž ์ˆ˜ (์„ฑ๋ณ„ ๊ตฌ๋ถ„)')
plt.show()

5.3 Pairplot (๋ณ€์ˆ˜ ๊ฐ„ ๊ด€๊ณ„ ํƒ์ƒ‰)

์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํ•œ ๋ฒˆ์— ์‹œ๊ฐํ™”.

sns.pairplot(tips, hue='sex', palette='husl')
plt.suptitle('Pairplot: ๋ณ€์ˆ˜ ๊ฐ„ ๊ด€๊ณ„ ์‹œ๊ฐํ™”', y=1.02)
plt.show()

โ†’ ๊ฐ ๋ณ€์ˆ˜ ์กฐํ•ฉ๋ณ„ ์‚ฐ์ ๋„ + ํžˆ์Šคํ† ๊ทธ๋žจ ์ž๋™ ์ƒ์„ฑ.


5.4 Heatmap (์ƒ๊ด€๊ณ„์ˆ˜ ์‹œ๊ฐํ™”)

corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap='YlGnBu', linewidths=0.5)
plt.title('๋ณ€์ˆ˜ ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ํžˆํŠธ๋งต')
plt.show()

ํ™œ์šฉ

  • ์—ฐ์†ํ˜• ๋ณ€์ˆ˜ ๊ฐ„ ์ƒ๊ด€๋„ ๋ถ„์„
  • ๋‹ค์ค‘ ํšŒ๊ท€ ์ „ ๋ณ€์ˆ˜ ์„ ํƒ ํŒ๋‹จ

6. ์Šคํƒ€์ผ๋ง๊ณผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

ํ•ญ๋ชฉMatplotlib ์ฝ”๋“œSeaborn ์ฝ”๋“œ
์ „์—ญ ์Šคํƒ€์ผ ๋ณ€๊ฒฝplt.style.use('seaborn-v0_8')sns.set_theme(style='whitegrid')
ํŒ”๋ ˆํŠธ ์„ค์ •plt.rcParams['axes.prop_cycle']sns.set_palette('Set2')
ํฌ๊ธฐ ๋ณ€๊ฒฝplt.figure(figsize=(10,6))sns.set(rc={'figure.figsize':(10,6)})
ํ•œ๊ธ€ ํฐํŠธ ์„ค์ •plt.rc('font', family='NanumGothic')๋™์ผ ์ ์šฉ ๊ฐ€๋Šฅ

6.1 Subplot ๋‚ด Seaborn ํ˜ผํ•ฉ ์‚ฌ์šฉ

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.histplot(tips['total_bill'], kde=True, ax=axes[0])
sns.boxplot(data=tips, x='day', y='tip', palette='pastel', ax=axes[1])
plt.tight_layout()
plt.show()

โžก ๋™์ผ Figure ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์‹œ๊ฐํ™” ํƒ€์ž… ํ˜ผํ•ฉ ๊ฐ€๋Šฅ.


7. ํ•™์Šต ์ •๋ฆฌ

๊ตฌ๋ถ„์ฃผ์š” ๊ธฐ๋Šฅํ•ต์‹ฌ ๋ฌธ๋ฒ•
Matplotlib๋ฒ”์šฉ ๊ทธ๋ž˜ํ”„ ์ œ์ž‘plt.plot, plt.scatter, plt.hist
Subplots์—ฌ๋Ÿฌ ๊ทธ๋ž˜ํ”„ ๋ฐฐ์น˜plt.subplots(nrows, ncols)
Pandas + Matplotlib.plot() ํ†ตํ•ฉdf.plot(kind='line')
Seaborn๊ณ ๊ธ‰ ์‹œ๊ฐํ™”sns.scatterplot, sns.heatmap, sns.pairplot
์Šคํƒ€์ผ๋ง์ƒ‰์ƒ, ํฐํŠธ, ํฌ๊ธฐ ์กฐ์ •plt.style.use, sns.set_theme

8. ์‹ค์ „ ์‘์šฉ ์˜ˆ์‹œ

  1. ๋งค์ถœ ํŠธ๋ Œ๋“œ ๋ถ„์„
    • rolling() ์ด๋™ํ‰๊ท  + Matplotlib line plot
    • ์›”๋ณ„ ๋งค์ถœ ์„ฑ์žฅ๋ฅ  ์‹œ๊ฐํ™”
  2. ๊ณ ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋ณ„ ํ–‰๋™ ๋น„๊ต
    • Seaborn countplot + boxplot ์กฐํ•ฉ
    • ์„ฑ๋ณ„/์š”์ผ๋ณ„ ํ‰๊ท  ์†Œ๋น„์•ก ์‹œ๊ฐํ™”
  3. ์ œํ’ˆ ๊ฐ€๊ฒฉ๋Œ€ ๋ถ„ํฌ์™€ ์ƒ๊ด€๊ด€๊ณ„ ํƒ์ƒ‰
    • sns.pairplot, sns.heatmap์œผ๋กœ ๋ณ€์ˆ˜ ๊ฐ„ ์—ฐ๊ด€์„ฑ ํ™•์ธ
  4. ๋Œ€์‹œ๋ณด๋“œ ์Šคํƒ€์ผ ๋ณด๊ณ ์„œ ๊ตฌ์„ฑ
    • Subplots ๊ธฐ๋ฐ˜์œผ๋กœ sales, volume, profit ์„ธ ๊ฐœ ์ฐจํŠธ๋ฅผ ํ•œ ํ™”๋ฉด์— ์ •๋ฆฌ
profile
okorion's Tech Study Blog.

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