기본 콘텐츠로 건너뛰기

10월, 2024의 게시물 표시

[seaborn] seaborn의 함수에 사용하는 속성(인수)들

[seaborn] seaborn의 함수에 사용하는 속성(인수)들

seaborn의 함수에 사용하는 인자들 인수 특성 좌표속성 좌표속성은 플롯에 마크가 그려지는 위치를 결정 x는 수평위치, y는 수직위치 각 변수들의 구간을 설정하기 위해 xmin, xmax, ymin, ymax를 사용 normal scale: 정수 인덱스를 명목변수에 할당하기 위해 사용 Temporal scale: 기준 시점에서 날짜의 수를 나타냄 Continuous scale: 일반적인 수치 값을 나타내지만 trans="log" 등을 사용하여 값들의 위치에 차이를 둡니다. 컬러속성 color(마터 자체와 내부 색), fillcolor(마커 내부 색), edgecolor(마커의 자체의 색) 여러색을 나타내기 위해 매개변수 palette에 viridis, rocket, deep 등을 지정 알파속성 alpha는 마크의 불투명도를 지정 마커속성 매개변수 marker에 지정 matplotlib.markers 참조 선 속성 linestyle, '-', '--', '-.', 및 ':' 로 지정. dashes의 경우 선과 선 사이의 공백이 존재합니다. 그러므로 선의 길이와 공백의 길이를튜플로 지정 예) (5, 2) 선폭속성 linewidth=float로 지정 edgewidth 점과 같이 원형과 같은 마크 자체의 두께를 지정 포인트크기 pointsize=정수(마크의 직경) 데이터 값을 지정할 수 있음, 면적에 선형적으로 비례하며 스케일은 제곱근으로 변환되어 적용 stroke edgewidth와 유사하지만 'x'와 같은 마크의 두께를 지정 텍스트 속성 수평 정렬 halign= left, right, center 수직 정렬=top, bottom, center, baseline, center_baseline 글꼴 크기 fontsize=1~26 offset class="txtl&q

[seaborn] 플롯과 데이터 구조

플롯과 데이터 구조 일반적으로 플롯은 지정된 x와 y에 대응하여 작성됩니다. 각 x와 y를 위해 seaborn 함수에 전달하는 데이터 구조에 따라 입력 형식에서 약간의 차이를 보입니다. DataFrame의 경우 모든 변수들이 열(column)로 배치되고 각 열이름이 하나의 변수를 나타내는 구조이기 때문에 x와 y에 열이름을 전달합니다. 그러나 행과 열이 연결되어 각 값들의 의미를 나타내는 경우 즉, pivot table과 같은 경우 x와 y는 각각 행이름이고 열이름이 됩니다. 이 경우 그래프 함수는 각 행에 대한 열을 x와 y를 암묵적으로 인식하여 그래프를 작성합니다. 이러한 관계를 다음 데이터 flight에 대해 figure-level 함수인 relplot(), catplot() 를 적용하여 알아봅니다( Figure-level과 Axes-level 함수 그리고 히스토그램 참조). import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns flights=sns.load_dataset("flights") flights.head(3) year month passengers 0 1949 Jan 112 1 1949 Feb 118 2 1949 Mar 132 sns.set_theme() sns.relplot(data=flights, x="year

[seaborn] 다중 플롯 작성

다중 플롯 작성 Figure-level 함수 는 유사한 종류의 플롯을 작성할 수 있으므로 다른 종류 예를 들어 산점도와 히스토그램을 동시에 작성하기 위해서는 axes-level 함수를 사용해야 합니다. 또한 이 레벨의 함수는 matplotlib에 의존하므로 플롯의 레이아웃을 설정하기 위해 subplots() 함수를 적용할 수 있습니다. import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns pen=sns.load_dataset("penguins") fig, axs=plt.subplots(1,2, figsize=(8,3), gridspec_kw=dict(width_ratios=[4,3])) sns.scatterplot(data=pen, x="flipper_length_mm", y="bill_length_mm", hue="species", ax=axs[0]) sns.histplot(data=pen, x="species", hue="species", shrink=.8, alpha=.8, legend=False, ax=axs[1]) fig.tight_layout() 위 코드에서 plt.subplots() 함수의 인수 gridspec_kw는 각 subplots의 레이아웃에 대한 값들을 사전(dictionary)형식으로 지원하기 위한 매개변수입니다. figure-level 함수는 다른 종류의 그래프들로 구성된 다중 플롯을 작성 할 수 없습니다. 즉, 이 수준의 함수는 초기화를 포함하여 자신의 플롯을 독점적으로 소유하므로 위의 axes-level 함수

[seaborn] Figure-level과 Axes-level 함수 그리고 히스토그램

Figure-level과 Axes-level 함수 그리고 히스토그램 seaborn은 dataframe과 array에서 작동에서 작동하며 내부적으로 필요한 mapping과 통계적 집계를 수행하여 플롯을 작성합니다. seaborn의 함수들은 플롯을 작성하기 위해 기본적으로 matplotlib를 사용하므로 이 패키지의 형식에 의존지만 이 패키지와는 독자적으로 실행되는 실행되는 함수가 존재합니다. 이러한 함수는 figure-level function이라 하며 matplotlib와 연결되는 함수를 axes-level fuction으로 구분합니다. seaborn은 플롯팅 함수는 "관계형(relation)", "분포형(distribution)", "범주형(categorical)"으로 구분할 수 있습니다. 각각은 relplot(), displot(), catplot() 함수로 작성할 수 있습니다. 이 함수들은 figure-level 함수들로 다음 표와 같이 다양한 axes-level 함수들을 포함합니다. 형태 figure-level 함수 axes-level 함수 relation relplot scatterplot, lineplot distribution displot histplot, kdeplot, ecdfplot, rugplot categrorical catplot stripplot, swarmplot, boxplot, violineplt, pointplot, barplot 위에서 언급한 것과 같이 figure-level 함수는 matplotlib와 별개로 작성됩니다. 그러므로 이 함수들을 사용하는 경우 FacetGrid() 함수를 통해 레이아웃을 변경할 수 있습니다. 반면에 axes-level 함수는 axes 수준에서 플롯을 작성되며 matplotlib의 axes 수준을 따릅니다. 그러므로 plt.figure()에 의한 레이아웃의 변경이 이루어 집니다. 데이터 penguins를

삼각함수의 합, 차 그리고 곱에 대한 공식

삼각함수의 합, 차 그리고 곱에 대한 공식 내용 합과 차 공식 곱을 합으로 전환 합을 곱으로 전환 배각공식 반각공식 합과 차 공식 두 각에 대한 합 또는 차에 대해 식 1의 규칙이 성립합니다. \begin{align}&\sin(\alpha\pm\beta)=\sin(\alpha)\cos(\beta)\pm\cos(\alpha)\sin(\beta)\\\tag{식 1} &\cos(\alpha\pm\beta)=\cos(\alpha)\cos(\beta)\mp\sin(\alpha)\sin(\beta)\\ &\tan(\alpha\mp\beta)=\frac{\tan(\alpha) \pm \tan(\beta)}{1 \pm \tan(\alpha)\tan(\beta)} \end{align} 그림 1은 반지름 a인 원에 내접한 두 삼각형을 나타낸 것입니다. 그림 1. 반지름 a인 원에 내접한 두 삼각형. 그림 1의 원위의 점 A와 B는 각 α와 β에 대한 식 2와 같이 삼각함수로 나타낼 수 있습니다. \begin{align}\tag{식 2}\cos(\alpha)=\frac{x_1}{a}\quad \sin(\alpha)=\frac{y_1}{a}& \Rightarrow A(a\cos(\alpha),\,a\sin(\alpha)) \\ \cos(\beta)=\frac{x_2}{a}\quad \sin(\beta)=\frac{y_2}{a}& \Rightarrow B(a\cos(\beta),\,a\sin(\beta))\end{align} 그림 1의 원 내부에 존재하는 삼각형의 변 b의 길이를 계산하기 위해 cosine 2 법칙 과 적용합니다(식 3). \begin{align}\tag{식 3}b^2=a^2+a^2-a\cdot a·\cos(\alpha-\beta)=2a^2(1-\cos(\alpha-\beta))\end{align} 그림 1의 좌표 A, B를 각각 $\vec{A}, \vec{B}$로 간

삼각함수: sin 법칙(sine rule)

sin 법칙(sine rule) 식 1은 sin 법칙을 나타냅니다. \begin{equation}\tag{식 1}\frac{\sin(\alpha)}{a}=\frac{\sin(\beta)}{b}=\frac{\sin(\gamma)}{c}\end{equation} 그림 1. 삼각형. 그림 1의 삼각형은 꼭지점C에서 변 c로 수선(h)을 기준으로 두개의 삼각형으로 구분할 수 있고, 꼭지점A에서 변 a로 그은 수선 h1을 기준으로 두개의 삼각형으로 구분할 수 있습니다. 식 1은 그림 1의 수선 h와 h1을 기준으로 식2와 식 3을 전개하여 유도할 수 있습니다. 먼저 h를 기준으로 식 2를 전개합니다. \begin{align}&\sin(\alpha)=\frac{h}{b}, \; \sin(\beta)=\frac{h}{a}\\ \tag{식 2}&h=b \cdot \sin(\alpha), \; h= a \cdot \sin(\beta)\\ &\rightarrow b \cdot \sin(\alpha)=a \cdot \sin(\beta)\\ &\rightarrow \frac{\sin(\alpha)}{a}=\frac{\sin(\beta)}{b}\end{align} h1를 기준으로 식 3을 나타낼 수 있습니다. \begin{align}&\sin(\gamma)=\frac{h_1}{b}, \; \sin(\beta)=\frac{h_1}{c}\\ \tag{식 3}&h_1=b \cdot \sin(\gamma), \; h_1= c \cdot \sin(\beta)\\ &\rightarrow b \cdot \sin(\gamma)=c \cdot \sin(\beta)\\ &\rightarrow \frac{\sin(\gamma)}{c}=\frac{\sin(\beta)}{b}\end{align} 식 2와 식 3을 결합하면 sine 법칙인 식 1과 같습니다. 예) 그림 1의 삼각형에 대해 sine 법칙을 적용해 봅니

삼각함수: 코사인 법칙(cosines rule)

코사인 법칙(cosines rule) cosine 1법칙은 식 1과 같습니다. \begin{align}\tag{ 식 1} &\text{a}=\text{c}·\cos(\text{B})+\text{b}·\cos(\text{C})\\ &\text{b}=\text{a}·\cos(\text{C})+\text{c}·\cos(\text{A})\\ &\text{c}=\text{b}·\cos(\text{A})+\text{a}·\cos(\text{B})\end{align} 그림 1. cosin 1 법칙. 그림 1로 부터 다음 식을 유도할 수 있습니다. \begin{align}&\text{By}\; \overline{AH},\; \triangle ABH\; \text{and} \;\triangle AHC\\ &\rightarrow \cos(B)=\frac{a_1}{c},\; \cos(C)=\frac{a_2}{b}\\ &\rightarrow a=a_1+a_2=c \cdot \cos(B) + b \cdot \cos(C)\\\\ &\text{By}\; \overline{BD},\; \triangle ABD \; \text{and} \;\triangle CBD\\ &\rightarrow \cos(A)=\frac{b_2}{c},\; \cos(C)=\frac{b_1}{a}\\ &\rightarrow b=b_1+b_2=a \cdot \cos(C) + c \cdot \cos(A)\\\\ &\text{By}\; \overline{CE},\; \triangle AEC\; \text{and} \;\triangle CEB\\ &\rightarrow \cos(A)=\frac{c_2}{b},\; \cos(B)=\frac{c_1}{a}\\ &\rightarrow c=c_1+c_2=b \cdot \cos(A) + a \cdot \cos(B)\end{align} 식 2의 cos제2법칙은 cos 제1법칙

삼각함수의 주기적 특성

삼각함수 주기적 특성 삼각함수는 일정한 범위를 기준으로 반복되는 주기함수(periodic function) 입니다. 예로 cos(x)와 cos(2x)의 그래프를 그려보면 그림 1과 같습니다. 그림 1. cos(x)와 cos(2x) x=np.linspace(0, 3*np.pi, 100) y=np.cos(x) y2=np.cos(2*x) fig, ax=plt.subplots(figsize=(4,2)) ax.plot(x, y, color="b", label="cos(x)") ax.plot(x, y2, color="r", label="cos(2x)") ax.vlines(2*np.pi, 0, 1, ls="dotted", color="b") ax.hlines(0.5, 0, 2*np.pi, ls="dotted", color="b", label="period for cos(x)") ax.hlines(0.3, 0, np.pi, ls="dotted", color="r", label="period for cos(2x)") ax.vlines(np.pi, -1, 1, ls="dotted", color="g", label="amplititude") ax.spines['left'].set_position(("data", 0)) ax.spines['bottom'].set_position(("data", 0)) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) x1=[0, np.pi/2, np.pi,3*np.pi/2, 2*np.pi,5*np

삼각함수(Trigonometric function)의 정의

삼각함수 직각삼각형의 세 변의 길이의 비를 삼각비라고 하며 삼각비에는 일정한 관계를 보입니다. 삼각함수(Trigonometric function)는 삼각비의 일정한 관계를 함수로 나타낸 것입니다. 그림 1은 원 내부에 작성된 직각삼각형을 나타냅니다. 그림 1. 원 내부에 직각삼각형. x=np.linspace(-1, 1, 100) y=np.sqrt(1-x**2) y1=-np.sqrt(1-x**2) a=0.8 b=np.sqrt(1-a**2) fig, ax=plt.subplots(figsize=(3,3)) ax.plot(x, y, color="b") ax.plot(x, y1, color="b") ax.arrow(0,0, a, b, color="k" ) ax.vlines(a, 0, b, ls="dotted", color="k") ax.hlines(b, 0, a, ls="dotted", color="k") cod=[(-0.1,-0.1), (a,-0.1), (-0.1, b), (a+0.05, b), (0.13, 0.01), (0.55, 0.03),(0.3, b+0.02), (a+0.02, 0.3), (0.3, 0.3)] nme=['O', 'a', 'b', 'P', r'$\theta$', r'$90^o$','a', 'b', 'r'] for i in range(len(cod)): if i <=5: ax.text(cod[i][0], cod[i][1], nme[i], weight="bold", color="k") else: ax.text(cod[i][0], cod[i][1], nme[i], fontsize=11, color=&quo

복소수 (Complex Number)

복소수(complex number) import numpy as np 제곱근의 경우 제곱근내의 수는 양수이어야 계산이 이루어집니다. $$\sqrt{9}=9^\frac{1}{2}=3$$ 그러나 아래와 같이 음수의 제곱근 일 경우 실수로 계산할 수 없습니다. 수학에서 $\sqrt{-1}=i$로 정의 하며 i 를 포함하는 수는 복소수(complex number) 라고 합니다. 파이썬에서는 j 로 표현합니다. $$\sqrt{-9}=\sqrt{9}\sqrt{-1}=9^\frac{1}{2}\sqrt{-1}=3i$$ 복소수 $$\tag{식 1}a+bi\;\text{또는}\; a+bj$$ a: 실수부분(real part) b: 허수부분 (imaginary part) a,b는 정수, 유리수, 분수 등 다양한 형태의 수입니다. 또한 복소수의 허수부분 부호가 반대인 경우를 켤레복소수(conjugate complex number) 라고 하며 일반적으로 복소수 z의 켤레복소수는 $\bar{z}$과 같이 객체 위의 선(overline)으로 나타냅니다. 즉 $a+bi$의 켤레복소수는 $a-bi$가 됩니다. 파이썬에서 복소수는 j로 표시하며 complex(실수, 허수) 함수로 생성합니다. A=complex(2,3) A (2+3j) 클래스 complex()로 생성되는 객체(복소수)는 그 객체의 실수부와 허수부를 각각 반환하는 속성(attribute)으로 객체.real, 객체.imag 를 포함합니다. A.real 2.0 A.imag 3.0 A의 켤레복소수는 complex()클래스의 메서드인 객체.conjugate() 로 계산됩니다. A.conjugate() (2-3j) 복소수의 덧셈과 뺄셈은 실수부 사이, 허수부 사이에서 이루어집니다. 예 1) 두 복소수의 덧셈을 계산합니다. A=-4+7i, B=5-10i A=complex(-4, 7) B=complex(5,-10) A,

거듭제곱근(Radicals)

내용 거듭제곱근(Radicals) 파이썬 함수에서 거듭제곱근 문제 수정 거듭제곱근(Radicals) 거듭제곱근(Radicals) 식 1과 같은 형태를 거듭제곱근(Radicals)라고 합니다. \begin{align}\tag{식 1}y&=\sqrt[n]{x}\\&=a^\frac{1}{n}\\ & x \gt 0: y \in \mathbb{R}\\ & x \lt 0: y \in \text{Complex number}\end{align} 식 1의 표현에서 n=2의 경우 n은 생략됩니다. $$\sqrt[4]{16} = 16^\frac{1}{4}=(2^4)^\frac{1}{4}=2$$ pow(16,1/4) 2.0 식 1에서 n이 홀수일 경우 x의 부호는 근호(root) 외부로 이동할 수 있습니다. $$\sqrt[3]{-125}=(-125)^\frac{1}{3}=((-5)^3)^\frac{1}{3}=-5$$ 음수일 경우 부호를 이동시키지 않은 상태에서 pow() 함수를 적용하면 복소수가 반환됩니다. 이는 $\frac{1}{3}$이 무한 소수이기 때문에 발생하는 컴퓨터 연산의 본질적 오류입니다. y=-pow(125,1/3) round(y, 2) -5.0 y=pow(-125,1/3) y (-2.5-4.330127018922192j) 위와 같이 세제곱근은 numpy 패키지의 cbrt() 함수를 적용할 수 있습니다. y=np.cbrt(-125) y -5.0 다음은 n이 짝수이고 x가 음수일 경우입니다. $$\sqrt[4]{-16}=(-16)^\frac{1}{4}$$ pow(-16, 1/4) (1.4142135623730951+1.414213562373095j) 위 문제의 경우 -16은 어떤수의 실수인 지수승으로 계산되지 않기 때문에 평가될 수 없습니다. 즉, 실수의 범위에서 음수의 거듭제곱근은 인덱스(n)가 홀수일 경우 계산될 수 있지만 짝수일 경우는 계산될 수 없습니다.

[Linear Algebra] 특이값분해(Singular Value Decomposition)

특이값분해(Singular Value Decomposition) 관련된 내용 특이값 m×n 차원의 행렬 A의 분해는 식 1과 같은 대각 행렬(Σ)와 관련됩니다. $$\tag{식 1}\Sigma=\begin{bmatrix}D& 0\\0 & 0 \end{bmatrix}$$ 식 1에서 D는 A T A의 고유값(≠ 0)을 대각원소로 구성한 대각행렬이고 차원은 r×r(r ≤ Min(m, n))입니다. 또한 Σ의 차원은 행렬 A의 차원과 같습니다. 행렬 A에 대해 A T A의 0이 아닌 고유벡터와 고유값을 각각 v i 와 λ i 라 하고 각 고유벡터가 정규직교관계이면 식 2와 같이 나타낼 수 있습니다. 그러므로 고유벡터에 행렬 A와의 내적 결과인 Av 1 , Av 2 , …, Av r 벡터들은 서로 직교합니다. 이들을 정규화(normalization)한 벡터들을 u 1 , u 2 , ..., u r 은 라고 하면 이 벡터들은 모두 정규 직교 벡터가 됩니다. \begin{align}u_i & =\frac{Av_i}{\Vert{Av_i}\Vert}\\\tag{식 2}& = \frac{Av_i}{\sigma_i}\\ Av_i&=\sigma_i u_i\\ & 1\le i \le r \end{align} 식 2의 AV는 고유값이 0이 되는 모든 부분까지 확장하여 식 3과 같이 나타낼 수 있습니다. \begin{align}AV&=\begin{bmatrix}Av_1&\cdots& Av_r& 0& \cdots& 0 \end{bmatrix}\\&= \begin{bmatrix} \sigma_1 u_1&\cdots& \sigma_r u_r& 0& \cdots& 0 \end{bmatrix}\\ \tag{식 3}& = \begin{bmatrix} u_1&\cdots& u_r& 0& \cdots&

[data analysis] 주성분분석(principal component analysis)

주성분분석 관련된 내용 직교행렬과 주성분 데이터 행렬의 차원 축소 공분산행렬의 고유벡터와 그에 대응하는 고유값을 고려하여 변수행렬의 차원을 감소시키면서 지정된 주축(고유벡터)을 기반으로 존재하는 축소된 차원의 변환 데이터를 생성할 수 있습니다. 이러한 주축 즉, 고유벡터들을 주성분(principal component) 라고 하며 내림차순으로 정렬된 각각의 고유값에 대응하는 고유벡터를 제1 주성분 성분, 제 2 주성분 등과 같이 구별합니다. 주성분 분석의 목적은 식 1과 같이 공분산 행렬의 고유벡터(p)와의 내적으로 변환된 축소된 차원의 벡터 Xp = Y를 결정하는 것입니다. \begin{align}A&=y^Ty\\\tag{식 1}&=(Xp)^T(Xp)\\&=p^TX^TXp\\&=p^T\Sigma P \end{align} import numpy as np import pandas as pd from scipy import stats from sklearn import linear_model from sklearn.preprocessing import StandardScaler, MinMaxScaler from sklearn.decomposition import PCA from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split import yfinance as yf from sklearn import feature_selection import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False 예 1) 어떤 데이터의 공분산 행렬 Σ(S)가 다음과 같다면 그 자료의 주성분?

[data analysis] 데이터 행렬의 차원 축소

데이터 행렬의 차원 축소 관련된 내용 고유벡터(Eigenvector)와 고유값(Eigenvalue) 직교행렬과 주성분 주성분 분석(Principal component analysis, PCA)은 데이터 행렬의 차원을 축소시키는 기법으로 그 행렬의 고유값과 고유벡터를 기준으로 새로운 변수 행렬을 생성합니다. 행렬 A에 대해 식 1을 만족하는 벡터 x와 스칼라 λ를 각각 고유벡터와 고유값이라고 합니다. \begin{align}\tag{식 1}Ax &= λx\\ A,\, x,\, \lambda:&\;\text{행렬, 고유벡터, 고유값(스칼라)}\end{align} 식 1의 행렬 A와 벡터 x의 행렬곱은 행렬 A의 선형변환입니다. 즉, x는 행렬 A를 선형적으로 확대, 축소, 또는 회전하기 위한 벡터가 됩니다. 식의 우항인 벡터와 스칼라 곱은 벡터의 크기만 변환하며 방향은 유지 됩니다. 그러므로 식이 만족한다는 것은 행렬 A의 방향을 나타낼 수 있으며 그 방향을 유지하면서 행렬의 변환을 일으킬 수 있는 스칼라가 존재함을 나타냅니다. 이러한 벡터와 스칼라를 고유벡터(eigenvector), 고유값(eigenvalue)이라고 합니다. 고유벡터(eigenvector) : 벡터의 선형변환시 변하지 않는 방향을 나타내는 벡터로 그 변하지 않는 방향을 주축(principal axis) 라고 합니다. 고유값(eigenvalue) : 고유벡터의 크기를 결정하는 값 행렬의 고유값과 고유벡터는 numpy.linalg.eig() 함수로 확인할 수 있습니다. import numpy as np A=np.array([[3,2],[2,4]]) print(A) [[3 2] [2 4]] eval,evec=la.eig(A) print(evec.round(3)) [[-0.788 -0.615] [ 0.615 -0.788]] print(eval.round(3)) [1.438 5.562] 두 객체의 값들을 비교하기 위해 numpy.al