본문 바로가기
데이터 분석/머신러닝

서울 생활이동 데이터 분석(4) - 연관 분석

by 너굴맨_ 2021. 12. 3.

서울시 생활이동 데이터의 출발지와 도착지 사이의 연관 분석을 실시해보자.

 

1. 출발지와 도착지가 다른 데이터만을 추출하자

출발지와 도착지가 동일한 데이터는 분석 목적에 부합하지 않으므로 제외

대략 2천만 건의 이동 리스트를 호출

2. 출발지와 도착지로 아이템 목록 리스트 생성

3. 각 아이템의 발생 횟수를 알아보자

이전의 분석한 (2), (3)의 과정을 통해 가장 많은 출발지 및 도착지는 강남, 서초, 송파, 영등포 순으로 사람들의 방문이 많다는 것을 알았는데 의외로 강남 <-> 용인, 서초 <->용인이라는 부분이 나타났다.

 

4. 연관 분석 활용하기 (Apriori)

분석 목적에 맞게 의미있는 연관 관계를 파악하기 위해 횟수가 10000이상인 데이터를 호출하여 연관분석을 실시하자.

 

Apriori 알고리즘을 활용하여 min_support = 0.01을 만족하는 리스트를 확인해보자

아쉽게도 min_support = 0.01를 만족하는 아이템 리스트는 길이가 1인 지역만 출력됬다.

 

4-1 문제 발생!!

min_support를 0.01 보다 낮은 값으로 설정할 시 아래와 같은 에러가 발생한다. (Apriori 알고리즘의 문제점인 메모리 부족)

 

5. 지지도를 표현하여 나타내자

연관분석의 측도 중 하나인 지지도의 공식을 이용하여 나타내어보자

  • 지지도 = P(항목 A와 B가 동시에 포함된 거래수)/ 전채 거래 수

지지도 0.002~0.003을 만족하는 아이템 목록 리스트

결론:  용인과 서울을 오가는 이동객 과 주변에 접한 도시에 대한 이동객이 많다는 것을 알 수 있다.

6. FP-growth를 사용하여 연관성 확인하기

FP-growth 알고리즘은 데이터가 많은 경우 Apriori 알고리즘의 문제점인 연산 속도를 해결하기 위해 사용되는 것으로 Tree 구조를 활용하여 나타냄

 

- FP-growth 알고리즘의 과정

1. 모든 각각의 item들에 대해 전체 데이터셋에 대한 빈도를 구한다.

2. itemset을 하나씩 Tree에 더함으로써 Tree를 생성한다.

 

코드 실시하면 위와 같이 최소 지지도를 만족하는 트리 구조가 나타남

결론: 위 5의 결론과 일치

* 코드

### 1. 출발지와 도착지가 다른 데이터만을 추출하자
## import modules
import numpy as np
import pandas as pd

data = pd.read_csv("C:\\Users\\USER\\Desktop\\Project\\Proceed\\Seoul_population_movement\\seoul_sep_movement.csv", encoding='utf-8')

## 두 칼럼의 문자열이 일치 판별
condition = [data['출발지'] == data['도착지'], data['출발지'] != data['도착지'] ]
answer = ['True','False']

result  = np.select(condition, answer, default='None')

test = data
test['일치'] = result
# 일치와 불일치 수 확인하기
test['일치'].value_counts()

test1 = test[test['일치'] == 'False']
# 불일치인 데이터 목록만 추출
test2 = test1[['출발지', '도착지']]
### 2. 출발지와 도착지로 아이템 목록 리스트 생성 
movement_list = test2.values.tolist()

movement_list
### 3. 각 아이템의 발생 횟수를 알아보자
df_movement = pd.DataFrame(movement_list)

count_movement = df_movement.value_counts()
### 4. 연관 분석 활용하기 (Apriori)
# 아래의 데이터를 활용하기 위해 DataFrame으로 구조 변경
count_movement = pd.DataFrame(count_movement)
# 칼럼명 변경
data.columns = ['출발지','도착지','횟수']

## 횟수가 10000개 이상인 출발지와 도착지 이동에 대한 연관성 파악
data1 = data[data['횟수'] >= 10000]

from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

te = TransactionEncoder()
te_ary = te.fit(movement_list).transform(movement_list)
df = pd.DataFrame(te_ary, columns=te.columns_)

# min_support = 0.01로 설정, 아이템목록 길이 및 지지도 값이 큰 순서대로 정렬
frequent_itemsets = apriori(df, min_support=0.01, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].map(lambda x: len(x))
frequent_itemsets.sort_values('support',ascending=False,inplace=True)

frequent_itemsets
### 5. 지지도를 표현하여 나타내자
## 횟수에 대한 지지도를 알아보자 
# 지지도 =  아이템 목록에 대한 횟수 / 전체 수
# 전체 횟수 및 지지도에 대한 칼럼 생성

# 전체 횟수에 대해 알자 칼럼 합
total = data1['횟수'].sum()

data1['지지도'] = data1[['횟수']] / total

data1.head(30)
### 6. FP-growth 알고리즘 활용
from mlxtend.frequent_patterns import fpgrowth

fp = fpgrowth(df, min_support=0.002, use_colnames=True, verbose=1)
fp['length'] = fp['itemsets'].map(lambda x: len(x))
fp.sort_values('support',ascending=False,inplace=True)

fp[fp['length'] == 2]

Reference

https://process-mining.tistory.com/92

 

FP-Growth 알고리즘이란? (FP-growth algorithm이란?)

Association Rule의 적용을 위해서는, 각 item들이 각 itemset 안에서 어떤 빈도로 출현했는지, 어떤 item과 함께 나왔는지를 세는 것이 필수적이다. (Association Rule이 무엇인지 궁금하다면 다음 포스팅을

process-mining.tistory.com

http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/fpgrowth/#more-examples

 

Fpgrowth - mlxtend

From here you can search these documents. Enter your search terms below.

rasbt.github.io

 

댓글