---
title: "Introduction"
subtitle: "FMB819: R을 이용한 데이터분석"
author: "고려대학교 경영대학 정지웅"
format: 
  revealjs:
    theme: simple
    transition: fade
    transition-speed: fast
    scrollable: true
    chalkboard: true
    slide-number: true
revealjs-plugins:
  - revealjs-text-resizer # Thanks to https://github.com/gadenbuie/revealjs-text-resizer#readme
---

```{r setup, include = FALSE, warning = FALSE, message = FALSE}
options(htmltools.dir.version = FALSE)
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  dev = "svg",
  cache = TRUE,
  fig.align = "center",
  comment = "##"
  #fig.width = 11,
  #fig.height = 5
)

# Load packages
library(tidyverse)
library(pander)
library(ggthemes)
library(gapminder)
library(countdown)
library(xaringanExtra)

```

## Welcome to FMB 819!

- 수업의 목표

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

------------------------------------------------------------------------

## 데이터 분석의 목표

1.  **기술 요약(Description)**: 현상을 설명
2.  **예측(Prediction)**: 관측되지 않는 값을 예측
3.  **인과 관계(Causality)**: 한 변수가 다른 변수에 미치는 영향 분석

- 많은 경우 의사 결정을 위해서 기술/예측/인과 관계를 조합적으로 파악할 필요

# `R`이란?

------------------------------------------------------------------------

## `R`이란?

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

  1.  오픈소스(open source)
  2.  데이터 정리, 시각화, 기계학습 등 거의 모든 분석 가능.
  3.  [활발한 온라인 커뮤니티](https://stackoverflow.com/questions/tagged/r), 대부분의 문제에 대한 해결책 존재.

- `R`의 많은 기능들 중 우리가 주로 사용할 기능

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

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

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

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

## 금융 데이터

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

------------------------------------------------------------------------

## 1. 재현성과 업무 자동화

- R은 "데이터 수집 → 전처리 → 분석 → 시각화 → 보고서 작성"의 전 과정을 **하나의 코드 파이프라인**으로 통합.
- **자동화된 보고서 생성:** R Markdown과 Quarto를 이용해 매주/매월 자동으로 업데이트되는 보고서 작성 가능.
- **알고리즘 트레이딩:** R로 작성한 트레이딩 알고리즘을 API와 연동하여 실시간으로 거래 실행 가능.

```{r eval=TRUE, echo=TRUE, fig.width=30, fig.height=20, fig.align="center"}
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은 통계와 데이터 분석을 위해 만든 '데이터를 위한 언어'**

- 퀀트 투자, 리스크 관리, 알고리즘 트레이딩 분야에서 광범위하게 사용.
- **금융 생태계:** 수백 개의 전용 패키지 존재.
  - 시계열 분석 (`xts`, `zoo`)
  - 재무 데이터 처리 (`tidyquant`, `quantmod`)
  - 포트폴리오 최적화 (`PortfolioAnalytics`) 등
  - 기타 금융 관련 패키지들 <https://cran.r-project.org/web/views/Finance.html>
- 시스템 개발이나 거대한 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](https://posit.cloud/)에 접속 후 회원가입/로그인
2.  `New RStudio Project`를 눌러 새 프로젝트 생성
3.  좌측 `Files`/`Console`/`Terminal`을 이용해 로컬 RStudio처럼 실습 진행

------------------------------------------------------------------------

## `R` 설치 방법 (Windows / macOS)

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

  1.  [CRAN 공식 웹사이트](https://cran.r-project.org/)에 접속
  2.  "Download R for Windows" 클릭
  3.  "base" 패키지를 선택하고 최신 버전을 다운로드
  4.  `.exe`파일 실행 후 기본 설정으로 설치

- **macOS: 공식 웹사이트에서 다운로드하여 설치**

  1.  [CRAN 공식 웹사이트](https://cran.r-project.org/)에 접속
  2.  "Download R for macOS" 클릭
  3.  본인 칩셋(Apple Silicon / Intel)에 맞는 설치 파일 다운로드
  4.  `.pkg` 파일 실행 후 기본 설정으로 설치

------------------------------------------------------------------------

## `RStudio` 설치 방법 (Windows / macOS)

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

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

  1.  [CRAN 공식 웹사이트](https://posit.co/download/rstudio-desktop/) 접속
  2.  "RStudio Desktop"의 선택하여 다운로드
  3.  다운로드한 설치 파일 실행 후 기본 설정으로 설치
  4.  설치 완료 후 RStudio 실행하여 정상 작동하는지 확인

------------------------------------------------------------------------

## 설치 확인

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

1.  **RStudio 실행**

    - Windows는 검색창, macOS는 Spotlight(`Command + Space`)에서 "RStudio" 검색 후 실행.
    - 콘솔에서 `version` 입력하여 설치된 R 버전 확인.

    ```{r, echo=F, eval=F}
    version
    ```

2.  **R에서 간단한 코드 실행**

    - 다음 코드를 console에서 실행하여 정상 동작하는지 확인.

    ```{r, echo=T, eval=T}
    print("R과 RStudio 설치 완료!")
    ```

------------------------------------------------------------------------

## R 및 RStudio 업데이트 방법

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

**1. R 엔진 업데이트**

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

  ``` r
  install.packages("installr")
  installr::updateR()
  ```

- **Mac:** [CRAN 홈페이지](https://cran.r-project.org/)에 접속해서 최신 `.pkg` 버전을 다운로드하고 그대로 덮어씌워서 설치함.

------------------------------------------------------------------------

## R 및 RStudio 업데이트 방법

**2. RStudio 업데이트**

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

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

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

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

------------------------------------------------------------------------

## `RStudio` 화면 구조

````{=html}
<!-- ```{r, echo = F, out.width = "300px"}
knitr::include_graphics("chapter_intro_files/figure-html/rstudio.png")
``` -->
````

![](https://docs.posit.co/ide/user/ide/get-started/images/rstudio-panes-labeled.jpeg){fig-align="center" width="85%"}

------------------------------------------------------------------------

## `RStudio` 환경

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

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

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

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

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

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

------------------------------------------------------------------------

## 콘솔과 프롬프트

- 기본적인 실행 방법

  - `>` 뒤에 명령어 입력 후 `Enter`를 누르면 실행.

  ```{r, echo=T}
  2 + 2 
  ```

- R 콘솔 사용 팁

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

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

  - **여러 줄 입력**:

    - 긴 명령어 입력 시 자동으로 다음 줄로 넘어감 (`+` 기호 표시됨).
    - `Shift + Enter`를 누르면 줄바꿈만 하고 실행되지 않음.

    ```{r, echo=T}
    x <- 10 +       # Shift + Enter 
           20 +     # Shift + Enter 
           30       # Shift + Enter
    print(x)
    ```

------------------------------------------------------------------------

## `R` 스크립트 (Script)

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

```{r, echo=T}
# 변수 선언
a <- 5
b <- 10

# 변수 더하기
c <- a + b
print(c)  # 결과: 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 {background-color="#ffebf0"}

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

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

    ``` r
    4 * 8
    ```

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

    ``` r
    x = 5 # 또는 x <- 5
    x
    ```

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

------------------------------------------------------------------------

## 도움말 찾는 방법

`R` built-in `help`:

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

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

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

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

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

<!-- ![](chapter_intro_files/figure-html/learning_path.png){width="60%"} -->

------------------------------------------------------------------------

## 패키지 (Packages)

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

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

  ``` r
  install.packages("ggplot2")
  ```

- 패키지의 내용을 사용하려면, Library에서 불러와야 함. 이를 위해 `library` 함수를 사용:

  ``` r
  library(ggplot2)
  ```

- 업데이트 하려면

  ``` r
  update.packages(ggplot2)
  ```

# 데이터 유형 (Data Type)

------------------------------------------------------------------------

## 데이터 유형 (Data Type)

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

------------------------------------------------------------------------

## 숫자 유형

- R에서 기본적으로 다루는 숫자 데이터는 실수(Double) 유형임.

```{r, echo=T, eval=T}
dbl_var = c(1, 2.5, 4.5)
typeof(dbl_var)
```

```{r, echo=T, eval=T}
int_var = as.integer(dbl_var) # dbl_var을 정수형으로 변환
typeof(int_var)
int_var = c(1L, 6L, 5L) # 숫자 뒤에 L을 붙이면, 정수형으로 변환
typeof(int_var)
```

- 수열 (*range*) 생성

```{r, echo=T, eval=F}
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() 함수를 이용해 문자를 하나로 붙일 수 있음.

```{r, echo=T}
a = "Hello"
b = "World"
paste(a, b, collapse = " ")  # 공백으로 구분하여 문자열 결합
paste(a, b, sep=',')  # 쉼표로 구분하여 문자열 결합
paste("The answer is", 42)  # 문자열과 숫자 결합
```

------------------------------------------------------------------------

## 날짜 유형

- R에서 날짜는 `Date` 클래스의 객체로 표현됨. `as.Date()` 함수를 사용하여 문자열을 날짜로 변환할 수 있음.

```{r, echo=T, eval=F}
date_str = "2024-01-01"
date_obj = as.Date(date_str)
date_obj
```

- `lubridate` 패키지를 이용하면 날짜 유형 변경과 정보 추출을 직관적이고 쉽게 할 수 있음.

```{r, echo=T, eval=F}
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)  # 날짜에서 요일 추출 (라벨로 표시)
```

------------------------------------------------------------------------

## 날짜 유형

- 날짜 객체를 다루면 더하기, 빼기 등의 직관적인 연산을 손쉽게 처리할 수 있음.

```{r, echo=T, eval=F}
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() 함수를 이용해 일정한 패턴을 가진 날짜 벡터를 생성할 수 있음.

```{r, echo=T, eval=F}
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차원 구조로, 표 형식으로 데이터를 다루는 데 적합

![](https://cdn.discuss.boardinfinity.com/original/2X/6/6b76e2d2ac9172e93fe2023a22c9e499ad8e71e4.jpeg){fig-align="center" width="80%"}

------------------------------------------------------------------------

## 벡터 (Vectors)

- 벡터는 R의 가장 기본적인 1차원 데이터 구조임. `c()` 함수나 콜론(`:`)을 이용해 생성할 수 있음.

```{r, echo=T, eval=F}
vec_integer = 8:17
vec_double = c(0.5, 0.6, 0.2)
vec_char = c('a', 'b', 'c')
```

- 서로 다른 유형의 데이터가 하나의 벡터로 묶이면, 범용성이 넓은 유형로 강제 변환됨. (문자 \> 숫자 \> 논리값)

```{r, echo=T, eval=F}
c('a', 'b', 'c', 1, 2, 3)  # 문자가 포함되면 모두 문자로 변환됨
c('a', 'b', 'c', TRUE, FALSE)   
c(1, 2, 3, TRUE, FALSE)  # 숫자와 논리값이 묶이면 TRUE=1, FALSE=0 숫자로 변환됨
```

- 생성된 벡터의 특정 위치나 조건에 맞는 데이터를 대괄호(\[\])를 사용해 추출할 수 있음.

```{r, echo=T, eval=F}
v1 = 8:17
v1[2]   # 특정 위치 데이터 추출
v1[c(2, 4, 6)]
v1[-1]  # 마이너스(-) 기호로 특정 위치 제외
v1[v1 < 12] # 조건을 이용한 추출
```

------------------------------------------------------------------------

## 리스트 (Lists)

- 리스트는 원소 간의 데이터 타입이나 길이가 달라도 하나의 객체로 묶을 수 있는 구조. 리스트 안에 또 다른 리스트를 넣는 것도 가능함.

```{r, echo=T, eval=F}
l = list(1:3, 'a', c(TRUE, FALSE, TRUE), c(2.5, 4.2))
str(l)
l[[1]]  # 첫 번째 원소 (숫자 벡터)
```

- 리스트에 새로운 항목을 추가할 때는 append() 함수나 달러(\$) 기호를 사용

```{r, echo=T, eval=F}
l3 = list(1:3, 'a', c(TRUE, FALSE, TRUE))
l4 = append(l3, list(c(2.5, 4.2)))
l4$item5 = 'new list item'  # 달러($) 기호로 이름이 부여된 새로운 항목 추가
```

------------------------------------------------------------------------

## 리스트 (Lists)

- 리스트 안의 값을 추출할 때는 대괄호와 이중 대괄호의 차이.
- 리스트는 '상자 안의 상자' 구조. `[`는 작은 상자를 주는 것이고, `[[`는 상자를 열어서 내용물을 주는 것.

```{r, echo=T, eval=F}
l4[1]   
str(l4[1])  # 대괄호 한 번은 "리스트" 유형로 반환

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

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

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

------------------------------------------------------------------------

## 행렬 (Matrix)

- 행렬은 동일한 유형의 데이터를 저장하는 2차원 구조. `matrix()` 함수를 사용하여 생성할 수 있음.

```{r, echo=T, eval=F}
m = matrix(1:6, nrow=2, ncol=3)  # 2행 3열의 행렬 생성
m
m[1, 2]  # 첫 번째 행, 두 번째 열의 원소 추출
m[2, ]   # 두 번째 행 전체 추출
m[, 3]   # 세 번째 열 전체 추출
```

------------------------------------------------------------------------

## 배열 (Array)

- 배열은 동일한 유형의 데이터를 저장하는 다차원 구조. `array()` 함수를 사용하여 생성할 수 있음.

```{r, echo=T, eval=F}
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에서 가장 널리 쓰임.

```{r, echo=T, eval=F}
df = data.frame(
  col1 = 1:3, 
  col2 = c("this", "is", "text"), 
  col3 = c(TRUE, FALSE, TRUE), 
  col4 = c(2.5, 4.2, pi)
)
```

- 대괄호(\[행, 열\])를 사용해 데이터프레임의 특정 데이터를 추출.

```{r, echo=T, eval=F}
df[2:3, ]   # 2행과 3행 전체 선택
df[, c('col2', 'col4')] # 'col2'와 'col4' 열 전체 선택
df[, 2, drop = FALSE] # drop=FALSE 옵션을 사용하여 단일 열도 데이터프레임 유형로 유지
```

- 실제로는 `data.frame`을 직접 생성하기보다는, 데이터를 포함하는 파일을 `R`로 불러오는 방식이 일반적.

------------------------------------------------------------------------

## 데이터 프레임 (`data.frame`)

- 데이터프레임을 설명하는 데 유용한 함수

```{r, echo=T, eval=F}
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 {background-color="#ffebf0"}

```{r, echo=F}
murders <- read.csv("https://raw.githubusercontent.com/chung-jiwoong/FMB819-Slides/main/data/gun_murders.csv")
```

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

2.  [gun_murders.csv](https://raw.githubusercontent.com/chung-jiwoong/FMB819-Slides/main/data/gun_murders.csv) 파일을 새로운 객체 `murders`에 저장하시오. 이 파일은 2010년 미국 주별 총기 살인 사건 데이터를 포함. (힌트: 객체는 `=` 또는 `<-`를 사용하여 생성)

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

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

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

------------------------------------------------------------------------

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

- 한 개의 열을 **벡터 유형로 추출**하려면 `$` 연산자 (`murders$state`) 또는 대괄호 연산자 `[]`를 이름이나 위치 인덱스와 함께 사용:

```{r, echo=T, eval=F}
first5 <- murders[1:5, ]  # 처음 5개 주만 선택
first5$state  # $ 연산자로 추출
first5[ ,"state"]  # 열 이름으로 추출
first5[ ,1] # 첫 번째 열 가져오기
```

------------------------------------------------------------------------

## 데이터프레임 subset

- 데이터프레임에서 특정 부분을 선택하려면 `murders[행 조건, 열 번호]` 또는 `murders[행 조건, "열 이름"]`을 사용.

```{r, echo=T, eval=F}
# 총기 살인 사건이 500건 이상인 주만 선택하고 "state"와 "total" 변수만 유지
murders[murders$total > 500, c("state", "total")]
    
# 캘리포니아와 텍사스만 선택하고 "state"와 "total" 변수만 유지
murders[murders$state %in% c("California", "Texas"), c("state", "total")]
```

- `subset` 명령어 사용 가능 (종종 더 직관적)

```{r, echo=T, eval=F}
subset(murders, total > 500, select = c(state, total))
subset(murders, state %in% c("California", "Texas"), select = c(state, total))
```

------------------------------------------------------------------------

## Task 3 {background-color="#ffebf0"}

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

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

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

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

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

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

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

------------------------------------------------------------------------

## 기타 유용한 명령어/함수

- 변수 목록보기/삭제하기

```{r, echo=T, eval=F}
ls()
rm()
rm(list=ls())  # 모든 객체 삭제
```

- 함수 만들기

```{r, echo=T, eval=F}
add <- function(x, y) {
  return(x + y)
}
add(3, 5)  # 결과: 8
```

- 엑셀 파일 불러오기

```{r, echo=T, eval=F}
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 구문

```{r, echo=T, eval=F}
x <- 10
if (x > 5) {
  print("x는 5보다 큽니다.")
} else {
  print("x는 5보다 작거나 같습니다.")
}

ifelse(x > 5, "x는 5보다 큽니다.", "x는 5보다 작거나 같습니다.")  # ifelse 함수로 간단히 표현
```

- for loop 구문

```{r, echo=T, eval=F}
for (i in 1:5) {
  print(paste("현재 숫자:", i))
}
```

- while loop 구문

```{r, echo=T, eval=F}
count <- 1 
while (count <= 5) {
  print(paste("현재 카운트:", count))
  count <- count + 1
}
```

- 함수 안에서 조건문과 반복문을 함께 사용하기

```{r, echo=T, eval=F}
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 계열 함수 (반복문 대체)

```{r, echo=T, eval=F}
my_matrix <- matrix(1:9, nrow=3)
apply(my_matrix, 1, sum)  # 행별 합계 계산
apply(my_matrix, 2, mean) # 열별 평균 계산
```

- lapply 계열 함수 (리스트에 적용)

```{r, echo=T, eval=F}
my_list <- list(a = 1:5, b = 6:10)
lapply(my_list, sum)  # 리스트의 각 원소에 대해 합계 계산
```

------------------------------------------------------------------------

## 비교 논리 연산

```{r, echo=T}
x <- 1
x < 2
x/0
-x/0
0/0
```

**Scalar vs. Scalar 비교**

```{r, echo=T}
a <- 3
a == pi
a != pi
a > pi
a <= pi
```

**Vector vs. Vector 비교**

```{r, echo=T}
v <- c(0, pi, 4)
w <- rep(pi, 3)
v == w
v != w
v < w
v >= w
```

**Scalar vs. Vector 비교**

```{r, echo=T}
v == pi
v > pi
any(v == pi)
all(v == 0)
```

------------------------------------------------------------------------

## 비교 논리 연산

- `is.*()` 함수 : 개체의 속성을 묻는 함수

```{r, echo=T}
u <- c(3, pi, Inf, NULL, NaN, NA)

is.finite(u)

is.infinite(u)

is.na(u)

is.nan(u)

is.null(u)
```

- `NULL`은 완전히 비어 있는 값으로, 벡터에 포함될 경우 자동으로 삭제됨.

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

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

------------------------------------------------------------------------

## 결측치 처리하기

- `is.na()` 함수를 사용하여 결측값이 있는지 확인할 수 있음.

```{r, echo=T}
x <- c(1, 2, NA, 4)
is.na(x)  # 각 원소가 NA인지 여부를 TRUE/FALSE로 반환
```

- 데이터프레임에 결측치가 있으면 평균 등 계산이 불가능해져 에러가 발생함.

```{r, echo=T}
mean(x)  # NA가 포함된 벡터의 평균 계산 시 NA 반환
```

- `na.rm = TRUE` 옵션을 사용하여 결측치를 무시하고 계산할 수 있음.

```{r, echo=T}
mean(x, na.rm = TRUE)  # NA를 제거하고 평균 계산
```

------------------------------------------------------------------------

## 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`      |

```{=html}
<!--
| `&&`   | AND (단일 값 연산) | `TRUE && FALSE`                    | `FALSE`      |
| `||`   | OR (단일 값 연산)  | `TRUE || FALSE`                    | `TRUE`       |

& 둘 다 TRUE이면 TRUE
| 하나라도 TRUE이면 TRUE
-->
```

# 강의 관련 정보

------------------------------------------------------------------------

## 성적 산출

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

2.  **기말 시험** $\rightarrow$ 70%

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

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

------------------------------------------------------------------------

## 수업 정책

<p style="text-align: center; font-weight: bold; font-size: 1.5em;">

Be nice. Be honest. Don't cheat.

</p>

<br>

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

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

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

------------------------------------------------------------------------

## 과제 제출 방법

Quarto Document로 작성 LMS에 제출.

#### 1. 새 Quarto 문서 생성

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

#### 2. 과제 템플릿 예시

- 다음 양식을 이용하여 과제 제출: [과제 양식 링크](https://github.com/chung-jiwoong/FMB819-Slides/blob/main/chapter_intro/tasks/intro_tasks.qmd)

- 과제 작성 후 적당한 곳에 저장, 예: `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)**

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

**2. 텍스트 강조**

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

**3. 목록 (Lists)**

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

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

------------------------------------------------------------------------

## 코드 청크(Code Chunk)의 이해

- 문서 내에 R 코드를 삽입하고 실행 결과를 보여주려면 **코드 청크**를 만들어야 함.
- 단축키 **`Ctrl + Alt + I`** (Mac: `Cmd + Option + I`)를 누르면 회색 박스가 생성됨.

```` markdown
```r
# 이 안에 R 코드를 작성합니다.
x <- c(1, 2, 3, 4, 5)
mean(x)
```
````

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

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

# THE END