Category Archives: Data Mining

[python] CSV file loading, R의 DataFrame처럼 이용하기

작년에 만들었던 포스팅, 아마 작성하다 대충 마무리 되었던 것 같다.일단 올리고 봄

 

기본방법

import os

os.getcwd()
# '/Users/Seok/Documents/mycdlist'
os.chdir('/Users/Seok/Documents/MyPythonProject/cog1')

data = []
with open('random.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
#data.append(row)
data.append({
'group' : row[0],
'x'  : row[1],
'y'   : row[2]
})
del data[0] #title 삭제

이 객체의 경우 R과 같은 접근이 어렵다. 예를 들어 아래와 같이 하고 싶다고 하면,

>> data[1:5][‘x’]
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: list indices must be integers, not str

이런식으로 에러가 나온다.

이를 해결하기 위해 numpy 를 이용하면 쉽다.

import numpy as np

r = np.genfromtxt('random.csv', delimiter=',', names=True)

>>> r[:]
array([(1.0, 0.6, 1.9), (1.0, 1.2, 1.5), (1.0, 2.7, 0.1), (1.0, 2.5, 1.4),
(1.0, 2.3, 1.1), (1.0, 0.2, 1.2), (1.0, 0.1, 1.1), (1.0, 0.4, 1.2),
(1.0, 0.8, 1.2), (1.0, 2.6, 0.1), (1.0, 0.3, 1.2), (1.0, 2.5, 0.9),
...
dtype=[('Group', '<f8'), ('X', '<f8'), ('Y', '<f8')])

>>> r[:]['Group']
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
1.,  1.,  1.,  1.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,  3.,  3.,
3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,
3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  4.,
4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,
4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,
4.,  4.,  4.])

>>> r[:]['X']
array([ 0.6,  1.2,  2.7,  2.5,  2.3,  0.2,  0.1,  0.4,  0.8,  2.6,  0.3,
2.5,  2.3,  0.5,  1.2,  2.9,  0.6,  2.1,  2.5,  0.7,  1.3,  1.9,
1.9,  1.9,  1.7,  0.3,  1.5,  1.9,  1.8,  1.6,  2.2,  5.8,  2.6,
5. ,  3.3,  2.4,  4.6,  4.9,  4.7,  4.6,  3.7,  2.9,  4.2,  3. ,
5.6,  5.2,  3.4,  3.5,  2.5,  3.7,  3. ,  2.3,  4.2,  5.4,  5.6,
4.2,  5.5,  2.3,  4.6,  4.3,  0.2,  0.6,  0.9,  0.2,  0.6,  0.6,
0.2,  0.5,  0.3,  0.7,  0.1,  0.2,  0.2,  0.3,  0.6,  0.4,  0.4,
0.8,  1. ,  0. ,  0.8,  0.9,  1. ,  0.7,  0.7,  0.6,  0.5,  0.3,
0.9,  0.6,  4.9,  4.6,  4.2,  4.1,  4.1,  4.5,  3.6,  3.4,  5. ,
4.6,  4.2,  4.6,  3.4,  3.2,  4.1,  3.5,  4. ,  3.8,  4.4,  4.1,
3.2,  4. ,  4.6,  4.5,  4.3,  4.8,  3.1,  3.4,  3.3,  3.1])

 

혹은 pandas를 이용하는 방법이 있는데 아래 링크 참조

http://nbviewer.ipython.org/github/re4lfl0w/ipython/blob/master/books/python_data_analysis/ch06_Data%20loading.ipynb#6.1-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

R에서의 DataFrame과 같은 접근이 가능

 

ScatterPlot을 위해 matplotlib 설치는 아래 링크 참조

http://matplotlib.org/examples/shapes_and_collections/scatter_demo.html

Matplotlib import error 발생할 경우 쉘에서

sudo pip uninstall python-dateutil
sudo pip install python-dateutil==2.2

해줘야함

 

==============

import os
os.getcwd()
# '/Users/Seok/Documents/mycdlist'
os.chdir('/Users/Seok/Documents/MyPythonProject/cog1')

import numpy as np
r = np.genfromtxt('random.csv', delimiter=',', names=True)

import matplotlib.pyplot as plt

plt.scatter(r[:]['X'],r[:]['Y'],c=r[:]['Group']) # s=radius of each points
plt.show()

figure_1

RStudio에서 Github 연동

참조 : http://www.molecularecologist.com/2013/11/using-github-with-r-and-rstudio/

Git를 작년에 친구와 어플리케이션 작업을 하면서 처음 써봤었는데 상당히 인상깊었었다.

쓰다보니까, 보통 혼자 작업할때는 필요없다고 생각되도, 어떠한 작업의 history를 남기면서 진행할 수도 있고,  USB로 자료를 옮기지 않아도 클라우드 스럽게 사용할 수 있는 장점이 있어서.

아무튼 당직서면서 RStudio 책을 잠깐보다가, 찾다보니 위의 블로그에 정리가 잘 되어있어서.

포인트를 적어두면,

#1. Git Enable할때 /Git/bin/git.exe 다.  bin폴더 밖에 있는 실행파일로 하면 RStudio자체가 실행하면서 멈춰버리는 오류가 발생함

#2. 그냥 따라하면 쉽다.

El capitan에서 Tensorflow 설치시 setuptools 에러

Reference : http://stackoverflow.com/questions/33234665/upgrading-setuptools-on-osx-el-capitan
보안이슈라고 되어있다.

[경과]

Dependency 설치할 때 setuptools에서 에러가나서,
# pip install –upgrade setuptools –user python
했더니 진행되는데, 다시 설치 명령인,
# sudo pip install –upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl
이렇게 했을 떄 역시나 setuptools 부근에서 에러가 발생
그래서,

[결론]

# sudo pip install –upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl –user python 했더니 ok

R (2015.08.10)

getwd() / setwd(“…”)

구조파악하기 head() / str()

rbind : 행으로 붙이기

 

substring(sample$col,1,5)==”11270″

>> 이러면 조건을 만족하는지 여부에 대해 true/false로 나옴

sample[substring(sample$col,1,5)==”11270″,]

>> 이러면 조건을 만족하는 행만 출력됨

 

Azy.30[, c(“key”,”LN_NO”,”TOT_MDC_DDCNT_OR_EXEC_FQ”)]

>> 컬럼값을 이용해 subtable 구성

 

merge(t20, Medication, by=”key”) << inner join

merge(t20, Medication, by=”key”,

all.x = all((x에 모든 컬럼을 사용)), all.y = all 등을 이용해 outer, inner join 을 해낼 수 있음

 

 

[Python] 의사결정트리

O`Reily 의 Programming Collective Intelligence책에서 참조

 

생각보다 이 책의 소스는 매우 강력하다. 바로 활용이 가능할 정도로.

의사결정트리를 만드는 과정은 여러 행과 열로 이루어진 데이터를 통해 분류하는 작업이라고 생각하면 쉽다.

핵심은 다음과 같음.

 

재귀함수를 이용해서 모든 조건을 쪼개서 데이터를 분리한다.

예) Column A가 ‘Male’ 가 참일때, 거짓일 때 > 참일때 분리되는 데이터를 다시 재귀함수로,

Column B가 숫자나 소숫점 형식이면 5.0 이상일 때, 5.2 이상일 때 등등으로 나누어 다시 재귀함수로.

여기에서 재귀함수로 넘기기 전에 엔트로피, 또는 지니 불순도를 이용하여, gain을 구한다.

gain은 현재 분류된 데이터(여러 결과가 혼재되어있는)의  score에서 어떠한 기준점으로 나뉘어진 두 set의 score의 점수를 제외함으로서

p=float(len(set1))/len(rows)
gain=current_score-p*scoref(set1)-(1-p)*scoref(set2)
if gain>best_gain and len(set1)>0 and len(set2)>0:

위의 같은 소스를 이용하더라. 여기서 scoref가 지니불순도 또는 엔트로피 함수.

이런식으로 가지를 계속 만들어가면서 트리를 구하게 된다.

 

말로 이해한 것을 적으려니 쉽지가 않다.

아무튼 이 부분의 이해를 위해 다음과 같은 예제를 만들었고,

XYGroup
0.61.91
1.21.51
2.70.11
2.51.41
2.31.11
0.21.21
0.11.11
0.41.21
0.81.21
2.60.11
0.31.21
2.50.91
2.321
0.50.21
1.22.31
2.92.21
0.631
2.10.71
2.52.91
0.72.51
1.31.81
1.91.21
1.90.41
1.90.21
1.71.31
0.32.91
1.511
1.92.11
1.81.71
1.621
2.20.82
5.82.32
2.60.22
51.22
3.31.22
2.42.42
4.62.52
4.90.42
4.70.22
4.61.32
3.71.12
2.90.82
4.21.32
31.32
5.60.62
5.20.82
3.41.62
3.512
2.52.42
3.72.42
32.12
2.32.72
4.22.32
5.41.72
5.61.92
4.21.72
5.522
2.30.22
4.61.32
4.32.12
0.24.13
0.63.63
0.95.53
0.24.83
0.653
0.623
0.24.63
0.53.23
0.36.33
0.71.53
0.15.13
0.26.83
0.23.13
0.35.83
0.66.83
0.43.43
0.45.33
0.83.33
13.43
03.13
0.81.43
0.92.93
11.63
0.75.53
0.74.63
0.61.43
0.51.93
0.34.23
0.95.93
0.633
4.95.84
4.66.44
4.274
4.17.84
4.17.94
4.55.14
3.66.84
3.45.84
57.44
4.66.34
4.284
4.67.44
3.45.64
3.27.44
4.17.44
3.57.24
47.94
3.85.64
4.45.54
4.184
3.27.94
45.24
4.684
4.564
4.37.74
4.85.74
3.16.64
3.45.74
3.35.24
3.17.54

X,Y좌표로만 이루어져 있다.

이를 평면에 표시하면

figure_1

위의 데이터는 의사결정트리에서 아래 그림처럼 분리된다.

treeview2

소스에 준비되어있는 함수를 이용해서 표시한 결과, 그래프에서 보면 알수 있듯이,

0번 컬럼(X좌표)가 3.0이상일 때 첫 분류를 시작했으며,

참인 경우, 1번 컬럼(Y좌표)가 5.1 이상일 때 2번 그룹과 4번 그룹으로 우선적으로 분류가 이루어지게 된다.

 

내가 이해한 것이 맞는지 모르겠지만, 이런 트리를 만들었을 때의 장점은 정보가 missing된 상태에서 그 missing된 값이 어떤 것일지 예측이 가능하다는 점이다. 내 예제는 x,y뿐이었지만 만약 x,y,z,q,p 등등 여러 변수로 구성된 트리라면, z,q값이 없을 때 x,y,p로만으로 각각의 결과가 어떤 확률로 분포될 수 있는지를 알 수 있다.

단점은 아마 내 예제처럼 그 분류 수준이 너무 낮다면, 두 그룹이 혼재되어있는 좌표, 예를 들자면 2.5, 1.3 이러한 좌표를 tree에 넣었을 때, 하나의 가지로 결국 이어져 그룹이 1번이라고 나오게 되어버린다. 두 그룹 중 어디에 포함될 것인지에 대한 확률로 구할 수가 없다는 것.

어느 그룹이 될지 확률적으로 구하기 위해서는 애초에 신경망 같은 다른 알고리즘을 사용하던지, 아니면 의사결정tree에서 적절한 pruning(가지치기) = 즉 일정 threshold까지는 엔트로피를 늘림으로서(=어느 정도의 엔트로피면 그 데이터 셋을 나누지 말고 놔둠) 분류를 단순화 하는 방법이다.

treeview3figure_1

이 경우에도 문제는 존재한다. 위의 그림은 가지치기의 한 예시다. 기준을 어떻게 잡느냐에 따라 더 단순해질수도, 조금 복잡해질수도 있다.

바로 첫번째 분기에서 왼쪽(false), 왼쪽(false)으로 가는 경우. 즉 위의 좌표 그림에서 x가 처음 3.0이하, 그리고 그 다음에 1.2이하로 간 경우인데, 분명 이 경우 Y좌표를 3정도로 기준을 두면 분명 더 세부적인 분류가 가능할 것으로 생각할 수 있다. 그러나 이 경우 그룹 1이 10개, 그룹 3이 30개라는 뭉뚱그려진 결과가 나와 더 불확실한 결과를 초래할 수 있게 되어버린다.