• 통계프로그래밍언어 & 통계패키지활용
  • Course Overview: 통계프로그래밍언어
  • I 통계프로그래밍언어
  • 1 Introduction
    • 1.1 R 설치하기
    • 1.2 R 시작 및 작동 체크
    • 1.3 R script 편집기 사용
    • 1.4 RStudio
      • 1.4.1 RStudio 설치하기
      • 1.4.2 RStudio IDE 화면 구성
      • 1.4.3 RStudio 환경 설정
      • 1.4.4 RStudio 프로젝트
    • 1.5 R 패키지
      • 1.5.1 R 패키지 경로 확인 및 변경
      • 1.5.2 R 패키지 설치하기
      • 1.5.3 R 패키지 불러오기
    • 1.6 R 기초 문법
    • 1.7 R Markdown (맛보기)
  • 2 R 객체(R object)
    • 2.1 프로그래밍
      • 2.1.1 Prerequisites
      • 2.1.2 프로그램
    • 2.2 스칼라(scalar)
      • 2.2.1 선언
      • 2.2.2 숫자형
      • 2.2.3 문자형
      • 2.2.4 논리형 스칼라
      • 2.2.5 결측값(missing value)
      • 2.2.6 NULL 값
      • 2.2.7 무한대/무한소/숫자아님
    • 2.3 벡터(vector)
      • 2.3.1 벡터의 특징
      • 2.3.2 벡터의 연산
      • 2.3.3 벡터의 색인(indexing)
      • 2.3.4 벡터 관련 함수
    • 2.4 리스트(list)
      • 2.4.1 리스트 생성
      • 2.4.2 리스트 색인
      • 2.4.3 리스트에 원소 추가/제거
      • 2.4.4 리스트의 결합
    • 2.5 행렬(matrix)
      • 2.5.1 행렬의 연산
      • 2.5.2 행렬의 색인
      • 2.5.3 행과 열 추가 및 제거
      • 2.5.4 행렬 관련 함수
      • 2.5.5 벡터와 행렬의 차이점
      • 2.5.6 의도치 않은 차원축소 피하기
    • 2.6 배열(array)
      • 2.6.1 배열의 생성 및 색인
      • 2.6.2 배열의 확장 예제
    • 2.7 요인(factor)과 테이블(table)
      • 2.7.1 요인(factor)
      • 2.7.2 테이블(table)
    • 2.8 데이터 프레임(data frame)
      • 2.8.1 데이터 프레임 생성
      • 2.8.2 데이터 프레임 접근 및 필터링
      • 2.8.3 데이터 프레임 관련 함수
      • 2.8.4 *apply() 계열 함수
    • 2.9 객체의 유형 판별 및 변환
  • 3 문자열 처리와 정규표현식
    • 3.1 유용한 문자열 관련 함수
      • 3.1.1 nchar()
      • 3.1.2 paste(), paste0()
      • 3.1.3 sprintf()
      • 3.1.4 substr()
      • 3.1.5 tolower(), toupper()
      • 3.1.6 glue 패키지를 활용한 문자열 다루기
    • 3.2 정규표현식 기본 함수
      • 3.2.1 grep(), grepl()
      • 3.2.2 regexpr(), gregexpr()
      • 3.2.3 sub(), gsub()
      • 3.2.4 regexec()
      • 3.2.5 strsplit()
    • 3.3 정규 표현식(regular expression)
      • 3.3.1 기본 메타 문자
      • 3.3.2 문자 집합
      • 3.3.3 문자 클래스
      • 3.3.4 정규 표현식 예시
  • 4 R 수학 함수, 분포 함수, 모형식 표현
    • 4.1 수학함수
    • 4.2 통계 분포 함수
    • 4.3 모형식 표현
  • 5 제어문(Control Structure)
    • 5.1 조건문(Conditionals)
      • 5.1.1 기본 구문
      • 대안 실행(alternative execution)
      • 5.1.2 연쇄 조건문(chained condition)
      • 5.1.3 중첩 조건문(nested contition)
      • 5.1.4 ifelse() 함수
    • 5.2 반복문(Looping)
      • Prerequisite
      • 5.2.1 repeat 구문
      • 5.2.2 while 구문
      • 5.2.3 for 구문
    • 5.3 함수 (function)
      • 5.3.1 함수의 정의
      • 5.3.2 함수의 인수 전달 방법
      • 5.3.3 함수의 기본 구성 요소
      • 5.3.4 함수의 적용 범위(scoping rule)
  • 6 알고리즘의 기초
    • 6.1 알고리즘(Algorithm)
    • 6.2 재귀함수(Recursive function)
    • 6.3 선형/이진 탐색(Linear/Binary search)
      • 6.3.1 선형 탐색(Linear Search)
      • 6.3.2 이진 탐색(Binary Search)
      • 6.3.3 선형탐색과 이진탐색 비교
    • 6.4 정렬 알고리즘(Sorting Algorithms)
      • 6.4.1 버블 정렬(Bubble Sort)
      • 6.4.2 삽입 정렬(Insertion Sort)
      • 6.4.3 병합 정렬(Merge Sort)
      • 6.4.4 퀵 정렬(Quick Sort)
    • 6.5 뉴튼-랩슨 알고리즘(Newton-Rhapson Algorithm)
  • 7 시뮬레이션
    • 7.1 Prerequisites
      • 7.1.1 확률과 확률변수
    • 7.2 시뮬레이션(모의실험)의 의미
    • 7.3 몬테칼로 시뮬레이션
      • 7.3.1 동전 던지기
      • 7.3.2 주사위 던지기
      • 7.3.3 카드 생성기
      • 7.3.4 동전 던지기 게임
      • 7.3.5 주사위 던지기 게임
      • 7.3.6 카드 게임
      • 7.3.7 몬테칼로 적분법(sample-mean Monte-carlo integration)
      • 7.3.8 Buffon의 바늘 실험
    • 7.4 시뮬레이션과 통계학
  • II 통계 패키지 활용(2021년 2학기)
  • Course Overview: 통계패키지활용
  • 8 R 외부 데이터 입출력
    • 8.1 텍스트 파일 입출력
    • 8.2 R 바이너리(binary) 파일 입출력
    • 8.3 Excel 파일 입출력
  • 9 데이터 핸들링(Data handling)
    • 9.1 Tidyverse
    • 9.2 readr 패키지
      • 9.2.1 tibble 패키지
    • 9.3 dplyr 패키지
      • 9.3.1 파이프 연산자: %>%
      • 9.3.2 filter()
      • 9.3.3 arrange()
      • 9.3.4 select()
      • 9.3.5 mutate()
      • 9.3.6 transmute()
      • 9.3.7 summarise()
      • 9.3.8 group_by()
      • 9.3.9 dplyr 관련 유용한 함수
      • 9.3.10 부가 기능
      • 9.3.11 데이터 연결
      • 9.3.12 확장 예제: Gapminder
    • 9.4 데이터 변환
      • 9.4.1 Tidy data
      • 9.4.2 Long format
      • 9.4.3 Wide format
      • 9.4.4 Separate and unite
  • 10 데이터 시각화
    • 10.1 R 기본 그래프 함수
    • 10.2 고수준 그래프 함수
      • 10.2.1 plot() 함수
      • 10.2.2 주요 고수준 그래픽 함수
      • 10.2.3 산점도
      • 10.2.4 행렬 그래프
      • 10.2.5 히스토그램
      • 10.2.6 막대 그래프
      • 10.2.7 상자 그림
      • 10.2.8 바이올린 도표
      • 10.2.9 모자이크 도표
    • 10.3 저수준 그래프 함수
      • 10.3.1 par()
      • 10.3.2 points()
      • 10.3.3 lines()
      • 10.3.4 ablines()
      • 10.3.5 arrows()
      • 10.3.6 rect()
      • 10.3.7 polygon()
      • 10.3.8 text(), mtext()
      • 10.3.9 legend()
      • 10.3.10 수식 표현
      • 10.3.11 R 기본 그래프 이미지 파일로 저장
    • 10.4 ggplot2
      • 10.4.1 기본 문법
      • 10.4.2 Geoms: 선 관련 geometric
      • 10.4.3 Geoms: 점 geometrics
      • 10.4.4 Geoms: 막대 geometrics
      • 10.4.5 Geom: 수직 범위선 관련 geometrics
      • 10.4.6 Geoms: 텍스트 관련 geometrics
      • 10.4.7 Geoms: 면적 관련 geometrics
      • 10.4.8 Geoms: 통계 그래프 관련 geometrics
      • 10.4.9 Scales: x-y 축 관련 aesthetic 조정
      • 10.4.10 Scales: 색상 관련 aesthetic 조정
      • 10.4.11 Scales: 크기, 선 종류, 점 모양 aesthetic 조정
      • 10.4.12 Coordinate systems
      • 10.4.13 Guides: x-y 축 및 그래프 제목 관련
      • 10.4.14 Facets: 국소 시각화 기법
      • 10.4.15 Themes
      • 10.4.16 확장 예제
  • 11 R을 활용한 기초통계 분석
    • 11.1 Q-Q plot
      • 11.1.1 분위수(Quantile)
    • 11.2 연속형 변수의 비교
      • 11.2.1 대응 표본 t 검정(paired samples t test)
      • 11.2.2 독립 이표본 t 검정(independent two-sample t-test)
      • 11.2.3 일원배치 분산분석(oneway analysis of variance)
      • 11.2.4 tidyverse 모형 정리 및 테이블 생성
  • 12 R Markdown
    • 12.1 R Markdown의 구성
    • 12.2 R Markdown 기본 문법(syntax)
      • 12.2.1 텍스트 문법
      • 12.2.2 Block-level elements
      • 12.2.3 수식표현(math expression)
    • 12.3 R Code Chunks
      • 자주 활용하는 chunk 옵션
      • 알아두면 좋은 청크 형태
    • 12.4 인라인(inline) R 코드
    • 12.5 YAML
      • 기본 문법
      • R Markdown 기본 YAML 구조
    • 12.6 참고문헌 인용
  • References

통계 프로그래밍 언어

6.3 선형/이진 탐색(Linear/Binary search)

6.3.1 선형 탐색(Linear Search)

  • 특정 값을 주어진 벡터 공간에서 찾기 위해 저장 공간을 순차적으로 비교하면서 찾는 방식
  • 가장 단순하고 직관적인 검색 방법
  • Sequential search

선형탐색: https://chercher.tech/kotlin/linear-search-kotlin 에서 발췌

Pseudocode

  • 찾고자 하는 값을 k 라고 할 때,
  • for i 1 to n
  •   if x[i] == k then return i

구현

# Linear search
linear_search <- function(target, vec) {
  for (i in seq_along(vec)) {
    if (vec[i] == target) return(i)
  }
  return(NULL)
}

set.seed(1)
x <- sample(1:30, 30)
k <- sample(1:30, 1)

linear_search(target = k, vec = x)
[1] 28

6.3.2 이진 탐색(Binary Search)

  • 정렬된 벡터에서 특정 값을 탐색하기 위한 알고리즘
  • 전체 탐색범위를 반으로 나눈 후 찾고자 하는 값이 없는 쪽을 버린 후 나머지 부분에서 값을 검색하는 과정을 반복
  • 선형 탐색보다 대부분의 경우에서 효율적임(빠름).

이진탐색: https://mohtashims.wordpress.com/2010/07/02/searching/ 에서 발췌

Pseudocode: 자연어

  1. 주어진 배열의 가운데(중앙)에서 시작
  2. 찾고자 하는 목표값과 배열의 중앙 위치 값과 비교
  3. 만약 목표값과 중앙 위치값이 같다면 반복을 멈춤
  4. 목표값이 배열의 중앙 위치값 보다 작다면 가장 작은 인덱스에서 중앙 인덱스 보다 하나 작은 인덱스 까지 값(새로운 최대 인덱스)으로 범위를 측소 후 비교
  5. 목표값이 배열의 중앙 위치값 보다 크다면 중앙 인덱스에 1을 더한 인덱스 (새로운 최소 인덱스)부터 최대 인덱스 범위로 축소 후 비교

Pseudocode

  • 배열 인덱스에 대한 중앙 인덱스(mid = (min + max)/2) 계산
  • while min <= max
  •     mid = floor((min + max)/2)
  •     if vec[mid] == target then return(mid)
  •     else if vec[mid] > target
  •     then update max <- mid - 1
  •     else update min <- mid + 1

구현

# Binary search
binary_search <- function(target, ovec) {
  maxL <- length(ovec) # 벡터의 길이
  minL <- 1L # 시작 
  while (minL <= maxL) {
    midL <- floor((minL + maxL)/2)
    if (ovec[midL] == target) {
      return(midL)
    } else if (ovec[midL] > target) {
      maxL <- midL - 1
    } else {
      minL <- midL + 1
    }
  }
  return(NULL)
}

x <- seq(1, 40000000, by = 3)
set.seed(2)
k <- sample(x, 1)
binary_search(target = k, ovec = x)
[1] 5551055

재귀함수를 이용한 구현

# 재귀함수를 활용한 binary search 

rbinary_search <- function(target, ovec, minL, maxL) {
  if (maxL <= minL) return(NULL)
  midL <- floor((minL + maxL)/2)
  if (ovec[midL] > target) {
    rbinary_search(target, ovec, minL = minL, maxL = midL - 1)
  } else if (ovec[midL] < target) {
    rbinary_search(target, ovec, minL = midL + 1, maxL = maxL)
  } else return(midL)
}

x <- seq(1, 40, by = 3)
set.seed(2)
k <- sample(x, 1)
rbinary_search(target = k, ovec = x, minL = 1, maxL = length(x))
[1] 5

6.3.3 선형탐색과 이진탐색 비교

일반적인 경우: https://blog.penjee.com/binary-vs-linear-search-animated-gifs/ 에서 발췌

이진탐색이 안좋은 경우: https://blog.penjee.com/binary-vs-linear-search-animated-gifs/ 에서 발췌

이진탐색 성능이 가장 좋은 경우: https://blog.penjee.com/binary-vs-linear-search-animated-gifs/ 에서 발췌

두 탐색 알고리즘의 시간 복잡도 비교

  • 선형 탐색: \(\mathcal{O}(n)\)

  • 이진 탐색

    • 반복 1: \(n\)
    • 반복 2: \(n/2\)
    • 반복 3: \(n/2^2\)
    • …
    • 반복 k: \(n/2^k\) \(\rightarrow\) \(k\) 번 까지 반복(나눔) 시 검색해야할 배열(벡터) 의 길이는 1임.
  • 즉 최악의 경우 \(n/2^k = 1\) 이므로 양변에 밑이 2인 로그를 취하면
  • \(\log_2n = k\log_2 2 = k\) 이므로 이진 탐색의 시간 복잡도는 \(\mathcal{O}(\log_2n)\) 임.