2022년 4월 30일 토요일

Orange3에서 간단하게 데이터 입력하기 완결판...

 이곳 Orange3의 Python Script 활용하여 데이터 조작하기 보다 더욱 간단하게 데이터를 입력하거나 중간에 조작하는 쉬운 방법이 있습니다.


1. Python Script와 Edit Domain을 오렌지 캔바스(워크플레어)에 올려 놓고, 파이썬 스크립트를 아래와 같이

import numpy as np
from Orange.data import Domain, Table
X = np.array([[1,2,3,4,5]]).reshape(-1,1)
Y = np.array([1,2,3,4,5])
out_data = Table.from_numpy(None, X, Y)

2. 작성합니다. 오렌지의 테이블은 domain, X, Y, Metas으로 접근이 가능합니다. feature 는 Table.X로 접근이 가능하고 taget 또는 class는 Table.Y로 접근이 가능합니다. 예를 들면 in_data.X[:5] 과 같이요.

참고로 파이썬 스크립트를 사용하지 않으려면 Create Table 위젯을 이용하여 20 행의 자료는 만들수 있습니니다. 이경우에는 Select Column위젯을 이용하여 target 컬럼을 지정해 주어야 합니다.

3. Edit Domain을 더블크릭한 후 

와 같이 수정합니다. 명목자료도 쉽게 작성할 수 있습니다. 이것은 스크립트에서 Domain() 함수를 위해 작성하여야 하지만 위젯을 이용하면 쉽게 할 수 있습니다.

4. Data Table을 확인하십시요.

! 자꾸 이렇게 쉬운방법(주관식이 아닌 객관식방법을 찾는 것은 제가 55년생이라 기억이 가물가물해서...


2022년 4월 29일 금요일

Orange3 기본제공 데이터 저장 위치

 맥을 기준으로 설명합니다. 

오렌지가 정상설치되고(이곳 참조하여 설치) 또한 VSCode가 설치되어 있는 환경입니다.

VSCode 에서 .ipynb 파일을 생성한다음 

Kernel을 위에서 만든 orange3라는 가상환경상의 Python 인터프리터로 지정하여주십시요

아래와 같이 작성하고 Shift+Enter 하면 정상적으로 'iris'라는 파일을 가져옵니다.

import Orange
data = Orange.data.Table('iris')
data

이번에는 

import Orange
data = Orange.data.Table('lenses')
data

라고 하면 당연히 못가져오겠지요.

오렌지 캔바스를 아래와 같이 구성한 다음

Datasets위젯을 더블크릭한후 Lenses를 불러온후

Save Data 위젯을 더블크릭하고


[Save as ...] 하여 "iris"가 있던 위치에 저장해 두면 앞으로는(온라인이 아닌상태에서도) VSCode에서도 불러올 수 있습니다. 물론 파일을 다운받아 놓고 그곳의 위치를 직접지정해도 됩니다. 

"iris"가 있던 위치는 아래와 같은 방법으로 알 수 있습니다. File위젯을 오렌지 캔바스에 올려놓고 더블크릭한 후


[Browse documentation datasets] 버튼을 크릭한후 아래화면에서 CMD + Up 하여 바로위 폴더로 이동한 후 dataset 폴더를 사이드바의 Favorites로 드래그&드롭해 놓으면 앞으로 쉽게 찾아 갈 수 있습니다.

저는 한술 더떠서 파인더를 열고 


하여 가상본을 하나 만들고 그놈을 Favorites에 지정하고 이름바꾸기를 하여 "Orange3_datasets" 라고 해놓고 필요할 때 수시로 찾아갑니다. 

왜! 이렇게 복잡하게 하지! 하고 궁궁해 하시겠지만,  VSCode에서 오렌지를 불러서 작업하는데 메뉴얼과 똑같이 할 수 있어서입니다. 저의 맥에서는 

/Users/jglee/opt/miniconda3/envs/orange3/lib/python3.8/site-packages/Orange/datasets

입니다. 골목길 찾아가려면 대게 길어요...






Orange3로 통계강의 따라하기 05 (비율검정 카이제곱 chi2)

 Orange3를 엘리쌤과 인공지능에서 알게된후 Python 기초 통계를 공부하면서 최대한 Orange3로 따라하면서 통계도 공부하고, 오렌지도 공부하고 덩달아 파이썬도 익히는 시간을 갖기로 하였습니다.

섹션: 카이제곱(chi2)을 오렌지로 따라해봅니다.

1. 데이터는 아래와 같은 형태로 housetasks.tab 이것을 다운로드하고, 오렌지의 캔바스를 아래와 같이 배치하고 연결합니다.


2. File Widget으로 다운받은 파일을 불러오고, Python Widget을 더블크릭하고 아래 내용을 복사하여 붙여넣기 합니다.

import Orange.data.pandas_compat as p
idf = p.pd.concat(in_data.to_pandas_dfs(), axis=1)
import scipy.stats as ss
print(ss.chi2_contingency(idf))


[RUN]버튼을 선택하여 결과를 확인합니다.


(1944.4561959955277, 0.0, 36, .....) 검정통계량(독립성 검정), p-value, dof(자유도=(12-1)*(4-1))


귀무가설을 기각하고 대립가설을 채택합니다. 가사는 작업구성과 차이가 있습니다.

2. 카이제곱 검정은 카이제곱 독립성(동질성) 검정과 적합도 검정 2개로 구분되네요( https://www.jmp.com 이하 이곳에서 가져옴)

3. 카이제곱 독립성 검정은 두 변수가 관련될 가능성 여부를 확인합니다. 여기에 범주형 또는 명목형 변수 2개에 대한 개수 값이 있습니다. 또한 두 변수가 관련이 없다고 가정합니다. 검정을 통해 이러한 가정이 타당한지 여부를 판정할 수 있습니다.

  • 영화 장르가 첫 번째 변수입니다. 두 번째 변수는 장르별로 관객들이 영화관에서 간식류를 구입했는지 여부입니다. 기본 전제(또는 통계 용어로 귀무가설)는 영화 장르와 관람객들의 간식류 구입 여부 사이에는 관련성이 없다는 것입니다. 영화관 사장은 영화관에 간식류 비축량을 추정하려고 합니다. 영화 장류와 간식류 구매 간에 관련이 없는 경우, 영화 장르가 간식류 판매에 영향을 미칠 경우보다 더 간단히 추정할 수 있습니다.

4. 카이제곱 적합도 검정은 표본 데이터가 특정 이론적 분포에서 추출된 것인지 여부를 확인합니다. 여러 데이터 값들이 표집된 집합이 있고 데이터 값의 분포 양상에 대한 가정이 내려져 있습니다. 카이제곱 적합도 검정은 데이터 값이 가정에 "충분히" 적합한지 또는 가정에 의문점이 있는지 판별하는 방법을 제공합니다.

  • 각 봉지마다 캔디가 100개씩 들어있고 5가지 맛 캔디가 고르게 담겨있는 캔디 봉지 10개 가 있습니다. 각 봉지에 맛별로 동일한 개수의 캔디가 들어 있습니다. 검정하려는 가설은 봉지마다 담긴 5가지 맛의 비율이 같다는 것입니다.

5. 오렌지의 데이터세트에 있는 타니타닉생존자 자료에서 남녀간의 생존여부의 차이가 있는지 카이제곱검정을 해봅니다.


6. Datasets위젯을 더블크릭하여  Titanic을 선택합니다.



6. Data Table위젯을 더블크릭하여 데이타의 구조를 살펴봅니다.


 7. Sieve Diagram(채 다이아그램)위젯을 오렌지 캔바스에 놓고 Datasets와 연결하고 더블크릭한후 아래와 같이 선택합니다.


8. 자료의 갯수가 2201개이고, 카이제곱검정값이  456.87이며, 피값은 0.05 이하입니다. 귀무가설을 기각하고 생존율은 성별에 유의하다고 판정합니다.  4개의 사각형 크기가 다르지요. 사각형 크기는 기대값이고 사각형안의 채(그리드, 그물)의 촘촘함은 관측치입니다.

성별에서 여성의 사각형이 적은 것은 탑승자중 여성의 비율이 낮은것이고, 파란사각형 안의 채(그리드)가 촘촘 한것은 실제 관특치가 많은 것을 보여줍니다. 반대로 남성의 탑승자는 많으나 위 빨강위처럼 채가 듬성듬성한 것은 생존자가 기대값보다 매우 적었다고 해석합니다.

2022년 4월 28일 목요일

Orange3로 통계강의 따라하기 04 (일원분산분석 Anova)

   Orange3를 엘리쌤과 인공지능에서 알게된후 Python 기초 통계를 공부하면서 최대한 Orange3로 따라하면서 통계도 공부하고, 오렌지도 공부하고 덩달아 파이썬도 익히는 시간을 갖기로 하였습니다.

섹션: 일원분산분석(Anova)을 오렌지로 따라해봅니다.

1. 인터넷상의 자료의 URL을 복사합니다. 다운 받은 다음 불러와도 됩니다. PlantGrowth.csv   이 자료에서 group 요인은 수준이 ctrl, trt1, trt2 세 개. 다시 말해 세 집단을 비교하는 것입니다.


2. 오렌지의 캔바스는 아래와 같이 파일과 박스플롯을 배치합니다. 

3. 파일 위젯의 URL에 붙여넣기하고 [Reload] 버튼을 선택합니다.
4. 박스플롯위젯을 선택하고 Variable = weight, Subgroup = group을 선택하고 오른쪽 화면에서 결과를 확입합니다. p값이 0.016으로 유의수준 0.05보다 적으므로 세집단간(요인간)에는 유의미한 차이가 있다고 판정합니다.

5. 데이터의 요인내 일관성이 있는지를 살펴보기위하여 Silhouette Plot위젯을 연결하여 결과를 확인하니 trt1에 2개의 자료가 특이하군요.
6. 해서 정규성검증을 해봅니다. 파이썬스크립트를 캔바스에 놓고 연결을 합니다. (2번째 요인만 확인 합니다)


import pandas as pd
from Orange.data.pandas_compat import table_from_frame,table_to_frame
import scipy.stats as ss
df = pd.concat(in_data.to_pandas_dfs(), axis=1)
trt1 = df.weight[df['group']==1]
print(ss.shapiro(trt1))


Running script:

ShapiroResult(statistic=0.9304108619689941, pvalue=0.451945960521698)


7. p값이 0.45 입니다. 귀무가설을 채택합니다. 즉 자료가 정규성을 크게 벗어났다고 보기 어렵다.


8. 등분산성은 파이썬스크립트를 이용해 아래의 코드로 확인 할 수 있습니다.

레빈 검증과 바틀렛 검증의 코드입니다.

scipy.stats.levene(
    idf.weight[df.group == 0],
    idf.weight[df.group == 1], df.weight[df.group == 2] )     
scipy.stats.bartlett(
    idf.weight[df.group == 0],
    idf.weight[df.group == 1], df.weight[df.group == 2] )




 

Orange3로 통계강의 따라하기 03 (단일표본, 독립표본 t-test의 논리)

   Orange3를 엘리쌤과 인공지능에서 알게된후 Python 기초 통계를 공부하면서 최대한 Orange3로 따라하면서 통계도 공부하고, 오렌지도 공부하고 덩달아 파이썬도 익히는 시간을 갖기로 하였습니다.

1.0 단일표본 t-test


1.1 Crate Table Widget

1.2 Edit Domain Widget

1.3 distributions widget
1.4 Python Script

Ttest_1sampResult(statistic=array([-1.07107994]), pvalue=array([0.31201445]))

평균이 90이다.


2.0 독립표본 t-test

2.1 두 집단 dat_M dat_F가 있음

dat_M = [117, 108, 105, 89, 101, 93, 96, 108, 108, 94, 93, 112, 92, 91, 100, 96, 120, 86, 96, 95]
dat_F = [121, 101, 102, 114, 103, 105, 101, 131, 96, 109, 109, 113, 115, 94, 108, 96, 110, 112, 120, 100]

2.2  두 집단의 평균 차이가 통계적으로 유의미한지 t-검증

import scipy.stats

scipy.stats.ttest_ind(dat_M, dat_F, equal_var=False)
Ttest_indResult(statistic=-2.670573872669349, pvalue=0.01108318824471652)

2.3. 파이썬에서는 [2]와 같이 하면 p값이 0.05 보다 적으므로 귀무가설을 기각하여 두 집단간의 차이는 유의미 하다고 판단합니다. 오렌지에서는 할 수 있는 위젯이 없는 것 같더군요.

3.0 이번에는 오렌지에서 파이썬스크립트를 이용합니다. 아래 그림과 같이 위젯을 배치&연결합니다.



3.1 Create Table

3.2 스크립터에 아래와 같이 입력합니다.

import pandas as pd
from Orange.data.pandas_compat import table_from_frame,table_to_frame

df = table_to_frame(in_data)
df = df.stack().reset_index()
out_data = table_from_frame(df)


3.3 Data Table에서 컬럼단위 데이터가 스택되었슴을 확인합니다.




3.4. Distributions widget에서 비교합니다.


3.5 Box Plot Widget . p값이 0.05보다 적네요. 그런데 계산값이 조금 차이가나네요. 공분산 때문인 것 같네요.


 


Orange3로 통계강의 따라하기 02 (평균, 표준편차, 분산, 사분위간 범위)

  Orange3를 엘리쌤과 인공지능에서 알게된후 Python 기초 통계를 공부하면서 최대한 Orange3로 따라하면서 통계도 공부하고, 오렌지도 공부하고 덩달아 파이썬도 익히는 시간을 갖기로 하였습니다.

섹션3~4 평균, 표준편차, 분산, 사분위간 범위를 오렌지로 따라해봅니다.

x = [1, 1, 2, 3, 3, 3, 4, 5, 5, 7]

1. 이번에는 구글시트를 이용하여 자료를 입력하고 가져오기를 합니다. File 위젯을 사용합니다. 크롬 익스플러에서 새탭을 연다음 아래 그림처럼 1, 2, 3 하여 스프레드시트를 열어 데이터를 입력합니다.


2. 공유를 선택합니다.

3. 링크를 생성하고 복사합니다.

4. 오렌지에서 Google Sheets 또는 File 위젯을 캔바스에 떨구고> 복사한 URL을 붙여넣기합니다.

5. Box plot 위젯을 캔바스에 떨구고 연결한다음 

6. 더블크릭하여 결과를 확인합니다.

7. 평균: 3.40, 표준편차: 1.8, 최소값: 1, 최대값: 7, 중위수: 3, 1Q: 2.50, 3Q: 4.50, 범위(IQR * 1.5)를 확인.



Orange3로 통계강의 따라하기 01 (도수분포표와 히스토그램)

 Orange3를 엘리쌤과 인공지능에서 알게된후 Python 기초 통계를 공부하면서 최대한 Orange3로 따라하면서 통계도 공부하고, 오렌지도 공부하고 덩달아 파이썬도 익히는 시간을 갖기로 하였습니다.

섹션2 도수분포표와 히스토그램을 오렌지로 따라해봅니다.

0. 데이터를 오렌지에 입력하는 방법은 인터넷환경에서 구글시트, 로칼컴퓨터에서 텍스트에디터, 오렌지에서 파이썬스크립위젯, 오렌지에서 Create Table 위젯을 사용 할 수 있겠네요. Create Table 위젯을 사용해봅니다. 혹시   Create Table 위젯이 안보이시면 [Options > Add Ones...] 한 후 아래와 같이 설치하시면 됩니다.


I. 범주 변수 
blood = ['A', 'A', 'A', 'B', 'B', 'AB', 'O']
1. Create Table을 캔바스에 올려놓고 더블크릭한 후 아래와 같이 입력합니다.

2. Distributions 위젯을 캔바스에 올려 놓고 > 연결하고 > 더블크릭하면 아래와 같은 결과를 볼 수 있습니다.  
3. 특성(속성, feature) 이름이 "1"로되어 있어 눈에 거슬리면 Edit Domain 위젯을 중간에 삽입하고 아래 그림처럼 변수이름을 바꾸어 주면 됩니다.
4. 최종 결과입니다. (왜이렇게 복잡하게 하냐구요? 오렌지의 위젯을 익힐 수 있잖아요.)

II. 연속 변수
x = [1, 1, 1, 2, 3, 5, 5, 7, 8, 9]
1. 위와 같은 방법으로 하면 이렇게

2. 교제에서는 범주로 나누었는데 이것은 조금 어렵겠네요. 아래와 같이 Preprocess 위젯을 중간에 삽입하고
3. Discretize Continuous Variables를 선택한다음 구간을 4으로 나누면 

4. 결과가 아래와 같습니다.

2022년 4월 26일 화요일

파이썬스크립트 위젯에서 만든 데이터가 Metas로만 읽힐때

앞의 방법으로 파이썬스크립트로 조작한 데이터가 Metas로만 읽힐때는, 당연히 바꾸어 줄 수 있습니다.

Select Columns Widget을 중간에 Insert 한후에 

을 이렇게 바꾸어 주면 됩니다.



Orange3의 Python Script 활용하여 데이터 조작하기

 매일 파이썬코딩을 하는 사람이 아니면 머신러닝을 Orange3로 학습하면 좋겠다는 생각입니다. 그런데 오렌지의 위젯은 정해진 틀에서 작동하므로 유연성이 부족합니다. 그래서 조금만 깊게 들어가면 파이썬의 도움이 필요하다는 생각입니다. 오렌지에서는 이것을 쉽게 해결해줄 수 있는 방법이 있는데 Python Script가 있습니다.(파이스크립트는 3.32 기준으로 Transform에 있음)

아래에서 파이썬스크립트를 활용하는 방법을 살펴봅니다.

0. 환경 만들기

    0.1 miniConda를 설치합니다. https://docs.conda.io/en/latest/miniconda.html#

    0.2 VSCode를 설치합니다. https://code.visualstudio.com/

1. 미니콘다가 설치되어 있으면 오렌지3 가상환경을 만들고 액티브합니다.

    $명령어창(윈도우)에서(맥은 터미널) $conda env list 명령을 실행하여 현재 가상환경을 살펴보고 없으면 orange3라는 가상환경을 만듭니다

    $ conda create -n orange3 python=3.8.13  #타임시리즈 위젯사용을 위해 구버전 설치

    $ conda activate orange3 #orange3 가상환경으로 이동합니다.

    (orange3) C:\user\gilson>_   #orange3 가상환경으로 들어 왔습니다.(윈도우)

    (orange3) $ pip list # 또는 conda list #현재 설치되어 있는 package를 살펴봅니다.

    (orange3) $ pip install scipy==1.7.3 #타임시리즈 위젯사용을 위해 구버전 설치

    (orange3) $ pip install orange3==3.32 #2022년04월26일 현재 최신버전

    (orange3) $ orange-canvas& (윈도우에서는 & 대신 ";"을 또는 필요없음)

    (orange3) $ code . 

만약 vscode가 실행이 안되면 맥은 VSCode 설정에서 "shell command" 설정을 하면 되고, 윈도우에서는 path설정이 제대로 되었는지 확인합니다.

이제 오렌지3와 VSCode를 같이 실행할 수 있습니다. 굳이 VSCode를 같이 실행하는 이유는 오렌지의 파이썬스크립트가 AutoComplete 기능과 Code Insight 기능이 없어서입니다. 아래 이미지를 참조하여 보십시요.

2. 오렌지의 파이썬 스크립트 활용

2.1 오렌지3를 실행하고 > 파이썬스크립트 위젯을 캔바스에 드롭하고 > 파이썬스크립트 위젯을 더블크릭합니다.

2.2 VSCode에서 exam.ipynb 파일을 만든 다음 > Kernel을 지정하라고 하면
    위와 같이 orange3의 가상환경의 python 인터프리터를 지정합니다. 
    제대로 되었는지는 아래 그림과 같이 확인 할 수 있습니다.

2.3 스크립트의 내용을 복사하여 VSCode에 붙여 넣습니다. 그리고 이미있는 내용을 참조하여 파이썬 코드를 작성하고 컨트롤+리턴키로 셀을 실행하여 결과를 확인합니다. 
2.4 원하는 결과가 나오면 셀내용을 복사하여 오렌지3의 파이썬 스크립트 에디터에 붙여넣기하고 스크립트 왼쪽아래의 [런버튼]을 크릭하여 실행합니다. 아래그림을 확인해보세요.
2.5 이와 같은 변환은 자주하기 때문에 이 형식을 저장하여 두었다가 사용하면 좋겠지요. 파이썬 스크립트 화면에서 아래 그림과 같이 하여 저장해 둘 수 있습니다.

2.6 당연히 불러오기도 됩니다.
2.7 Update 버튼을 크릭하면 스크립트 내용을 바꿀 수 있겠죠.

3. 넘파이보다는 판다스사용이 좋으시면 이렇게 하면 됩니다. 이번에는 입력데이타가 있는경우입니다.
3.1 VSCode에서 실행하고 결과를 확인합니다.
3.2 코드보기

import Orange.data.pandas_compat as p
# 오렌지의 in_data를 가상으로 만들어 줍니다.
# 오렌지에 붙여 넣기 한 후에는 실행이 안되게 합니다.
idf = p.pd.DataFrame({'x': [1,2,3,4,5],'y': [1,2,3,4,5]})
in_data = p.table_from_frame(idf)
# 아랫부분이 오렌지에서 실행됩니다.
idf = p.pd.concat(in_data.to_pandas_dfs(), axis=1)
idf = idf[:3] # 이런방법으로 pandas를 활용하면 됩니다.
out_data = p.table_from_frame(idf)

3.3 역시 자주 사용되는 형식이므로 저장하여두겠습니다.
3.3 저장할때 한글이 들어가있으면 별도의 에디터프로그램에서 .py 파일을 불러온다음 utf-8로 저장하여야 정상으로 읽어옵니다.

4. VSCode를 사용하지 않고 idle를 사용할 수도 있다. 다만 idle은 conda의 orange3 가상환경에 있는 idle을 실행해주어야 Orange.data.pandas_conpat 를 import 할 수 있습니다.
저같은 경우에는 
C:\Users\gilso\.conda\envs\orange3\Scripts\idle.exe
에 있습니다. (맥에서는 곧바로 실행이 되는데 윈도우에서는 다른곳의 idle이 실행이 되는군요. 아마도 패스문제 이겠지요. 그래도 가상환경내의 실행파일이 실행되야 맞지않나...

5. feature 와 target으로 분리하려면 아래와 같이하면 됩니다.

import numpy as np

from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable


x1 = DiscreteVariable("size", ["small", "big"])

x2 = ContinuousVariable("height")

x3 = DiscreteVariable("shape", ["circle", "square", "oval"])

y1 = ContinuousVariable("speed")


domain = Domain([x1, x2, x3], y1)


X = np.array([[1, 3.4, 0], [0, 2.7, 2], [1, 1.4, 1]])

Y = np.array([42.0, 52.2, 13.4])


out_data = Table(domain, X, Y)

 
6. 참고로 파이썬스크립트에서 Table변수 다룰때 스트링으로 고친다음 인티져로 고쳐야 하는 경우가 있음. 
    print(num+1)!=print(int(num)+1), print(num+1) == print(int(str(num))+1)임.
! 2022.04.28 01:40 수정함(5번을 추가하였습니다)

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.