기본 콘텐츠로 건너뛰기

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

[R]데이터 시각화

데이터 시각화

내용

Bar plot

막대그래프는 목록변수의 분포(빈도수)를 나타냅니다. 막대의 위치는 수직 또는 수평으로 작성할 수 있습니다. 가장 간단한 형태는 다음 함수를 사용하는 것입니다.

barplot(객체, main, xlab, ylab, horiz, names.arg)
객체는 벡터 또는 행렬 형입니다.
main: 제목
xlab, ylab: x, y 축 라벨
horiz = True 이면 수평바가 생성
names.arg: 각 바의 라벨을 작성
library(vcd)
ar<-Arthritis
names(ar)
[1] "ID"        "Treatment" "Sex"       "Age"       "Improved" 
head(ar)
  ID Treatment  Sex Age Improved
1 57   Treated Male  27     Some
2 46   Treated Male  29     None
3 77   Treated Male  30     None
4 17   Treated Male  32   Marked
5 36   Treated Male  46   Marked
6 23   Treated Male  58   Marked
table()는 교차 분류 요인(cross-classifying factors)을 사용하여 요인 수준의 각 조합에서 카운트의 분할표(contingency table, 교차표)를 작성합니다.
 count<-table(ar$Improved);count
 None   Some Marked 
    42     14     28 
par(mfrow=c(1, 2))
barplot(count, main="막대그래프", xlab="imporvement", ylab="Frequency")
barplot(count, main="수평 막대그래프", xlab="Frequency", ylab="Improvement", horiz=TRUE)

그래프를 작성 대상인 목록변수가 factor 또는 ordered factor 라면 plot() 함수에 의해 수직 막대그래프를 작성할 수 있습니다.

class(ar$Improved)
[1] "ordered" "factor"
par(mfrow=c(1,2))
plot(ar$Improved, main="막대그래프", xlab="imporvement", ylab="Frequency")
plot(ar$Improved, main="수평 막대그래프", xlab="Frequency", ylab="Improvement", horiz=TRUE)

Stacked and grouped bar plot

barplot()의 객체가 벡터가 아니라 행렬인 경우 결과 그래프는 누적 또는 그룹화된 막대 플롯이 됩니다. beside=FALSE(기본값)인 경우 행렬의 각 열은 플롯에 막대를 생성하고 열의 값은 누적되어 막대의 높이로 나타납니다. beside=TRUE인 경우 행렬의 각 열은 그룹을 나타내며 각 열의 값은 누적되지 않고 병치됩니다. 치료 유형 및 개선 상태의 교차표를 고려하십시오.

 cnt<-table(ar$Improved, ar$Treatment) 
cnt
         Placebo Treated
  None        29      13
  Some         7       7
  Marked       7      21
windows(height=7, width=7) #그림의 새창이 생성됩니다. 
par(mfrow=c(1,2))
barplot(cnt, main="Stacked bp", xlab="Imporvement", ylab="Frequency",
col=c("red","yellow","green")) 
barplot(cnt, main="Stacked bp",xlab="Imporvement", ylab="Frequency", col=c("red","yellow","green"), legend=rownames(cnt), beside=TRUE)

barplot은 단순히 빈도수에 국한되지는 않습니다. 예를 들어 aggregation()함수에 의해 생성된 그룹별 mean, sd등을 작성할 수 있습니다.

states<-data.frame(state.region, state.x77)
means<-aggregate(states$Illiteracy, by=list(state.region), FUN=mean); means 
        Group.1        x
1     Northeast 1.000000
2         South 1.737500
3 North Central 0.700000
4          West 1.023077
위 결과를 변수 x에 대해 정렬합니다.

order(x): 객체 x를 정렬하여 대응되는 인덱스를 결과로 반환

 means<-means[order(means$x),]; means
        Group.1        x
3 North Central 0.700000
1     Northeast 1.000000
4          West 1.023077
2         South 1.737500
par(mfrow=c(1,1))
barplot(means$x, names.arg=means$Group.1)
title("Mean Illiteracy Rate")

막대 플롯 조정

막대 플롯의 모양을 조정하는 방법에는 여러 가지가 있습니다. 예를 들어, 막대가 많은 경우 막대 레이블이 겹치기 시작할 수 있습니다. cex.names 옵션을 1보다 작은 값을 지정하여 레이블 크기가 감소시킬 수 있습니다. 선택적으로 names.arg 인수를 사용하면 막대에 레이블을 지정하는 데 사용되는 이름의 문자형 벡터를 지정할 수 있습니다. 그래픽 매개변수를 사용하여 텍스트 간격을 지정할 수도 있습니다.

이러한 플롯의 조정은 par()의 다양한 인자를 사용하여 일으킬 수 있습니다. 다음에 사용된 인자는 marlas입니다.

  • mar: 플롯의 네 면에 지정할 여백 행 수를 제공하는 c(하단, 왼쪽, 상단, 오른쪽) 형식의 숫자 벡터입니다. 기본값은 c(5, 4, 4, 2) + 0.1입니다.
  • las: axis label의 스타일
    • 0: 기본값으로 축과 평형
    • 1:항상 평형
    • 2: 축과 수직
    • 3:항상 수직
par(mar=c(5, 8, 4, 2))
par(las=2)
cnt<-table(ar$Improved)
barplot(cnt, main="Treatment outcome", horiz=TRUE, ces.name=0.8, names.arg=c("No Improvement","Some Improvement", "Marked Imporvement"))

스피노그램(Spinograms)

스피노그램에서 누적 막대 그림은 각 막대의 전체높이가 1이고 각 세그먼트(부분) 높이가 비율을 나타내도록 다시 조정됩니다. 스피노그램은 vcd 패키지spine() 함수를 통해 생성됩니다. 다음 코드는 간단한 스피노그램을 생성합니다.

attach(ar)
cnt<-table(Treatment, Improved)
spine(cnt, main="Spinogram")
detach(ar)

Pie chart

파이 차트는 다음 함수로 생성됩니다.

pie(x, labels)
x: 음수가 아닌 수치형벡터로서 각 원소는 원의 부분면적을 나타냅니다.
labels: 각 부분의 명칭

다음은 객체 states의 Income을 state.region으로 그룹화하여 각 그룹의 합을 pie chart로 나타낸 것입니다. 또한 3D차트로 나타내기 위해 plotrix 패키지를 사용합니다.

attach(states)
inSum<-aggregate(Income, by=list(state.region), FUN=sum); inSum
par(mar=c(5,4,4,2)+0.1)
par(mfrow=c(1,2))
lbl<-levels(state.region); lbl
pie(inSum$x, labels=lbl, main="Income")

pct<-c(inSum$x/sum(inSum$x))
lbl2<-paste(lbl, round(pct, 1), '%', sep=" ")
pie(inSum$x, labels=lbl2, col=rainbow(length(lbl2)),main="Income(%)")
par(mfrow=c(1,2))
library(plotrix)
pie3D(inSum$x, labels=lbl, explode=0.1,  main='3D pie chart')

#각 지역에 포함된 도시의 수
city<-table(state.region)
lbl3<-paste(lbl, '\n', city, sep="")
pie(inSum$x, labels=lbl3, main="city # in region")    
detach(states)

댓글

이 블로그의 인기 게시물

[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$$ 실수...