R컴퓨팅

벼락치기 연구소

R컴퓨팅

1강 ~ 11강

1

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 프로그램 실행 순서

  1. 바탕화면 아이콘 더블클릭 → R 콘솔(Console) 창 열림
  2. 프롬프트(>) 뒤에 명령어 입력
  3. 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강 핵심 정리

  1. R은 통계 컴퓨팅 + 그래픽 전용 프로그래밍 언어 (오픈소스)
  2. CRAN에서 설치, 콘솔에서 대화형으로 명령 실행
  3. <- 또는 =로 변수에 값 할당
  4. 스크립트 편집기로 여러 명령을 저장·실행
  5. 데이터 타입: 숫자형, 문자형, 논리형
2

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강 핵심 정리

  1. setwd() / getwd()로 작업폴더 관리
  2. install.packages()로 설치, library()로 활성화
  3. 파이프 연산자(%>% / |>)로 함수 체이닝
  4. RStudio = R의 편의 IDE (코드 작성 + 실행 + 시각화 + 패키지 관리)
3

데이터 입출력

⌨️ 데이터 입력 함수

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강 핵심 정리

  1. c(): 벡터 생성의 기본 함수
  2. read.table(): headersep 옵션이 핵심
  3. read.csv(): CSV 전용 (sep=","가 기본값)
  4. 작업경로를 setwd()로 지정하면 파일명만으로 불러오기 가능
4

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강 핵심 정리

  1. 벡터: R의 가장 기본 자료 객체, 한 가지 타입만 가능
  2. c(), seq(), rep()으로 벡터 생성
  3. [ ]로 추출/삭제, sort()/rank()/order()로 정렬
  4. matrix(), rbind(), cbind()로 행렬 생성
  5. *(원소별) vs %*%(행렬 곱) 구분 필수!
5

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강 핵심 정리

  1. 배열: 행렬의 다차원 확장, array()로 생성
  2. 리스트: 서로 다른 타입·길이의 성분 저장 가능
  3. 데이터프레임: 열마다 다른 타입 가능, 통계 분석의 핵심 구조
  4. [[ ]] vs [ ] vs $ 접근법 구분
6

Tidyverse와 Tibble

🌐 Tidyverse 생태계

Tidyverse는 데이터 과학을 위해 자주 쓰이는 패키지를 묶어 제공하는 통합 생태계야.

Tidyverse 핵심 패키지

패키지기능
dplyr데이터 편집과 가공
ggplot2데이터 시각화
tidyrtidy 구조로 변환
readrCSV 등 빠르게 읽기
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강 핵심 정리

  1. Tidyverse = 데이터 과학 패키지 통합 생태계
  2. tibble은 data.frame의 개선판 (문자열 보존, 요약 출력)
  3. tibble(): 열 단위 생성, tribble(): 행 단위 생성
  4. as_tibble() / as.data.frame()으로 상호 변환
7

readr과 dplyr

📥 readr 패키지 — 데이터 불러오기/저장하기

readr은 데이터를 tibble 형태로 빠르게 읽어오는 패키지야.

읽기 함수

함수구분자용도
read_csv()콤마 ,CSV 파일
read_tsv()\tTSV 파일
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강 핵심 정리

  1. readr: read_csv()/read_tsv()/read_delim()으로 tibble 형태 읽기
  2. dplyr 5대 함수: filter, select, arrange, mutate, summarise
  3. 파이프(%>%)와 결합하면 여러 단계를 자연스럽게 연결
8

연산자와 내장 함수

산술 연산자

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강 핵심 정리

  1. R 연산은 기본적으로 Componentwise (같은 위치 원소끼리)
  2. 행렬 곱(%*%)만 유일하게 수학적 행렬 곱셈
  3. 비교: ==(두 개) vs 할당: =(한 개) 구분
  4. 논리: 스칼라는 &&/||, 벡터는 &/|
  5. setdiff는 순서에 따라 결과가 달라짐
9

조건문, 반복문, 함수

🔀 조건문 (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 필수! 없으면 무한루프

구분forwhilerepeat
초기값자동 (in)직접 선언직접 선언
종료 조건범위 끝조건 FALSEbreak
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무한 반복+breakbreak 조건으로 탈출
break루프 탈출조기 종료 필요 시
next건너뛰기특정 조건 무시
10

단일 변수 데이터 시각화

📈 단일 변수 시각화의 목적

변수가 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, 이상치
11

두 변수 간 관계 시각화

🔵 산점도와 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강 핵심 정리

  1. 산점도(plot)는 두 변수 관계 탐색의 첫 단계 — 모형 적합 전 필수
  2. type 옵션으로 그래프 형태 변경 (p, l, b, o, h, s, n)
  3. type="n" + points()/lines() 조합으로 깔끔한 커스텀
  4. curve(add=TRUE)로 이론적 함수를 데이터 위에 겹쳐 표현
  5. par(mfrow): 균등 분할, layout(): 유연한 레이아웃
버그 제보 & 문의하기