2014년 5월 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


 다양한 채널의  블로그 작성으로  집중이 좀 안되기도 하고  나의 회사를 운영하고 관리 하다 보니  회사의 블로그로 작성 해보는 것은 어떤가 하고  하나로 옮겨 봅니다.  (주)다이닝웨이브 - 블로그 바로가기