250x250
Link
나의 GitHub Contribution 그래프
Loading data ...
Notice
Recent Posts
Recent Comments
관리 메뉴

Data Science LAB

[Python] 데이터에듀 ADP 실기 모의고사 1회 1번 파이썬 ver.(정형 데이터마이닝) 본문

adp 실기/기출문제

[Python] 데이터에듀 ADP 실기 모의고사 1회 1번 파이썬 ver.(정형 데이터마이닝)

ㅅ ㅜ ㅔ ㅇ 2022. 8. 29. 22:26
728x90

사용 데이터 : lotto.csv

lotto 데이터는 1회부터 859회까지의 로또 당첨번호(보너스 번호를 제외한 6개의 추첨번호)를 담고 있는 데이터이며, 변수 설명은 다음과 같다.

변수 데이터 형태  설명
time_id 수치형 로또 회차
numN 수치형 해당 회의 N번 째 당첨번호 6개

 

- 데이터 불러오기

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings(action='ignore')


df = pd.read_csv('../data/lotto.csv')
df.head()

 

1. 연관규칙분석을 수행하기 위해 lotto 데이터셋을 transaction 데이터로 변환하시오. (단, 본 분석에서 로또번호가 추첨된 순서는 고려하지 않고 분석을 수행하도록 한다.) 그리고 변환된 데이터에서 가장 많이 등장한 상위 10개의 로또번호를 막대그래프로 출력하고 이에 대해 설명하시오.

from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = df.drop(['time_id'], axis=1).values
te_ary = te.fit_transform(te_ary)
te_ary

 

time_id 열은 삭제

TransactionEncoder를 사용하여 transaction 데이터로 변환함

 

# 다시 데이터프레임으로 변환
te_df = pd.DataFrame(te_ary, columns = te.columns_)
te_df

 

1~45번 사이의 숫자가 해당회차에 있는지 여부를 나타내는 형식의 데이터프레임으로 생성

 

from collections import Counter
true_df = pd.DataFrame(columns = ['num','Count'])
for i in te_df.columns:
    true_df = true_df.append({'num':i, 'Count': Counter(te_df[i])[True]}, ignore_index=True)
true_df.head()

각 숫자별로 True인 열의 개수를 카운트하여 새로운 데이터프레임형식으로 생성

 

import matplotlib.pyplot as plt
top10 = true_df[:10].set_index('num')
top10.plot.bar( y='Count',rot=0)

 

상위 10개의 숫자만을 뽑아 막대그래프 형태로 나타냄

가장 많이 등장한 상위 10개의 숫자는 34, 40, 27 등이다

 

 

2. 변환한 데이터에 대해 apriori 함수를 사용하여 다음 괄호 안의 조건을 반영하여 연관규칙을 생성하고, 이를 'rules_1' 이라는 변수에 저장하여 결과를 해석하시오. (최소 지지도 : 0.002, 최소 신뢰도 : 0.8, 최소조합 항목 수 : 2개, 최대조합 항목 수 : 6개) 그리고 도출된 연관규칙들을 향상도를 기준으로 내림차순 정렬하여 상위 30개의 규칙을 확인하고, 이를 데이터프레임으로 변환하여 csv파일로 출력하시오.

apriori 함수
- df : 값이 0/1또는 True/False인 데이터프레임
- min_support : 최소 지지도(default=0.5)
- use_colnames : True이면 열 인덱스 대신 데이터프레임의 열 이름을 사용 (default=False)
- 생성된 항목 세트의 최대 길이 (default=None)
- low_memory : 메모리 리소스가 제한된 경우 사용할 수 있으나 속도가 느림 (default=False)
from mlxtend.frequent_patterns import apriori

lotto_ap = apriori(te_df, min_support=0.002, max_len=6,use_colnames=True)
lotto_ap

 

mlxtend 모듈에 있는 apriori 함수를 사용하여 연관규칙을 생성함

최소 지지도는 0.02, 최대 조합 항목수는 6개로 생성

 

 

association_rules 함수
- metric : ['support', 'confidence', 'lift'] 중 하나, support_only=True인 경우 자동으로 support로 설정됨
- min_threshold : metric에 지정된 rule의 최솟값 (default=0.8)
- support_only :  support만 계산하고 다른 메트릭 열은 NaN으로 출력
from mlxtend.frequent_patterns import association_rules

rules = association_rules(lotto_ap, metric='lift', min_threshold=0.8)
rules

 

metric은 lift, min_threshold=0.8로 설정

 

# 나머지 규칙 추가
rules = rules[rules['confidence'] >= 0.8]
rules = rules[rules['antecedents'].map(lambda x: len(x)>2)]
rules.shape

 

confidence가 0.8 이상이고, 최소 조합 항목이 2보다 큰 rules를 생성

 

rules.sort_values('lift',ascending=False, inplace=True)
top30 = rules.head(30)
top30.to_csv('연관규칙.csv')

 

생성된 규칙중 lift를 기준으로 상위 30개 열을 csv형태로 내보냄

 

 

3. 생성된 연관규칙 rules에 대한 정보를 해석하고, 1번 문제를 통해 확인했을 때 가장 많이 추첨된 번호가 우측항에 존재하는 규칙들만을 'rules_most_freq'라는 변수에 저장하시오. 그리고 해당 규칙들을 해석하여 인사이트를 도출한 뒤 서술하시오.

rules[rules['consequents'] == frozenset({34})].sort_values('lift', ascending=False)

728x90
Comments