data analysis & visualization

tistoryCJlibrary(ggmap)

register_google(key=구글키)

k=geocode('지역명')

k=mutate_geocode(data.frame(address=c('지역명'),stringsAsFactors = F),address)

extract=as.vector(apply(data.frame(geocode('지역명')),2,mean))
extract[2]=extract[2]+.02

map=get_googlemap(center=extract,maptype='roadmap',zoom=10,col='bw')

 

temp6=spTransform(temp6,CRS('+init=epsg:4326'))
temp6=cbind(coordinates(temp6),temp6@data)

 

#지도그림 배경 + 지적도

ggmap(map) + geom_polygon(data=shp2, aes(x=long, y=lat, group=group,fill=변수),alpha=1, color='black')+theme(
  legend.position = c(.95, .95),legend.justification = c("right", "top"),legend.box.just = "right",legend.margin = margin(6, 6, 6, 6))

 

#지도 그림 배경 + 지적도

p=ggmap(map,data=temp6) +geom_polygon(data=shp, aes(x=long, y=lat, group=group),alpha=0, fill='white',color='black')

#지적도 + 점

p+  geom_point(data=temp6,aes(x=lon,y=lat,colour=get(paste0('결제시간', i,'시의 편차')),size=get(paste0('결제시간',i,' 시의 평균'))))+theme(plot.title=element_text(face="bold", size=30, vjust=2),
        legend.position = c(.95, .95),legend.justification = c("right", "top"),
        legend.box.just = "right",legend.margin = margin(6, 6, 6, 6))+

#지도 타이틀

ggtitle(paste0('결제시간대별 이용건 수(',i,'시)'))+

#범례 타이틀
  labs(colour=paste0('결제시간', i,'시의 편차')) +
  labs( size=paste0('결제시간',i,' 시의 평균')) +
#범위 설정  

scale_size_continuous(limits = c(min(floor(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T))
    ,breaks=seq(min(floor(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,' 시의 평균')]),na.rm=T),len=5))+  
  scale_colour_continuous(limits = c(min(floor(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T)), breaks = 
                            seq(min(floor(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),max(ceiling(temp6[,paste0('결제시간',i,'시의 편차')]),na.rm=T),len=5))+ 
  guides(colour = guide_colorbar(order=1), size = guide_legend(order=2))

영웅문 가입은 https://wikidocs.net/2872를 참고하여 진행하였다.

 

목차

1. python 과 키움 API를 활용한 자료 다운로드

2. R을 활용한 자동화

 

아래는 python 을 통해 주식 분봉 자료를 다운로드 받는 코드이다.

 

import sys
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
import time
import os

import pandas as pd


class Kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()
        self._create_kiwoom_instance()
        self._set_signal_slots()

    def _create_kiwoom_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def _set_signal_slots(self):
        self.OnEventConnect.connect(self._event_connect)
        self.OnReceiveTrData.connect(self._receive_tr_data)

    def comm_connect(self):
        self.dynamicCall("CommConnect()")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    def _event_connect(self, err_code):
        if err_code == 0:
            print("connected")
        else:
            print("disconnected")

        self.login_event_loop.exit()

    def get_code_list_by_market(self, market):
        code_list = self.dynamicCall("GetCodeListByMarket(QString)", market)
        code_list = code_list.split(';')
        return code_list[:-1]

    def get_master_code_name(self, code):
        code_name = self.dynamicCall("GetMasterCodeName(QString)", code)
        return code_name

    def set_input_value(self, id, value):
        self.dynamicCall("SetInputValue(QString, QString)", id, value)

    def comm_rq_data(self, rqname, trcode, next, screen_no):
        self.dynamicCall("CommRqData(QString, QString, int, QString", rqname, trcode, next, screen_no)
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    def _comm_get_data(self, code, real_type, field_name, index, item_name):
        ret = self.dynamicCall("CommGetData(QString, QString, QString, int, QString", code,
                               real_type, field_name, index, item_name)
        return ret.strip()

    def _get_repeat_cnt(self, trcode, rqname):
        ret = self.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname)
        return ret

    def _receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
        if next == '2':
            self.remained_data = True
        else:
            self.remained_data = False

        if rqname == "opt10081_req":
            self._opt10081(rqname, trcode)
        elif rqname =='opt10080_req':
            self._opt10080(rqname, trcode)
        try:
            self.tr_event_loop.exit()
        except AttributeError:
            pass

    def _opt10081(self, rqname, trcode):
        data_cnt = self._get_repeat_cnt(trcode, rqname)
        
        for i in range(data_cnt):
            code= self._comm_get_data(trcode, "", rqname, i, "종목코드")
            date = self._comm_get_data(trcode, "", rqname, i, "일자")
            open = self._comm_get_data(trcode, "", rqname, i, "시가")
            high = self._comm_get_data(trcode, "", rqname, i, "고가")
            low = self._comm_get_data(trcode, "", rqname, i, "저가")
            close = self._comm_get_data(trcode, "", rqname, i, "현재가")
            volume = self._comm_get_data(trcode, "", rqname, i, "거래량")
            
            self.ohlcv['code'].append(code)
            self.ohlcv['date'].append(date)
            self.ohlcv['open'].append(abs(int(open)))
            self.ohlcv['high'].append(abs(int(high)))
            self.ohlcv['low'].append(abs(int(low)))
            self.ohlcv['close'].append(abs(int(close)))
            self.ohlcv['volume'].append(abs(int(volume)))

    def _opt10080(self, rqname, trcode):
        data_cnt = self._get_repeat_cnt(trcode, rqname)

        for i in range(data_cnt):
            code= self._comm_get_data(trcode, "", rqname, i, "종목코드")
            date = self._comm_get_data(trcode, "", rqname, i, "체결시간")
            open = self._comm_get_data(trcode, "", rqname, i, "시가")
            high = self._comm_get_data(trcode, "", rqname, i, "고가")
            low = self._comm_get_data(trcode, "", rqname, i, "저가")
            close = self._comm_get_data(trcode, "", rqname, i, "현재가")
            volume = self._comm_get_data(trcode, "", rqname, i, "거래량")
            
            self.ohlcv['code'].append(code)
            self.ohlcv['date'].append(date)
            self.ohlcv['open'].append(abs(int(open)))
            self.ohlcv['high'].append(abs(int(high)))
            self.ohlcv['low'].append(abs(int(low)))
            self.ohlcv['close'].append(abs(int(close)))
            self.ohlcv['volume'].append(abs(int(volume)))

#################

for switch in [0,1]:
    if switch==0:
        app = QApplication(sys.argv)
        kiwoom = Kiwoom()
        kiwoom.comm_connect()
    code_list = kiwoom.get_code_list_by_market('10')
    dic=[]
    for x in code_list:
        dic.append(kiwoom.get_master_code_name(x))
    dic2=dict(zip(code_list,dic))
    dic2
    for x in code_list:
        try:
            if not(os.path.isdir('D:/주식/data/일봉/'+dic2[x])):
                os.makedirs(os.path.join('D:/주식/data/일봉/'+dic2[x]))
        except OSError as e:
            if e.errno != errno.EEXIST:
                print("Failed to create directory!!!!!")
                raise
    for x in code_list:
        try:
            if not(os.path.isdir('D:/주식/data/분봉/'+dic2[x])):
                os.makedirs(os.path.join('D:/주식/data/분봉/'+dic2[x]))
        except OSError as e:
            if e.errno != errno.EEXIST:
                print("Failed to create directory!!!!!")
                raise

###########
    if switch==1:
        kiwoom.ohlcv = {'code':[],'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}
        a=0
        t=0
        aa=0
        TR_REQ_TIME_INTERVAL = 0.35
        for code in code_list:
            if aa<1000:
                t=t+1
                filename=time.strftime('%Y%m%d', time.localtime(time.time()))+'.csv'
                if (filename in os.listdir('D:/주식/data/분봉/'+dic2[code]))==False:
                    aa=aa+1
                    if aa==999:
                        break
                    time.sleep(1.5)
                    kiwoom.ohlcv = {'code':[],'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}
                    kiwoom.set_input_value("종목코드", code)
                    kiwoom.set_input_value("기준일자", time.strftime('%Y%m%d', time.localtime(time.time())))
                    kiwoom.set_input_value("수정주가구분", 1)
                    kiwoom.comm_rq_data("opt10080_req", "opt10080", 0, "0101")
                    sys.stdout.write(str(dic2[code])+str(aa)+'\n')
                    sys.stdout.flush()
    
                    if aa<1000:
                        while kiwoom.remained_data == True:
                            aa=aa+1
                            if aa==999:
                                break
                            sys.stdout.write(str(dic2[code])+str(aa)+'\n')
                            sys.stdout.flush()
                            time.sleep(TR_REQ_TIME_INTERVAL)
                            kiwoom.set_input_value("종목코드", code)
                            kiwoom.set_input_value("기준일자", time.strftime('%Y%m%d', time.localtime(time.time())))
                            kiwoom.set_input_value("수정주가구분", 1)
                            kiwoom.comm_rq_data("opt10080_req", "opt10080", 2, "0101")
                        
                        df = pd.DataFrame(kiwoom.ohlcv, columns=['date','code','open', 'high', 'low',
                        'close', 'volume'])
                        if len(df)!=0:
                            
                            if a%5==0:
                                a=a+1
                                
                                time.sleep(3)
                        df.to_csv('D:/주식/data/분봉/'+dic2[code]+'/'+filename,mode='w',index=False)



위의 파이썬 분봉자료의 경우 횟수 재한이 있어 자동화 하려면 추가 코드가 필요하다.

따라서 R에서 반복문을 활용하여 다운로드 받게 설정하였다.

 

library(rstudioapi) 
myTerm <- rstudioapi::terminalCreate() 
rstudioapi::terminalSend(myTerm, 'conda activate py36_32\n') 
system('conda activate py36_32') 
getwd() 
while(T){ 
  rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode.py\n') 
  rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode1.py\n') 
  rstudioapi::terminalSend(myTerm, 'python C:/Users/cj/Desktop/code/miniteCode_today.py\n') 
} 

'그 외' 카테고리의 다른 글

[R] 재미삼아 푸는 문제  (0) 2020.01.15
지도 그림 그리기 예제  (0) 2019.11.11
인공지능, 머신러닝 그리고 데이터마이닝의 차이점  (0) 2019.07.01
알고리즘  (0) 2019.04.08
git 개념정리  (0) 2019.03.19

인공지능, 머신러닝, 딥러닝과 데이터마이닝의 차이점은?

인공지능이란?

사람의 지능을 필요로 하는 작업을 수행할 수 있는 컴퓨터 시스템을 지칭하는 말이다. 의사결정을 자동화 하는데 중점을 두는 면에서 머신러닝과 공통점을 가지나, 머신러닝은 인간의 행동과 관련이 없을 수 있다는 점에서 차이가 있다.

머신러닝(기계학습)이란?

인공지능을 구현하는 구체적인 방식. 예측이 주 목적

ex) 추천시스템 알고리즘, 이메일의 스팸여부 판별

딥러닝(심화학습)이란?

머신러닝 알고리즘은 특징들을 매핑시켜 분류, 예측을 하는 반면, 딥러닝의 경우 추상적인 자료에서 특징을 추출하여 분류 및 예측을 한다.

ex) 사진을 통한 분류, 사진을 생성, 음성인식 등의 방법

데이터마이닝이란?

Mining은 채굴, 채광하다라는 뜻으로 즉, 데이터마이닝은 거대한 양의 데이터 속에 쉽게 드러나지 않는 통계적 규칙이나 패턴과 같은 유용한 정보를 찾아내는 과정이라 말할 수 있다. 데이터 내에 정보를 찾는 것이 주 목적

데이터마이닝의 종류

  • 분류 : 새롭게 나타나는 현상을 기존 정의된 집합에 배정하는 것을 의미
  • 추정 : 수입, 수준, 신용잔고처럼 연속된 변수의 값을 추정하는 것을 의미
  • 예측 : 미래의 값을 추정하거나 분류하는 것을 의미
  • 군집 : 이질적인 모집단을 동질성을 지닌 그룹별로 세분화 하는 것을 의미
  • 연관 : 같이 팔리는 물건들 사이의 연관성을 파악하는 분석

머신러닝의 종류

  • 지도학습 : 독립변수와 종속변수의 쌍으로 된 자료가 주어질 때 새로운 자료에 대하여 문제를 풀 수 있는 함수를 찾는 학습방법
  • 비지도학습 : 종속변수가 없이 자료들로부터 패턴을 추출하는 학습방법(데이터 마이닝의 군집의 개념)
  • 강화학습 : 문제에 대한 직접적인 해답을 주지 않고 경험을 통해 기대값이 최대가 되는 것을 찾는 학습방법

마리오 딥러닝최근의 알파고

  • 반지도학습 : 지도학습과 비지도학습을 같이 사용하는 방법
  • 전이학습 : 딥러닝으로 추출된 변수로 다른 모델을 학습하는 방법

학습인란? 데이터를 잘 반영하는 모형을 찾는 것으로 이상적인 모수를 찾는 것을 의미



  • True Positive(TP) : 실제 True인 정답을 True라고 예측 (정답)
  • False Positive(FP) : 실제 False인 정답을 True라고 예측 (오답)
  • False Negative(FN) : 실제 True인 정답을 False라고 예측 (오답)
  • True Negative(TN) : 실제 False인 정답을 False라고 예측 (정답)

모형 평가 지표

  • 정밀도(Precision) : True라고 분류한 것 중에서 실제 True인 것의 비율

  • 재현율(Recall) : 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율.민감도(sensitivity)라고 표현하기도 한다.

  • 특이도(Specificity) : 실제 False인 것 중에서 False라고 예측한 것의 비율.

  • ROC(Receiver Operating Characteristics) : x축은 1-특이도, y축은 민감도를 나타낸 그래프로 이 그래프의 아랫 면적을 AUC(Area Under the ROC Curve)라 한다.

  • 정확도(Accuracy) : 제대로 예측한 것의 비율

  • F1 score : 정밀도와 재현율의 조화평균 

일반적으로 정확도를 사용해 모형의 성능을 평가하며, 모형이 만일 편향된 예측을 하는 경우 재현율보다 정밀도가 중요해진다. 하지만 정확도는 이를 고려할 수 없다. 이에 자료가 불균형 구조를 띌 때에는 F1 score를 모형평가에 사용한다. 이 경우 정확도를 사용하게되면 편향을 고려할 수 없다.


예측모형 실습

예측모형도 앞에서와 같이 간단하게 생성할 수 있다. 모형 평가에 사용되는 지표는 분류모형과 달리 값이 연속형 수치이므로 다른 지표들을 사용한다. 일반적으로 RMSE와 MAE를 많이 사용한다.

  • MSE(mean squared error) 
  • RMSE(root mean squared error) : MSE의 제곱근
  • MAE(mean squared error) 
  • MAPE(mean absolute percentage error) : 오차를 실제값으로 나눈 값들의 합을 n으로 나눈 값
  • BIAS
  • rBIAS(Relative BIAS
  • rMSEP(Relative Mean Separation)

bias-variance trade off

mse는 합을 하기전에 제곱을 하였으므로 실제값과 예측값의 차이가 클수록 값이 mae에 비해 커진다. 따라서 필요에 따라 모형지표를 선택할 필요가 있다. 또한 RMSE나 MAE는 단위에 영향을 받는 반면 MAPE는 단위의 영향을 받지 않는다.

'그 외' 카테고리의 다른 글

[R] 재미삼아 푸는 문제  (0) 2020.01.15
지도 그림 그리기 예제  (0) 2019.11.11
[주식] 키움 영웅문 통한 주식 자료다운로드  (0) 2019.11.11
알고리즘  (0) 2019.04.08
git 개념정리  (0) 2019.03.19

알고리즘

그 외2019. 4. 8. 03:27

오일러 프로젝트(Project Euler)

수학적인 문제들을 프로그래밍으로 해결하는 퀴즈 풀이 사이트

Synap에서 한글로 번역한 사이트를 제공하고 있다. 본 사이트의 모든 문제가 번역되어 있진 않지만 현재 100여개의 문제가 번역되어 있고 많은 사람들이 사용하고 있다. 자신이 원하는 언어로 문제를 풀고 답만 입력하면 된다. 입력한 답이 정답일 경우 다른 사람들이 문제를 푼 코드들을 볼 수 있다.

(Project Euler @kr : http://euler.synap.co.kr/)

(Project Euler @net : https://projecteuler.net/)

 

알고 스팟(Algospot)

프로그래밍 대회에서 배우는 '알고리즘 문제해결 전략'의 저자 구종만씨가 운영하는 사이트

C, Java, Python, C++, Scala, Javascript, Rust, Haskell, Go등 다양한 언어로 문제 풀이가 가능하며 문제별 채점결과(속도, 크기) 랭킹을 제공해준다. 다양한 알고리즘 대회의 양질의 문제들을 제공해 주고 있다. 알고스팟 캘린더에는 알고리즘 대회 스케쥴을 제공해 주고 있다. 국내 알고리즘 사이트 중에서는 Dovelet과 함께 양강체제를 구축하고 있다. 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.

(Algospot : https://algospot.com/)

 

더블릿(Dovelet)

알고 스팟과 양대산맥을 이루는 알고리즘 트레이닝 사이트

C, Java, Python, C++, Perl로 문제 풀이가 가능하다. 1~30계단, 옥상으로 단계를 구분해서 운영하고 있는데 무료로 1~3계단, 옥상 레벨의 문제를 풀 수가 있다. 정회원이 되려면 소정의 금액을 지불해야 한다. 랭킹 30위 안에 들면 1년 이상 무료로 이용이 가능하다. 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.

(Dobelet : http://59.23.113.171/index.php)

 

코딜리티(Codility)

해외에서 정말 유명한 알고리즘 문제 사이트

문제가 영어로 제공되어 해석의 어려움이 있을 수는 있지만 Web에서 코드를 작성하고 컴파일 결과를 확인할 수 있는 장점이 있다. 코드를 제출하게 되면 시간 복잡도와 공간 복잡도를 서버에서 채점하고 등급을 알려준다. 많은 언어를 제공하며 완성도가 높은 사이트이다. 마찬가지로 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.

(Codility : https://codility.com/)

 

코딩도장

운동 도장에 매일 다니며 수련하는 것 같이 프로그래밍 문제풀이를 통해서 코딩 실력을 수련하자는 목표로 만들어진 사이트

구글, 페이스북등 유명 해외 기업과 국내 유명 기업의 코딩 문제들도 수록되어 있다. 채점은 되지 않지만 풀이를 댓글로 작성할 수 있고 다른 사람들의 풀이도 볼 수 있다.

(코딩도장 : http://codingdojang.com/)



출처: https://ledgku.tistory.com/40?category=669017 [견우와 직녀]

git 개념정리

그 외2019. 3. 19. 02:49

깃 용어 정리

저장소(Repository) 


깃 시스템의 기본 구성요소로 프로젝트가 저장되는 하나의 폴더의 개념. 저장소는 뭔가 변했을 때 그 이력을 저장하며, 누가 무엇을 바꿨는지 추적가능


커밋(commit) 

실제로 변경된 내용을 저장소에 추가하는 과정. 고유한 아이디와 메시지가 부여


디프(diff)

두 커밋 간의 변경된 내용의 차이를 의미


브랜치(branch)

저장소에 대한 수평 버전의 하나. 마스터 브랜치에는 영향을 미치지 못함. 따라서 새로운 기능을 실험할 때 사용


머지(merge)

하나의 브랜치에서 바뀐 내용을 같은 저장소에 있는 다른 브랜치로 적용하는 과정


패치(fetch)

원격 저장소로부터 가장 최근의 변경된 내용을 가져와 로컬 저장소와는 머징하지 않는 것


풀(pull)

변경된 내용에 대한 페치와 머지가 결합된 과정. 여러사용자가 하나의 저장소에서 작업할 때 종종 사용.


푸시(push)

로컬 저장소의 내용을 원격 저장소로 보내는 과정.




참고

.gitignore파일

깃 저장소에 포함시키지 않을 파일


Revert버튼을 사용하면 마지막 커밋상태로 되돌아 간다.

History를 통해 모든 커밋을 볼 수 있다.


Checkout함수를 통해 새 브랜치 생성 가능