1월, 2015의 게시물 표시

KoNLP - 한글 자연어 처리 툴킷

R에는 {tm}이 있어서 텍스트 마이닝을 손쉽게 할 수 있다. 그렇지만 각종 처리를 위해 단어를 분절하는 일 등을 할 때는 참 어렵다. 뿐만 아니라 collocation 혹은 concordance 문제를 처리하기도 쉽지 않다. 전희원씨가 만든 KoNLP는 이러한 문제를 좀 더 잘 해결할 수 있도록 여러 함수를 제공한다. 이 패키지를 쓰려면 {rJava} 패키지가 있어야 한다. 만약 이 패키지를 제대로 설치하지 못하면 KoNLP를 사용할 수 없으니 본 블로그의 다른 포스트를 참고하여 반드시 잘 설치하자. R> install.packages("KoNLP") R> library(KoNLP) 메모리에 문제가 있다면 다음을 추가한다. R> options(java.parameters = "-Xmx2G") #2GB할당 **임시 추가 2016-01-01** ignore.case()함수가 더 이상 사용되지 않아 KoNLP의 concordance_str()함수에 오류가 발생한다. 이 문제를 직접 해결해야 예제 코드가 정상 작동된다. 일단 다음과 같이 사용자 함수를 만들어 사용하자. concordance_str <- function (string, pattern, span = 5)  {     res <- str_match_all(string, regex(sprintf(".{0,%d}%s.{0,%d}",                                                       span, pattern, span),ignore_case=TRUE))     return(Filter(function(x) {         length(x) != 0     }, res)) } concordance_file <- function (filename, pattern, encoding = getOption("encoding"), 

[ggplot] 2차원 그래프

이미지
몇 가지 데이터가 있어서 점을 찍어보고 싶다. 그리고 눈에 확 들어오게 점이 몰려 있는 곳도 잘 표시하고자 한다. 이러한 목적을 달성할 때 {ggplot2}가 좋다. 우선 기본적인 그림을 그려보자. require(ggplot2) require(gcookbook) draw_my_graph <- function() {   g <- ggplot(faithful,               aes(x=eruptions,y=waiting))   g + geom_point() } 실행은 > draw_my_graph() 그 결과는 다음과 같다. 눈으로 봐도 잘 보이기는 하지만 다음과 같이 하면 더 잘 보인다. draw_my_graph_density <- function() {   g <- ggplot(faithful,aes(x=eruptions,y=waiting))   g <- g + geom_point()   g <- g + stat_density2d(aes(     alpha=..density..),     geom='tile',     contour=FALSE)   g } 실행을 > draw_my_graph_density() 결과는 너무 칙칙한가? > draw_my_graph_density2() + theme_classic() 선택할 수 있는 theme은 이것 이외에도 많다. theme_gray() theme_bw() theme_linedraw() theme_light() theme_minimal() 논문이나 보고서에 넣기에는 폰트도 예쁘지 않고 크기도 작다. 바꿔보자. > draw_my_graph_density2() + theme_classic(base_family="serif",base_size=30) 아직도 몇 가지 문제가 있다. 축의

계산 효율을 높이기 위한 foreach 패키지

패키지 {foreach}는 RevolutionR의 일부로 제공되는 모듈이다. 공짜로 설치해서 사용할 수 있고, {parallel} 보다 훨씬 더 편하기 때문에 대량 계산을 위한 필수품이다. 설치와 사용 #설치 > install.packages("foreach") #사용 > library(foreach) 인수 하나, 간단한 함수 그리고 list 출력 # 디폴트는 list로 출력하는 것 # foreach() 안에 반복할 인수를 벡터로 넣는다. 이들은 sqrt()에 사용된다. # %do% 연산자가 foreach()와 sqrt()를 연결한다. > x <- foreach(i=1:3) %do% sqrt(i) > x [[1]] [1] 1 [[2]] [1] 1.414214 [[3]] [1] 1.732051 인수 하나, 간단한 함수 그리고 vector 출력 # .combine 옵션에는 결과를 요약할 함수를 적는다. > x <- foreach(i=1:3, .combine='c') %do% sqrt(i) > x [1] 1.000000 1.414214 1.732051 인수 둘, 함수 작성을 그 자리에서 # foreach에 i와 j를 써서 # 함수의 정의를 { }안에 직접 작성할 수 있다. > x <- foreach(i=1:10, j=2:11, .combine='c') %do% { +   i+j*2 + } > x  [1]  5  8 11 14 17 20 23 26 29 32 이것을 c 코드로 쓰면 #include <stdlib.h> int i=0; int j=0; int *x; int sizeOfArray=10 x=(int *) malloc(sizeOfArray*sizeof(int)); for(i=1; i<11; i++) {  for(j=2; j<12; j++)

Neural Network Analysis

이미지
소개 인공신경망분석(Artificial Neural Network: ANN)은 생물체의 신경 시스템을 본뜬 계산 알고리즘이다. 입력과 출력 사이를 은닉 노드들로 연결하고, 이들의 경로 하나하나가 기능적 목적을 가진다고 본다. 경로들이 복잡하게 얽혀 있는데 이미 알려진 결과들을 바탕으로 파라미터들의 가중치 값을 귀납적으로 추론한다. 간단하게 생각하면 입력노드의 값들을 집계하는 함수가 존재하고 그 함수값을 보존함으로써 이를 출력 노드로 이어지는 또 다른 함수의 입력값으로 쓴다. 이때 집계 함수를 activation function 혹은 transfer function이라고 한다. 인공신경망분석은 직접 설명하기 곤란한 경험적 현상을 귀납적 데이터를 바탕으로 설명할 때 아주 좋은 성능을 보이는 것으로 알려져왔다. 로지스틱 회귀 분류의 대안으로 쓰이거나 회귀분석과 종종 비교되기도 한다. 몇 가지 용어를 익히고 다음을 설명하자. learning rate: 가중치의 크기를 조절하고 계산 상의 오류를 처리하기 위한 값 momentum: 가중치를 업데이트하여 조정하는 값 epoch: 연산을 수행하는 반복 구간(=iteration)의 상한 minimum error: (간단히 말해) 네트워크로 뽑은 목표값과 실제값의 조정된 차이   종류 Feed-forward Systems {neuralnet:neuralnet} Radial Basis Function Networks {RSNNS:rbf} Recurrent Networks (Elman Network) {RSNNS:elman} Hopfield Networks {COSNet:COSNet} Self-organizing Map {RSNNS:som} ART Models {RSNNS:art1} 이것 이외에도 Echo State Networks이 있다. 내가 알기로 아직 R 패키지로 나와 있지 않아서 다음 코드로 직접 구현해야 한다. --> 참고 예 간단히 {neuralnet

엑셀 파일 R에서 바로 불러 쓰기

R에서 Excel 2010의 Worksheet를 바로 불러서 쓸 수 있다. 물론 R의 data.frame 객체에 적합하게 데이터가 갖추어져 있어야 하지만. ㅋㅋ 예제에서는 Windows7, 64비트 컴퓨터를 가정해서 이야기한다. 우선 여러분 컴퓨터에 Java (JRE혹은 JDK) 64비트가 설치되어 있고, R도 64비트 버전을 쓴다고 하자. Java에 문제가 없는 지 확인하자. 왜냐하면 우리는 rJava를 써야 하니까... 자바에 문제가 없다면 시작 메뉴의 "프로그램 및 파일 검색" 창에 환경 변수라고 입력하자. "시스템 환경 변수"를 클릭하고 "환경 변수"를 선택한다. Java의 설치 디렉토리가 C:\Program Files\Java\jre7 이라고 하면 새로 환경 변수를 만들고 이름을 JRE_HOME이라고 하자. 이제 path 변수를 더블클릭하여 편집 창을 열고 다음과 같은 문구를 맨 끝에 추가한다. ;%JRE_HOME%\bin\server 창을 닫는다. 현재 R과 관련된 프로그램이 실행되어 있다면 모두 종료한다. 다시 R 프로그램을 연다. 이제 rJava와 XLConnect를 설치할 차례다. > install.packages("rJava") > install.packages("XLConnect") 이렇게 실행한다. 엑셀 파일이 준비되었다고 하고 디렉토리를 c:\users\me\rsample.xlsx 라고 하자. 데이터가 첫번째 워크 시트에 있다면 다음과 같이 입력하여 이 데이터를 불러올 수 있다. > library(XLConnect) > setwd("c:\\users\\me") > test_data <-  readWorksheet(loadWorkbook("rsample.xlsx"),sheet=1) 복잡하면 다음과 같이 함수로 만들어두고 반복하여 쓰자

R로 분석하기 - 프로젝트

R을 계산기로 사용하는 것은 쉽다. > 1+1 [1] 2 뭐 이런 느낌으로 함수들을 가져다가 평균도 구하고 분산도 구하고, 기분 내키면 회귀분석도 하고 그러면 된다. 그러나 이뿐? R은 더욱 더 복잡하고 반복적인 일도 처리하고, 어떻게 분석을 진행했나 그 과정도 보여준다. R로 사회과학 분야를 연구하는 사람들은 나름대로 R을 어떻게 사용할 지 생각해보자. 오늘은 나의 노하우를 조금 밝히려 한다. 나는 R 코드를 세 부분으로 나눈다. [1] 데이터 관련 코드 [2] 연산 관련 함수 [3] 실행 코드 예를 들어 data_handling.r, my_functions.r, my_runner.r 이렇게 세 부분이다. 가장 먼저 작성하는 코드는 당연히 data_handling.r이다. 이 소스 스크립트는 원시 데이터를 받아 data.frame이나 list 등, 분석에 필요한 데이터 객체를 생성하는 과정이 모두 포함되어 있다. 다음으로 통계분석 과정을 담고 있는 my_functions.r이 있다. 이 함수는 다음과 같이 개별 통계 분석 시나리오를 담는다. 예를 들어 다음과 같은 분석 시나리오를 my_ttest_exam_score 함수로 만들었다. # [1] 학생점수 벡터 # [2] 중간고사 기말고사 비교 # my_ttest_exam_score <- function(x.vector,g.factor) {   cat("This is sample.","\n",sep="")   pairwise.t.test(x.vector,g.factor) } 마지막으로 my_runner.r은 실행코드다. # 2014년 중간고사 기말고사 비교 # 학생들이 중간고사보다 기말고사 때 공부를 더 열심히 했는가? # 작성자:TagKim source("my_functions") # 분석 시나리오 불러온다. my_ttest_exam_score(test_result,test

파이썬 101 암기해야 할 키워드

R과 함께 알아두면 좋은 컴퓨터 언어, 파이썬(Python)에 관한 글을 연재하렵니다. 오늘은 그 첫번째로 암기할 키워드를 소개합니다. 믿든 말든 오늘 이야기하는 키워드가 파이썬의 모든 키워드입니다. 이것밖에 없단 말입니다! 논리 and or not 조건 is assert break continue if else elif try except finally raise pass 반복 for in while yield 메모리 class def del global lambda import from with 함수 return exec print 자 이들을 하나 하나 살펴보기 앞서 단어들을 20번 반복해서 읽으세요. 그냥 암기! 눈에 익을 때까지 계속 봐야 합니다. 프로그래밍을 고상하게 배우겠다니요... 손가락 두들겨가며 배워야 실력이 늘어요.

애마야... 너도 늙었구나

이미지
제 자동차는 2005에 생산된 GM대우의 라세티 1.6 다이어몬드입니다. 이제 10년차! 이야... 저의 석사와 박사과정을 버텨준 든든한 파트너입니다. 점차 상태가 나빠지고 외관도 지난 10년전과 비교할 때 결코 좋지 않습니다. 세월을 느낄 수 있는 좋은 차입니다. 참으로 모자란 점이 많은 GM대우입니다. 이 차의 단점을 열거하면 너무 많습니다. 변속충격, 말도 안되는 토크밴드 설정, 다루기 어려운 핸들링, 너무 작은 바퀴 사이즈, 400cc 모자란 배기량, 50마력 모자란 출력, 부실한 내부, 금방 한계에 다다르는 서스펜션 등등등... 그렇지만 제가 이 차를 좋아하는 결정적인 이유! (저는 소유는 하지 않았지만 취미로 다양한 차종을 다루어보았고, 모터사이클 매니아였슴다) 기본에 충실한 응답성, 잘 들리는 엔진소리 때문입니다. 무엇보다 한없이 250cc 바이크에 가까운 감성은 이 차의 큰 매력이 아닐까요? 아...그런 이 차가 이제 눈속에 나뒹굴고 있어도 시큰둥... 가족이 늘어 빨랑 다른 차로 갈아탈 시점이 다 되었다는 압박... 너와 지낼 날도 이제 얼마 안남았구나. ㅜ.ㅜ

경영학을 공부한다는 것?

인문계 출신이 수학 몰라도 된다? 컴퓨터 못해도 된다? 기계치여도 상관없다? 이런 후진적인 생각은 당장 버리라. 반대로 이공계 출신이 시 한 수 모르고 정치에도 밝지 못하다면 이 또한 시대 역행이다. 경영학을 공부하려면 기본기가 충실해야 한다. 기초 대수학 선형 대수학 미적분학 확률론 통계기초 그리고 오피스 운용 능력 (모든 기능, 주요 단축키 포함) 윈도우즈 운용 능력 (컴퓨터 관리 수준) 데이터베이스 (RDB 관리, SQL 작성) 통계 프로그램 (R이나 SAS 중 하나) Art Work 프로그램 (포토샵, 일러스터, Adobe Professional, PicPick 혹은 이들의 대안) 마지막으로 컴퓨터 프로그래밍 언어를 최소 하나는 알아야 한다. 여러분 앞에는 두 가지 경로가 있다. C 에서 시작해서 Python으로 C 에서 시작해서 Ruby로. 프로그래밍 언어를 알아야 하는 이유, 그것도 스크립트 언어를 알아야 하는 이유는 업무 자동화와 문제해결 능력을 높이기 위해서다. 할 일 참 많지 않은가? 이러면서 영어도 잘 하고, 마케팅, 인사, 재무, 회계 그리고 전략도 알아야 한다. 경제와 법도 물론이다.

R과 MongoDB 연동 (Connecting R to MongoDB)

이미지
To help people who do not know Korean, I put short notes in English here and there. 이번 주부터 서울대에서 R 특강을 하고 있습니다. 학생분들의 열의도 대단하여 저도 가르칠 맛이 나네요! 쏴쏴! 수업 중에 R이 빅데이터를 다룰 때 적합하다고 소개하며 {rmongodb} 패키지를 추천했습니다. MongoDB MongoDB는 웹 프로그램을 위해 탄생했습니다. 읽고 쓰는 작업을 효율적으로 하고 확장도 좋게 하려고 말입니다. 데이터 정규화 등은 깨끗이 무시하고 서비스되는 방식대로 데이터를 넣고 빼는 방식을 취합니다. 관계형 데이터베이스에서 흔히 사용되던 SQL을 쓰지 않고 쿼리를 보내 흔히 NoSQL을 따른다고 합니다. 직관적이며 확장성이 높은 데이터베이스 스키마를 설계할 수 있어서 최근 아주 주목받는 데이터베이스 기술입니다. 또한 Map-Reduce라는 기술을 사용해서 대용량 데이터를 효율적으로 다룰 수도 있습니다. 많은 컴퓨터들을 네트워크로 묶거나 클라우드 서비스를 적극 활용해서 CPU와 저장공간의 한계를 손쉽게 뛰어넘습니다. 샤딩(Sharding)이라 불리는 분산 데이터베이스 기술을 사용하여 사용자가 편리하게 이런 작업들을 처리합니다. 2007년 10gen이라는 회사가 웹앱의 백엔드 기술로 개발했던 MongoDB는 2009년에 들어 첫 release를 시작했고 이제 2.0대 이상의 버전으로 발전했습니다. 하둡과 MongoDB를 흔히 비교하거나 같이 쓰기도 합니다만, 연구 목적으로 생각할 때 MongoDB만 있어도 충분합니다. MongoDB 기초 MongoDB를 설치하려면: www.mongodb.org 뒷 숫자가 .2로 끝나는 것이 stable 버전입니다. Windows 사용자는 .msi 설치판을 찾아 설치하시면 됩니다. 설치가 어렵지는 않습니다. 받을 파일 실행시키고 적당한 경로에 풀어주면 됩니다. 이제 path를 설정해서 MongoDB의 bin폴더를 시

Beautiful Website for Learning Econometric with Coffee

Econometric and Python (Lecture Site) Recommendation Also: Kalman Filter Example Kalman Filter (Wiki)

R Notebook, 클라우드 서비스 더 쉽고 간편하게

Domino Lab에서 R을 클라우드로 간편하게 쓸 수 있도록 서비스하고 있습니다. 16코어 120GB 램을 사용할 때 하루 계산하면 70달러 정도 소비됩니다. 방대한 네트워크 데이터를 분석하거나 텍스트 마이닝 목적으로 하드웨어 확장을 고려하고 있다면 Domino Lab 서비스를 대신 생각해 볼 수 있지 않을까요? Domino Lab 바로가기 Domino Lab의 R Notebook 소개

이준구 교수님, 정년 축하합니다.

이준구 교수님 기사 교수님께서 교단을 떠난다고 하니 시간이 지나도 참 빨리 지났습니다. 이준구 교수님의 미시경제는 쉽게 쓴 교과서가 인상적지만 정작 경제과학생과 수업을 듣고 시험을 칠 때 더럽게 불리한 과목이었던 것으로 생각합니다. 중간고사에서 패망한 이후 친구의 도움을 받아 다른 교수의 교과서와 강의노트로 공부한 뒤 기말고사 시험을 쳤던 기억이 있습니다. 어쨌거나 수업이 이준구 교수님의 핵심역량은 아니고 수업 중 카리스마와 속시원한 언변이 좋았습니다. 간혹 "헉..." 이러기도 했지만... 최근 정부의 경기부양정책이 "정책 완화" -> "소비심리" 이렇게 됩니다. 부동산 경기부양정책의 기본 논리는 집값이 오르면 "부자된 느낌"을 받아 지갑을 연다... 뭐 이렇습니다. 같은 논리라면 인플레가 되어 명목 수입이 올라도 지갑을 연다도 말이 되고, 보너스를 받아 목돈이 떨어져도 소비가 늘어야 하는데... 실상은 이렇습니다. 집값이 오르면 가계 대출 상환부담도 같이 올라갑니다. 봉급 생활자의 개인 가처분 소득은 더욱 더 줄어듭니다. 대출 없이 집을 사려고 해도 목표액이 올라가 자금을 축적해야 할 부담은 더 커집니다. 저축이자를 기대할 수 없는 상황이니 쌓아놓은 돈이 인플레 때문에 가치 하락만 안되도 다행일 듯합니다. 집을 가지고 있는 사람들은 어차피 상당한 중상층이라 일정 소비 수준을 유지합니다. 이들이 경기에 따라 소비 수준을 고무줄 늘이듯 바꾼다고 보이지 않습니다. 부자들이 돈을 더 풀어야 한다는 취지에서 시작된 느낌을 받는 현 정부의 경기부양책은 시중자금의 단기적 유통에 도움을 줄 것으로 기대합니다. 스폰지처럼 이러한 효과가 흡수될 여러 유인들이 존재하지만 잘 할 것이라 봅니다. 그러나 소비심리를 높이려 한다면 다른 정책들을 병행해야 합니다. 굳이 말하자면 이준구 교수님 말씀대로 기업이 돈을 풀도록 독려하는 일도방법일 수 있습니다. 적절한 투자처를 찾아주고 노동시장의

MySQL 연동하기

2015년 1월 9일, 드디어 {DBI} 기반의 MySQL connector 신판이 CRAN에 공개되었습니다. 그전에 문제가 좀 있어서 ODBC를 이용할 수밖에 없었는데 정말 잘 되었지요? > install.packages("RMySQL") > library(RMySQL) > library(rvest) > con <- dbConnect(MySQL(),username="root",password="*****",host="127.0.0.1",port=3306,dbname="venture_capital") > con %>% dbGetQuery("SELECT COUNT(*) FROM venture_investment")   COUNT(*) 1     8383 > a<-con %>% dbGetQuery("SELECT * FROM venture_investment LIMIT 10") 결과를 보면 간혹 한글이 깨져보일 수 있습니다. DB가 UTF-8이지만, Locale 설정이 CP949로 되어 있다면 당연히 문제가 됩니다. 이럴땐 iconv() > a[[1]] <- iconv(as.character(a[[1]]),from='UTF-8') > a        name_company supported_comp amount_money year_stamp month_stamp 1  교원나라벤처투자              1   6000000000       2008           5 2      그린기술투자              0            0       2008           5 3        네오플럭스              1   2002000000       2008           5 4    넥스트

do.call()? {dplyr}의 rbind_list(), rbind_all()을 쓰세요

data.frame 객체가 여러개 있다면? 보통 리스트로 묶여 있는 경우에 do.call() 함수와 rbind() 함수를 써서 합쳐 줍니다. a <- data.frame(x = 1:1000000) b <- data.frame(x = 1:1000000) 이렇게 ,a, b 두 개가 100만개씩 있고, 이 둘을 합치려면 test.bind1 <- function(a,b) {   x <- list(a,b)   do.call(rbind,x) } > system.time(test.bind1(a,b))  사용자  시스템 elapsed    0.68    0.00    0.69 0.69 초 정도 걸립니다. 같은 일을 > library(dplyr) test.bind2 <- function(a,b) {   rbind_list(a,b) } 해서 > system.time(test.bind2(a,b))  사용자  시스템 elapsed    0.01    0.00    0.01 0.01초가 걸립니다. 뭐 70배 정도 빨리 합쳤습니다... mclapply()를 써서 데이터가 리스트로 반환된 경우에는(반환값을 data라 할 때) > output <- rbind_all(data) 반환된 값은 data.frame 객체입니다.

{plyr}은 가라! {dplyr}이 왔다!

dplyr package release: "Fast and easy data munging, with dplyr" Join and set operations come to dplyr {dplyr} 패키지 후속편이 등장했습니다. 편리함 때문에 {plyr} 패키지에 밀렸던 기억이 나는데 속도를 바짝 올리고 %.% 오퍼레이터를 새로 도입해서 편의성을 높였습니다. 아마 R의 aggregate()를 분석 과정에서 채택하는 경우는 드물텐데요... data.frame 객체에서 group별로 집합함수를 적용할 때가 많습니다. 코딩도 복잡하고 속도도 느려서 R의 {stat} 패키지의 기본 함수는 잘 쓰이지 않습니다. 예를 들어, > install.packages("Lahman") # Sean Lahman's Baseball Database > require(Lahman) 야구 데이터를 불러서... > head(Batting[,c("playerID","R")]) # 선수별 도루 결과는    playerID R 1 aardsda01 0 2 aardsda01 0 3 aardsda01 0 4 aardsda01 0 5 aardsda01 0 6 aardsda01 0 이제 선수별 도루 합계를 구하고 크기 순서대로 정렬하려면 다음과 같이 합니다. test.stats <- function(data) {   totals <- aggregate(. ~ playerID, data=data[,c("playerID","R")], sum)   ranks <- sort.list(-totals$R)   totals[ranks[1:5],] } 함수를 만들었으니 시간을 재 봅시다. i7 프로세서에서 싱글코어로 계산할 때... > system.time(test.stats(Batting))  사

웹 API를 R데이터로 받기

개요 웹 API로 접근 가능한 데이터는 JSON 형식으로 주는 경우가 많다. 물론 HTML이나 XML도 참 많이 있지만... 예를 들어 위키피디아의 Media Wiki API는 반환값으로 JSON을 쓸 수 있다. RCurl로 데이터 받기 url = "http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content" 우선 url에서 JSON 데이터를 가져오려면 HTTP 콜로 URI 데이터를 다운로드 해야 한다. 따라서 {RCurl} package를 쓰자. > library(RCurl) >page = getURL(url) SSL 때문에 문제가 있다면 옵션을 추가하자. > page = getURL(url,.opts=list(ssl.verifypeer=FALSE,ssl.verifyhost=FALSE)) timeout 문제 때문에 문제가 있다고 예상되면 timeout 옵션을 추가해야 한다. > page = getURLContent(url,.opts=list(ssl.verifypeer=FALSE,ssl.verifyhost=FALSE,timeout=90)) timeout은 초 단위다. 자세한 내용은 RCurl이나 Curl을 참고하기를 바란다. RJSONIO JSON을 컨트롤 하는 패키지는 {RJSONIO}이다. 말 그대로 R JSON Input/Output의 줄임말. >library(RJSONIO) 이제 준비는 다 끝났다. 페이지를 받아서 >json_page = fromJSON(page) JSON으로 파싱했다. 파싱된 결과는 R의 list 타입데이터로 변환된다. 따라서 데이터를 가져오기 위해 복잡한 프로그래밍 과정을 거칠 필요가 전혀 없이 list를 다루 듯 쉽게 사용할 수 있다. >

웹데이터 스크래핑

나는 주로 python과 beautifulsoup을 써서 웹데이터를 가져온다. 때에 따라서(간단한 것들) R을 직접 사용하는 것이 더 편리하고 좋다. install.packages("rvest") library(rvest) lego_movie <- html("http://www.imdb.com/title/tt1490017/") lego_movie %>% html_node("strong span") %>% html_text() %>% as.numeric() lego_movie %>% html_nodes("#titleCast .itemprop span") %>% html_text() lego_movie %>% html_nodes("table") %>% .[[3]] %>% html_table() # 3번째 table # XPath를 쓰려면... # html_nodes(doc, xpath = "//table//td")). # html_tag(), html_text(), html_attr(), html_attrs() # guess_encoding(), repair_encoding() # html_session(), jump_to(), follow_link(), back(), forward() # html_form(), set_values(), submit_form() # demo(package="rvest") html() 함수는 웹데이터를 html로 불러온다. 그리고 이를 lego_movie 페이지에 저장한 다음, 이를 인수로 받아 (%>%) 정보를 뽑아낸다. html_node()와 html_nodes()는 노드를 뽑는다. 기본은 CSS Style이지만 xpath= 옵션으로 xpath 문법도 쓸 수 있다. 일단 html_text()로 데이터를 텍스트화하

data.frame을 factor별로, 함수 적용해서 요약하기

데이터 프레임에 여러 요인들이 있고, 이들 요인들을 묶어서 몇몇 함수로 정리하고 싶다면? R의 패키지 중에 정말 훌륭한 plyr 패키지가 있다! > library(plyr) > dfx <- data.frame(   group = c(rep('A', 8), rep('B', 15), rep('C', 6)),   sex = sample(c("M", "F"), size = 29, replace = TRUE),   age = runif(n = 29, min = 18, max = 54) ) 데이터는 다음과 같다. > dfx    group sex      age 1      A   M        19.61212 2      A   M        26.71510 3      A   M        42.92592 4      A   F         49.54369 5      A   M        44.80178 6      A   M        18.67451 7      A   M        25.66132 group와 sex별로 그룹을 만들어서, age의 평균과 분산을 가진 새로운 data.frame 객체를 만들자. > dfx.summarized<-ddply(dfx, .(group, sex), summarize,       mean = round(mean(age), 2),       sd = round(sd(age), 2) 결과는 > dfx.summarized   group sex  mean    sd 1     A   F    40.89    12.25 2     A   M    29.73   11.42 3     B   F    34.93    7.84 4     B   M    34.05   12.04 5

땅콩 회항

2014년 12월, 대한항공의 조현아 부사장이 대한항공의 이륙을 중단시키고 사무장을 하차 시킨 사건을 우리는 "땅콩 회항"이라고 부릅니다. 이 사건은 "갑의 횡포"를 보여준 대표적인 사례로 언급됩니다. 조현아 부사장과 대한항공 몇몇 임원들의 불합리하고 부적절한 대처로 국민적인 분노를 일으켰고 대한항공의 기업가치에 큰 손실을 낳았습니다. 또한 국민들은 여러 차례 정당한 사죄를 하지 않은 그들의 행위에 실망감과 함께 대기업(혹은 재벌)의 횡포, 갑질에 대한 실망을 감추지 않습니다. 이 사건으로 기업들이 직원들을 관리하려는 태도가 더욱 더 강해질 것이라는 의견이 있습니다. 왜냐하면 사건의 전말이 직원들의 고발로 드러났기 때문입니다. "제보"라는 형식으로 기업에 불리한 사실들이 외부로 술술 흘러나갔습니다. 조직에 해를 미치는 나쁜 해위라고 인식할 근거를 제공합니다. 공정함을 잃어버린 조직은 깊은 병을 앓게 됩니다.나쁜 일, 잘못된 일을 정당하게 고쳐주지 않으면 사람들은 질문에 빠집니다. "왜 나는 이런 곳에 왔나?" 마음에 병이 들어 일도 하기 싫고 주변 사람도 믿을 수 없습니다. 하물려 위험과 책임이 도사리고 있는 경영 현장에 깊이 몸담고 싶지 않습니다. 이런 사람들을 회유하는 한가지, 그리고 유일한 방법은 "어쩔 수 없다"라는 인상을 공공연히 보여주기뿐. 참으로 한심하고 불쌍한 현장이나 경영층은 이러한 문제를 심각하게 받아들이지 못합니다. 측근은 충분한 보상을 얻고 제2, 제3의 지배자 노릇을 할 수 있을 정도로 조직의 경화가 심해집니다. 대한항공은 조현아 부사장의 땅콩회항을 계기로 조직문화를 근본적으로 혁신해야 합니다. 그 방법은 (1) 내부 조직원의 고발 행위에 대한 선처벌 후조사 문화를 정립하고, (2) 가해자를 고하에 막론하지 않고 축출하며, (3) 의견수렴에 보다 더 민주적인(즉 1일이 보다 더 많은 의견 개진 권한을 갖는) 시스템을 갖추는 일입니다.

큰 CSV 파일을 R로 빠르게 읽기

대용량의 CSV 파일을 좀 더 빠르게 읽는 방법? 1억 줄 정도에 컬럼이 5~6개 정도면 어마어마한 용량이 된다. csvread 패키지를 쓰면 좋은데.. > install.packages("csvread") > library("csvread") 파일을 test.csv라고 하고,컬럼은 다음과 같다고 하자. 컬럼 1: string 컬럼 2: integer 컬럼 3: double 컬럼 4: long 컬럼 5: double > df.raw <- csvread("test.csv",coltypes=c("string","integer","double","long","double",header=TRUE) 파라미터로 nrows=10000 이렇게 주면 상위 10000 줄만 읽는다.

Text mining + Tag Cloud를 R로 그리기

이미지
문서를 입력받아(영어 ㅋㅋ) tm패키지와 wordcloud 패키지를 이용해서 그림을 그려보자. install.packages("wordcloud") install.packages("tm") install.packages("SnowballC") install.packages("Rcpp") require(tm) require(wordcloud) require(SnowballC) require(RColorBrewer) require(Rcpp) #구버전의 Rcpp가 설치되어 있다면 install.packages("Rcpp")로 update해야 한다. draw_cloudtag <- function(corpus,remove_words=NULL) {   lords.map <- tm_map(corpus,stripWhitespace)   lords.map <- tm_map(lords.map,tolower)   lords.map <- tm_map(lords.map,removeWords,stopwords("english"))   #영어(english)에서 사용되는 stopwors를 반환하여 removeWords에 대입   if(!is.null(remove_words)) {     lords.map <- tm_map(lords.map,removeWords,remove_words)   }   windows()   wordcloud(lords.map, scale=c(5,0.5),             max.words=100,             random.order=FALSE,             rot.per=0.35,             use.r.layout=FALSE,             colors=brewer.pal(8, "Dark2")) } #data가 있는 directory를 입력한다.이 디렉토리에는 파일

시계열 데이터에서 특이점 마이닝하기

이미지
  Anomaly Detection 원본 Reference Vallis, O., Hochenbaum, J. and Kejariwal, A., (2014) "A Novel Technique for Long-Term Anomaly Detection in the Cloud", 6th USENIX, Philadelphia, PA. Twitter Team이 계절적 변동이 예견되는 가운데 무엇인가 특이한 지점을 여러 개(!) 지정하여 찾아내는 새로운 데이터마이닝 알고리즘을 제안했다. 먼저 Rtools를 설치한다.AnomalyDetection이 아직 CRAN에 등록되지 않아서 귀찮지만 build를 해야 한다. Rtools 설치 링크 load_package <- function() {   if (! require("RJSONIO")) {     install.packages("RJSONIO")     require("RJSONIO")   }   if (! require("RCurl")) {     install.packages("RCurl")     require("RCurl")   }   if (! require("devtools")) {     install.packages("devtools")     require("devtools")   }   devtools::install_github("twitter/AnomalyDetection") #GitHub로부터 바로 인스톨   library(AnomalyDetection) } load_package() # 아마 이것은 없을 듯하여.. page <- "USA" raw_data <- getURL(paste("http://stats.grok.se/json/en/latest

서울대 R 방학 특강 자료

R 특강 _ 001 R 특강 _ 002   R 특강 _ 003   R 특강 _ 004 R 특강 _ 005 R 특강 _ 006