기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[matplotlib] plot()

plot() 함수

plt.plot(x, y) 함수에 x와 y 데이터를 입력하여 플롯을 작성합니다. 이 경우 y 값만을 제공하는 경우 y의 인덱스를 x값으로 인식합니다. 또한 함수에 의한 결과 역시 좌표의 값이 됩니다.

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
import yfinance as yf
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.rcParams['font.family'] ='NanumGothic'
plt.rcParams['axes.unicode_minus'] =False
import seaborn as sns

matplotlib하에서 작성된 플롯이지만 seaborn에서 제공하는 플롯의 스타일을 사용할 수 있습니다. 위 코드 sns.set_style() 함수에 의해 이루어집니다.

np.random.RandomState(3)
x=np.arange(20)
y=np.random.standard_normal(20)
plt.figure(figsize=(4,3))
plt.plot(x,y)
plt.show()

다음 코드의 plt.subplots(rows, columns, figsize, gridspec_kw, …)는 그림을 작성하는 프레임을 여러개의 하위그룹으로 구분하기 위한 함수입니다. 이 함수는 다양한 매개변수를 가질 수 있습니다.

  • rows, columns는 전체 그림 프레임을 분리하기 위한 행과 열수를 지정, 다음 코드는 1행 2열로 2개의 하위 그림을 작성
    • 전체 프레임의 이름 fig, 두 개의 하위 프레임은 각각 ax1, ax2로 지정
    • 하위 그림 프레임은 인덱스를 사용하여 지정할 수도 있음
      행 또는 열이 1개인 경우는 벡터로 고려되므로 인덱스는 [0], [1] 과 같이 1개로 표시
      그러나 하위 프레임이 [2,2]와 같이 행렬이라면 인덱스[0,0]과 같이 행과 열 인덱스를 모두 지정해야함
  • figsize=(너비, 높이): 전체 그림 프레임의 크기를 지정
  • gridspec_kw:각 그림의 너비의 비율(width_ratios), 높이의 비율(height_ratios)를 지정
  • 하위 프레임의 그래프를 꾸미기 위한 여러 함수는 set_함수()와 같이 함수명이 수정됨
    이 함수들을 생성된 하위 프레임(객체)에서 작동하는 메서드 입니다.
np.random.RandomState(2)
y1=np.random.standard_normal(20)
fig, (ax1, ax2)=plt.subplots(1, 2, figsize=(7,3), gridspec_kw=dict(width_ratios=[3,3])) #(1)
ax1.plot(y1)
ax2.plot(y1.cumsum())
plt.show()

x와 y축은 plt.axis() 함수로 조절할 수 있습니다. 다음의 plt.axis("equal")은 두 축의 scale을 같게 하기 위한 것입니다.

plt.axis() 함수에 전달할 수 있는 인수들을 다음 표와 같습니다.

plt.axis()의 매개변수
매개변수 설명
- 각 축은 데이터의 극값에 따라 자동으로 조정
off 축제거
equal x,y 축 스케일을 동일하게 작성
scaled 두 축의 스케일을 동일한 상태 x, y 축을 각 값의 범위 내에서 작성(그림 상자의 크기를 조정)
tight 각 축의 최소, 최대를 한계값으로 축의 범위를 설정
image 각 축의 최소, 최대를 한계값으로 축의 범위를 설정하고 두 축의 스케일을 동일하게 작성
[xmin, xmax,
ymin, ymax]
각 축의 최소, 최대를 한계값으로 축의 범위를 설정하고 두 축의 스케일을 동일하게 작성
plt.xlim(xmin, xmax), plt.ylim(ymin,ymax)와 같음, 이 함수는 각 축의 범위를 인위적으로 지정
csum=np.cumsum(y1)
arg=["off","equal", "scaled","tight", "image", [0, len(csum), csum.min(), csum.max()]]
plt.subplots_adjust(wspace=0.2, hspace=0.5)
for i in range(len(arg)):
    plt.subplot(3,2,i+1)
    plt.plot(csum)
    plt.axis(arg[i])
    if i != 5:
        plt.title(f"axis:{arg[i]}")
    else:
        plt.title("min & max")
plt.show()
plt.figure(figsize=(4,3))
plt.plot(csum)
plt.axis([0, 15, csum.min(), csum.max()])
plt.show()

다음 함수들로 플롯의 정보를 전달할 수 있습니다.

  • xlabel(), ylabel() 함수를 사용하여 x, y 축이름을 지정할 수 있습니다.
    • plt.xlabel(이름, loc="left/center/right", color)
    • plt.ylabel(이름, loc="bottom/center/upper", rotation, color): 이름은 축과 평행하게 표시가 기본 즉, y축 이름을 수직으로 표시 되므로 수평으로 전환을 위한 회전은 인수 rotation=horizontal 적용
  • title() 함수로 그림의 제목을 지정할 수 있습니다.

위 그림들과 같이 plot() 함수는 연속적인 선을 작성합니다. 이산 데이터가 입력되는 경우도 이러한 결과는 마찬가지 입니다. 그러나 함수의 스타일 옵션(인수)의 선택에 따라 산점도를 동시에 나타낼 수 있습니다. 또한 인수 color를 사용하여 선이나 점의 색을 지정할 수 있습니다.

매개변수 color
character Color
b Blue
g Green
r Red
c Cyan
m Magenta
y Yellow
k Black
w White
매개변수 style
charactersymbol
- Solid line style
-- Dashed line style
-. Dash-dot line style
:Dotted line style
. Point marker
, Pixel marker
oCircle marker
v Triangle_down marker
^ Triangle_up marker
< Triangle_left marker
> Triangle_right marker
1 Tri_down marker
2 Tri_up marker
3 Tri_left marker
4 Tri_right marker
s Square marker
p Pentagon marker
* Star marker
h Hexagon1 marker
H Hexagon2 marker
+ Plus marker
x X marker
D Diamond marker
d Thin diamond marker
| Vline marker
_ Hline marker

다음은 코스피 주가의 일일 자료에 대해 플롯을 작성한 것입니다.

st=pd.Timestamp(2024, 8, 17)
et=pd.Timestamp(2024, 10, 17)
kos=yf.download("^KS11",st, et)
kos=kos.drop('Adj Close', axis=1)
kos.head(3)
Open High Low Close Volume
Date
2024-08-19 2697.969971 2699.840088 2664.280029 2674.360107 395600
2024-08-20 2699.739990 2706.050049 2686.060059 2696.629883 484200
2024-08-21 2687.199951 2704.979980 2684.610107 2701.129883 417300
scaler=StandardScaler().fit(kos)
kos1=scaler.transform(kos)
kos1df=pd.DataFrame(kos1)
kos1df.columns=kos.columns
kos1df.index=kos.index
kos1df.head(3)
Open High Low Close Volume
Date
2024-08-19 1.276833 1.155869 1.010041 0.965561 0.275897
2024-08-20 1.307979 1.272339 1.390104 1.369090 1.433808
2024-08-21 1.087325 1.252269 1.364803 1.450630 0.559494
plt.figure(figsize=(4,3))
plt.plot(kos1df.Close, "b", lw=1.5, ls="dashed", label="Close")
plt.plot(kos1df.Close, 'ro')
plt.xticks(rotation=45)
plt.xlabel("Time(2014년)")
plt.ylabel("Price")
plt.legend(loc="best")
plt.axis("tight")
plt.title("kospi 종가")
plt.show()

위 그래프는 각 축의 x 축의 각 틱은 데이터 kos1df의 인덱스 일부를 분취하여 나타낸 것입니다. 이것은 모든 인덱스를 표시하기 어려운 경우 자동적으로 이루어집니다. 이 인덱스의 표시 방향을 변경하기 위해 xticks()의 인수인 rotation을 조정한 것입니다.

  • plt.xticks(target, label, rotation, …) 또는 plt.yticks()
    • target(원래의 ticks의 표현)을 label(지정한 tick의 표현)으로 교체할 수 있음
    • rotation=int: 지정한 각도
    • 이 함수의 인수들은 모두 선택사항입니다.

다음 코드는 xticks()의 인수 target으로 데이터의 인덱스에서 7개를 선택하여 특정한 형식으로 변경한 label을 생성한 것입니다.

date=pd.date_range(start=kos1df.index[0], end=kos1df.index[-1], inclusive='both', periods=7)
date1=date.strftime("%m/%d")
date[-1], date1[-1]
(Timestamp('2024-10-16 00:00:00'), '10/16')

범례(legend)를 나타내기 위해 함수 legend()를 적용하였으며 이 함수는 범례의 위치를 지정하기 위한 인수 loc를 가집니다. 범례에 입력될 내용은 각 선이나 점등을 작성하기 위한 함수내에 label이란 인수로 지정합니다.

loc의 속성값 loc의 인수로 정수값 대신 설명을 입력해도 됨
loc의 인수설명
Default Upper right
0 Best possible
1 Upper right
2 Upper left
3 Lower left
4 Lower right
5 Right
6 Center left
7 Center right
8 Lower center
9 Upper center
10 Center
loc=(x, y): x,y 축의 크기를 각각 1로 설정하고 각 위치를 입력

또한 이 함수의 인수인 frameon은 범례의 외부선의 유무에 관계된 것은 기본값은 frameon=True입니다.

plt.figure(figsize=(4,3))
plt.plot(kos1df.Close, "b", lw=1.5, ls="dashed", label="Close")
plt.plot(kos1df.Close, 'ro')
plt.xticks(date, date1)
plt.xlabel("Time( 2024년)")
plt.ylabel("Price")
plt.legend(loc="best", frameon=False)
plt.axis("tight")
plt.title("kospi 종가")
plt.show()

한 플롯에 그려진 선의 수는 관계된 함수들의 수와 같습니다.

plt.figure(figsize=(7,3))
plt.plot(kos1df.Close, 'b', lw=1.5, label="종가")
plt.plot(kos1df.Volume,'r', ls="dashed",  label="거래량")
plt.xticks(date, date1)
plt.xlabel("Time( 2024년)")
plt.ylabel("Price, Volume")
plt.legend(loc="best", frameon=False)
plt.axis("tight")
plt.title("kospi 종가와 거래량")
plt.show()

여러개의 그래프를 작성할 경우 각각의 scale 차이로 축을 별도로 작성해야 되는 경우 또는 여러개의 플롯을 작성할 경우 plt.subplots(행의 갯수, 열의 갯수) 함수를 사용합니다.

다음은 위 데이터 중 kos의 Close와 Volume을 작성합니다. 표준화 전의 이 두 변수의 scale에 차이를 보이므로 왼쪽 y축은 Close, 오른쪽은 Volume을 지시하도록 생성합니다.

%matplotlib inline
fig, ax1=plt.subplots(1,1, figsize=(6,3))
plt.plot(kos.index, kos.Close,  "b", label="Close")
plt.xticks(date, date1)
plt.xlabel("Time(2024 년)")
plt.ylabel("종가")
plt.legend(loc=(0.5, 0.9), frameon=False)
ax2=ax1.twinx()
plt.plot(kos.Volume, "r", ls="dashed", label="Volume")
plt.legend(loc=(0.5, 0.8), frameon=False)
plt.show()

위 그림의 두 y 축은 x 축을 공유합니다. 이 경우 .twinx() 메서드를 사용합니다. 위 코드에 대한 설명은 다음과 같습니다.

  • fig, ax1=plt.subplots(1,1): fig라는 프레임에 1행 1열에 위치하는 1개의 그래프 ax를 위한 프레임을 생성
  • kos.Close에 대한 선그래프를 작성=ax
  • ax2=ax1.twinx(): 두번째 그래프 ax2는 ax1의 x축을 공유
  • kos.Volume에 대한 선그래프 작성
  • ax1, ax2는 하나의 플롯으로 작성되지만 파이썬은 별도의 두 개의 그래프로 인식하므로 legend()는
  • 별도로 지정해야 됨

위 그림을 두개의 별도의 플롯으로 작성해봅니다.

%matplotlib inline
fig, ax=plt.subplots(2,1, figsize=(6,4), gridspec_kw=dict(height_ratios=[2,2]), sharex=True) #(1)
ax[0].plot(kos.index, kos.Close,  "b", label="Close")
ax[0].set_ylabel("종가")
ax[1].plot(kos.Volume, "r", ls="dashed", label="Volume")
ax[1].set_xticks(date, date1)
ax[1].set_xlabel("Time(2024 년)")
ax[1].set_ylabel("거래량")
plt.show()

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b