ic


이넘들아 이럴 거면 업데이트 하지마 삽질


이글루스는 왜 이리 앱을 못 만드냐... 네트워크는 멀쩡한데, 얘만 네트워크 문제라고 이러니
아무래도 OS와의 문제인 듯...킷캣에서는 잘 돌아간다. 오레오를 아직 지원못하는 듯...

세상에서 가장 쉬운 베이즈 통계학 입문

지난 연말부터 이번 달 중순까지 책을 한 권 읽고 나름대로 정리하는 시간을 가져 보았다. 한 권을 읽고 정리하고 보니 뿌듯한 느낌이 들었다. 그래서 결심한 것이 2018년 올 한해에는 책을 대충 읽지 말고 끝까지 읽고 정리를 해볼까 한다. 그래서 읽고 정리한 책이 "세상에서 가장 쉬운 베이즈 통계학 입문"이다. 통계학도 잘 모르는 상황에서 베이즈 통계학을 공부하겠다고 몇 권의 책을 보고 좌절했다. 어찌 초반에만 쉬운 지...뒤로 갈 수록 @.@

결론부터 말하자면 베이즈 통계학을 처음 입문하고자 하는 분은 꼭 한번 읽어보시길 바이다. 소개한 바와 같이 책은 복잡한 수식없이 단순 계산만 갖고 진행한다. 그리고 이 책의 장점중 하나는 확률의 개념을 면적으로 보고 조건부 확률과 관측 정보를 곱하는 방식으로 확률을 설명하고 있다. 책은 1부와 2부로 나눠져 있는데, 1부는 재미있는 산수공부처럼 생각하고 읽어 나갈 수 있다. 그러나 2부는 약간 미간을 구겨가며 집중을 하면서 읽어야 한다 (책의 중간 중간에 오타/오류가 있는 데, 번역출판과정에서 생긴 듯하다)

저자는 일본 데이쿄 대학교 경제학부에 재직중인 고지마 히로유키교수이다. 사실 이 분의 책을 한 권 더 가지고 있었다. "세상에서 가장 쉬운 통계학 입문"이 그것인데, 공교롭게도 책을 사다보니 같은 저자였다. 이 책은 통계지식이 그냥 부족한 게 아니라 절대 부족한 사람들을 위해 쓴 책인데, 이 책을 먼저 있어도 된다.

윈도에서 PyMC3 설치 PYTHON

지난 번에 우분투에서 PyMC를 설치하는 걸 포스팅한 적이 있는 데, 우분투나 맥이야 컴파일러가 아예 포함되어 있는 등 개발이 편한 점이 있지만 윈도우는 그렇치 않아 PyMC3 설치가 까다로운 듯하다. 처음에 파이썬3.6하에서 PyMC3를 설치하였는데, 거기에 필요한 theano가 파이썬 3.6을 아직 지원하지 않아 결국은 실패.

그래서 재수하여 파이썬3.5 가상개발환경을 만들고 PyMC3를 설치하여 보았다. 결론은 주관적으로 80~90% 성공(아직 샘플을 하나만 돌려서 나중에 뭔 에러가 날지는 모르겠지만) 다음은 설치한 내역인데, 참고 삼아 올려본다.

정리하면 :
1. conda create -n bayes python=3.5.3 anaconda
2. activate bayes
3. conda install -c conda-forge pymc3
4. conda install numpy scipy mkl-service libpython m2w64-toolchain

Welcome to Anaconda

(C:\Users\JIMSJOO\Anaconda3) C:\Users\JIMSJOO>conda create -n bayes python=3.5.3 anaconda
Fetching package metadata .............
Solving package specifications: .

Package plan for installation in environment C:\Users\JIMSJOO\Anaconda3\envs\bayes:

The following NEW packages will be INSTALLED:

anaconda: custom-py35h64770cb_0
certifi: 2017.11.5-py35h456c6ae_0
pip: 9.0.1-py35h691316f_4
python: 3.5.3-3
setuptools: 36.5.0-py35h21a22e4_0
vc: 14-h2379b0c_2
vs2015_runtime: 14.0.25123-hd4c4e62_2
wheel: 0.30.0-py35h38a90bc_1
wincertstore: 0.2-py35hfebbdb8_0

Proceed ([y]/n)? y

#
# To activate this environment, use:
# > activate bayes
#
# To deactivate an active environment, use:
# > deactivate
#
# * for power-users using bash, you must source
#


(C:\Users\JIMSJOO\Anaconda3) C:\Users\JIMSJOO>activate bayes
Welcome to Anaconda

(bayes) C:\Users\JIMSJOO>conda install -c conda-forge pymc3
Fetching package metadata ...............
Solving package specifications: .

Package plan for installation in environment C:\Users\JIMSJOO\Anaconda3\envs\bayes:

The following NEW packages will be INSTALLED:

backports: 1.0-py35_1 conda-forge
backports.functools_lru_cache: 1.4-py35_1 conda-forge
ca-certificates: 2017.11.5-0 conda-forge
cycler: 0.10.0-py35_0 conda-forge
freetype: 2.8.1-vc14_0 conda-forge [vc14]
h5py: 2.7.1-py35_2 conda-forge
hdf5: 1.10.1-vc14_1 conda-forge [vc14]
icc_rt: 2017.0.4-h97af966_0
icu: 58.2-vc14_0 conda-forge [vc14]
intel-openmp: 2018.0.0-hd92c6cd_8
joblib: 0.11-py35_0 conda-forge
jpeg: 9b-vc14_2 conda-forge [vc14]
libgpuarray: 0.7.5-vc14_0 conda-forge [vc14]
libpng: 1.6.34-vc14_0 conda-forge [vc14]
mako: 1.0.7-py35_0 conda-forge
markupsafe: 1.0-py35_0 conda-forge
matplotlib: 2.1.1-py35_2 conda-forge
mkl: 2018.0.1-h2108138_4
numpy: 1.14.0-py35h4a99626_0
openssl: 1.0.2n-vc14_0 conda-forge [vc14]
pandas: 0.22.0-py35_0 conda-forge
patsy: 0.5.0-py35_0 conda-forge
pygpu: 0.7.5-py35_0 conda-forge
pymc3: 3.2-py35_0 conda-forge
pyparsing: 2.2.0-py35_0 conda-forge
pyqt: 5.6.0-py35_4 conda-forge
python-dateutil: 2.6.1-py35_0 conda-forge
pytz: 2017.3-py_2 conda-forge
qt: 5.6.2-vc14_1 conda-forge [vc14]
scipy: 1.0.0-py35h75710e8_0
sip: 4.18-py35_1 conda-forge
six: 1.11.0-py35_1 conda-forge
theano: 1.0.1-py35_1 conda-forge
tornado: 4.5.3-py35_0 conda-forge
tqdm: 4.19.5-py_0 conda-forge
zlib: 1.2.11-vc14_0 conda-forge [vc14]

Proceed ([y]/n)? y

ca-certificate 100% |###############################| Time: 0:00:02 76.97 kB/s
backports-1.0- 100% |###############################| Time: 0:00:00 293.55 kB/s
joblib-0.11-py 100% |###############################| Time: 0:00:01 115.96 kB/s
markupsafe-1.0 100% |###############################| Time: 0:00:00 109.96 kB/s
numpy-1.14.0-p 100% |###############################| Time: 0:00:00 8.68 MB/s
pyparsing-2.2. 100% |###############################| Time: 0:00:00 100.65 kB/s
pytz-2017.3-py 100% |###############################| Time: 0:00:01 111.23 kB/s
sip-4.18-py35_ 100% |###############################| Time: 0:00:02 242.40 kB/s
six-1.11.0-py3 100% |###############################| Time: 0:00:00 1.39 MB/s
tornado-4.5.3- 100% |###############################| Time: 0:00:02 234.72 kB/s
cycler-0.10.0- 100% |###############################| Time: 0:00:00 0.00 B/s
h5py-2.7.1-py3 100% |###############################| Time: 0:00:03 210.72 kB/s
mako-1.0.7-py3 100% |###############################| Time: 0:00:00 186.76 kB/s
pyqt-5.6.0-py3 100% |###############################| Time: 0:00:05 875.71 kB/s
python-dateuti 100% |###############################| Time: 0:00:03 76.87 kB/s
backports.func 100% |###############################| Time: 0:00:00 612.81 kB/s
pandas-0.22.0- 100% |###############################| Time: 0:00:08 1.17 MB/s
patsy-0.5.0-py 100% |###############################| Time: 0:00:03 88.86 kB/s
pygpu-0.7.5-py 100% |###############################| Time: 0:00:02 260.30 kB/s
matplotlib-2.1 100% |###############################| Time: 0:00:06 1.13 MB/s
theano-1.0.1-p 100% |###############################| Time: 0:00:06 622.71 kB/s
pymc3-3.2-py35 100% |###############################| Time: 0:00:04 275.41 kB/s

(bayes) C:\Users\JIMSJOO>python
Python 3.5.3 |Anaconda custom (64-bit)| (default, May 15 2017, 10:43:23) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymc3 as pm
WARNING (theano.configdefaults): g++ not available, if using conda: `conda install m2w64-toolchain`
C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\theano\configdefaults.py:560: UserWarning: DeprecationWarning: there is no c++ compiler.This is deprecated and with Theano 0.11 a c++ compiler will be mandatory
warnings.warn("DeprecationWarning: there is no c++ compiler."
WARNING (theano.configdefaults): g++ not detected ! Theano will be unable to execute optimized C-implementations (for both CPU and GPU) and will default to Python implementations. Performance will be severely degraded. To remove this warning, set Theano flags cxx to an empty string.
WARNING (theano.configdefaults): install mkl with `conda install mkl-service`: No module named 'mkl'
WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.

C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
>>> exit()

(bayes) C:\Users\JIMSJOO>conda install numpy scipy mkl-service libpython m2w64-toolchain
Fetching package metadata .............
Solving package specifications: .

Package plan for installation in environment C:\Users\JIMSJOO\Anaconda3\envs\bayes:

The following NEW packages will be INSTALLED:

libpython: 2.1-py35_0
m2w64-binutils: 2.25.1-5
m2w64-bzip2: 1.0.6-6
m2w64-crt-git: 5.0.0.4636.2595836-2
m2w64-gcc: 5.3.0-6
m2w64-gcc-ada: 5.3.0-6
m2w64-gcc-fortran: 5.3.0-6
m2w64-gcc-libgfortran: 5.3.0-6
m2w64-gcc-libs: 5.3.0-7
m2w64-gcc-libs-core: 5.3.0-7
m2w64-gcc-objc: 5.3.0-6
m2w64-gmp: 6.1.0-2
m2w64-headers-git: 5.0.0.4636.c0ad18a-2
m2w64-isl: 0.16.1-2
m2w64-libiconv: 1.14-6
m2w64-libmangle-git: 5.0.0.4509.2e5a9a2-2
m2w64-libwinpthread-git: 5.0.0.4634.697f757-2
m2w64-make: 4.1.2351.a80a8b8-2
m2w64-mpc: 1.0.3-3
m2w64-mpfr: 3.1.4-4
m2w64-pkg-config: 0.29.1-2
m2w64-toolchain: 5.3.0-7
m2w64-tools-git: 5.0.0.4592.90b8472-2
m2w64-windows-default-manifest: 6.4-3
m2w64-winpthreads-git: 5.0.0.4634.697f757-2
m2w64-zlib: 1.2.8-10
mkl-service: 1.1.2-py35h051acba_4
msys2-conda-epoch: 20160418-1

Proceed ([y]/n)? y

libpython-2.1- 100% |###############################| Time: 0:00:04 9.69 MB/s
mkl-service-1. 100% |###############################| Time: 0:00:00 846.01 kB/s

(bayes) C:\Users\JIMSJOO>python
Python 3.5.3 |Anaconda custom (64-bit)| (default, May 15 2017, 10:43:23) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymc3 as pm
WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.
C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
>>> model=pm.Model()
>>> with model:
... mu1=pm.Normal("mu1",mu=0,sd=1,shape=10)
...
>>> with model:
... step=pm.NUTS()
... trace=pm.sample(2000,tune=1000,init=None,step=step,njobs=2)
...

C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\pymc3\model.py:384: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
if not np.issubdtype(var.dtype, float):
WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.
C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
23%|##################3 | 704/3000 [00:01<00:05, 446.05it/s]WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.
35%|########################### | 1054/3000 [00:02<00:03, 492.33it/s]C:\Users\JIMSJOO\Anaconda3\envs\bayes\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
100%|#############################################################################| 3000/3000 [00:05<00:00, 576.51it/s]
>>>

가상개발환경을 주피터 노트북에서 사용하기 PYTHON


윈도우에서 아나콘다를 가지고 가상개발환경을 만들었는데, 콘솔이 아닌 주피터 노트북에서 사용하고 싶었다. 그러나 가상개발환경을 만들어 준다고 해도 편리하게 주피터 노트북에서 가상개발환경을 사용하도록 만들어 주지는 못하는 듯하다 (나중에 안 사실이지만, 아나콘다 루트의 기본 파이썬 버전을 사용하는 가상개발환경을 만드는 경우 자동으로 만들어 준다) 주피터노트북은 가상개발환경과 무관하게 아나콘다의 전역적인 개발환경을 염두에 두고 작동을 하도록 만든 듯하다.

구체적인 방법은 다음과 같다.
1. 아나콘다 프롬프트를 연 후 가상개발환경으로 들어간다.
activate py35


2. ipykernel을 설치한다
(py35) $ pip install ipykernel


3. C:\Users\사용자이름\Anaconda3\share\jupyter\kernels 밑에 가상개발환경을 위한 커널폴더를 만들고 kernel.json 파일을 생성한다.

기본적으로 python3 폴더가 있고 그안에 kernel.json파일이 있다. kernel.json파일에는 주피터 노트북에서 기본으로 사용할 수 있는 Python3 노트북의 설정이 여기 있는데, 그 내용은 다음과 같다.
{
"argv": [
"C:\\Users\\사용자이름\\Anaconda3\\python.exe",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3",
"language": "python"
}

우리가 만든 가상개발환경도 python3와 같이 똑같이 만들어 주는 것이 핵심이다. 가상개발환경을 위한 노트북용 폴더(폴더이름이 가상개발환경의 이름과 일치하지 않아도 된다)를 하나 만들고 kernel.json 파일을 추가해준다.

4. kernel.json 편집
kernel.json의 세 번째 행은 파이썬 실행파일이 있는 경로와 파일명이다. 보통 가상개발환경은 C:\Users\사용자이름\Anaconda3\envs 아래에 만들어 진다. 그리고 가상개발환경 폴더에 python.exe가 있다. 그리고 "display_name" 에는 주피터 노트북 이름을 적어준다, 이름은 가상개발환경의 그것과 달라도 된다.
{
"argv": [
"C:\\Users\\사용자이름\\Anaconda3\\envs\\py35\\python.exe",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Zipline",
"language": "python"
}


5. zipline이라는 커널이 새로 생긴 걸 볼 수 있다

아나콘다에서 파이썬 개발환경 수정 PYTHON

개발과정중에 아나콘다가 여러 모로 편리한 점이 있는데, 늘 명령이나 자주 사용하지 않는 명령을 정리해보려고 한다.
1. 설치된 파이썬과 라이브러리 버전(기본버전은 버전앞에 *가 붙음)
conda search python


2. 가상환경 설치 및 파이썬 버전 설정-가령 py35라는 가상환경을 만들고 사용할 파이썬 버전을 3.5.3.으로 한다면
conda create -n py35 python=3.5.3 anaconda

3. 가상환경 사용
activate py35(윈도우즈의 경우)
source activate py35(리눅스의 경우)

4. 가상환경 종료
deactivate py35(윈도우즈의 경우)
source activate py35(리눅스의 경우)

5. 기본 파이썬 버전 지정
conda install python=3.5.3

베이즈통계로 짝사랑하는 상대방의 마음을 확인하는 법 Data science



사람 마음, 특히 내가 짝사랑하는 이성의 마음을 알고 싶은 것은 인지상정이죠. 스마트폰 앱중에는 짝사랑하는 상대방의 마음을 알려주는 앱이 있더군요. 그런데, 무슨 원리인지는 모르지만 앱이 자동으로 카톡 상대방에게 '~니가 너무 좋아' 하는 고백을 보내는 바람에 쪽팔리는 사태가 벌어진 리뷰가 재미있네요.


요즘 보고 있는 '세상에서 가장 쉬운 베이즈통계학 입문'이라는 책에는 초콜릿을 주는 직장동료가 나를 좋아하는 지, 아니면 그냥 주는 건지를 베이즈확률로 계산하는 예가 나옵니다.

문제설정
당신이 남성이라고 가정하자. 특정여성 동료가 자신에게 호감을 가지고 있는 지 알고 싶은 상황이다. 그런 와중에 당신은 밸런타인데이에 그녀로부터 초콜릿을 받았다. 이때 그녀가 당신을 진지하게 생각하고 있을 확률이 얼마라고 추정해야 할까?

여기에선 객관적인 자료(여자 마음에 대한 추측)가 없어 '이유불충분의 원리'를 적용하여 진심/논외로 나눠 각각 0.5의 확률을 부여하는 걸로 시작합니다.
'진심'은 그녀가 나에 대한 호감을 가진 것, '논외'는 그녀가 나를 그냥 직장동료정도로만 생각하는 것이죠.

그리고 조건부확률을 구해야 하는데, 이것은 설문조사 자료를 바탕으로 정하는 데, 통계적으로 평균 그녀들은 관심있는 상대에게 42.5% 확률로, 논외인 상대에게 22%의 확률로 초콜릿을 준다고 합니다.

사전확률과 조건부확률로 아래의 도표3-3과 같이 4가지의 세계(책에 따른 용어)로 나뉩니다.

그런데 운 좋게도 동료여성으로부터 초콜릿을 받았다고 합니다. 그래서 주지 않는다는 세계는 소거되고 남은 것은 "진심&준다"와 "논외&준다"가 남았습니다. 두 확률의 비율은 0.2:0.1 인데 모든 확률은 합쳐서 1.0 이어야 하는 정규화 규칙으로 이를 다시 계산하면

이 결과로부터 초콜릿을 준 그녀의 마음이 진심일 확률은 2/3 = 66%가 된다고 합니다. 처음에 50%라는 사전확률이 동료여성의 초콜릿을 준 행동을 관찰하게 됨으로써 약 66% 사후확률로 바뀌었습니다. 짝사랑만 하지 말고 확인해보시길 바랍니다. ㅎㅎ
이제 저도 짝사랑하는 그녀의 마음을 확인해볼까 합니다. 그런데 현실적으로 여자친구는 유니콘 같은 상상속의 동물 아닌가요?

워크시트 선택 영역을 재빨리 움직이는 방법 EXCEL/VBA


백 마디의 말보다 그림 한 장이면 충분한 경우도 있죠. 본능적으로 했던 것이지만 모르시는 분도 계실까봐...
[출처] Learn a Super Quick Way to Move Rows and Columns in Excel

페어트레이딩에 대한 짧은 글 금융공학

절대수익을 얻는 방법중 하나는 한 개의 자산을 매수하고 동시에 또 다른 하나의 자산을 매도하는 방법이 있다. 이를 Relative trading 또는 Pairs trading이라고 한다. 그러나 아무거나 사고 파는 것은 아니다. 매수/매도할 자산을 선택해야 하는 숙제가 남아 있다.

펀더멘탈 분석을 통해 저평가/성장가능성 높은 넘은 매수하고, 반대로 고평가/성장한계에 부닺친 넘은 매도하는 방법
통계적 분석으로 두 주식간의 괴리도가 벌어지거나 수렴하는 성질-평균회귀를 이용하는 방법

통계적 분석으로 지수보다 성과가 높은 포트폴리오를 매수하고 , 지수선물을 매도하거나 반대로 성과가 낮은 포트폴리오를 매도하고 지수선물을 매수하는 절대수익을 추구할 수 있다.

그러나 현실적으로 포트폴리오를 매도(공매도)하는 것이 쉽지 않다. 포트폴리오내 주식들을 일일이 원하는 수량만큼 빌리는 것도 수월하지 않고, 빌리는 비용을 지불해야 한다.

공격적으로 운용한다면 지수선물 대신 두 개의 포트폴리오를 매수/매도할 수도 있다.

1. 통계적 분석 방법
2. 회귀분석을 이용한 방법
3. 공적분 분석을 이용한 방법

1) 회귀분석을 이용한 방법
일반적인 회귀분석은 독립변수와 종속변수간의 관계를 식으로 풀어 미래를 예측하려는 알고리즘이다. 그러나 매수/매도하는 두 개의 종목은 어느 한 쪽이 독립변수이고 다른 한 쪽이 종속변수인 관계는 아니다. 직교회귀를 이용한 방법은 독립변수와 종속변수를 번갈아 바꿔 회귀분석을 실시한 후 기준선을 구하여 실제 값과의 직교거리의 괴리도를 이용하여 매매한다.


2) 공적분 분석을 이용한 방법
시계열을 이용한 분석으로 통계적 수치가 시간의 흐름에도 불구하고 일정하도록 하여(Stationary Process, 시불변) 분석한다. Non-Stationary Process 를 보이는 데이터를 변수들의 조합으로 Stationary Process로 바꾸는데, 이렇게 조합되는 변수들은 서로 Co-integrated되었다고 한다. 공적분 검정을 통해 시불변과정으로 바꿔 시계열분석을 한다.

흔히 co-integration에 대해 설명하는 예가 산책하는 주인과 강아지이다. 둘은 같은 방향으로 이동하지만 강아지는 주인 곁을 멀리 떠나지 않으면서 주변을 무계획적으로 돌아 다닌다. 따라서 강아지는 주인의 위치 정보를 제공하고 주인은 강아지의 위치를 알려주게 된다. 이때 주인과 강아지는 co-integration 되었다고 한다.


3) 분석시 고려할 사항
  • 분석대상 : 동조화 현상이 좋은 종목과 지수
  • 분석기간의 설정
  • 적용기간의 설정
  • 괴리도 설정 : 가령 추정치와 실제값의 잔차가 1.65*SD 이상 벌어지면 시작, 1.0*SD 이내로 돌아오면 포지션 청산
  • 수익률 계산방법
전체 데이터중 80%를 분석기간으로, 나머지 20%를 적용기간으로 분리한 뒤 모델링은 분석기간의 데이터만 가지고 수행하고, 모델의 성능은 적용기간로 평가하면 모델의 성능을 가장 적절히 평가할 수 있다. 전체 데이터를 모델링과 성능평가에 사용하면 데이터에 내재되어 있는 실제적 특징외에 데이터에 우연한 노이즈까지 반영한 모델을 만들게 될 위험이 있다. 과적합된 모델을 사용하게 되면 예측력이 떨어진다.

엑셀로 데이터사이언스를 공부해볼까 싶어 벌이는 삽질 EXCEL/VBA

예전에 R 을 공부하면서 신박하다고 감탄한 기능중 하나는 미리 준비된 데이터셋이 있다는 점이다. 데이터분석을 위한 배려가 있는 환경이다. 새해부터 해보고 싶은 일이 데이터사이언스를 공부해보는 것인데, R이나 Python, Spark 등등 좋은 도구가 많지만 많은 전문가들이 빼놓지 않고 언급하는 도구가 엑셀이다.

기름없이 차가 안굴러가듯이 일단 데이터셋을 모으는 게 일인 듯 싶어(책도 준비하고) R의 데이터셋을 다운받을 곳을 찾아보니 , https://vincentarelbundock.github.io/Rdatasets/datasets.html 에서 CSV파일이나 DOC파일로 제공하고 있다.
흠 이걸 다운받아 써봐야지...R 책에서 자주 보이는 iris 등을 몇 개 다운 받고 보니, 쓸데없이 전부 다운받고 싶은 욕심이 든다. 그런데 제공하는 데이터셋이 한 두개가 아니다. 나중에 세어보니 1,174개이다.

엑셀로 공부하기로 했으니 필요한 데이터셋을 엑셀로 다운받아 보기로 했다. 일단 datasets.html 파일을 엑셀에서 열었다. [열기]대화상자에서 url을 복사해서 [파일이름]에 붙여 넣고 [열기]버튼을 클릭하면, html 파일이 워크시트안으로 들어오게 된다.


[F]컬럼은 csv파일을 다운받을 수 있는 하이퍼링크가 들어 있다. 이 컬럼의 각 셀을 돌아다니면서 하이퍼링크를 추출하여 다운로드하면 된다. 다운로드는 인터넷익스플로러(ie) 개체를 이용하는 방법도 있지만 윈도우 API를 직접 사용하는 방법을 사용하였다.
Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

위의 URLDownloadToFile()함수에서 2번째 매개변수에는 url을, 3번째 매개변수에는 저장할 경로&파일이름을 던져주면 된다. 정상적으로 다운로드하면 0을 돌려준다. 다음은 이런 작업을 해주는 프로시저이다.
Sub DownloadCSV()
    Dim s As Worksheet
    Dim rng As Range
    Dim url As String
    Dim local_file_name As String
    Dim i As Long

    Set s = Sheet1
   
    i = 0
    For Each rng In s.Range(s.Range("F2"), s.Range("F2").End(xlDown))
        i = i + 1
        If GetQueueStatus(QS_ALL_EVENTS) <> 0 Then DoEvents

        url = rng.Hyperlinks.Item(1).Address
        local_file_name = ThisWorkbook.Path & "\" & Right(url, Len(url) - InStrRev(url, "/"))
        Debug.Print i, "Trying " & local_file_name

        If Len(url) <> 0 And Len(Dir(local_file_name)) = 0 Then
            If URLDownloadToFile(0, url, local_file_name, 0, 0) = 0 Then
                Debug.Print i, "Saving " & local_file_name
            End If
        End If
    Next
End Sub
그런데 시간이 많이 걸린다. 똥차라서 느리지만 잘 굴러가길 바라는 마음에서 추가로 원활한 작업을 위해 윈도우 큐를 검사하는 API(GetQueueStatus)를 하나 추가하였다. 다음은 GetQueueStatus()함수와 그에 부속된 상수들이다.
Declare PtrSafe Function GetQueueStatus Lib "user32" (ByVal fuFlags As Long) As Long
Public Const QS_MOUSEBUTTON = &H4
Public Const QS_MOUSEMOVE = &H2
Public Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Public Const QS_KEY = &H1
Public Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Public Const QS_POSTMESSAGE = &H8
Public Const QS_SENDMESSAGE = &H40
Public Const QS_TIMER = &H10
Public Const QS_HOTKEY = &H80
Public Const QS_PAINT = &H20
Public Const QS_ALL_EVENTS = (QS_SENDMESSAGE Or QS_PAINT Or _
    QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or _
    QS_HOTKEY Or QS_KEY)


자바스크립트로 엑셀 함수를... EXCEL/VBA

아직 개발중인데 MS에서 자바스크립트로 엑셀 워크시크함수를 만들 수 있도록 한답니다.

자세한 건 일단 아래의 URL을 하시길 바랍니다. MS가 파이썬 도입등  엑셀을 시작으로 오피스에 대단한 변화를 주려나 봅니다.
[URL]Custom function in Excel



1 2 3 4 5 6 7 8 9 10 다음