data

R 프로그램을 활용한 빅데이터 분석특강 - R언어 기본

갬짱 2024. 8. 24. 02:38

 

프로그램 설치와 소개

  • R프로그램 다운로드
    :  메인서버인 0-Cloud를 비롯한 전세계에서 사용되는 서버목록에서 다운로드 가능
     http://www.r-project.org
  • 추가적인 Java프로그램 설치 : R프로그램의 자체기능으로 해결할 수 없는 분석작업을 수행하기 위함( ex. 텍스트 마이닝 )
    R에서 사용하는 많은 Java 기반 패키지들( rJava, XLConnect, RWeka 등 ... )은 Java 8(JRE 1.8) 버전에 맞춰 개발되었기에 이 버전을 설치한다.
  • 반드시 관리자 권한으로 실행
  • R패키지 : 특정기능을 제공하는 라이브러리
    설치시 제공되는 기본 패키지 + 외부에서 설치하는 패키지( 공식적으로 CRAN or 검색엔진에서 [ 키워드 in r ]로 검색 )
install.packages("패키지명") 
#CRAN 미러사이트(Korea)를 선택하면 패키지가 설치됨

.libPaths() #설치된 패키지들의 경로확인, lib옵션으로 경로지정가능

library("패키지명") #설치된 패키지를 실행하여 사용가능하게 함

update.packages("패키지명") #패키지 업데이트, 특정 패키지 지정안할경우 전부 업데이트

installed.packages() #설치된 패키지들의 목록확인

remove.packages("패키지명") #패키지 삭제

library(help=패키지명) #설치되어있는 패키지의 정보확인, 함수매뉴얼 확인

available.packages( ) #추가로 설치가능한 패키지 확인

 

  • 스크립트창 : R프로그램 내의 메모장( 파일 - 새 스크립트 )
    메모장이기에 실행기능은 없다. 실행하고자 하는 명령어 블록선택 → ctrl+r(Run) 
  • 작업디렉토리(working directory) : 프로그램이 접근(저장, 탐색.. )할 기본폴터 ( 기본경로는 내문서(Documents)로 지정 )
    getwd() : 현재 설정된 작업디렉토리를 반환
    setwd("작업디렉토리경로") : 작업디렉토리를 지정( 역슬래쉬(\) 두번입력, 백슬래쉬(/) 한번이상입력 )
    -> 프로그램 종료시 초기화, 먼저 디렉토리를 구축해두고 등록해야한다.

 


 

변수와 다양한 데이터 유형

변수 : 데이터가 담겨있는 메모리 주소값 = 데이터를 담는 그릇

변수이름 <- 값		#선언
변수이름 = 값		#선언

변수이름			#출력(호출)

class(변수이름)		#변수의 데이터종류를 확인
  • 데이터(값, R-value) 주의사항
    숫자나 변수이름 데이터의 경우 그냥 사용한다.
    문자(열) 데이터의 경우 쌍따옴표 혹은 홑따옴표로 값을 선언해야한다.
    날짜 데이터의 경우 as.Date() 함수를 사용하여 값을 선언해야한다.
  • 변수이름 주의사항 : 문자로 시작, 대소문자 구별, 예약어 사용불가

 
[ 숫자형 데이터 ]

  • 연산자 : +, -, *, / , %%
  • 지수형식 지정
    : 기본적으로 소수점 위에 0이 5개가 되면 지수형태로, 소수점 이하 4자리가 될때부터 지수형태로 표현됨
options(scipen=999)		# 지수형식X, 숫자그대로 표현
options(scipen=0)		# 지수형식 지원, 기본값

 

  • 소수점 처리함수
round(x, digits)		# x를 digits자리까지 반올림
trunc(x)			# x의 소수점이하 버림
ceiling(x)			# x보다 크거나 같은 정수
floor(x)			# x보다 작거나 같은 정수

 
 
[ 문자형 데이터 ]

nchar(str)				# 문자열변수의 길이반환
paste(str1, str2)			# 문자열 연결(공백으로 연결, sep옵션으로 구분자지정가능)
substr(data, 시작위치, 종료위치)		# 특정 부분만 추출
strsplit(tel, ")")			# 특정기호로 문자열 분리

 
 
[ 날짜형 데이터 ]
: lubridate( ) 패키지를 설치하여 이용한다.
 
[ NA 형과 NULL 형 데이터 ]

  • NA( Not Applicable , Not Available ) : 사용할 수 없는 데이터, 이상치( 정상범위를 벗어나거나 잘못된 이상한 데이터 )
  • NULL : 존재하지 않는 데이터, 결측치( 비어있는 데이터 )
  • 삭제방법 : na.rm=TRUE
x <- c(1, 2, NA, 4)
sum(x)               # 결과: NA
sum(x, na.rm=TRUE)   # 결과: 7

 

  • 치환방법 : is.na(), is.null()
x <- c(1, 2, NA, 4, NA)
x[is.na(x)] <- 0  # NA를 0으로 치환
print(x)          # 결과: 1 2 0 4 0

x <- c(1, 2, NULL, 4, NULL)
x[is.na(x)] <- 0  # NULL을 0으로 치환
print(x)          # 결과: 1 2 0 4 0

 
 


 

대량의 데이터 관리기법

 
[ 벡터(vector) ]
: 한종류의 데이터를 한줄로 저장
 
벡터 생성방식 : c() : concatenate함수를 의미

벡터이름 = c( 값1, 값2, 값3 .. )
벡터이름 <- c( 값1, 값2, 값3 .. )

is.vector(벡터이름)	# TRUE값이 출력됨
class(벡터이름)		# 동일한 데이터 유형

 
벡터 접근방식

벡터이름[ 행번호 ]	# 특정 행만 조회
벡터이름[ -행번호 ]	# 특정 행을 제외하고 조회
벡터이름[ 시작행:종료행 ]	# 해당 행범위를 조회
벡터이름[ -시작행:-종료행 ]	# 해당 행범위를 제외하고 조회

 
벡터 연산

벡터1 + 벡터2	# 위치가 대응되어 연산, 위치가 부족하면 처음부터 진행
length(벡터)	# 벡터의 길이 = 요소의 개수

union( vec1, vec2 )	# 합집합
setdiff( vec1, vec2 )	# 차집합
intersect( vec1, vec2 )	# 교집합

 
 
 
[ 행렬(matrix) ]
: 한종류의 데이터 벡터를 가로, 세로로 저장
기본적으로 n행1열(하나의 벡터)로 생성 -> nrow, ncol 옵션으로 행갯수, 열갯수 지정가능 
byrow옵션 : 기본적으로 열단위로 채워지나 행단위로 채워짐을 원하는 경우 지정( byrow = TRUE )
 
행렬 생성방식

행렬이름 = matrix( c(1,2,3,4) )
행렬이름 <- matrix( c(1,2,3,4) )

행렬이름 <- matrix( c(1:20) nrow=행갯수 )
행렬이름 <- matrix( c(1:20) ncol=열갯수 )

행렬이름 <- matrix( c(1,2,3,4) nrow=행갯수 byrow=TRUE )	# 저장순서 변경

 
행렬 접근방식

행렬이름[ 행번호, 열번호 ]
행렬이름[ c( 행번호1, 행번호2.. ), c( 열번호1, 열번호2.. ) ]

행렬이름[ , 열번호 ]	# 모든 행
행렬이름[ 행번호, ]	# 모든 열

 
 
 
[ 배열(array) ]
: 한종류의 데이터를 3차원으로 저장 = Tensor와 유사개념
(생략)
 
 
[ 리스트(list) ]
: 서로 다른 종류의 데이터를 한줄로 저장, 키=값의 형태로 저장
 
리스트 생성방식

리스트이름 = list( 키1=값1, 키2=값2, .. )
리스트이름 <- list( 키1=값1, 키2=값2, .. )

 
리스트 접근방식

리스트이름$키이름	# 키의 값 출력, 대소문자 구별
리스트이름[번호]		# 키의 값 출력

 
 
 
[ 데이터프레임(dataframe) ]
: 서로 다른 종류의 데이터를 줄로 저장, 표(table)의 형태로 라벨(컬럼)에 대응되는 값들이 저장
 
(1) 파일로딩시 자동으로 생성
(2) 벡터(열)를 결합하여 생성

데이터프레임이름 = data.frame( 라벨1 = 벡터1, 라벨2 = 벡터2, 라벨3 = 벡터3 ... )
데이터프레임이름 <- data.frame( 라벨1 = 벡터1, 라벨2 = 벡터2, 라벨3 = 벡터3 ... )
데이터프레임이름 = data.frame( 라벨1 = c(1,2,3), 라벨2 = c(1,2,3), 라벨3 = c(1,2,3) ... )

str(데이터프레임)		# 데이터프레임 각 열의 자료형들 출력

 
데이터프레임 접근방식

데이터프레임명$라벨명		# 대응되는 벡터값 전부 출력, 라벨명 대소문자구분 주의

데이터프레임명[ 행, 열 ]		# 행렬식 접근도 가능

which( 데이터프레임$라벨명=="값" )	# 라벨이 값과 일치하는 행번호를 출력

 
데이터프레임 합치기(merge) : all=T옵션을 활용하여 손실을 막는다. key, by 옵션을 활용하여 합칠기준이 되는 컬럼을 정한다.

merge( 데이터프레임1, 데이터프레임2 )		# 첫번째 데이터프레임 기준 공통부분만 합침
merge( 데이터프레임1, 데이터프레임2, all=T )	# 모든 데이터 합쳐서 출력, 데이터 손실을 막지만 NA값 발생가능

merge( 데이터프레임1, 데이터프레임2, key="grade" )
merge( 데이터프레임1, 데이터프레임2, key="grade", all=T )		#key컬럼이 일치하는 모든 경우의 수 출력

 
새로운 행과 열 추가하기 

데이터프레임$라벨명 = c (벡터값)
데이터프레임 <- transform( 데이터프레임, 라벨명=c(벡터값), 라벨명=c(벡터값) ... )	#여러개 열 추가시

rbind( 기존 데이터프레임, 추가 데이터프레임 )	# 기존 데이터프레임의 라벨명과 동일해야함(대소문자 동일)
cbind( 기존 데이터프레임, 추가 데이터프레임 )	# 기존 데이터프레임과 행의 갯수가 동일해야함( 아니라면 merge )

 
특정 열 삭제하기

데이터프레임 <- 데이터프레임[ , -열번호 ]		# 행렬식 접근
데이터프레임 <- subset( 데이터프레임, select= -(라벨명) )

 
 


 

데이터불러오기와 저장하기

데이터는 파일 혹은 DB ( SQL로 접근 ) 에 저장되어 있다. 파일의 종류는 매우 다양하고 종류에 따라 다른 명령어로 접근하여 처리한다.
기본적으로 작업디렉토리에 존재하는 파일만 파일명으로 접근이 가능하다.(폴더접근X)
작업디렉토리 외의 파일은 절대경로를 써야한다.
 
 
[ 비정형 데이터 불러오기 ]
readLines() : 텍스트 파일의 각 줄을 벡터의 요소로 저장

list.files()	# 워킹디렉토리 하에 있는 파일 및 디렉토리 목록확인

txt = readLines("구매후기.txt")
txt <- readLines("구매후기.txt")

txt = readLines("구매후기.txt", encoding="UTF-8")	# 인코딩 옵션
txt = readLines("구매후기.txt", encoding="CP949")	# 인코딩 옵션

 
 
[ 정형 데이터 불러오기 ]
read.table() : 표에서 공백으로 컬럼을 구분하여 저장

txt = read.table("전공.txt")
txt <- read.table("전공.txt")

txt <- read.table("전공.txt", fileEncoding="UTF-8")	# 인코딩 옵션

 
기본적으로 표에 자동으로 컬럼명이 붙는다.( V1, V2, V3 .. )
컬럼명이 데이터에 존재하는 경우 header=True 옵션을 사용하면 첫행이 컬럼명이 된다.

txt = read.table( "전공.txt", header=TRUE )

 
컬럼을 구분하는 기본구분자는 공백이지만 sep 옵션으로 별도로 지정할 수 있다.

txt = read.table( "전공.txt", header=TRUE, sep=":" )

 
 
[ CSV 전용 읽어오기 ]
CSV파일 : 컬럼의 구분이 ,(콤마)로 저장되어있는 파일, 확장자는 다양할 수 있다.

txt = read.csv( "전공3.txt" )

 
 
[ 엑셀파일 읽어오기 ]
readxl( ) 패키지를 설치하여 read_excel()을 활용한다.

install.packages("readxl")	# 설치
library("readxl")		# 실행

txt = read_exel( "전공.xls" )
txt = read_exel( "전공.xls", sheet=1 )	# sheet옵션으로 엑셀시트의 번호, 이름을 지정가능

 
 
[ 사용자로부터 데이터 입력받기 ]
scan() : 공백단위의 단어를 입력받음, 공백을 기준으로 분리하여 개별원소로 인식

nol = scan()			# 숫자
nol = scan( what="" )		# 문자, 날짜

 
readline() : 엔터단위 문자열을 입력받음

txt = readline()

 
 
[ PDF파일 읽어오기 ]
pdftools( ) 패키지를 설치하여 pdf_text()을 활용한다.

install.packages("pdftools")		# 설치
library("pdftools")			# 실행

txt = pdf_text("파일1.pdf")

 

[ 비정형 형태로 저장 ]
: write(), writeLines()
 
[ 정형 형태로 저장 ]

write.table( txt, 파일명 )		# 공백구분 테이블로 저장
write.csv( txt, 파일명 )		# CSV 형태로 저장

install.packages("xlsx")
library("xlsx")
write.xlsx( txt, 파일명 )		# 엑셀파일로 저장

 


 

사용자정의 함수

 
함수정의
함수호출시 return된 값은 화면에 출력된다.

함수이름 <- function( 입력변수 ) {
            		// 함수처리
                    return( 결과값 )
            }

 
조건문

if( 조건 ){
	// 조건에 맞는 경우
} else {
	// 조건에 맞지 않는 경우
}
ifelse( 조건 , 참일 경우 실행 값 , 거짓일 경우 실행 값)
# 이때 print는 자동옵션이므로 print 작업을 실행에 넣을 경우 2번 출력된다.

 
반복문
탈출옵션 break, 건너뛰는 옵션 next

while( 조건 ) {	// 조건이 참일동안 반복	}
for( 변수 in 반복시작숫자 : 반복종료숫자 ) {	// 반복횟수만큼 수행	}

gugudan <- function(x) {
	for( i in 1 : 9 ){
		y <- x*i
		print( paste( x, "X", i, "=", y ) )
	}
}
// 반복숫자에서 1씩 증가시키면서 연산한다.
for( 변수 in 반복시작숫자 : 반복종료숫자 +연산 ) {	}


for( i in 3 *10 ) {
	print( paste( i,"번 앞으로 나오세요." ) )
}
//출력결과
[1] "10 번 앞으로 나오세요."
[1] "20 번 앞으로 나오세요."
[1] "30 번 앞으로 나오