인공지능/머신러닝

연관규칙 / 연관성 분석

해피밀세트 2020. 5. 28. 17:27

 

 

 

연관규칙 ,연관성분석 (association analaysis) - 비지도 학습

  • 대량의 데이터에 숨겨진 항목간의 연관규칙을 찾아내는 기법으로서  다른말로 장바구니 분석(market basket analysis)이라고도 한다.
  • 실제 연관성 분석은 월마트, 아마존 등 여러기업에서 다양한 마케팅 활동에 활용하고 있으며 더 나아가 사회 네트워크 분석에도 활용할 수 있다.

장점

  • 대규모 거래 데이터에 대해 작업을 할 수 있다.
  • 이해하기 쉬운 규칙을 생성해준다.
  • 데이터마이닝과 데이터 베이스에서 예상치 못한 지식을 발굴하는데 유용하다.

단점

  • 작은 데이터셋에는 그다지 유용하지 않다
  • 진정한 통찰력과 상식을 분리하기 위한 노력이 필요하다.

 

지지도(support)

  • 전체 거래중 연관성 규칙을 구성하는 항목들이 포함된 거래의 비율

               항목에 대한 거래수
support = ------------------------

                   전체 거래수

 

 

신뢰도(confidence)

  • 조건이 발생했을때 동시에 일어날 확률을 의미하며 신뢰도가 1에 가까울수록 의미있는 연관성을 가지고 있다.
  • {조건}  -> {결과}

                            support(x,y)
confidence(x->y) = ------------------ = P(y|x)
                             support(x)

                 조건과 결과 항목을 동시에 포함하는 거래수
신뢰도 = ------------------------------------------------------
                          조건항목을 포함한 거래수

 

예) 

거래번호 구매물품
1 우유, 버터, 시리얼
2 우유, 시리얼
3 우유, 빵
4 버터, 맥주, 오징어

S(우유 -> 시리얼) : 우유와 시리얼을 동시에 구매할 확률

                         {우유,시리얼} 포함한 거래수/ 전체거래수

                         50%(2/4)

 

C(우유 -> 시리얼) : P(시리얼|우유)

                         우유를 구매할때 시리얼도 같이 구매할 조건부확률

                          {우유,시리얼} 포함한 거래수/ {우유}거래수

                         2/3

 

C(시리얼 -> 우유) : P(우유|시리얼)

                         시리얼를 구매할때 우유도 같이 구매할 조건부확률

                          {우유,시리얼} 포함한 거래수/ {시리얼}거래수

                         100%(2/2)

 

우유 -> 시리얼 (지지도 : 50%    신뢰도 :  66%)

시리얼 -> 우유 (지지도 : 50%    신뢰도 :  100%)

 

 

향상도(lift)

  • 지지도와 신뢰도를 동시에 고려한다.
  • 향상도가 1이 나오면 연관성이 없다.
  • 향상도가 1이상이면 연관성이 있다.
  • 향상도 값이 1인 경우 조건과 결과는 우연에 의한 관계라고 보며 1보다 클수록 우연이 아닌 의미있는 연관성을 가진 규칙이라고 해석하면 된다.

                               신뢰도(시리얼 -> 우유)

lift(시리얼, 우유) = ------------------------------------ = (2/2)/(3/4) = 1.3333

                                   지지도(우유)

 

                               지지도(시리얼 -> 우유)

lift(시리얼, 우유) = ------------------------------------ = 1.3333

                           지지도(우유) * 지지도(시리얼)

 

lift(시리얼, 버터) = (1/2)/(2/4) = 1

 


 

연관성 분석 (R)

 

# 라이브러리 설치 및 불러오기

install.packages("arules")
library(arules)

 

# 데이터셋 만들기

buylist <- list(c("우유","버터","시리얼"),

                c("우유","시리얼"),

                c("우유",""),

                c("버터","맥주","오징어"))
buylist

# 트랜잭션 데이터 형변환 (리스트 -> 트랜잭션데이터)

buylist <- as(buylist,"transactions")

buylist

# 거래 4 / 거래항목 6

# 트랜잭션 데이터를 확인하는 방법

inspect(buylist)

# 연관성 찾기

apriori(buylist)

# conf=0.5 : 신뢰도 0.5이상

buyresult <- apriori(buylist,parameter=list(conf=0.5))

# minlen, maxlen : 항목 조합개수 한정
# 21 rule(s) : 21개의 조합을 만들었다.

# 조합보기

inspect(buyresult[1:10])

# lhs(left hand side) 조건(원인) -> rhs(right hand side) 결과

# 제한해서 보기
# support>=0.5 : 지지도가 0.5이상

inspect(subset(buyresult, subset=support>=0.5))

inspect(subset(buyresult, subset=lift>1))
inspect(subset(buyresult, subset=lhs %in% c("버터","시리얼")))
# 버터와 시리얼만 있어야함

inspect(subset(buyresult, subset=lhs %ain% c("
버터","시리얼")))
# 버터와 시리얼이 있는건 다찾기

inspect(subset(buyresult, subset=lhs %oin% c("
버터","시리얼")))
inspect(subset(buyresult, subset=lhs %pin% ""))

# 빈도수

itemFrequencyPlot(buylist)

# 지지도가 0.5이상인거 빈도수

itemFrequencyPlot(buylist,support=0.5)

# 연관성 그래프 그리기

install.packages("arulesViz")
library(arulesViz)
plot(buyresult,method="graph")

plot(buyresult,method="grouped")

subresult <- subset(buyresult, subset=lift>1)
inspect(subresult)

# 정렬하기

buyorder <- sort(subresult,by=c("support","lift","confidence"))

inspect(buyorder)

plot(buyorder,method = "paraco")

plot(buyorder[2],method = "paraco")

 

# 바로 트랜잭션으로 읽어들이기

groceries <- read.transactions("C:/pypy/groceries.csv",sep=",")

str(groceries)

summary(groceries)

inspect(groceries[1:5])

# 빈도수 체크

itemFrequencyPlot(groceries,topN=10)

# 연관성 분석 그래프로 그리기

groresult <- apriori(groceries,parameter=list(support=0.01, confidence=0.25))
inspect(groresult)
plot(groresult,method="graph")

# 연관성 분석 그래프로 그리기

groorder <- sort(groresult,by=c("support","lift","confidence"))
plot(groorder,method="paraco")

# 베리류만 저장하기

berryrules <- subset(groresult,subset=lhs %in% "berries")

inspect(berryrules)

write(berryrules,file = "C:/data/berryrules.csv",sep=",",quote=F,

      row.names=FALSE)

data <- read.csv("C:/data/berryrules.csv")

data

berry_df <- as(berryrules,"data.frame")

berry_df

 


 

연관성 분석 (파이썬)

 

# 라이브러리 설치

<아나콘다 프롬프트>

pip install --no-binary :all: mlxtend

 

# 라이브러리 불러오기

import pandas as pd

from mlxtend.preprocessing import TransactionEncoder

from mlxtend.frequent_patterns import apriori

 

# 데이터셋 만들기

dataset = [["우유","버터","시리얼"],

           ["우유","시리얼"],

           ["우유",""],

           ["버터","맥주","오징어"]]

dataset

# 데이터 형태 가공하기 (트랜젝션 모양으로)

te = TransactionEncoder()

te_ary = te.fit(dataset).transform(dataset)

df = pd.DataFrame(te_ary,columns=te.columns_)

df

# 연관규칙

f = apriori(df, min_support=0.5, use_colnames=True)

f

# 연관규칙

from mlxtend.frequent_patterns import association_rules

association_rules(f,metric="confidence")

 

# 데이터셋 불러오기

dataset = pd.read_csv("C:/data/building.csv")

dataset

# 데이터셋 정제작업

dataset = dataset.fillna(0)

del dataset['Unnamed: 0']

dataset

# 컬럼이름 변경

col = dataset.columns

col

dataset.columns = ["a","b","c","d","e","f","g","h","i","j","k","l"]

 

# 데이터 형태 가공하기 (트랜젝션 모양으로)

!!!이상한점!!! 컬럼이름이 숫자로 되어있으면 컬럼이 몇개 삭제된다.

!!!알아냄!!! 숫자도 한글자로 변해서 10,11,12가 사라짐

te = TransactionEncoder()

te_ary = te.fit(dataset).transform(dataset)

te_ary

df = pd.DataFrame(te_ary,columns=te.columns_)

df.info()

# 연관규칙

f = apriori(df, min_support=0.01, use_colnames=True)

f

# 연관규칙

from mlxtend.frequent_patterns import association_rules

association_rules(f,metric="confidence",min_threshold=0.3)

 

# 라이브러리 불러오기

import re
 

# 데이터 불러오기 및 구조 확인

file= open("C:/data/groceries.csv","r")
lines = file.readlines()
file.close()
lines[0]

dataset = []

for i in range(len(lines)):

    lines[i] = re.sub('\\n','',lines[i])

    dataset.append(lines[i].split(','))

dataset

te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
te_ary

df = pd.DataFrame(te_ary,columns=te.columns_)

df

f = apriori(df, min_support=0.1, use_colnames=True)
f

반응형