2014년 5월 28일 수요일

[Using R] Operator Syntax and Precedence

Ref. Paul Teetor의 R Cookbook. Copyright 2011 Paul Teetor, ISBN : 9780596809157


연산자에 대한 우선순위를 잘못쓰는 경우는 정말 자주 발생을 하게 된다. 내 스스로가 프로그래밍을 하면서도 많이 격게되는 실수도 아주 지극히 사소한 부분에서 발생 하는 경우가 많은 것은 동일 선상에 있는 경우와 같다. 사소한 부분을 챙기는 것이 기초가 된다는걸 누구보다 공감한다.

#아래와 같은 예제를 보자
> n <- 10

# 0 에서 부터 n-1 = 9 까지 숫자를 생성할 것이라 생각했다면? 오류다.
> 0:n-1
 [1] -1  0  1  2  3  4  5  6  7  8  9

R은 주어진 식을  ( 0 : n ) - 1 로 인식하기 때문이다.

R은 또한 %...% 기호사이의 문자를 이항연산자로 해석한다.

1) %% - 나머지 연산자
2) %/% - 정수나눗셈 (나머지를 버리고 몫만 취하는 나눗셈
3) %*% - 행렬곱셈
4) %in% - 왼쪽 피연산자가 오른쪽 피연산자에 나타나면 TRUE를 반환


Web Site Ref --> http://stat.ethz.ch/R-manual/R-patched/library/base/html/Syntax.html

The following unary and binary operators are defined.
They are listed in precedence groups, from highest to lowest.

:: :::access variables in a namespace
$ @component / slot extraction
[ [[indexing
^exponentiation (right to left)
- +unary minus and plus
:sequence operator
%any%special operators (including %% and %/%)
* /multiply, divide
+ -(binary) add, subtract
< > <= >= == !=ordering and comparison
!negation
& &&and
| ||or
~as in formulae
-> ->>rightwards assignment
<- <<-assignment (right to left)
=assignment (right to left)
?help (unary and binary)

2014년 5월 27일 화요일

[Using R] R Cook Book #2 Sample - seq(), rep()

기본적으로 생성함수인 c() 함수를 활용하나 일일이 값을 넣어 주는 경우는 극히 드물것이라 생각이 든다. 아래의 수열생성하기에 활용되는 seq(), rep() 함수를 활용한 예제를 볼 수 있다.

# 0 부터 20 까지 값 2씩 증가 하여 생성
> seq(from=0, to=20, by=2)
 [1]  0  2  4  6  8 10 12 14 16 18 20

# 0 부터 20 까지 5개의 변수를 생성
> seq(from=0, to=20, length.out=5)
[1]  0  5 10 15 20

# 0 부터 100 까지 5개의 변수를 생성
> seq(from=0, to=100, length.out=5)
[1]   0  25  50  75 100

# 0 부터 20 까지 5개의 변수를 생성 (단, 소수점 추가)
> seq(from=1.0, to=100.0, length.out=5)
[1]   1.00  25.75  50.50  75.25 100.00

# rep() 반복을 의미 함 PI값을 5번 반복 생성
> rep(pi, times=5)
[1] 3.141593 3.141593 3.141593 3.141593 3.141593

#예제 활용 값 생성
> fib <- c(0, 1, 1, 2, 3, 4, 5, 8, 13, 21, 34)
> fib
 [1]  0  1  1  2  3  4  5  8 13 21 34

# 백터값 원소를 접근하는 방식 첫번째에서 부터 세번째 값 까지 접근
> fib[1:3]
[1] 0 1 1

# 백터값 원소를 접근하는 방식 첫번째, 세번째, 다섯번째 값 접근
> fib[c(1,3,5)]
[1] 0 1 3

# 백터값 원소 중 첫번째를 제외한 모든 값
> fib[-1]
 [1]  1  1  2  3  4  5  8 13 21 34

#중앙값 보다 큰 모든 원소를 선택
> fib[ fib > median(fib)]
[1]  5  8 13 21 34

# 상하위 5%안에 있는 모든 원소를 선택
> fib[ (fib < quantile(fib, 0.05)) | (fib > quantile(fib, 0.95)) ]
[1]  0 34

# 평균에서 +_ 표준편자를 넘는 모든 원소를 선택
> fib[ abs(fib-mean(fib)) > 2*sd(fib)]
[1] 34

#NA나 NULL이 아닌 모든 원소 선택
> fib[ !is.na(fib) & !is.null(fib)]
 [1]  0  1  1  2  3  4  5  8 13 21 34

# 백터값 생성 후 개별적으로 이름을 줄수도 있다.
> year <- c(1979, 1980, 2011, 2012)
> names(year) <- c("John", "Umsh", "JunSeok", "BeomSeok")
> year
    John     Umsh  JunSeok BeomSeok
    1979     1980     2011     2012

#이름을 통한 원소 접근이 가능 하다.
> year["John"]
John
1979


# Sample Source - NA value
> x <- c(0, 1, 1, 2, 3, NA)

> mean(x, na.rm=TRUE)
[1] 1.4

> sd(x, na.rm=TRUE)
[1] 1.140175

** Reference Book
** R Cookbook - ISBN 9780596809157

[Using R] Cannot load rJava.dll error

 "KoNLP"는 한글에 관한 텍스트 마이닝(text mining package) 을 사용하기 위해서 라이브러리를 로딩하다 보면 기본적으로 " rJava " 패키지를 로딩하게 된다. 그런데 아래와 같은 상황이 발생 하는 경우 몇가지 체크하고 처리 해 줘야 할 것들이 있다.

* Error Log Display

> library(rJava)
Error : .onLoad failed in 'loadNamespace' for 'rJava'
Error: package/namespace load failed for 'rJava'

Error in inDL(x, as.logical(local), as.logical(now), ...) :
  unable to load shared library
     'C:/Program Files/R/R-3.1.0/library/rJava/libs/x64/rJava.dll':
  LoadLibrary failure:  The specified module could not be found.


** Operation Env.

1) Windows 7 64Bit

2) R version 3.1.0 (2014-04-10)

3) Java 1.7.55
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)



** 해결방안

1) 환경변수에 JAVA_HOME 추가
JAVA_HOME=C:\Program Files\Java\jre7\bin

2. 환경변수 PATH에 값을 잘아 줌
Path=%PATH%;C:\Program Files\Java\jre7\bin\server\;C:\Program Files\R\R-3.1.0\bin\x64


* 이것이 아니어도 몇가지 맞춰야 할 정보들이 있다면 JDK 또는 JRE의 Bit 를 맞춰야 한다. R을 64비트 인경우 Java도 64비트로 설치하고 32비트 인경우 32비트로 맞춰야 한다.

2014년 5월 26일 월요일

[Private Story] Start My Story - #2 남달랐던 유년기 시절

#My Story #2 - 남달랐던 유년기 시절

이 글은 스스로를 돌아 보며 생각하는 글이기도 하면서 먼 훗날 나의 사랑하는 두 아들 밝음이와 맑음이가 글을 읽고 지금의 아빠를 그때의 너희가 이해할 수 있길 바라면서 남기는 미리쓰는 편지로 남았으면 한다. 너희 할아버지가 돌아가시고 나서 아빠는 할아버지의 흔적을 책장에 있는 책 몇권에 남겨진 사인이 전부란 사실에 가슴이 너무나 아팠다. 그리고 안타까웠다. 그래도 마지막 서명에 남겨진 할아버지의 뜻을 가슴으로 받았단다.

내 이야기를 다시 이어간다. 나는 유년시절 참 말썽꾸러기 아이였던 것으로 기억이 되고 또 시골 어르신들의 기억속에도 크게 다르지 않다. 시골에서 자란 나는 온동네에 있는 외양간, 그리고 논과 밭이 나의 놀이터 였고 또 내 어린 시절의 추억의 현장이기도 했었지. 하지만 그 때 내 기억속의 아버지는 무섭기만 한 존재였고 어렴풋이 기억나는건 지팡이를 들고 계시던 할아버지의 모습만 흐릿하게 기억에 남아 있다. 운동을 좋아 했고 달리기를 보통보다는 좀더 나아가 400미터 계주로 부락(이게 국어사전의 표준어 인지는 모르겠다) 대표로 나갔었다. 자랑거리 아닌 자랑거리가 되었던 어린시절 난 아마도 운동선수는 되지 못하더라도 레져 스포츠 선생님이나 그쪽 분야에 분명 가 있을 것이라고 처음 미래에 대한 단꿈을 꾸웠었다.

그런데 나에게 첫 시련(? - 지나고 보니 시련이라기 보단 전환점)이 생겼다. 중학교 시절 즈음이었던 것으로 기억이 난다. 매일 매일 저녁마다 피곤함을 이기지 못했다. 당연히 앉아서 가만히 있던 성격이 아닌 대부분의 시간을 운동을 하거나 밖에서 뛰어 논 것이 전부 였던 나 였으니 몸이 피곤한 것이라고 생각을 했지 나의 몸에 이상이 있을 것이라곤 생각도 하지 못했다. 가까운 병원에 가서 피검사 결과 더 큰 병원에 가길 권했다. 어린나이에 뭐가 뭔지도 모르고 시내로 나간다는 즐거움이 더 컸을까? 기억해보면 내 자신의 상태를 정확히 알지 못했던것 같다. 내가 느낀건 부모님 두분의 얼굴이 심각했다는 것 이었다. 그리고 그 이후로 전국에 몸에 좋다는 민간요법의 것을을 무진 찾아서 해주셨다. 이후에 알았는데 그 당시 치료제가 존재하지 않았다고 한다. 대부분 임상실험 중이었고 실제로 상용화 되기엔 시간이 필요 했다.

그 이후 많은 것들이 달라 졌다. 친구들과는 다른 삶을 살아야 했다. 다른 시간이 학교에 가고 다른 시간에 집에 가며 같은 공간에 있지만 다른 생각을 하고 다른 행동을 해야 했다. 내 학창 시절에 가장 힘든 시기 였던것 같다. 왜 나만 그래야 하는지 다르다는걸 인정 할 수 없었다. (물론 성적이 다르다는건 참으로 인정을 빨리도 그리고 진심으로 했다. ). 그 당시엔 생각하지 못했지만 지나고 보니 내가 달라지는 계기(?)가 되었다. 아니 인생에 전환점 이었다고 기억에 남아 있다.

사는것 인생이란 단어에 큰 의미를 부여한 적도 생각해본적도 사실 없었다. 부끄럽단 생각을 하게 되었던 끝을 알 수 없는 병원 생활의 시작에서 난 장르를 불문한 독서를 하게 된 계기가 되었다. 주로 시집을 읽게 되었다. 글씨가 너무나 많은 책들을 처음부터 접하기 참 힘들었고 알수 없는 끓어 오름이라는 그 무언가는 사랑에 목말라 있었다. 누구는 삼류 사랑 타령이란 시집부터 고전에 이르기 까지 아낌없이 읽고 또 읽었다.

( 그 당시 읽다 보니 쓰고 싶어 졌고 쓰다 보니 내 책을 내보고 싶단 생각도 했던것 같다. 아쉽게도 20살 혈기 왕성할 때 모두 불태워 버리거나 친구녀석(?)을 줬는데 아마도 다 버렸을 것으로 생각이 된다. )

중간 중간 학기가 시작이 되면 난 다시 퇴원을 했고 방학이면 입원을 했다. 병원생활 해본 사람은 알겠지만 그렇게 재미난 경험은 아니라는 것. 난 학창시절을 그런 반복속에 살아 갔다. 그 당시 내 병실엔 나보다도 한참이나 나이 많으신 분들이 많으셨다. 심하게 안좋으신 분들도 계셨고 피로가 누적되 그냥 몇일 쉬다가 가시는 분들도 계셨고 부족한 나의 사회성을 그 병실 자그마한 곳에서 새롭게 배워가고 있었다. 자그마한 6평 남짓한 곳엔 세상이 있었다. 각자의 인생을 풀어 내는 보따리가 항상 가득했다. 삶에 대한 후회도 있었고 나이가 지긋했지만 앞으로의 희망도 있었다. 하루종일 난 한마디 없이 그분들의 이야기를 오롯이 듣기만 했다. 문득 그런 생각이 들었다.

내일 당장 내가 여기서 죽는 다면 난 내 짧은 인생(삶)에 대해서 뭐라 말을 해야 할까? 이렇게 그냥 아무 생각 없이 끝내고 싶거나 죽고 싶지 않다는 생각을 하게 되었다. 남아 있는 삶이 얼마인지 모르나 순간 순간에 최선을 다 해야 겠단 생각을 그리고 나만 생각하고 살지 않길 스스로에게 다짐하는 기회가 되었다. 그것이 다분히 착하게 살아야 겠다는 아니었다.

그 당시에 난 많은 것을 배운것 같다. 왜 살아 가는 하루 하루가 소중한지 알았고 정성을 다해 열심히 살지 않으면 안되는지 그리고 내가 처해진 상황에 대한 것을 진실되게 받아 들이지 않는다면 힘들어 지는건 나 하나 뿐 아니라 내 주변에 모든 사랑하는 사람들이 함께 아파 한다는 것을 말이다. 그래서 그 당시의 나는 가장 많이 성장한 시기이자 전환점이었다 생각을 한다. 너희들에게도 분명 나와 같은 시기와 비슷한 경험을 하게 되리라 생각된다. 분명 살면서 힘든 시기는 반드시 온다. 하지만 그때 꼭 기억하길 바란다. 가장 힘든시기에 가장 많은 기회와 본질적인 마음의 성장을 너희에게 가져다 줄 것이다. 피하려고만 하지 말길 바란다. 그것을 받아 들이 돼 진심으로 받아 들이고 마음에 새기고 새로운 네가 아닌 성장한 네가 되길 진심으로 바란다.

책을 읽는 것을 게을리 하지 말거라. 그곳엔 답이 없지만 앞으로 살아가야 할 너희들이 선택한 인생에 대한 답을 만들어 줄 것이다. 그리고 어떤 사람이든 너의 주변에게 너에게 말하든 그렇지 않든 모든 말에 새겨 들어라 그 모든 말들은 너희들의 생각에 좋은 영향과 나쁜 영향을 함께 주면서 어떤 말들이 올바른 선택을 위한 말인지 잘못된 말인지 구분할 수 있는 능력을 만들어 줄 것이다.

오늘 하루도 잠시전 그 시간도 후회없는 삶을 살길 바란다. 또한 나에게 남은 많은 시간들을 나도 그렇게 보내기 위해 오늘도 노력하고 노력하겠노라 약속 하마.







2014년 5월 23일 금요일

[Movie #1] 영화 역린을 보다. - 현빈을 다시 보다



[사진 출처 - 네이버 영화]


아이들 둘 낳고 키우다 보니 극장에서 마음놓고 영화를 보는 일이 흔하지 않은건 우리들 만의 일은 아니다. 아내의 생일이기도 했고 또 왠지 가끔 한번씩 이렇게 나와서 영화를 보는것도 좋겠다. 싶어 오게 되어 선택한 역린이란 영화는 뜨거운 가슴과 여운을 몇일이 지난 지금도 남아 있다.

주변에서 영화에 대한 좋고/나쁨이 확연하게 구분되어져서 사뭇 놀라기도 하고 영화/연기를 전공한 친구 까지 별로라는 대답을 했을 땐 그냥 그저 그런영화 이구나 싶었다. 그런데 끝나고 나서 쉬이 자리를 일어나지 못했다. 미안한 마음과 죄송한 마음 그리고 그것이 한꺼번에 찾아 온것이다. 혹평을 한 전문가나 기자나 평론가들의 기준이 무엇인지 잘 모르겠으나 영화의 주된 내용을 소품이나 중간 중간의 억지스러운 전개가 있다고 하기엔 평가 자체가 좀 억지스러운것 아니었을까?

정조에 대한 암살 사건에 대한 24시간이 숨막히게 돌아가고 있는것에서 과거의 회상 신들이 나타나며 지금의 모습의 설명을 덧붙여 주고 있다. 어떤 이들은 이것이 중심을 잡지 못한 이유로 꼽고 있으나 개인적인 생각으론 공감되지 않는 트집으로 밖에 안보인다. 난 몰입도가 끝날 때 까지 좋았는데... 뭐 개인적인 사람들 간의 차이가 있을수 있으니 뭐라 말하기엔 어렵지 않을까 싶기도 하고 말이다.

어찌 되었든 영화를 보고 나서 밀려오는 지금 이 순간의 대한 민국이 떠오르지 않았다면 아마도 그는 역린이란 영화를 보고 혹평을 쏟아 낼 지 모르겠다. 정조의 마지막 대사로 나오는 중용의 23장에 대한 말이 계속 깊은 가슴을 두두리는 것은 우리가 그렇게 살아 가지 못한 미안함과 또 우리가 그렇게 살아야 할것이라는 메세지를 주는 것은 아니었나 싶다. 이 시나리오를 보고 받아 들인 현빈이 얼굴만 잘생기고 몸매만 좋은 것이 아니라 현빈이란 배우를 새롭게 다시보게 된 영화가 아닐 수 없다.

" 오직 세상에 지극히 정성을 다하는 사람만이 나와 세상을 변하게 할 수 있는 것이다. "

잊지 말자...



- 기억에 남는 부분이자 역린의 시작과 끝인 부분은 바로 중용의 23쪽을 아는가?

其次(기차)는 致曲(치곡)이니 曲能有誠(곡능유성)이니
誠則形(성즉형)하고
形則著(형즉저)하고
著則明(저즉명)하고
明則動(명즉동)하고 動則變(동즉변)하고
變則化(변즉화)하니
唯天下至誠 (유천하지성)이야 爲能化(위능화)니라.


작은 일도 무시하지 않고 최선을 다해야 한다.
작은 일에도 최선을 다하면 정성스럽게 된다.
정성스럽게 되면 겉에 베어 나오게 되고
겉에 베어 나오면 겉으로 들어나고
겉으로 들어나면 이내 밝아지고
남을 감동시키면 이내 변하게 되고
변하면 생육 된다
그러니 오직 세상에 지극히 정성을 다하는 사람만이
나와 세상을 변하게 할 수 있는 것이다.


[Book #23] 여덟 단어 - 박웅현 지음



"책은 도끼다" 라는 책을 읽어 보신 분이라면 박웅현 작가의 책이 주는 몰입감을 잊을 순 없으실 겁니다. 그만의 독특한 관점과 사고가 흥미로웠던 과거의 책들 이었다면 이번에 추천 드리는 여덟 단어는 지극히 평범하지만 삶에 대한 우리들의 자세에 대한 깊은 성찰이 필요 하다는 것을 공감할 수 있을 것이라 생각됩니다.

결국 일, 업 이라는 것에 대한 깊은 본질적 고민이 묻어나는 공감어린 글들이 참으로 많습니다.

책은  저자가 생각(정리)한 여덟개의 단어를 중심으로 우리가 우리 스스로의 삶에 대해서 좀더 진지하고 좀더 인문학적인 사고로 접근을 해보는 그러니깐 인문학이 가지고 있는 공통점인 본질을 찾아 가는 과정과 생각들을 가져야 한다고 잘 풀어내고 있습니다. 어떤것을 모르는 사람에게 알려주는 그런 풀이가 아니라 함께 공감하고 느끼고 이해하는 과정을 스스로 펼쳐 준다는 그런 느낌의 책입니다.



제 1강 - 자존 : 당신 안의 별을 찾으셨나요?
제 2강 - 본질 : Everyting Changes but Nothing Changes
제 3강 - 고전 : Classic, 그 견고한 영혼의 성
제 4강 - 견 : 이 단어의 대단함에 대하여
제 5강 - 현재  : 개처럼 살자
제 6강 - 권위 : 동의되지 않는 권위에 굴복하지 말고 불합리한 권위에 복종하지 말자
제 7강 - 소통  : 마음을 움직이는 말의 힘
제 8강 - 인생  : 급한 물에 떠내려가다 닿은 곳에 싹 틔우는 땅버들 씨앗처럼


위의 8가지 내용 중 모두 추천하고 좋은 공감의 내용이지만 2강 본질에 대한 이야기가 가장 가슴에 남았습니다.  에르메스 브랜드 지면광고에 나오는 문구인 " Everyting Changes but Nothing Changes  " 모든것은 변하지만 아무것도 변하지 않는다. 본질에 대한 이야기는 어쩌면 식상하고 또 꺼내기 어려운 이야기 일 수 있습니다. 그러나 각자 자신의 삶에 대한 본질이든 기업이 가진 본질적 의미이든 우리가 잊지 말아야할 그리고 또 잊어서도 안되는것이 바로 이것 이지 않을까 생각합니다. 세상에 70억의 사람이 있지만 그 모두가 다릅니다. 세상의 아주 많은 기업이 있지만 모두가 같은 기업이 아닙니다. 그들은 각자의 본질을 가지고 있습니다. 또한 그 본질에 다가가기 위한 방법을 방식을 가지고 있습니다. 그들을 따라가기 위한 무조건적인 방식이 아니라 자신의 본질을 먼저 정확히 인지하고 찾아 낸 다음 내 안의 궁극적인 방향과 방식을 찾아내는 인문학적인 사고와 관점이 요구되는 때 입니다. 본질은 현재의 안위를 보장하지 않습니다. 그러나 본질 찾기를 시작한 우리에겐 더 많은 행복과 자신감을 심어 줄 수 있으리라 확신 합니다. 책 읽기에 참 좋은 요즘 시작 해보세요.  



이 책의 맨 뒤편엔 이렇게 쓰여 있다.

"
인생의 정답을 찾지 마시길, 정답을 만들어 가시길
내일을 꿈꾸지 마시길, 충실한 오늘이 곧 내일이니
남을 부러워 마시길, 그 많은 단점에도 불구하고 나는 나.
시류에 휩쓸리지 마시길, 당대는 흐르고 본질은 남는것
멘토를 맹신하지 마시길. 모든 멘토는 참고 사항 일 뿐이니.
이 책의 모든 내용을 단지 하나의 의견으로 받아들이시길.
그리고 당신 마음속의 올바른 재판관과 상의하며
당신만의 인생을 또박또박 걸어가시길
당신이란 유기체에 대한 존중을 절대 잃지 마시길
"

 - 박웅현




내 인생과 삶 또한 나만의 것이나
나 혼자만의 것이 아니라 본질적으로 내가 중심이된 삶이라는 뜻이겠으니
행복이 나만 행복하면 행복한것이 아니고 내 옆사람이 행복하고 가족이 행복하고 공동체가 행복한 그래서 모두가 행복한 것이 그 삶이 좋은 삶이 아닐까. 그러기 위함에 있어 내가 지금 이 순간을 어떻게 헛되이 보낼 수 있겠는가 싶은 생각이 든다.


2014년 5월 19일 월요일

[Using R] Cook Book Tip - Help & Search

#Command to view the contents of the document
help.start()

#View full help by function
help(function name) 또는 ?function name

#View by simple functions for function arguments
args(function name)

#Run this example by using the function
example(function name)

#Example
install.packages("rpart")
library(rpart)
help(rpart)
args(rpart)
example(rpart)

#Search the documentation
help.search("pattern")
??pattern


#Sample
install.packages("tseries")
library(tseries)

help(adf.test)
help.search("adf.test")

help(package="tseries")
vignette()
vignette(package="package name")
vignette("package name")


# If you need to search through the internet
RSiteSearch("Key Word")


Ref. Paul Teetor의 R Cookbook. Copyright 2011 Paul Teetor, ISBN : 9780596809157


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

R Language Basic #3 - Sample Data

R Language Basic #1 Review
R Language Basic #2 Review


10. Subset, Transform, Split (데이터 프레임 조작) 
이전 데이터 프레임 샘플을 통해서 데이터프레임을 조건절로 추출하고 제외하는 방법들을 테스트 해봤을 것이다. 좀더 기본적으로 R에서 제공되는 함수를 활용하여 데이터 프레임을 조작하는 방식을 연습해보도록 한다.

> sensory.Training <- subset(sensory, Training == "Yes")
> sensory.Training
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
3 모락      Yes         9         2
5 포쿡      Yes         5         1

> sensory.modified <- transform(sensory, comp=Sweetness/Saltiness)
> sensory.modified
    Name Training Sweetness Saltiness      comp
1   토니      Yes         8         4 2.0000000
2   매드       No         9         2 4.5000000
3   모락      Yes         9         2 4.5000000
4 시추안       No         4         6 0.6666667
5   포쿡      Yes         5         1 5.0000000
6 식당돈       No         5         4 1.2500000


- subset( )함수와 transform( ) 함수의 사용방법은 거의 동일하다. 좀더 세부적인 함수에 대한 내용이 보고 싶다면 help(함수명) 실행하면 함수의 기본적인 설명과 함께 인자값에 대한 내용과 샘플 소스를 얻을 수 있을 것이다. 다시 돌아가서 subset이 하위의 새로운 데이터프레임을 만들기 위한 선택 조건을 인자로 하고 transform이 새로운 변수(열) 생성을 위한 데이터 표현식을 입력인자로 한다는 점만이 틀리다는 것을 확인 할 수 있다.

> Sweetness.group <- split(sensory$Sweetness, sensory$Training)
> Sweetness.group
$No
[1] 9 4 5

$Yes
[1] 8 9 5


- split(sensory$Sweetness, sensory$Training)은 Training 벡터 값(2번째 인자)을 기준으로 Sweetness 값(1번째 인자)을 그룹화시켜 목록(lists)으로 생성하라는 표현 식이다. split( )함수는 2번째 인자를 그룹요인(grouping factor)으로 하여 1번째 인자 데이터를 그룹화한 목록으로 생성한다

> Sweetness.group.No <- sensory$Sweetness[sensory$Training == "No"]
> Sweetness.group.No
[1] 9 4 5



11. Sorting (정렬) 


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

> sort(cost.pre)
[1] 1100 1560 1570 4680 4980 5300 7780

 - sort(cost.pre)는 단일벡터 cost.pre의 요소를 오름차순으로 정렬시킨 벡터를 결과값으로 출력한다.


> cost.post
[1]  1530  1650  1890  5910  5310  8900 10600

> order(cost.post)
[1] 1 2 3 5 4 6 7

> cost.pre[order(cost.post)]
[1] 1100 1560 1570 5300 4980 7780 4680

 - order(cost.post)은 오름차순으로 정렬된 각 요소의 색인값을 출력하는 함수로 이해 할 수 있다.

> score <- c(32, 12, 45, 54, 98, 23, 4, 56, 12, 15, 65, 23)
> gender <- rep(c("M", "F"), 6)
> age <- c(23, 12, 34, 45, 23, 56, 17, 35, 32, 34, 65, 43)
> freq.score <- data.frame(score, gender, age)

> freq.score
   score gender age
 1     32      M  23
 2     12      F  12
 3     45      M  34
 4     54      F  45
 5     98      M  23
 6     23      F  56
 7      4      M  17
 8     56      F  35
 9     12      M  32
10    15      F  34
11    65      M  65
12    23      F  43

> freq.score[order(freq.score$gender, freq.score$age),]
   score gender age
 2     12      F  12
10    15      F  34
 8     56      F  35
12    23      F  43
 4     54      F  45
 6     23      F  56
 7      4      M  17
 1     32      M  23
 5     98      M  23
 9     12      M  32
 3     45      M  34
11    65      M  65



12. Implicit loops (함수의 반복 적용) 

10명의 검사요원에게 제품의 주요특성 10가지에 대한 강도를 평가하여 데이터프레임 구조(10개의 변수 포함)로 정리된 경우를 가정해보자. 변수 각각의 평균 값을 계산하기 위해서는 앞서 소개했던 mean( )함수에 인자로 “dataframe$variable01”과 같이 변수이름을 바꿔가면서 명령을 내리면 된다. 아직 배우지는 않았지만 R이 프로그래밍언어로서 가지고 있는 for, do while 등의 반복구문을 사용하면 조금은 수고를 덜 수 있을 것이다. 그러나 제일 간단한 방법은 sapply(dataframe, mean) 이라는 함수를 사용해서 dataframe의 10개 변수 각각의 평균(mean)을 계산하는 함축적 반복 구문을 사용하는 것이다.

이와 유사한 작업들의 편리성 증대를 위해 R은 lapply( ), sapply( ), tapply( ), apply( )와 같은 함축적 반복 함수를 제공한다.

> Sourness <- c(8, 12, 3, 8, 9, 11, 9, 8, 4, 1, 14,2)
> Hardness <- c(6, 2, 9, 1, 7, 2, 3, 6, 2, 6, 1, 5)
> RedColor <- c(16, 22, 19, 61, 37, 22, 31, 26, 42, 34, 26, 51)
> Product <- rep(c("A", "B"), 6)
> Result1 <- data.frame(Sourness, Hardness)
> Result1
   Sourness Hardness
1         8        6
2        12        2
3         3        9
4         8        1
5         9        7
6        11        2
7         9        3
8         8        6
9         4        2
10        1        6
11       14        1
12        2        5

> Result2 <- data.frame(Sourness, Hardness, Product)
> Result2
   Sourness Hardness Product
1         8        6       A
2        12        2       B
3         3        9       A
4         8        1       B
5         9        7       A
6        11        2       B
7         9        3       A
8         8        6       B
9         4        2       A
10        1        6       B
11       14        1       A
12        2        5       B

*apply( ) 함수들을 사용할 때는 인자(arguments)로 na.rm=T를 입력해서 NA 데이터는 제외하는 것이 좋다.

> lapply(Result1, mean, na.rm=T)
$Sourness
[1] 7.416667

$Hardness
[1] 4.166667

> sapply(Result1, mean, na.rm=T)
Sourness Hardness
7.416667 4.166667

- lapply( ), sapply( )함수는 1번째 인자(데이터프레임: data frames)에 2번째 인자인 통계 함수를 적용시켜 목록(list: l) 또는 단순 테이블 (simplicity: s) 형태로 계산 결과값을 출력시킨다.

> tapply(Result2$Sourness, Result2$Product, mean)
       A        B
7.833333 7.000000

 - tapply( ) 함수는 1번째 인자(벡터: vector)를 2번째 인자(요인:factor)로 그룹화하여 각 그룹에 3번째 인자인 통계함수를 적용시켜 테이블(table: t) 형태로 결과값을 출력시킨다.


> R.Matrix <- cbind(Sourness, Hardness, RedColor)
> R.Matrix
      Sourness Hardness RedColor
 [1,]        8        6       16
 [2,]       12        2       22
 [3,]        3        9       19
 [4,]        8        1       61
 [5,]        9        7       37
 [6,]       11        2       22
 [7,]        9        3       31
 [8,]        8        6       26
 [9,]        4        2       42
[10,]        1        6       34
[11,]       14        1       26
[12,]        2        5       51

> apply(R.Matrix, 2, sum)
Sourness Hardness RedColor
      89       50      387

- apply( )함수는 1번째 행렬, 2번째 인자(1 = rows, 2 = columns) 방향, 3번째 인자인 통계함수를 적용시켜 그 결과를 출력.


* 데이터 프레임에 대한 데이터 조작은 이후의 포스팅에 sqldf 패키지를 활용한 가공/조작이 가능 합니다. 사실 어느쪽이 편한가는 사용자의 편의에 따라 달라질수 있으니 결국엔 결과값이 같은 내용이라면 본인이 선호하는 것을 선택하게 되어 있습니다. 


[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프로그램이 윈도우 ...