반응형

참고도서: 퇴근시간이 빨라지는 비지니스 통계 입문 


1. 도수분포표란? 

전체 데이터를 일정한 구간으로 나누고, 그 구간에 몇 개의 데이터가 들어있는지 파악하는 표.

횟수

주스의 양(ml)

횟수

주스의 양(ml)

1

300

26

304

2

290

27

277

3

315

28

289

4

279

29

311

5

320

30

301

6

311

31

294

7

295

32

285

8

305

33

307

9

300

34

281

10

275

35

297

11

319

36

309

12

315

37

311

13

300

38

304

14

297

39

300

15

303

40

296

16

307

41

290

17

299

42

305

18

287

43

301

19

300

44

311

20

299

45

301

21

274

46

307

22

309

47

296

23

303

48

299

24

288

49

304

25

315

50

302

평균

299.74

도수 분포표를 만들어 보자. 

1) 우선 최대값, 최소값, 범위, 계급의 수 그리고 폭을 구한다.

raw data

계산 용이

최대값

320

320

최소값

274

270

범위

46

50

계급의 수

6

6

계급의 폭

7.666667

10

2) 그리고 도수분포표를 정리한다.

하한

상한

계급(주스의 양)

계급값

도수

%(상대도수)

270

279

270~279

274.5

29

38.7%

280

289

280~289

284.5

5

6.7%

290

299

290~299

294.5

11

14.7%

300

309

300~309

304.5

21

28.0%

310

319

310~319

314.5

8

10.7%

320

329

320~329

324.5

1

1.3%

합계

75

100.0%

주의: 도수는 frequency함수는 배열. 따라서 입력할 때에는 =FREQUENCY(주스의 양,상한)기입한 후 Ctrl+Shift+Enter로 입력

히스토그램은 위의 표를 바탕으로 그래프만 그려주면 간단히 해결.

반응형
Posted by 마르띤
,
반응형

source: R을 이용한 데이터 처리 & 분석 실무, 서민구 지음

http://book.naver.com/bookdb/book_detail.nhn?bid=8317471


6. 데이터 프레임: R에서 가장 중요한 데이터 타입

> (d<-data.frame(x=c(1:5),y=c(2:10,2)))

   x  y

1  1  2

2  2  3

3  3  4

4  4  5

5  5  6

6  1  7

7  2  8

8  3  9

9  4 10

10 5  2

> (d<-data.frame(x=rep(1:2,times=3),y=seq(2,12,2)))

  x  y

1 1  2

2 2  4

3 1  6

4 2  8

5 1 10

6 2 12

>

> (d<-data.frame(x=rep(1:2,times=3),

+                y=seq(2,12,2),

+                z=c('M','F','M','F','M','F')))

  x  y z

1 1  2 M

2 2  4 F

3 1  6 M

4 2  8 F

5 1 10 M

6 2 12 F

>

> str(d)

'data.frame':    6 obs. of  3 variables:

 $ x: int  1 2 1 2 1 2

 $ y: num  2 4 6 8 10 12

 $ z: Factor w/ 2 levels "F","M": 2 1 2 1 2 1

> d$x

[1] 1 2 1 2 1 2

> d$x<-rep(1:2,each=3)

> d$x

[1] 1 1 1 2 2 2

> d$w<-c("A","B","C","D","E","F")

> d

  x  y z w

1 1  2 M A

2 1  4 F B

3 1  6 M C

4 2  8 F D

5 2 10 M E

6 2 12 F F

> str(d)

'data.frame':    6 obs. of  4 variables:

 $ x: int  1 1 1 2 2 2

 $ y: num  2 4 6 8 10 12

 $ z: Factor w/ 2 levels "F","M": 2 1 2 1 2 1

 $ w: chr  "A" "B" "C" "D" ...

>

> (x<-data.frame(1:3))

  X1.3

1    1

2    2

3    3

> colnames(x)<-'val'

> x

  val

1   1

2   2

3   3

> rownames(x)<-c('a','b','c')

> x

  val

a   1

b   2

c   3

>

> d<-data.frame(x=c(1:5),y=c(2,4,6,8,10))

> d

  x  y

1 1  2

2 2  4

3 3  6

4 4  8

5 5 10

> rownames(d)<-c('a','b','c','d','e')

> d

  x  y

a 1  2

b 2  4

c 3  6

d 4  8

e 5 10

>

> d$x

[1] 1 2 3 4 5

> d$y

[1]  2  4  6  8 10

> d[1,]

  x y

a 1 2

> d[,1]

[1] 1 2 3 4 5

> d$a

NULL

> d["a"]

Error in `[.data.frame`(d, "a") : undefined columns selected

> d["a",]

  x y

a 1 2

> d

  x  y

a 1  2

b 2  4

c 3  6

d 4  8

e 5 10

> d[c(1,3),]

  x y

a 1 2

c 3 6

> d[c(1,3),1]

[1] 1 3

> d[c(1,3),2]

[1] 2 6

>

> d[-1,]

  x  y

b 2  4

c 3  6

d 4  8

e 5 10

> d[-1,-2]

[1] 2 3 4 5

> d[c("x","y")]

  x  y

a 1  2

b 2  4

c 3  6

d 4  8

e 5 10

> d[,c("x","y")]

  x  y

a 1  2

b 2  4

c 3  6

d 4  8

e 5 10

> d[c("x","y"),]

      x  y

NA   NA NA

NA.1 NA NA

> d[,"x"]

[1] 1 2 3 4 5

> d[,c("x")]

[1] 1 2 3 4 5

> d[,c("x"),drop=F]

  x

a 1

b 2

c 3

d 4

e 5

> (d<-data.frame(a=1:3,b=4:6,c=7:9))

  a b c

1 1 4 7

2 2 5 8

3 3 6 9

> d[,names(d)%in%c("b","c")]

  b c

1 4 7

2 5 8

3 6 9

> d[,!names(d)%in%c("b","c")]

[1] 1 2 3

> d[,!names(d)%in%c("b","c",drop=F)]

[1] 1 2 3

> View(d)


7. 타입 판별

> class(c(1,2))

[1] "numeric"

> class(matrix(c(1,2)))

[1] "matrix"

> class(data.frame(x=c(1,2),y=c(3,4)))

[1] "data.frame"

> str(c(1,2))

 num [1:2] 1 2

> str(matrix(c(1,2)))

 num [1:2, 1] 1 2

> str(list(c(1,2)))

List of 1

 $ : num [1:2] 1 2

> str(data.frame(x=c(1,2)))

'data.frame':    2 obs. of  1 variable:

 $ x: num  1 2

> is.factor(factor(c("m","f")))

[1] TRUE

> is.numeric(c(1:5))

[1] TRUE

> is.character(c("a","b"))

[1] TRUE

> is.data.frame(data.frame(x=1:6))

[1] TRUE

 

8. 타입 변환

> y<-c("a","b","c")

> as.factor(y)

[1] a b c

Levels: a b c

> y

[1] "a" "b" "c"

> as.character(as.factor(y))

[1] "a" "b" "c"

> x<-data.frame(1:9,ncol=3)

> x

  X1.9 ncol

1    1    3

2    2    3

3    3    3

4    4    3

5    5    3

6    6    3

7    7    3

8    8    3

9    9    3

> is.data.frame(x)

[1] TRUE

> is.matrix(x)

[1] FALSE

> x<-matrix(1:9,ncol=3)

> x

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> is.matrix(x)

[1] TRUE

> as.data.frame(x)

  V1 V2 V3

1  1  4  7

2  2  5  8

3  3  6  9

> is.data.frame(x)

[1] FALSE

> (x<-data.frame(matrix(c(1:4),ncol=2)))

  X1 X2

1  1  3

2  2  4

> list(x=c(1,2),y=c(3,4))

$x

[1] 1 2

 

$y

[1] 3 4

> data.frame(list(x=c(1,2),y=c(3,4)))

  x y

1 1 3

2 2 4

> factor(c("m","f"),levels=c("m","f"))

[1] m f

Levels: m f

 

반응형
Posted by 마르띤
,
반응형

source: R을 이용한 데이터 처리 & 분석 실무, 서민구 지음

http://book.naver.com/bookdb/book_detail.nhn?bid=8317471


1. 스칼라: 단일 차원의 값을 뜻함. 1,2,3

1) NA: Not available라는 상수. 값이 없음, 결측값. 값이 빠진 경우를 뜻함.

> four<-NA

> is.na(four)

[1] TRUE

 

2) NULL: NA와는 다른 개념으로 undefined , 미정값.

> x<-NULL

> is.null(x)

[1] TRUE

> is.null(1)

[1] FALSE

> is.null(NA)

[1] FALSE

> is.na(NULL)

logical(0)

Warning message:

In is.na(NULL) : is.na() applied to non-(list or vector) of type 'NULL'

 

3) 진리값: T/F 사용

> T&F

[1] FALSE

> T|T

[1] TRUE

> T|F

[1] TRUE

> T<-TRUE

> T

 [1] TRUE

> T<-FALSE

> T

[1] FALSE

> TRUE<-FALSE

Error in TRUE <- FALSE : invalid (do_set) left-hand side to assignment

 

잘 이해안되는 부분..좀 더 공부 필요 한 부분.

 

> c(TRUE,TRUE)&c(TRUE,FALSE)

[1]  TRUE FALSE

> c(TRUE,TRUE)&&c(TRUE,FALSE)

[1] TRUE

 

 

4) 팩터: 범주형 (categorical) 데이터 자료를 표현하기 위한 데이터 타입. //

 - 명목형(Nominal): /

 - 순서형(Ordinal): //

 

> sex<-factor("m",c("m","f")) #sex에는 "m" 지정, 팩터의 레벨은 "m","f" 제한> sex

[1] m

Levels: m f

> nlevels(sex)

[1] 2

> levels(sex)

[1] "m" "f"

> levels(sex)[1]

[1] "m"

> levels(sex)[2]

[1] "f"

> levels(sex)<-c("male","female")

> sex

[1] male

Levels: male female

> factor(c("m","m","f"),c("m","f"))

[1] m m f

Levels: m f

> factor(c("m","m","f"))

[1] m m f

Levels: f m

> ordered("a",c("a","b","c"))

[1] a

Levels: a < b < c

 

2. 벡터(Vector): 배열의 개념. 가지 스칼라 데이터 타입의 데이터를 저장

) 숫자만 저장 또는 문자열만 저장하는 배열이 벡터에 해당.

> x<-c(1,3,4)

> names(x)<-c("a","b","c")

> x

a b c

1 3 4

> x[1]

a

1

> x[-1]

b c

3 4

> x[c(1,3)]

a c

1 4

> x["a"]

a

1

> x[c("b","c")]

b c

3 4

> names(x)[2]

[1] "b"

> length(x)

[1] 3

> nrow(x)

NULL

> NROW(x)

[1] 3

> identical(c(1,2,3),c(1,2,3)) #객체가 동일한지 판단

[1] TRUE

> identical(c(1,2,3),c(1,2,1))

[1] FALSE

> "a"%in%c("a","b","c")

[1] TRUE

> "d"%in%c("a","b","c")

[1] FALSE

> x<-c(1:5)

> x

[1] 1 2 3 4 5

> x+1

[1] 2 3 4 5 6

> 10-x

[1] 9 8 7 6 5

> c(1,2,3)==c(1,2,3)

[1] TRUE TRUE TRUE

> union(c("a","b"),"d")

[1] "a" "b" "d"

> intersect(c("a","b","c"),c("a","d"))

[1] "a"

> setequal(c("a","b","c"),c("a","d"))

[1] FALSE

> setequal(c("a","b"),c("a","b","b"))

[1] TRUE

> setequal(c("a","b"),c("a","b","c"))

[1] FALSE

 

> seq(3,7)

[1] 3 4 5 6 7

> seq(7,3)

[1] 7 6 5 4 3

> seq(3,7,2)

[1] 3 5 7

> seq(3,7,3)

[1] 3 6

> x<-seq(2,10,2)

> x

[1]  2  4  6  8 10

> 1:NROW(x)

[1] 1 2 3 4 5

> seq_along(x)

[1] 1 2 3 4 5

> rep(1:2,times=5)

 [1] 1 2 1 2 1 2 1 2 1 2

> rep(1:2,each=5)

 [1] 1 1 1 1 1 2 2 2 2 2

> rep(1:2,each=5,times=2)

 [1] 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2

> (x<-list(name="foo",height=70))

$name

[1] "foo"

 

$height

[1] 70

 

3. list: 벡터와 달리 서로 다른 값을 담을 있음.

> (x<-list(names="foo",height=c(1,3,5)))

$names

[1] "foo"

 

$height

[1] 1 3 5

 

> list(a=list(val=c(1,2,3)),b=list(val=c(1,2,3,4)))

$a

$a$val

[1] 1 2 3

 

 

$b

$b$val

[1] 1 2 3 4

 

 

> x$name

[1] "foo"

> x

$names

[1] "foo"

 

$height

[1] 1 3 5

 

> x$names

[1] "foo"

> x$height

[1] 1 3 5

> x[1]

$names

[1] "foo"

 

> x[[1]]

[1] "foo"

 

4. matrix: 행렬

> matrix(c(1:9),nrow=3,byrow=T)

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> matrix(c(1:9),nrow=3)

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> matrix(c(1:9),nrow=3,

+        dimnames=list(c("r1","r2","r3"),c("c1","c2","c3")))

   c1 c2 c3

r1  1  4  7

r2  2  5  8

r3  3  6  9

> (x<-matrix(c(1:9),nrow=3))

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> dimnames(x)<-list(c("r4","r5","r6"),c("c4","c5","c6"))

> x

   c4 c5 c6

r4  1  4  7

r5  2  5  8

r6  3  6  9

>

> x<-matrix(1:9,ncol=3)

> x

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9

> rownames(x)<-c("r1","r2","r3")

> x

   [,1] [,2] [,3]

r1    1    4    7

r2    2    5    8

r3    3    6    9

> colnames(x)<-c("c1","c2","c3")

> x

   c1 c2 c3

r1  1  4  7

r2  2  5  8

r3  3  6  9

> x[1,1]

[1] 1

> x[,2]

r1 r2 r3

 4  5  6

> x[1:2,]

   c1 c2 c3

r1  1  4  7

r2  2  5  8

> x[,1:2]

   c1 c2

r1  1  4

r2  2  5

r3  3  6

> x[c(1,2),c(2,1)]

   c2 c1

r1  4  1

r2  5  2

> x[c(1,1),c(1,3)]

   c1 c3

r1  1  7

r1  1  7

> x[c(1,3),c(1,3)]

   c1 c3

r1  1  7

r3  3  9

> x[c(2,1),c(1,2)]

   c1 c2

r2  2  5

r1  1  4

> x<-matrix(1:9,nrow=3)

> x*2

     [,1] [,2] [,3]

[1,]    2    8   14

[2,]    4   10   16

[3,]    6   12   18

> x+x

     [,1] [,2] [,3]

[1,]    2    8   14

[2,]    4   10   16

[3,]    6   12   18

> x%*%x

     [,1] [,2] [,3]

[1,]   30   66  102

[2,]   36   81  126

[3,]   42   96  150

> t(x)

     [,1] [,2] [,3]

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

> (x<-matrix(c(1:4),ncol=2))

     [,1] [,2]

[1,]    1    3

[2,]    2    4

> solve(x)

     [,1] [,2]

[1,]   -2  1.5

[2,]    1 -0.5

> (x<-matrix(c(1:6),nrow=2))

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6

> dim(x)

[1] 2 3

> dim(x)<-c(3,2)

> x

     [,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

  

5. Array: 배열. Matrix행렬이 2차원이라면 배열은 다차원 데이터

> array(1:12,dim=c(3,4))

     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> (x<-array(1:12,dim=c(2,2,3)))

, , 1

 

     [,1] [,2]

[1,]    1    3

[2,]    2    4

 

, , 2

 

     [,1] [,2]

[1,]    5    7

[2,]    6    8

 

, , 3

 

     [,1] [,2]

[1,]    9   11

[2,]   10   12

 

> x[1,1,3]

[1] 9

반응형
Posted by 마르띤
,
반응형

source: https://github.com/derekfranks/practice_assignment

To begin, download this file and unzip it into your R working directory.
http://s3.amazonaws.com/practice_assignment/diet_data.zip

 

> setwd("D:/temp/r_temp")

> list.files("diet_data")

[1] "Andy.csv"  "David.csv" "John.csv" 

[4] "Mike.csv"  "Steve.csv"



> andy<-read.csv("diet_data/Andy.csv")

> head(andy)

  Patient.Name Age Weight Day

1         Andy  30    140   1

2         Andy  30    140   2

3         Andy  30    140   3

4         Andy  30    139   4

5         Andy  30    138   5

6         Andy  30    138   6

 

> length(andy$Day)

[1] 30

> nrow(andy)

[1] 30

> ncol(andy)

[1] 4

> length(andy)

[1] 4

> dim(andy)

[1] 30  4

> str(andy)

'data.frame':  30 obs. of  4 variables:

 $ Patient.Name: Factor w/ 1 level "Andy": 1 1 1 1 1 1 1 1 1 1 ...

 $ Age         : int  30 30 30 30 30 30 30 30 30 30 ...

 $ Weight      : int  140 140 140 139 138 138 138 138 138 138 ...

 $ Day         : int  1 2 3 4 5 6 7 8 9 10 ...

> summary(andy)

 Patient.Name      Age         Weight           Day       

 Andy:30      Min.   :30   Min.   :135.0   Min.   : 1.00  

              1st Qu.:30   1st Qu.:137.0   1st Qu.: 8.25  

              Median :30   Median :137.5   Median :15.50  

              Mean   :30   Mean   :137.3   Mean   :15.50  

              3rd Qu.:30   3rd Qu.:138.0   3rd Qu.:22.75  

              Max.   :30   Max.   :140.0   Max.   :30.00  

> names(andy)

[1] "Patient.Name" "Age"          "Weight"       "Day" 

 

> andy[1,"Weight"]

[1] 140

> andy[1,"weight"]

NULL

> andy[30,"Weight"]

[1] 135

> andy[which(andy$day)==30,"Weight"]

Error in which(andy$day) : argument to 'which' is not logical

> andy[which(andy$Day)==30,"Weight"]

Error in which(andy$Day) : argument to 'which' is not logical

> andy[which(andy$Day==30),"Weight"]

[1] 135

> andy[which(andy[,Day]==30),"Weight"]

Error in `[.data.frame`(andy, , Day) : object 'Day' not found

> andy[which(andy[,"Day"]==30),"Weight"]

[1] 135

> subset(andy$Weight, andy$Day==30)

[1] 135

 

> andy_start<-subset[andy$Weight,andy$Day==1]

Error in subset[andy$Weight, andy$Day == 1] : 

  object of type 'closure' is not subsettable

> andy_start<-subset(andy$Weight,andy$Day==1)

> andy_start

[1] 140

> andy_start<-andy[1,"Weight"]

> andy_end<-andy[30,"Weight"]

> andy_loss<-andy_start - andy_end

> andy_loss

[1] 5

 

> files<-list.files("diet_data")

> files

[1] "Andy.csv"  "David.csv" "John.csv"  "Mike.csv"  "Steve.csv"

> files[1]

[1] "Andy.csv"

> files[-1]

[1] "David.csv" "John.csv"  "Mike.csv"  "Steve.csv"

> files[2]

[1] "David.csv"

> files[3:5]

[1] "John.csv"  "Mike.csv"  "Steve.csv"

> files[c(1,3)]

[1] "Andy.csv" "John.csv"


> head(read.csv(files[3]))

Error in file(file, "rt") : cannot open the connection

In addition: Warning message:

In file(file, "rt") :

  cannot open file 'John.csv': No such file or directory

> files_full <- list.files("diet_data",full.names=TRUE)

> files_full

[1] "diet_data/Andy.csv"  "diet_data/David.csv" "diet_data/John.csv"

[4] "diet_data/Mike.csv"  "diet_data/Steve.csv"

> head(read.csv(files_full[3]))

  Patient.Name Age Weight Day

1         John  22    175   1

2         John  22    175   2

3         John  22    175   3

4         John  22    175   4

5         John  22    175   5

6         John  22    175   6


> andy_david<-rbind(andy,david)

Error in rbind(andy, david) : object 'david' not found

> david<-read.csv("diet_data/David.csv")

> head(david)

  Patient.Name Age Weight Day

1        David  35    210   1

2        David  35    209   2

3        David  35    209   3

4        David  35    209   4

5        David  35    209   5

6        David  35    209   6

> andy_david<-rbind(andy,david)

> head(andy_david)

  Patient.Name Age Weight Day

1         Andy  30    140   1

2         Andy  30    140   2

3         Andy  30    140   3

4         Andy  30    139   4

5         Andy  30    138   5

6         Andy  30    138   6

> tail(andy_david)

   Patient.Name Age Weight Day

55        David  35    203  25

56        David  35    203  26

57        David  35    202  27

58        David  35    202  28

59        David  35    202  29

60        David  35    201  30


> andy_david<-rbind(andy,read.csv(files_full[2]))

> head(andy_david)

  Patient.Name Age Weight Day

1         Andy  30    140   1

2         Andy  30    140   2

3         Andy  30    140   3

4         Andy  30    139   4

5         Andy  30    138   5

6         Andy  30    138   6

> tail(andy_david)

   Patient.Name Age Weight Day

55        David  35    203  25

56        David  35    203  26

57        David  35    202  27

58        David  35    202  28

59        David  35    202  29

60        David  35    201  30

 

> day_25<-subset(andy_david[25,])

> day_25

   Patient.Name Age Weight Day

25         Andy  30    135  25

> day_26<-subset(andy_david[which(andy_david$Day==26),])

> day_26

   Patient.Name Age Weight Day

26         Andy  30    135  26

56        David  35    203  26

> day25<-andy_david[which(andy_david$Day == 25),]

> day25

   Patient.Name Age Weight Day

25         Andy  30    135  25

55        David  35    203  25

 

> for(i in 1:5){print [i]}

Error in print[i] : object of type 'closure' is not subsettable

> for(i in 1:5){print (i}

Error: unexpected '}' in "for(i in 1:5){print (i}"

> for(i in 1:5){print (i)}

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

> for(i in 1:5){

+        dat <- rbind(dat,read.csv(files_full[i]))

+ }

Error in rbind(dat, read.csv(files_full[i])) : object 'dat' not found

> dat<-data.frame()

> for(i in 1:5){

+        dat <- rbind(dat,read.csv(files_full[i]))

+ }

> str(dat)

'data.frame':    150 obs. of  4 variables:

 $ Patient.Name: Factor w/ 5 levels "Andy","David",..: 1 1 1 1 1 1 1 1 1 1 ...

 $ Age         : int  30 30 30 30 30 30 30 30 30 30 ...

 $ Weight      : int  140 140 140 139 138 138 138 138 138 138 ...

 $ Day         : int  1 2 3 4 5 6 7 8 9 10 ...

 

> for(i in 1:5 ){

+        dat2<-data.frame()

+        dat2<-rbind(dat2,read.csv(files_full[i])) 

+ }

> str(dat2)

'data.frame':    30 obs. of  4 variables:

 $ Patient.Name: Factor w/ 1 level "Steve": 1 1 1 1 1 1 1 1 1 1 ...

 $ Age         : int  55 55 55 55 55 55 55 55 55 55 ...

 $ Weight      : int  225 225 225 224 224 224 223 223 223 223 ...

 $ Day         : int  1 2 3 4 5 6 7 8 9 10 ...

> list.files("diet_data")

[1] "Andy.csv"  "David.csv" "John.csv"  "Mike.csv"  "Steve.csv"

> head(dat2)

  Patient.Name Age Weight Day

1        Steve  55    225   1

2        Steve  55    225   2

3        Steve  55    225   3

4        Steve  55    224   4

5        Steve  55    224   5

6        Steve  55    224   6

 

Because we put dat2<- data.frame() inside of the loop, dat2 is being rewritten with each pass of the loop. So we only end up with the data from the last file in our list.

 

> median(dat$Weight)

[1] NA

> nrow(dat)

[1] 150

> ncol(dat)

[1] 4

> dim(dat)

[1] 150   4

> median(dat$Weight,na.rm=TRUE)

[1] 190

> dat_30<-dat[which(dat$Day==30),]

> dat_30

    Patient.Name Age Weight Day

30          Andy  30    135  30

60         David  35    201  30

90          John  22    177  30

120         Mike  40    192  30

150        Steve  55    214  30

> median(dat_30$Weight)

[1] 192

 

> weightmedian<-function(directory,day){

+   files_list<-list.files(directory,full.names=TRUE) #Create a list of files

+   dat<-data.frame() #creates an empty data frame

+   for(i in 1:5) { #loops through the files, rbinding them together

+     dat<-rbind(dat,read.csv(files_list[i]))   

+   }

+   dat_subset<-dat[which(dat[,"Day"]==day),] #subsets the rows that match the 'day' arguments

+   median(dat_subset[,"Weight"],na.rm=TRUE) #identifies the median weight

+ }

> weightmedian(directory="diet_data",day=20)

[1] 197.5

> weightmedian("diet_data",4)

[1] 188

 

 

반응형
Posted by 마르띤
,
반응형

R 텍스트마이닝 연습. 책은 R까기 참고, 대상은 2014년 대통령 신년사(출처: 네이버 검색). 

> setwd("D:/temp/r_temp")


> library(KoNLP)

> library(wordcloud)


> useSejongDic()

> mergeUserDic(data.frame("청마","ncn")) #위 사전에 해당 단어 추가하는 과정

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("수자원공사","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("4대강","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("원전비리","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("시험성적서","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("코레일","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("벤처창업","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("창업경제타운","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("창조경제추진단","ncn"))

1 words were added to dic_user.txt. 

> mergeUserDic(data.frame("규제총량제","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("세계평화공원","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("유라시아","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("원스톱","ncn"))

1 words were added to dic_user.txt.

> mergeUserDic(data.frame("자유학기제","ncn"))

1 words were added to dic_user.txt.


> txt<-readLines("president_lastyear.txt") # txt라는 변수에 분석용 데이터를 변수로 읽기

> place<-sapply(txt,extractNoun,USE.NAMES=F) #txt파일에서 공백을 기준으로 조사해 명사만 찾아 place라는 변수에 저장

> head(unlist(place),30) #추출된 명사를 30개만 출력하여 확인

> c<-unlist(place) # 필터링을 위해 unlist 작업을 지정해서 저장

> place<-Filter(function(x){nchar(x)>=2},c) #두 글자 이상 되는 것만 필터


> place<-gsub(" ","",place) # gsub 함수를 이용하여 불필요한 단어 삭제

> place<-gsub("해서","",place)

> place<-gsub("하기","",place)

> place<-gsub("들이","",place)


> write(unlist(place),"president_lastyear_2.txt") #파일로 저장한 후 테이블 형태로 변환

> rev<-read.table("president_lastyear_2.txt") #수정 완료된 파일을 table 형식으로 변환하여 다시 변수에 불러드림

> nrow(rev) #rev변수에 데이터가 몇 건이 있는지 조회

[1] 819

> wordcount<-table(rev) #rev변수의 값을 table형태로 변환해서 wordcount라는 변수에 할당

> head(sort(wordcount,decreasing=T),30) #빈도수 상위 30개, 많은 순으로 정렬

> library(RColorBrewer) #칼러 불러오기

> palete<-brewer.pal(9,"Set1") #색깔 지정

> wordcloud(names(wordcount),freq=wordcount,scale=c(5,1),rot.per=0.25,min.freq=3,random.order=F,random.color=T,colors=palete)#최소 3회 언급 인쇄

> savePlot("2014president_newyearmessage.png",type="png") #그림으로 저장



반응형
Posted by 마르띤
,

불황을 넘어서

서평 2014. 7. 13. 18:03
반응형

미래학에 관한 서적 중 내가 읽어 본 것이라면 존 나이스비트가 쓴 메가트렌드 차이나정도 였을 뿐, 막연하게 이렇게 될거라는 예언(?)의 느낌이 강하였다. 

앨빈토플러의 책을 빌리러 회사 자료실에 갔지만 없었다. 2008년 이후 경제 위기가 몇 년동안 뉴스를 강타하는 이 시점에서 눈길을 끄는 책 제목이 하나 있었다. 앨빈 토플러 불황을 넘어서.

   이 책을 읽는데는 오래 걸렸다. 문구 하나하나가 새로운 것도 물론 있었고, 곱씹어 볼 내용도 많았기 때문이다. 

 
책을 읽으면서 나에게 와 닿았던 문구들 몇가지 공유해 본다.

에너지 자원과 공포심
새로이 출연한 경제주체훨씬 더 거대해진 다국적 기업과 은행노동조합자원수출국의 카르텔통제되지 않는 방대한 양의 화폐고정 환율제에서 변동 환율제로의 전환인구 폭발새로운 첨단 기술핵심 사회시스템의 오류사회 구성원의 급격한 심리변화 등의 요인으로 인해 가까운 미래에 발생할지 모르는 경제위기는 심각한 양상으로 전개될 가능성이 크다.

폭등하는 물가
다국적 기업과 수 많은 대기업들이 치솟는 원료값 때문에 수익성 악화를 겪고엄청난 액수의 자금을 차입하여 기존 대출금을 갚는 데 사용하는 상황을 생각해보라.

위기에 대처하는 방법
아무리 현실적이라 하더라도 시나리오는 가상의 일일 뿐이를 기반으로 마련한 대안들을 통해 많은 문제들을 해결할 수 있기도 하다그렇다고 해서 이것을 미래에 대한 예언으로 지나치게 진지하게 받아들이지는 말기 바란다.

통합적인 해법의 필요성
경제학만으로는 경제위기를 해결할 수 없다우리가 겪게 되는 문제들 가운데 많은 것들은 경제적인 목표를 추구하는 과정에서 만들어진다하지만 사람들은 과거의 타성에 젖어 잘못된 방향으로 열중하고 있다.

변화를 위한 전략
산업국가에서 새로이 만들어지는 대다수의 일자리는 서비스 분야의 일자리다화이트칼라와 서비스 분야에 종사하는 인구가 블루칼라 분야에서 일하는 사람 수 보다 더 많아지는 초산업사회로의 변화과정은 자연스러운 흐름이며정부의 실업률을 낮추려는 노력이 이러한 흐름에 역행해서는 안 된다디트로이트의 자동차공장 같은 거대한 생산시설에서 세상의 모든 실업자를 위한 충분한 일자리가 창출될 수 있을 거라는 기대는 하지 않는 것이 좋다어떤 사람이 난로 수리를 전문적으로 행하는 소규모 서비스회사를 설립하고자 한다면 정부기관에서 보증을 제공하여 그 사람이 성공적으로 창업자금을 대출받을 수 있도록 하고또 그 사람의 회사가 성공적으로 시장에 정착할 수 있도록 다양한 지원을 제공하는 식으로 정부에서 역할을 수행할 수 있다.서비스산업은 기본적으로 노동집약산업이며그런 만큼 실업률을 낮추는 효과가 매우 크다.
 실직한 교사는 대안학교를 설립하여 주류 학생들과 어울리지 못하는 소수 학생들을 가르칠 수 있고의료 분야에서 경력을 가지고 있는 사람은 준의료 서비스기관을 설립하여 간병이나 조산 같은 일을 맡아서 할 수 있을 것이다.

새로운 정책결정방식
경제정책은 기업 경제전문가소비자시민단체의 의견을 최대한 수용한 다음 산업분야별로 정책을 수립하여 추진해야 한다물론 이와 같은 방식이 가능해지려면 중앙정부에서 정책결정권한과 예산집행권한을 파격적으로 지방정부에 이양하는 일이 선행되어야 할 것이다.

하나의 경제로 통합되는 세계
사회 구성원들이 더 많은 지식과 정보를 소유하게 되는 초 산업화 시대에는 대중의 지식과 정보를 활용하는 것이 더 좋은 방법이다미래를 창출해내는 역량을 높이고자 한다면 우리는 산업화시대의 낡은 정책수립방식으로부터 벗어나야 한다.

미래주의의 정착
미래주의에서는 계획을 수립하는 방식이 다분히 민주적이다이렇게 하는 게 윤리적으로도 더 이롭고 실질적으로도 더 나은 방식이기 때문이다뛰어난 소수의 사람들이 아무리 그럴듯한 계획을 수립했다 하더라도 다수의 일반인들이 참여하지 않는다면 계획은 실패로 끝날 뿐이다.

다음은 부록의 느낌으로 앨빈 토플러의 어록! 
특히 21세의 문맹을 정의한 문장은 눈길이 오랫동안 머물렀다.


젊은이에게 보내는 메시지
  • 미래는 예측하는 것이 아니라 상상하는 것이다직업을 선택할 때 꼭 10년 뒤에도 유망할지를 생각해보라.
  • 진짜 하고 싶은 것이 있으면 남들이 뭐라고 하든 해보라!
  • 나는 독서기계다미래를 상상하는 데는 독서만큼 유용한 방법이 없다그것은 저자가 오랜 세월을 바쳐 연구한 것을 짧은 시간에 자신의 것으로 만들 수 있는 효과적인 방법이기 떄문이다.
  • 대학 때 저널리즘 강의를 듣지 않았다고 신문사에서 받아주지 않았는데 만화라도 그리겠다고 해서 들어갈 수 있었고다음 학기에는 신문사의 편집장이 되었다정말 하고 싶은 게 있다면 어떤 곳이든 길이 있게 마련이다.
  • 작은 일을 할 때도 큰 그림을 그리며 실행하라그래야 올바른 방향으로 갈 수 있다.

기업 경영에 관한 메시지
  • 지식이 노동의 가치를 좌우하게 된다때문에 작업 시간도 획일적인 시간에 따를 필요가 없다한 마디로 자기 시간의 주인이 될 수 있는 세상이 온다.
  • 구글의 규모는 엄청나다아이디어와 지식으로 승부하고 있지 물질적인 것을 추구하지 않는다무형자산과 유형자산이 경제 안에서 어떻게 상호작용하고 있는지를 살펴봐야 한다.

미래를 예측하는 방법
  • 21세기 문맹은 읽고 쓸 줄 모르는 이들이 아니라 학습할 줄도학습한 것을 망각할 줄도,재학습할 줄도 모르는 이들이다.
  • 미래는 생각보다 빨리 온다그것도 예상치 못한 순서로 온다.
  • 앞으로 프로슈머 경제가 폭발적으로 증가함에 따라 새로운 백만장자들이 수두룩하게 나타날 것이다.


반응형
Posted by 마르띤
,

월급전쟁

서평 2014. 7. 13. 17:57
반응형


<월급전쟁 표지>

읽게 된 계기

우선 제목이 자극적이라 그런지 손이 먼저 갔다. 예전에 미네르바의 경제전쟁이라는 책을 접할 기회가 있었는데, 이 책은 우리가 알고 있다고 생각한 경제 현실이 진실인지 다양한 도표를 제시하고 있다.  꼼꼼한 비교 분석 없이 선택한 펀드, 약관 한 번 제대로 읽지 않고 설계사의 권유로 가입한 보험, 월급에서 매달 빠져나가는 국민연금에 대해서도 자세하게 다루고 있는데, 월급 전쟁의 목차를 볼 때도 비슷한 느낌이 들어 읽게 되었다.


저자 소개와 집필 의도
기업의 재무상태를 감사하고 돈의 흐름을 감시하는 공인회계사로 일하며 많은 사람을 만나왔다직장인들을 만날 때면 불쌍하다는 생각이 든다고 한다정부와 기업금융회사는 한 푼이라도 더 벌기 위해 혈안이 돼 있는데 월급쟁이들은 아낌없이 주는 나무와 같다며순진무구한 생각과 무지한 금융지식이 안타까워 책을 쓰게 되었다은행과 보험회사대기업정부가 어떻게 직장인들의 월급에 빨대를 꽂는지 알려주는 책


책 내용
세금환율은행신용카드마이너스 통장펀드보험부동산학자금 대출프랜차이즈 사업퇴직금연금 그리고 재테크로 이어지는 구성들대한민국에서 직장인으로 살면서 누구나 한 번씩 들어봤을 법한 주제와 내용이다당연히 쓰고 있는 신용카드, 1인 1보험 시대라며 알리는 보험회사들의 구조를 설명하는 책어떤 유명 블로거(MBA 블로거)는 이 책은 위험하다고 한다가령은행의 예대마진을 비판하는 내용을 보면서 은행의 기본 구조가 예대마진인데이러한 구조를 근본적으로 무시하는 것은 아닌지를 걱정하면서대만 내 생각은 이 책은 은행이 없어져야 한다!라기 보다는 직장인들이 별 생각 없이 내고 있는 은행 수수료중복적으로 가입하는 보험 상품밑도 끝도 없이 붓는 펀드사업비가 얼마인지도 모른 채 가입하는 연금 상품주변 사람에 휩쓸려 주식 대열에 참가하는 대신 이러한 금융 상품들의 구조를 이해하면서 현명한 금융 생활을 할 수 있게 안내를 해주는 책으로 생각된다가령 10% 기대 수익에 끌려 대출 받아 주식펀드에 가입할게 아니라, 6%의 대출과 마이너스 통장의 돈을 먼저 갚으라는 저자의 주장은 한 방을 노리는 사람들에게 따끔한 충고가 될 것이다.

그러면서 최고의 재테크는 다름 아닌

  • 현명한 소비
  • 절약
  • 자신만의 무형상품 개발
이라는 다소 원론적이면서도 사람들이 쉽게 잊고 있는 내용으로 마무리하고 있다.

남에게 보여주기 식의 고가의 상품을 구매하기 보다는 나를 위한 책을 사거나 가족과의 행복한 추억을 위해 여행을 가는 현명한 소비. 5%의 기대 수익율 보다 5만원을 절약하는 것이 최고의 재테크여기저기 기웃거릴 것이 아니라 나의 능력을 개발하기 위한 자기 개발누구나 알고 있지만 쉽게 실천하지 못하는 기본을 다시 떠올리며 조금 더 현명한 내가 되길 바라며 이 책을 마무리한다.


반응형
Posted by 마르띤
,

탐스 스토리

서평 2014. 7. 13. 17:33
반응형

탐스 스토리. 책을 읽기 전부터 탐스의 1+1 기부 이야기는 각종 언론을 통해 들어왔었고 회사 내 내의 강의에서도 여러번 언급 되었던 터라 실은 이미 알고는 있었다. 그럼에도 불구하게 이 책을 읽게 된 계기는 올 봄 부터 회사 동기 3명과 함께 사내 아이디어 공모전을 시작하였는데, 우리가 제안한 비지니스 모델을 좀 더 발전 시키기 위해 회사의 지원을 통해 읽게 되었다.

 이 책은 저자 블레이크 마이코스키의 책을 쓴 이유로부터 시작된다. 


탐스를 시작하고, 그 과정에서 만난 훌륭한 행동주의자들로부터 배운 가르침을 나누기 위해서죠. 이 책이 촉매제가 되어 세상에 긍정적인 영향을 미치는 프로젝트가 더 많이 양산되었으면 하는 바람입니다.


 그럼 이 TOMS 모델이 탄생한 이야기를 짧게 정리해 본다.

저자는 사업이 아닌 휴가 목적으로 아르헨티나를 방문하였고, 며칠 동안 이 마을에서 저 마을로 여행을 다니며 극심한 빈곤에 시달리는 사람들을 볼 수 있었다. 세상 어딘가에서 가난한 아이들이 있다는 것은 누구나 알고 있는 하나의 Fact 이겠지만, 이를 눈으로 직접 보고서 새로운Act 즉, 신발 기부 운동을 펼치겠다는 아이디어를 실행하겠다는 결심은 다른 문제이다. 

 이 아이디어는 간단한 개념이었다. 오늘 신발 한 켤레를 팔면 내일 신발 한 켤레를 기부한다. ' 더 나은 내일을 위한 신발(Shoes for a Better Tomorrow)', 이것이 내일의 신발(Tomorrow's Shoes)'이 되었고 다시 탐스(TOMS)가 되었다.


사실 내가 이 책을 보려는 목적은 이 회사가 운영되는 비지니스 모델을 보고함이었다. 이는 간단하게 시작하였다. 책상 머리에 모여 컨설턴트들이 현란한 PT를 통해 만들어낸 비지니스 모델이 아닌, 몸소 느끼며 머릿속에 스쳐지나간 하나의 아이디어였다. (왜 모든 위대한 기업들은 이런 스쳐 지나가는 작은 아이디어에서 시작되는지는 모르겠지만...)

그럼 신발 디자인을 잠깐 살펴보자. 이는 아르헨티나의 국민적인 신발인 알파르가타라인데 부드러운 캔버스 천으로 만들어 폴로 선수에서 농부, 학생에 이르기까지 전 국민이 신다시피 했다.

<알파르가타>

저자는 현지 제화공들을 참여시켜 신발을 개랑하였고,  당장 물건을 돈을 받고 팔기는 어려웠기 때문에 가까운 친구들에게 신발을 나눠주며 스토리를 알려주었다. 친구들의 도움을 받아 신발을 팔아줄 만한 가게들의 목록을 받은 저자는  아메리칸 래그(American Rag)에서 첫 거래를 시작한다. 단순한 신발 이상임을 깨달은 고객들이 생겨났고 로스엔젤레스 타임즈타임』, 엘르』 등 잡지에 소개되어 나갔고, 현재는 기부 활동에 참여하는 고객들이 스스로 나서고 있고 TOMS 스토리에 영감받은 수 많은 사업가들이 생겨난 이야기가 오늘도 끊이지 않고 있다. 

<블레이크가 신발을 신겨주는 모습>

여기까지가 그의 스토리다. 이게  끝이다. 나머지 이야기는 그 과정에서 만났던 사람들과 회사 운영이야기이다. 사실 이런 기부하는 회사의 사회 공헌은 이미 오래전부터 있었다. 하다못해 "매출의 1%를 사회에 기부합니다."라는 문구는 오래전부터 보아왔었고, 사실 식상한 모델로 나에게는 느껴졌다.지난 6월 키엘 매장을 방문하였는데, 키엘은 글로벌 사회 공헌 활동 ‘MEET MR. BONES’ 프로젝트를 런칭, 이들 제품의 판매 수익금 일부를 어린이 재활 병원 건립에 돕는다고 하였다. 취지도 좋았고, 스토리도 좋았다. 평소 활발한 기부 활동을 펼치고 있는 연예인까지 합류하였다.

하지만 난 사지 않았다. 왜냐고? 나에겐 이 제품이 매력적으로 다가오질 않았기 때문이다. 키엘 매니아에겐 어떨지 모르겠지만...

반면 난 TOMS 신발은 사 신고 있고, 한 켤레 더 사 신을 예정이다. 나에게 키엘과 TOMS의 차이는 무엇일까? 취지만 좋다면 사람들은 신발을 다 사야한다. 성선설을 믿는다면...하지만 난 그렇지 않았다. 나에게 키엘은 매력적인 제품이 아니였고, TOMS는 그 반대였다. 훌륭한 디자인과 더불어 착한 가격(49,000원)까지...캐쥬얼한 신발 한 켤레 사려도 이제 10만원은 훌쩍 넘는 신발 가게들 사이에서 TOMS 신발은 충분히 고객을 모으기 충분하였다.
 사회공헌 활동을 하는 기업은 많지만, 기업이 노력하는 만큼 소비자가 더 알아주길(?) 기대한다면 다음 2가지를 유념해야 한다.
  • 첫째, 그대들이 런칭하는 제품 / 서비스가 고객이 충분히 지갑을 열 만큼 매력적인가?
  • 둘째, 강력한 스토리가 있는가?

그리고 이 책을 읽으며 나에게 영감을 주었던 몇 가지 글귀를 적어본다.

  • 끝내주는 아이디어와 평균 이하의 실행 능력 보다는 괜찮은 아이디어와 훌륭한 실행 능력을 택하겠어요.
  • 기부를 결합한 비지니스 모델을 만들어내고 사업에 손익계산보다 더 큰 소명을 부여한다면, 자본이 풍족한 회사들은 누릴 수 없는 기회를 얻게 된다.
  • 진정으로 섬기는 리더는 직원들에게 영감을 준다.
  • 손님이 특별한 요구를 할 대에는 최대한 특별한 존재가 된 듯한 기분을 느끼게 해줘라.
  • 상관없어. 나는 세상을 바꾸고 있어. 난 거기 갔어. 아이들 발에 신발을 신겨줬어. 난 세상을 바꿨어.
  • 당신이 필요에 따라 기부하지 마라. 당신이 돕고자 하는 상대에 따라 상품을 디자인하고, 서비스를 제공하고, 기부하라.
  • 시작하라! 만약 당신의 머릿속에 잠든 그 아이디어가 정말로 괜찮은 아이디어라면...

 고객 서비스에 대한 사례는 많았지만 내반족이라는 병을 앓고 있는 고객에게 양쪽 발의 다른 사이즈의 신발을 늘 두 켤레 사는 불편함을 덜어주고자 특별 제작한 사례는 CS업계에서 또 하나의 오래된 사례가 될 것임이 분명하다. 

TOMS 스토리가 위대한 것은 이가 많은 사람들에게 영감을 주고 있기 때문이다. 회계사 직장을 던지고 TOMS에 합류한 사람들, 무일푼으로 시작한 인턴들, 스티브 잡스가 차고에서 시작한 것 처럼 아파트에서 TOMS를 믿고 사업을 시작한 초기 멤버들이 그들이다. 

그리고 TOMS와 같은 또 다른 사업이 어디선가 시작되고 있다. 바로 가방 하나가 팔릴 때 마다 개발도상국 아이들에게 1년간 무료 급식을 하는 사업을 시작한 피드(FEED)의 로런(Lauren)처럼 그리고 아프리카에서 뇌수막염 예방접종을 실시하고 있는 원샷(OneShot)의 타일러(Tyler)처럼...

마지막으로 블레이크가 말하는 성공에 대해 정리하며 글을 마무리한다.

   한 때 내가 살았음으로 인해 
   단 한 명의 삶이라도 더 편안해지는 것.
   그것이 바로 성공.

반응형
Posted by 마르띤
,