apriori 알고리즘을 사용하기 위해서는 다음과 같은 구조로 데이터셋이 되어야 한다.
dataset = [
['아메리카노', '카페라떼'],
['카페라떼', '아메리카노', '카푸치노'],
['바닐라라떼', '아메리카노'],
...
]
DBMS에 이런식으로 데이터가 저장되어 있을리가 만무하다. 전처리를 위해 어떻게 처리하면 좋을지 이전 포스팅에 추가해두었다.
https://blog.naver.com/varkiry05/221724021065
여기서는 샘플을 만들어 진행하고자 한다.
데이터셋 샘플 만들기
dataset = [
['아메리카노', '카페라떼'],
['카페라떼', '아메리카노', '카푸치노'],
['바닐라라떼', '아메리카노'],
['녹차라떼', '카페라떼', '아메리카노'],
['카페모카', '아메리카노'],
['아메리카노', '카페라떼'],
['초콜릿', '아메리카노'],
['아메리카노'],
['카페모카', '카페라떼']
]
pandas, mlxtend 패키지를 로드한다
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
학습 시작
te = TransactionEncoder()
te_result = te.fit(dataset).transform(dataset)
te_result 결과를 보면 다음과 같다.
이것을 보기 좋게 데이터프레임으로 넣는다
데이터를 보면 모든 상품이 컬럼명으로 들어가있고, 각 row마다 포함된 상품에 True 를 반환한다.
인덱스 0(첫번째)줄을 보면 아메리카노와 카페라떼를 구매했기 때문에 두개의 컬럼에만 True 되어있다.
이제 apriori 알고리즘을 사용해보자
itemset = apriori(df, use_colnames=True)
itemset
특별히 옵션을 주지 않으면 기본 지지도(support)는 0.5로 설정된다. 이번에는 옵션을 넣어 지지도를 좀더 낮춰본다.
itemset = apriori(df, min_support=0.1, use_colnames=True)
itemset
아메리카노를 제외하면 지지도가 대부분 낮다.
실제 데이터를 돌렸을땐 이보다 더 낮은 지지도를 형성하는 경우가 많았다.
심할때는 옵션에 support 를 0.001 을 주기도 했다.
이제 신뢰도를 확인하자
min_threshold 의 기본값은 0.8 이다.
그런데 위에서 지지도가 낮은것을 억지로 보이게 했으니 신뢰도도 상대적으로 낮게 설정해야 목록이 좀 보인다.
from mlxtend.frequent_patterns import association_rules
association_rules(itemset, metric="confidence", min_threshold=0.1)
min_threshold 를 0.1 로 설정한 경우
min_threshold 를 기본값(0.8)으로 둘 경우
lift(향상도) 수치가 1보다 큰것들이 있는데, 1보다 클수록 우연히 일어나지 않았다는 표시다. 아무런 관계가 없다면 1로 표시된다.
위의 표를 해석해보자면 아메리카노를 구매할 때 초콜릿이나 바닐라라떼, 카페모카 등을 구매하는 경우가 있고 셋의 신뢰도(confidence)가 0.1818로 같다.
- 아메리카노 - 바닐라라떼: 0.1818
- 아메리카노- 초콜릿: 0.1818
- 아메리카노 - 카페모카: 0.1818
이중 바닐라라떼의 향상도가 1보다 커 가장 높은 인기를 가진다는 의미다.
이쯤에서 각 용어들에 대해 조금 알아두면 좋을 듯 하다.
- support(지지도)
전체 거래에서 특정 물품 A와 B가 동시에 거래되는 비중
해당 규칙이 얼마나 의미있는지 보여줌.
지지도 = P(A∩B)
:A와 B가 동시에 일어난 횟수 / 전체 거래 횟수
- confiddence(신뢰도)
A를 포함하는 거래 중 A와 B가 동시에 거래되는 비중
신뢰도 = P(A∩B) / P(A)
:A와 B가 동시에 일어난 횟수 / A가 일어난 횟수
- lift(향상도)
A라는 상품에서 신뢰도가 동일한 상품 B와 C가 존재할 때, 어떤 상품을 더 추천해야 좋을지 판단.
A와 B가 동시에 거래된 비중을 A와 B가 서로 독립된 사건일 때 동시에 거래된 비중으로 나눈 값
향상도 = P(A∩B) / P(A)*P(B) = P (B|A) / P (B)
: A와 B가 동시에 일어난 횟수 / A, B가 독립된 사건일 때 A,B가 동시에 일어날 확률
끝.
참조:
https://needjarvis.tistory.com/59
'공부 > 데이터' 카테고리의 다른 글
[pandas] 특정 key를 기준으로 groupby 한 후 해당목록 배열(dict)로 변경하기 (0) | 2020.05.30 |
---|---|
[pandas] read_csv 사용 시 날짜를 datetime 형태로 지정하기 (0) | 2019.12.10 |
[데이터정제] apriori 알고리즘을 실행할 수 있게 데이터 변형하기 (0) | 2019.12.02 |
[pandas] 특정 열(column) 문자 비교(like) (0) | 2019.11.30 |
명목척도, 순위척도, 등간척도, 비율척도 (0) | 2019.11.26 |
댓글