전 주에 다뤘던 Apriori Algorithm에서 조금 더 발전된 형태의 알고리즘을 FP-Growth Algorithm이라고 할 수 있다.
그래서 FP-Growth를 다루기 전, Apriori에 대해서 다루어보고, 왜 FP-Growth가 나오게 됐는지부터 차근차근 정리하고자 한다.
사실 이 Apriori 알고리즘의 경우, 이전 글에서 좀 더 자세하게 다뤄놨다.
https://velog.io/@sohtks/Recommendation-System-Association-Rule-Mining-%EC%97%B0%EA%B4%80-%EA%B7%9C%EC%B9%99
여기서 더 참고하면 좋을듯하다.
장점
단점
Apriori처럼 연관 규칙 생성 알고리즘 중에 하나이며, Apriori와의 차이는 FP-Tree를 생성한 후에 최소 support 이상의 패턴만을 추출한다는 것이다.

해당 트리의 Node는 item에 해당하며 counter가 존재함
FP-Tree는 일반적으로 압축되지 않은 데이터보다 작은 크기를 가짐
FP-Growth는 FP-tree에서 frequent itemsets 추출함.
Bottom-up algorithm - from the leaves towards the root (이파리 노드에서 뿌리 노드로)

Divide and conquer: 먼저 e, de 등으로 끝나는 frequent itemsets 찾고, d, cd 등을 찾음
먼저, item(set)으로 끝나는 prefix 경로의 서브 트리를 추출함 (hint: use the linked lists)
각 prefix 경로의 서브 트리는 frequent itemset을 추출하기 위해 재귀적으로 처리, 솔루션들이 병합됨
e.g.) the prefix path sub-tree for e will be used to extract frequent itemsets ending in e, then de, ce, be, and ae, then in cde, bde, cde, etc.
즉, frequent pattern을 recursion(재귀)을 통해 점진적으로 증가시키는 원리!

기존에 가지고 있던 카페 매출 데이터를 불러와서 FP-growth 알고리즘을 돌려보고자 한다.
해당 데이터의 각 열은 특정 음료를 나타내며, 행은 한 시간당 주문에 대한 음료의 주문량을 나타내고 있다. FP-Growth 알고리즘을 적용하려면 주문당 구매한 음료 목록으로 변환해야하기 때문에,
이를 위해, 각 행에 대해 음료의 주문량이 0보다 큰 경우, 해당 음료의 이름을 주문량만큼 리스트에 추가하는 방식으로 데이터를 변환하는 코드로 변환을 진행했다.
[['아이스아메리카노', '아이스아메리카노', '아이스아메리카노', '아이스아이리쉬라떼', '카페라떼', '카페라떼', '카페라떼', '아이스연유라떼', '복숭아아이스티', '복숭아아이스티', '바닐라라떼', '아메리카노', '아메리카노', '아이스토피넛라떼', '아이스바닐라라떼'], …, ] 식의 데이터 형태로 바꾸고, 이를 데이터 변수 preprocessed_data에 넣어주었다.
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import fpgrowth
# 트랜잭션 인코딩
te = TransactionEncoder()
te_ary = te.fit(preprocessed_data).transform(preprocessed_data)
df = pd.DataFrame(te_ary, columns=te.columns_)

FP-growth를 사용할 수 있는 메서드는 mlxtend 라이브러리에 있기 때문에, 해당 라이브러리를 임포트하고 preprocessed_data를 트랜잭션 인코딩을 해주기 위해 TransactionEncoder()를 불러 One-Hot Encoding 처리를 했다.
# FP-Growth algorithm 적용
# support 임계치 설정, 애초에 FP-Growth는 Frequent Pattern이기 때문에 빈도수 보는거라 support 값만 처리
min_support = 0.35
frequent_itemsets = fpgrowth(df, min_support=min_support, use_colnames=True)
frequent_itemsets = frequent_itemsets.sort_values(by=['support'], ascending=False) # support값 내림차순 정렬

fpgrowth 메서드 안에 넣을 dataframe, minsupport값을 넣어주고 다음과 같은 값을 확인할 수 있었다.
FP-Growth의 장점
FP-Growth의 단점