[Python] Virtualenv 가상환경 구성하기


virtualenv를 사용하는 이유는 라이브러리가 꼬이는걸 막고 각 프로젝트별로 개발환경을 분리시키기 위함입니다.

예를 들어, 새 프로젝트에는 구버전 라이브러리를 사용해야 하는 경우 패키지를 지웠다가 설치할 필요 없이 venv를 사용합니다.


1. pip install virtualenv 로 설치

2. 프로젝트를 만들  폴더를 만듭니다.

3. 해당 폴더로 이동하여 virtualenv venv를 치면 venv 폴더가 생깁니다.

4. 가상 환경을 activate 합니다.

   cd Scripts - activate

그러면 위의 사진과 같이 (venv)가 활성화 됩니다.

이 상태에서 라이브러리를 설치하면 패키지가 가상환경에만 설치됩니다.


비활성화 하는 방법은 deactivate 입니다.

[6 시그마] 5. 개선단계 - SOP, DOE


개선(Improvement)단계에서는 분석단계에서 추출한 여러 핵심인자에 대한 개선조치를 하여 종속변수를 최적의 상태로 만드는 것이 목표이다.


핵심인자는 그 성격에 따라 다음과 같이 세 가지 형태로 구분할 수 있다.

  • 단순한 개선을 필요로 하는 단순개선인자
  • 절차를 표준화하여 개선 할 수 있는 인자
  • 실험계획법을 통해 최적조건을 도출해야 하는 복잡한 인자.

이 중 첫 번째, 단순개선인자의 예로는, A부품보다 B부품을 쓰는 것이 비용, 품질 등의 면에서 좋다면 B를 선택하는 것이다.

두번째로 절차를 표준화 함으로써 개선을 할 수 있는 경우 표준화(예를 들어 SOP(Standard Operating Procedure)를 통해 개선할 수 있다.

마지막으로 핵심인자가 서로 상호관계를 가지고 종속변수에 영향을 미치는 복잡한 경우 실험계획법(Design Of Experiment, DOE)을 이용하여 개선을 꾀한다. 실험계획법을 적용하여 실시한 실험에서 나온 데이터를 분석하면 치명적 소수인자를 가려낼 수 있다.

개선 후 종속변수의 변동으로 인해 나타나는 시그마 수준이나 COPQ(Cost Of Poor Quality)의 차이를 통해서 개선이 얼마나 성과가 있었는지 파악할 수 있다. COPQ는 개선의 효과를 금액으로 환산하는 척도이다.



실험설계 개요


실험을 계획할 때에는 고려해야 할 사항이 몇가지 있다. 

1) 랜덤화 : 실험 단위나 순서를 랜덤하게 결정하여, 순서에 의한 영향을 배제하는 방법으로 난수표 등을 이용할 수 있다.

2) 반복 : 똑같은 실험을 여러 번 하여 추정치의 불확실성을 줄여주기 위해 사용한다. 하지만 비용도 증가한다.

3) 블록화 : 대조군의 조건이 같은 경우 블록화가 필요없지만, 조건이 다르다면 블록화를 먼저 해야한다.



일원배치법 (link)


일원배치법(one-way ANOVA)이란 관심의 대싱이 되는 하나의 인자(factor)와 종속변수 또는 산출물 간의 관계를 밝히기 위해 어떻게 실험을 실행하고, 이로부터 나온 데이터를 어떻게 분석하는지 살펴보는 것이다.


1) 모수인자(fixed factor)

    인자가 고정된 경우(예를 들어 반응기의 온도가 80, 100도씨인 경우)이다. 모수인자는 고정인자라고도 부른다.

    '이 인자의 수준에 따라 반응치가 달라지는지', '반응값에 대한 최적 조건은 무엇인지'가 분석의 관심사이다.


2) 변량인자(random factor)

    예를 들어 선정된 반응 온도가 아주 많은 반응 온도 중 랜덤하게 일부 뽑힌 경우이다. 변량인자의 경우에는 각 수준(예: 온도 조건)이 기술적으로 큰 의미를 가지지 못하므로 변랑인자의 수준 간 산포의 크기와 이 추정치가 반응값의 총 분산 중에서 차지하는 비율에 대해 관심이 있다.

 

[Docker] 윈도우 10에 Docker 설치 후 Tensorflow 환경 만들기(1)


VMware의 리눅스에 도커를 설치할지 윈도우에 설치할지 고민하다가 윈도우에 설치를 하기로 했다.


Docker란 가상 머신을 어플리케이션처럼 돌릴 수 있는 환경을 말한다.

Tensorflow를 실행하기 위한 방법으로 널리 사용되며, 이미지만 탑재해서 돌리면 개발환경이 만들어지기 때문에 개발환경 구축이 매우 간편하다.


1. 우선 도커 툴박스를 다운받는다. 

     https://www.docker.com/products/docker-toolbox



2. 설치를 쭉 하고 Docker Quickstart Terminal을 실행한다.


3. 처음에 자동으로 디폴트 가상머신이 만들어진다. 새로운 도커 가상머신을 만들려면 터미널에 아래와 같이 입력한다.

  $  docker-machine create vdocker -d virtualbox     

약간의 시간이 걸린다.

docker-machine --help라고 치면 도움말을 볼 수있다.



4.  $docker-machine ls라고 치면 만들어진 도커 가상머신을 볼 수 있다.


5. $docker-machine start vdocker를 입력하여 가상머신을 실행시킨다.

    그리고 $ docker run -it -p 8888:8888 --name tensorflow gcr.io/tensorflow/tensorflow:latest-devel

   를 입력해서 텐서플로우 이미지를 받는다.

   --name으로 이미지의 이름을 지을 수 있다.


이미지 다운로드가 완료되면 자동으로 접속된다.

exit를 치면 다시 컨테이너 밖으로 나올 수 있다.

6. $ docker ps -a 를 입력하면 컨테이너 목록을 볼 수 있다.


7. 조금전에 exit를 했기때문에 Status가 exit일 것이다.

   그래서 docker restart tensorflow(컨테이너 아이디 or 이름)을 하면 접속이 가능한 상태가 된다.


8. 접속하기

   $ docker exec -it tensorflow /bin/bash



[Django] Error: Import by filename is not supported


Django 프로젝트 생성 시 Importlib 에서 

Import by filename is not supported 이런 에러가 떴었다.


인터넷을 싹싹 뒤져도 해결을 못했다.

virenv를 만들어도 안됐었다. Django를 재설치해도 안됐었다. 기존에 만들어둔 프로젝트의 runserver도 같은 에러가 발생했다.


환경변수 - 시스템 변수에 DJANGO_SETTINGS_MODULE를 삭제 했더니 정상적으로 실행이 됐다.

아마 settings.py의 경로가 잘못 잡혔던것 같다.(내가 한거 아님)


문제를 해결해 버려서 스크린샷이 없다..ㅠ

[데이터 분석] 상관분석(Correlation)과 교차 상관분석(Cross Correlation)



상관분석의 목적은 변수 간의 상관선을 파악하고, 더 나아가서는 회귀분석을 위한 변수 선택 과정이다.


입력 변수 : 출력 변수 = 독립변수 : 종속변수 = 설명 변수 : 반응변수


입력변수가 서로 독립적일 경우 독립 변수라고 할 수 있다. 

하지만 일상생활이나 공장의 데이터는 입력 변수 간에도 상관성을 가지고 있다.


이런경우에 PCA(Principal Component Analysis) : 주성분 분석을 활용하기도 한다.


상관 분석 결과는 -1에서 1사이의 값을 갖는다.

X와 Y의 상관 분석 결과 값이 1에 가까울 수록 X가 증가 할 때, Y도 증가하는 경향이 강하다는 뜻이고,

-1에 가까울수록 반대의 경향성을 나타낸다.


데이터가 시시각각 바뀌는 경우, 또는 X, Y사이에 시간차가 있는 경우는 일반적인 상관분석이 무용지물이다.


그런 경우 사용하는 것이 교차 상관분석이다.


아래의 표에서 SinX와 CosX를 보면 두 데이터의 상관성이 0.019로 매우 낮은 상관성을 가진다고 한다.

변수의 특성을 모르고 데이터를 분석하는 상황에서 이 값만 본다면 두 변수는 상관성이 없는 데이터라고 판단하기 쉽다.

하지만 변수의 특성을 안다면, 두 변수는 시간차만 있을 뿐 상관성이 매우 높을 것이라는 것을 짐작 할 수 있다.



그렇다면, 교차 상관분석을 한 후의 결과는 어떨까?

SinX에 대한 다른 데이터를 교차 상관분석 한 결과 상관성이 1로 나오는 것을 알 수 있다.


여기서는 매우 단순한 예로 삼각함수로 예를 들었지만 타임 딜레이가 있는 데이터 셋의 경우 교차 상관분석도 필요 할 수 있다는 것을 명심하자.



[엑셀 데이터 분석] 상관분석(Correlation)


엑셀의 데이터 분석기능 중에서 상관분석을 사용해보자.


아래는 공장 데이터이다.

컬럼의 상부 온도 하부 레벨과 온도 등등이 있다.

이 데이터를 선택한 데 특별한 이유는 없다.



엑셀의 데이터 - 데이터 분석을 누르면, 아래와 같은 창이 뜬다. 

그 중에서 상관분석을 선택한다.



그리고 입력 범위를 다음과 같이 4열을 선택하고 첫째행을 포함시켜 이름표로 사용한다.

출력 결과는 출력범위를 선택해도 좋고, 새로운 워크시트에 해도 된다.




그러면 상관성 분석 결과가 테이블로 나타난다. BTM Temperature와 Duct Pressure간의 상관성만 유의미해 보인다.




[엑셀 함수] NORMINV와 RAND함수로 정규분포 만들기



데이터 분석을 위해 정규분포를 임의로 만들어야 한다면


엑셀의 NORMINV와 RAND 함수를 사용해 보자.


NORMINV 설명 :


NORMINV 함수 구문에는 다음과 같은 인수가 사용됩니다.

  • probability     필수 요소입니다. 정규 분포를 따르는 확률입니다.

  • mean     필수 요소입니다. 분포의 산술 평균입니다.

  • standard_dev     필수 요소입니다. 분포의 표준 편차입니다


RAND 함수는 RAND()와 같이 사용하여 0~1사이의 난수를 발생시키는 함수이다.

아래의 =NORMIV(RAND(),1,1) 은 임의의 확률로 평균값 1을 가지고 표준편차 1을 가지는 함수를 만드는 식이다.



히스토그램으로 나타내면 다음과 같다.


만약에 일정한 군집을 이루는 데이터 셋을 만들고 싶다면,

X, Y를 위의 함수처럼 만들어주면 된다.




도움이 되셨으면 공감 한번  눌러주세요^^

[Python GUI PyQt4 vs WxPython]



Python으로 GUI Application을 만드는데에는 몇 가지 선택지가 있다.


Mobile이면 Kivy도 좋은 선택지라고 생각한다. 

Kivy는 터치가 가능한 어플리케이션을 만들기 좋고 멀티터치도 가능하다.


반면, Desktop Application을 만들거라면 PyQt4와 WxPython으로 좁혀진다.


둘 다 멋진 라이브러리이고, 만들고자하는 것의 대부분을 만족 시킬 수 있을 것이다.


나는 PyQt4를 먼저 사용해보고 WxPython으로 넘어간 케이스이다.


PyQt 이하 Qt를 사용하며 느낀점은, UI Component를 배치하는 방식이 쉽다. 복잡하고 정교하게도 가능하다. 

self.layout = QtGui.QGridLayout()
self.label_currentDB = QtGui.QLabel("Current Database : ")
self.label_currentDB.setFixedWidth(130)
self.label_newDB = QtGui.QLabel("New Database : ")
self.label_newDB.setFixedWidth(130)
self.Edit_currentDB = QtGui.QLineEdit()
self.Edit_currentDB.setFixedWidth(130)
self.Edit_currentDB.setText(ChangeDB.currentDB)
self.Edit_newDB = QtGui.QLineEdit()
self.Edit_newDB.setFixedWidth(130)
self.button_change = QtGui.QPushButton("Change")
self.button_change.clicked.connect(self.changeDB)
self.Edit_newDB.returnPressed.connect(self.changeDB)
self.button_cancel = QtGui.QPushButton("Cancel")
self.button_cancel.clicked.connect(self.close)
self.myQMenuBar = QtGui.QMenuBar(self)
self.layout.addWidget(self.label_currentDB, 0, 0, 1, 1)
self.layout.addWidget(self.label_newDB, 1, 0, 1, 1)
self.layout.addWidget(self.Edit_currentDB, 0, 1, 1, 1)
self.layout.addWidget(self.Edit_newDB, 1, 1, 1, 1)
self.layout.addWidget(self.button_change, 4, 0, 1, 1)
self.layout.addWidget(self.button_cancel, 4, 1, 1, 1)
self.setLayout(self.layout)

Wx는 느낌이 아래와 같이 Boxsizer라는 것을 사용해서 배치를 한다.
Qt도 레이아웃이라는 개념을 사용해서 레이아웃 안에 레이아웃과 같이 배치를 정교하게 할 수 있다.
vbox = wx.BoxSizer(wx.VERTICAL)
box = wx.StaticBox(panel, -1, 'Change DB')
bsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
nmbox = wx.BoxSizer(wx.HORIZONTAL)
fn = wx.StaticText(panel, -1, "Input IP :")
nmbox.Add(fn, 0, wx.ALL | wx.CENTER, 5)
self.nm1 = wx.TextCtrl(panel, -1, style=wx.ALIGN_LEFT)
nmbox.Add(self.nm1, 0, wx.ALL | wx.CENTER, 5)
bsizer.Add(nmbox, 0, wx.ALL | wx.CENTER, 10)
hbox = wx.BoxSizer(wx.HORIZONTAL)
okButton = wx.Button(panel, -1, 'Change')
hbox.Add(okButton, 0, wx.ALL | wx.LEFT, 10)
cancelButton = wx.Button(panel, -1, 'Cancel')
hbox.Add(cancelButton, 0, wx.ALL | wx.LEFT, 10)
vbox.Add(bsizer, 0, wx.ALL | wx.CENTER, 5)
vbox.Add(hbox, 0, wx.ALL | wx.CENTER, 5)
panel.SetSizer(vbox)
self.Centre()
panel.Fit()
self.Show()
okButton.Bind(wx.EVT_BUTTON, self.OnOk)
cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)

사용해본 바로는 내가 구현하고 싶은 방법으로 구현하는 데에는 Wx가 낫다고 평가하고 싶다.
Staticbox와 같은 컴포넌트나, 몇 가지 세부적인 UI 컴포넌트가 좀더 있었다.
그리고 dialog창에서 OK를 눌렀을 때 parent에서 어떻게 동작하는지 정하기도 그렇고,
Wx를 좀 더 깊게 파서 그런지 몰라도 나는 Wx가 더 풍부하게 활용 가능하다고 생각한다.

처음에 Qt를 사용할지 Wx를 사용할지 고민 많이하다가 둘다 사용해 본 바로는 Wx에 손을 들어주고 싶다.





[Python Windows Services] 파이썬으로 윈도우 서비스 만들기(2) 에러 해결

Error 1053 :  서비스가 시작이나 제어 요청에 빠르게 응답하지 않았습니다. 


서비스 파일을 작성한 후 서비스를 시작하려고 아래와 같이 커맨드를 입력하면 나타나는 에러가 있다.

이 에러를 해결하려고 정말 검색을 많이 했는데 해결방법은 생각보다 간단하다.



고급시스템 설정 - 환경변수 - 시스템 변수 - PATH에 다음과 같은 경로를 추가한다.

C:\Python27\Lib\site-packages\pywin32_system32


실제로 저런 경로가 없다면(패키지가 설치되어있지 않으면), pywin32를 설치해야한다. (pywin32-221.win-amd64-py2.7)

간혹 순서에 따라 에러가 해결되지 않는 경우가 있으므로, 맨 위로 올려준다.




Boolean Algebra의 제2 분배법칙

 

정보처리기사 시나공 책에는 해설이 되어있지않고 "이해하지 말고 그냥 외우세요."라고 되어있다.

이해가 잘 안되어 조금 더 생각해보았다.

 

A + BC = (A+B)(A+C)

일반적인 대수식에서는 성립되지 않는다.

 

하지만 참거짓의 값만 있는 Boolean Algebra에서는 성립한다.

우변을 분배법칙으로 풀면

= AA + AC + AB + BC , 여기서 AB=BA이다. 그리고 AA = A 이므로

= A(1 + C + B) + BC, 1+ C + B  = 1이므로

= A + BC 

 

 

 

+ Recent posts