상자그림이란?

사분위수를 시각화하여 그래프 형태로 나타낸 것으로, 상자수염그림(box-and-whisker-plot)으로 부르기도 한다. 상자그림은 하나의 그래프로 데이터의 분포 형태를 포함한 다양한 정보를 전달하기 때문에 단일변수 수치형 자료를 파악하는 데 자주 사용된다.

 

 

 

상자그림 작성하기 (기본)

dist <- cars[,2]
boxplot(dist, main='자동차 제동거리')
boxplot.stats(dist)

 

 

 

그룹이 있는 데이터의 상자그림

boxplot(Petal.Length~Species,
        data=iris,
        main='품종별 꽃잎의 길이',
        col=c('green','yellow','blue'))

# Petal.Length~Species
# 꽃잎의 길이(Petal.Length) 데이터를 품종(Species)별로 나누어서 그리라는 의미이다.
# 반드시 그룹 정보가 저장되어 있는 열 이름이 ~ 뒤에 와야 한다.

# 다음과 같이 작성해도 같은 결과를 얻을 수 있다.
boxplot(iris$Petal.Length~iris$Species,
        main='품종별 꽃잎의 길이',
        col=c('green','yellow','blue'))

선그래프 작성하기 (기본)

month = 1:12
late = c(5,8,7,9,4,6,12,13,8,6,6,4)

plot(month, late, main='지각생 통계', xlab='Month', ylab='Late cnt',
     type='l', lty=1, lwd=1)

# type
# 작성하려는 선그래프의 종류를 지정한다.
# l, b, s, o 가 존재한다.

# lty
# 선의 종류를 지정한다. (1~6)

# lwd
# 선의 굵기를 지정한다.

 

 

 

복수의 선그래프 작성하기

month = 1:12
late1 = c(5,8,7,9,4,6,12,13,8,6,6,4)
late2 = c(4,6,5,8,7,8,10,11,6,5,7,3)

plot(month, 
     late1, 
     main='Late Students',
     type='b', 
     lty=1, 
     col='red', 
     xlab='Month', 
     ylab='Late cnt')

lines(month,
      late2,
      type='b',
      col='blue')

# lines() 함수
# plot() 함수로 작성한 그래프 위에 선을 겹쳐서 그리는 역할을 한다.
# 이 함수를 추가할 대마다 선이 하나씩 추가된다.

원그래프 작성하기 (기본)

favorite <- c('WINTER', 'SUMMER', 'SPRING', 'SUMMER', 'SUMMER', 
              'FALL', 'FALL', 'SUMMER', 'SPRING', 'SPRING')
pie(table(favorite), main='선호 계절', radius=1)

 

 

 

3차원 원그래프 작성하기

install.packages('plotrix')
library(plotrix)
pie3D(ds, main='선호 계절',
      labels=names(ds),
      labelcex=1.0,
      explode=0.1,
      radius=1.5,
      col=c('brown', 'green', 'red', 'yellow'))

# labels
# 파이별 레이블 지정

# labelcex
# 레이블의 폰트 크기

# explode
# 파이 간 간격

# radius
# 파이의 크기

# col
# 파이의 색 지정

# 화면 분할(2x2)
par(mfrow=c(2,2), mar=c(3,3,4,2))

# 그래프 1
hist(iris$Sepal.Length)

# 그래프 2
barplot(table(mtcars$cyl))

# 그래프 3
barplot(table(mtcars$gear), horiz=TRUE)

# 그래프 4
pie(table(mtcars$cyl), radius=2)

# 화면 분할 취소
par(mfrow=c(1,1), mar=c(5,4,4,2)+.1)

par() 함수의 경우 한 번 실행되면 R이 종료될 때까지 설정된 값이 유지되므로 더 이상 화면 분할이 필요 없으면 이와 같이 그래프창 설정을 원상태로 돌려놓는 것이 좋다. 화면 분할을 지정하는 mfrow=c(1,1)은 1행1열을 의미하며 결국 전체 윈도우를 하나의 화면으로 만들게 된다.

 

'Data Science > R' 카테고리의 다른 글

[R 시각화] 선그래프 그리기  (0) 2021.10.05
[R 시각화] 원그래프 그리기  (0) 2021.10.04
[R 시각화] 히스토그램 그리기  (0) 2021.10.04
[R 시각화] 막대그래프 그리기  (0) 2021.10.04
[R 문법] which() 함수  (0) 2021.10.04

히스토그램이란?

외관상 막대그래프와 비슷한 그래프로, 그룹이 명시적으로 존재하지 않는 수치형 자료의 분포를 시각화할 때 사용된다. 막대그래프를 그리려면 값의 종류별로 개수를 셀 수 있어야 하는데, 키나 몸무게 등의 수치형 자료는 데이터 내에 값의 종류라는 개념이 없어서 종류별로 개수를 셀 수 없다. 대신에 수치형 자료에서는 값들의 구간을 나누고 구간에 속하는 값들의 개수를 세는 방법을 사용한다. 즉, 구간이 그룹의 역할을 하는 것이다.

 

 

 

히스토그램 작성하기

head(cars)
dist <- cars[,2]
dist
hist(dist,
     main = 'Histogram for 제동거리',
     xlab='제동거리', 
     ylab='빈도수', 
     border='blue', 
     col='green', 
     las=2,          # x축 글씨 방향(0~3)
     breaks=5)       # 막대 개수 조절

hist(dist,
     main = 'Histogram for 제동거리',
     xlab='제동거리', 
     ylab='빈도수', 
     border='blue', 
     col='green', 
     las=2,          # x축 글씨 방향(0~3)
     breaks=seq(0,120, by=10))       # 막대 개수 조절

breaks의 경우 데이터 내 구간을 몇 개로 나눌지 지정하는 옵션이다. 딱 지정한 만큼 나눌 수 없을 때는 주변에 비슷한 값으로 지정하기도 한다.

result <- hist(dist,
               main = 'Histogram for 제동거리',
               breaks=5)
result

freq <- result$counts
freq
names(freq) <- result$breaks[-1]
freq

freq의 이름으로 구간의 경계값을 저장한다. 이 때, break[-1]로 한 이유는 구간 경계값의 개수가 구간 빈도수보다 하나 더 많아서 이름의 개수를 맞추기 위해서이다.

막대그래프를 작성하기 위한 기초 작업 (데이터 정리하기)

# 막대그래프를 작성하기 위한 기초 작업
favorite <- c('WINTER', 'SUMMER', 'SPRING', 'SUMMER', 'SUMMER', 
			'FALL', 'FALL', 'SUMMER', 'SPRING', 'SPRING')
table(favorite)

# table() 함수
# 벡터에 저장된 범주형 데이터에 대해 데이터 값이 종류별로 몇 개인지 계산하는 함수이다.

 

 

 

막대 그래프 작성하기

ds <- table(favorite)
barplot(ds, main='favorite season')

 

 

 

막대그래프의 색 지정하기

barplot(ds, main='favorite season', col='orange')

 

 

 

막대별로 다른 색상 지정하기

barplot(ds, main='favorite season', col=rainbow(4))
barplot(ds, main='favorite season', col=heat.colors(4))
barplot(ds, main='favorite season', col=terrain.colors(4))
barplot(ds, main='favorite season', col=topo.colors(4))
barplot(ds, main='favorite season', col=cm.colors(4))

 

 

 

x축, y축에 설명 붙이기

barplot(ds, main='favorite season', col=cm.colors(4), xlab='계절', ylab='빈도 수')

 

 

 

그래프 막대를 수평 방향으로 출력하기

barplot(ds, main='favorite season', col=cm.colors(4), horiz=TRUE)

# 수평 방향 horiz=TRUE
# 수직 방향 horiz=FALSE

 

 

 

x축 그룹의 이름 바꾸기

# x축 그룹의 이름 바꾸기 (기본)
barplot(ds, main='favorite season', col=cm.colors(4), names=c('FA', 'SP', 'SU', 'WI'))

# x축 그룹의 이름을 수직 방향으로 출력하기
barplot(ds, main='favorite season', col=cm.colors(4), las=2)

las 값 설명
0 축 방향 (기본값)
1 수평 방향 (축 방향과 상관 없음)
2 축을 기준으로 수직 방향
3 수직 방향 (축 방향과 상관 없음)

 

 

 

중첩 그룹의 막대 그래프

그룹 안에 또 다른 그룹이 존재하는 경우이다. 아래 경우에서는 연도 내부에 나이가 존재한다.

# 데이터 입력
age.A <- c(13709, 10974, 7979, 5000, 4250)
age.B <- c(17540, 29701, 36209, 33947, 24487)
age.C <- c(991, 2195, 5366, 12980, 19007)

ds <- rbind(age.A, age.B, age.C)
ds
colnames(ds) <- c('1970', '1990', '2010', '2030', '2050')
ds

# 그래프 작성
barplot(ds, main='인구 추정')
barplot(ds, main='인구 추정', col=rainbow(3))
barplot(ds, main='인구 추정', col=rainbow(3), beside=TRUE)
barplot(ds, main='인구 추정', col=rainbow(3), beside=TRUE, legend.text=T)
barplot(ds, main='인구 추정', col=rainbow(3), beside=TRUE, legend.text=T, 
		args.legend=list(x='topright', bty='n', inset=c(-0.25, 0)))
par(mflow=c(1, 1), mar=c(5,5,5,7))
barplot(ds, main='인구 추정', col=rainbow(3), beside=TRUE, 
		legend.text=c('0~14세', '15~64세', '65세 이상'))

옵션 기능
beside 기본값은 FALSE, TRUE로 지정하면 막대를 각각 표시한다.
legend.text 범례에 표시할 내용을 지정한다.
args.legend 여러 개의 사항을 list() 함수로 묶어서 지정할 수 있게 한다.
x='topright' 범례를 출력할 위치를 지정한다.
bty='n' 'o' 는 테두리선을 표시하고, 'n' 은 테두리선을 표시하지 않는다.
inset=c(-0.25,0) 범례를 x축과 y축 방향으로 얼마나 이동시킬지를 지정한다. -1~1 사이의 값을 지정한다. (%를 의미한다.)
par() 그래프를 표시할 창에 대해 설정하는 역할을 한다.
mfrow=c(1, 1) 그래프를 출력할 창을 어떻게 분할할지를 지정하는데, 여기서 c(1, 1)은 창을 분할하지 않음을 의미한다.
mar=c(5,5,5,7) margin 지정. c(bottom, left, top, right) 순서이다.

 

score <- c(67, 84, 69, 50, 95, 60, 82, 71, 88, 84)
which(score==69)
which(score>=85)
max(score)
which.max(score)
min(score)
which.min(score)

# max() 함수와 which.max() 함수의 차이점
# max() 함수는 해당하는 값을 출력하지만, 
# which.max() 함수는 해당하는 값의 인덱스를 출력한다.

# 성적이 60 이하인 값들은 61점으로 상향조정
score[which(score<=60)] <- 61

# 성적이 80 이상인 값들만 추출
score[which(score>=80)]

#성적이 제일 좋은 학생들의 이름 추출하기
score <- c(60, 40, 95, 80)
names(score) <- c('John', 'Jane', 'Tom', 'David')
score
idx <- which.max(score)
names(scores[idx])

myfunc <- function(x, y) {
  val.sum <- x+y
  val.mul <- x*y
  return(list(sum=val.sum, mul=val.mul))
}

result <- myfunc(5, 8)
cat('5+8 = ', result$sum, '\n')
cat('5*8 = ', result$mul, '\n')

 

'Data Science > R' 카테고리의 다른 글

[R 시각화] 막대그래프 그리기  (0) 2021.10.04
[R 문법] which() 함수  (0) 2021.10.04
[R 문법] apply( ) 함수  (0) 2021.10.04
[R 문법] ifelse 문  (0) 2021.10.04
[R 문법] R 에서 텍스트 파일(.txt) 읽어오기  (0) 2021.10.04

apply() 함수란?

apply(데이터 셋, 행/열 방향 지정, 적용 함수)

# 데이터 셋
# 반복 작업을 적용할 대상인 매트릭스나 데이터프레임 이름을 입력한다.

# 행/열 방향 지정
# 행 방향 작업의 경우 1, 열 방향 작업의 경우 2를 지정한다.

# 적용 함수
# 반복 작업의 내용을 알려주는 것으로, R 내장 함수이거나 사용자 정의 함수를 의미한다.

 

ifelse(비교 조건, 조건이 참일 때 선택할 값, 조건이 거짓일 때 선택할 값)

 

a <- 10; b <-20
ifelse(a>b, a, b)	# 출력결과는 20.

+ Recent posts