제 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)
'자격증 공방 > ADSP' 카테고리의 다른 글
4-3 정형 데이터 마이닝 (1) | 2018.08.27 |
---|---|
4-2 통계 분석 (0) | 2018.08.27 |
3-2 분석 마스터 플랜 (0) | 2018.08.22 |
3-1 데이터 분석 기획의 이해 (0) | 2018.08.22 |
1-3 가치창조를 위한 데이터과학과 전략 인사이트 (0) | 2018.08.22 |