두둥... 아빠가 되었다.

배란일에 맞춰 계획하에 처음 시도를 해봤기에 전혀 예상을 못하진 않았지만, 그래도 놀랍고 당황스러운 건 당연한거다.

 

하필 오늘 부산에서 친구가 올라와 술을 한잔 하기로 하였고,

코로나로 인해 집 앞 공원 벤치에 앉아 꽤나 긴 시간동안 수다를 떨었다.

 

오늘따라 와이프가 이상하리만큼 톡으로 "몇시쯤 들어와?", "이제 헤어져?", "바로 집와?" 질문이 많았다.

역시나 나는 전혀 눈치를 채지 못 하였고, 친구를 배웅까지 해주고 천천히 귀가 중이었다ㅋ

 

엘리베이터가 우리집 층에 위치해 있는 것이 약간은 이상하긴 했다.

호수가 두 호수 밖에 없을 뿐더러 집으로 들어가는 사람을 보지 못 했는데..

그러려니 하고 엘리베이터를 타고 집으로 들어왔다. 

 

 

안방에 처음 보던 OPEN 이라는 문구가 달려 있다.

와이프가 평소 집 꾸미는 것을 워낙 좋아하는지라 또 대수롭지 않게 말 그대로 문을 OPEN 하였다.

그랬더니 와이프가 서 있었고, 갑자기 다시 문을 닫는 것이다.

 

크게 웃으며 "아니~ 나가서 다시 열어봐라고~" 하길래, 말 그대로 다시 문을 열었다.

그 때까지만 하더라도, 아니 그러면 간판을 뒤로 해서 CLOSE를 해 놓던가.. 속으로 생각하고 있었다.

 

와이프가 또 다시 문을 밀어 닫는 것이다..

 

??

 

영문을 모른채 이번에는 힘을 약간 주어 다시 문을 열었고, 와이프는 웃겨서 눈물까지 흘리는 중이었다ㅋ

다시 기회를 줄테니 나가서 다시 열어봐라는 것이다...

 

그제서야 어라? 종이를 열어봐라는 뜻인가? 하며 열었더니... 

 

그렇게 아빠가 되었다.

주체할 수없는 행복으로 인해 와이프를 몇 번을 껴안으며 "진짜야?"만 되풀이 했던 것 같다.

 

참고로, 복곰이는 태명이다.

신기하리만큼, 4주 전쯤, 와이프, 장모님, 장인어른이 각각 태몽을 꾸었는데,

와이프 꿈에서는 하얀 곰이 저 언덕 밑에서 손을 흔들며 우리에게 다가오더니, 식탁 위로 올라가 춤을 추었고 우리 둘은 귀여워하며 박수를 쳤다고 한다. 그렇게 하여 백곰보다는 복곰이 더 귀여워 복곰으로 지었다.

 

다음날, 본래 다니던 병원으로 손을 꼭 잡고 방문하였다.

4주차라고 한다.

 

저 동그라미가 아기집이라고 하는데, 0.4cm 정도라고 하니 사실상 점이나 다름 없다.

아기집 자리도 아주 잘 잡았고 잘 크고 있을거라 하여 마음 놓고 집으로 왔다.

 

2주 뒤에 다시 방문하라는데, 그 때는 심장소리를 들을 수 있다고 하니...

하루하루가 매우 천천히 갈 듯한 느낌이다...

 

안녕하세요. 우주신 입니다.

 

 

약 3년만에 포스팅을 하네요... 일을 하다보니 포스팅을 꾸준히 못 하고 있습니다..ㅠ

오늘은 블로그에서 가장 조회수가 높은 '[R] 상관분석...' 글을 Python으로 빠르게 변환 해봤습니다.

이번 포스팅과 다음 포스팅에서는 상관분석과 회귀분석에 대해 정리해보겠습니다.

 

우리는 종종 어떤 두 사건 간의 연관성을 분석해야 할 경우가 많습니다.

둘 또는 그 이상의 변수들이 서로 관련성을 가지고 변화할 때 그 관계를 분석해야 하는데,

가장 잘 알려진 방법 중 하나가 상관분석회귀분석 입니다.

 

예를 들어, GDP와 기대수명 간의 관계, 키와 몸무게 간의 관계를 보자면,

각각 두 변수 간의 선형적 관계를 상관(Correlation)이라고 하며, 이러한 관계에 대한 분석을 상관분석(correlation analysis)라고 합니다.

 

이번 예시에서는 당뇨와 그에 영향을 미치는 변수들 간의 관계를 분석해 보죠.

먼저 데이터는 sklearn에서 제공하는 datasets을 불러왔습니다.

import pandas as pd
import numpy as np

from sklearn import datasets
data = datsets.load_diabetes()

데이터가 dictionary 형태이므로 어떤 key를 가지는지 확인해보면 아래와 같이 나오고,

여기서 data, target, feature_names 세 가지 key만 쓰겠습니다. 당연히 데이터 형태의 길이가 같은지 부터 확인해야죠.

 

여기서 target이 당뇨병의 수치이고 나머지 feature names에 속하는 age, sex, bmi 등등은 변수라고 보면 됩니다.

즉, 442명의 사람들을 상대로 10가지의 특성들을 나열한거죠.

 

우리는 bmi(체질량지수) 변수와 당뇨병의 수치(target)가 어떤 관계를 가지는지 한번 살펴봅시다.

 

1. 산점도 (Scatter plot)

먼저, 상관계수를 파악하기 전에 산점도를 그려 두 변수 간에 관련성을 시각적으로 파악할 수 있습니다.

X = df.bmi.values
Y = df.index.values

import matplotlib.pyplot as plt
plt.scatter(X, Y, alpha=0.5)
plt.title('TARGET ~ BMI')
plt.xlabel('BMI')
plt.ylabel('TARGET')
plt.show()

matplotlib에서 제공하는 scatter()를 통해 그린 결과 입니다.

대략 봤을 때 두 변수는 서로 양의 관계를 이루고 있는 것 같죠?

 

 

2. 공분산(Covariance) 및 상관계수(Correlation Coefficient)

산점도를 이용하면 두 변수간의 직선적인 관계를 대략적으로 파악은 가능하지만, 두 변수 사이의 관계를 어떠한 수치로 표현하지는 않아요. 그렇기에 우리는 두 변수 간의 관계를 수치로 표현하기 위해 공분산 및 상관계수를 이용합니다.

 

공분산은 2개의 확률변수의 상관정도를 나타내는 값인데, 만약 2 개의 변수 중 하나의 값이 상승하는 경향을 보일 때 다른 값도 상승하면 공분산의 값은 양수, 반대로 다른 값이 하강하는 경향을 보이면 공분산의 값은 음수가 나옵니다.

 

여러가지 방식으로 구할 수 있는데,

직접 식을 계산하면,

더 편하게는 numpycov()를 이용하면 되죠.

두 방법 모두 비슷한 값이 나왔고 양의 값이 나온 것을 볼 수 있죠.

 

그러나 공분산은 상관관계의 상승 혹은 하강하는 경향을 이해할 수는 있으나 2개 변수의 측정 단위의 크기에 따라 값이 달라지므로 절대적 정도를 파악하기에는 한계가 있습니다. 즉, 2.15가 어느 정도의 양의 상관관계인지를 가늠하기가 쉽지 않죠.

 

그래서 공분산을 표준화 시킨 상관계수를 보다 많이 이용합니다.

상관계수는 각 변수의 표준편차를 분모로 나눠주면 되죠.

당연히, numpy는 없는게 없죠. corrcoef() 함수를 이용하면,

상관계수는 -1에서 1 사이의 값을 가지기에 0일 경우에는 두 변수 간의 선형관계가 전혀 없다는 것을 뜻 합니다.

보통 0.3과 0.7 사이이면, 뚜렷한 양적 선형관계로 0.7과 1.0 사이는 강한 양적 선형관계로 간주한다고 합니다.

(그러나 데이터의 특성과 샘플의 대표성 등 상황에 따라 상관계수 값 자체를 해석하는데 있어 정확한 기준은 없습니다)

 

위에 나온 0.58은 BMI(체질량지수)와 당뇨병수치(Target)는 뚜렷한 양적 선형관계를 이루고 있다고 볼 수 있습니다.

 

주의할 점은 상관계수 분석 자체가 특이 값에 민감하게 반응하기 때문에 데이터 pre-processing에 항상 주의를 기울여야 합니다.

또한 상관관계는 두 변수 간의 관련성을 의미할 뿐, 원인과 결과의 방향을 알려주지는 않습니다.

 

 

3. 상관계수의 검정

상관계수 값 자체가 유의미한가를 검정할 수도 있습니다. 그 중 하나로 p-value를 많이 이용하는데,

scipy 패키지의 stats.pearsonr()을 이용하면 상관계수와 p-value를 동시에 얻을 수 있습니다.

import scipy.stats as stats
stats.pearsonr(X,Y)

뒤 결과 값이 p-value인데, 귀무가설 "상관관계가 없다"에 대한 검정 결과 p-value가 3.46e-42라는 0에 아주 매우 가까운 값이 나왔으므로 귀무가설을 기각할 수 있음을 알 수 있습니다.

 

 

4. 그 외

그냥 궁금해서 나머지 변수들도 상관계수를 확인해 봤습니다.

당뇨병수치와 가장 상관관계가 높은 것은 bmi이고 age나 sex는 큰 관련이 없는 것으로 보이네요.

 

다음 시간에는 회귀분석에 대해 다뤄보겠습니다~

안녕하세요. Bitcoin and Cryptocurrency Technology 번역본 3장 포스팅 합니다.

번역 글을 읽기 전에 번역 질과 관련하여 여기 한번 확인해주세요!


티스토리 특성상 사진은 복붙이 안 되기에 jpg 파일로 변환하여 올리는 점 양해 부탁드림다 :)



  1. d 2019.02.25 20:01

    MDA(모에다)코인은 시총 약 170억(146위)가량 되는 코인으로 P2P결제/송금 네트워크를 제공하는 코인입니다. 총 공급량이 유동공급량이라 유동성이 좋아 투자하기 좋은 코인입니다. 특히 바이낸스에서 상장되어 있고 유망코인으로 거래가 활발합니다.


안녕하세요. Bitcoin and Cryptocurrency Technology 번역본 2장 포스팅 합니다.

번역 글을 읽기 전에 번역 질과 관련하여 여기 한번 확인해주세요!


티스토리 특성상 사진은 복붙이 안 되기에 jpg 파일로 변환하여 올리는 점 양해 부탁드림다 :)





안녕하세요~ Bitcoin and Cryptocurrency Technology 번역본 1장 포스팅 합니다.

번역 글을 읽기 전에 번역 질과 관련하여 여기 한번 확인해주세요!


티스토리 특성상 사진은 복붙이 안 되기에 jpg 파일로 변환하여 올리는 점 양해 부탁드림다 :)



안녕하세요. Bitcoin and Cryptocurrency Technology 번역본 개요 포스팅 합니다.

번역 글을 읽기 전에 번역 질과 관련하여 여기 한번 확인해주세요!


티스토리 특성상 사진은 복붙이 안 되기에 jpg 파일 캡처해서 올리는 점 양해 부탁드림다.







  1. d 2019.02.25 20:01

    MDA(모에다)코인은 시총 약 170억(146위)가량 되는 코인으로 P2P결제/송금 네트워크를 제공하는 코인입니다. 총 공급량이 유동공급량이라 유동성이 좋아 투자하기 좋은 코인입니다. 특히 바이낸스에서 상장되어 있고 유망코인으로 거래가 활발합니다.


안녕하세요~ 오랜만에 글을 올립니다 :)


예전에 학교 다닐 때 가상화폐에 꽤나 관심이 많았었습니다. 

블록체인과 관련하여 공부도 해보고 봇을 만들어 아비트리지 거래도 하곤 했었는데, 

오랜만에 코인들 가격을 확인했더니 암울하네요...


가상화폐가 앞으로 어떻게 될지는 더 지켜봐야 알겠지만, 블록체인 기술만큼은 강한 믿음을 가지고 있습니다..

그렇기에 문서 정리를 하다가 학생 때 대체 과제로 비트코인 관련 서적 한권을 번역했던 적이 있습니다.


"""
Bitcoin and Cryptocurrency Technologies   


Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, Steven Goldfeder  

with a preface by Jeremy Clark 

Draft — Feb 9, 2016


"""


 프린스턴 블록체인 교재로도 유명하고 오픈소스라 많은 사람들에게 잘 알려진 책 입니다.

짧은 시간 안에 완성해야 학점을 받을 수 있었기에 미친듯이 했던 기억이 나네요.

그렇기에 절대 번역의 질이 보장 되지 않습니다;;;

중간 중간에 빠진 부분도 있을 거고 부적절한 단어 선택이 있을 수도 있습니다.

(그렇더라도 다른 곳에 공유하시거나 올리시지 마시고 개인 소장만 해주시기 바랍니다)


이 책을 처음 접하는 분들에게 조금이라도 도움이 됐으면 하는 마음에 포스팅하는 것이니 좋게 봐주세요 :)

물론 수정할 부분이 있거나 다른 피드백이 있다면 언제나 환영 입니다!!


원본 교재는 밑의 링크를 클릭하시거나 구글링 하시면 쉽게 확인할 수 있습니다.

https://lopp.net/pdf/princeton_bitcoin_book.pdf

(혹시나 저작권에 문제가 된다면 알려주시면 감사하겠습니다!)




안녕하세요. 우주신 입니다.


이번 포스팅에서는 계수정렬(Count Sort)에 대해 알아보겠습니다.


앞선 포스팅에서의 삽입, 퀵, 힙 정렬 등의 방법은 정렬할 때 두 값을 비교하며 정렬을 했다.

이를 Comparison Sort라고도 부르는데, 이와 반대로 계수정렬은 비교를 하지 않고 정렬을 하기 때문에 

Non-Comparison Sort의 방법 중 하나이다.


[4 1 3 4 3] 리스트를 정렬하면서 자세히 알아보자.



우선, 두 개의 리스트 B, C를 만들어준다. 

B는 A 리스트를 정렬하여 결과물을 넣어줄 리스트이다.

C(Counting List)의 Index는 곧 A의 요소이고, C의 값은 A의 요소들의 갯수이다.

예를 들어 A에 4가 총 몇 개 나온지는 C의 4번째 Index를 보면 알 수 있다. 

그러므로, C 리스트의 길이는 A 리스트의 값들 중 가장 큰 값이 될 것 이다.



처음에는 C를 0으로 다 초기화 해준다.



이제 A의 첫번째 요소부터 Count하며 C를 업데이트 해준다.

A의 첫번째 요소는 4이므로 C의 4번째 칸에 1을 증가 시켜준다.



A의 다음 요소는 1이므로 C의 1번째 칸에 1을 증가 시켜준다.


.

.

.



이런식으로 A의 마지막 요소까지 순회하며 C를 업데이트하면,

1이 총 1번 나왔고, 2는 0번, 3은 2번, 4는 2번 나온 것을 알 수 있다.


아직 C는 완성되지 않았다. Counting 한 C의 각 값들을 직전 값을 더해 업데이트 해야 한다. 



C의 2번째 칸은 기존 값 0과 1번째 칸의 1을 더한 1이 된다.



마찬가지로, C의 3번째 칸은 기존 값 2에서 2번째 칸의 1을 더한 3이 된다.



C의 4번째 칸은 기존 값 2에서 3번째 칸의 3을 더한 5가 된다.

드디어 C 리스트가 완성이 되었다.


이제 이 C를 가지고 정렬 해보자.


A의 역순으로 훑으며 정렬을 한다.

A의 5번째 칸은 3이 들어있고, C의 3번째 칸으로 가면 3이 있다.



C의 3번째 칸의 3이 A의 5번째 칸의 3이 위치해야할 인덱스 값이다. 

즉, 3은 B 리스트의 3번째 자리에 위치한다. 그리고 위 그림처럼 C의 3번째 값을 1 감소 시킨다.



이번에는 A의 4번째 칸의 요소를 정렬 해야 한다.

4가 들어가 있다. C의 4번째 칸을 보면 5가 있었을 것이고 (위 그림은 1 감소 시킨 그림이다)

B의 5번째 인덱스에 4를 위치 시켜준다. 마찬가지로 C의 4번째 칸의 값을 1 감소 시킨다.



A의 3번째 칸의 요소를 정렬 한다. C의 3번째 칸으로 가면 2가 있었을 것이고

B의 2번째 인덱스에 3을 위치 시키고 C의 3번째 칸의 값을 1 감소 시킨다. 



반복해서, 2번째 값을 정렬 시키고



마지막으로 첫번째 값을 정렬 시키면 정렬이 완성 되었다.



이제 코드를 보며 한번 더 복습해보자. 


여기서  A = arr  //  B = sorted_arr  //  C = count_arr 이다

03:: 정렬되지 않은 리스트 A와 A의 size를 인자로 받는다

05:: 정렬된 결과를 받을 리스트 B를 생성 한다

07:: 리스트 A의 최대값을 찾는다

14:: 리스트 A의 최대값의 크기만큼 리스트 C를 생성 하고 0으로 모두 초기화 한다

20:: A를 돌면서 A 요소의 빈도수 만큼 C의 해당 인덱스에 채워넣는다

26:: C를 업데이트 한다

32:: A를 역순으로 훑으며 C를 참고하여 정렬한다

38:: 정렬된 리스트 B를 A에 복사 했다. (선택사항)



왜 Counting Sort이고, Non-Comparison 방식인지 이해 했을 것이다.

정렬되지 않은 리스트의 값들을 Count한 후에, 이 Count된 결과를 가지고 정렬을 하기 때문에 비교가 필요 없다.


Count Sort의 시간복잡도는 O(n + k)이다.

데이터가 n일 때, A를 Count하며 C에 갯수를 업데이트 하는 데 O(n)이 걸린다.

C를 가지고 A를 역순으로 훑으며 B를 만들 때도 O(n)이 걸린다.

k는 A 리스트 중 가장 큰 값을 가리킨다. 

업데이트 된 C를 바탕으로 직전 요소 값을 현재 요소 값에 더하는 데 k번 만큼 반복해야 하며 이는 O(k)가 걸린다.


그래서 만약 A의 최대값이 매우 큰 값이라면 Count Sort는 비효율적인 알고리즘인 것을 알 수 있다.


수고하셨습니다.





# 참고 # 

 - "Introduction to Algorithm" Cormen, Charles, Ronald, Clifford

- 한양대학교, 정형수 교수님, 알고리즘 수업



'Algorithm > Sorting' 카테고리의 다른 글

[C] Countsort:: 계수정렬  (2) 2018.07.28
[C] Quicksort:: 퀵정렬  (2) 2018.06.24
[C] Heap Sort:: 힙정렬  (0) 2018.06.23
[Python] Merge Sort: 병합 정렬  (0) 2018.03.30
[Python] Insertion Sort: 삽입정렬  (1) 2018.03.29
  1. 지나가는사람 2019.07.08 17:32

    1. A를 뒤에서부터 훑으며 정렬하는 이유는 C를 카운트다운하며 B를 완성하는 상황에서 stable한 정렬을 하기 위함이다.
    2. (초보적이지만)C라는 설계도를 보고 바로 B를 완성하는 것이 아니라 번거롭게 C'를 만들어 A의 요소를 움직여 갖다 꽂는 방식으로 B를 완성하는 이유는, 정렬의 실제 목적이 숫자 정렬이 아닌 key(데이터의 색인에 사용되는 실마리) 정렬이기 때문이다.

    이 설명이 더해지면 조금 더 좋을 것 같아서 그냥 써봅니다. 저같은 초보는 이런 게 궁금했거든요ㅎㅎ
    좋은 글 고맙습니다. 덕분에 계수 정렬이 무엇인지 잘 알고 갑니다!

안녕하세요. 우주신 입니다.


이번에는 이집트 사파가(Safaga)에서 즐겼던 스노쿨링 투어에 대한 후기를 포스팅 하겠습니다.


저는 룩소르에서 하루를 보내고 푹 쉬고자 사파가에서 1박 2일 일정을 보냈습니다.

본래 다합가서 스노쿨링을 하려 했으나 그 주변에서 테러가 발생해서 사파가로 선택 했네요.

사파가는 이집트 오른쪽 끝에 홍해와 맞닿아 있는 도시 중 하나 입니다.



첫날은 그냥 해변가에서 수영하고 맥주 마시며 쉬었습니다.

더치들은 아침, 점심, 저녁으로 맥주를 한잔씩 안 하면 현기증이 오기에 어김없이 맥주부터 시켰죠..ㅋ



비수기에 가서 사람이 없던지라 오히려 더 편히 쉬었던 것 같네요.



그렇게 하루를 푹 쉬고 호텔을 통해서 사파가 스노쿨링 투어를 예약 했어요.

업체가 많지는 않아 가격이 다 비슷할거라 생각이 들어 호텔 측에서 추천한 업체에 예약 했습니다.


가격: 400파운드

시간: 09:00 ~ 17:00



아침 8시쯤 픽업이 와서 8시 30분쯤 어떤 큰 빌라에 모여 일행들을 기다렸어요.



9시 조금 넘어 큰 요트에 탑승을 하였고 비슷한 시간에 큰 요트 4대 정도가 동시에 출발 하더군요.

한 대는 학생들 수학여행 온 것 같았어요ㅋ




처음에는 Water Sport를 한다길래 어떤 것인가 했더니 바나나보트 등 다른 보트를 들고와 레저를 즐기는 거더군요.



개인적으로 매우 시시 했습니다;; 기다린 시간에 비해 타는 시간도 짧고 강도도 산책하는 기분이고..

여기서 1시간 좀 넘게 소요하고 안전한 곳으로 이동하여 다음 코스인 스노쿨링을 하러 갔습니다.



스노쿨링 하러 입수하기 전 사진 입니다.

물이 너무 맑아 들어가기 전부터 들떳던 기억이 나네요.

1시간 좀 넘게 했는데 스노쿨링은 정말 재밌었어요.


예전에 세부에서 스노쿨링을 한 적이 있었는데, 바다 안이 세부에 비해 단조로웠어요.

물고기나 산호가 알록달록하진 않았는데, 그럼에도 사람도 없고 광활해서 재밌더군요.


스노쿨링 끝나고 배 안에서 점심 먹었어요.

음식이 전반적으로 다 짜긴 했는데, 수영을 하고 나서인지 점심도 Good :)


다음 타임은 낚시 시간이었는데, 저랑 친구는 스노쿨링을 더 하고 싶어 낚시 대신 스노쿨링 했습니다.

언제 홍해에서 수영 해보겠습니까..



참고로 낚시는 낚시대를 주는게 아니라 작은 손잡이에 실을 달아서 단순하게 하는 거라 별로 재미없어요.


마지막 코스로는 작은 섬에 가서 사진 찍고 쉬다가 복귀 하는 겁니다.

오후 5시 조금 넘어 배에서 내리니 석양이 지고 있더군요.



다시 픽업 차량을 타고 호텔로 복귀해서 맥주 한잔 했습니다. 


참고로 SAKARA 맥주 너무 맛있어요..


정리하자면,

사파가에 방문할 기회가 있다면 스노쿨링은 꼭 하셔야 합니다.

가격 대비 만족했으며 스노쿨링 투어로 하루 전체를 보낼 수 있어 좋았습니다.


다만, 사파가 자체가 놀거리가 많이 없기 때문에 1박 2일 정도로 충분한 것 같으며

조금 바쁜 일정을 보내고 싶으신 분들은 룩소르나 다른 도시에서 하루를 더 보내는 것도 좋은 방안인 것 같습니다.


안전한 여행 하시길 바랍니다 ~



  1. 2019.02.26 23:22

    비밀댓글입니다

  2. 2019.02.26 23:22

    비밀댓글입니다


안녕하세요. 우주신 입니다.


저번 포스팅에 이어서 연관규칙 알고리즘의 Apriori 알고리즘에 대해 글을 쓰겠습니다.


저번 포스팅에서 연관규칙분석 개념 및 Apriori 알고리즘에 대해 알아봤으니,

이번에는 파이썬 코드를 보며 한번 더 복습해보자.

(지난 포스트의 지식을 다 안다는 전제하에 코드만 설명)


내가 테스트한 트랜잭션 데이터베이스(Transaction Database)는 아래와 같은 양식이다.

각 줄이 itemset을 구분하며, 1번 itemset은 7번 item과 14번 item으로 구성되어 있다고 보면 된다.


Apriori 알고리즘은 아래와 같은 순서로 진행된다.

1. 트랜잭션 데이터베이스를 스캔하면서 1-빈번항목집합을 구한다.

2. k-빈번항목집합을 대상으로 (k+1)-빈번항목집합을 구한다.

- Self Join과 Prune을 통해 후보(Candidate)를 구하고,
- 트랜잭션 데이터베이스를 스캔하면서 최소지지도 조건을 만족하는 후보만 도출한다.

3. 더 이상 (k+1)-빈번항목집합이 만들어지지 않을 때까지 2번 과정을 반복한다.


[메인함수]부터 보자.

193:: 파일을 실행할 때, Transaction Database(input.txt), 최소지지도(min_sup), 결과출력파일(output.txt)을 인자로 넣는다

198:: input.txt로부터 데이터를 로딩한다

200:: 빈번항목집합을 담을 set을 만들고, generate_first_frequent_set()을 통해 1-빈번항목집합을 만든다

204:: 반복문을 돌며 k-빈번항목집합을 대상으로 (k+1)-빈번항목집합을 구한다

208:: k-빈번항목집합을 대상으로 Self Join을 한다

210:: 더 이상 Self Join이 되지 않을 때는 프로그램을 종료한다

215:: Self Join 이후, Prune 과정을 거친다.

- prune() 함수 안에서 후보를 뽑고 그 후보들을 대상으로 최소지지도를 확인한 후 (k+1)-빈번항목집합까지 구한다

218:: (k+1)-빈번항목집합을 구한 후, Association Rule을 통해 지지도(Support)와 신뢰도(Confidence)를 구한다

220:: (k+1)-빈번항목집합이 생성되지 않았으면 종료하고

224:: (k+1)-빈번항목집합이 생성되었으면, frequent_set에 (k+1)-빈번항목집합을 추가하고 길이를 1 추가한다


[1-빈번항목집합을 생성하는 함수]

33:: 여기서 trxes는 전체 트랜잭션 데이터베이스를 가리킨다

34:: item_set을 딕셔너리 형태로 만들어 key = 아이템, value = 갯수로 저장한다

35:: trxes의 itemset의 item들을 방문하며

37:: item_set의 key에 없으면 value를 1로 추가하고 key가 있다면 value를 1씩 증가하며 count 한다

42:: 최소지지도 조건을 만족하지 않는 후보들은 제거하고 1-빈번항목집합을 반환한다


[최소지지도로 아이템을 거르는 함수]

53:: 인자로 받은 후보(candidate)를 바탕으로 최소지지도보다 큰 key들만 빈번항목집합(frequent_set)에 넣는다

56:: 빈번항목집합의 아이템이 하나도 없으면 종료한다


[Self Join]

78:: Self Join을 하기 위해 k-빈번항목집합을 인자로 받는다

81:: 길이가 1인 1-빈번항목집합의 경우 바로 조합이 가능하기 때문에 케이스를 나누었다

85:: 길이가 2 이상인 빈번항목집합들을 가지고 조합을 만들기 전에 중복되지 않는 모든 item을 뽑는다

92:: itertools 모듈의 combinations 함수를 이용하여 가능한 모든 조합을 만들었다


참고로 set 자료형을 쓰기 위해 아래와 같이 리스트 안의 아이템(element)들을 set으로 바꾸는 함수를 따로 만들었다


[Prune]

106:: 이전 빈번항목집합의 길이가 1일 때와 2 이상일 때 케이스를 나누어 가지치기 하였다

117:: 가지치기 원리는 Self Join한 후보들을 대상으로 각각의 itemset의 item들 중 

126:: 이전 빈번항목집합에 없는 item이 하나라도 있으면 후보에서 제외한다

135:: prune 함수에 트랜잭션 데이터베이스를 스캔하며 Count하는 기능도 함께 넣었다

142:: 최소지지도 조건에 만족하는 후보들을 대상으로 (k+1)-빈번항목집합을 반환한다


[Association Rule]

위 함수는 지지도(Support)와 신뢰도(Confidence)를 반환해준다

162:: 지지도

168:: 신뢰도


[output.txt 출력 결과]

서로 다른 두 아이템 간의 지지도(Support)와 신뢰도(Confidence)를 구하여 output.txt 파일에 저장한 결과이다.


코드를 설명하면서 다시 보니 좀 더 효율적으로 코딩할 수 있는 부분이 보이네요.

미숙한 저의 코드는 참고만 해주시고 조금이나마 도움 됐으면 싶습니다.

Full Code는 git에 올렸습니다.



수고하셨습니다.




+ Recent posts