ADP 1회 모의고사 R 정형 데이터 마이닝 실습

# 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배 높다는 것을 의미한다.
# 하지만 이러한 규칙들은 로또번호가 추첨되는 순서를 고려하지 않고 단순히 조합에 대한 확률만을 고려한 규칙이므로,
# 향상도가 높은 숫자들의 조합이 로또 추첨번호가 될 가능성이 높은 것은 아니다.