# R 정형 데이터 마이닝 실습(사용 데이터 : lotto)
setwd("C:/ADP/data")
lot <- read.csv("lotto.csv")
str(lot)
sum(is.na(lot))
## 트랜잭션 데이터로 변환
## 데이터 형태 변환을 위한 패키치 설치 및 로드
install.packages("reshape2")
library(reshape2)
### melt 함수를 이용하여 데이터 변환
lot_melt <- melt(lot, id.vars=1) # melt 함수를 이용해 열에 있던 회차별 추첨번호 데이터를 행으로 이동
lot_melt2 <- lot_melt[,-2] # 추첨순서를 의미하는 열(원데이터의 변수명)을 삭제한 후 lot_melt2 변수에 저장
str(lot_melt2) # 변환된 데이터의 형태 확인
### 트랜잭션 데이터 생성을 위한 패키지 설치 및 로드
install.packages("arules")
library(arules)
### lot_melt2 데이터를 transaction Data로 변환
### 참고) split(x1,x2) : x1 데이터를 x2에 따라 데이터를 분리하는 함수
### 참고) as(데이터, "transactions"):데이터의 구조를 트랜잭션 데이터로 변환
lot_sp <- split(lot_melt$value, lot_melt$time_id) # 로또 추첨회차를 기준으로 당첨번호를 분리하여 lot_sp에 저장
lot_ts <- as(lot_sp, "transactions") # lot_sp 데이터를 트랜잭션 데이터로 변환
### 트랜잭션 데이터 출력
### 참고) inspect(lot_ts[1:5]) # 트랜잭션 데이터로 변환한 후 다섯개의 행을 출력하여 확인
inspect(lot_ts[1:5]) # 트랜잭션 데이터로 변환한 후 다섯개의 행을 출력하여 확인
### 최다 등장 로또추첨번호 TOP10을 확인한 후 막대그래프로 시각화하기
itemFrequencyPlot(lot_ts,topN=10,type="absolute") # 도수를 기준으로 막대그래프 생성
itemFrequencyPlot(lot_ts,topN=10) # 상대도수(비율)를 기준으로 막대그래프 생성
### 규칙 생성
### 참고) apriori(data, parameter) : apriory 알고리즘을 이용하여 연관규칙을 찾는 함수
### 최소 지지도, 신뢰도, 조합 항목수에 대한 조건을 리스트형태로 저장
metric.params <-list(supp=0.002, conf=0.8, minlen=2, maxlen=6)
rules_1 <- apriori(lot_ts, parameter = metric.params)
inspect(rules_1[1:20])
### 총 679개의 연관규칙이 발견되었다.
### 향상도인 "lift" 기준으로 내림차순 정렬했을 때 상위 30개의 규칙 확인
rules_2 <- sort(rules_1, by="lift", decreasing = TRUE) # 향상도를 기준으로 내림차순 정렬
inspect(rules_2[1:30]) # 상위 30개의 규칙 확인
### 위 30개의 규칙들을 데이터프레임으로 변환
rules_3 <- inspect(rules_2[1:30])
rules_4 <- as(rules_3, "data.frame")
str(rules_4)
### 변환된 데이터프레임을 csv 파일로 저장
write.csv(rules_4,file="C:/ADP/data/lotto_rules.csv",row.names=FALSE)
### summary 함수를 이용하여 생성된 규칙들에 관한 정보를 해석
summary(rules_1)
###set of 679 rules
#rule length distribution (lhs + rhs):sizes
#4 5
#632 47
#Min. 1st Qu. Median Mean 3rd Qu. Max.
#4.000 4.000 4.000 4.069 4.000 5.000
#summary of quality measures:
# support confidence coverage lift count
#Min. :0.002328 Min. :1 Min. :0.002328 Min. :6.410 Min. :2.000
#1st Qu.:0.002328 1st Qu.:1 1st Qu.:0.002328 1st Qu.:7.041 1st Qu.:2.000
#Median :0.002328 Median :1 Median :0.002328 Median :7.280 Median :2.000
#Mean :0.002364 Mean :1 Mean :0.002364 Mean :7.434 Mean :2.031
#3rd Qu.:0.002328 3rd Qu.:1 3rd Qu.:0.002328 3rd Qu.:7.670 3rd Qu.:2.000
#Max. :0.003492 Max. :1 Max. :0.003492 Max. :9.652 Max. :3.000
#mining info:
# data ntransactions support confidence
#lot_ts 859 0.002 0.8
# 총 679개의 연관규칙이 도출되었으며, 그 중 632개 규칙은 4개의 로또번호로 구성되었고
# 47개의 규칙은 5개의 번호로 구성되었다. 규칙들에 대한 향상도의 최소값은 6.410으로 꽤 높게 나타났으며,
# 추첨번호들의 교집합 확률을 의미하는 지지도의 평균은 0.002364로 나타났다.
# 트랜잭션 데이터의 개수는 859개이며, 트랜잭션 데이터는 859회 동안의 로또 당첨번호들을 의미한다.
# 로또 데이터에서 가장 많이 등장한 추첨번호 '34'가 우측항에 존재하는 규칙들만을 추출하여 저장
rules_most_freq <- subset(rules_1, rhs %in% "34")
# 해당 규칙 확인
inspect(rules_most_freq)
# lhs rhs support confidence coverage lift count
# [1] {7,22,31} => {34} 0.002328289 1 0.002328289 6.410448 2
# [2] {22,24,31} => {34} 0.002328289 1 0.002328289 6.410448 2
# [3] {17,32,33} => {34} 0.003492433 1 0.003492433 6.410448 3
# [4] {23,42,45} => {34} 0.002328289 1 0.002328289 6.410448 2
# [5] {15,19,41} => {34} 0.002328289 1 0.002328289 6.410448 2
# [6] {2,15,28} => {34} 0.002328289 1 0.002328289 6.410448 2
# [7] {5,13,29} => {34} 0.002328289 1 0.002328289 6.410448 2
# [8] {5,17,29} => {34} 0.002328289 1 0.002328289 6.410448 2
# [9] {17,42,45} => {34} 0.002328289 1 0.002328289 6.410448 2
# [10] {14,25,44} => {34} 0.002328289 1 0.002328289 6.410448 2
# [11] {2,15,21} => {34} 0.002328289 1 0.002328289 6.410448 2
# [12] {19,21,44} => {34} 0.002328289 1 0.002328289 6.410448 2
# [13] {2,4,31} => {34} 0.003492433 1 0.003492433 6.410448 3
# [14] {7,24,31} => {34} 0.002328289 1 0.002328289 6.410448 2
# [15] {12,36,37} => {34} 0.002328289 1 0.002328289 6.410448 2
# [16] {1,5,13} => {34} 0.002328289 1 0.002328289 6.410448 2
# [17] {10,22,36,44} => {34} 0.002328289 1 0.002328289 6.410448 2
# [18] {7,22,24,31} => {34} 0.002328289 1 0.002328289 6.410448 2
# [19] {15,19,21,44} => {34} 0.002328289 1 0.002328289 6.410448 2
# 총 19개의 규칙이 도출되었으며, [1]번 규칙을 확인해 보면, {7,22,31}번과 {34}번이 함께 추첨될 확률은
# support(지지도)를 확인한 결과 0.002328289이며 이는 약 0.2%에 해당한다. 이 규칙의 lift(향상도)는
# 6.410448로 이는 {34}만 추첨됐을 때 보다 {7,22,31}번이 뽑히고 {34}도 뽑힐 확률이 약 6배 높다는 것을 의미한다.
# 하지만 이러한 규칙들은 로또번호가 추첨되는 순서를 고려하지 않고 단순히 조합에 대한 확률만을 고려한 규칙이므로,
# 향상도가 높은 숫자들의 조합이 로또 추첨번호가 될 가능성이 높은 것은 아니다.