1 R 기초

- R 장점 : 오픈소스, 가장 빠르게 발전, 보급됨

 

SAS

SPSS

R

프로그램 비용

유료, 고가

유료, 고가

오픈소스

설치용량

대용량

대용량

적음

다양한 모듈 지원 비용

별도 구매

별도 구매

오픈소스

최근 알고리즘 기술 반영

느림

다소 느림

매우 빠름

학습자료 입수의 편의성

유로 도서 위주

유로 도서 위주

공개 논문 자료 많음

질의를 위한 공개 커뮤니티

NA

NA

매우 활발

 

1. 분석 환경의 이해

 

1) 통계 패키지 R

- 복잡한 계산이나 시각화 기법을 사용할 있는 무료 소프트웨어

- 오픈 소스 무료 소프트웨어, 사용자 직접 제작한 패키지 사용 가능, 상용 소프트웨어 만큼 강력한 시각화

 

2) R 역사

- 'S' : 1975 "to turn ideas into software, quickly and faithfully." 통계 프로그램 C언어

- R : 1993 뉴질랜드 'Scheme' 개념의 다른 S 언어 프로그램

- 자유 소프트웨어 재단의 일반 공증 사용 허가서로 인한 무료 공개, S언어 사용 가능, Unix계역

 

3) R 특징

. 그래픽 처리

- 고해상도의 그래프와 그림, 매우 세부적인 부분까지 사용자 지정 가능, 빠른 처리시간

. 데이터 처리 계산 능력

- 백터, 행렬, 배열, 데이터 프레임, 리스트 등의 다양한 형태의 데이터 구조 지원

- 복잡한 구조 내의 개별 데이터에 접근하는 절차 간단 데이터 핸들링 간편

. 패키지

- 패키지 : 스스로 개발하는 새로운 함수, 특정 분석 기법을 사용

- 확장성 → 최근 이론이나 기법 사용하기 용이, 그래픽 처리 용이(고급 기능 사용가능)

 

4) R Studio

- 통합개발환경(IDE), 메모리에 저장되어 있는 변수 사용, 수정 용이

- 스크립트 문서화, 무료로 제공되는 운영체제

 

2. 기본 사용법

 

1) R R Studio 구성

. R 구성


① 메뉴 바 : R에서 사용할 수 있는 다양한 기본 기능들이 나열되

② 단축 아이콘 툴바  : 자주 사용하는 기능들의 단축 아이콘이 나열

 좌측부터 순서대로 스크립트 열기, 작업공간 불러오기, 작업공간 저장하기, 복사, 붙여넣기,  복사 후 붙여넣기, 현재 수행 중인 연산 중단, 인쇄하기

③ R 콘솔 : 콘솔은 R 명령어가 입력되고, 결과가 출력되는 R의 핵심적인 작업공간이다.

④ 스크립트 창 : 콘솔 창에서는 한 번에 한 줄의 명령어를 입력하고 바로 실행하여야 하기 때문에

긴 프로그래밍 코드를 작성하는 경우 사용하기가 불편하다.

이런 경우 별도로 실행시킬 수 있는 스크립트 창을 열어 여러 줄의 코드를 한 번에 작성하고

한 줄 씩 실행시킬 수 있으며 스크립트 창에 입력된 코드를 별도의 스크립트 파일로 저장할 수 있다 

 

. R Studio 구성


① 스크립트 창: 기존의 R 에서 별도로 열 수 있는 스크립트 창과 동일한 기능을 한다.

R에서 작성하여 저장한 스크립트를 불러올 수 있으며 여러 스크립트를 동시에 열어 작업할 수도 있다

② R 콘솔: 기존의 R에서 볼 수 있었던 콘솔창과 동일하다.

R 명령어를 실행한 결과가 콘솔 창에 나타나며 콘솔에 명령어를 입 력하여 실행할 수도 있다.

이 경우 한 줄 씩의 코드만 입력할 수 있다는 점에 유의하자.

③ 환경 및 히스토리 : 랩을 통해 환경 설정과 히스토리를 살펴볼 수 있다.

환경 창에서는 현재 실행중인 R 프로젝트에서 선언된 변수, 함수, 데이터셋 등의 정보를 살펴볼 수 있다.

히스토리 창에서는 현재까지 정상적으로 실행한 명령어들이 나열된다.

④ 현재 문서들이 저장되는 폴더나 R을 이용해 그린 그림들

 불러온 패키지들과 도움말 등을 별도의 한 영역에서 확인할 수 있다.

ctrl + Enter = run 버튼

 

2) R 패키지 설치하기

. 상단 메뉴바의 패키지 툴에서 패키지 설치하기 클릭

. 명령어로 패키지 설치하기

> install.packages("패키지이름")

불러오기

> library(패키지 이름)

 

3) R 도움말 (help)

- 해당 함수에 대한 기본적인 설명, 인수 설명, 옵션 목록 예제 : ?, help

> ?par

> help(par)

 

4) R 언어와 문법

- # : 주석

 

. R 데이터 구조

 

벡터

하나의 스칼라값, 하나 이상의 스칼라 원소를 갖는 단순한 형태 집합

원소 : 숫자, 문자, 논리 연산자 숫자는 숫자, 문자는 문자 벡터가

- 논리 연산자 → 숫자로 사용하려면 TRUE = 1, FALSE = 0

- 대소문자 구분하기에 모든 글자는 대문자로 기입

명령어 : C 'concentration(연결)'

> x = c(1, 20, 23, 40)

> y = c("사과", "바나나", "오렌지")

> z = c(TRUE, FALSE, TRUE)

> x <- c(1, 20, 23, 40)

> y <- c("사과", "바나나", "오렌지")

> z <- c(TRUE, FALSE, TRUE)

 

벡터와 벡터의 결합 : 숫자와 문자 벡터가 합쳐지면 문자형 벡터로 인식됨

> x <- c(1, 20, 23, 40)

> y <- c("사과", "바나나", "오렌지")

> xy <- c(x,y)

> xy
[1] "1"      "20"     "23"     "40"     "사과"  "바나나" "오렌지"

 

행렬

행과 열을 갖는 m * n 형태의 직사각형

명령어 : matrix(데이터를 묶은 벡터, ncol() or nrow() 옵션, byrow=T)

> mx = matrix(c(1,2,3,4,5,6), ncol=2)
> mx
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> mx = matrix(c(1,2,3,4,5,6), ncol=2, byrow = T)
> mx
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

 

벡터 합쳐서 새로운 행렬 생성 가능

rbind : 기존의 행렬에 행을 추가하는 형태

cbind : 기존의 행렬에 열을 추가하는 형태

> r1=c(10,20)
> c1=c(20,20,20)
> rbind(mx,r1)
   [,1] [,2]
      1    2
      3    4
      5    6
r1   10   20

> cbind(mx,c1)
             c1
[1,] 1 2 20
[2,] 3 4 20
[3,] 5 6 20

명령어들을 이용해 데이터 프레임을 합치면 데이터 프레임 형태로 합침

 

데이터 프레임

행렬과 유사한 2차원 목록 데이터 구조, 행렬과 다르게 열이 서로 다른 타입 가질 있음

다루기가 쉽고 정보를 많이 담아 가장 많이 쓰임

명령어 : data.frame 여러 개의 벡터를 하나의 프레임으로 합침

> income = c( 100, 200, 150, 300, 900)
> car = c("kia", "hyundai", "kia", "toyota", "lexus" )
> marriage = c(FALSE, FALSE, FALSE, TRUE, TRUE )
> mydat = data.frame(income, car, marriage)
> mydat
  income     car marriage
1    100     kia    FALSE
2    200 hyundai    FALSE
3    150     kia    FALSE
4    300  toyota     TRUE
5    900   lexus     TRUE

 

. 외부 데이터 불러오기

 

CSV파일 불러오기

명령어 : read.table(header=T 줄을 변수명으로 지정, sep="," 쉼표로 구성된 파일임을 지정)

     read.csv 사용해도 가능 sep="," 구분자 표시 필요 없음

data1 <- read. table("D:\\DATA\\example.csv", header=T, sep=".")

\ 대신 \\ 사용함을 유의,  / 사용해도 무관

 

txt파일 불러오기

명령어 : read.table, sep="," 사용하지 않으면 텍스트 파일 불러오게됨

data2 < - read.table("D:\\DATA\\example.txt")

 

엑셀 파일 불러오기

- 엑셀을 csv 파일 형식으로 변경하여 불러오기

- RODBC 패키지 불러와서 엑셀 파일 가능하도록

> library(RODBC) # 패키지 열기

> new < - odbcConnectExcel(" c:\\data\\mydata" ) # 엑셀파일의 경로입력

> yourdata <- sqlFetch(new, "Sheet1") # 엑셀파일의 워크시트(sheet) 이름 입력

> close( new)

확장자를 생략하고 작성, 워크시트 대소문자 구분

 

. R 기초 함수

 

수열 생성하기

숫자를 반복해서 생성해줌

rep : 번째 인수 만큼 두번째 인수만큼 반복

> rep(1,3)
[1] 1 1 1
> rep(2:5, 3)
 [1] 2 3 4 5 2 3 4 5 2 3 4 5

 

seq : 번째 인수부터 1 증가하여 두번째 인수까지 수열 생성

 by = n 옵션 추가하여 n 증가 가능

 length = m 옵션 추가 전체 범위의 개수가 m 되도록 생성

> seq(1,3)
[1] 1 2 3
> 1:3                #seq 같은 방법
[1] 1 2 3
> seq(1, 11, by=2)
[1]  1  3  5  7  9 11
> seq(1, 11, length=6)
[1]  1  3  5  7  9 11
> seq(1, 11, length=8)
[1]  1.000000  2.428571  3.857143  5.285714  6.714286 8.142857  9.571429 11.000000

 

기초적인 수치 계산

사칙연산

> a=1:10
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> a+a
 [1]  2  4  6  8 10 12 14 16 18 20
> a-a
 [1] 0 0 0 0 0 0 0 0 0 0
> a*a
 [1]   1   4   9  16  25  36  49  64  81 100
> a/a
 [1] 1 1 1 1 1 1 1 1 1 1

 

기본적은 벡터 생성 전치행렬 t(a) 1 3열로 변경하여 행렬 가능

명령어 : %*%

> a=c(2,7,3)
> a
[1] 2 7 3
> t(a)   #전치행렬
     [,1] [,2] [,3]
[1,]    2    7    3
> A=a%*%t(a)
> A
     [,1] [,2] [,3]
[1,]    4   14    6
                =  2,7,3 * 2       
[2,]   14   49   21
              =  2,7,3 * 7
[3,]    6   21    9
                =  2,7,3 * 3

 

행렬 * 연산 실행하면 단순 스칼라 결과

> mx=matrix(c(23,41,12,35,67,1,24,7,53), nrow=3)
> mx
     [,1] [,2] [,3]
[1,]   23   35   24
[2,]   41   67    7
[3,]   12    1   53
> 5*mx
     [,1] [,2] [,3]
[1,]  115  175  120
[2,]  205  335   35
[3,]   60    5  265

 

행렬의 역행렬 명령어 : solve

> solve(mx)
            [,1]        [,2]        [,3]
[1,] -0.35743822  0.18466969  0.13746848
[2,]  0.21069087 -0.09389813 -0.08300555
[3,]  0.07695411 -0.04004034 -0.01069087

 

평균 mean, 분산 var, 표준편차 sd

> a = 1:10
> mean(a)
#평균
[1] 5.5
> var(a) #분산
[1] 9.166667
> sd(a) #표준편차
[1] 3.02765

 

sum, 중앙값 median, 자연로그 log

> sum(a) #
[1] 55
> median(a) #중앙값
[1] 5.5
> log(a) #자연로그
 [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
 [6] 1.7917595 1.9459101 2.0794415 2.1972246 2.3025851

 

서로 다른 벡터에 대한 공분산 cov, 상관계수 cor

> b=log(a) #자연로그값 생성
> cov(a,b)
#공분산
[1] 2.112062
> cor(a,b) #상관계수
[1] 0.9516624

 

summary 함수 : 사분위수, 최소값, 최대값, 중앙값, 평균

> summary(a)
   Min. 1st Qu.  Median    Mean  3rd Qu.    Max.
   1.00    3.25    5.50  
        5.50     7.75   10.00

 

. R 데이터 핸들링

: R 객체지향 언어, 변수내 요소 참조 직관적

 

벡터형 변수

문자형 변수를 [ n 번째] 지정해주면 해당하는 값만 불러옴

[ -n번째 ] 해당 원소만 제외하고 값을 불러옴

여러 원소 불러오고자 때는 c 명령어 사용하여 가능

> b[2] # 2번째 값만
[1] "b"
> b[-2] # 2번째 값만 빼고
[1] "a" "c" "d" "e"
> b[c(2,3)] # 2,3 번째 원소만 불러올때 C 명령어 사용
[1] "b" "c"

 

행렬/데이터 프레임 형태의 변수

데이터 프레임에 대해서도 특정 원소/요소 참조 가능

[ m번째, n번째 ] 값을 지정하거나 [-m, ] 또는 [ ,-n] 제외 가능

다만, [-m,-n]으로 지정하여 하나의 원소 제외 불가능

하나의 숫자 아니라 여러 숫자형 벡터도 적용 가능

> mydat[3,2] #3 2열의 값을 불러옴
[1] kia
Levels: hyundai kia lexus toyota
> mydat[,2] #2열의 값을 불러옴
[1] kia     hyundai kia     toyota  lexus 
Levels: hyundai kia lexus toyota
> mydat[4,] # 4행의 값을 불러옴
  income    car marriage
4    300 toyota     TRUE
> mydat[-3,] # 3행의 값만 빼고 불러옴
  income     car marriage
1    100     kia    FALSE
2    200 hyundai    FALSE
4    300  toyota     TRUE
5    900   lexus     TRUE
> mydat[,-2] # 2열의 값만 빼고 불러옴
  income marriage
1    100    FALSE
2    200    FALSE
3    150    FALSE
4    300     TRUE
5    900     TRUE

 

. 반복 구문과 조건문

 

for 반복 구문

for 조건 하에 i 값을 하나씩 증가시켜 { } 안의 구문을 반복 실행

> a = c() # a 벡터 생성
> for (i in 1:9){
+   a[i]
= i*i       #1~9까지의 곱을 이루게

+ }

> a
[1]  1  4  9 16 25 36 49 64 81

 

조건 : 1~100까지 i 1 증가하여 100 반복하여 더하기

> isum = 0
> for (i in i:100){
+   isum = isum+i
+ }
> cat("1~100 sum = ", isum, "
\n")
1~100 sum =  5014

 

while 반복 구문

for 구문과 다르게 괄호안의 조건이 만족 , 중괄호 안의 구문 반복

for 구문은 반복 횟수를 정하는 반면, while 구문은 정해지 않음

> x=1
> while(x<5){
+   x=x+1
+   print(x)
+ }
[1] 2
[1] 3
[1] 4
[1] 5

 

if~else 조건문

if 조건의 특정 조건이 만족되는 경우 구문 실행, 만족 안되면 else 이하의 조건 부여

> StatScore = c(88, 90, 78, 84, 76, 68, 50, 48, 33, 70 , 48, 66, 88, 96, 79, 65, 27, 88, 96,
+               33, 64, 48, 77, 18, 26, 44, 48, 68, 77 , 64, 88, 95, 79, 88, 49, 30 , 29, 10, 49, 88)
> over70 = rep(0,40)
          # 0 40개인 숫자 벡터
> for (i in 1:40) {
  
+ if(StatScore[i]>=70) over70[i]=1
     #70 이상이면 i 값을 1 변경 나머지는 0으로
+ else over70[i]=0 }
> over70
 [1] 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0
[27] 0 0 1 0 1 1 1 1 0 0 0 0 0 1
> sum(over70)
[1] 18

 

 

. 사용자 정의 함수

function : 사용자가 직접 복잡한 함수 구성 사용 가능

함수 이름 = function(x,y,z) 으로 인수 작성

> addto = function(a){
+   isum=0
+   for(i in 1:a){
+     isum=isum+i
+   }
+   print(isum)
+ }
> addto(100)
[1] 5050
> addto(50)
[1] 1275

 

 

. 기타 유용한 기능들

 

paste

- 입력받은 문자열을 하나로 붙여줌

- 'sep=' 옵션을 통해 붙이고자 하는 문자열 사이 구분자를 삽입

> number=1:10
> alphabet=c("a","b","c")
> paste(number, alphabet)
 [1] "1 a"  "2 b"  "3 c"  "4 a"  "5 b"  "6 c"  "7 a"
 [8] "8 b"  "9 c"  "10 a"
> paste(number, alphabet, sep = " to the ")
 [1] "1 to the a"  "2 to the b"  "3 to the c"
 [4] "4 to the a"  "5 to the b"  "6 to the c"
 [7] "7 to the a"  "8 to the b"  "9 to the c"
[10] "10 to the a"

 

substr

- 주어진 문자열에서 특정 문자열 추출

> substr("BigDataAnalysis", 1, 4)
[1] "BigD"
> country=c( "Korea" , "Japan" , "China" , "Singapore" , "Russia" )
> substr(country, 1,3)
[1] "Kor" "Jap" "Chi" "Sin" "Rus"

 

자료형 데이터 구조 변환

- 주어진 객체의 데이터 구조를 다른 구조로 변경 가능

 

as.data.frame(x) : 데이터 프레임 형식으로 변환

as.list(x) : 리스트 형식으로 변환

as.matrix(x) : 형렬 형식으로 변환

as.matrix 데이터 프레임을 행렬로 변환 가능, 숫자는 문자 강제변환

as.vector(x) : 벡터 형식으로 변환

as.factor(x) : 팩터 형식으로 변환

as.integer(x) : 정수형 벡터 변환

as.numeric(x) : 수치형 벡터로 변환

as.character(x) : 문자형 벡터로 변환

 

논리형 변환

as.numeric(TRUE / FALSE) = FALSE 0, TRUE1

as.logical(x) : 0이면 FALSE, 0 아닌 모든 값을 TRUE

> as.numeric(FALSE)
[1] 0
> as.numeric(TRUE)
[1] 1
> as.logical(0)
[1] FALSE
> as.logical(0.45)
[1] TRUE

 

문자열을 날짜로 변환

Data 객체 변환

as.Data() : 기본으로 yyyy-mm-dd 가정함, 다른 형으로 변경 'format='옵션활용

→ format="%m/%d/%Y" 형으로 변경 사용 가능, Y 대문자

Sys.Data() : 현재 날짜를 변환

> as.Date("2015-01-13")
[1] "2015-01-13"

> as.Date("01/13/2015",format="%m/%d/%Y")
[1] "2015-01-13"

> Sys.Date()
[1] "2018-08-22"

 

날짜를 문자열로 변환

format(데이터, 포맷)

as.character()

> format(Sys.Date())     #아래와 같은 형식으로 나타남, 형식 변환을 주고 싶음 포맷 안에 포맷 기준작성
[1] "2018-08-22"
> as.character(Sys.Date())
[1] "2018-08-22"
> format(Sys.Date(),format="%m/%d/%Y")
[1] "08/22/2018"

 

> format(Sys.Date(),'%a')   #요일
[1] "수"
> format(Sys.Date(),'%b')   #
[1] "8"
> format(Sys.Date(),'%m')   #, 두자리 숫자
[1] "08"
> format(Sys.Date(),'%d')   #, 두자리 숫자
[1] "22"
> format(Sys.Date(),'%y')    #연도, 두자리 숫자
[1] "18"
> format(Sys.Date(),'%Y')    #연도, 네자리 숫자
[1] "2018"

 

5) 그래픽 기능

낮은 단계 그래픽 : 설정, 색변경

높은 단계 그래픽 : 함수들을 이용해서 하나의 그래프 구현 패키지 활용 가능

R 스튜디오에서는 Plot 탭에서 확인 가능

 

. 산점도 그래프

plot(x,y) 또는 plot(y ~ x)

평면에 점을 찍어 표현

> height = c( 170,168,174, 175,188,165,165,190 ,173, 168,159,170,184,155,165)
> weight = c(68,65,74,77 ,92 ,63,67 ,95,72,69,60 ,69,73, 56,55 )
> plot(height, weight)

> plot(weight~height)


 

 

. 산점도 배열

pairs(변수, main = 최상단 제목표기, pch= 찍히는 점의 모양, bg=백그라운드 색상)

각각의 변수들에 대해서 각각의 산점도를 한눈에 있도록 행렬

> pairs(iris[1:4], main="Andreson's Iris Data",

pch=21, bg=c("red", "green3", "blue")[unclass(iris$Species)])

 


 

. 히스토그램과 상자그림

hist(벡터값, prob=T 상대도수 표시)

boxplot(벡터값)

> hist(StatScore)
> hist(StatScore, prob=T)
#상대도수 표시, 중간 그래프
> boxplot(StatScore
)

 


 

2 데이터 마트

 

모델링 : 데이터 마이닝에서 다양한 분석기법을 적용해 모델을 개발하는 과정

모델링 도구 : DB에서 직접 값을 가져다 변형할 있는 기능 제공

모델링 분석에 앞서 수집, 변형 과정 필요 정리된 데이터 개발하면 신속한 모델링 가능

데이터 마트 : 데이터의 부분, 특정 사용자가 관심 갖는 데이터를 담은 작은 규모의 데이터 웨어하우스

사용자의 요구 항목에 따라 체계적으로 분석하기 위한 다양한 정보를 담은 경영 활동을 도울 시스템

데이터 웨어하우스와는 사용자의 기능 제공 범위를 기준으로 구분함(데이터 웨어하우스는 정부기간)

 

1. R reshape 활용한 데이터 마트 개발

데이터 셋에 대한 일종의 변형 필요 , 데이터 재정렬 기법이 필요

밀집화(aggregation) : 복잡한 데이터를 축소하거나 재정렬, 엑셀 - 피벗테이블, 정보 손실 발생

reshape : 정보를 그대로 유지하는 것이 차이점

- melt : id 있는 변수를 기준으로 변수를 variable 이름의 데이터를 만들고, value 저장하여 표준형식 변환

- cast : melt 데이터를 ~ 이용해 y, x측의 변수 값으로 표시

> install.packages("reshape")
Installing package into ‘C:/Users/YGL_EDU/Documents/R/win-library/3.5’
(as ‘lib’ is unspecified)
trying URL '
https://cran.rstudio.com/bin/windows/contrib/3.5/reshape_0.8.7.zip'
Content type 'application/zip' length 168728 bytes (164 KB)
downloaded 164 KB

package ‘reshape’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
        C:\Users\YGL_EDU\AppData\Local\Temp\RtmpycHm6F\downloaded_packages
> library(reshape)

> data("airquality")
> head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
> head(airquality, 10)
   Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
5     NA      NA 14.3   56     5   5
6     28      NA 14.9   66     5   6
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9
10    NA     194  8.6   69     5  10
> names(airquality) #변수명(컬럼명) 확인
[1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month" 
[6] "Day"   
> names(airquality) = tolower(names(airquality)) # 변수명 대소문자 변경
> names(airquality)
[1] "ozone"   "solar.r" "wind"    "temp"    "month" 
[6] "day"   

 

> aqm = melt(airquality, id=c("month", "day"), na.rm=TRUE)
> aqm
    month day variable value
1       5   1    ozone  41.0
2       5   2    ozone  36.0
3       5   3    ozone  12.0
4       5   4    ozone  18.0
5       5   6    ozone  28.0
6       5   7    ozone  23.0

 

> a <- cast(aqm, day ~ month ~ variable)
> a
, , variable = ozone

month
day    5  6   7   8  9

 

 

, , variable = solar.r

month
day    5   6   7   8   9
  1  190 286 269  83 167

 

, , variable = wind

month
day     5    6    7    8    9
  1   7.4  8.6  4.1  6.9  6.9

 

, , variable = temp

month
day   5  6  7  8  9
  1  67 78 84 81 91

 

> b <- cast(aqm, month ~ variable, mean) #mean 함수 적용하여 평균값 산출
> b
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

 

> c <-cast(aqm, month~ . |variable, mean) # | 이용하여 산출물을 분리해서 표시
> c
$`ozone`
  month    (all)
1     5 23.61538
2     6 29.44444
3     7 59.11538
4     8 59.96154
5     9 31.44828

$solar.r
  month    (all)
1     5 181.2963
2     6 190.1667
3     7 216.4839
4     8 171.8571
5     9 167.4333

$wind
  month     (all)
1     5 11.622581
2     6 10.266667
3     7  8.941935
4     8  8.793548
5     9 10.180000

$temp
  month    (all)
1     5 65.54839
2     6 79.10000
3     7 83.90323
4     8 83.96774
5     9 76.90000

> d <- cast(aqm, month ~ variable, mean, margins = c("grand_row", "grand_col")) # margin 총계 구하기
> d
  month    ozone  solar.r      wind     temp    (all)
1     5 23.61538 181.2963 11.622581 65.54839 68.70696
2     6 29.44444 190.1667 10.266667 79.10000 87.38384
3     7 59.11538 216.4839  8.941935 83.90323 93.49748
4     8 59.96154 171.8571  8.793548 83.96774 79.71207
5     9 31.44828 167.4333 10.180000 76.90000 71.82689
6 (all) 42.12931 185.9315  9.957516 77.88235 80.05722

 

> e <- cast(aqm, day ~ month, mean, subset=variable=="ozone") # 오존에 대한 결과값만 subset 으로 확인
> e
   day   5   6   7   8   9
1    1  41 NaN 135  39  96
2    2  36 NaN  49   9  78
3    3  12 NaN  32  16  73
4    4  18 NaN NaN  78  91

 

> f <- cast(aqm, month ~ variable, range) # range 최소 X1, 최대 X2 동시에 표시해
> f
  month ozone_X1 ozone_X2 solar.r_X1 solar.r_X2 wind_X1 wind_X2 temp_X1
1     5        1      115          8        334     5.7    20.1      56
2     6       12       71         31        332     1.7    20.7      65

 

 

2. sqldf 이용한 데이터 분석

표준 SQL 사용되는 문장 처리 가능, 특수문자는 ' ' 묶어줘서 사용 가능

 

> install.packages("sqldf")
Installing package into ‘C:/Users/YGL_EDU/Documents/R/win-library/3.5’
(as ‘lib’ is unspecified)
trying URL '
https://cran.rstudio.com/bin/windows/contrib/3.5/sqldf_0.4-11.zip'
Content type 'application/zip' length 78176 bytes (76 KB)
downloaded 76 KB

package ‘sqldf’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
        C:\Users\YGL_EDU\AppData\Local\Temp\RtmpycHm6F\downloaded_packages
> library(sqldf)
필요한 패키지를 로딩중입니다: gsubfn
필요한 패키지를 로딩중입니다: proto
필요한 패키지를 로딩중입니다: RSQLite
Warning message:
패키지 ‘sqldf’는 R 버전 3.5.1에서 작성되었습니다
> data("iris")
> sqldf("select*from iris")
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa

> sqldf("select*from iris limit 10")    # 10개만 보여주기 가능 head 에서 숫자 지정해서 보여주기와 같은 기능
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

> sqldf("select count(*) from iris where Species like 'se%'") # like 사용시  ' '작은 따옴표 붙여서 사용
  count(*)
1       50

 

3. plyr

데이터를 분리하고 처리한 다음, 다시 결합하는 데이터 처리 기능 제공

- apply : 데이터와 출력변수를 동시에 배열로 치환하여 처리할 있도록 도와줌

- multi-core

 

d = 데이터 프레임(data.frame), a = 배열(array), l = 리스트(list)

 

입력되는 데이터 형태

 

데이터 프레임

리스트

배열

데이터 프레임

ddply

ldply

adply

리스트

dlply

llply

alply

배열

daply

laply

aaply

dlply = 데이터 프레임으로 들어와서 리스트 형태로 출력되는

 

> set.seed(1)  # 난수 생성시에 일정하게 고정 시키는 역할
> d = data.frame(year=rep(2012:2014, each = 6), count =round(runif(9,0,20)))
> print(d)
   year count
1  2012     5
2  2012     7
3  2012    11
4  2012    18
5  2012     4
6  2012    18
7  2013    19
8  2013    13
9  2013    13
10 2013     5
11 2013     7
12 2013    11
13 2014    18
14 2014     4
15 2014    18
16 2014    19
17 2014    13
18 2014    13

runif = 생성할 난수의 개수, 최소값, 최대값

 

> ddply(d, "year", function(x){
+   mean.count = mean(x$count)
  # 평균값
+   sd.count = sd(x$count)
             # 표준편차
+   cv = sd.count/mean.count
        # 변동계수
+   data.frame(cv.count=cv)
+ })
  year  cv.count
1 2012 0.5985621
2 2013 0.4382254
3 2014 0.3978489

 

> ddply(d, "year", summarise, mean.count = mean(count)) #summarise 새로 생긴 변수 값만 보여줌
  year mean.count
1 2012   10.50000
2 2013   11.33333
3 2014   14.16667
> ddply(d, "year", transform, total.count = sum(count)) #transform 계산시 사용된 변수도 함께 보여줌
   year count total.count
1  2012     5          63
2  2012     7          63
3  2012    11          63
4  2012    18          63
5  2012     4          63
6  2012    18          63
7  2013    19          68
8  2013    13          68
9  2013    13          68
10 2013     5          68
11 2013     7          68
12 2013    11          68
13 2014    18          85
14 2014     4          85
15 2014    18          85
16 2014    19          85
17 2014    13          85
18 2014    13          85

 

4. 데이터 테이블

데이터 프레임과 유사하지만, 보다 빠른 그룹화와 순서화, 짧은 문장 지원이 가능

64비트 RAM 충분히 많을 효율적

행번호가 : 으로 되어 있고 데이터 프레임에서 데이터 테이블 형식으로 쉽게 변환

데이터 프레임보다 데이터 테이블로 생성하는 것이 빠르고 자료를 검색에도 빠름(무조건 빠른것은 아님)

데이터 프레임이 벡터 검색 방식이고 데이터 테이블은 인덱스를 활용한 바이너리 검색 방법

system.time 으로 검색 속도 있음

 

> install.packages("data.table")
Installing package into ‘C:/Users/YGL_EDU/Documents/R/win-library/3.5’
(as ‘lib’ is unspecified)
trying URL '
https://cran.rstudio.com/bin/windows/contrib/3.5/data.table_1.11.4.zip'
Content type 'application/zip' length 1829590 bytes (1.7 MB)
downloaded 1.7 MB

package ‘data.table’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
        C:\Users\YGL_EDU\AppData\Local\Temp\RtmpycHm6F\downloaded_packages
> library(data.table)
data.table 1.11.4  Latest news: http://r-datatable.com

다음의 패키지를 부착합니다: ‘data.table’

The following object is masked from ‘package:reshape’:

melt

Warning message:
패키지 ‘data.table’는 R 버전 3.5.1에서 작성되었습니다

 

> DT = data.table(x=c("b","b","b","a","a"), v=rnorm(5)) #rnorm 정규분포에서 5 난수 생성
> DT
   x            v
1: b -1.539950042
2: b -0.928567035
3: b -0.294720447
4: a -0.005767173
5: a  2.404653389

> data(cars)
> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10
> CARS <- data.table(cars)
> head(CARS)
   speed dist
1:     4    2
2:     4   10
3:     7    4
4:     7   22
5:     8   16
6:     9   10

> tables()      # 테이블의 크기, 용량에 대해서 있다.
   NAME NROW NCOL MB       COLS KEY
1: CARS   50  
       2      0   speed,dist   
2:   DT  
     5          2      0          x,v   
Total: 0MB

> sapply(CARS,class)
    speed      dist
"numeric" "numeric"

> DT[2,] #2번행 조회 DT[2] 로도 검색 가능
   x         v
1: b -0.928567
> DT[DT$x=="b"]
   x          v
1: b -1.5399500
2: b -0.9285670
3: b -0.2947204

> setkey(DT,x)    #키가 x 정해지고 정렬되었다.
> DT
   x            v
1: a -0.005767173
2: a  2.404653389
3: b -1.539950042
4: b -0.928567035
5: b -0.294720447
> tables()              #키가 x 정해짐을 있음
   NAME NROW NCOL MB       COLS      KEY
1: CARS 
      50     2      0    speed,dist   
2:   DT   
        5      2      0            x,v         x
Total: 0MB
> DT["b",]
   x          v
1: b -1.5399500
2: b -0.9285670
3: b -0.2947204

> DT["b",mult="first"]    # 첫번째 결과
   x        v
1: b -1.53995
> DT["b",mult="last"]   # 마지막 결과
   x          v
1: b -0.2947204

 

3 결측값 처리와 이상값 검색

 

1. 데이터 탐색

1) 데이터 기초 통계

head(테이블이름) : 앞선 6줄만 먼저 보여줌

head(테이블이름, n) : 앞선 n줄만 보여줌, 원하는 개수 넣을 있음

str(테이블이름) : 데이터의 구조를 파악 가능

summary(테이블이름) : 기초 통계량 확인, 최소값, 최대값, 사분위값, 평균값, 중위값, 범주형이면 빈도수

cov(테이블 내의 범위) : 공분산

cor(테이블 내의 범위) : 상관계수

선형 상관관계 강도 파악

 

2. 결측값 처리

결측값도 의미있는 경우가 있음, 어떻게 처리하느냐가 전체 작업속도에 영향을

결측값 처리 패키지 : Amelia II, Mice, mistools

결측값 : NA

불가능한값 : NaN (0으로 나누는 경우 )

결측값 여부 확인 : is.na

Amilia imputation 사용하면 효율적으로 데이터 결측값을 변경할 있음

 

> y <- c(1,2,3,NA)
> is.na(y)
    # 결측값 여부
[1] FALSE FALSE FALSE  TRUE

 

> mydata[mydata$v1==99, "v1"]<-NA     # 99 NA 변경할때

> mydata[!complete.cases(mydata),]       #넓은 범위의 결측값을 삭제할

 

 

> x<-c(1,2,NA,3)
> mean(x)
                    #결측값이 포함되어 있다면 결과는 NA
[1] NA
> mean(x, na.rm=T)    # 결측값을 제외하기
[1] 2

 

3. 이상값 검색

전처리를 어떻게 할지 결정할 , 부정사용방지 시스템에서 규칙을 발견할 사용

관련 알고리즘 : ESD(평균으로 표준편차 만큼 떨어진 ), MADM

일반적으로 사분위값으로 판단 주요 변수 특성 파악, 부정사용방지 프로젝트는 집중적으로 봐야함

 

a1 : 의도하지 않게 잘못 입력한 경우

a2 : 의도하지 않게 입력되었으나 분석 목적에 부합하지 않아 제거해야 하는 경우, 수작업을 거래 정보 입력

a3 : 의도하지 않은 현상이지만 분석에 포함해야 하는 경우, 고객 행동분석

b1 : 의도된 이상값, 사기(fraud)

→ a1, a2 bad data, a3, b1 이상값

 

- 상자그림으로 식별 가능

> x=rnorm(100)
> boxplot(x)
> x=c(x, 19, 28, 30)
  #임의의 결측값 넣어줌
> outwith=boxplot(x)
> outwith$out
           #결측값 확인 가능
[1] 19 28 30

 

 

 

 

- outliers 패키지 사용

outliers() : 평균과 가장 차이가 있는

> library(outliers)
> set.seed(1234)
> y=rnorm(100)
> outlier(y)
   #평균과 가장 차이나는 출력
[1] 2.548991
> outlier(y, opposite = TRUE) #반대방향으로 가장 차이 나는
[1] -2.345698

 

> dim(y) = c(20,5) # 20, 5 행렬 생성
> outlier(y)
# 열의 평균과 가장 차이가 나는 열별로 출력
[1] 2.415835 1.102298 1.647817 2.548991 2.121117
> outlier(y, opposite = TRUE)
[1] -2.345698 -2.180040 -1.806031 -1.390701 -1.372302
> boxplot(y)


+ Recent posts