2022년 5월 11일 수요일

Orange3에서 Lotto복권 특정기간 동안의 번호별 발생횟수

 앞에서 로또복권의 1등 당첨번호를 저장하였습니다(Orange3에서 LOTTO 복권 당첨결과를 받아와 저장하기) 이번에는 특정한 기간동안에 발생한 번호별 통계를 내어봤습니다.

1. 오렌지3의 캔바스에 위젯을 아래와 같이 배치하고 연결합니다.


2. File Widget을 선택하고, 앞에서 저장한 파일을 읽어들입니다.


3. Select Widget을 선택하고 801회차부터 1014회차 까지 기간을 지정합니다.

4. Python Script를 선택하고 아래 내용으로 바꾸고 [RUN] 버튼을 선택합니다.

from Orange.data import Domain, Table
import numpy as np
import Orange.data.pandas_compat as p

idf = p.pd.concat(in_data.to_pandas_dfs(), axis=1)
idf.columns = ['No','B1','B2','B3','B4','B5','B6','B7']

all_balls = {}
for i in range(1,7):
ball_ser = idf['B' +str(i)].value_counts()
for key in ball_ser.keys():
all_balls[key] = all_balls.get(key,0) + ball_ser[key]
idf = p.pd.Series(all_balls)
out_data = p.table_from_frame(idf)

5. Data Table을 선택하고 당첨번호별 발생횟수를 확인합니다.


6. Bar Plot Widget을 선택하여 확인합니다.


번호별 발생빈도가 상당 차이가 있네요.

7. 살펴보기는 Bar Plot Widget 보다 Scatter Plot Widget이 더 좋네요.


8. 참고로 Box Plot Widget을 추가하여 살펴보고 아래와같이 또는 반대로 생각하여 배팅해 보세요....


최소 20~24회 : 너무 적게 나왔으니 앞으로도 적게 나올것 같다. 아니 앞으로는 많이 나올 것 같다.
최대 38~40회: 너무 많이 나왔으니 앞으로도 또나올 것 같다. 아니 앞으로는 적게 나올 것 같다.
26회 ~ 30회 까지에 해당되는 번호는 제외하는게 좋을 것 같다. 아니 꼭 포함해야 할 것 같다.
좋은 꿈 꾸세요. 우리는 어디까지나 오렌지를 익히는게 목적이지요....


Orange3에서 LOTTO 복권 당첨결과를 받아와 저장하기

 1. 오렌지의 캔바스에 아래와같이 위젯을 배치하고 연결합니다.


2. 파이썬스크립터를 선택하고 아래내용을 복사해서 붙이고 [RUN]버튼을 선택하여 로또1등 당첨번호를 읽어 옵니다. 상당히 많은 시간이 소요되니 바람개비가 멈출때 까지 진득하니 기다리세요.
import numpy as np
import requests
from bs4 import BeautifulSoup

main_url = "https://www.dhlottery.co.kr/gameResult.do?method=byWin"
basic_url = "https://www.dhlottery.co.kr/gameResult.do?method=byWin&drwNo="

def GetLast():
resp = requests.get(main_url)
soup = BeautifulSoup(resp.text, "lxml")
result = str(soup.find("meta", {"id" : "desc", "name" : "description"})['content']) # meta
s_idx = result.find(" ")
e_idx = result.find("회")
return int(result[s_idx + 1 : e_idx])

def Crawler(s_count, e_count, fp):
for i in range(s_count , e_count + 1):
crawler_url = basic_url + str(i)
resp = requests.get(crawler_url)
soup = BeautifulSoup(resp.text, "html.parser")

text = soup.text

s_idx = text.find(" 당첨결과")
s_idx = text.find("당첨번호", s_idx) + 4
e_idx = text.find("보너스", s_idx)
num = text[s_idx:e_idx].strip().split()

s_idx = e_idx + 3
e_idx = s_idx + 3
bonus = text[s_idx:e_idx].strip()

line = str(i) + ',' + num[0] + ',' + num[1] + ',' + num[2] + ',' + num[3] + ',' +\
num[4] + ',' + num[5] + ',' + bonus
line += '\n'
fp.write(line)

istart = 1 # 시작할 차수
last = 1000 # 아래 행과 둘중에서 선택함
#last = GetLast() # 마지막 차수

fp = open('lotto_10.csv', 'w')
Crawler(istart, last, fp)
fp.close()

1회부터 1000회 까지의 내용을 읽어와서 파일로 저장하고 필요할때 불러옵니다.
 

3. 1001회차 부터 가장최근 차수는 아래와 같이 바꾸어 lotto_new.csv 로 읽어온다음

istart = 1001 # 시작할 차수
#last = 10000 # 아래 행과 둘중에서 선택함
last = GetLast() # 마지막 차수

fp = open('lotto_new.csv', 'w')
Crawler(istart, last, fp)
fp.close()

3. Concatenate Widget으로 합하여 lotto_1014.csv로 저장합니다.



2022년 5월 10일 화요일

Orange3에서 Logistic Regression 분류

0. 혼자 공부하는 머신러닝+딥러닝에 있는 fish.csv 자료를 이용하여(이곳에서 다운로드) Logistic Regression 분류를 해봅니다.

1. 오렌지의 캔바스를 아래와 같이 구성하고 


2. File Widget을 선택하여 다운받은 파일을 지정하고 >  [Reload] 버튼을 선택합니다.


3. Data Sampler Widget을 선택하여 훈련(Train)데이타(85%)와 검증(Test)데이타(15%)로 분류합니다.


4. Test Prediction 과 Data Table을 선택하여 결과를 확인합니다. 


5. Data Table에서 Feature 클라스별로 계수가 있음을 확인하시고, Test Prediction 의 왼쪽 박스에서 계산결과를 확인합니다. 가장 높은 것으로 분류합니다. 이 계수를 딥러닝에서 조절해 가면서 학습을 한다고 생각하면 편합니다.






최근접 이웃(K-Nearest Neighbors) 분류 2

1. 앞의 최근접 이웃 모델1에 Create Instance Widget을 추가하고 


2. x1 = 25, x2 = 150인 자료를 추가합니다.


3. Data Sampler Widget은 적당하게


4. Predictions Widget을 살펴보면

추가된 x1 = 15, x2 = 150을 0.4(<0.5)로 빙어로 판단했습니다. 이는 스케일의 문제입니다.

5. KNN에 Preprocess를 연결하고 표준화를 선택합니다.


6. Data Sampler Widget에서 Sample Data버튼을 수회 누르면 서 Predictions Widget을 살펴보면 Source ID가 created로 되어있는 것의 kNN 결과를 보면 0.8(>0.5)을 나타냅니다. (1 = 도미)


7. Preprocess Widget을 연결하는 방법은 2가지가 있으니 참고하십시요.







최근접 이웃(K-Nearest Neighbors) 분류 1

0. 최근접 이웃 알고리즘은 우리가 예측하려고 하는 임의의 데이터와 가장 가까운 거리의 데이터 K개를 찾아 다수결에 의해 데이터를 예측하는 방법이다.


1. 오렌지의 캔바스에 위젯을 위치시키고 연결합니다.


2. 혼자 공부하는 머신러닝+딥러닝에 있는 도미와 빙어자료를 이용하였습니다. 파이썬 스크립트를 더블크릭하고 아래 사항을 입력한다음 [RUN]버튼을 선택합다.

import numpy as np
from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable

iclass = ContinuousVariable("y")
domain = Domain([ContinuousVariable("x1"),
                 ContinuousVariable("x2")], iclass)

ix = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0,\
      31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0,\
      34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5,\
      41.0, 41.0, 9.8,  10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0,\
      12.2, 12.4, 13.0, 14.3, 15.0]
iy = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0,\
      500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0,\
      610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0,\
      714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7,\
      7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7,\
      19.9]
arr = np.column_stack((ix, iy))
target = np.concatenate((np.ones(35), np.zeros(14)))
out_data = Table.from_numpy(domain, arr, target)

3. Data Sampler 위젯에서 훈련데이터와 검증데이터로 나눔니다.


4. Test and Scode Widget에서 확인합니다.

MSE = 0 이고 R^2 = 1.0으로 매우 고무적이네요.

5. Predictions Widget을 선택하여 확인합니다.


예측도 정확합니다.




2022년 5월 9일 월요일

ROC 곡선의 이해 (Receiver Operating characteristic Curve)

 1. 오차행렬 구성

돌아서면 잊버버리는 표입니다. 예측은 양성(P), 음성(N)으로 하고, 실제결과는 맞음(T), 틀림(F)로 기억하면 쉽더군요. 부호표시는 뒤에서부터합니다.
양성이라고 예측했는데 양성으로 맞았으니(TP = A), 틀렸으면(FP)
음성이라고 예측했는데 음성으로 맞았으니(TN = B), 틀렸으면(FN)

2. 민감도(Sensitivity = Recall)
민감도는 '실제 양성 대 맞춘 양성의 비율'을 의미한다. 
위에서 실제 양성인 것은 TP와 FN이다. 양성으로 예측해서 맞췄거나 음성으로 예측했는데 틀린 경우를 합친 것이 실제 진단 결과가 양성인 것이 된다. 
그리고 여기서 맞춘 양성은 TP만 해당하므로 이를 비율로 표현한 민감도는 다음과 같이 구해진다.

3. 특이도(Specificity)
특이도는 '실제 음성 대 맞춘 음성의 비율'을 의미한다. 
위에서 실제 음성인 것은 TN과 FP이다. 음성으로 예측해서 맞췄거나 양성으로 예측했는데 틀린 경우를 합친 것이 실제 진단 결과가 음성인 경우에 속한다. 
그리고 여기서 맞춘 음성은 TN만 해당하므로 이를 비율로 표현한 특이도는 아래와 같이 계산된다.

4. ROC곡선(Receiver Operating characteristic Curve)
위양성률(1-특이도)을 x축으로, 그에 대한 실제 양성률(민감도)을 y축으로 놓고 그 좌푯값들을 이어 그래프로 표현한 것이다. 일반적으로 0.7~0.8 수준이 보통의 성능을 의미한다. 
0.8~0.9는 좋음, 0.9~1.0은 매우 좋은 성능을 보이는 모델이라 평가할 수 있다. (사족: X축은 적을수록 좋고 Y축은 클수록 좋다, 즉 같은 TP 가로로 수평선을 그렸을때 FP가 적을 수록(1<2<3 정확하겠죠, 수직선을 그은 다면 TP가 클수록(4<5<6) 정확하겠지요)
5. 정확도(Accuracy)
전체 데이터에서 모델이 옳게 판단한 비율

6. 오렌지3에서의 ROC 위젯예제,  File자료는 iris입니다.


7. Test and Score


8. Precision 정밀도(양성이라고 판단한 것중 양성의 비율 = 정밀한 의사 겠지요)

8. AUC의 의미
AUC는 'Area Under Curve'의 약자로 ROC분석을 통해 그려지는 '곡선 밑의 면적'을 의미한다.  AUC는 0.5보다 커야 하고 AUC 면적이 클수록 해당 검사모델의 정확도가 높다

9. settosa의 정확도 = 0.942


10. versicolor의 정확도 = 0.482, ROC 곡선은 왼쪽위 상단에 붙어야 정확도가 있는 모델이다.


2022년 5월 8일 일요일

오렌지3에서 ARIMA로 삼성전자 주식예측 해보기

 오렌지를 이용한 머신러닝으로 들어가기전의 마지막 단계로 ARIMA 시계열분석을 해봅니다. 저는 통계전문가가 아니어서 자세한 내용설명은 못해드리고 구현만 해봅니다.

1. 오렌지에 위젯을 아래와 같이 배치 합니다.


2. Yahoo Finance 위젯을 더블크릭하고 Ticker 드롭박스에 삼성전자의 종목번호를 입력합니다. 뒤에 .KS를 붙이시면 됩니다. 국내에서 사용하는 종목번호+ .KS 입니다. 삼성전자 = 005930.KS, LG화학 = 051910.KS등 입니다. 처음에는 Ticker에 있는 것을 선택할 줄만 알았지 키보드로 입력해도 되는 줄 모르고 삽질 좀 했습니다.

3. Data Table 위젯에서 어제의 종가까지 불러왔음을 확인합니다.


4. Select Rows 위젯을 더블크릭하여 어제 자료를 제외하고 선택합니다. 이는 예측을 해보고 예측된 값을 비교하기 위해섭니다( 훈련데이터와 시험데이터로 구분하는 것이지요)
 

4. 그래프를 그려서 확인해보면 추세가 있네요. 추세를 제거하기위해 Difference 위젯으로 처리하고

5. Correlogram에서 결과를 확인해봅니다. 95% 신뢰구간에 들어왔네요.

6. Line Chart 위젯을 하나 추가하여 결과를 확인할 수 도 있습니다. (위 캔바스 전체 이미지에는 빠짐, 추가하려면 Correlegram에 연결). 추세가 없어졌슴을 확인합니다.
그래프를 2개 나오게 하려면 Add plot 버튼을 선택하면 됩니다.

5. ARIMA Model 위젯의 설정은 아래와 같습니니다.

6. Model Evaution 위젯을 더블크릭하여 RMSE 와 R^2(결정계수) 확인합니다. 믿을만 하지 못하네요.


(1)은 교차검정방법이고 (2)는 샘플링방법입니다.

7. Line Chart 위젯에서 확인합니다.


8. 예측된 결과입니다. FOMC 영향을 받은 것을 고려하면..... 실제 5월6일 조정종가는 66500원 인것과 비교해보십시요. 

2022년 5월 7일 토요일

오렌지3에서 한국 Wikipedia에서 검색한 자료를 이용한 Word Cloud

 오렌지3에서 간단하게 Wikiprdia 자료를 읽어 Word Cloud를 해봅니다. 오렌지 예전버전에는 Text Mining에 Wikipedia 자료를 읽어 올 수 있는 위젯이 있었는데 3버전에서는 없어졌네요. 오렌지를 사용하지 않고는 이처럼 환경설정이 복잡해요.

1. 위젯을 아래와 같이 배치합니다.


2. 파이썬스크립트를 아래와 같이 수정하고 [RUN]버튼을 선택합니다.

import Orange.data.pandas_compat as p
import orangecontrib.text.wikipedia_api as wiki
api = wiki.WikipediaAPI()
corpus = api.search('ko',['이재명', '변호사'])

out_object = corpus

위키피디아에서 자료를 검색해 읽어오는데 상당히 긴시간이 소요되네요. 바람개비가 멈출대까지 기다리세요.

3. 데이타테이블위젯에서 첫행을 선택하고 


3. Save Data 위젯을 선택하여  적당한 폴더를 만들고 그곳에 저장합니다.(저는 폴더 이름을 doc라고 했습니다) 

4. 파인더(맥), 탐색기(윈도우)를 이용하여 해당파일의 확장자를 .txt라고 바꾸어 주고 앞부분과 뒷부분의 불필요한 내용은 삭제를 합니다.

5. Import Documents 위젯을 선택하여 파일을 저장한 폴더를 선택합니다.


6. Corpus Viewer를 선택하여 내용을 확인합니다.


7. Preprocess Text를 선택하여 아래 그림과 같이 Tokenization 과 Filtering을 추가한후 설정을 합니다. 제외문자는 텍스트에디터(맥) 노트패드(윈도우)등으로 아래와 같이 작성하여 저장해둡니다(저는 doc폴더에 저장하였습니다).

 

8. Word Cloud를 선택하여 내용을 확인합니다.

오렌지3에서의 시계열분석 (Time-series Analysis) ARIMA

 1. 시계열분석

시간에 따라 변화되는 자료의 패턴을 밝혀 가까운 미래를 예측하는 방법이다. 시계열분석을 위해서는 시계열 데이터가 준비돼야 한다. 시간의 경과만 한 축(𝑥)을 구성하는 것이 아니라 시간 경과가 일정한 시차로 정돈되어 있을 때 이를 시계열 데이터로 본다.

2. 시계열분석 모형

시계열분석은 기본적으로 선형 예측을 전제로 한다. 시간을 가로축에 놓은 회귀분석이라고 할 수 있다. 뚜렷한 상관관계를 바탕으로 하는 선형 회귀분석은 미래는 과거를 닮는다는 전제를 바탕으로 시계열분석으로 응용되었다.

<파이썬을 활용한 데이터분석 사례, 심사평가원>

3. 작성중...


델파이의 부활(Antigravity와의 만남)?

 델파이 프로그램을 사용하여 개인적으로 필요한 프로그램을 생성해 왔는데, 얼마전부터 파이썬으로 옮겨갔다.  그런데 Google 의 Antigravity를 만나고 나서 델파이에 대한 미련을 버리지 못해  제미나이가 Delphi이에 대한 학습도 엄청 했을...