Post

R의 특징과 자료 구조 - 1 ( 기본 개념 및 설치 과정 )

R의 특징과 자료 구조 - 1 ( 기본 개념 및 설치 과정 )

안녕하세요, 오늘은 R의 특징과 자료구조에 대해 간단히 배워보도록 하겠습니다. 직접 실행해 볼만한 문제도 같이 올려드리니 공부하는데 도움이 되길 바랍니다.

R의 특징과 자료구조

1. R 프로그래밍

아래부턴 구어체로 노트 필기한 것을 정리한 것입니다.

1-1: R 특징

  • **In-Memory Computing **(메모리에서 연산을 수행하는 기술) : 빠른 처리 속도 / 단, H/W 메모리 크기에 영향을 받을 수 있음, 병렬처리에 단점이 있다(하나의 메모리에 데이터가 있어야 해서)
  • Object-oriented programming : 데이터, 함수, 차트 등 모든 것이 object로 관리
  • Package : 최신의 알고리즘 및 방법론이 Package로 제공됨
  • Visualization : 분석에 통찰을 부여할 수 있는 그래픽에 대한 강력한 지원
  • dynamically typed language : 동적
  • 복사가 많이 일어남 : 무결성엔 장점 but 메모리 사용 많아 메모리 정리 잘해야 함(자료구조)

1-2: 프로그래밍 발전 과정

-> 구조적 (if, for)

-> 객체 지향적 (class, 데이터 + 함수) : 함수마다 데이터 타입 지정해야 함 [overroading]

-> 일반화 : Template 으로 대표 타입 지정 : int, float 등으로. (python, R : 포인터라 원본 데이터에 영향 X)

-> 함수적 : (반복문 사용x, 이미 명령어 안에 if, for문이 들어가 있어 벡터화 연산, 멀티코어병렬처리 (처리속도 빠름)

1-3: R vs Pysthon

RPython
기본 처리 단위벡터 (Vector)List, Dictionary
데이터 저장 중심벡터 (행), 데이터 프레임 (열)List
데이터 분류양적/질적 데이터 (양적 변수, 범주화)숫자형(int, float), 문자열(str), 불리언(bool) 등
연산 방법벡터화 연산 지원요소별 연산
배열 인덱스1부터 시작0부터 시작
기본 자료구조데이터 프레임(Data Frame)List, Dictionary

python에서 statsmodels로 어렵게 되어있는 것을 R로 쉽게 가능

참고) :

  • if 조건 연산 / for 벡터화 연산 => R 연산 방법
  • 양적((구체적)수치로 지정 가능) 질적(형용사로 표현되어지는 것(높다, 낮다…) (=>범주로 나눠짐, 연속적도 범주로 나눌 수 있음 (100이상 높다 등)) 데이터
  • data frame은 pandas, array, matrix는 numpy로 python에서 사용
  • R : mode, class로 데이터 타입 확인 가능(숫자냐 문자(캐릭터)인지), 주소이지만 원본 데이터를 건들지 않음 (비교하기 위해 등) -> 따라서 값을 변경하기 위해서는 함수에 리턴 하고 대입해줘야 한다.

2. R의 자료 구조

2.1: Vector

: (배열되어 있는 것을) 데이터를 크기(클러스터)와 방향(딥러닝_내적(유사도))으로 보겠다. => 데이터 프레임에 저장 : 1차원 (동질적) image

2.2: Data frame

열내 동질적(국어 점수는 int, 이름은 str) 열간 이질적(국어, 수학, 영어 등) 데이터를 어떻게 저장하는가 따라서 (열, 행) 처리 속도가 달라짐 (ex : 국어 평균 (일열로 하면 점프해서 평균인데, 국어끼리 모아두면 걍 찾지 않고 평균 낼 수 있음)) - 밑에 (데이터를 ``으로 저장)-

행우선 : 행에는 이름, 열에는 속성(특성) => 행으로 저장 (검색)

열우선 : 데이터 평균 내기 위해 (5배 이상 빨라짐) (통계)

결측치(하나라도 데이터가 빠지는 것)이 있으면 안됨 (하나가 null -> 모든게 null 나옴)

2-3: List

but 없는 것(사각형이 아닌것)도 담을 수 있는 것이 list (이중적도 저장 가능, 서로 다른 것들)

2-4: Array

2개 이상 (그냥 데이터가 담아져 있을 때) 주로 이미지 (행열 연산 아닐 때) (2,3차원..)

2-5: Matrix

전체 데이터가 동질적(숫자 or 문자) : 2차원
=> 행렬 곱 연산 : 특징을 추출 : 내적 연산의 연속
=> 앞 행과 뒤 열 수가 일치해야 함

3. R 설치

자 이제 R을 설치하고 실행해 보도록 하자

Step1. java 설치

R을 사용하다 보면 java가 필요한 경우가 있어 Java Downloads | Oracle에서 각 환경에 맞는 파일을 다운 받아줍니다. 이때 오라클 계정이 없으면 회원 가입을 하고 진행합니다.

image

java 다운로드

압축을 풀어주고, 제어판 -> 시스템 -> 고급 시스템 속성 -> 환경변수를 눌러 줍니다.

image

환경변수

새 시스템 변수를 다음과 같이 입력합니다. 변수 이름은 JAVA_HOME이고 이때 변수 값은 각자 압축 푼 파일의 위치입니다.

image

새 시스템 변수 만들기

path를 선택하고 편집을 눌러 뜬 창에 새로 만들기를 선택하고 %JAVA_HOME%\bin를 입력하고 확인을 다 눌러줍니다.

image

path

cmd에서

Java --version

을 입력해 설치가 잘 되었는지 확인합니다.

image

설치 확인

각자 환경에 맞는 R과 R Studio를 별다른 변경 사항 없이 디폴트로 설치해줍니다. 링크는 여기를 클릭해 주세요.

image

R, R Studio 설치

4. R 간단한 예제

이제 간단한 R 사용법에 대해서 설명하겠습니다. 기초적인 내용이라도 한번 직접 실행해 보는 것을 추천 드립니다.

R Studio를 실행시켜주고 따라 쳐보시길 바랍니다. ctrl + Enter를 하면 수식이 적용됩니다. 값을 바로 확인하고 싶은면 괄호()를 쳐주시면 됩니다.

입력 방식

(x <- 5) # 변수 지정 x typeof(x) # R은 자동으로 데이터 타입 할당합니다 => double x = as.integer(x) # integer로 변환 typeof(x) y <- x # 주소를 전달 typeof(y) x <- 10 # 주소가 변경 y # y는 값이 바뀌지 않습니다. z = "대한민국" print(z) cat(z)

연산자

x+y x-y x*y y/x y%/%x # 몫 연산자 y%%x # 나머지 연산자 y^x #거듭제곱 연산자

자동 형변환

t<-1.23 # double(8바이트) - 더 넓은 범위 표현 / int : 4바이트 x+t s=1.01 x+s typeof(x) typeof(t)

관계연산자

x <- 5 y <- 16 x<y x>y x<=5 y>=20 y == 16 x != 5 # 부정

vector ( combine ) : 데이터 타입이 동질적

사용법은 배열과 동일 x <- c(TRUE,FALSE,0,6) # 숫자, 문자 동시에 들어갈 때 타입을 확인해 보자 typeof(x) mode(x) class(x) (y <- c(FALSE,TRUE,FALSE,TRUE)) x+1 # for문이 없는 벡터화 연산 x <- x+1 # R은 가능한 원본을 보호하도록 작성 x !x !y x&y #논리 and : 요소별로 판단 x && y # 맨 처음 요소만 판단 x|y # or

벡터 만드는 방법 ( range, 맨 뒤의 수를 포함)

v <- 2:8 print(v)

% % 연산자를 만드는 방법

t<-1:10 v1<-8 v2<-12 v1 %in% t #포함연산자 print(v1 %in% t) print(v2 %in% t)

행렬 ( 2행 3열 )

#c로 vector 형성, 행2개, 열3개, byrow -> 행우선 (M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)) (M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = FALSE)) t(M) # 전치행렬 : 행과 열을 전치 t = M %*% t(M) # 2 by 3 * 3 by 2, %*% : 행렬곱연산자 print(t) # %*% : 앞에 있는 열수와 뒤에 있는 행수가 일치해야 가능 # = > 내적 2*2+6*6+5*5, 2*1+6*10+5*4 # 1*2+10*6+4*5, 1*1+10*100+4*4

recycling

c(1,3,5,7,9) * 2 c(1,3,5,7,9) * c(2,4) c(1,3,5,7,9,10) * c(2,4) c(2,4) * c(1,3,5,7,9,10) (data = 1:5) factorial(1:5) factorial(data)

매개변수로 기본이 벡터가 전달

(e의 지수형) exp(1) exp(2) exp(2:10) cos(c(0, pi/4)) sqrt(c(1,4,9,16)) sum(1:10) exp(0.1*10) # 이자율 * 10년 : 복리계산

결측치

sum(c(1,2,NA,3)) 1 / 0 0 / 0 Inf / NaN # 무한대, not a number Inf / Inf log(Inf) Inf + NA

사용자 정의 연산자

`%divisible%` <- function(x,y) # 함수도 객체 { if (x%%y ==0) return (TRUE) else return (FALSE) } 10 %divisible% 3 10 %divisible% 2 `%divisible%`(10,5)

통계학

#기술통계 대표값으로 데이터를 보는 이유 : 복잡 -> 단순, 비교 가능 #질적요소 : 분산(차의 제곱), 표준편차(sqrt) score <- c(85,95,75,65) score mean(score) sum(score) var(score) # 분산 sd(score) # 표준편차 sum((score-80)^2)/3 # 자유도 = n-1 sqrt(sum((score-80)^2)/3)

R에서 오버로딩이 불필요함

#함수 이름은 같지만 데이터타입이 다르거나 (데이터 타입 지정하지 않음) #매개변수의 갯수가 다르면 다른 함수로 인식 (default 매개 변수) score<-c(85,95,NA,75,65) score sum(score) # => na.rm = F가 숨어 있는 것임 mean(score, na.rm = TRUE) # rm : remove sum(score, na.rm = T)

데이터 타입

x <- c(10,20,30,'40') # 문자로 바뀜 (더 넓은 범위) mode(x) typeof(x)

형변환 (as.~)

(xx <- as.numeric(x)) mode(xx)

범주형 데이터

gender <- c('M','F','M','F','M') gender # 문자열 mode(gender); class(gender) plot(gender) fgender <- as.factor(gender) #형변환 (범주형) fgender # 종류 : F M fgender[3] levels(fgender) plot(fgender)

날짜

Sys.Date() Sys.time() today <- '2025-01-20 15:43:04' today mode(today) # character today2 <- as.Date(today) today2 mode(today2) # numeric ctoday <- strptime(today, '%Y-%m%-%d %H:%M:%S') ctoday class(ctoday)

함수 확인하기

help("mean") ?sum args(sum) example(sum)

indexing

a = c(1,2,3) a[2] b = 2:10 b[2] b[c(2,3,4)] x<-c(1:9) x x[3] x[c(2,4)] x[-1] # 제외하고 x[c(2, -4)] # +, - 혼용하면 안됨 x[c(2.4, 3.54)] # 소수를 정수화 (내림) x[c(TRUE, FALSE, FALSE, TRUE)] # Boolean indexing, (1(t), 2~3(f), 4~5(t)...) x[x<3] x[x>3]

R은 열로 저장

x <- c(1,5,4,9,0) length(x) # 전체 데이터 개수 NROW(x) # 행수 NCOL(x) # 열 수

Range 추가 내용

seq(1, 3.2, by=0.2) # 초기, 한계, 증가 seq(1, 5, length.out=4) # 출력개수 seq(1, 6, length.out=4)

#문제 3.2에서 1사이의 값을 0.2 간격의로 출력

seq(3.2, 1, by=-0.2) 반복 (b<-rep(1:4,2)) (d<-rep(1:3, each=3)) (d<-rep(1:3,2, each=3)) # 각각이 먼저 실행

문제

#1) Vector1 벡터 변수를 만들고, “R” 문자가 5회 반복되도록 하시오.

#2) Vector2 벡터 변수에 1~20까지 3간격으로 연속된 정수를 만드시오.

#3) Vector3에는 1~10까지 3간격으로 연속된 정수가 3회 반복되도록 만드시오.

#4) Vector4에는 Vector2~Vector3가 모두 포함되는 벡터를 만드시오.

#5) 25~ -15까지 5간격으로 벡터 생성- seq()함수 이용

정답 확인 1) (a <- rep('R', 5)) 2) seq(1,20, by=3) 3) rep(seq(1,10, by=3), 3) 4) vector4 <-c(vector2, vector3) 5) seq(25, -15, by=-5)

다음 포스팅

This post is licensed under CC BY 4.0 by the author.