2014년 5월 19일 월요일

[Using R] R Language Basic #2 - Sample Data

R Language Basic #2 - Sample Data

Reference #1 - Sample Data Review 


5.  List (복합 백터 생성함수)
LIST() 함수는 두개의 워크시트에 데이터를 관리한느 방식으로 이해할 수 있다. 예를 들어 현재 운영이 되고 있는 식자재 값과 식자재가 상승한 가격의 데이터를 가지고 입력하는 경우 LIST를 활용할 수 있다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 9940)
> cost.post <- c(1530, 1650, 2570, 5910, 5310, 8900, 10600)
> cost1 <- list(Before=cost.pre, After=cost.post)
> cost1
$Before
[1] 1100 1560 1570 4980 5300 7780 9940

$After
[1]  1530  1650  2570  5910  5310  8900 10600

> str(cost1)
List of 2
 $ Before: num [1:7] 1100 1560 1570 4980 5300 7780 9940
 $ After : num [1:7] 1530 1650 2570 5910 5310 8900 10600

- cost1의 구조를 살표 보면 나오는 것처럼 값의 접근을 위하여 cost1$Before 를 활용하여 해당하는 열의 값을 불러 올 수 있다.

> summary(cost1)
       Length Class  Mode
Before 7      -none- numeric
After  7      -none- numeric

List() 함수 괄호안에 쓰여지는 TAG = VALUE의 형태는 이후 생성되는 데이터 접금 이름과 값에 대한 설정을 의미 한다. 위의 경우 Before, After 를 사용하였다.


> cost2 <- list(cost.pre, cost.post)
> cost2
[[1]]
[1] 1100 1560 1570 4980 5300 7780 9940

[[2]]
[1]  1530  1650  2570  5910  5310  8900 10600

> str(cost2)
List of 2
 $ : num [1:7] 1100 1560 1570 4980 5300 7780 9940
 $ : num [1:7] 1530 1650 2570 5910 5310 8900 10600

- 상위의 LIST 열에 대한 이름을 지정하지 않는 경우는 cost2$cost.pre 를 활용 할 수 없고 단순히 cost2[1], cost2[2]를 활용하여 읽어 낼 수 있다.

> summary(cost2)
     Length Class  Mode
[1,] 7      -none- numeric
[2,] 7      -none- numeric



6. Data Frames (데이터 프레임)

앞으로 우리의 과정과 데이터 분석을 위한 데이터 저장/수집되는 경우의 가장 많은 부분을 차지하는 형태의 데이터 타입 일 것이다. 데이터 프레임이라는 용어는 DataSet 또는 관계형데이터베이스의 테이블과도 비슷한 형태를 띄게 된다. 동일한 길이의 벡터 또는 요인(Factors)들의 세로방향 목록을 말하는데 각 목록의 동일위치에 있는 데이터는 동일 실험단위 또는 관찰단위에서 얻어진 것이라고 할 수 있다. 데이터 프레임의 한 행을 가리킬 때 CASE나 RECORD라는 용어를 사용하기도 한다.

> dataset.cost1 <- data.frame(Before=cost.pre, After=cost.post)

> dataset.cost1
  Before After
1   1100  1530
2   1560  1650
3   1570  2570
4   4980  5910
5   5300  5310
6   7780  8900
7   9940 10600

> str(dataset.cost1)
'data.frame': 7 obs. of  2 variables:
 $ Before: num  1100 1560 1570 4980 5300 7780 9940
 $ After : num  1530 1650 2570 5910 5310 8900 10600

> summary(dataset.cost1)
     Before         After    
 Min.   :  1100   Min.   : 1530
 1st Qu.:1565   1st Qu.: 2110
 Median :4980   Median : 5310
 Mean   :4604   Mean   : 5210
 3rd Qu.:6540   3rd Qu.: 7405
 Max.   :9940   Max.   :10600


> dataset.cost2 <- data.frame(cost.pre, cost.post)

> dataset.cost2
  cost.pre cost.post
1     1100      1530
2     1560      1650
3     1570      2570
4     4980      5910
5     5300      5310
6     7780      8900
7     9940     10600

> str(dataset.cost2)
'data.frame': 7 obs. of  2 variables:
 $ cost.pre : num  1100 1560 1570 4980 5300 7780 9940
 $ cost.post: num  1530 1650 2570 5910 5310 8900 10600

> summary(dataset.cost2)
    cost.pre      cost.post  
 Min.   :1100   Min.   : 1530
 1st Qu.:1565   1st Qu.: 2110
 Median :4980   Median : 5310
 Mean   :4604   Mean   : 5210
 3rd Qu.:6540   3rd Qu.: 7405
 Max.   :9940   Max.   :10600

DataFrame 은 List와 거의 비슷하게 생성하는 것을 사용할 수 있다. 그러나 이름지정하지 않은 경우 값의 인덱스 위치 값을 입력해야 하는 반면 데이터 프레임은 생성시 사용된 변수(입력된 팩터값 변수)의 이름을 사용하여 가능 하다.


7. Indexing (벡터 요소의 색인화)

위에서 생성된 벡터값을 개별 요소별로 접근하는 것을 색인화(Indexing)이라고 하는데 이 방법을 이요하면 하나의 벡터에서 일부분을 추출하거나 제외 할 수 있는 작업이 가능 하다. R에서 사용되는 소괄호 " () " 은 함수의 인자를 입력할 때 주로 사용하고 대괄호 " [ ] " 은 벡터나 행렬의 구성요소를 가리키는 색인 위치나 조건을 입력할 때 주로 사용한다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 9940)
> cost.post <- c(1530, 1650, 2570, 5910, 5310, 8900, 10600)

> cost.pre
[1] 1100 1560 1570 4980 5300 7780 9940

> cost.pre[2]
[1] 1560

> cost.pre[c(1, 3, 5)]
[1] 1100 1570 5300

> cost.pre[-c(1, 3, 5)]
[1] 1560 4980 7780 9940

> cost.pre[4:6]
[1] 4980 5300 7780

특정 위치값의 값을 추출할 때는 c() 을 사용하여 해당 색인값을 지정하고 앞에 " - " 를 붙인
cost.pre[-c(1, 3, 5)] 와 같은 것은 1, 3, 5번째 값을 제외한 내용을 추출하라는 명령이다. 기본적인 사항이지만 향후 데이터 가공하는 작업에서는 많이 사용되는 것으로 생각된다. 또한 특정 색인위치의 값을 변경하는 경우에도 사용할 수 있다.

> cost.pre[1] <- 4500


8. Conditional Selection(요소의 조건부 선택) 

대괄호 " [ ] " 안에 관계(비교)연산자와 논리연산자를 사용하여 행렬의 구성요소를 가리키는 조건을 입력할 수 있다.

> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, NA)
> cost.post <- c(1530, 1650, NA, 5910, 5310, 8900, 10600)

> cost.post < 2000
[1]  TRUE  TRUE    NA FALSE FALSE FALSE FALSE

> cost.pre[cost.post < 2000]
[1] 1100 1560   NA

> cost.pre[cost.post > 1500 & cost.post < 7000]
[1] 1100 1560   NA 4980 5300

> length(cost.pre)
[1] 7

> is.na(cost.pre)
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

- 관계형데이터베이스에선 NULL 이라는 용어로 사용되는 값을 의미한다. 값이 존재하지 않을 경우 TRUE 값을 리턴 한다.

> !is.na(cost.pre)
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

- 상위함수에서 " ! " 을 붙이는 경우는 그 반대의 경우로 표현하라고 이해 하면 된다.

> length(cost.pre[!is.na(cost.pre)])
[1] 6

기본적으로 연산자에 대한 부등기호를 한번더 정리 해보도록 하자

- 관계연산자 :
 x < y : x가 y 보다 작은 경우
 x > y : x가 y 보다 큰 경우
 x == y : x와 y가 같은 경우
 x <= y : x가 y 보다 작거나 같은 경우
 x >= y : x가 y 보다 크거나 같은 경우
 x != y : x와 y가 같지 않은 경우

- 논리연산자 : AND/그리고( & ) , OR/또는 ( | ) , NOT/아니다 ( ! )


9. Indexing of Data Frames (데이터프레임 요소의 색인화)

데이터프레임 형태의 구조가 가장 많을 것이라고 기존의 포스팅에서 설명한 바 있다. 데이터프레임 요소의 색인화는 대괄호(" [] " )를 사용하여 2차원 배열과 같은 형태로 이뤄지면 이전에서 설명한 색인화와 동일한 형태이니 간단한 샘플 소스를 보면 이해가 쉬울 것으로 생각 된다.


> Name <- c("토니", "매드", "모락", "시추안", "포쿡", "식당돈")
> Training <- c("Yes", "No", "Yes", "No", "Yes", "No")
> Sweetness <- c(8, 9, 9, 4, 5, 5)
> Saltiness <- c(4, 2, 2, 6, 1, 4)
> sensory <- data.frame(Name, Training, Sweetness, Saltiness)

> sensory
    Name   Training Sweetness Saltiness
1   토니       Yes         8              4
2   매드        No         9               2
3   모락       Yes         9              2
4 시추안       No         4              6
5   포쿡       Yes         5              1
6 식당돈       No         5              4

> str(sensory)
'data.frame': 6 obs. of  4 variables:
 $ Name     : Factor w/ 6 levels "매드","모락",..: 5 1 2 3 6 4
 $ Training : Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1
 $ Sweetness: num  8 9 9 4 5 5
 $ Saltiness: num  4 2 2 6 1 4

> summary(sensory)
     Name   Training   Sweetness       Saltiness  
 매드  :1     No :3      Min.   :4.000     Min.   :1.000
 모락  :1     Yes:3    1st Qu.:5.000    1st Qu.:2.000
 시추안:1                Median :6.500   Median :3.000
 식당돈:1                Mean   :6.667    Mean   :3.167
 토니  :1                  3rd Qu.:8.750    3rd Qu.:4.000
 포쿡  :1                  Max.   :9.000     Max.   :6.000

- 샘플 데이터로 만들어진 데이터 프레임을 확인 할 수 있다. str() 함수는 데이터프레임의 각 항목의 데이터 구조 형태를 볼 수 있고 summary() 함수는 데이터프레임의 각항목별 최저/최대값과 중간값, 평균등을 요약형태로 볼 수 있으며 향후 데이터 가공 작업시 유용하게 사용할 수 있다.

> sensory[5, 2]
[1] Yes
Levels: No Yes

> sensory[5,]
  Name Training Sweetness Saltiness
5 포쿡      Yes         5         1

> sensory[, 1]
[1] 토니   매드   모락   시추안 포쿡   식당돈
Levels: 매드 모락 시추안 식당돈 토니 포쿡

> condition <- sensory$Training == "Yes"
> sensory[condition,]
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
3 모락      Yes         9         2
5 포쿡      Yes         5         1

> sensory[sensory$Sweetness > 5,]
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
2 매드       No         9         2
3 모락      Yes         9         2

데이터 프레임의 개별 요소 값을 접근하기 위해서는 기본적인 " [ 행, 열 ] " 이라는 구조로 사용이 가능 하다. 또한 [행, ], [ , 열] 을 사용하여 지정하지 않은 경우는 모든 행과 모든 열을 가리키게 된다.


#3 Sample Data 로 계속

2014년 5월 16일 금요일

[SAF Intranet] 데이터분석과정 2주차 - Data Mining & Open Source R

* SAF internal training courses - data analysis process #2

지난 1차 기본과정에서는 데이터에 대해 우리가 가져야할 다른 시각에 대한 부분을 다양한 사례들과 몇가지 주의가 필요한 개념들로 알아 보았던 과정이었다. 이제 부터 진행되는 기초 과정은 향후 분석과정의 내에서 배우게될 과정 중에 기초과 되는 과정이며 새로운 것들을 배우게 됨으로써 현업에 조금은 부담스럽게 작용할 부분도 있다고 판단된다. 그러나 차근히 예제를 따라 해주고 구글 검색을 통해서 나오는 것들을 적절히 활용 한다면 충분히 함께 진행 할 수 있을 것으로 판단된다.

# 활용된 대부분의 내용은 이미 누군가의 책이나 블러그등에 올려져 있는 내용 위주로 되어 있다. 적절히 활용된 모든 내용은 출처를 하단에 참고 문헌 쪽에서 공개적으로 공유하면 문제가 될경우 연락 준다면 게시됐던 모든 내용은 삭제할 예정이다.


* 2주차 과정에서 다루게 될 개념 및 내용
1. Data Mining 개념 및 활용 분야
    - 우리 관심 사항에 해당하는 사례를 중심으로
    - 각 분석기법에 대한 내용은 3주차시 진행 예정

2. R & R Studio 설치 및 활용 방법 - 윈도우 설치 방법 (링크연결)

3. R 기본 사용 법 및 데이터 타입 - 기본사용법 (링크연결 #1, #2, #3)

4. R을 활용한 데이터 수집/가공 방법 - 관계형데이터베이스 및 일반 문서

5. 활용예제 (Text Mining - SNS 데이터, 게시판 및 일반 게시물 글 데이터 )
  - 트위터글 수집 방법 (링크연결)
  - 트위터글의 감성분석 샘플 (링크연결)
  - 사내 게시물 텍스트 마이닝 예제(오프라인 교육시 진행 )


참조자료 : 네이버 지식백과 " 데이터마이닝 " 


1. 데이터 마이닝 이란? (2주차 기본과정에 일부 포함)
간단하게는 "대용량의 데이터로부터 그 안에 숨겨져있는 의미있는 지식(패턴)을 찾아내는 과정"이라고 설명할 수 있습니다. 대규모로 저장된 데이터 안에서 체계적이고 자동적으로 통계적 규칙(rule)이나 패턴(Pattern)을 찾아 내는 것이다. 다른 말로는 KDD(데이터베이스 속의 지식 발견(Knowledge-discovery in databases)라고도 일컫는다. 이를 위해서, 데이터 마이닝은 통계석에서 패턴인식에 이르는 다양한 계량 기법을 사용한다. - 위키피디아 설명



2. 데이터 마이닝 분석과정 (3주차 데이터분석 주요 교육내용)

출처 : Chapman, et al.(2000), p. 10 

데이터 마이닝은 대용량 데이터를 활용해 다양한 분석방법론을 적용하기 때문에 별도의 소프트웨어를 사용하는 것이 필요 하다. 데이터베이스 업체에서 제공하는 소프트웨어가 일반적일고 분석용 소프트웨어로는 SAS, SPSS, Open Source R 이 있다. 우리는 앞으로 R을 활용하여 연습할 것이고 관련된 실행 소스도 모두 R을 활용한 것으로 진행 할 예정이다.


Open Source R 에 대한 자세한 사항은 아래 링크를 참고 하길 바란다.
http://www.r-project.org/ 


3. 데이터마이닝 분석 방법 정리 (3주차 데이터분석 주요 교육내용)
데이터마이닝의 분석의 종류는 분류, 군집, 연관규칙 등으로 소개할 수 있다.그 외에도 물론 더 많은 방법들이 존재 하고 있으나 우리가 진행되는 과정에선 고객관계관리(CRM)과 영업매출에 관한 분석 방법들로 제한 하고자 한다.


1) 분류분석(Classification) :
목표 필드의 값을 찾는 모델을 생성한다. 과거의 데이터를 입력으로 하여 분류 모델을 생성하고 새로운 데이터에 대하여 분류값을 예측한다. 이벤트를 진행할 때 고객 타켓을 정하는 중요한 기준이 될것이다. 응답할 확율이 높은 고객을 대상으로 하는 것이 성공율이 높다는것은 공감할 수 있지 않을까.


2) 군집분석(Clustering) :
데이터를 여러가지 속성(변수)들을 고려하여 성질이 비슷한 몇 개의 집합으로 구분하는 분석 기법이다. 고객군의 세그먼트를 세분화 시키고 그에 맞는 향후 프로모션이나 이벤트를 기획하기 위한 기초 데이터가 될 수 있다. 또한 그룹을 하고 있는 고객들의 특성을 한단계 더 세부 분석해 볼 수 있는 장점이 있다.


3) 연관규칙(Association) :
매장 에서 고객이 한번에 구입하는 메뉴들을 분석하여 함께 판매되는 패턴이 강한 연관된 메뉴들을 찾는다. 예를 들어 갈릭스노윙피자를 먹은 사람은 그랩&랍스타 파스타를 먹는다 또는 오랜지에이드를 주로 먹는다. 라는 연관 결과가 있다면 메뉴추천을 할때 이러한 연관관계가 높은 메뉴를 주로 추천하는 것을 채택할 수 있다.


4) Text Mining :
 고객의 소리 또는 현업직원과 관리 직원간의 텍스를 기반으로 하여 부각되는 의견이나 관계를 확인하여 의사결정 또는 향후 교육 진행 방향을 잡아 가는 방식을 체택한다. 일반적인 텍스트 마이닝 결과를 포함하여 기본적인 감성분석(긍정/부정)을 테스트해 볼 예정이다.


* 참고문헌
1. 데이터 분석 전문가 가이드- 데이터 분석 부분
2. 네이버 백과사전
3. Open Source R Blog




2014년 5월 9일 금요일

[Using R] R Language Basic #1 - Sample Data

* 아래 샘플은 RStudio 에서 실행하여 테스트 하였음을 알려 드립니다.
* R & RStudio Install Information --> Reference Link Clicked



샘플 소스 사용시 기본 확인 내용
실행한 스크립트를 작성하는 곳은 " Script " 패널에서 작성하며 한줄 씩 실행은 Ctrl + Enter 여러 라인을 실행시는 시작과 끝을 Drag & Drap 후 Ctrl + Enter 로 실행 하면 된다.

변수로 만들어서 지정된 내용은 보통 "Workspace"안에 나타나며 나타는 결과(내용)은 이미지 형태로 저장도 가능 하다.


** 데이터 타입에 대한 설명 및 예제 #1
1. Vectors (백터)
2. Functions that create vectors(벡터 생성함수) 
3. Matrices and arrays (행렬과 배열)
4. Factors (요인)


1. Vectors (백터)

 브랜드 6개의 매출과 객수 자료를 가지고 객단가를 계산하고 그 값이 2 만원 보다 큰지 여부에 대한 판정 자료를 생성해 보자

> brand  <- c("토니로마스", "매드포갈릭", "모락", "시추안하우스", "포쿡", "식당돈", "비스트로서울")
> brand
[1] "토니로마스"   "매드포갈릭"   "모락"         "시추안하우스" "포쿡"         "식당돈"       "비스트로서울"
> b.amt <- c(60000,90000,50000,80000,30000,45000,140000)
> b.amt
[1]  60000  90000  50000  80000  30000  45000 140000
> b.cnt <- c(3,3,2,3,2,2,3)
> b.cnt
[1] 3 3 2 3 2 2 3
> b.ct <- b.amt/b.cnt
> b.ct
[1] 20000.00 30000.00 25000.00 26666.67 15000.00 22500.00 46666.67
> ct_over <-  b.ct > 20000
> ct_over
[1] FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
> logical.vector <- c(F, T, T, T, F, T, T)
> logical.vector
[1] FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE



 - 가장 일반적인 자료 생성 방법은 c() 함수를 사용하는 것이다. 문자인 경우는 "토니로마스" 처럼 따음표("")를 사용해야 한다.

 - R 에서는 brand 와 같은 Character Vector(문자백터), b.amt, b.cnt와 같은 Numerical Vector (숫자백터) 그리고 ct_over 와 같이 Logical Vector(논리벡터)가 있다.

 - 논리 백터값을 만들때는 F 또는 T 로 작성하여도 동일하다. 그러나 따음표("")를 사용할 경우 문자백터로 인식하므로 사용시 주의 해야 한다.


2. Functions that create vectors(벡터 생성함수) 

 일정 증가 또는 감소 값으로 숫자값을 c() 함수로 사용하는 경우는 보통은 없을 것이다. 기본으로 제공하는 생성합수를 활용하면 간단하게 할 수 있는 몇가지를 나열하고자 한다.

> seq(10, 30, 5)
[1] 10 15 20 25 30
> seq(10, 30)
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
> 10:30
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
> vec <- c(10, 30, 60)
> rep(vec, 3)
[1] 10 30 60 10 30 60 10 30 60
> rep(vec, 2:4)
[1] 10 10 30 30 30 60 60 60 60
> rep(vec, seq(2, 4))
[1] 10 10 30 30 30 60 60 60 60
> rep(vec, c(4, 2, 7))
 [1] 10 10 10 10 30 30 60 60 60 60 60 60 60

  - seq() 함수는 3개의 인자를 사용하는 경우 1번째 시작숫자에서 2번째 숫자까지 3번째 숫자 간격의 숫자들로 백터를 생성한다. 상위 예제에서는 10 를 시작으로 5 값을 증가하여 30까지 출력한 것이다.

 - seq() 함수의 3개 인자값 중 마지막 값이 없는 경우 기본값으로 1씩 증가 한다. 이와 같은 명령은 10:30 이나 c(10:30) 과 동일하다.

 - rep()는 함수는 1번째 인자를 2번째 인자만큼씩 반복해서 백ㅌ를 생성하는데 반복수인 2번째 인자 길이가 1번째 인자보다 길수는 없다.

 - rep(vec, c(4, 2, 7)) = rep(c(10, 30, 60), c(4, 2, 7)) 이것은 같은 결과 인데 역시 10은 4번 반복, 30은 2번 반복 60은 7번 반복 하여 생성한다는 의미 이다.


3. Matrices and arrays (행렬과 배열)

> vector.x <- 1:15
> vector.x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
> dim(vector.x) <- c(3,5)
> vector.x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15

- dim()함수를 이용하면 n 차원의 행렬을 생성할 수 있다.


> matrix.y  <- matrix(1:15, nrow=3)
> matrix.y1  <- matrix(1:15, nrow=3, byrow=T)
> matrix.y
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
> matrix.y1
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15


- matrix() 함수를 활용하면 nrow(the number of row)를 지정하는 방식으로 행렬을 생성할 수 있다. 보통 생략된 byrow=F 값을 T로 변경한 경우 값을 우측방향으로 생성하게 된다.

> rownames(matrix.y) <- LETTERS[3:5]
> colnames(matrix.y) <- month.abb[1:5]
> matrix.y
  Jan Feb Mar Apr May
C   1   4   7  10  13
D   2   5   8  11  14
E   3   6   9  12  15

 - rownames, colnames 함수를 활용하여 이름을 지정할 수 있다. 이름을 지정할 때 c()를 활용하여 사용 할 수도 있다.

> matrix.y
  Jan Feb Mar Apr May
C   1   4   7  10  13
D   2   5   8  11  14
E   3   6   9  12  15

> t(matrix.y)
     C  D  E
Jan  1  2  3
Feb  4  5  6
Mar  7  8  9
Apr 10 11 12
May 13 14 15

- transposition 함수 t() 는 행과 열 index를 바꾹 때문에 위의 예와 같이 행과 열의 위치가 변경된다.

> cbind(MA=1:3, MB=4:6, MC=7:9)
     MA MB MC
[1,]  1  4  7
[2,]  2  5  8
[3,]  3  6  9
> rbind(MA=1:3, MB=4:6, MC=7:9)
   [,1] [,2] [,3]
MA    1    2    3
MB    4    5    6
MC    7    8    9

- columnwise 결합 함수 cbind()나 rowwise 결합함수 rbind()를 사용하면 같은 길이의 벡터를 열 또는 행 방향으로 합쳐 행렬을 만들 수 있다. 이 함수는 이후에 데이터프레임을 적용하거나 실제로 유용하게 사용하는 경우가 많으니 기억해두길 바란다.


> month.name[1:12]
 [1] "January"   "February"  "March"     "April"     "May"       "June"      "July"      "August"    "September" "October"
[11] "November"  "December"
> month.abb[1:12]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> LETTERS[1:26]
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
> letters[1:26]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

- 자료 생성을 위한 참고로 활용



4. Factors (요인)

일반적으로 분석하고자 하는 데이터 형태로 많이 보게될 형태이다. 우리가 흔히 접하게 되는 것들 남자, 여자, 또는 M(male), F(female), 남자=1, 여자=2 으로 구분하여 보게 되는 수준값을 자주 보게 되며 경우에 따라서 수준조합을 수치형태의 코드로 변경을 해야 하는 경우도 발생 한다. 아래의 예제들로 확인해보길 바란다.

> data = c(1,2,2,3,1,2,3,3,1,2,3,3,1)
> fdata = factor(data)
> fdata
 [1] 1 2 2 3 1 2 3 3 1 2 3 3 1
Levels: 1 2 3

 - factor() 라는 함수는 벡터를 Levels을 가지는 Factor로 변환한다.

> rdata = factor(data,labels=c("I","II","III"))
> rdata
 [1] I   II  II  III I   II  III III I   II  III III
[13] I
Levels: I II III

- levels() 함수는 요인의 수준 벡터를 가리키며, 수준값을 다른 문자로 변경 할 수 있다.


2014년 5월 8일 목요일

[Linux] How to install Oralce 11g R2 Database server on Centos 6.5

** 설치전 작업
[root@~] # yum -y groupinstall "X Window System"

1. Oracle을 설치하고 운영할 사용자 계정을 만든다.
Before installation, Oracle user account that you want to install and make operational.

[root@~] # groupadd oinstall
[root@~] # groupadd dba
[root@~] # useradd -m -g oinstall -G dba oracle
[root@~] # passwd oracle


2. Install Packages Check's
http://docs.oracle.com/cd/E11882_01/install.112/e24323/toc.htm#CEGHFFGG

binutils-2.17.50.0.6
compat-libstdc++-33-3.2.3
elfutils-libelf-0.125
elfutils-libelf-devel-0.125
elfutils-libelf-devel-static-0.125
gcc-4.1.2
gcc-c++-4.1.2
glibc-2.5-24
glibc-common-2.5
glibc-devel-2.5
ksh-20060214
libaio-0.3.106
libaio-devel-0.3.106
libgcc-4.1.2
libgomp-4.1.2
libstdc++-4.1.2
libstdc++-devel-4.1.2
make-3.81
sysstat-7.0.2

## Install/Update & Check
[root@~] #yum -y install compat-libstdc++-33.x86_64 binutils elfutils-libelf elfutils-libelf-devel
[root@~] #yum -y install glibc glibc-common glibc-devel glibc-headers gcc gcc-c++ libaio-devel
[root@~] #yum -y install libaio libgcc libstdc++ libstdc++ make sysstat unixODBC unixODBC-devel
[root@~] #yum -y install unzip



3. Environment Configuration

[root@~] # su - root
[root@~] # cd /etc/yum.repos.d
[root@~] # wget --no-check-certificate https://public-yum.oracle.com/public-yum-ol6.repo
[root@~] # wget --no-check-certificate https://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle

[root@~] # yum install oracle-rdbms-server-11gR2-preinstall

[root@~] # mkdir -p /home/oracle//app/oracle/product/11.2.0/dbhome_1
[root@~] # chown -R oracle.oinstall /home/oracle/app
[root@~] # chmod -R 775 /home/oracle/app

##SELINUX 설정 해제
[root@~] # vi /etc/selinux/config
SELINUX=disabled

##Hostname 변경
[root@~] # vi /etc/sysconfig/network
HOSTNAME=oracle

[root@~] # vi /etc/hosts
127.0.0.1   oracle


## Oracle 계정으로 변경
[root@~] # su - oracle

[oracle@~] # vi .bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH

# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_HOSTNAME=ora.saf.com;
export ORACLE_HOSTNAME
ORACLE_UNQNAME=DB11G;
export ORACLE_UNQNAME
ORACLE_BASE=/home/oracle/app;
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1;
export ORACLE_HOME
ORACLE_SID=ORCL;
export ORACLE_SID

PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH;
export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
export CLASSPATH
export PATH


[oracle@~] # source .bash_profile


3. Oracle Download and install

* Oracle Database Download URL - Down(must Login)

[oracle@~] # uzip *****.zip
[oracle@~] # ./runInstaller 


-- 설치 모드 화면에서 한글이 깨지는 경우는 아래와 같이 설정 한다. Font Error case 
[oracle@~] # export LANG=C


.... 중간 설치 화면은 생략 한다.


Configuration scripts need to be executed as the “root” user.
Go to the path given in the screen and execute the scripts one by one. Click on ‘OK‘ once scripts is executed.

[oracle@~] # su - root
[root@~] # cd /home/oracle/app/oraInventory
[root@ oraInventory ] # ./orainstRoot.sh

[root@~] # cd /home/oracle/app/product/11.2.0/dbhome_1
[root@ oraInventory ] # ./root.sh


[전산실 이야기] 전산(직)업을 준비하는 사람에게 추천하는 5가지

나는 누군가와 외부에서 만났을 때 무슨일 하세요. 하면 " 아 네 저는 개발자 입니다. " 라고 이야기 한 적이 별로 없다. 별로 없다는것은 한번도 없지는 않을 것이라는 스스로의 불안함이 조금은 내포되어 그렇다.  그렇다고 누군가에게 이야기 했다면 아니 아마도 누군가 한테는 개발자라고 당당히 말했을 지도 모른다. 그러나 어찌 되었든 나는 누군가 나에게 물었을 때 보통.. 나의 소속을 이야기 하곤 한다.

" 아 네 전산팀에 있어요 " 또는 " 아 네.. 전산 일 해요 " 라고 하면 대단히 신기하게도 다들 이해 하는 표정과 함께 " 아 네~~~ 그렇군요" 한다. 억양을 들어보면 누구나 다 이해할 만한 수준이다.  참으로 궁금하고 참으로 대단하다고 생각하는 건 도통 난 전산(算) 이란 이 용어에 대해서 무슨 뜻인지 잘 몰랐다. 아니 더 정확히 말하면 사람들은 무슨 뜻으로 이해 하는지 잘 몰랐다.

#구글에서 검색하면 이렇게 나온다.. 전산을 검색 한건 처음이다.

어느덧 전산팀에 10년 이란 시간이 지나 보니 사람들이 이해하는 전산 이란 용어는 = 컴퓨터를 고치는 일 또는 컴퓨터와 관련된 모든일을 다 할줄 아는 또는 IT라는 용어와 관계 있으면 모든것을 아는 뛰어난(?) 사람 으로 이해하는 부류와 그냥 저냥 할일 없이 농땡이 피면서 우리가 시키는 일이나 제대로 하길 바란다는 표정을 갖는 부류로 양분되는것 같다. 후자 같은 경우 너무 비약이 심한 것 아니냐고 말할 수 있으나 대략적으로 표현이 거칠었을지 모르나 비주류에 IT 부서가 있는것 곳은 주류에 포함된 곳보다 훨씬 더 많다는게 현실이다. 나 개인으로도 지금 주류인가 비주류인가 라고 질문 한다면 그 중간 어디쯤이라고 말하고 싶다. ( 마음과 생각만은 그렇다. ) 

후자의 분류는 잊고 전자의 모든것을 아는 IT인 이라면 어떨까. 내 생각엔 과대 평가 이다. 또는 선입견일 수도 있다. 문득 가장 많이 당황하거나 놀라는 순간은 이렇다. 많은 분들이 저에게 엑셀의 사용을 문의 하신다. 하지만 나는 엑셀에 기본적인 기능과 함수( 그래봐야 SUM, IF, COUNT ... 등등)일 뿐이다. 모른다고 대답하면 " 뭐야.. 귀찮은가 보넹.. " 라고 생각한다. 물론 아닐 수 도 있으나 표정을 이미 그렇다고 봐도 된다. 보통 60% 이상은 그렇게 생각 한다.





구구절절 쓸데 없는 이야기 같은 소리들을 널려 놓은 것은 개발방법론에 대한 작지만 개인 적인 생각을 남겨 놓고자 함이다.

난 일반적인 완성품(상용) 패키지 소프트웨어를 개발해 본적이 없다. 또한 주변 분들이 넌 맨날 갑질만 했잖아 라고 하시는데 계약 관계에서의 분명 갑은 맞으나 온라인이나 외부 분들의 열악한 SI  환경과 같은 갑같은 행동과 경험은 가져보질 못했으니 갑이라고 생각하진 않는다. (그래도 넌 갑이야 라고 얘기하는 거래처 분들이 계신 수 있으니 논지에서 벗어나므로 넘어 가련다.)  
  
개인적으로 개발 경험이 기업내부 어플리케이션에서 Web Group Ware, ERP, CRM 등의 프로젝트에 참여해 내부의 프로세스를 개선하고 어플리케이션을 개발 하는 일을 해왔다. 가끔은 학교 졸업한 선/후배들의  SI 이야기가 무척 궁금증을 유발하긴 한다. 어떤 분위기 인지 어떤 시장인지... ** 같은 *들이라고 표현하는 것이 진정 무엇인지. 그렇다고 그쪽으로 가고 싶단 생각 또한 못해봤다. 아니 안해본게 맞을것 같다.  외부 고객이 아닌 내부 고객을 상대 하다 보면 장단점이 있기 마련이다. 어떤 내부 고객을 상대 하느냐에 따라 개발은 그에 따라 방법론이 달라 지는 차이가 나에겐 있다.  

보통의 내부 프로세스 개선(비공식) 으로 진행할 땐 전통적인 개발 방식을 고수 한다. 개선해야할 요구사항을 정리하고 명세서를 작성하고 모델링하고 정의서(단어, 용어, 개발 가이드라인, 데이터구조 등)을 정리하고 프로그램을 개발한다. 그리고 테스팅 하고 배포 한다. 생각해보면 이런 과정을 했던것은 10년동안 딱 1번 뿐이다. 분명 학교에서 소프트웨어 공학이나 개발 방법론등을 배울땐 어딜 가나 모두 이렇게 개발 하는 줄 알았다. 물론 자원이 좀더 났고 개발 환경이 좀더 시스템화되어 있는 곳은 항상 이렇게 할 것으로 생각된다. 개인적으로 경험해 보진 않았다. 그래서 그곳이 이렇다 저렇다 하긴 내 관점이 아닌것 같다. 





 외부 고객이든 내부 고객이든 기다려주지 않는 다는 공통점을 가지고 있다. 아이러니 하게도 개발의 일정과 배포 일정을 공유하였는데도 항상 그 이전의 날짜에 질문한다. "안됐어요?" 질문인지 반문인지 모르는 것들 아직도 궁금하긴 하다. 질문 맞나? 또한 외부 고객은 계약관계와 지급해야할 돈을 가지고 협박한다면 내부 고객은 나의 지식수준과 경력을 평가하여 조직내부의 부정적 여론을 만든다. (한두번 당해본일이 아니다. 협의 할때 내 앞에선 굽신거리다가 뒤에서 내 뒤통수가 터질것 같은 느낌을 받아 본게 참으로 많다.) 



이 글의 목적은 내부 고객의 어처구니 없는 요구사항에 문제가 있다고 지적질 하고 나는 잘났다는 표현을 하고 싶은 것이 아니다. 세상에 모두 흑과백만 있는것 또한 아니고 꼭 그런 사람만 주변에 있는것 또한 아니다. 단지 좀더 많을 뿐이다. 그렇다면 내가 또는 우리 분야에 일하고 있는 사람들이 어떠한 준비를 해야 할까 라는 고민을 하게 되어 나름대로 정리를 해보고자 했다. 우리가 기본(?)으로 가져야할 준비는 몇가지 있지 않을까 말이다. 물론 해당 IT 기술은 그에 준하는 것이 반드시 필요 하므로 그부분은 생략 하도록 한다. 어느 곳에나 각기 다른 기술을 요하므로 내가 말하고자 하는 것은 공통적이고 상식적이나 잘 인식하지 못하는 것 아닐까 싶다. 

이런 저런 이야기를 두서없이 하는것은 10년을 해보니 이제야 기본을 알게 된것 같고 그러한 기본을 갖기 위해서 필요한 것은 어떤 것이 있을까 정리해보고 앞으로 살아가야할 내 자신을 다시 다독이고 또 이 분야로 오게될 후배들이 이러한 것들을 좀더 보강을 한다면 보다 더 좋은 환경에서 근무 할 수 있지 않을까 생각을 하게 되었다. 


* 전산(직)업을 준비하는 사람에게 추천하는 5가지 
 - 분류기준을 오해할 수 있으나 여기서 말하는 전산(직)업은 일반 기업에서 자체 IT조직을 가지고 있는 경우에 대한 제한임을 사전에 공유하고 싶다. 물론 그렇지 않더라도 추천해주고 싶은 것이기도 하지만 말이다. 

1. 전략적으로 생각하고 상대말의 말에 귀기울인다.
  - 과거엔 정보화 전략이란 말을 알아 듣지 못했으나 10여년이 지나고 나서야 현업과 미팅을 할때 알게된 사실은 요구사항에 관계되어 있는것은 한두가지가 아니라는 사실이다. 복합적인 내용을 인지하고 사고하여 요구사항을 정리 해야 하고 현업에서 이야기 하는 것을 적극적이고 호전적인 자세로 귀기울이는것이 필요 하다. 간혹 현업의 이야기를 자꾸 짤라내고 안된다는 말만 하는 경우가 있는데 참으로 해줄 말이 없다.


2. 전체적인 사회 흐름과 변화에 대한 공부를 꾸준히 해야 한다.
  - 기술에만 집착하다 보면 큰 그림을 보지 못하는 경우가 있다. 다른곳은 몰라도 전산실이나 전산팀에선 깊이 있는 기술적 기능 보단 전체의 그림을 보는것이 필요하다. 말하지 않아도 지금의 시대는 기술만 존재하지 않는다. 기술은 문화고 문화는 기술을 활용해 좀더 나은 세상을 만들어 가는 것 아닐까. 또한 입사하고 나면 공부하지 않는 사람이 참으로 많다.


3. 보고서 작성과 PT는 내 본업이다 라고 생각하라
 - 보고서 작성 기법은 참으로 지금 현재 나에게도 숙제이다. 제대로 하지 못한다고 생각하기 때문이다. 그래서 더더욱 중요하다. 상사가 원하지 않아도 보고서는 항상 작성하도록 한다. 언제든지 원할때 준비 했던 보고서를 꺼내길 바란다. 기회는 언제나 오지도 않을 뿐더러 기회는 순간적으로 왔다 가는 경우를 많이도 봐왔다. 그리고 정작 더 중요한것은 보통의 상사는 보고서 내용을 보지 않는다. 내 눈과 입만 바라볼 뿐이다.


4. 독서에 많은 시간을 할애 하라(인문학적 도서를 추천한다)
 - 이미 IT 기술서 독서량은 충분하리라 생각한다. 그런데 문든 10년 동안 외부에서의 변화나 내부에서의 변화나 결국 사람이 중심이 된 변화되는 모습을 볼 수 있다. 근본적으로 사람을 이해하고 사회를 이해하고 역사를 이해 한다면 언제든지 새롭게 요구되는 현업의 요구사항이 말도 안되는 내용이라고 치부해버리지는 않을 듯 싶다. 또한 전산실을 떠나서라도 언제든지 준비된 사람이라고 단언 하고 싶다.


5. 현업 타부서의 핵심 인재들과 친구가 되어라
 - 결국 내부 고객을 상대하는 우리는 영원한 적도 영원한 친구도 없다. 그렇다면 모두를 적으로 만드는 불상사를 하지 않길 바란다. 그렇게 될 경우 언젠가 본인이 생각한 모든것들이 하루 아침에 물거품이 되는것을 보는 것은 시간 문제이다. 또한 IT 투자에 인색한 조직일 수록 현업의 힘이 크게 작용하므로 반드시 섭외해야 할 인재들이다.

두서 없이 이런 이야기 저런 이야기를 남겨봤다. 그냥 쓰레기 같은 글이 될지 조금이나마 도움이 될 진 모르겠으나 나 개인적으로 나마 내 생각을 정리 해봤고 이 5가지를 위해서 지금도 그리고 앞으로도 좀더 노력해야 한다는 사실을 다시 한번 확인 한다.

오늘은 어버이날인데 내 부모와 장인, 장모님께 꽃한 송이 달아 들이지 못한것이 참으로 죄송스러운 하루이다. 모두 건강하세요. 감사합니다.







[PowerBuilder] Install - cannot to license Server

[Web Ref] http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc37771.1250/doc/html/den1245251349437.html

신규 설치를 하거나 추가로 설치 하는 경우 이런 문제가 있을 줄을 몰랐다. 결론적으로 IPv4와 IPv6에 대한 지원이 모두 되는 기준이나 기본적으로 IPv4를 제공한다. 하여 비활성화를 처리 하고 나면 제대로 설치가 진행이 된다.

나와 같은 뻘짓(?)을 하지 마시라고 공유

** 윈도우 환경에서 설치시 오류..
hen starting the SySAM license server, you may see this error:
lmgrd is not running: Cannot connect to license server 
system. (-15,570:10035 "WinSock: Operation would block")
This version of Sybase IQ includes Internet Protocol Version 4 (IPv4) and Internet Protocol Version 6 (IPv6) versions of the SySAM license server software. You can choose the version of the license server based on your environment using the sysam configure command. By default the IPv4 version of the license server is configured for use.
The IPv4 version of the license server cannot be used properly, if you have enabled IPv6 on the license server host. If this is the case, you can:
  • Disable IPv6 TCP/IP protocol on the license server host.
  • Use another Windows host that does not have IPv6 enabled.
  • Use a UNIX host for the license server. You can use the IPv4 version of the license, even if both IPv4 and IPv6 are enabled on UNIX.

2014년 5월 3일 토요일

[Using R] R Install & RStudio Install for Windows


* 설치 환경
 - Windows 7 Professional K 64Bit
 - R 3.1.0
 - RStudio 0.98


1. R 다운로드


2. R Project



윈도우 32/64 Bit 가 모두 포함되어 있는 파일이다. (윈도우용인 경우) 그런데 간혹 자신의 비트에 맞도록 설치하다 보면 (64Bit인경우) 찾을 수 없는 오류가 나는 현상을 많이 보아 왔다. 가급적이면 32/64 비트 관련 파일 체크를 건드리지 말고 설치 하길 바란다. 

이후 진행되는 여러가지 패키지 사용이나 활용을 위해서 한가지 주의 해야 할 부분은 윈도우 설치 시 계정명(사용자명)을 한글로 사용한 경우 기본 워크스페이스가 연결되거나 DLL이 로드될때 오류가 나는 현상을 종종 보아 왔다 설치 하여 사용하는 경우는 계정명을 영문으로 하시길 바란다. 


 3. RStudio Download





설치 후 기본 화면을 구성한다. R 사용을 위해서 반드시 필요 한것은 아니나 여러가지 툴 가장 좋은 기능을 제공하는 것으로 생각된다. 환경에 따라 R Server, RStudio 를 구축 하는 경우 웹환경에서도 사용자별로 제공이 가능 하다. 





동장방식에 대한 설명을 좀더 붙여 보고자 그림을 그리려다 우연히 오래전 자료를 보고 참여하여 그림을 한장 붙인다. 이 그림은 (주)센소메트릭스에서 발행한 "R의 설치 및 기본 사용법"을 참고 하였음을 알린다.

R의 작동 방식


기본적으로 R 시스템은 입력되는 스크립트와 저장되는 변수들을 메모리에 저장하였다가 결과를 보여주는 형태로 이뤄진다. 입력되는 데이터는 로컬에 존재하는 파일(이미지포함) 인 경우도 있고  인터넷 상에 있는 외부 데이터인 경우도 있다. 간혹 로드되는 데이터가 사이즈가 많은 경우 사용하는 클라리언트 메모리 사양에 따라 결과를 확인하지 못하고 정지 되는 경우가 많으므로 이에 따른 적절한 조치가 필요 하다.

* Sample Source
Ref  - http://cran.r-project.org/web/packages/doParallel/index.html

install.package("doParallel")
library("doParallel")

cl <- makePSOCKcluster(2)
registerDoParallel(cl)

m <- matrix(rnorm(9), 3, 3)
foreach(i=1:nrow(m), .combine=rbind)

stopCluster(cl)

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...