벼락치기 연구소
R컴퓨팅
1강 ~ 11강
R 프로그래밍 기초 (1)
💡 R 프로그램이란?
R은 통계 컴퓨팅과 그래픽을 위한 프로그래밍 언어이자 소프트웨어 환경이야.
뉴질랜드 오클랜드 대학의 로버트 젠틀맨(Robert Gentleman)과 로스 이하카(Ross Ihaka)가 S 언어를 기반으로 개발했어.
R의 강점
- 오픈소스 (GNU GPL) - 무료
- CRAN: 15,000+ 패키지
- 강력한 시각화 (ggplot2, plotly)
- 대화형 프로그래밍 환경
R의 한계
- 대용량 데이터 처리 속도 느림
- 메모리 제약
- 패키지 간 품질 차이
시험 포인트: R의 활용 분야 — 금융, 제약, 생명과학, 마케팅, 사회과학 등 다양한 분야에서 데이터 분석 플랫폼으로 활용됨
📥 R 설치와 실행
CRAN(Comprehensive R Archive Network)에서 R을 다운로드할 수 있어.
주소: http://www.r-project.org
R 프로그램 실행 순서
- 바탕화면 아이콘 더블클릭 → R 콘솔(Console) 창 열림
- 프롬프트(
>) 뒤에 명령어 입력 - Enter 키로 결과 확인
예시: 기본 사칙연산
> 1 + 2 [1] 3 > 1 * 2 [1] 2 > 1 / 2 [1] 0.5
📝 변수 할당과 기본 활용
R에서는 <- 또는 =를 사용해서 변수에 값을 할당해.
예시: 변수 할당과 연산
> a <- 1 > b <- 2 > a + b [1] 3
변수 이름 규칙
| 규칙 | 설명 |
|---|---|
| 사용 가능 문자 | a~z, A~Z, 0~9, ., _ |
| 첫 글자 제한 | 숫자와 _로 시작 불가 |
| 대소문자 | 구분됨 (myVar ≠ myvar) |
예시: 세미콜론으로 한 줄에 여러 명령
> a = 1; b = 2; a + b [1] 3
스크립트 편집기: '파일' → '새 스크립트'로 R 편집기를 열고, 여러 명령문을 작성/실행할 수 있어. 단축키: Ctrl + R (선택영역 실행)
🗂️ 데이터 타입
| 타입 | 설명 | 예시 |
|---|---|---|
| 숫자형 (numeric) | 정수와 실수 모두 포함 | 3, 3.14 |
| 문자형 (character) | 텍스트 데이터 | "hello", 'R' |
| 논리형 (logical) | 참/거짓 | TRUE, FALSE |
핵심: R의 강점은 단순 연산이 아니라, 객체에 값을 할당하고 함수들을 사용하여 객체들을 다루고 분석하는 데 있어!
📌 1강 핵심 정리
- R은 통계 컴퓨팅 + 그래픽 전용 프로그래밍 언어 (오픈소스)
- CRAN에서 설치, 콘솔에서 대화형으로 명령 실행
<-또는=로 변수에 값 할당- 스크립트 편집기로 여러 명령을 저장·실행
- 데이터 타입: 숫자형, 문자형, 논리형
R 프로그래밍 기초 (2)
📂 작업폴더와 작업공간
작업폴더 관련 함수
| 함수 | 기능 |
|---|---|
getwd() | 현재 작업 폴더 확인 |
setwd("경로") | 작업 폴더 변경 |
ls() | 현재 생성된 객체 목록 확인 |
rm(x) | 특정 객체 삭제 |
rm(list=ls()) | 모든 객체 삭제 |
작업공간 저장/불러오기
> save.image(file = "mydata.RData") # 저장 > load(file = "mydata.RData") # 불러오기
📦 패키지 설치와 활용
패키지란 특정 분석을 수행할 수 있는 함수, 객체, 도움말, 데이터 등의 집합이야.
패키지 관련 함수
| 함수 | 기능 |
|---|---|
install.packages("패키지명") | 패키지 설치 |
library(패키지명) | 패키지 불러오기 (활성화) |
packageVersion("패키지명") | 버전 확인 |
update.packages() | 패키지 업데이트 |
예시: tidyverse 패키지 사용
> install.packages("tidyverse")
> library(tidyverse)
> AirPassengers %>% log() %>% aggregate() %>% plot()
파이프 연산자: %>%(tidyverse) 또는 |>(R 4.0+) — 왼쪽 결과를 오른쪽 함수의 첫 번째 인수로 전달
🖥️ RStudio
RStudio는 R의 사용 편의성을 강화한 IDE(통합개발환경)로, 현재 Posit으로 사명이 변경됐어.
RStudio 화면 구성
| 위치 | 구성 요소 |
|---|---|
| 좌측 상단 | 편집기 (스크립트 작성) |
| 좌측 하단 | R 콘솔 (명령 실행) |
| 우측 상단 | 작업공간(Workspace) / 작업이력(History) |
| 우측 하단 | Files / Plots / Packages / Help |
단축키: Ctrl + Enter = 선택 코드 실행, Ctrl + Shift + N = 새 스크립트
📌 2강 핵심 정리
setwd()/getwd()로 작업폴더 관리install.packages()로 설치,library()로 활성화- 파이프 연산자(
%>%/|>)로 함수 체이닝 - RStudio = R의 편의 IDE (코드 작성 + 실행 + 시각화 + 패키지 관리)
데이터 입출력
⌨️ 데이터 입력 함수
c() 함수 — 가장 기본적인 벡터 생성
> x <- c(1, 2, 3, 4, 5) # 숫자형 벡터
> x1 <- c("a", "b", "c") # 문자형 벡터
> x2 <- c(T, F, T, T) # 논리형 벡터
scan() 함수 — 대화식 입력
> z1 <- scan() # 숫자 입력 후 빈 줄에서 Enter로 종료 > z2 <- scan(what=" ") # 문자형 데이터 입력
edit() 함수 — 데이터 편집기 창
> dat1 <- data.frame() > dat1 <- edit(dat1) # 스프레드시트 형태로 편집
📄 데이터 불러오기
| 함수 | 용도 | 핵심 옵션 |
|---|---|---|
read.table() | 공백/탭 구분 파일 | header=T, sep="," |
read.csv() | CSV 파일 | sep=",", header=T 기본값 |
scan() | 외부 파일 읽기 | what, skip, sep |
예시: 외부 파일 불러오기
> read.table("example1.txt", header=T)
> read.csv("data.csv")
> setwd("C:/data") # 작업경로 지정 후 파일명만으로 불러오기
주의: 경로 구분자는 Windows에서도 / 또는 \\를 사용해야 해!
💾 데이터 저장하기
| 함수 | 용도 |
|---|---|
write.table() | 텍스트 파일로 저장 |
write.csv() | CSV 파일로 저장 |
save() | R 객체를 .RData로 저장 |
📌 3강 핵심 정리
c(): 벡터 생성의 기본 함수read.table():header와sep옵션이 핵심read.csv(): CSV 전용 (sep=","가 기본값)- 작업경로를
setwd()로 지정하면 파일명만으로 불러오기 가능
R 데이터 구조 (1) — 벡터와 행렬
🔢 벡터(Vector)
벡터는 1개 이상의 원소로 구성된 R의 가장 기본 자료 객체야. 하나의 벡터 안에는 한 가지 형태(mode)만 가능해.
벡터 생성 함수
| 함수 | 용도 | 예시 |
|---|---|---|
c() | 원소를 직접 나열 | c(3, 4, 5, 6, 7) |
seq() | 수열 생성 (from, to, by) | seq(3, 7, 1) |
rep() | 반복 벡터 생성 | rep(1:2, times=3) |
scan() | 대화식 입력 | scan() |
seq() 함수 활용
> seq(from=3, to=7, by=1) # [1] 3 4 5 6 7 > seq(from=3, to=7, length=3) # [1] 3 5 7 > seq(from=1, by=0.05, along=1:5) # [1] 1.00 1.05 1.10 1.15 1.20
rep() 함수 활용
> rep(c(1,2), times=2) # [1] 1 2 1 2 > rep(c(2,4), each=2) # [1] 2 2 4 4 > rep(c(2,4,8), length=5) # [1] 2 4 8 2 4
✂️ 벡터 자료 편집
| 방법 | 설명 | 예시 |
|---|---|---|
[ ] 추출 | 인덱스로 원소 추출 | v1[c(3,5)] |
[ ] 조건 | 조건으로 필터링 | v1[v1 > 15] |
[-c()] 삭제 | 특정 위치 제외 | v1[-c(2,4)] |
replace() | 일부 자료 대체 | replace(v, 2, 99) |
append() | 자료 삽입 | append(v, 10, after=3) |
sort() | 오름차순 정렬 | sort(v, decreasing=F) |
rank() | 순위 출력 | rank(v) |
order() | 정렬 시 위치값 | order(v) |
📊 행렬(Matrix)
행렬은 행(row)과 열(column)로 구성된 2차원 자료 구조야. 벡터와 마찬가지로 한 가지 형태(mode)만 가능해.
행렬 생성
> matrix(1:6, nrow=2, ncol=3) # 2x3 행렬 > matrix(1:6, nrow=2, byrow=TRUE) # 행 우선 채우기 > rbind(c(1,2,3), c(4,5,6)) # 행 결합 > cbind(c(1,4), c(2,5), c(3,6)) # 열 결합
행렬 속성 함수
| 함수 | 기능 |
|---|---|
nrow() / ncol() | 행/열 개수 |
dim() | 차원 확인 |
t() | 전치행렬 |
det() | 행렬식 |
solve() | 역행렬 |
핵심: *는 원소별 곱셈, %*%는 수학적 행렬 곱셈 — 완전히 다른 결과!
📌 4강 핵심 정리
- 벡터: R의 가장 기본 자료 객체, 한 가지 타입만 가능
c(),seq(),rep()으로 벡터 생성[ ]로 추출/삭제,sort()/rank()/order()로 정렬matrix(),rbind(),cbind()로 행렬 생성*(원소별) vs%*%(행렬 곱) 구분 필수!
R 데이터 구조 (2)
🧊 배열(Array)
배열은 행렬을 2차원 이상으로 확장한 객체야. 3차원 배열 = 행렬 여러 개를 겹쳐 놓은 것!
배열 생성
> arr <- array(1:24, c(3, 3, 2)) # 3행 3열 행렬 2개 > dim(arr) # [1] 3 3 2 > arr[,,1] # 첫 번째 행렬만 추출 > arr[1,1,] # 1행 1열의 모든 행렬
| 속성 | 함수 | 설명 |
|---|---|---|
| 개수 | length(arr) | 전체 원소 수 |
| 형태 | mode(arr) | 데이터 타입 |
| 차원 | dim(arr) | 각 차원 크기 |
| 이름 | dimnames(arr) | 각 차원 이름 |
📋 리스트(List)
서로 다른 형태(mode)의 데이터로 구성 가능! 벡터·행렬과 달리 성분마다 타입과 길이가 달라도 돼.
리스트 생성과 추출
> newlist <- list(1:10, 11:15, "string") > newlist[[1]] # 첫 번째 성분 추출 (벡터) > newlist[[2]][3] # 두 번째 성분의 3번째 원소 > newlist$name # 이름이 있으면 $ 연산자로 접근
핵심 구분: [[ ]] = 성분(component) 추출, [ ] = 성분 내 원소 추출, $ = 이름으로 접근
📊 데이터프레임(Data Frame)
데이터프레임은 열(변수)마다 다른 타입이 가능한 2차원 구조야. 통계 분석에서 가장 많이 사용되는 형태!
데이터프레임 생성
> df <- data.frame(
+ name = c("Kim", "Lee", "Park"),
+ score = c(85, 90, 78),
+ pass = c(TRUE, TRUE, FALSE)
+ )
> df$name # 열 접근
> df[1, ] # 1행 추출
> df[, 2] # 2열 추출
벡터/행렬/배열
같은 타입만 가능
리스트
다른 타입 + 다른 길이 가능
데이터프레임
열마다 다른 타입, 행 길이 동일
📌 5강 핵심 정리
- 배열: 행렬의 다차원 확장,
array()로 생성 - 리스트: 서로 다른 타입·길이의 성분 저장 가능
- 데이터프레임: 열마다 다른 타입 가능, 통계 분석의 핵심 구조
[[ ]]vs[ ]vs$접근법 구분
Tidyverse와 Tibble
🌐 Tidyverse 생태계
Tidyverse는 데이터 과학을 위해 자주 쓰이는 패키지를 묶어 제공하는 통합 생태계야.
Tidyverse 핵심 패키지
| 패키지 | 기능 |
|---|---|
dplyr | 데이터 편집과 가공 |
ggplot2 | 데이터 시각화 |
tidyr | tidy 구조로 변환 |
readr | CSV 등 빠르게 읽기 |
tibble | 개선된 데이터프레임 |
stringr | 문자열 처리 |
forcats | 범주형(factor) 데이터 |
purrr | 함수형 프로그래밍 |
lubridate | 날짜/시간 처리 |
📐 Tibble: 개선된 데이터프레임
tibble은 기존 data.frame의 한계를 극복한 개선된 구조야.
data.frame
- 문자열 → factor 자동 변환
- 전체 데이터 출력
- 변수명 자동 수정
tibble
- 문자열 그대로 character
- 화면 크기에 맞게 요약 출력
- 사용자 지정 열 이름 보존
tibble 생성
> tb1 <- tibble(학번 = 101:103, 국어 = c(85,90,78), 수학 = c(92,88,81)) > tb1 # A tibble: 3 x 3 학번 국어 수학 <int> <dbl> <dbl> 1 101 85 92 2 102 90 88 3 103 78 81
변환 함수
| 함수 | 방향 |
|---|---|
as_tibble(df) | data.frame → tibble |
as.data.frame(tb) | tibble → data.frame |
📌 6강 핵심 정리
- Tidyverse = 데이터 과학 패키지 통합 생태계
- tibble은 data.frame의 개선판 (문자열 보존, 요약 출력)
tibble(): 열 단위 생성,tribble(): 행 단위 생성as_tibble()/as.data.frame()으로 상호 변환
readr과 dplyr
📥 readr 패키지 — 데이터 불러오기/저장하기
readr은 데이터를 tibble 형태로 빠르게 읽어오는 패키지야.
읽기 함수
| 함수 | 구분자 | 용도 |
|---|---|---|
read_csv() | 콤마 , | CSV 파일 |
read_tsv() | 탭 \t | TSV 파일 |
read_delim() | 사용자 지정 | 임의 구분자 |
read_table() | 공백 | 공백 구분 파일 |
쓰기 함수
| 함수 | 용도 |
|---|---|
write_csv() | CSV로 저장 |
write_tsv() | TSV로 저장 |
write_delim() | 임의 구분자로 저장 |
read.csv() vs read_csv(): read_csv()는 tibble로 반환하고, 문자열을 factor로 변환하지 않아!
🔧 dplyr 패키지 — 데이터 다루기
dplyr은 직관적인 문법으로 데이터를 선택, 필터링, 정렬, 요약, 변환하는 패키지야.
dplyr 핵심 함수
| 함수 | 기능 | 예시 |
|---|---|---|
filter() | 조건에 맞는 행 추출 | filter(df, score > 80) |
select() | 특정 열 선택 | select(df, name, score) |
arrange() | 정렬 | arrange(df, desc(score)) |
mutate() | 새 열 추가/변환 | mutate(df, grade = score/10) |
summarise() | 요약 통계 | summarise(df, avg = mean(score)) |
파이프 연산자와 dplyr 조합
> storms %>% + filter(wind >= 100, pressure <= 950) %>% + select(name, year, wind, pressure) %>% + arrange(desc(wind))
📌 7강 핵심 정리
- readr:
read_csv()/read_tsv()/read_delim()으로 tibble 형태 읽기 - dplyr 5대 함수:
filter,select,arrange,mutate,summarise - 파이프(
%>%)와 결합하면 여러 단계를 자연스럽게 연결
연산자와 내장 함수
➕ 산술 연산자
R의 모든 일반 연산자는 Componentwise(같은 위치 원소끼리) 연산이야!
| 연산자 | 기능 | 비고 |
|---|---|---|
+ | 덧셈 | Componentwise |
- | 뺄셈 | Componentwise |
* | 곱셈 | 원소별 곱 (행렬도!) |
/ | 나눗셈 | Componentwise |
^ | 거듭제곱 | Componentwise |
%/% | 정수 나눗셈 (몫) | 소수점 이하 버림 |
%*% | 행렬 곱 | 수학적 행렬 곱셈 |
시험 핵심: *(원소별 곱)과 %*%(행렬 곱)은 완전히 다른 결과! 0으로 나누면 Inf 또는 NaN 출력
⚖️ 비교 연산자와 논리 연산자
비교 연산자
| 연산자 | 의미 |
|---|---|
== | 같다 |
!= | 같지 않다 |
<, <= | 작다, 작거나 같다 |
>, >= | 크다, 크거나 같다 |
논리 연산자
| 연산자 | 용도 |
|---|---|
&& | AND (스칼라용) |
& | AND (벡터용) |
|| | OR (스칼라용) |
| | OR (벡터용) |
주의: ==(비교)와 =(할당) 구분 필수! 벡터에는 반드시 &/|(하나)를 사용 — &&/||(두 개)는 에러 발생!
🔗 집합 연산
R에서 벡터를 집합으로 간주하여 연산할 수 있어.
| 함수 | 기능 | 주의 |
|---|---|---|
union(x, y) | 합집합 (중복 제거) | |
intersect(x, y) | 교집합 | |
setdiff(x, y) | 차집합 | 순서에 따라 결과 다름! |
setequal(x, y) | 같은 집합인지 판단 | 논리값 반환 |
%in% | 원소 포함 여부 | 논리값 반환 |
choose(n, k) | 조합 (nCk) |
핵심: setdiff(x, y) ≠ setdiff(y, x) — 순서가 바뀌면 결과도 달라져!
🧮 내장 함수
수치형 함수
pi | 원주율 상수 |
log(x) | 자연로그 |
log10(x) | 상용로그 |
exp(x) | 지수함수 |
sqrt(x) | 제곱근 |
sin, cos, tan | 삼각함수 |
통계 함수
mean(x) | 평균 |
sd(x) | 표준편차 |
var(x) | 분산 |
median(x) | 중위수 |
quantile(x, p) | p분위수 |
cor(x, y) | 상관계수 |
최솟값/최댓값 함수
| 함수 | 동작 | 결과 |
|---|---|---|
min(x) / max(x) | 전체에서 최솟/최댓값 | 스칼라 1개 |
range(x) | 최솟값 + 최댓값 | 길이 2 벡터 |
pmin(x1, x2) / pmax(x1, x2) | 같은 위치끼리 비교 | 벡터 반환 |
📌 8강 핵심 정리
- R 연산은 기본적으로 Componentwise (같은 위치 원소끼리)
- 행렬 곱(
%*%)만 유일하게 수학적 행렬 곱셈 - 비교:
==(두 개) vs 할당:=(한 개) 구분 - 논리: 스칼라는
&&/||, 벡터는&/| setdiff는 순서에 따라 결과가 달라짐
조건문, 반복문, 함수
🔀 조건문 (Conditional Statements)
if / if-else 조건문
# 기본 if
if (조건) {
실행문
}
# if-else
if (조건) {
실행문1
} else {
실행문2
}
ifelse() 함수 — 벡터화된 조건문
ifelse(조건, 참일 때 값, 거짓일 때 값) # 중첩 가능 (구간 분류) ifelse(temp > 30, "hot", ifelse(temp > 15, "mild", "cold"))
switch 문
switch(매개변수, 이름1 = 실행1, 이름2 = 실행2, ... )
핵심 차이: if/else = 스칼라 조건, ifelse() = 벡터 각 원소별 판단!
🔄 반복문 (Loop Statements)
for 문
for (i in 1:5) {
print(i)
}
시점/종점 명확, 가장 많이 사용
while 문
i <- 1
while (i <= 5) {
print(i)
i <- i + 1
}
조건이 TRUE인 동안 반복
repeat 문
i <- 1
repeat {
print(i)
i <- i + 1
if (i > 5) break
}
break 필수! 없으면 무한루프
| 구분 | for | while | repeat |
|---|---|---|---|
| 초기값 | 자동 (in) | 직접 선언 | 직접 선언 |
| 종료 조건 | 범위 끝 | 조건 FALSE | break |
| i 업데이트 | 자동 | 직접 | 직접 |
| 무한루프 위험 | 낮음 | 중간 | 높음 |
🚦 break와 next
break
루프를 즉시 탈출
중첩 루프에서는 안쪽(inner) 루프만 탈출
next
현재 반복만 건너뛰기
다음 반복으로 바로 진행 (루프 계속)
예시: break와 next 활용
# break: 누적합이 25 초과하면 탈출
x <- 0
for (i in 1:10) {
x <- x + i
if (x > 25) break
}
# next: 8 미만은 건너뛰고 8 이상만 출력
for (i in 1:10) {
if (i < 8) next
print(i)
}
🛠️ 사용자 정의 함수
함수 생성 구문
함수이름 <- function(매개변수) {
함수 몸체 (실행 코드)
return(결과값)
}
효율성
긴 코드를 한 줄 호출
유연성
수정/보완 용이
가독성
코드 이해 용이
재사용성
한번 정의 → 계속 호출
📌 9강 핵심 정리
| 구문 | 특징 | 사용 시점 |
|---|---|---|
if/else | 조건 분기 | 단순 참/거짓 분기 |
ifelse() | 벡터화된 조건 | 벡터 각 원소별 판단 |
switch | 다중 매칭 | 여러 케이스 중 선택 |
for | 범위 반복 | 시점/종점 명확 |
while | 조건 반복 | 종료 시점이 조건 의존 |
repeat | 무한 반복+break | break 조건으로 탈출 |
break | 루프 탈출 | 조기 종료 필요 시 |
next | 건너뛰기 | 특정 조건 무시 |
단일 변수 데이터 시각화
📈 단일 변수 시각화의 목적
변수가 1개인 데이터의 분포, 중심, 산포를 시각적으로 파악하는 거야.
| 확인 사항 | 설명 |
|---|---|
| 분포 (Distribution) | 값들이 어떻게 퍼져 있는지 |
| 중심 위치 | 평균, 중앙값의 위치 |
| 산포도 | 평균 주위로 얼마나 흩어졌는지 |
| 치우침 (Skewness) | 좌/우로 꼬리가 긴지 |
| 이상치 (Outlier) | 전체 분포에서 동떨어진 값 |
📊 막대 그림과 원형 그림
barplot() — 막대 그림
barplot(height, names, col, beside=T, horiz=F, main="제목")
용도: 범주별 크기 비교
pie() — 원형 그림
pie(x, labels, col, main="제목")
용도: 전체 대비 비율 표현
📉 히스토그램과 상자 그림
hist() — 히스토그램
hist(x, breaks=10, col="skyblue", main="제목", xlab="X축")
용도: 연속형 변수의 분포 확인
breaks: 구간 수 조절
boxplot() — 상자 그림
boxplot(x, main="제목")
구성요소:
- 상자: Q1(25%) ~ Q3(75%)
- 중앙선: 중앙값(Median)
- 수염: Q1-1.5xIQR ~ Q3+1.5xIQR
- 점: 이상치(Outlier)
🖼️ 그래픽 레이아웃
par(mfrow) — 그래프 분할 배치
par(mfrow = c(1, 2)) # 1행 2열 (좌우 나란히) par(mfrow = c(2, 1)) # 2행 1열 (위아래) par(mfrow = c(2, 2)) # 2행 2열 (4분할)
함수 실행 순서대로 각 공간에 배치됨
📌 10강 핵심 정리
| 그래프 | 함수 | 적합한 데이터 | 주요 확인 |
|---|---|---|---|
| 막대 그림 | barplot() | 범주형 | 범주별 크기 비교 |
| 원형 그림 | pie() | 범주형 | 전체 대비 비율 |
| 히스토그램 | hist() | 연속형 | 분포 모양, 치우침 |
| 상자 그림 | boxplot() | 연속형 | 중앙값, IQR, 이상치 |
두 변수 간 관계 시각화
🔵 산점도와 plot() 함수
산점도(Scatter Plot)는 두 변수 간 관계를 파악하는 가장 기초적이고 중요한 그래프야. 모형 적합(fitting) 전에 반드시 먼저 그려봐야 해!
plot() 기본 문법
plot(x, y, main="제목", xlab="X축", ylab="Y축", sub="부제목")
type 옵션 — 그래프 형태
| type | 설명 |
|---|---|
"p" | 점(Point) — 기본값 |
"l" | 선(Line) — 점을 선으로 연결 |
"b" | Both — 점과 선 모두 |
"o" | 점을 통과하는 선 |
"h" | 히스토그램형 막대 |
"s" | 계단(Step)형 |
"n" | 공백 (이후 커스텀용) |
핵심: type="n"으로 빈 그래프를 만든 후, points()/lines()로 커스텀하면 깔끔해!
🎨 부가 그래픽 함수
기본 plot() 위에 추가로 덧그리는 함수들이야.
| 함수 | 기능 | 주요 옵션 |
|---|---|---|
points(x, y) | 점 추가 | pch=모양(0~25), cex=크기 |
lines(x, y) | 선 추가 | lty=종류, col=색, lwd=굵기 |
text(x, y) | 텍스트 추가 | 특정 좌표에 문자열 표시 |
abline() | 직선 추가 | h=수평선, v=수직선, lm()=회귀선 |
curve() | 함수 곡선 | add=TRUE로 겹쳐 그리기 |
예시: curve() 활용
curve(sin(x), from=0, to=2*pi, col="blue", lwd=2) curve(x^2, add=TRUE, col="red") # 기존 위에 겹쳐 그리기
plot 옵션 vs 별도 함수: plot 옵션은 생성 시 설정 (디폴트 제한적), 별도 함수는 생성 후 추가 (모양/크기/색상 자유 조절, 겹치기 가능)
🖼️ layout() 함수
par(mfrow)보다 유연한 레이아웃을 설계할 수 있어!
layout() vs par(mfrow)
| 기능 | par(mfrow) | layout() |
|---|---|---|
| 분할 | 균등 분할만 | 불균등 분할 가능 |
| 크기 조절 | 불가 | widths, heights로 비율 지정 |
| 영역 병합 | 불가 | 행렬로 설계 가능 |
예시: layout() 활용
# 1번 그래프는 위쪽 전체, 2·3번은 아래쪽 좌우 분할
layout(matrix(c(1,1,2,3), 2, 2, byrow=TRUE),
widths=c(3,1), heights=c(1,2))
📌 11강 핵심 정리
- 산점도(
plot)는 두 변수 관계 탐색의 첫 단계 — 모형 적합 전 필수 type옵션으로 그래프 형태 변경 (p, l, b, o, h, s, n)type="n"+points()/lines()조합으로 깔끔한 커스텀curve(add=TRUE)로 이론적 함수를 데이터 위에 겹쳐 표현par(mfrow): 균등 분할,layout(): 유연한 레이아웃