Introduction

FMB819: R을 이용한 데이터분석

고려대학교 경영대학 정지웅

Welcome to FMB 819!

  • 수업의 목표

    1. 통계 소프트웨어 R과 친숙해지고,
    2. 데이터를 수집, 가공, 표현할 수 있으며
    3. 기본적 통계 개념 이해하여
    4. 데이터 분석의 결과를 해석할 수 있다.

데이터 분석의 목표

  1. 기술 요약(Description): 현상을 설명
  2. 예측(Prediction): 관측되지 않는 값을 예측
  3. 인과 관계(Causality): 한 변수가 다른 변수에 미치는 영향 분석
  • 많은 경우 의사 결정을 위해서 기술/예측/인과 관계를 조합적으로 파악할 필요

R이란?

R이란?

  • R은 강력한 통계 및 그래픽 기능을 갖춘 프로그래밍 언어.

    1. 오픈소스(open source)
    2. 데이터 정리, 시각화, 기계학습 등 거의 모든 분석 가능.
    3. 활발한 온라인 커뮤니티, 대부분의 문제에 대한 해결책 존재.
  • R의 많은 기능들 중 우리가 주로 사용할 기능

    • 데이터 수집: 웹에서 데이터 직접 불러오기

    • 데이터 가공: 데이터 정리, 변환, 요약

    • 데이터 시각화: 고급 그래프와 차트 생성

    • 통계 분석: 회귀분석, 가설검정 등 다양한 통계 기법 적용

금융 데이터

  • 데이터의 폭발적 증가: 틱(Tick) 데이터, 대체 데이터(Alternative Data), 비정형 뉴스 텍스트 등 엑셀로 처리하기 힘듬.
  • 엑셀의 한계:
    • 인적 오류: 복잡한 수식과 매크로는 추적이 어려움.
    • 재현성(Reproducibility) 부족: 데이터 업데이트 시 매번 수작업으로 복사/붙여넣기를 반복.
  • 강력한 통계 엔진과 프로그래밍이 결합된 R이 유용.

1. 재현성과 업무 자동화

  • R은 “데이터 수집 → 전처리 → 분석 → 시각화 → 보고서 작성”의 전 과정을 하나의 코드 파이프라인으로 통합.
  • 자동화된 보고서 생성: R Markdown과 Quarto를 이용해 매주/매월 자동으로 업데이트되는 보고서 작성 가능.
  • 알고리즘 트레이딩: R로 작성한 트레이딩 알고리즘을 API와 연동하여 실시간으로 거래 실행 가능.
library(tidyquant)
library(ggplot2)
# 1. 삼성전자(005930.KS) 최근 1년 주가 수집
samsung <- tq_get("005930.KS", from = Sys.Date() - 365)
# 2. ggplot을 이용한 시각화 (autoplot 대신 사용)
samsung %>%
  ggplot(aes(x = date, y = close)) +
  geom_line(color = "darkblue", linewidth = 1) +
  labs(title = "Samsung (recent 1 year)", 
       x = "Date", 
       y = "Close Price (KRW)") +
  theme_tq() # 금융 데이터에 어울리는 깔끔한 테마

2. 금융에 적합한 생태계

파이썬(Python)이 범용 프로그래밍 언어라면, R은 통계와 데이터 분석을 위해 만든 ‘데이터를 위한 언어’

  • 퀀트 투자, 리스크 관리, 알고리즘 트레이딩 분야에서 광범위하게 사용.
  • 금융 생태계: 수백 개의 전용 패키지 존재.
  • 시스템 개발이나 거대한 AI 모델 구축이 목적이 아니라면, 주어진 금융 데이터를 빠르게 탐색하고, 통계적으로 엄밀하게 분석하며, 설득력 있는 보고서를 만드는 데는 R이 유용.

3. 시각화 및 커뮤니케이션

  • ggplot2 R의 시각화 생태계는 글로벌 언론사(NYT, BBC 등)와 헤지펀드에서 사용할 만큼 유연하고 미려함.
  • Quarto 분석한 결과를 클릭 한 번으로 PDF, HTML, PPT 보고서로 변환 (지금 보는 이 슬라이드처럼).
  • Shiny를 통해 직접 조작해볼 수 있는 ‘인터랙티브 웹 대시보드’ 구축.

Finance MBA가 R을 무기로 삼아야 하는 이유

  1. 단순 엑셀 모델러를 넘어, 대용량 데이터를 다루는 역량.
  2. 수작업 리포팅에 낭비되는 시간을 줄이고, 중요한 문제에 시간을 쏟을 수 있음.
  3. 최신 통계 및 기계학습 모델을 금융 데이터에 즉각적으로 적용 가능.

R 설치

R / RStudio 설치 시 주의사항 (한글 경로 이슈)

사용자 폴더 경로에 한글/특수문자(non-ASCII) 들어가면 R/RStudio 패키지 설치 과정에서 이유 모를 오류 뜨는 경우 있음

  • 예: C:\Users\홍길동\... 처럼 프로필 경로에 한글 들어간 케이스

제일 안전한 예방책: 영문 사용자 계정으로 설치/사용

  • 설치 전에 Windows 사용자 폴더 경로 확인
    • C:\Users\사용자이름\...
  • 사용자 이름(프로필 폴더명)에 한글 들어가 있으면
    • 영문 이름 새 계정(가능하면 관리자 권한) 하나 만들고
    • 그 계정으로 R/RStudio 설치·사용
  • 주의할 점 있음: Windows에서 “표시 이름”만 바꿔도 실제 프로필 폴더명은 그대로인 경우 많음
    → 그래서 새 계정 생성이 더 확실함
  • 프로젝트/과제 폴더를 영문 경로에 두는 게 안전
    • 예: ~/projects/finance_mba/ (폴더명 영문/숫자/언더스코어)

Posit Cloud (온라인)

  • Posit Cloud는 RStudio의 온라인 버전으로, 브라우저에서 바로 R을 실행할 수 있음.
  1. Posit Cloud에 접속 후 회원가입/로그인
  2. New RStudio Project를 눌러 새 프로젝트 생성
  3. 좌측 Files/Console/Terminal을 이용해 로컬 RStudio처럼 실습 진행

R 설치 방법 (Windows / macOS)

  • Windows: 공식 웹사이트에서 다운로드하여 설치

    1. CRAN 공식 웹사이트에 접속
    2. “Download R for Windows” 클릭
    3. “base” 패키지를 선택하고 최신 버전을 다운로드
    4. .exe파일 실행 후 기본 설정으로 설치
  • macOS: 공식 웹사이트에서 다운로드하여 설치

    1. CRAN 공식 웹사이트에 접속
    2. “Download R for macOS” 클릭
    3. 본인 칩셋(Apple Silicon / Intel)에 맞는 설치 파일 다운로드
    4. .pkg 파일 실행 후 기본 설정으로 설치

RStudio 설치 방법 (Windows / macOS)

R 프로그래밍 언어를 위한 통합 개발 환경(IDE, Integrated Development Environment)

  • 공식 웹사이트에서 다운로드하여 설치 (Windows/macOS 공통)

    1. CRAN 공식 웹사이트 접속
    2. “RStudio Desktop”의 선택하여 다운로드
    3. 다운로드한 설치 파일 실행 후 기본 설정으로 설치
    4. 설치 완료 후 RStudio 실행하여 정상 작동하는지 확인

설치 확인

설치가 정상적으로 완료되었는지 확인하기 위해 R과 RStudio 실행.

  1. RStudio 실행

    • Windows는 검색창, macOS는 Spotlight(Command + Space)에서 “RStudio” 검색 후 실행.
    • 콘솔에서 version 입력하여 설치된 R 버전 확인.
  2. R에서 간단한 코드 실행

    • 다음 코드를 console에서 실행하여 정상 동작하는지 확인.
    print("R과 RStudio 설치 완료!")
    ## [1] "R과 RStudio 설치 완료!"

R 및 RStudio 업데이트 방법

  • R 엔진(코어)과 RStudio(편집기)는 별개 프로그램이므로 각각 따로 업데이트해야 함.

1. R 엔진 업데이트

  • Windows: installr 패키지 활용 (오류 방지를 위해 RStudio가 아닌 기본 R GUI에서 실행하는 것을 권장)

    install.packages("installr")
    installr::updateR()
  • Mac: CRAN 홈페이지에 접속해서 최신 .pkg 버전을 다운로드하고 그대로 덮어씌워서 설치함.

R 및 RStudio 업데이트 방법

2. RStudio 업데이트

  • RStudio 상단 메뉴: Help -> Check for Updates 클릭함.
  • 업데이트 팝업창이 뜨면 안내에 따라 최신 버전 다운로드 및 설치 진행함.

3. 패키지 일괄 업데이트 (중요 포인트)

  • R 버전을 올리고 나면 기존 설치한 패키지들도 버전에 맞게 새로고침 해줘야 함.

    update.packages(ask = FALSE, checkBuilt = TRUE)

RStudio 화면 구조

RStudio 환경

RStudio를 실행하면 여러 창(윈도우)으로 구성되어 있음.

  • 콘솔(Console): 명령어를 입력하고 실행하는 창. > 프롬프트에서 R 코드 입력 후 실행

  • 스크립트 편집기 (Source Editor): .R 파일을 열거나 작성. 여러 줄의 코드를 작성/실행 가능

  • 환경 창 (Environment): 현재 사용 중인 변수와 데이터 프레임을 확인. 데이터 구조를 파악

  • 파일 및 플롯 창 (Files, Plots, Packages, Help)

    • Files: 작업 디렉터리 내 파일 목록 확인
    • Plots: 생성된 그래프 확인
    • Packages: 설치된 패키지 목록 및 관리
    • Help: R 함수 및 패키지 도움말 검색 가능

콘솔과 프롬프트

  • 기본적인 실행 방법

    • > 뒤에 명령어 입력 후 Enter를 누르면 실행.
    2 + 2 
    ## [1] 4
  • R 콘솔 사용 팁

    • 이전 명령어 불러오기: 위쪽 화살표() 키를 사용하면 이전에 입력한 명령어를 불러옴

    • 명령어 자동 완성: Tab 키를 사용하여 변수 및 함수 자동 완성 가능.

    • 여러 줄 입력:

      • 긴 명령어 입력 시 자동으로 다음 줄로 넘어감 (+ 기호 표시됨).
      • Shift + Enter를 누르면 줄바꿈만 하고 실행되지 않음.
      x <- 10 +       # Shift + Enter 
             20 +     # Shift + Enter 
             30       # Shift + Enter
      print(x)
      ## [1] 60

R 스크립트 (Script)

  • 새로운 R 스크립트 생성: File > New File > R Script 선택.
  • 스크립트에서 코드 실행:
    • Ctrl + Enter: 현재 줄 실행.
    • Ctrl + Alt + R: 전체 스크립트 실행.
  • 주석 작성: # 을 사용하여 코드 설명 추가 가능 (Ctrl + Shift + C)
# 변수 선언
a <- 5
b <- 10

# 변수 더하기
c <- a + b
print(c)  # 결과: 15
## [1] 15

몇 가지 유용한 설정

배경 및 글자 색상 변경

  • R 스튜디오는 기본적으로 흰색 바탕에 검은색 글씨. 어두운 화면으로 설정을 변경 가능
    • RStudio 상단 메뉴: Tools -> Global Options -> Appearance 탭에서 테마 선택 가능 (예: “Tomorrow Night Bright” 등 어두운 테마)

스크림트 한글 깨짐 방지

  • 스크립트 내용 중 한글이 깨지는 것을 방지하기 위해 인코딩 방식을 설정
    • RStudio 상단 메뉴: Tools -> Global Options -> Code 탭에서 “Saving” 섹션의 “Default text encoding”을 “UTF-8”로 설정
    • 한글 깨짐이 해결되지 않는 경우, [File → Reopen with Encoding] 메뉴에서 [UTF-8] 항목을 선택
    • [Set as default encoding for source files] 항목을 선택한 후 [OK]. UTF-8로 인코딩이 설정된 후 파일을 다시 열림

몇 가지 유용한 설정

프로젝트 만들기

  • 코딩 전에 Project 만들면 해당 과제/분석에 쓰는 코드·이미지·문서 파일을 한 폴더 체계로 관리 가능
    • RStudio 상단 육각형(Project) 버튼 누르거나 File → New Project 클릭함
      • Create Project에서 New Directory 선택함
      • Project Type에서 New Project 클릭함
      • Directory name에 프로젝트 이름 입력함
      • Create project as subdirectory of에서 프로젝트 폴더 만들 위치 선택함 (Browse로 고르면 됨)
      • 아래 Create Project 클릭하면 RStudio가 재시작되면서 프로젝트 이름이 우측 상단에 표시되고, 파일 창도 프로젝트 폴더로 이동됨. 폴더 안에 *.Rproj 파일도 생성됨 (예: fmb819.Rproj). 이후 스크립트/데이터/이미지 전부 프로젝트 폴더에 저장하면서 작업하면 됨.
      • 프로젝트 이름/폴더 경로에 한글 들어가면 오류 날 수 있으니 영문 추천

Task 1

  1. 새로운 R 스크립트를 생성하시오 (File > New File > R Script) 파일을 lecture_intro.R로 저장하시오.

  2. 다음 코드를 스크립트에 입력하고 실행하시오. 코드를 실행하려면 Ctrl + Enter (코드를 강조 표시하거나 커서를 코드 줄 끝에 놓으면 실행).

    4 * 8
  3. 첫 번째 줄만 실행하면 무슨 일이 일어나는지 확인하시오. (객체 생성)

    x = 5 # 또는 x <- 5
    x
  4. x의 세제곱을 할당하는 x_3이라는 새로운 객체를 만드시오. 할당할 때 = 또는 <-를 사용.

도움말 찾는 방법

R built-in help:

?lm  # 함수 앞에 ?를 붙이면 해당 함수의 도움말(설명서)을 확인할 수 있음

help(lm)   # help() 함수도 동일한 역할을 하며, 특정 함수의 도움말을 출력함

args(lm)  # lm 함수의 인자(argument) 목록을 출력함

example(lm)  # lm 함수의 사용 예제(example)를 실행하여 출력함

??lm  # "lm"과 관련된 모든 도움말 문서를 검색하여 표시함

패키지 (Packages)

  • R 패키지는 특정 기능을 제공하는 코드와 데이터를 포함한 소프트웨어 패키지

  • 패키지 설치는 간단. install.packages 함수를 사용:

    install.packages("ggplot2")
  • 패키지의 내용을 사용하려면, Library에서 불러와야 함. 이를 위해 library 함수를 사용:

    library(ggplot2)
  • 업데이트 하려면

    update.packages(ggplot2)

데이터 유형 (Data Type)

데이터 유형 (Data Type)

  • R에서 데이터를 원활하게 다루기 위해 가장 먼저 알아야 할 것은 데이터의 유형(Type)임.
  • 금융 데이터 분석에서는 주로 숫자, 문자열, 날짜 유형를 다룸.

숫자 유형

  • R에서 기본적으로 다루는 숫자 데이터는 실수(Double) 유형임.
dbl_var = c(1, 2.5, 4.5)
typeof(dbl_var)
## [1] "double"
int_var = as.integer(dbl_var) # dbl_var을 정수형으로 변환
typeof(int_var)
## [1] "integer"
int_var = c(1L, 6L, 5L) # 숫자 뒤에 L을 붙이면, 정수형으로 변환
typeof(int_var)
## [1] "integer"
  • 수열 (range) 생성
1:10
10:1
seq(0:10)   # 0부터 10까지 1씩 증가하는 수열 생성
seq(from=0, to=10, by=2.5)  # 0부터 10까지 2.5씩 증가하는 수열 생성 
seq(from=0, to=10, length=5)    # 0부터 10까지 5개의 숫자를 균등하게 생성
rep(1:5, each=1)    # 1부터 5까지 각 숫자를 1번씩 반복하여 생성
rep(1,5)    # 숫자 1을 5번 반복하여 생성

문자열 유형

  • 일반적인 글자 혹은 텍스트를 문자열(Character Strings)이라고 부름.
  • paste() 함수를 이용해 문자를 하나로 붙일 수 있음.
a = "Hello"
b = "World"
paste(a, b, collapse = " ")  # 공백으로 구분하여 문자열 결합
## [1] "Hello World"
paste(a, b, sep=',')  # 쉼표로 구분하여 문자열 결합
## [1] "Hello,World"
paste("The answer is", 42)  # 문자열과 숫자 결합
## [1] "The answer is 42"

날짜 유형

  • R에서 날짜는 Date 클래스의 객체로 표현됨. as.Date() 함수를 사용하여 문자열을 날짜로 변환할 수 있음.
date_str = "2024-01-01"
date_obj = as.Date(date_str)
date_obj
  • lubridate 패키지를 이용하면 날짜 유형 변경과 정보 추출을 직관적이고 쉽게 할 수 있음.
library(lubridate)
date_str = "2024-12-31"
date_obj = ymd(date_str)  # "year-month-day" 형식의 문자열을 날짜로 변환
date_obj
year(date_obj)  # 날짜에서 연도 추출
month(date_obj) # 날짜에서 월 추출
week(date_obj)  # 날짜에서 주 추출
day(date_obj)   # 날짜에서 일 추출
yday(date_obj)  # 날짜에서 연중 일수 추출
mday(date_obj)  # 날짜에서 월 중 일수 추출
wday(date_obj, label=TRUE)  # 날짜에서 요일 추출 (라벨로 표시)

날짜 유형

  • 날짜 객체를 다루면 더하기, 빼기 등의 직관적인 연산을 손쉽게 처리할 수 있음.
date1 = as.Date("2024-01-01")
date2 = as.Date("2024-12-31")
date_diff = date2 - date1  # 날짜 간의 차이 계산
date_diff
date1 + 30  # date1에서 30일 더하기
date2 - 7   # date2에서 7일 빼기
  • 숫자와 마찬가지로 seq() 함수를 이용해 일정한 패턴을 가진 날짜 벡터를 생성할 수 있음.
start_date = as.Date("2024-01-01")
end_date = as.Date("2024-12-31")
date_seq = seq(from = start_date, to = end_date, by = "1 month")  # 1개월 간격으로 날짜 생성
date_seq
date_seq = seq(from = start_date, to = end_date, by = "1 week")  # 1주 간격으로 날짜 생성
date_seq
date_seq = seq(from = start_date, to = end_date, by = "1 day")  # 1일 간격으로 날짜 생성
date_seq

데이터 구조 (Data Structures)

데이터 구조 (Data Structures)

R에서 사용되는 데이터 구조는 벡터(Vector), 행렬(Matrix), 리스트(List), 배열(Array), 데이터프레임(Dataframe)임.

  • 벡터는 동일한 유형의 데이터를 저장하는 1차원 구조
  • 행렬은 동일한 유형의 데이터를 저장하는 2차원 구조
  • 리스트는 서로 다른 유형의 데이터를 저장할 수 있는 1차원 구조
  • 배열은 동일한 유형의 데이터를 저장하는 다차원 구조
  • 데이터프레임은 서로 다른 유형의 데이터를 저장할 수 있는 2차원 구조로, 표 형식으로 데이터를 다루는 데 적합

벡터 (Vectors)

  • 벡터는 R의 가장 기본적인 1차원 데이터 구조임. c() 함수나 콜론(:)을 이용해 생성할 수 있음.
vec_integer = 8:17
vec_double = c(0.5, 0.6, 0.2)
vec_char = c('a', 'b', 'c')
  • 서로 다른 유형의 데이터가 하나의 벡터로 묶이면, 범용성이 넓은 유형로 강제 변환됨. (문자 > 숫자 > 논리값)
c('a', 'b', 'c', 1, 2, 3)  # 문자가 포함되면 모두 문자로 변환됨
c('a', 'b', 'c', TRUE, FALSE)   
c(1, 2, 3, TRUE, FALSE)  # 숫자와 논리값이 묶이면 TRUE=1, FALSE=0 숫자로 변환됨
  • 생성된 벡터의 특정 위치나 조건에 맞는 데이터를 대괄호([])를 사용해 추출할 수 있음.
v1 = 8:17
v1[2]   # 특정 위치 데이터 추출
v1[c(2, 4, 6)]
v1[-1]  # 마이너스(-) 기호로 특정 위치 제외
v1[v1 < 12] # 조건을 이용한 추출

리스트 (Lists)

  • 리스트는 원소 간의 데이터 타입이나 길이가 달라도 하나의 객체로 묶을 수 있는 구조. 리스트 안에 또 다른 리스트를 넣는 것도 가능함.
l = list(1:3, 'a', c(TRUE, FALSE, TRUE), c(2.5, 4.2))
str(l)
l[[1]]  # 첫 번째 원소 (숫자 벡터)
  • 리스트에 새로운 항목을 추가할 때는 append() 함수나 달러($) 기호를 사용
l3 = list(1:3, 'a', c(TRUE, FALSE, TRUE))
l4 = append(l3, list(c(2.5, 4.2)))
l4$item5 = 'new list item'  # 달러($) 기호로 이름이 부여된 새로운 항목 추가

리스트 (Lists)

  • 리스트 안의 값을 추출할 때는 대괄호와 이중 대괄호의 차이.
  • 리스트는 ‘상자 안의 상자’ 구조. [는 작은 상자를 주는 것이고, [[는 상자를 열어서 내용물을 주는 것.
l4[1]   
str(l4[1])  # 대괄호 한 번은 "리스트" 유형로 반환

l4[[1]] 
str(l4[[1]]) # 이중 대괄호는 원소 자체의 유형로 반환

l4[[1]][3]  # 첫 번째 원소(숫자 벡터)에서 세 번째 항목 추출

l4$item5    # 달러($) 기호로 이름이 부여된 항목 추출

행렬 (Matrix)

  • 행렬은 동일한 유형의 데이터를 저장하는 2차원 구조. matrix() 함수를 사용하여 생성할 수 있음.
m = matrix(1:6, nrow=2, ncol=3)  # 2행 3열의 행렬 생성
m
m[1, 2]  # 첫 번째 행, 두 번째 열의 원소 추출
m[2, ]   # 두 번째 행 전체 추출
m[, 3]   # 세 번째 열 전체 추출

배열 (Array)

  • 배열은 동일한 유형의 데이터를 저장하는 다차원 구조. array() 함수를 사용하여 생성할 수 있음.
a = array(1:24, dim=c(2, 3, 4))  # 2행 3열 4면의 3차원 배열 생성
a
a[1, 2, 3]  # 첫 번째 행, 두 번째 열, 세 번째 면의 원소 추출
a[, , 2]   # 두 번째 면 전체 추출
a[1, , ]   # 첫 번째 행 전체 추출
-   배열은 내부에 **단 한 가지 자료형(보통 숫자)**만 담을 수 있음. 리스트처럼 이것저것 담지는 못하지만, 그만큼 컴퓨터 메모리를 매우 적게 사용하고 계산 속도가 압도적으로 빠름.

데이터 프레임 (data.frame)

  • 데이터프레임은 엑셀과 비슷한 2차원(행렬) 구조로, 각 열(Column)마다 다른 데이터 타입을 가질 수 있어 R에서 가장 널리 쓰임.
df = data.frame(
  col1 = 1:3, 
  col2 = c("this", "is", "text"), 
  col3 = c(TRUE, FALSE, TRUE), 
  col4 = c(2.5, 4.2, pi)
)
  • 대괄호([행, 열])를 사용해 데이터프레임의 특정 데이터를 추출.
df[2:3, ]   # 2행과 3행 전체 선택
df[, c('col2', 'col4')] # 'col2'와 'col4' 열 전체 선택
df[, 2, drop = FALSE] # drop=FALSE 옵션을 사용하여 단일 열도 데이터프레임 유형로 유지
  • 실제로는 data.frame을 직접 생성하기보다는, 데이터를 포함하는 파일을 R로 불러오는 방식이 일반적.

데이터 프레임 (data.frame)

  • 데이터프레임을 설명하는 데 유용한 함수
str(df) # 데이터프레임의 구조를 보여줌 (각 열의 이름, 데이터 유형 등)
names(df) # 데이터프레임의 열 이름을 벡터 유형로 반환
nrow(df) # number of rows
ncol(df) # number of columns
summary(df)    # 각 열의 요약 통계량을 보여줌 (숫자형은 최소값, 1사분위수, 중앙값, 평균, 3사분위수, 최대값; 문자형은 빈도수 등)
head(df)   # `head` 함수: 데이터프레임의 처음 몇 행을 보여줌
tail(df)   # `tail` 함수: 데이터프레임의 마지막 몇 행을 보여줌
class(df) # 데이터프레임의 클래스(구조)를 보여줌
typeof(df) # 데이터프레임이 내부적으로 어떻게 저장(유형)되는지 보여줌 (예: "list")
  • class()는 R이 해당 데이터를 어떤 객체로 취급하고 다룰 것인지: “어떤 일을 하도록 훈련받았는가?”
  • typeof()는 R이 데이터를 내부적으로 어떻게 저장하는지: “어떤 재료로 만들어졌는가?”

Task 2

  1. help(read.csv) 또는 웹서치를 통해 R에서 .csv 파일을 가져오는 방법을 찾아보시오. 단, “Import Dataset” 버튼을 사용하거나 패키지를 설치하지 마시오.

  2. gun_murders.csv 파일을 새로운 객체 murders에 저장하시오. 이 파일은 2010년 미국 주별 총기 살인 사건 데이터를 포함. (힌트: 객체는 = 또는 <-를 사용하여 생성)

  3. murdersdata.frame 형식인지 확인하시오: class(murders)

  4. murders에 포함된 변수를 확인하시오.

  5. 환경 창에서 murders를 클릭하여 내용을 확인하시오 total 변수는 무엇을 의미하는 것일까?

데이터프레임 열 (column) 추출하기

  • 한 개의 열을 벡터 유형로 추출하려면 $ 연산자 (murders$state) 또는 대괄호 연산자 []를 이름이나 위치 인덱스와 함께 사용:
first5 <- murders[1:5, ]  # 처음 5개 주만 선택
first5$state  # $ 연산자로 추출
first5[ ,"state"]  # 열 이름으로 추출
first5[ ,1] # 첫 번째 열 가져오기

데이터프레임 subset

  • 데이터프레임에서 특정 부분을 선택하려면 murders[행 조건, 열 번호] 또는 murders[행 조건, "열 이름"]을 사용.
# 총기 살인 사건이 500건 이상인 주만 선택하고 "state"와 "total" 변수만 유지
murders[murders$total > 500, c("state", "total")]
    
# 캘리포니아와 텍사스만 선택하고 "state"와 "total" 변수만 유지
murders[murders$state %in% c("California", "Texas"), c("state", "total")]
  • subset 명령어 사용 가능 (종종 더 직관적)
subset(murders, total > 500, select = c(state, total))
subset(murders, state %in% c("California", "Texas"), select = c(state, total))

Task 3

  1. murders 데이터프레임에는 몇 개의 관측값(observations)이 있는가?

  2. 몇 개의 변수? 각 변수의 데이터 유형(data type)는 무엇인가?

  3. :” 연산자는 1:10처럼 사용하면 1부터 10까지의 연속된 숫자 생성을 의미함. 이를 활용하여 murders의 10번부터 25번 행을 포함하는 새로운 객체 murders_2를 만드시오.

  4. statetotal 열만 포함하는 murders_3 객체를 만드시오. (c 함수가 벡터를 생성함)

  5. 아래 코드를 실행하여 10,000명당 살인 사건 수를 나타내는 total_percap 변수를 생성하시오.

murders$total_percap = (murders$total / murders$population) * 10000

murders 객체를 클릭하여 새 변수를 확인해 보시오.

기타 유용한 명령어/함수

  • 변수 목록보기/삭제하기
ls()
rm()
rm(list=ls())  # 모든 객체 삭제
  • 함수 만들기
add <- function(x, y) {
  return(x + y)
}
add(3, 5)  # 결과: 8
  • 엑셀 파일 불러오기
install.packages(c("readxl","writexl"))
library(readxl)
library(writexl)
data <- read_excel("path/to/your/file.xlsx")  # Excel 파일 불러오기
write_xlsx(data, "path/to/save/file.xlsx")  # Excel로 저장

기타 유용한 명령어/함수

  • If 구문
x <- 10
if (x > 5) {
  print("x는 5보다 큽니다.")
} else {
  print("x는 5보다 작거나 같습니다.")
}

ifelse(x > 5, "x는 5보다 큽니다.", "x는 5보다 작거나 같습니다.")  # ifelse 함수로 간단히 표현
  • for loop 구문
for (i in 1:5) {
  print(paste("현재 숫자:", i))
}
  • while loop 구문
count <- 1 
while (count <= 5) {
  print(paste("현재 카운트:", count))
  count <- count + 1
}
  • 함수 안에서 조건문과 반복문을 함께 사용하기
my_function <- function(n) {
  for (i in 1:n) {
    if (i %% 2 == 0) {
      print(paste(i, "는 짝수입니다."))
    } else {
      print(paste(i, "는 홀수입니다."))
    }
  }
}
my_function(10)  # 1부터 10까지 숫자에 대해 짝수/홀수 판별
  • apply 계열 함수 (반복문 대체)
my_matrix <- matrix(1:9, nrow=3)
apply(my_matrix, 1, sum)  # 행별 합계 계산
apply(my_matrix, 2, mean) # 열별 평균 계산
  • lapply 계열 함수 (리스트에 적용)
my_list <- list(a = 1:5, b = 6:10)
lapply(my_list, sum)  # 리스트의 각 원소에 대해 합계 계산

비교 논리 연산

x <- 1
x < 2
## [1] TRUE
x/0
## [1] Inf
-x/0
## [1] -Inf
0/0
## [1] NaN

Scalar vs. Scalar 비교

a <- 3
a == pi
## [1] FALSE
a != pi
## [1] TRUE
a > pi
## [1] FALSE
a <= pi
## [1] TRUE

Vector vs. Vector 비교

v <- c(0, pi, 4)
w <- rep(pi, 3)
v == w
## [1] FALSE  TRUE FALSE
v != w
## [1]  TRUE FALSE  TRUE
v < w
## [1]  TRUE FALSE FALSE
v >= w
## [1] FALSE  TRUE  TRUE

Scalar vs. Vector 비교

v == pi
## [1] FALSE  TRUE FALSE
v > pi
## [1] FALSE FALSE  TRUE
any(v == pi)
## [1] TRUE
all(v == 0)
## [1] FALSE

비교 논리 연산

  • is.*() 함수 : 개체의 속성을 묻는 함수
u <- c(3, pi, Inf, NULL, NaN, NA)

is.finite(u)
## [1]  TRUE  TRUE FALSE FALSE FALSE
is.infinite(u)
## [1] FALSE FALSE  TRUE FALSE FALSE
is.na(u)
## [1] FALSE FALSE FALSE  TRUE  TRUE
is.nan(u)
## [1] FALSE FALSE FALSE  TRUE FALSE
is.null(u)
## [1] FALSE
  • NULL은 완전히 비어 있는 값으로, 벡터에 포함될 경우 자동으로 삭제됨.

  • na는 not available, nan는 not a number (예, 0/0, sqrt(-1)).

  • nan은 숫자형 결측값, na는 모든 종류의 결측값이라 생각하면 됨.

결측치 처리하기

  • is.na() 함수를 사용하여 결측값이 있는지 확인할 수 있음.
x <- c(1, 2, NA, 4)
is.na(x)  # 각 원소가 NA인지 여부를 TRUE/FALSE로 반환
## [1] FALSE FALSE  TRUE FALSE
  • 데이터프레임에 결측치가 있으면 평균 등 계산이 불가능해져 에러가 발생함.
mean(x)  # NA가 포함된 벡터의 평균 계산 시 NA 반환
## [1] NA
  • na.rm = TRUE 옵션을 사용하여 결측치를 무시하고 계산할 수 있음.
mean(x, na.rm = TRUE)  # NA를 제거하고 평균 계산
## [1] 2.333333

R 연산자 정리

1. 기초 연산자 (Arithmetic Operators)

연산자 설명 예제 결과
+ 덧셈 5 + 3 8
- 뺄셈 5 - 3 2
* 곱셈 5 * 3 15
/ 나눗셈 5 / 3 1.6667
^ 또는 ** 거듭제곱 5^3 125
%% 나머지 5 %% 3 2
%/% 5 %/% 3 1

2. 관계 연산자 (Comparison Operators)

연산자 설명 예제 결과
== 같음 5 == 3 FALSE
!= 다름 5 != 3 TRUE
> 초과 5 > 3 TRUE
< 미만 5 < 3 FALSE
>= 이상 5 >= 3 TRUE
<= 이하 5 <= 3 FALSE

3. 논리 연산자 (Logical Operators)

연산자 설명 예제 결과
& AND (벡터 연산) c(TRUE, FALSE) & c(TRUE, TRUE) TRUE FALSE
| OR (벡터 연산) c(TRUE, FALSE) | c(FALSE, FALSE) TRUE FALSE
! NOT !TRUE FALSE

강의 관련 정보

성적 산출

  1. 수업에서 in-class assignment (task) 를 완성해서 제출 \(\rightarrow\) 30%: 과제당 점수: 30/과제 개수

  2. 기말 시험 \(\rightarrow\) 70%

  3. 출석은 확인하지 않음.

  4. 보통 A는 30%이내 (A+는 아주 뛰어난 경우), C는 총점 50점 미만의 경우, D/F 는 아주 저조한 경우

수업 정책

Be nice. Be honest. Don’t cheat.


  • 숙제는 늦게 제출하면 안됨: 수업 당일 저녁 11시까지 LMS에 제출

  • 부정행위 및 타인의 과제 무단 활용 금지: C나 F 중 불리한 등급 받게 됨

  • 그룹으로 협력: 협력 장려, 다만 개인이 작성하여 제출

과제 제출 방법

Quarto Document로 작성 LMS에 제출.

1. 새 Quarto 문서 생성

  • RStudio에서 File → New File → Quarto Document… 선택
  • title과 포맷(HTML) 선택 후 Create 버튼 클릭
  • 생성된 .qmd 파일에서 문서를 작성.

2. 과제 템플릿 예시

  • 다음 양식을 이용하여 과제 제출: 과제 양식 링크

  • 과제 작성 후 적당한 곳에 저장, 예: C:\Users\user\Documents\assignment\assign1.qmd

3. Quarto 문서 렌더링

  • RStudio에서 Render 버튼 클릭

  • HTML 문서가 생성됨 (홍길동.html 생성됨)

4. 과제 제출

  • Quarto 문서와 함께 출력된 HTML 문서를 LSM시스템에 업로드

Quarto 기초

Quarto란 무엇인가?

  • 데이터를 분석하는 코드와 그 결과를 설명하는 텍스트를 하나의 문서에 통합하여 작성할 수 있는 퍼블리싱 시스템.
  • 과거의 R Markdown을 더욱 발전시킨 형태로, RStudio에서 작성한 문서를 클릭 한 번으로 HTML, PDF, Word, PPT(Revealjs) 슬라이드로 변환 가능.
  • 재현 가능한 연구(Reproducible Research): 데이터가 변경되어도 코드만 다시 실행(Render)하면 보고서의 숫자와 그래프가 자동으로 업데이트됨.

Quarto 기본 구조

Quarto 문서(.qmd)는 크게 세 가지 요소로 구성됨.

  1. YAML 헤더: 문서 맨 위에 ---로 둘러싸인 부분. 문서의 제목, 저자, 출력 형식(HTML, PDF 등)을 결정함.
  2. 마크다운(Markdown) 텍스트: 일반적인 설명, 제목, 글머리 기호 등을 작성하는 텍스트 영역.
  3. 코드 청크(Code Chunk): 실제 R 코드가 실행되는 공간.

필수 마크다운(Markdown) 문법

워드 프로세서 없이 텍스트에 간단한 기호를 붙여 서식을 지정함.

1. 제목 (Headers)

# 1단계 제목 (가장 큼)
## 2단계 제목
### 3단계 제목

2. 텍스트 강조

**굵은 글씨(Bold)**
*기울임꼴(Italic)*
`코드 형태의 텍스트`

3. 목록 (Lists)

* 순서가 없는 목록 1
* 순서가 없는 목록 2
  * 하위 목록 (띄어쓰기 2번 또는 4번 후 작성)

1. 순서가 있는 목록 1
2. 순서가 있는 목록 2

코드 청크(Code Chunk)의 이해

  • 문서 내에 R 코드를 삽입하고 실행 결과를 보여주려면 코드 청크를 만들어야 함.
  • 단축키 Ctrl + Alt + I (Mac: Cmd + Option + I)를 누르면 회색 박스가 생성됨.
```r
# 이 안에 R 코드를 작성합니다.
x <- c(1, 2, 3, 4, 5)
mean(x)
```

주요 청크 옵션 (Chunk Options) 코드 청크 상단에 #| 기호를 사용하여 코드와 결과의 출력 방식을 제어할 수 있음.

```r
#| echo: true    # 코드를 문서에 보여줄지 여부 (false면 결과만 출력)
#| eval: true    # 코드를 실제로 실행할지 여부
#| warning: false # 실행 시 발생하는 경고 메시지를 숨김
mean(x)
```

THE END