728x90
반응형

어제 한 내용을 이어서 하자면, 데이터프레임으로 변경을 완료했는데

이 데이터프레임의 내용은 대략적으로 글로 쓰자면

1번째 행은 : JAVA, JSP

2번쨰 행은 : CSS, JAVA, JSP

 

을 표로 표시한 내용이다. 

이제 aprior 알고리즘을 사용해서 어떻게 나오는지 보자 

 

1
2
3
itemset = apriori(df, min_support=0.1, use_colnames=True)
itemset
print(itemset,'\n')
cs

소스를 돌려보면.. 아래와 같이 값이 나오는데  support에 해당하는 값은 어떻게 나온걸까..

짱구를 굴려봐도 답이 안나온다.. 이럴땐 구글링!

  간단한 샘플을 통한 통계척도 구해보기

 

역시 구글! 없는게 없다 😄

맞는지 하나만 계산해보자. 복잡하니까 좀 쉬운 데이터로 계산을 한번 진행해보자

아래와 같은 데이터로 계산을 진행해보겠다.

 

 연관규칙에서 사용하는 3가지 통계척도가 있는데 이걸 하나하나씩 물고뜯고 씹어보자

1. 지지도 ( support ) : 특정 아이템이 데이터에서 발생하는 빈도 

 

 

 

 

 

 

 

 

 

 

공식은 위와 같다. 

가장 쉬운 녹차라떼,아메리카노에서 녹차라뗴의 지지도를 알아보자

support(녹차라떼) = count(녹차라떼 건수: 2건 ) / 전체 거래건수 : 8 건  => 0.250

 

 

2. 신뢰도 ( confidence ) : 두 아이템의 연관규칙이 유용한 규칙일 가능성의 척도 

공식대로 다시 또 계산해보자

confidence(녹차라떼 -> 아메리카노 ) = count( 2 건 ) / 녹차라떼만 포함하는 건수 2건  => 1.0

 

3. 향상도 ( lift ) : 두 아이템의 연관 규칙이 우연인지 아닌지를 나타내는 척도 

lift는 공식을 잘 봐야한다. 헷갈린다!!!

lift( 녹차라떼 -> 아메리카노 ) = confidenct( 녹차라떼 -> 아메리카노 ) / support( 아메리카노 ) 

                          = 1.0 /  0.875 => 1.14286 

여기서 조심해야하는거는 분모가 아메리카노의 지지도이라는 걸 알고 계산해야한다. 

support(아메리카노) = count(아메리카노 건수: 7건 ) / 전체 거래건수 : 8 건  => 0.875

 

이걸로 계산하면 3가지 통계척도는 구할 수 있다. 

 

[출처] : https://m.blog.naver.com/zzz90zzz/221807210555

 

연관규칙 (Apriori 알고리즘)

머신러닝의 종류 3가지 : 1. 지도학습 : - 분류 : knn(유클리드 거리), 나이브베이즈 (나이브베이즈 확률),...

blog.naver.com

 

 

lift 까지 구했으면 거의 다 왔다.

다시 본론으로 돌아와 lift 가 높을 수록 인기가 많고, 신뢰가 높다고 생각하면 된다.

 

그러므로 아래의 표에서 보자면

Django 를 하는 개발자에게는 Python를 하는 경우가 많고,

SQL 를 할 줄 아는 개발자는 JSP를 하는 경우가 많다는 걸 알 수 있다.

 

물론, 표본이 많으면 더 정확한 예측을 할 수 있을것 같다.

 

이제 aprior 을 공부했으니 이걸로 이것저것 해보면서 공부를 좀 더 해봐야겠다.

728x90
반응형
728x90
반응형

 

연관분석의 대표적인 알고리즘 중 하나인 Apriori를 사용해서 연관분석을 진행해보려고 한다.

장바구니 분석

장바구니 분석은 보통 몇 가지 모델링 기법으로 이루어진다. 판매자들과 전자상거래 사이트에서 일반적으로 사용하는 장바구니 분석과 거래 분석을 통해 소비자들이 가장 많이 사는 제품에 대한 정보와 특정 제품이 가장 많이 팔리는 시기에 대한 정보를 알아내려고 한다. 

 

데이터 기반 의사결정 만들기

장바구니 분석의 결과는 자주 같이 구매되는 아이템 혹은 물건들의 집합이다. 이제 연관도를 향상시키는 강한 지지도, 신뢰도, 향상도로 인해 이런 일들이 가능하고, 소비자들은 그것들을 구매하려 할것이며, 또한 판매자들은 가게나 그들의 웹사이트에 관련 있는 제품들을 같이 진열해 놓을 것이다. 하지만 강한 연관성은 항상 일어나는 것이 아니라 확률을 높이는 것이며, 그렇기 때문에 판매자들은 판매를 증대시키기 위해 이전에 소개한 기법들을 이용해 항상 알아내려고 해야 한다.

다음에 나오는 몇 가지 중요한 데이터 기반 의사 결정들은 판매자들이 주로 장바구니 분석을 통해 얻고자 하는 결과를 기반으로 하는 경향이 있다.

  • 맥주와 기저귀 같은 상품 조합을 포함하는 빈발 아이템 세트들은 보통 매장에서 바로 옆에 배치하려는 경향이 있다. 이를 통해 소비자가 추가로 구매 할 수 있는 제품에 쉽게 접근할 수 있게 한다.
  • 아이템 혹은 상품의 개수가 많은 빈발 아이템 세트는 특정 카테고리 혹은 테마를 가진 곳에 배치해야 한다. 특별한 식료품 혹은 유아 상품들처럼 말이다. 아이템 세트 전체에 대해 가격 할인을 한다면 소비자들에게 더 매력적으로 다가갈 것이다.
  • 빈발 아이템 세트나 분할 행렬로부터 얻어진 아이템 세트에 있는 아이템 또는 상품들이 긴 목록을 가지고 있다면, 고객이 웹 브라우저로 쇼핑할 때 연관된 상품 페이지를 이용해 상품 제안과 추천을 보여줄 수 있다. 이전에 다뤘든이 향상도는 적어도 1 이상이 되도록 연관 규칙이 다뤄져야 한다.
  • 추천 시스템, 타깃 광고, 마케팅은 모두 장바구니 분석을 통해 얻어진 결과로 만들어질 수 있다

 

참고 :https://medium.com/@unfinishedgod/%EC%9E%A5%EB%B0%94%EA%B5%AC%EB%8B%88%EB%B6%84%EC%84%9D%EC%9D%84-%ED%86%B5%ED%95%9C-%EC%87%BC%ED%95%91-%ED%8A%B8%EB%A0%8C%EB%93%9C-%EC%98%88%EC%B8%A1-1-in-r-11a37ff5e377

 

장바구니분석을 통한 쇼핑 트렌드 예측 — 1 in R

장바구니 분석

medium.com

 

실무에서 인용을 하려면 우선적으로 데이터 정제가 필요할 것 같다.

 

그냥 테스트를 위한 샘플은 뭐.. 

소스에 위의 형식으로 집어넣어도 된다. 

 

하지만 나는 DB에 있는 내용을 통해서 해보고싶어서 데이터를 위의 샘플형식으로 정제하는 방식을 먼저 고민했다.

일단은 DB 에서 원하는 형식으로 추출할 수 있다는 가정하에 CSV를 만들었다. 

 

그래서 CSV의 형식은 위와 같이 만들었다. 

 

만든 CSV를 불러와서 제대로 불러왔는지 한번 출력해준다. 

 

1
2
3
4
data_set = pd.read_csv('data2.csv')
print('0. CSV에서 제대로 데이터를 불러오는지 테스트','\n')
print(data_set,'\n')
 
cs

잘 나온다. 다행이다.. 

그럼 가져온 데이터를 한번 학습시켜주자.

아 그런데.. 소스내에서 데이터셋을 만들었을때는 2차원배열이 었는데

내가 DB에서 가져온 소스는 2차원 배열이 아니네? 흠...

또 가져온 내역을 이차원 배열로 바꿔주는 방법을 찾아보자.. 귀찮다.

 

1
2
3
data_frames['test'= data_frames.ProductName.str.split('|')
print('1. CSV에서 받아온 데이터 중, 붙여논 컬럼을 다차원배열로 변경 \n')
print(data_frames.test,'\n')
cs

가져온 CSV에서 2차원배열로 변경하기를 원하는 컬럼을 가지고와서 DB에서 줬던 구분자값을 가지고

다시 나눠준다. 짜잔~ 여기까지 하는데 삽질 많이했다..

 

자 그럼, 이제 소스내에 데이터셋을 만드는 것처럼 2차원배열까지 완성했다. 

2차원배열로 변경한 데이터를  학습시켜준다. 

 

 

1
2
3
4
5
6
7
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
 
te = TransactionEncoder()
te_result = te.fit(data_frames.test).transform(data_frames.test)
print('2. 다차원배열로 변경한 데이터를 데이터프레임으로 변경  \n')
print(te_result,'\n')
cs

 

어지럽다. 무슨결과물인가 싶다... 

대충 첫번째 행만 해석하자면 우리가 만든 데이터셋에서

제일 처음이 [ JAVA, JSP] 였는데 이 품목등을 포함한 내역만 True 이고 나머지는 False 이다.

열의 전체 길이는 우리가 만든 데이터셋에 있는 종류의 총 갯수에 해당한다.

 

보기만해도 어지러운 저 결과물은 좀 이쁘게 바꿔주고 싶다.

이 부분에서 하루정도 삽질했다.  다른 블로그를 봐도 저기서 데이테프레임을 변경할때

어떻게 변경해줘야하는지 자세히 알려주지 않는다.. ㅠ_ㅠ

1
2
3
print('3. 데이터프레임으로 변경한 내역을 보기쉽게 정리  \n')
df = pd.DataFrame(te_result, columns= te.columns_)
print(tabulate(df.head(5), headers='keys', tablefmt='fancy_grid'))
cs

데이터프레임으로 변경하는건 pandas를 통해서 변경하는데

그냥 변경하면 아래처럼 이쁘게 나오지도 않고, 제일 중요한 컬럼명들이 안나온다.

요 컬럼명 출력해줄려고 하... 눈빠지게 구글링했다.

생각보다 간단하다. dataframe 을 만들때 option으로 columns 를 사용해주면 된다.

 

표 처럼 나오는건 그냥 내가 이쁘게 출력하고싶어서 tabulate이라는 파이썬 패키지가 있다.

거기서 뭐 tablefmt 을 통해서 여러가지 방식으로 출력할 수 있다.

 

다음은 데이터프레임을 가지고 실제 ariori 알고리즘을 이용한 내역을 공부해보자..

728x90
반응형

+ Recent posts