내용이 정말 공대생스러운 점 미리 사과드립니다.
<h1>R로 코인 가격예측 모델 만들기 <p dir="auto">이번에는 코드통계로 분석하는 간단한 회귀분석으로 시작하는 모델을 만들어본다.<br /> 데이터분석을 통한 주가 시세예측 프로그램이야 시중에도 서적들이 많이 출간되었는데,<br /> 만약 가상화폐의 기본적인 내재가치가 마케팅적인 측면, 사업적인 측면이 아닌 (대다수이겠지만) 결국 코드베이스로 작동한다면, 코드가 얼마나 해당 가상화폐의 시세에 기여하는지를 살펴보고 이를 통해 적당한 시세를 제시해볼수도 있고 생각보다 다른것보다 저평가되거나 고평가된 코인들을 찾아볼수있지 않을까 싶다. 물론 헛생각일수 있다. <p dir="auto">글의 목적은 하나 더있는데, 실제로 듬성듬성한 데이터를 가지고 전처리를 어떻게 할것인지 탐구해보기 위해서다. <h2>무엇이 가격에 영향을 주는가? <p dir="auto">사실 인기는 별로 없지만, 그래도 노가다를 해서 만든 코인 개발 통계를 아래와 같이 참고하면, <blockquote> <p dir="auto">투자할때 꼭 먼저 체크해야하는 각종 코인 개발 내역<br /><span> <a href="https://steemit.com/coinkorea/@gillime/50" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://steemit.com/coinkorea/@gillime/50 <p dir="auto">데이터를 참고했다. 사실 별로 예뻐보이지 않아 인기있는 글은 아니다. <p dir="auto">다시 말해보자면 개발과 관련해서 얻을수 있는 정보로는 <ul> <li>커밋횟수 <li>Star갯수 <li>코드기여자 <li>참조횟수 <li>사용언어 <li>시가총액 <p dir="auto">이 된다. 사실 정확히 하려면, 내부알고리즘까지 뜯어보고 이에대한 점수를 매겨야 하는데, 이를 하나하나 들여다보고 비교해볼수없으니 어쩔수 없이 많이 개발이 되었으면 좋은 코드라고 가정할수 있지않을까? 라고 혼자 찐따같이 되내겨 보며 <p dir="auto">직접 한땀한땀 불금을 바쳐 만든 데이터를 표로 한번 긁어와본다. <div class="table-responsive"><table> <thead> <tr><th>코인이룸<th>원천<th>커밋횟수<th>Star 갯수<th>코드기여자<th>참조횟수<th>사용언어<th>시총 <tbody> <tr><td>비트코인<td><td>15,804<td>24,011<td>459<td>13,869<td>C++<td>2763 <tr><td>리플<td><td>11,560<td>2,075<td>57<td>575<td>C++<td>1245 <tr><td>이더리움<td><td>9,196<td>11,009<td>211<td>3,366<td>C++<td>993 <tr><td>비트코인 캐시<td>N, 비트코인<td><td>400<td><td><td>C++<td>425 <tr><td>에이다<td><td>12,714<td>1,305<td>50<td>174<td>Haskell<td>272 <tr><td>뉴이코노미무브먼트<td><td>571<td>179<td>4<td>51<td>Java<td>147 <tr><td>트론<td><td>165<td>372<td>12<td>75<td>Java<td>147 <tr><td>라이트코인<td>N, 비트코인<td>69<td>2,512<td><td>100<td>C++<td>137 <tr><td>스텔라<td><td>3,772<td>863<td>36<td>233<td>C++<td>127 <tr><td>아이오타<td><td>1,361<td>664<td>20<td>192<td>C++<td>110 <tr><td>대시<td>N, 비트코인<td><td>813<td><td><td>C++<td>97 <tr><td>네오<td><td>347<td>1,426<td>17<td>446<td>C#<td>65 <tr><td>이오스<td><td>1,944<td>2,656<td>53<td>544<td>WebAssembly<td>63 <tr><td>모네로<td><td>5,297<td>2,108<td>135<td>872<td>C++<td>62 <tr><td>비트코인골드<td>N, 비트코인<td><td>475<td><td>243<td>C++<td>49 <tr><td>퀀텀<td>N, 비트코인<td><td>562<td><td>111<td>C++<td>49 <tr><td>라이블록스<td><td>2,387<td>981<td>17<td>189<td>C++<td>47 <tr><td>이더리움클래식<td>N, 이더리움<td>4,697<td>1,647<td>32<td>224<td>JavaScript<td>37 <tr><td>아이콘<td><td>43<td>88<td>8<td>32<td>Python<td>28 <tr><td>비트커넥트<td>N, 비트코인<td>30<td>90<td>1<td>102<td>C++<td>25 <tr><td>버지<td>N, 비트코인<td>882<td>1,008<td>35<td>283<td>C<td>24 <tr><td>비트쉐어<td><td>1,827<td>533<td>34<td>359<td>C++<td>20 <tr><td>오미세고<td><td>243<td>80<td>7<td>24<td>Go<td>20 <tr><td>아더<td>N, NXT<td>조사필요<td>조사필요<td>조사필요<td>조사필요<td>Java<td>19 <tr><td>스테이터스<td><td>2,079<td>1,714<td>102<td>411<td>Clojure<td>19 <tr><td>제트캐시<td>N, 비트코인<td><td>3,263<td><td>895<td>C++<td>18 <tr><td>바이트코인<td><td>88<td>305<td>5<td>조사필요<td>C++<td>18 <tr><td>시아코인<td><td>8,220<td>2,058<td>43<td>277<td>Go<td>16 <tr><td>스팀<td><td>2,165<td>812<td>34<td>337<td>C++<td>16 <tr><td>포퓰러스<td><td>2<td>8<td>1<td>5<td>Solidity<td>16 <tr><td>스트라티스<td><td>1,427<td>289<td>33<td>124<td>C#<td>15 <tr><td>웨이브<td><td>6,297<td>366<td>30<td>120<td>Scala<td>13 <tr><td>바이낸스코인<td>X<td><td><td><td><td><td>13 <tr><td>도지코인<td>N, 비트코인<td><td>1,591<td><td>663<td>C++<td>12 <tr><td>디지바이트<td>N, 비트코인<td><td>167<td><td>73<td>C++<td>11 <tr><td>VeChain<td>X<td><td><td><td><td><td>11 <tr><td>코모도<td>N, ZCASH<td><td>47<td><td><td>C++<td>10 <tr><td>XPCoin<td>N, 비트코인<td>55<td>43<td>5<td>19<td>C++<td>10 <tr><td>Hshare<td>N, 비트코인<td>17<td>86<td>1<td>24<td>C++<td>10 <tr><td>덴트<td>X<td><td><td><td><td><td>9 <tr><td>골렘<td><td>4,857<td>1,986<td>25<td>192<td>Python<td>8 <tr><td>어거<td><td>4,045<td>314<td>22<td>65<td>TypeScript<td>8 <tr><td>드래곤체인<td><td>243<td>439<td>11<td>102<td>Python<td>8 <tr><td>베리타시움<td>N, 비트코인J<td>38<td>4<td>1<td>8<td>JavaScript<td>8 <tr><td>디크리드<td>N, 비트코인Go<td><td>237<td><td><td>Go<td>7 <tr><td>아크<td><td>937<td>155<td>33<td>99<td>Javascript<td>7 <tr><td>에쏘스<td>X<td><td><td><td><td><td>7 <tr><td>펀페어<td>X<td><td><td><td><td><td>7 <tr><td>레드코인<td>N, 라이트코인<td><td>213<td><td><td>C++<td>6 <tr><td>PIVX<td>N, 비트코인<td><td>182<td><td><td>C++<td>6 <tr><td>팩텀<td><td>9,492<td>106<td>52<td>29<td>Go<td>6 <tr><td>솔트<td>X<td><td><td><td><td><td>6 <tr><td>베이직 어텐션<td>X<td><td><td><td><td><td>6 <tr><td>KuCoin Shares<td>X<td><td><td><td><td><td>6 <tr><td>쿼시<td>X<td><td><td><td><td><td>6 <tr><td>Nxt<td><td>조사필요<td>조사필요<td>조사필요<td>조사필요<td>Java<td>5 <tr><td>모나코인<td>N, 라이트코인<td><td>187<td><td><td>C++<td>5 <tr><td>일렉트로니움<td>N, 모네로<td><td>159<td><td><td>C++<td>5 <tr><td>비트코인다크<td>N, 비트코인<td><td>17<td>9<td>22<td>C<td>5 <tr><td>0x<td><td>2,499<td>243<td>11<td>42<td>TypeScript<td>5 <tr><td>바이트볼<td><td>904<td>79<td>10<td>43<td>Javascript<td>5 <tr><td>넥서스<td><td>255<td>55<td>14<td>38<td>C++<td>5 <tr><td>리퀘스트 네트워크<td><td>115<td>98<td>2<td>6<td>TypeScript<td>5 <tr><td>파워레저<td>X<td><td><td><td><td><td>5 <tr><td>아이온<td>X<td><td><td><td><td><td>5 <tr><td>텐엑스<td>X<td><td><td><td><td><td>5 <tr><td>버트코인<td>N, 비트코인<td><td>236<td><td><td>C++<td>3 <tr><td>스토리지<td><td>380<td>227<td>26<td>68<td>JavaScript<td>3 <tr><td>비트베이<td>X<td><td><td><td><td><td>3 <tr><td>아인슈타니움<td>N, 라이트코인<td><td>30<td><td><td>C++<td>2 <tr><td>리피오크레딧네트워크<td><td>27<td>10<td>3<td>6<td>Solidity<td>2 <tr><td>모나코인<td>X<td><td><td><td><td><td>2 <tr><td>싱귤러DTV<td>X<td><td><td><td><td><td>2 <tr><td>그로스톨코인<td>N, 비트코인<td><td>9<td><td><td>C++<td>1 <tr><td>머큐리<td><td>7<td>2<td>1<td>0<td>HTML???<td>1 <tr><td>코파운드잇<td>X<td><td><td><td><td><td>1 <tr><td>복셀<td>X<td><td><td><td><td><td>1 <p dir="auto">정말 간단하게 위의 표에있는 몇가지 요소들이 가격에 영향을 미친다고 생각해볼수있다. <p dir="auto">일단 무작정 R을 설치해본다. <h2>R 설치 <h3>왜 R을 썼는가? <p dir="auto"><del>그냥 <p dir="auto">간단한 회귀분석은 당연히 엑셀을 쓰면 그래프와 함께 클릭질 몇번이면 끝난다. 대부분 골머리를 썩게되는 전처리 과정도 사실 엑셀로 하면 쉽다. 그렇지만 엑셀의 단점은 기계학습의 종류인 분류, 군집화, 신경망등을 쉽게 쉽게 쓸수는 없는 단점은 있다. 물론 사실 엑셀도 굳이 플러그인을 깔면 되긴한다. <del>하지만 코딩을 통한 짜릿함은 기분이 좋다. <blockquote> <p dir="auto"><br /><span>R프로그램 다운로드 <a href="http://cran.nexr.com/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">http://cran.nexr.com/<span> R studio 다운로드 <a href="https://www.rstudio.com/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://www.rstudio.com/ <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111146.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111146.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_111146.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111225.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111225.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_111225.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111432.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_111432.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_111432.png 2x" /> <p dir="auto">분석을 하려고 지금까지 유난을 떨었다. 그냥 다 잊으면 된다. <p dir="auto">이제, R이 해당하는 저 파일을 열려면 excel파일 혹은 CSV로 변환된 파일을 열어야 한다. 현재 경로를 확인한다. <h4>경로 확인 <p dir="auto"><code>> getwd()<br /> <code>"C:/Users/username/Documents" <p dir="auto">위의 테이블파일을 복사해서 엑셀에서 csv로 저장하는 편이 제일 나을것이다.<br /> 경로를 알아내고 난 다음에는, 위 경로에다가 저장해놓으면 된다. <p dir="auto"><code>> data <- read.csv("data.csv")<br /> <code>> str(data)<br /> data.frame': 77 obs. of 9 variables:<br /> X : Factor w/ 76 levels "0x","Hshare",..: 39 23 62 40 59 12 72 20 45 52 ...<br /> 원천 : Factor w/ 10 levels "","N, NXT","N, ZCASH",..: 1 1 1 6 1 1 1 6 1 1 ...<br /> 커밋횟수 : Factor w/ 42 levels "","1,361 ","1,427 ",..: 9 6 38 1 8 31 10 33 20 2 ...<br /> Star.갯수 : Factor w/ 60 levels "","1,008 ","1,305 ",..: 29 21 11 39 3 16 37 23 54 47 ...<br /> 코드기여자: Factor w/ 34 levels "","1 ","10 ",..: 25 30 12 1 27 23 6 1 22 11 ...<br /> 참조횟수 : Factor w/ 44 levels "","0 ","100 ",..: 8 33 21 1 9 31 39 3 15 12 ...<br /> 사용 : Factor w/ 16 levels "","C","C#","C++",..: 4 4 4 4 7 9 9 4 4 4 ...<br /> 특이점 : Factor w/ 17 levels "",".","?","??",..: 1 1 1 1 1 1 1 1 1 1 ...<br /> 시총 : int 2763 1245 993 425 272 147 147 137 127 110 ... <p dir="auto">불러온 데이터의 구조다. 머리가 굉장이 아프다. <h3>Star와 시총 상관관계 내보기 <p dir="auto">몸풀기로 star갯수로 한번 찾아본다. <p dir="auto">해당하는 star갯수를 가져와서<br /> <code>> data_star <- data[c('코인이름', 'Star.갯수', '시총')]<br /> <code>> colnames(data_star) <- c("name", "star", 'cap') <p dir="auto">이를 숫자로 변환하고<br /> <code>> data_star[,2] <- as.integer(gsub(",","",data_star[,2])) <p dir="auto">의미없는 숫자 제거.<br /> <code>> data_star <- data_star[complete.cases(data_star),] <p dir="auto">내림차순으로 정렬해서<br /> <code>> sorted_data_star <- data_star[order(-data_star$star),] <p dir="auto">최종 결과를 쉽게(?) 뽑아낼수 있다. <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_155051.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_155051.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_155051.png 2x" /> <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_155504.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_155504.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_155504.png 2x" /> <p dir="auto">머릿속에는 왜 엑셀을 쓰지 이딴 R을 쓰는가에 대한 생각이 지나가고 있을것이다. 하지만 그렇다고 해서 우리는 간지를 포기할수는 없다. 회사에서 일을 하다가 R을 돌리면 지나가는 부장님이 한마디 하면서 '오 절믄사람이 업무 혁신을 하네?' 할것이고 엑셀을 돌리면 그냥 엑셀노가다를 하고있구나, 라고 생각할것이다. 다만 프로그래머가 쓰고있으면 코딩은 안하고 나댄다고 생각할수도 있을 것같다. <h3>그래프 그려주기 <p dir="auto">이를 star와 시총의 관계를 보여주는 그래프로 보여줄 수 있다. ggplot2를 이용해본다.<br /> 왜냐구? 제일 예쁘다고 하니까. <p dir="auto"><code>> library(ggplot2)<br /> <code>> ggplot(data = sorted_data_star, aes(x = star, y = cap)) + geom_point(aes(size=3,colour=sorted_data_star$name)) + geom_text(label=sorted_data_star$name) + geom_smooth() <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_162726.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_162726.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_162726.png 2x" /> <p dir="auto">으아니! 비트코인, 리플, 이더리움 삼대장들이 영향력이 너무 크다. 잡(?) 코인들이 댕췌 보이지가 않는다. 일단 상관계수를 한번 내본다. <p dir="auto"><code>> cor(sorted_data_star$star, sorted_data_star$cap)<br /> <code>0.9078217 <p dir="auto">-1과 1사이에 상관계수는 항상 위치하는데, 1에 가까울수록 정말 강한 상관관계를 가지고 있는것이다. 그렇다고 해서 별을 많이 받으면 과연 가격이 높아지나? 아니다. 가격높은 코인을 보고 도대체 소스는 으뜨케 만들었어? 하고 찾아온 킬리만자로 표범들이 많다는 설명이 더 타당성있게 일단은 들린다. 또한, 데이터는 비트코인이나 이더리움의 영향을 너무 많이 받고있다. <p dir="auto">조금은 식상한 비트코인, 리플, 이더리움은 아웃라이어로 취급해버리고 시총이 50조 이하의 관심을 못(?)받는 우리 조그마한 코인들에게 좀더 관심을 쏟아보자. <p dir="auto">아 참고로 예전부터 열심히 우리 부모님들이 땀흘려 이룬 우리나라의 성장을 이끈 기업중 하나인 현대자동차(한국 시총3위)는 시총이 39조고, 우지한이 코를 파다 '에잇 수틀렸는데? 복사 붙여넣기나 해볼까?' 하고 만든 비트코인캐시의 시총은 42조(코인 시총 4위)다. 무슨세상에 살고있는건지 잘 모르겠지만 어쨌든 계속 한다. <p dir="auto">이제, 상위 세개를 빼고 다시한번 그래프를 그려본다. <pre><code>s2 <- sorted_data_star[-c(1,2,7)] ggplot(data = s2, aes(x = star, y = cap)) + geom_point(aes(size=3,colour=s2$name)) + geom_text(label=s2$name) +geom_smooth() <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_214441.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_214441.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_214441.png 2x" /> <p dir="auto">아니 이게 뭐시당가.. 별로 생각하던대로 나오진 않았다.<br /> 그도그런게, 깃허브 스타를 몇개를 받았는지와 시총이 큰 상관관계를 가질거라는 예상과는 다르게 별로 의미는 없어보이긴한다. 상관관계는 다음과 같다 <pre><code>> cor(s2$star, s2$cap) 0.1925724 <p dir="auto">상관이 없다. <p dir="auto">시가총액 10조이하, 별이 천개 이하인 데이터만 구해보면 어떨까? <pre><code>> s3 <- sorted_data_star[sorted_data_star$cap < 100 & sorted_data_star$star < 1000,] > cor(s3$star, s3$cap) 0.6813768 <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_220346.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_220346.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_220346.png 2x" /> <p dir="auto">이번에는 보조선을 곡선이 아닌 직선으로 놔뒀다. 은근히 되긴 되는데 마음속 깊이 찝찝함은 잊을수가 없다. 그래도 간단한 의미는 도출해볼수 있다. 뭐 어디 학회 나가서 말할만한 내용은 아니지만, 대충 무게감있는 알트코인의 경우 스타가 많을수록 시총과 어느정도는 상관관계가 있을수도 있다는 것이며, 직선아래에 있는 놈들은 개발자들이 표한 관심보다는 덜 시장가가 형성되어있고, 위에 위치한 놈들은 개발자의 애정보다도 시장가가 높게 형성된 놈이라는 결론이 나긴 나온다. <h3>여러변수를 고려하기 위한 전처리 <p dir="auto">앞서 말했듯이, 구할수 있는 변수에는 몇가지가 있다. 지금까지는 스타라는 항목 하나만을 가지고 뭔가 열심히 그림을 색칠해 보았는데, 스타 수 말고도 <ul> <li>커밋횟수가 얼마나 되는지, <li>얼마나 컨트리뷰터들이 있는지, <li>그리고 얼마나 reference가 많이 된 코드인지 등이 있다. <p dir="auto">어떻게 보면 구글의 페이지 랭크와 비슷하다. 제일 많이 참조된 소스가 좋은 소스일수 있다는것. 물론 리플이 구글보다 훨씬 위대해서 그런지 어쩐지는 모르겠지만, 래리페이지와 세르게이는 리플 창시자보다 재산순위가 낮다. <p dir="auto">이제는 여러 변수를 한번 고려해보자. <p dir="auto">일단 처음 데이터셋인 data를 다시 꺼내들을 때가 왔다. 방망이 깎는 노인처럼 정성스레 한번 깎아보자. 변수명은 요즘에는 아무거나 빅데이터라고 가져다 붙이는게 유행이니 bigdata라고 해본다. <pre><code>convertNum <- function(i) { bigdata[,i] <- as.integer(gsub(",","",bigdata[,i])) } convertNum(3); convertNum(4); convertNum(5); convertNum(6); <p dir="auto">멋진 코딩을 위해 function을 선언했다. 하지만 루프문을 만드는 노력따위는 하지않는다. 사실 불러올때 숫자에 쉼표가 있는 스트링이라 일단 주먹구구식으로 했다. <p dir="auto">이제 당당하게 str함수를 불러보면 제대로 type변환이 이루어져있다. <pre><code>str(bigdata); $ 코인이름 : Factor w/ 76 levels "0x","Hshare",..: 39 23 62 40 59 12 72 20 45 52 ... $ 원천 : Factor w/ 10 levels "","N, NXT","N, ZCASH",..: 1 1 1 6 1 1 1 6 1 1 ... $ 커밋횟수 : int 15804 11560 9196 NA 12714 571 165 69 3772 1361 ... $ Star.갯수 : int 24011 2075 11009 400 1305 179 372 2512 863 664 ... $ 코드기여자: int 459 57 211 NA 50 4 12 NA 36 20 ... $ 참조횟수 : int 13869 575 3366 NA 174 51 75 100 233 192 ... $ 사용 : Factor w/ 16 levels "","C","C#","C++",..: 4 4 4 4 7 9 9 4 4 4 ... $ 특이점 : Factor w/ 17 levels "",".","?","??",..: 1 1 1 1 1 1 1 1 1 1 ... $ 시총 : int 2763 1245 993 425 272 147 147 137 127 110 ... <p dir="auto">이제 하나만 하면 준비가 된다. NA를 없애야 하는것이다. 실제로 이 데이터에는 필요없는 데이터인 소스코드가 없는 코인, 그리고 너무나도 명백한 포크코인들이 있다. 이 포크코인들은 star만을 유추했기 때문에 위의 그래프에서는 보일지 몰라도 이번에는 제거해 버릴것이다. 코딩덕후는 코드를 만들지 않았으면 경외심이 사라진다. <pre><code>bigdata <- bigdata[complete.cases(bigdata),] <p dir="auto">구체적인 숫자는 말하고싶지 않지만 많은 양의 소스코드가 없던 코인들이 내 월급마냥 공허속으로 사라져버렸다. 하지만 N이 30은 넘으니 그럭저럭 있다고 치고 계속 해본다. <p dir="auto">자 여기서는 기본적인 선형회귀식을 한번 돌려본다. <p dir="auto">여기서 이용할만한 변수는 위에서도 언급된, <p dir="auto">(독립변수) <ul> <li>커밋횟수 <li>Star.갯수 <li>코드기여자수 <li>참조횟수 <p dir="auto">(종속변수) <ul> <li>시가총액 <p dir="auto">이다. 저 네개의 독립변수의 움직임을 통해 시가총액을 예측하는 모델을 만들어보는것이 목적이다. <pre><code>model <- lm(시총 ~ 커밋횟수 + Star.갯수 + 코드기여자 + 참조횟수, data = bigdata) summary(model) <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_223042.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_223042.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_223042.png 2x" /> <h4>잔차 통계량 <p dir="auto">Residuals 로 확인할수 있는데, Max와 Min을 통해 극단적인 이상치들이 있음을 확인할수는 있다. 일단 뭔가 수상한점이 있는데 넘어간다. <h4>계수 <p dir="auto">커밋횟수와 참조횟수의 p-value 가 0.05로 낮은 편이다. 이보다 큰값인 스타갯수와 코드기여자는 별로 상관이 없을수도 있다는 생각도 있다. <h4>잔차의 표준오차 <p dir="auto">작아야 하는데 크다. 일단 못본척 눈을 질끈 감고 넘어간다. <h4>결정계수 <p dir="auto">모델로 설명이 되지않는 변동량을 알수 있는데, 여기서 adjusted r-squared 는 모델에 있는 변수도 고려해주기 때문에 0.8817을 일단 믿어보도록 한다. 결정계수가 1이라면 모델이 모든 현상을 설명할수 있다는 소리이다. 0.8817은 사실은 비트코인과 이더리움때문에 높게 나오고있는데, 일단 높으면 설명력이 높다고 할수있다. <h4>F통계량 <p dir="auto">p-value가 굉장히 낮은것을 확인할수 있다. 일단 사실은 아웃라이어 (비트, 이더)가 영향을 너무나 많이 미치기 때문에 모델의 설명력이 높다고 나오긴 하는데 일단 여기서는 넘어간다. <h2>실제 코인의 적정 시총 예측해보기 <p dir="auto">절대 완벽한 모델은 아니다. 직접 캡처하지는 않았지만, 잔차라는 무시무시한 놈이 찝찝함을 한가득 가져다주기 때문이다. <p dir="auto">하지만 어쨌든 위의 모델에서 나오는 모델을 가지고 실제로 해당하는 소스의 통계치를 가지고 예측을 해볼수 있다. 사실, 위의 표를 만드는데 이상했던점이 대부분의 코인은 일하는지 어쩌는지도 잘 모르겠고 마케팅에만 혈안이 되어있고 시총만 뻥튀기 하는데 급급한데 어떤 코인은 뭔가 시총이 높지도 않은데 열일하는 코인이 있기는 했다는것이다. 아 물론 싸다는것은 아니다. F로 시작하는 코인인데 깃허브에 watch를 걸어놓으니 시도때도없이 밤낮주말에도 코딩하면서 일해라모드다. 뭘하는지는 다음 포스팅에 한번 적어볼 예정인데, 넣은돈은 없지만 어쨌든 뭔가 열심히 일하니 보기가 좋다. 야근을 지켜보는 옆부서 부장님 마음이 아닐까 싶다. <p dir="auto">이 코인은 실제로, 커밋횟수, star갯수, 코드기여자, 참조횟수가<br /> 9,492 / 106 / 52 / 29 를 기록한다. <p dir="auto">사실 기계학습에서 학습 데이터를 가지고 다시 재탕해서 그 데이터를 예측하는것은 기계에대한 실례다. 하지만, 글이 너무 질질 길어지고 있기 때문에 빠르게 predict함수를 통해 예측한다. <p dir="auto">사실 위에서 예측한 계수를 가지고 z = 2x + 3y ... 와 같은 식을 세울수 있는데, 이러한 식을 통해 나오는 결과값은 predicts라는 함수로 쉽게 구할수 있다. <pre><code>target <- data.frame(커밋횟수=9492, Star.갯수=106, 코드기여자=52, 참조횟수=29) predict(model, newdata=target) 1 265.262 <p dir="auto">적정 시총은 265, 즉 26조 정도로 예측할수 있다. 발행량을 보면 8,745,102개 이므로, 26조를 대충 나눠보면 약 적정가격은 303.02 USD다. 현재 가격은 70.32 USD긴 하다. 아 물론 이글을 읽고 모두가 다 그 코인을 사러가지 않으면 좋겠다. 열심히 일해서 성과가 나오도록 지켜봐주자. 뭔가 실물로 잡히는 서비스는 없어보이기 때문이다. <p dir="auto">실제로 모델로 이제 한번 얼마나 수치가 떨어져있나 보기위해 아래와같이 계산한다. <pre><code>target <- bigdata result <- predict(model, newdata=target) result <- cbind(bigdata, result) resultfinal <- result[,c("코인이름", "시총", "result")] resultfinal[,4] <- resultfinal[,2] - resultfinal[,3] colnames(resultfinal)[4] <- "평가차이" str(resultfinal) resultfinal <- resultfinal[order(resultfinal$평가차이),] resultfinal <p dir="auto">위에서부터 저평가된 코인이며, 밑으로갈수록 고평가되어있는 코인이다. <pre><code> 코인이름 시총 result 평가차이 51 팩텀 6 265.262015 -259.262015 28 시아코인 16 268.255280 -252.255280 14 모네로 62 279.391692 -217.391692 32 웨이브 13 182.568487 -169.568487 41 골렘 8 150.553235 -142.553235 5 에이다 272 388.809313 -116.809313 18 이더리움클래식 37 151.066276 -114.066276 42 어거 8 104.075990 -96.075990 25 스테이터스 19 102.375076 -83.375076 29 스팀 16 92.466294 -76.466294 22 비트쉐어 20 85.816540 -65.816540 13 이오스 63 120.785074 -57.785074 60 0x 5 52.693635 -47.693635 1 비트코인 2763 2806.321138 -43.321138 17 라이블록스 47 74.184359 -27.184359 21 버지 24 43.903889 -19.903889 31 스트라티스 15 33.676570 -18.676570 46 아크 7 14.387515 -7.387515 61 바이트볼 5 3.876654 1.123346 9 스텔라 127 124.183492 2.816508 12 네오 65 55.116716 9.883284 68 스토리지 3 -7.976855 10.976855 43 드래곤체인 8 -6.418234 14.418234 62 넥서스 5 -16.903792 21.903792 71 리피오크레딧네트워크 2 -29.333317 31.333317 63 리퀘스트 네트워크 5 -26.630610 31.630610 75 머큐리 1 -30.965142 31.965142 38 XPCoin 10 -26.268624 36.268624 39 Hshare 10 -26.587725 36.587725 44 베리타시움 8 -28.656288 36.656288 20 비트커넥트 25 -12.960015 37.960015 23 오미세고 20 -19.646680 39.646680 30 포퓰러스 16 -30.270727 46.270727 19 아이콘 28 -24.432434 52.432434 10 아이오타 110 43.182031 66.817969 6 뉴이코노미무브먼트 147 -4.993874 151.993874 7 트론 147 -13.392893 160.392893 3 이더리움 993 822.111165 170.888835 2 리플 1245 421.374771 823.625229 <p dir="auto">그냥 끝내기는 아까우니, 뭔가 멋들어지게 그래프도 하나 그리면서 끝내주자 <pre><code>resultfinal$colour <- ifelse(resultfinal$평가차이 < 0, "steelblue", "firebrick1") ggplot(resultfinal, aes(x = 코인이름,y = 평가차이))+ geom_bar(stat="identity", fill=resultfinal$colour) + coord_flip() <p dir="auto"><img src="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_235955.png" alt="image" srcset="https://images.hive.blog/768x0/http://mr-go.com/image/20180107_235955.png 1x, https://images.hive.blog/1536x0/http://mr-go.com/image/20180107_235955.png 2x" /> <p dir="auto">파란색은 아직 저평가된 코인이고, 빨간색은 고평가된 코인이다. <h2>모델의 한계 <ul> <li>비트코인과 이더리움, 리플이 일단 모델에 굉장한 영향을 끼치고 있다. 진단그래프를 통해 문제점을 확인할수 있는데 다음에 없애본다. <li>활용할수있는 데이터의 수집에 문제가 있다. <li>상관관계과 인과관계는 아니므로, 시가총액이 많고 유명해서 사람들이 참고를 많이 한건지, 좋은 코드를 사람들이 알아보고 가격이 높아졌는지 불분명하다. <li>시시각각으로 변하는 시가총액을 적용못함. <h2>끝내며 <p dir="auto">뭔가 그래도 조금이나마 가치있는 글을 남기기위해 열심히 썼습니다... 안녕!R로 코인 가격예측 모델 만들기
7 years ago in #kr by gillime (51)
$74.10
- Past Payouts $74.10
- - Author $56.01
- - Curators $18.09
R로 기본적인 데이터 전처리와 단순 통계만 업무에 쓰는 사람으로서 굉장히 놀라운 작업이네요 ㅎㅎ 팔로우하고 갈게요~
우와 정말 공부해보고 싶은 내용인데 1도 이해 못하겠어요 ㅠㅠㅠ 더 열심히 공부해야 할 듯 !! 넘 멋지십니다 ㅎㅎㅎ
공부하는 과정에서 다 해볼수있어요! 조금씩 이해하면서 해보시면 제 논리적 결함도 찾으실수있을거에요
와....전 갓 R입문한 문과생인데, 이렇게 또 쓰일 수 있다는 것에서 놀랍습니다! @gillime님 처럼 뭔가 가치있는 분석을 얼른 해보고 싶네요! 팔로우 하고 소식 받아보겠습니다 :)
데이터 사이언스에 관심 많으신데, 분명 재밌는 인사이트를 도출하실수있을거라고 믿습니다~ 기대할게요
R 이제 막 입문한 뉴비 입니다. 글 완전 유용하네요! 감사합니다!
감사합니다.
엄청나게 가치있습니다.
이런걸 하다니 놀라면서 봤네요..
왠지 다음도 기대됩니다.
수고 많으셨어요. 감사합니다.
아녜요 나름 허접이 많은 모델이랍니다..
좋은 분석입니다. 리플은 확실히.. 고평가가 됐다는 의견을 가끔씩 듣습니다.. 허허 빨리 팔아버리고 스팀이나 사야겠네요..
좀많이 비싸졌죠.. 돈이돈을 버는 세상인가봅니다
와 대단하십니다... 저는 대부분 저평가된 코인에 투자를 했네요 ㅎㅎ
열심히 코드를 짜는 코인이 저도 좋습니다 ㅎㅎ
R을 활용한 좋은 모델 감사드립니다. 아무래도 R이 간단하면서도 시각화나 분석에는 아주 강력한 언어이죠 :)
사실 개발자입장에서는 파이썬이 유혹을 심하게 합니다 ㅎㅎ
나름 통계학 수업도 들었는데 역시 그걸로는 택도 없군요. 잘 읽었습니다! 그래프에서 리플과 트론이 무시무시해보이네요. 반면, 제가 들고 있는 웨이브와 에이다는 ^^;;;
선형회귀모델이 가진 모델의 가정들과 가정이 만족되지 않을때의 한계점 까지 잘 설명해주셨네요.
모델 가정들이 많이 부러진 결과지만멋지십니다 ㅋㅋ정말 멋진 시도 잘봤습니다. 요즘 가격을 보면 저 분석이 확실히 맞는것 같아요.
안녕하세요! 지나가던 코린이 입니다. 이 글을 보고 정말 놀랐던게, 이 정도 분석이면, 논문도 쓰실 수 있지 않을까? 합니다. 정말 대단하십니다! 업보트도 하고 갑니다!