dh_0e

[R Lang] 그래프 함수 I 본문

R

[R Lang] 그래프 함수 I

dh_0e 2025. 11. 17. 22:11

시각화(Visualization) 개요

항목 자료 (Data) 정보 (Information)
정의 정리되지 않은 Raw Data, 관찰이나 측정을 통해 인지된 단순한 사실이나 값들의 집합. 자료를 의미있는 형태로 체계화/조직화한 데이터. 판단 및 의사결정의 근거가 됨.
특징 단순 사실 해석 및 정리된 결과, 통찰력 제공 (시각화로 표현)

 

데이터 특성

  • 범주형 자료(Categorical data) = 질적 자료(Qualitative data)
    • 특징: 성별, 혈액형, 찬반 등 숫자로 표시할 수 없거나, 숫자로 바꾸더라도 대소 구분이 불가능한 자료로 산술 연산이 적용되지 않음
  • 연속형 자료(Numerical data) = 양적 자료(Quantitative data)
    • 특징: 크기가 있는 숫자로 구성되며, 대소 비교 및 평균, 최솟값, 최댓값 등 산술 연산이 가능한 자료
  • R에서의 저장:
    • 단일 변수 자료: 벡터(Vector)
    • 다중 변수 자료: 매트릭스(matrix)나 데이터 프레임(data frame)
    • R에서 열의 개수는 변수의 개수가 됨

 

데이터 시각화 개요 및 유형

  • 데이터 시각화(Data Visualization): 숫자 형태의 데이터를 그래프나 그림 형태로 표현하여, 데이터 분석 결과를 직관적으로 이해하고 핵심을 명확하게 전달하는 과정
    • 목적: 방대한 데이터 속에 숨겨진 패턴이나 규칙을 발견하고, 신속한 현상 파악 및 미래 예측에 기여
    • 발견 용이성: 평균적인 경향, 이상값(Outlier) 발견이 쉬움
  • 시각화의 3가지 주요 유형
    • 정보 시각화(Information Visualization): 대규모 데이터를 통계표, 그래프, 이미지 등으로 요약적으로 표현하여 추상적 데이터를 사람이 쉽게 인지하도록 함
    • 과학적 시각화(Scientific Visualization): 과학적 현상을 그래픽으로 설명하여 과학자들이 데이터를 이해하고 통찰력을 얻도록 돕는 목적 (컴퓨터 그래픽의 하위 집합)
    • 인포그래픽(Infographic): 정보(Information)와 그래픽(Graphic)의 합성어로, 다량의 정보를 차트, 지도, 다이어그램 등을 활용하여 빠르고 효과적으로 전달하며 정보 기억력을 상승시킴

 

시각화 기술 분류 (정보 시각화 중심)

유형 설명 주요 기법
시간 시각화 (Time) 시간에 따라 변화하는 데이터를 표현. 분절형 (막대, 누적막대), 연속형 (시계열, 계단식 그래프)
분포 시각화 (Distribution) 데이터를 부분으로 분리하고 부분 간의 관계 표현. 파이 차트, 도넛 차트, 누적 영역 그래프, 트리맵
관계 시각화 (Relationship) 변수들 간의 연관성/영향력 파악. 산포도(Scatter Plot), 버블 차트
비교 시각화 (Comparison) 여러 변수의 데이터값들을 비교. 박스플롯(Boxplot), 히트맵, 체르노프 페이스
공간 시각화 (Space) 데이터를 위치 정보(좌표)에 따라 지도 등에 표현. 점/선/버블 차트가 포함된 지도, 스몰 멀티플

비교 시각화 기법
비교 시각화 기법


R 그래프 함수의 구분

  • 고수준 그래프 함수(High-level Graphic)
    • 역할: 하나의 완성된 그래프(점, 선, 막대, 히스토그램, 파이차트 등)를 그리는 핵심 함수
    • 기본적으로 그림 창에 하나만 출력
    • ex) plot(), barplot(), boxplot(), hist(), pie()
  • 저수준 그래프 함수(Low-level Graphic)
    • 역할: 그래프를 장식(Decoration)하고 설명을 돕는 보조적인 함수 (점, 선, 좌표축, 문자 등을 추가)
    • ex) axis(), legend(), lines(), point(), text(), title(), par()
  • R은 기본 패키지 함수 외에도 고급 그래프를 제공하는 ggplot2 패키지를 많이 사용함 (그래프 함수 II에서 다룸)

 

plot() 함수

  • 일반적인 그래프 시각화 함수로 직선, 점 등 여러가지 형태의 플롯이 가능
  • 그래픽 관련해서 가장 많이 사용되는 고수준 그래프 함수로 분포도나 꺾은선 그래프 등을 그릴 수 있음
  • 호출 형식: plot(x, y, main=, sub=, xlab=, ylab=, type=, axes="", col="", pch=)
x <- c(29,14,9,26,15,13,28,24,17,4,19,22,2,25,8,6,16,18,21,30)
y <- c(9,3,26,27,10,21,8,4,28,24,5,6,22,29,20,25,12,1,2,15)
plot(x,y,main="plot의 전체 제목", sub="plot의 부 제목", xlab="x축의 제목", ylab="y축의 제목")

main: 제목, sub: 부제목, xlab: x축 제목, ylab: y축 제목

head(cars)
#   speed dist
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10
plot(cars, type="p", main="cars")

type: p는 점 플롯, main: 그래프 제목
type="l"로 했을 경우 선 그래프 출력

plot() 함수의 type 종류

  • p:
  • l:
  • b: 점과 선
  • o: 선이 점을 통과
  • h: 수직선으로 된 히스토그램
  • s: 계단형 그래프
  • S: 다른 계단형 그래프
  • n: 그래프 없음
  • type 옵션에서 점 모양을 표시하는 경우 pch의 번호와 종류는 다양한 도형을 표시

pch 점 종류

ex)

plot(cars, type="p", main="cars", pch=13)


par() 함수

  • 한 화면에 중복 그래프를 그리거나, 한 화면을 여러 영역으로 분할하여 다수의 그래프를 한 화면에 그릴 수 있는 환경을 제공
  • 그래프 출력 형식을 변경해주는 저수준 그래프 함수
  • (1) 한 화면에 중복 그래프 그리기
    • 고수준 그래프 함수를 이용한 그래프를 그릴 경우 par(new=T)를 사용하여 중복 그래프 작성
data <- c(5, 7, 3, 4, 5, 9, 10)
barplot(data)         # 막대 그래프 작성
par(new=T)            # 겹쳐서 출력 허용
plot(data, type="o")  # 선 그래프 작성

중복 그래프 출력 결과 (y의 범위가 잘 맞지 않음)

  • (2) 화면 분할 그래프 그리기
    • mfrow=c(nrows, ncols) mfcol=c(rnows, ncols) 옵션을 사용하여 한 화면을 nrows*ncols개의 여러 영역으로 분할
      • mfrow: 행 단위로 채움
      • mfcol: 열 단위로 채움
par(mfrow=c(3,3)) # 3x3으로 화면 분할, row(행) 단위로 채움
plot(x, y, main="Plot p-type", xlab="x-label", ylab="y-label", type="p")
plot(x, y, main="Plot l-type", xlab="x-label", ylab="y-label", type="l")
plot(x, y, main="Plot b-type", xlab="x-label", ylab="y-label", type="b")
plot(x, y, main="Plot c-type", xlab="x-label", ylab="y-label", type="c")
plot(x, y, main="Plot o-type", xlab="x-label", ylab="y-label", type="o")
plot(x, y, main="Plot h-type", xlab="x-label", ylab="y-label", type="h")
plot(x, y, main="Plot s-type", xlab="x-label", ylab="y-label", type="s")
plot(x, y, main="Plot S-type", xlab="x-label", ylab="y-label", type="S")
plot(x, y, main="Plot n-type", xlab="x-label", ylab="y-label", type="n")

화면 분할 출력
mfcol로 한 결과: col(열) 단위로 채워짐

 

barplot() 함수

  • 막대 그래프를 작성하는 고수준 그래프 함수
  • (1) 단순 막대 그래프
    • 'horiz=T'를 사용하여 가로형 막대 그래프를 표현
par(mfrow=c(2,1))               # 2x1 화면 분할
data <- c(5, 7, 3, 4, 5, 9, 10) 
barplot(data)                   # 세로형 막대 그래프
barplot(data, horiz=TRUE)       # 가로형 막대 그래프

  • (2) 다중 막대 그래프
    • 'beside=T'로 그룹 안의 값들을 옆으로 나란히 그리는 막대 그래프 표현 (기본값은 FALSE: 쌓아서 그리는 누적 막대 그래프
par(mfrow=c(3, 1))
data <- matrix(c(5, 9, 10, 3, 5, 7, 3, 4), nrow=4, ncol=2) # 행렬 자료구조
barplot(data)
barplot(data, beside=T)
barplot(data, beside=T, main="학생수", legend=c("1학년", "2학년","2학년","3학년"))

  • "legend=" 인수를 사용하여 범례를 표시할 수 있음

 

lines() 함수

  • 이미 떠 있는 그래프에 선 그래프를 추가(이중 선 그래프)로 작성하는 저수준 그래프 함수
    • plot() 함수로 그래프를 그려놓은 후 type을 "l", "o"을 사용하여 선 그래프를 추가
par(mfrow=c(1,1))
# 그래프 데이터 생성
x <- c(182, 190, 213, 205, 231, 250, 242)
# 선그래프 작성
plot(x, type = "o",col = "red", xlab = "년도", ylab = "억원", main = "매출현황")
y <- c(190, 180, 200, 210, 220, 234, 235) # 이중 선그래프 데이터 생성
lines(y, type = "b", col = "blue")        # 선(+점) 추가, 다중 선그래프

  • lty(line type)
    • "solid"(기본값) or 1: 실선
    • "dashed or 2: 대시선
    • "dotted" or 3: 점선
    • "dotdash" or 4: 점-대시 혼합선
    • "longdash" or 5: 긴 대시선
# 기존 그래프 만들기
x <- seq(0, 2 * pi, length = 100)
y <- sin(x)
plot(x, y, type = "l", col = "blue", lwd = 2, lty = "dotted") # 점선

# 새로운 선 추가
new_x <- seq(0, 2 * pi, length = 100)
new_y <- cos(new_x)
lines(new_x, new_y, col = "red", lwd = 2, lty = "dashed") # 대시선 추가

 

matplot() 함수

  • 한 번에 여러 선이나 점(다중 선 그래프)을 그려주는 고수준 그래프 함수
# 다중 그래프 데이터 생성
x <- c(182, 190, 213, 205, 231, 250, 242)
y <- c(190, 180, 200, 210, 220, 234, 235)
z <- c(195, 185, 190, 215, 220, 230, 225)
data <- cbind(x, y, z ) # 행렬 구성
matplot(data, type = "b", col=2:4, pch=1) # 다중 선그래프 작성
lnd <- c("2022년 매출", "2023년 매출", "2024년 매출") # 범례
legend("topleft", legend =lnd , col=2:4, pch=1)

legend로 범례 작성

 

abline() 함수

  • 이미 떠 있는 그래프 위에 직선을 추가할 때 쓰는 저수준 그래프 함수
  • $y=ax+b$ 형태의 직선이나 $y=h$ 형태의 가로로 그은 직선 또는 $x=v$ 형태의 세로로 그은 직선 그래프를 만듬
  • lty(선 스타일): 1(실선), 2(점선), 3(더점선)
  • lwd(선 굵기): 실수로 입력
  • col(색상): 1, 2, 3, 4 or black, red, blue, green

ex)

plot(cars, xlim=c(0, 25))
abline(a=-5, b=3.5, col="red") # y절편=-5, 기울기=3.5인 직선
abline(h=0, col="blue") # y=0 인 수평선을 그림
abline(v=0, col="green") # x=0 인 수직선을 그림
abline( a=0, b=1, col="purple") # y절편=0, 기울기=1인 직선

 

ex2)

# 데이터 생성
x <- c(1, 2, 3, 4, 5)
y <- c(10, 15, 13, 7, 20)
# 그래프 그리기
plot(x, y, type = "b", col = "blue", pch = 19, main = "point_line & abline")
# 그래프에 추가 요소 추가
abline(h = 10, col = "red", lty = 2, lwd = 3) # 가로선 추가
abline(v = 3, col = "green", lty = 3, lwd = 5) # 세로선 추가
legend("topright", legend = "points", col = "blue", pch = 19) # 범례 추가

 

pie() 함수

  • 파이차트를 작성하는 고수준 그래프 함수
    • "labels=" 인수를 사용하여 라벨을 표시할 수 있음
    • "radius=" 인수를 사용하여 반지름의 크기 정할 수 있음(default: 0.8)

ex)

data <- c(280, 170, 120, 100, 85)  # 매출액(억 원)
pie(data)                          # 파이 차트 작성
lbls <- c("서울", "부산", "경북", "전남", "충청")
pct <- round(data/sum(data)*100)   # 백분율 계산
lbls <- paste(lbls, pct)           # 라벨(labels)에 백분율(pct) 추가
# paste("서울", 37) → "서울 37" 이런 식으로 문자열을 합침.
lbls <- paste(lbls,"%",sep="")     # 라벨(labels)에 % 추가
pie(data, labels=lbls, radius=1.0) # 레이블 포함 파이 차트

 

hist() 함수

  • 히스토그램을 작성하는 고수준 그래프 함수
    • "freq=FALSE"을 사용할 경우 세로축 제목이 빈도가 아닌 밀도(density)로 표시
      (freq = TRUE (기본값) → 막대 높이 = 빈도, y축 제목은 "Frequency")

ex)

hist(cars$speed)

 

ex II)

x <- rnorm(300, mean=10, sd=2) # 평균이 10, 표준편차가 2인 300개의 난수 샘플을 생성
hist(x)                        # 히스토그램 작성
hist(x, freq=F)                # freq=F: 빈도가 아닌 밀도로 표시
lines(density(x))              # 확률밀도 히스토그램에 선 추가

xnorm으로 생성했기 때문에 매번 다름

 

히스토그램과 막대 그래프의 차이

  • 히스토그램은 연속형 데이터를 일정하게 나눈 구간(계급)을 가로 축으로, 각 구간에 해당하는 데이터수(도수)를 세로 축으로 그린 그래프
  • 히스토그램을 이용하면 구간별 관측치 분포 상태를 빠르게 확인할 수 있음

 

그래프 함수들(Summary)

  • 막대 그래프: 범주형 데이터의 수량이 많고 적음을 나타낼 때 적합한 그래프
  • 상자 그림: 데이터 분포에서 벗어난 극단의 데이터를 판단할 때 적합한 그래프
  • 히스토그램: 연속형 데이터를 일정하게 구간을 나누어 각 구간에 해당하는 데이터를 그린 그래프
  • 파이 차트: 원을 데이터 범주 구성에 비례에 따라 파이 조각 모양처럼 표현한 그래프
  • 줄기 잎 그림: 변수 값을 자릿수로 분류하여 시각화한 그래프, 데이터 전체 형태 파악 가능
  • 산점도: 두 변수 간의 관계를 점으로 나타낸 그래프

 

gapminder 데이터 분석

  • gapminder 데이터: 5개 대륙, 총 142개 국가에 대한 1952~2007년의 인구 데이터가 5년 간격으로 담겨 있음
    inatall.packages(“gapminder”)
    library(gapminder)
  • 인구 변화를 대륙별로 묶어 관찰
# 개별 국가를 대륙별로 묶어 관찰
y <- gapminder %>% group_by(year, continent) %>% summarize(c_pop=sum(pop))
# 대륙별로 각자 다른 color(col), shape(pch)
plot(y$year, y$c_pop, col=y$continent, pch=c(1:length(levels(y$continent))))
# topleft에 범례를 표시
legend("topleft", legend=levels(y$continent), 
       pch=c(1:length(levels(y$continent))), col=c(1:length(levels(y$continent))))

  • 아시아 대륙의 인구가 특히 급격히 증가하는 추세를 시각적으로 확인함으로써 미래의 경향도 어느 정도 추측해볼 수 있음
  • 즉, 시각화된 결과는 직관적인 예측을 유도하는 역할도 함