기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[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", y="passengers", hue="month", kind="line" )
plt.show()

위 데이터 flights는 각 변수가 열(column)으로 정렬되어 있는 구조인데 반해 다음과 같이 pivot_table인 경우를 그래프로 나타내기 위해서는 각 행의 이름과 각 열의 이름을 다른 축에 배치되어야 하는 구조입니다. 이 경우는 x, y를 지정할 수 없는 대신 seaborn 함수 자체에서 암묵적으로 x와 y축에 각 행이름과 열이름으로 자동 매칭됩니다. 그러므로 인위적으로 x, y를 지정할 수 없습니다.

flight_pivot=flights.pivot(index="month", columns="year", values="passengers")
flight_pivot.head(3)
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
Jan 112 115 145 171 196 204 242 284 315 340 360 417
Feb 118 126 150 180 196 188 233 277 301 318 342 391
Mar 132 141 178 193 236 235 267 317 356 362 406 419
sns.relplot(data=flight_pivot, kind="line")
plt.show()

다음 그림은 위 데이터를 전치한 것입니다.

sns.relplot(data=flight_pivot.T, kind="line")
plt.show()

위 그림의 x는 명목변수입니다. 그러므로 박스형으로 작성할 수 있습니다. 위와 마찬가지로 x,y는 암묵적으로 인식됩니다.

sns.catplot(data=flight_pivot.T, kind="box")
plt.show()

다음 데이터의 샘플은 두개의 명목변수에 대응하는 세개의 값이 할당된 구조입니다. 이러한 구조의 데이터를 messy data라하며 pd.melt() 함수 등으로 여러개의 id를 나타내는 명목변수에 대응하는 1개의 값을 할당하는 구조 즉, 정돈된 구조(tidy data)로 변환시킬 수 있습니다.

Messy data의 구조로 여러개의 값을 하나의 플롯으로 나타내기 어렵습니다. 대신에 각 명목변수에 대응하는 값들이 하나의 열로 이루어진 구조로 변환 후 플롯을 작성할 수 있습니다.

anag = sns.load_dataset("anagrams")
anag.head(3) #messy data
subidr attnr num1 num2 num3
0 1 divided 2 4.0 7
1 2 divided 3 4.0 5
2 3 divided 3 5.0 6

anag_tidy=anag.melt(id_vars=["subidr", "attnr"], var_name="solutions", value_name="score") anag_tidy.head(3) #tidy data

subidr attnr solutions score
0 1 divided num1 2.0
1 2 divided num1 3.0
2 3 divided num1 3.0
sns.catplot(data=anag_tidy, x="solutions", y="score", hue="attnr", kind="point")
plt.show()
sns.catplot(data=anag_tidy, x="solutions", y="score", hue="attnr", kind="box")
plt.show()

다음은 표 형식이 아닌 자료 구조에 대한 플롯 작성을 나타낸 것입니다. 사전형식의 자료에서 각 key는 x, y, hue에 전달하는 변수 명이 됩니다.

flight_dict=flights.to_dict()
flight_dict.keys()
dict_keys(['year', 'month', 'passengers'])
sns.relplot(data=flight_dict, x="year", y="passengers", hue="month", kind="line")
plt.show()

x와 y등의 데이터가 분리된 경우 즉, 플롯함수의 x, y 인수에 별도의 객체를 전달할 경우 인수 data를 사용할 필요가 없습니다. 다음은 flights로 부터 각 year에 대응하는 passengers의 평균을 작성한 것으로 인덱스와 passengers 열을 별도로 분리하여 그래프를 작성해봅니다.

flight_ave=flights.groupby('year').mean(numeric_only=True)
flight_ave.head(3)
passengers
year
1949 126.666667
1950 139.666667
1951 170.166667
yr=flight_ave.index
passen=flight_ave.passengers
sns.relplot(x=yr, y=passen, kind="line")
plt.show()

위에서 분리된 객체 yr, passen은 객체의 이름을 포함하고 있기 때문에 x, y의 축 이름이 생성되지만 객체내에 이름이 없을 경우 축이름은 생성되지 않습니다. 다음은 객체 yr, passen을 numpy.array로 변환한 것으로 객체의 이름을 name 속성을 사용하여 별도로 지정해 주지 않은 경우 이름을 포함하지 않습니다. 그러므로 다음과 같이 각 축 레이블의 이름을 나타낼 수 없습니다.

sns.relplot(x=yr.to_numpy(), y=passen.to_list(), kind="line")
plt.show()

이 경우 set_axis_labels() 함수를 사용하여 축의 레이블을 첨가할 수 있습니다.

g=sns.relplot(x=yr.to_numpy(), y=passen.to_list(), color="red", kind="line")
g.set_axis_labels("year", "passengers")
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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...