'Onik Lab./R Prograaming'에 해당하는 글 5건

그동안 머신러닝 - R Programming 관련하여 글이 많이 없었던 것 같습니다.


여러 가지 이유가 있겠습니다만,


1. 최근에 중국출장을 갔다왔다.

2. 업무적으로도 시간적 여유가 없었다.

3. 게을렀다.


아마 이 세가지 정도로 분석되는데, 역시 아무래도 3번이 가장 큰 비중을 차지하겠지요.

좀 더 부지런해져야 할 것 같습니다.


지난번에는 Machine Learning 부분에 kNN 모델에 관한 글을 쓴 적이 있었고, 이번에는 이를 R Programming으로 구현해 본 것입니다.

물론 제가 임의대로 구현했다기 보다는, CRAN에 있는 기본 예제를 가지고 매우 간단하게 실습한 내용이고,

이 내용을 토대로 kNN 모델을 R에서 어떻게 구현하는지를 응용할 수 있겠지요.


kNN Model이 무엇인지 궁금하신 분들은 아래 글 참고하시면 좋을 것 같습니다.


2016/11/23 - [Onik Lab./MachineLearning] - Machine Learning - (2) kNN 모델



CRAN에서는 kNN Model을 위한 기본 패키지를 제공하는데,

kNN 전용 패키지는 아니고, class라는 패키지 내에 kNN 함수를 제공합니다.


class 패키지란 무엇인지부터 봐야 되겠지요?


CRAN에서는 다음과 같이 소개를 하고 있습니다.



Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.


분류(Classification)를 위한 여러 가지 함수 및 k-nearest neighbour(kNN) 모델을 포함한 여러 함수를 제공한다 하였습니다.

그래서 내장된 함수도 knn, knn.cv, knn1 이렇게 3가지 함수를 제공하고 있고요.

class Package 외에도 kNN Model의 여러 변형 패키지도 CRAN에서는 제공하고 있습니다.



ESKNN: Ensemble of Subset of K-Nearest Neighbours Classifiers for Classification and Class Membership Probability Estimation


FastKNN: Fast k-Nearest Neighbors


FNN: Fast Nearest Neighbor Search Algorithms and Applications


KernelKNN: Kernel k Nearest Neighbors


kknn: Weighted k-Nearest Neighbors


knncat: Nearest-neighbor Classification with Categorical Variables


knnGarden: Multi-distance based k-Nearest Neighbors


knnIndep: Independence tests and benchmarks


nabor: Wraps 'libnabo', a Fast K Nearest Neighbour Library for Low Dimensions


bnnSurvival: Bagged k-Nearest Neighbors Survival Prediction




뭐.. 많습니다.

하지만 이 많은 패키지를 당연히 다 다룰 리는 없고요 (사실 저도 잘 모릅니다)


1. kNN에 대한 기본 패키지 및 함수를 통해서 어떤 식으로 R에서 구현되는지를 알고

2. 필요시 이를 응용을 할 수 있을 정도로 충분한 학습을 한 다음에

3. 다양한 kNN 패키지 및 함수를 사용할 수 있어야 한다


정도가 순서가 될 것 같습니다.


하지만 저는 kNN에 대한 기본 실습정도까지만 하겠습니다.

Machine Learning의 영역은 매우 넓기 때문에 다른 모델에 대한 이해도 당연히 필요하거든요.




그럼 kNN Model에 대한 실습 들어가겠습니다.



1
2
3
4
5
train <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))
knn(train, test, cl, k = 3, prob=TRUE)
attributes(.Last.value)
cs



실습 코드입니다.

이 소스코드는 CRAN에서 kNN 함수 소개할 때 공식적으로 나와있는 예제 코드이고요.

이 코드에 대한 이해만 어느 정도 되더라도 kNN을 R에서 쉽게 구현할 수 있습니다.


그럼 하나씩 보도록 하겠습니다.



1. iris3 데이터 (3차원 배열 형태)


여기 실습으로 사용되는 내장 데이터인 iris3 데이터가 어떤 구조로 있는지부터 이해를 해야 합니다.

이 데이터 구조를 파악하지 못하면 kNN 실습 자체를 전혀 이해할 수 없기 때문입니다.



iris3 데이터는 다음과 같이 값이 구성되어 있습니다.


, , Setosa


      Sepal L. Sepal W. Petal L. Petal W.

 [1,]      5.1      3.5      1.4      0.2

 [2,]      4.9      3.0      1.4      0.2

 [3,]      4.7      3.2      1.3      0.2

...

[48,]      4.6      3.2      1.4      0.2

[49,]      5.3      3.7      1.5      0.2

[50,]      5.0      3.3      1.4      0.2


, , Versicolor


      Sepal L. Sepal W. Petal L. Petal W.

 [1,]      7.0      3.2      4.7      1.4

 [2,]      6.4      3.2      4.5      1.5

 [3,]      6.9      3.1      4.9      1.5

...

[48,]      6.2      2.9      4.3      1.3

[49,]      5.1      2.5      3.0      1.1

[50,]      5.7      2.8      4.1      1.3


, , Virginica


      Sepal L. Sepal W. Petal L. Petal W.

 [1,]      6.3      3.3      6.0      2.5

 [2,]      5.8      2.7      5.1      1.9

 [3,]      7.1      3.0      5.9      2.1

...

[48,]      6.5      3.0      5.2      2.0

[49,]      6.2      3.4      5.4      2.3

[50,]      5.9      3.0      5.1      1.8 



1
2
> dim(iris3)
[150  4  3
cs



배열은 위와 같이 50행 4열 3개체의 3차원 배열이며, 3개체는 Setosa, Versicolor, Virginica입니다.


그럼 이해가 쉽도록 명칭과 데이터값을 설명하겠습니다.


배열명: iris3  - 아이리스 꽃(붓꽃)

Column명: Sepal Length - Width(꽃받침 길이-너비), Petal Length - Width(꽃잎 길이-너비)

3차원배열명: Setosa, Versicolor, Virginica (아이리스꽃 품명)


즉 품명별로 50개씩 꽃받침 및 꽃잎의 사이즈를 가지고 있다고 보시면 됩니다.

그렇기 때문에 꽃은 총 150송이로 보시면 됩니다.


출처: kr.best-wallpaper.net





이제 R 코드의 1행부터 보겠습니다.


train <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])


rbind는 배열의 여러 값을 묶어서 Dataset으로 만드는 작업입니다.

train 데이터에 들어가는 값은


Setosa(이하 "ST")에 1~25번째 꽃

Versicolor(이하 "VC")에 1~25번째 꽃

Virginica(이하 "VG")에 1~25번째 꽃입니다.


train 데이터는 학습된 데이터로, 각 품종별 1~25번째 꽃, 총 75송이의 꽃을 학습된 데이터로 하는 것입니다.





다음은 2행입니다.


test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])


train과 마찬가지로 rbind로 묶어줍니다.

다만 test 데이터에 들어가는 꽃은 품종별 26~50번째 꽃으로 보시면 됩니다.


test 데이터는 새로운 데이터로, 기존 학습된 데이터 분포를 토대로 어느 그룹에 들어가는지를 결정하는 것으로 보면 됩니다.





3행 보도록 할게요.


cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))


factor 함수는 범주형 카테고리를 나타내는 함수이며, rep 함수로 s,c,v 값을 25번씩 반복합니다.


1
2
3
4
5
> cl
 [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c c c
[30] c c c c c c c c c c c c c c c c c c c c c v v v v v v v v
[59] v v v v v v v v v v v v v v v v v
Levels: c s v
cs


이 부분이 무엇을 의미하는지 사실 처음에는 잘 이해가 되지 않았습니다.

그래서 knn 관련하여 영문자료를 뒤지고 뒤지다보니 나온 내용은 다음과 같습니다.


"Test Set에 대한 분류(Classification) 결과에 대한 기대값"


위 2행에서도 보셨듯이 Test 데이터의 값은 ST, VC, VG의 26~50번째 꽃이 그 값입니다.

이는 즉, Test 데이터를 가지고 kNN을 실행했을 때 기대하는 분류를 "s","c","v"로 잡은 것이죠.


위 Factor에서도 보다시피 1~25번째 값은 "s", 26~50번째 값은 "c", 51~75번째 값은 "v"로 구성되어있습니다.

즉 knn분류 시 ST의 꽃은 "s"로 기대하고, VC의 꽃은 "c"로 기대하고, VG의 꽃은 "v"로 기대하는 것이죠.


물론 knn을 실행했을 때 기대값처럼 나오는 것은 아닙니다. 

기대값은 사람이 설정해 놓은 값인 반면, knn 분류값은 알고리즘에 의해서 실행된 결과값이기 때문입니다.


그래서 기대값과 결과값의 차이를 확인하면서 어떻게 분류하는 것이 옳은것인가를 검증하는 것이 

knn을 사용하는 이유이자 머신러닝의 하나의 분류 모델이 되는 것입니다.





이제 제일 중요한 4행입니다. knn함수를 실제로 사용하는 부분이기 때문입니다.


knn(train, test, cl, k = 3, prob=TRUE)


knn 함수의

첫번째 인자는 학습된 데이터

두번째 인자는 새로운 테스트데이터

세번째 인자는 기대값을 나타내는 Factor

네번째 인자는 k값

다섯번째 인자는 테스트 데이터 별 분류 형성 비율 표시여부 입니다.




다섯번째 인자 부분이 잘 이해가 안되시죠?

그래서 전에 제가 썼던 글의 일부분을 예제로 보면서 설명하겠습니다.



출처: ResearchGate.net



빨간색과 녹색은 학습된 데이터이며, 빨간색 분류와 녹색 분류로 나눠져 있습니다.

k=1로 할 경우, 파란색은 빨간색 분류로 들어갑니다.

k=3으로 할 경우, 파란색은 역시 빨간색 분류로 들어갑니다.

k=5로 할 경우, 파란색은 녹색 분류로 들어갑니다.



이를 다시 풀어서 쓰면,

k=1 : 인접 학습값이 빨간색 1개입니다. 100%의 확률을 가진 빨간색 분류로 편입됩니다.

k=3 : 인접 학습값이 빨간색 2개, 녹색 1개 입니다. 66.7%의 확률을 가진 빨간색 분류로 편입됩니다.

k=5 : 인접 학습값이 녹색 3개, 빨간색 2개입니다. 60%의 확률을 가진 녹색 분류로 편입됩니다.


다섯번째 인자인 prob는 TRUE와 FALSE로 있으며,

FALSE일 경우 아무런 값도 나타나지 않습니다.


그러나 TRUE로 할 경우에는 상기 언급된 상위 확률 분류의 퍼센트를 모두 표시합니다.




knn(train, test, cl, k = 3, prob=TRUE)


를 실행했을 때 결과는 다음과 같습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> knn(train,test,cl,k=3,prob=TRUE)
 [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c v c
[30] c c c c v c c c c c c c c c c c c c c c c v c c v v v v v
[59] c v v v v c v v v v v v v v v v v
attr(,"prob")
 [11.0000000 1.0000000 1.0000000 1.0000000 1.0000000
 [61.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[111.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[161.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[211.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[261.0000000 1.0000000 0.6666667 1.0000000 1.0000000
[311.0000000 1.0000000 1.0000000 0.6666667 1.0000000
[361.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[411.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[461.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[511.0000000 0.6666667 0.7500000 1.0000000 1.0000000
[561.0000000 1.0000000 1.0000000 0.5000000 1.0000000
[611.0000000 1.0000000 1.0000000 0.6666667 1.0000000
[661.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[711.0000000 0.6666667 1.0000000 1.0000000 0.6666667
Levels: c s v
cs


75개의 테스트 데이터에 대한 분류 결과를 표시해줍니다.

Factor에서는 1~25번째 값은 s, 26~50번째 값은 c, 51~75번째 값은 v인 반면,

knn 분류에서는 28,34번째 값이 v로 나오고, 52,53,59,64번째 값이 c로 나옵니다.


그리고 prob를 TRUE로 하였기 때문에 가장 높은 비율의 분류에 대한 퍼센테이지도 출력이 됩니다.

(FALSE일 경우 attr(,"prob") 하단 부분은 전부 출력되지 않습니다)


신규 편입 값

28,34번째 - 66.7%로 v 분류 편입

52,64번째 - 66.,7%로 c 분류 편입

53번째 - 75%로 c 분류 편입

59번째 - 50%로 c 분류 편입


기존 기대값 중 100%가 아닌 값

72,75번째 - 66.7%로 원래 기대값인 v 분류 유지





마지막 5행입니다. 이 부분은 중요도가 그리 높은 내용은 아닙니다.


attributes(.Last.value)


이것은 가장 최근에 출력한 내용을 객체 속성별로 보기 좋게 나타내는 함수입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> attributes(.Last.value)
$levels
[1"c" "s" "v"
 
$class
[1"factor"
 
$prob
 [11.0000000 1.0000000 1.0000000 1.0000000 1.0000000
 [61.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[111.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[161.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[211.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[261.0000000 1.0000000 0.6666667 1.0000000 1.0000000
[311.0000000 1.0000000 1.0000000 0.6666667 1.0000000
[361.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[411.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[461.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[511.0000000 0.6666667 0.7500000 1.0000000 1.0000000
[561.0000000 1.0000000 1.0000000 0.5000000 1.0000000
[611.0000000 1.0000000 1.0000000 0.6666667 1.0000000
[661.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[711.0000000 0.6666667 1.0000000 1.0000000 0.6666667
cs



여기서 특별히 설명할 부분은 없습니다.





kNN Model에 대한 R Programming 실습은 여기까지로 하겠습니다.

사실 예제 구문이여봤자 다섯 줄밖에 안되어서 굉장히 짧은 소스코드이지만,

kNN Model에 대한 이해와 이를 기반으로 설명을 하다 보니 굉장히 글이 길어진 것 같습니다.


다섯 줄밖에 되지 않는 예제 코드이지만, kNN Model을 어떻게 R로 구현했는가를 가장 잘 나타내었다 보고요.

이에 대한 이해가 이루어졌다면, 다른 kNN Model에 대해서도 응용 및 학습이 충분히 가능할 것으로 생각됩니다.


다음 머신러닝 글에서 뵙겠습니다.


WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  2개가 달렸습니다.
  1. 박은정 2017.02.09 08:01
    보통은 학습에 도움이 되는 사이트를 만나도 한두편만 읽고 링크해 놓고 잊어버리고 그러는데....오늘은 연속으로 계속 보고 글도 계속 올려주시길 바라는 마음에 댓글도 열심히 도배하고 있습니다.^^;;;
    그만큼 제가 몇 달 공부해 오던 것과 연관된 것이 많기도 하고 설명이 명쾌하기 때문에 그런 것 같습니다. datacamp에서 R로 머신러닝하는 수업도 조만간 들을 예정이었는데 이 글을 읽고나니 그 수업을 듣는 시간을 단축하는데 상당히 도움이 될 것 같습니다. 그리고 머신러닝 툴을 사용하면서 어떤 모델을 적용해야하는지 구분해야할 때도 올려주신 글로 kNN, SVM 개념을 확실히 파악하고 적용할 것 같습니다.
    • 관심 감사드립니다.
      요새는 회사업무때문에 공부를 못하고있는것도 사실이고 게을러진것도 일부있다는것을 스스로 부인할수는 없는가봅니다.. ㅠ
      그래도 이런 댓글들을 보고나니 제스스로가 다시 시작해야겠다는 마음을 가지게 만드는것 같습니다.

      다음주부터 다시 정신차리고 연재 시작해 보겠습니다 :)
secret

업체 광고를 목적으로 쓴다기 보다는..

그냥 제가 R프로그래밍 공부하면서 관련된 곳 돌아다니다가 알게 된 곳이라 덤으로 써보는겁니다.


아무래도 R 프로그래밍의 대가나 그런것까지는 바라지 않더라도

빅데이터 활용을 위한 다양한 패키지를 어떻게 활용하는지 정도는 알아야 하지 않겠습니까.


첫번째로 소개할 곳은 DataCamp입니다.


DataCamp ← http://www.datacamp.com/courses


이 곳은 크게 R, Python 동영상 및 실습강좌를 제공해주네요.





기초강좌는 무료제공을 해주고요. 

당연히 심화강좌나 그런 것은 유료로 제공을 하겠죠.



한달에 $29, 1년에 $300입니다. 참고하시고요.

당연히 무료강좌 들은 다음에 유료 여부 고민해봐야겠죠.


그건 그때가서 생각해봅시다.


가입을 해야만 들을수있는데, 가입 자체는 무료입니다.




원하는 강좌를 선택하고 들어가면 위와같이 동영상이 잠깐 나오고.

동영상 재생을 마치면 실습을 들어갑니다.



실습 화면입니다.


좌측 프레임: 실습 내용 및 실습 과제를 제시해줍니다.

가운데 상단 프레임: 실습 과제 코드입니다.

가운데 우측 프레임: 실습 코드에 대한 결과를 화면으로 표시해주는 부분입니다.

하단 프레임: 실제 실행되는 코드입니다. R Prompt로 보시면 됩니다.


이런 식으로 하나하나 요구하는 과제를 수행하면서 실제 결과를 좀 더 이해할 수 있도록 구성되어있네요.



우리나라 동영상강좌도 이런식으로 구성하면 참 좋을텐데.. 아쉽네요.

(프로그래밍에 국한해서 하는 말은 아닙니다)



여하튼 이렇습니다.


제가 실제로 공부하려고 들어간 사이트라 같이 공유하는 차원에서 알려드리는거고요.

참고하시면 도움은 되실 것으로 보입니다.




WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  2개가 달렸습니다.
  1. 박은정 2017.02.09 07:52
    예전에 코세라의 Inferential Statics 강의를 하시는 듀크대학 교수님께서 실습을 이곳에서 하도록 해서 datacamp를 알게 되었습니다. community 메뉴에는 무료 강의들도 많이 있어서 주로 그걸 보다가 최근에 1년권 반액 세일을 하길래 지름신을 영접했습니다.^^;;;
    저도 한국의 강의가 이런 플랫폼으로 만들어지면 좋겠다는 생각을 많이 했습니다. community에 중국말로 된 무료 강의도 있는걸 보면 이 플랫폼을 이용한 한국말 강의도 가능하지 않을까 싶습니다.
    • 국내 온라인교육 관련된 부분을 봤을때, 취준생 또는 수험생 위주의 온라인교육 과정에대한 IT 플랫폼은 정말 제대로 구성이 잘 되어 있습니다. 하지만, 말씀하시는대로 이런 IT 전문분야 또는 특수 분야에 대해서는 온라인교육 플랫폼이 많이 갖춰지지 않은 상태로 느껴집니다. 국내 온라인 교육쪽에도 이런 사이트들이 많이 활성화만 된다면 참 좋을텐데.. 하는 생각이 저도 드네요.
      매번 좋은 교육이나 레퍼런스 등등을 외국 자료를 통해서 찾아보게 되는데, 사실 국내에도 이와 관련해서 지식 가지고 있는 사람 생각보다 좀 있거든요. 하지만 이를 알리고 공유하는 사람들은 그리 많다는 느낌은 들지 않고 있고요.
      향후 블로그의 방향도 이러한 맥락에서 좀 더 고민해보겠습니다.

      좋은 댓글 감사합니다.
secret

이번 글은 R 프로그래밍을 활용하여 구글 맵(Google Map)을 연동한 위치 표시 기능을 소개해 드립니다.


산재해 있는 위치정보 데이터를 바탕으로 구글맵에 표시한다면 가독성이 쉬워지겠죠?


이번에 나타낼 예제로는 서울시 공공 Wi-fi 설치 위치 정보입니다.






일단 데이터를 먼저 받아야겠죠?

서울시 관련 공공데이터는 서울시 데이터센터에서 누구에게나 무료로 제공을 하고 있습니다.



http://data.seoul.go.kr ← 서울시 데이터센터







거기서 원하는 정보를 찾고 Excel로 다운로드받으면 다음과 같은 정보가 친절하게 다 있습니다.

저는 상기 언급했다시피 서울시 공공 Wi-fi 정보를 나타낸다 하였으므로 검색해서 다운로드받았습니다.


localname type company xaxis yaxis provider
강남구 공공기관 (재)서울산업통상진흥원 127.0717546 37.4955815 LGU+
강남구 공공기관 (재)서울산업통상진흥원서울신기술창업센타 127.0380541 37.4976121 LGU+
강남구 공공기관 U강남도시관제센터 127.040992 37.5084025 강남구
강남구 공공기관 강남구의회 127.0642026 37.4939383 강남구
강남구 공공기관 강남구청 127.047502 37.517305 강남구
강남구 공공기관 강남수도사업소 127.0471233 37.4833851 상수도사업본부
강남구 공공기관 강남운전면허시험장(대치) 127.0672394 37.5084197 KT
강남구 공공기관 강남인터넷방송국 127.0384706 37.4909267 강남구

...



※ 주의점: 여기 숫자는 전부다 텍스트형 숫자입니다. 반드시! 숫자유형으로 변환 후 저장해야 합니다.



이제 이 데이터를 가지고 R에서 활용하면 되겠죠?


1
2
3
4
5
6
7
8
9
10
library(RgoogleMaps)
library(readxl)
seoulwifi <- read_excel("~/rdata/seoulwifi.xlsx")
View(seoulwifi)
map.center.loc <- c(37.5639154,127.0094153)
input.zoom <- 11
map_data <- seoulwifi
win.graph()
mymap <- GetMap(center=map.center.loc, zoom=input.zoom, maptype="road", format="roadmap", destfile="mymap.png")
PlotOnStaticMap(mymap,lat=map_data$yaxis,lon=map_data$xaxis, destfile="mymap_point.png",cex=1,pch=10,col="red")
cs


1. RgoogleMaps: 이 부분이 구글맵 사용을 위한 R 패키지입니다.

2~4. 엑셀파일 적용

5. 지도 가운데 위치 잡는 부분입니다.

6. 지도 Zoom을 나타내는 부분입니다.

8. 그래프 표시 창을 띄워주는 화면입니다. (필수는 아님)

9. 사용할 지도의 값을 mymap 변수에 저장하는 부분

10. 사용할 데이터를 mymap 지도 상에서 표시해서 뿌려주는 부분




여기서 몇 가지 사항.


1) 지도 가운데 위치와 Zoom은 어떻게 잡을까요?



웹 상의 구글 맵으로 가신 다음에, 원하는 부분 드래그 & 휠 돌리다보면 위 표시된 부분과 같이 주소가 나옵니다.


주소 상에서 37.5639154,127.0094153,11z  라고 되어있는 부분이 있는데

37.5639154가 y축이고

127.0094153이 x축이고

11이 Zoom 크기입니다.


※ 주의사항: Zoom 크기에 11.5 등의 소수점 안됩니다. 물론 Google Map에선 되지만, R Programming에서는 안됩니다.




2. GetMap() 함수

이 부분이 구글에 뿌려준 지도를 이미지 값으로 저장하는 함수라고 보시면 됩니다.

파라미터는 아래와 같고요. (출처: https://cran.r-project.org/web/packages/RgoogleMaps)



center optional center (lat first,lon second ) 


size desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels 

(전 여기서 이거 지정 안했습니다. Default는 위와 같이 640x640)


destfile File to load the map image from or save to, depending on NEWMAP. 


zoom Google maps zoom level.


maptype defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile. 


format (optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG.

(그냥 PNG 쓰시면 됩니다)



위 예제와 같이 destfile 입력하시면 해당 이름으로 이미지가 생성되니, 먼저 미리보기하셔도 됩니다.





3. PlotOnStaticMap() 함수


이 함수가 먼저 지정된 Map Data를 바탕으로 실제 데이터를 화면상에 뿌려주는 부분입니다.

파라미터 설명은 다음과 같습니다. (출처: https://cran.r-project.org/web/packages/RgoogleMaps)



MyMap optional map object 


lat latitude values to be overlaid


lon longitude values to be overlaid 


destfile File to load the map image from or save to, depending on whether MyMap was passed. 


cex 표시될 표식의 크기입니다.


pch 표시될 표식의 모양 번호입니다.


col 색상입니다.





위의 내용을 참고하여 작성하면 다른 응용 데이터도 나타낼 수 있겠죠?





자, 이제 응용을 해봅시다.


1
2
3
4
5
6
7
sktmap <- subset(map_data, provider=="SKT")
ktmap <- subset(map_data, provider=="KT")
lgumap <- subset(map_data, provider=="LGU+")
win.graph()
PlotOnStaticMap(mymap,lat=sktmap$yaxis,lon=sktmap$xaxis, destfile="skt_point.png",cex=1,pch=20,col="red")
PlotOnStaticMap(mymap,lat=ktmap$yaxis,lon=ktmap$xaxis, destfile="kt_point.png",cex=1,pch=20,col="black")
PlotOnStaticMap(mymap,lat=lgumap$yaxis,lon=lgumap$xaxis, destfile="lgu_point.png",cex=1,pch=20,col="purple")
cs


위 데이터를 바탕으로, 특정 통신사업자의 값만 추려서 뽑을 수도 있겠죠?


subset() 함수를 사용해서 필터링된 데이터셋을 따로 만들고,

따로 만든 데이터를 각각의 지도 위치로 표시를 하면 됩니다.



SKT



KT


LGU+




통계 데이터를 지도와 연동해서 가독성이 좋은 이미지로 표시한다는 것이 역시 매력적이겠죠?

이번 글은 여기서 마치겠습니다.





11/18 추가 내용


사실 이 Google Map 부분은 이미지파일을 Google 지도로부터 생성하고, 이미지 위에 Point를 얹어놓는 수준이군요.

그리 크게 대단한 기술은 아닙니다만, 편리하게 이용할 수는 있을 것입니다.


ggplot2 를 사용해서 뿌려줬을 때의 결과는 아래와 같습니다. 이 부분은 덤으로 색깔도 같이 넣어봤습니다.






WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  5개가 달렸습니다.
  1. 비밀댓글입니다
    • 어려운 질문이였네요.지금은 잘 되시는지요? ㅠ
      저도 해당 부분에 대해서 관련된 부분을 찾아보았지만, 뚜렷한 해법을 찾지는 못한 상태이고요.
      다만 해외 R프로그래밍 하시는 분들의 몇몇 의견을 종합했을 때에는 Plot으로 화면을 띄울 때 있어서 Windows 창을 사용하는 방식에 있어서 뭔가 충돌이 났을 가능성이 있다고 보아집니다.

      Windows XP라서 만약 안된다면, R Studio에서의 Windows 모듈이 현 버전과 불일치해서 나타나는 현상일 수도 있고, Ubuntu나 Linux 등등에서도 가능성은 일단 있다고 합니다.

      해외 몇몇 피드백에서는
      > options(device="windows";)
      이거나 혹은
      > options(device="devWindows";)
      등을 사용해서 띄우는 식으로도 사용을 하고 있습니다만, 사실 이것 또한 완전한 해법이라고 보기는 어려운 것 같기도 하고요.

      이 부분에 대해서는 저도 좀 더 알아보도록 하겠습니다.

      본문의 예제는 Google Map 상의 RGoogleMaps 패키지 상의 함수를 이용했다는 점에서 일부 제한적으로 Plot을 띄우는 것이 있었으며, 해당 모듈을 사용하지 않고도 Plot을 표시할 수는 있을 것으로 생각됩니다.

      RGoogleMaps에 대한 의존도를 줄이면서 동일한 결과를 낼 수 있는 코드도 한번 짜 보겠습니다.

      관심 감사드립니다.
  2. 감사합니다! 아직 해결을 하지는 못했습니다만, 열심히 수정중에 있습니다.
    피드백 정말 감사드립니다!
  3. 안녕하세요 지금 한창 R을 공부하고 있는 학생입니다.
    다름이아니라 제가 지금 만들고 있는 데이터를 시각화 하는데 약간의 문제 있어서
    자문을 구하고자 이렇게 글을 남기게 되었내요
    본론으로 들어가자면 저는 지금 저자분께서 하시는 것처럼 데이터를 불러와서 지도에 분포를 하는 식의 데이터를 시각화를 하고있는데
    데이터를 시각화 를 했지만 데이터 분포가 너무 적은 나머지 한눈에 들어 오지 않는 단점이 생겨서
    분포된 데이터의 지도에 표신된 점(?) 포인트를 키워 보려고 하는데 어떤 방식을 사용하면 될까요???
    • 위 소스코드 중 제일 마지막이 지도에 표시하는 부분입니다. cex와 pch속성이 있는데, 크기를 늘리시려면 cex의 값을 올리면 되는것으로 알고있습니다.
      저도 지금 모바일이라 테스트가 어려운점 양해바라며, 좋은결과있길 바라겠습니다.
secret

Word Cloud 라. 해석하면 단어 구름이죠.

아마 아래 사진을 보시면 확 와닿을 것입니다.




이런것 인터넷 돌아다니다 많이 보셨을 것입니다.


이번 글에서는 R을 통해서 어떻게 구현하는지를 한번 보도록 할게요.





Word Cloud



R에서 제공하는 외부 패키지 중 하나입니다.


R 공식사이트에서 제공하는 패키지 중 하나로, 


https://cran.r-project.org/web/packages/wordcloud/index.html


이곳에서 다운받을 수 있고요.



하지만 저는 R Studio에서 쉽게 다운로드를 받고 설치를 했습니다.



여기 화면 보이는데로 들어가셔서,




입력하면 자동으로 나와서 설치하면 됩니다.


하지만 wordcloud 패키지만 설치하지 마시고,


tm : A framework for text mining applications within R.

RColorBrewer : provides color schemes for maps (and other graphics) designed by Cynthia Brewer


패키지도 같이 설치해주시고요.


필요에 따라서는 또다른 패키지도 같이 설치해주시는것을 권장합니다.



wordcloud에서 제공되는 대표적인 함수는 아래와 같이 있으며,



commonality.cloud 

comparison.cloud 

textplot 

wordcloud 

wordlayout 



이것들을 다 다루지는 않고. wordcloud 함수를 사용한 예제만 간단히 보여드리겠습니다.


1
2
3
4
5
6
7
8
9
10
require(tm)
require(wordcloud)
data(crude)
crude <- tm_map(crude,removePunctuation)
crude <- tm_map(crude,function(x)removeWords(x,stopwords()))
tdm <- TermDocumentMatrix(crude)
<- as.matrix(tdm)
<- sort(rowSums(m),decreasing = TRUE)
<- data.frame(word = names(v),freq=v)
wordcloud(d$word,d$freq)
cs


이 예제가 사실은 wordcloud 와 관련된 예제중에서 굉장히 많이 있는 예제입니다.

다른 곳에도 지금 예제는 똑같이 있을겁니다.


예제를 간단히 설명하면 다음과 같습니다.


1~2. tm 패키지와 wordcloud 패키지를 불러옵니다 (만약 제대로 안되면 Rcpp 패키지도 같은방법으로 불러오세요)

3. crude라는 값(value)을 불러온다. (crude라는 것은 tm 패키지의 예제용 내장 데이터 값입니다.)

4. crude 값의 인용부호를 제거한다. (이걸 제거해야 데이터셋 구성하기가 좋은가봅니다)

5. crude 값의 전치사, 접두사 등등 인용구를 삭제한다 (한글 지원 안됩니다)

6~9. crude에 대한 2차원 배열을 생성하고, 이것에 대한 데이터 d를 생성한다.

10. wordcloud 함수로 결과를 뿌려준다.




이게 기본 예제입니다.


확인 결과, 모든 값이 다 나오는 것은 아니고 일부 값은 표시(Plotted)되어 나타나지 못한다고도 합니다.

그래서 세부 파라미터 등을 통해서 표현하면 더 좋을 것입니다. (세부 파라미터는 뒤에 나와있음)


그렇다면 말이죠. 8번째 줄과 같이 wordcloud로 word와 freq를 가지고 뿌려주는데. 

word와 freq는 어떤 데이터 구조일까요??



바로 이런 데이터 구조입니다.


조금은 감이 잡히실 것입니다.


wordcloud 함수로 뿌려주는 것은

첫번째 Parameter에 뿌려주는 내용을 나타내고,

두번째 Parameter에 해당 내용에 대한 크기를 나타내는겁니다.


즉 위 열 이름을 추정했을때 특정 단어에 대한 사용빈도를 뿌려주고, 빈도가 클수록 글씨도 커지겠죠??





자. 이제 응용해 봅시다.




저는 코스피 시가총액 상위 50종목의 시가총액 규모를 가지고 해보기로 했습니다.


그래서 그걸가지고 엑셀파일을 만들었죠.



name total
삼성전자 2,250,869
한국전력 292,094
현대차 290,765
SK하이닉스 290,109
삼성물산 279,793
삼성전자우 257,444
........


R Studio에서는 엑셀 데이터 불러오는게 가능합니다. xlsx 파일도 당연히 가능하고요.


※ 엑셀파일 만들때 명심할게 있습니다.

1. 숫자는 반드시 숫자형이여야 하고 (텍스트형 숫자 절대안됨)

2. 숫자가 음수가 들어가면 안됩니다. 왜냐하면 wordcloud의 matrix 두번째값이 숫자크기라 양수만 인식됨

3. 그리고 엑셀파일 만들때 외부 이미지나 하이퍼링크 등등 전부다 제거해주시기 바랍니다.






여기서 한번 생각해 봅시다.


위에 있는 예제는 crude라는 value값을 가지고, dataset 형태로 변환시킨다음에 이를 wordcloud 함수에서 호출만 한겁니다.

그렇다면, 엑셀 데이터를 불러온다면 위에서 했던 저 번거로운 과정 필요없이 바로 결과를 보여주면 되겠네요??


네. 맞아요.


1
2
3
4
require(wordcloud)
library(readxl)
test2 <- read_excel("~/test2.xlsx")
wordcloud(test2$name,test2$total)
cs

그냥 이렇게 하면 끝나요.



참 쉽죠? 

쉽게쉽게 가자고요. 엑셀 데이터 만들어서 원하는대로 뿌려주면 되는데 뭘 번거롭게 합니까.




이번에는 좀 간단하게 디자인하는 예제입니다.

맨 위의 사진처럼 뿌리려면 모양 좀 다양하게 해야겠죠?


1
2
3
4
5
6
require(wordcloud)
require(RColorBrewer)
library(readxl)
test2 <- read_excel("~/test2.xlsx")
pal2 <- brewer.pal(8,"Dark2")
wordcloud(test2$name,test2$total,min.freq=2,max.words=Inf,random.order=FALSE,rot.per=.15,colors=pal2)
cs



RColorBrewer라는 패키지가 들어갔고요.

이거는 여러가지 색깔을 뿌려주는 패키지입니다.

이 부분은 주요 내용은 아니므로 간단하게만 소개할게요.


5번 줄에 보시면, RColorBrewer의 brewer.pal()이라는 함수를 통해서 색깔규격을 지정하는 내용입니다.


wordcloud 함수가 좀 복잡해졌네요. 파라미터 볼게요.

wordcloud 공식 문서에는 아래와 같이 나와있습니다.



term.matrix A term frequency matrix whose rows represent words and whose columns represent documents.

(1열, 2열입니다. 1열은 값이고 2열은 크기입니다)


여기서부터가 3열 이후의 내용입니다.


scale A vector of length 2 indicating the range of the size of the words. 

(크기를 지정합니다. 위 예제에는 해당 부분이 빠졌는데, 이는 특정 데이터의 값이 너무 클 경우 에러가 발생하기 때문입니다)


min.freq words with frequency below min.freq will not be plotted

(만약 나오는 총 단어가 지정개수 이하면 나타나지 않도록 함, 큰 의미는 없군요)


max.words Maximum number of words to be plotted. least frequent terms dropped 

(단어의 최대 길이)


random.order plot words in random order. If false, they will be plotted in decreasing frequency 

(단어 순서를 임의대로 지정한다는데 사실 큰 차이는 없음)


rot.per proportion words with 90 degree rotation 

(90도 회전하는 단어 비율 결정)


colors color words from least to most frequent 

(색깔 결정인데, 위 예제에서는 RColorBrewer 패키지 함수에 지정된 pal2로 지정해서 여러가지 색이 나오는겁니다)


그 외에도 여러 옵션이 사실 있습니다.






위와 같이 코드를 재구성했을때 결과가 맨 첫번째 사진과 같은 결과입니다.

(참 삼성전자 글자가 무지하게 크죠? 그만큼 코스피 시가총액 상위50종목 중 삼성전자 비중이 크다는 뜻입니다)



R에서 사용하는 Word Cloud 패키지 예제를 이상 마치겠습니다.



이 패키지를 통한 빅데이터 활용도는 사실 매우 많이 있고 인터넷 상에도 많이 나돕니다만,

유용하게 사용할 수 있는 방법에 대해서는 조금 더 구상해 보겠습니다.



R Programming 관련하여 제가 일부 잘못 알고있는 부분이 있으면, 전문가님의 피드백 언제든 환영합니다.



WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  2개가 달렸습니다.
  1. tm 패키지를 깔고 싶은데
    Error in install.packages : missing value where TRUE/FALSE needed
    이렇게 나옵니다.. 어떻게 하면 좋을까요?
    • 혹시 설치할 때
      > install.packages("tm";)
      이렇게 하신것 맞으신가요?

      대개 아래 에러와 같은 경우는 if절에서 TRUE냐 FALSE냐를 명시하지 않을 때 주로 생기는 오류로 알고 있습니다.

secret

이번에 R Programming 카테고리를 신설하였습니다.


물론 전 R 전문가도 아닐 뿐더러, 오히려 초보 수준에 가까운 사람입니다.

어떻게 보면 R 프로그래밍 공부를 막 시작한 사람이라고 보셔도 되고요.


IT 트렌드나 신기술, 사용 후기 등을 최근까지는 블로그 주요 주제로 하였는데.

R 프로그래밍을 추가하였다.


왜일까요.





연계성이 있기 때문이지요.


IT Trend가 여러 가지 수 많은 기술들이 있지만,

비록 최신 기술은 아니더라도. 이미 떠오르다 못해 성숙기에 접어들 수도 있는 기술이지만,


앞으로도 IT를 이끌 기반 기술 중 하나로 빅데이터를 꼽고 싶습니다.



빅데이터의 활용. 수많은 방법이 있지만,

R 프로그래밍이 이러한 빅데이터를 다룰 수 있는 가장 주효한 기술로 판단했기 때문입니다.


물론 전 프로그래머는 아닙니다.

하지만, 전공이 컴퓨터이기도 했고. 대학원도 소프트웨어공학 전공이기도 했고.

비록 지금 하는 업무가 관리부문이라 8년동안 프로그래밍을 손에 놓긴 했지만,


완전 쌩 초보는 아닙니다. 



다시 프로그래머의 길로 접어들려고 한다기 보다는,

IT Trend에 맞게, 그리고 블로그 컨셉에 맞는 다양한 방법과 실습 등을 통해서

하나하나 새로운 것을 연구해가는 것도 유익할 것이라 보고 시작하게 된 것입니다.


그래서 카테고리 대분류명도 'Onik Lab.'입니다.



빅데이터에 관한 기반을 하나하나 연구해보면서, 어떠한 유용한 정보를 블로그를 통해서 제공할 것인지.

그리고 당장의 신기술하고는 거리가 멀더라도, 이미 널려져있는 수많은 정보를 어떻게 표현할 것인지.

그런것에 집중해 보겠습니다.



추가적으로.

이미 R 전문가가 써놓은 수많은 레퍼런스들이 있을것이고. 더불어 수많은 자료도 있고. 이 분들의 자료를 참고를 하겠지만,

그대로 베끼기식으로 블로그에서 표현하는 일은 없을 것입니다.

철저하게 제 스스로가 실습하고 표현하려는 내용을 그대로 옮길 것입니다.


R 프로그래밍 초보 중 한명으로서, 어떠한 강좌가 되지도 않을 것이고. 교본이 되지도 않겠지만.

제가 실습했던 여러 가지 정보를 표현한다면 그것으로도 일부분 얻고자 하는 자료는 나타낼 수 있을 것입니다.


잘 부탁드립니다.


WRITTEN BY
鬼風
생각이 깨어있지 않다면 살아갈 이유도 없다

트랙백  0 , 댓글  0개가 달렸습니다.
secret