Must Learning With Statistics

관광데이터를 이용한 R 연관규칙 분석 본문

R Code

관광데이터를 이용한 R 연관규칙 분석

Doublek Park 2020. 2. 27. 00:08
20200202_외래관광객.utf8.md

외래관광객실태조사 데이터를 활용한 국내관광지 연관규칙분석

 이번 포스팅은 연관규칙에 대해서 다루어보도록 하겠습니다. 연관규칙(Association rules)는 장바구니 분석이라고도 합니다. 예를 들어, 제가 마트에서 ’네O퀵’이라는 제품을 샀으면 그와 함께 마실 우유도 같이 구매할 확률이 높을 것입니다. 이렇게 A라는 제품을 구매하였을 때, B라는 제품도 함께 구매하는 규칙의 패턴을 구하고자 하는 것이 연관규칙 분석의 목적입니다. 제 개인적으로 생각했을 때, 연관규칙 및 여기서 이어지는 추천시스템 알고리즘만큼 실제 비즈니스영역에서 활용되는 데이터 분석 방법론이 있을지 잘 모르겠습니다. 여러분들이 즐겨보시는 유튜브, 넷플릭스 등의 플랫폼들은 모두 이러한 알고리즘들을 기반으로 컨텐츠들을 추천해주고 있습니다.

연관규칙의 기본 개념

 연관규칙의 기본 개념은 다음 3가지의 값만 이해하시면, 직접 분석하는데 어려운 점은 없습니다.

  • 지지도(support) : 전체 데이터에서 관광지 X, Y에 대한 방문을 모두 포함하는 비율
    • X,Y 동시에 방문한 관광객 수 / 전체 관광객 수

\[ support[x]=\frac{n(x)}{N} \\ support[x,y]=\frac{n(x \cap y)}{N} \]

  • 신뢰도 : 관광지 X를 방문하였을 때, Y를 같이 방문할 조건부 확률
    • X,Y 동시에 방문한 관광객 수 / X 방문 관광객 수
    • 값이 클수록 X를 방문하였을 때, Y를 같이 방문하는 비율이 높음

\[ confidence[x \rightarrow y] = \frac{support[x,y]}{support[x]} \]

  • 향상도 : 관광지 X를 방문하였을 때, Y를 같이 방문하는 경우와 관광지 X의 방문여부에 상관없이 Y를 방문한 경우의 비율
    • X,Y 를 동시에 방문한 관광객 비율 / (X를 방문한 관광객 비율 * Y를 방문한 관광객 비율)
    • 향상도는 두 제품이 독립인지 아닌지 보고자 하는 것입니다.

\[ lift[x \rightarrow y] = \frac{confidence[x \rightarrow y]}{support[y]} \]

 간단한 수식의 등장에 당황하실 수도 있겠지만, 해석면에서 간단하게 보면 다음과 같습니다. 규칙 생성에서 support값을 높게 설정할 수록 적은 수의 규칙만이 생성이 됩니다.(즉, 발생빈도가 높은 규칙들만 생성이 된다는 의미입니다.) confidence도 마찬가지입니다. confidence는 확률식으로 표현하면 \(P[Y|X] = \frac{P[X \cap Y]}{P[X]}\)의 수식으로 표현할 수가 있습니다. 이 수치또한 높으면 관광지 X를 방문하면 Y를 방문할 확률이 높아지는 것과 같습니다.

외래관광객 데이터분석

 외래관광객실태조사 데이터는 한국관광공사에서 수집하는 데이터로 다음의 링크에서 다운받을 수가 있습니다. 2018년도 버전으로 sav파일을 다운 받으시길 바랍니다.

데이터 다운로드 링크1 : https://know.tour.go.kr/stat/fRawDataDownloadDis.do
데이터 다운로드 링크2 : https://www.dropbox.com/sh/kzh6ohmyy2aczwf/AAD22z1H0JQvIY3h92LDf6_Na?dl=0

링크2의 경우에는 외래관광객 실태조사 데이터가 있기도 하지만, 관광지 코드에 대한 엑셀 정리표 Code도 있기 때문에 링크1에서 데이터 다운을 받을지라도, 링크2에서의 Code 데이터를 받아 주시길 바랍니다.

 우리가 이번 분석에서 관심이 있는 변수들은 외국인들이 방문한 관광지들의 목록입니다. Q10_4A에 해당하는 문항들이 외래관광객들이 방문한 지역에 대한 문항들입니다. 그렇기에 해당되는 문항들만 뽑고 분석하도록 하겠습니다.

ITEM ID Name
1 9910 명동
1 2147 명동
1 730 명동
1 10695 명동
1 935 명동

 관광지방문 문항이 1 ~ 30개의 문항에 걸쳐 기록하게 구성이 되어있기 때문에, 이를 하나의 변수로 통합해주는 과정을 거쳤습니다. 이제 준비는 끝났고, 연관규칙 분석을 진행하면 됩니다. 연관규칙 분석을 진행하기 위해서는 transaction matrix라는 것을 만들어 주어야 합니다. transaction matrix가 어떤 것인지는 일단 만들고 확인하겠습니다.

명동 동대문 종로/청계 신촌/홍대 강남역
1 TRUE TRUE TRUE TRUE TRUE
2 TRUE TRUE FALSE FALSE FALSE
3 TRUE FALSE FALSE FALSE FALSE
4 TRUE FALSE FALSE TRUE FALSE
5 TRUE TRUE FALSE FALSE FALSE
6 TRUE TRUE FALSE FALSE FALSE
7 TRUE FALSE FALSE FALSE FALSE
8 TRUE FALSE FALSE TRUE FALSE
9 TRUE FALSE FALSE TRUE TRUE
10 TRUE TRUE FALSE FALSE FALSE

Transaction Matrix란, ID 별 어떤 관광지를 선택했는지에 대한 Matrix입니다. 해당 관광지를 방문했으면 TRUE, 아니면 FALSE로 포함이 되어 있습니다. 여기까지가 진짜 연관규칙을 하기 위한 마지막 준비단계 였고, 연관규칙 분석을 실행해보도록 하겠습니다.

최소 support 0.15 & confidence 0.2 & 최소 관광지 1곳 연관규칙 생성

Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.2    0.1    1 none FALSE            TRUE       5    0.15      1
 maxlen target   ext
     10  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 2373 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[339 item(s), 15826 transaction(s)] done [0.01s].
sorting and recoding items ... [7 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [44 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
  • support : 최소 support 기준을 설정해줍니다.
  • confidence : 최소 confidence 기준을 설정해줍니다.
  • minlen : 최소 ITEM갯수를 설정해줍니다. minlen = 1인 경우에는 관광지를 한 곳에만 방문한 경우도 표현해줍니다. 만약 minlen = 2를 주면, 최소 2개 이상의 관광지가 포함된 연관규칙을 표현해줍니다.
     lhs         rhs         support   confidence lift     count
[1]  {}       => {잠실}      0.2017566 0.2017566  1.000000  3193
[2]  {}       => {이태원}    0.2425755 0.2425755  1.000000  3839
[3]  {}       => {강남역}    0.2770125 0.2770125  1.000000  4384
[4]  {}       => {신촌/홍대} 0.3120814 0.3120814  1.000000  4939
[5]  {}       => {종로/청계} 0.3726147 0.3726147  1.000000  5897
[6]  {}       => {동대문}    0.4927967 0.4927967  1.000000  7799
[7]  {}       => {명동}      0.7219133 0.7219133  1.000000 11425
[8]  {잠실}   => {명동}      0.1859598 0.9217037  1.276751  2943
[9]  {명동}   => {잠실}      0.1859598 0.2575930  1.276751  2943
[10] {이태원} => {동대문}    0.1674460 0.6902839  1.400748  2650
[11] {동대문} => {이태원}    0.1674460 0.3397872  1.400748  2650
[12] {이태원} => {명동}      0.2241880 0.9241990  1.280208  3548
[13] {명동}   => {이태원}    0.2241880 0.3105470  1.280208  3548
[14] {강남역} => {동대문}    0.1579679 0.5702555  1.157182  2500
 [ reached 'max' / getOption("max.print") -- omitted 30 rows ]
lhs Direction rhs support confidence lift count
{} => {명동} 0.7219133 0.7219133 1.000000 11425
{} => {동대문} 0.4927967 0.4927967 1.000000 7799
{동대문} => {명동} 0.4683432 0.9503783 1.316471 7412
{명동} => {동대문} 0.4683432 0.6487527 1.316471 7412
{} => {종로/청계} 0.3726147 0.3726147 1.000000 5897
{종로/청계} => {명동} 0.3392519 0.9104629 1.261180 5369
{명동} => {종로/청계} 0.3392519 0.4699344 1.261180 5369
{} => {신촌/홍대} 0.3120814 0.3120814 1.000000 4939
{신촌/홍대} => {명동} 0.2921774 0.9362219 1.296862 4624
{명동} => {신촌/홍대} 0.2921774 0.4047265 1.296862 4624
{} => {강남역} 0.2770125 0.2770125 1.000000 4384
{종로/청계} => {동대문} 0.2437129 0.6540614 1.327244 3857
{동대문} => {종로/청계} 0.2437129 0.4945506 1.327244 3857
{} => {이태원} 0.2425755 0.2425755 1.000000 3839
{동대문,종로/청계} => {명동} 0.2353090 0.9655172 1.337442 3724
{명동,종로/청계} => {동대문} 0.2353090 0.6936115 1.407500 3724
{동대문,명동} => {종로/청계} 0.2353090 0.5024285 1.348386 3724
{강남역} => {명동} 0.2286743 0.8255018 1.143492 3619
{명동} => {강남역} 0.2286743 0.3167615 1.143492 3619
{이태원} => {명동} 0.2241880 0.9241990 1.280208 3548
{명동} => {이태원} 0.2241880 0.3105470 1.280208 3548
{신촌/홍대} => {동대문} 0.2098446 0.6724033 1.364464 3321
{동대문} => {신촌/홍대} 0.2098446 0.4258238 1.364464 3321
{동대문,신촌/홍대} => {명동} 0.2046000 0.9750075 1.350588 3238
{명동,신촌/홍대} => {동대문} 0.2046000 0.7002595 1.420991 3238
{동대문,명동} => {신촌/홍대} 0.2046000 0.4368591 1.399824 3238
{} => {잠실} 0.2017566 0.2017566 1.000000 3193
{잠실} => {명동} 0.1859598 0.9217037 1.276751 2943
{명동} => {잠실} 0.1859598 0.2575930 1.276751 2943
{신촌/홍대} => {종로/청계} 0.1681410 0.5387730 1.445925 2661
{종로/청계} => {신촌/홍대} 0.1681410 0.4512464 1.445925 2661
{이태원} => {동대문} 0.1674460 0.6902839 1.400748 2650
{동대문} => {이태원} 0.1674460 0.3397872 1.400748 2650
{동대문,이태원} => {명동} 0.1628333 0.9724528 1.347049 2577
{명동,이태원} => {동대문} 0.1628333 0.7263247 1.473883 2577
{동대문,명동} => {이태원} 0.1628333 0.3476794 1.433283 2577
{신촌/홍대,종로/청계} => {명동} 0.1615696 0.9609169 1.331070 2557
{명동,신촌/홍대} => {종로/청계} 0.1615696 0.5529844 1.484065 2557
{명동,종로/청계} => {신촌/홍대} 0.1615696 0.4762526 1.526052 2557
{강남역} => {동대문} 0.1579679 0.5702555 1.157182 2500
{동대문} => {강남역} 0.1579679 0.3205539 1.157182 2500
{강남역,동대문} => {명동} 0.1515228 0.9592000 1.328691 2398
{강남역,명동} => {동대문} 0.1515228 0.6626140 1.344599 2398
{동대문,명동} => {강남역} 0.1515228 0.3235294 1.167923 2398

 연관규칙의 해석은 매우 간단합니다. support와 confidence의 값이 높으면 높을수록 발생확률이 높다는 것입니다. 보시면 명동과 동대문을 가장 많이 다니는 관광지 세트인 것도 알 수 있습니다. 다만 서로 간의 confidence값은 차이가 나는 것을 볼 수가 있습니다.

최소 support 0.15 & confidence 0.2 & 최소 관광지 2곳 연관규칙 생성

Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.2    0.1    1 none FALSE            TRUE       5    0.15      2
 maxlen target   ext
     10  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 2373 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[339 item(s), 15826 transaction(s)] done [0.01s].
sorting and recoding items ... [7 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [37 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
     lhs            rhs         support   confidence lift     count
[1]  {잠실}      => {명동}      0.1859598 0.9217037  1.276751 2943 
[2]  {명동}      => {잠실}      0.1859598 0.2575930  1.276751 2943 
[3]  {이태원}    => {동대문}    0.1674460 0.6902839  1.400748 2650 
[4]  {동대문}    => {이태원}    0.1674460 0.3397872  1.400748 2650 
[5]  {이태원}    => {명동}      0.2241880 0.9241990  1.280208 3548 
[6]  {명동}      => {이태원}    0.2241880 0.3105470  1.280208 3548 
[7]  {강남역}    => {동대문}    0.1579679 0.5702555  1.157182 2500 
[8]  {동대문}    => {강남역}    0.1579679 0.3205539  1.157182 2500 
[9]  {강남역}    => {명동}      0.2286743 0.8255018  1.143492 3619 
[10] {명동}      => {강남역}    0.2286743 0.3167615  1.143492 3619 
[11] {신촌/홍대} => {종로/청계} 0.1681410 0.5387730  1.445925 2661 
[12] {종로/청계} => {신촌/홍대} 0.1681410 0.4512464  1.445925 2661 
[13] {신촌/홍대} => {동대문}    0.2098446 0.6724033  1.364464 3321 
[14] {동대문}    => {신촌/홍대} 0.2098446 0.4258238  1.364464 3321 
 [ reached 'max' / getOption("max.print") -- omitted 23 rows ]
lhs Direction rhs support confidence lift count
{동대문} => {명동} 0.4683432 0.9503783 1.316471 7412
{명동} => {동대문} 0.4683432 0.6487527 1.316471 7412
{종로/청계} => {명동} 0.3392519 0.9104629 1.261180 5369
{명동} => {종로/청계} 0.3392519 0.4699344 1.261180 5369
{신촌/홍대} => {명동} 0.2921774 0.9362219 1.296862 4624
{명동} => {신촌/홍대} 0.2921774 0.4047265 1.296862 4624
{종로/청계} => {동대문} 0.2437129 0.6540614 1.327244 3857
{동대문} => {종로/청계} 0.2437129 0.4945506 1.327244 3857
{동대문,종로/청계} => {명동} 0.2353090 0.9655172 1.337442 3724
{명동,종로/청계} => {동대문} 0.2353090 0.6936115 1.407500 3724
{동대문,명동} => {종로/청계} 0.2353090 0.5024285 1.348386 3724
{강남역} => {명동} 0.2286743 0.8255018 1.143492 3619
{명동} => {강남역} 0.2286743 0.3167615 1.143492 3619
{이태원} => {명동} 0.2241880 0.9241990 1.280208 3548
{명동} => {이태원} 0.2241880 0.3105470 1.280208 3548
{신촌/홍대} => {동대문} 0.2098446 0.6724033 1.364464 3321
{동대문} => {신촌/홍대} 0.2098446 0.4258238 1.364464 3321
{동대문,신촌/홍대} => {명동} 0.2046000 0.9750075 1.350588 3238
{명동,신촌/홍대} => {동대문} 0.2046000 0.7002595 1.420991 3238
{동대문,명동} => {신촌/홍대} 0.2046000 0.4368591 1.399824 3238
{잠실} => {명동} 0.1859598 0.9217037 1.276751 2943
{명동} => {잠실} 0.1859598 0.2575930 1.276751 2943
{신촌/홍대} => {종로/청계} 0.1681410 0.5387730 1.445925 2661
{종로/청계} => {신촌/홍대} 0.1681410 0.4512464 1.445925 2661
{이태원} => {동대문} 0.1674460 0.6902839 1.400748 2650
{동대문} => {이태원} 0.1674460 0.3397872 1.400748 2650
{동대문,이태원} => {명동} 0.1628333 0.9724528 1.347049 2577
{명동,이태원} => {동대문} 0.1628333 0.7263247 1.473883 2577
{동대문,명동} => {이태원} 0.1628333 0.3476794 1.433283 2577
{신촌/홍대,종로/청계} => {명동} 0.1615696 0.9609169 1.331070 2557
{명동,신촌/홍대} => {종로/청계} 0.1615696 0.5529844 1.484065 2557
{명동,종로/청계} => {신촌/홍대} 0.1615696 0.4762526 1.526052 2557
{강남역} => {동대문} 0.1579679 0.5702555 1.157182 2500
{동대문} => {강남역} 0.1579679 0.3205539 1.157182 2500
{강남역,동대문} => {명동} 0.1515228 0.9592000 1.328691 2398
{강남역,명동} => {동대문} 0.1515228 0.6626140 1.344599 2398
{동대문,명동} => {강남역} 0.1515228 0.3235294 1.167923 2398

연관규칙 시각화

 주어진 결과들을 통해 한번 시각화를 진행해보도록 하겠습니다.

support 순으로 시각화 할 경우, 명동 => 동대문, 동대문 => 명동, 이 정보를 굳이 중복해서 표현할 필요는 없을 것 같습니다. 이에 대해 정리를 해보도록 하겠습니다.

[[1]]
[1] "{동대문}" "{명동}"  

[[2]]
[1] "{동대문}" "{명동}"  

[[3]]
[1] "{명동}"      "{종로/청계}"

[[4]]
[1] "{명동}"      "{종로/청계}"

[[5]]
[1] "{명동}"      "{신촌/홍대}"

[[6]]
[1] "{명동}"      "{신촌/홍대}"

[[7]]
[1] "{동대문}"    "{종로/청계}"

[[8]]
[1] "{동대문}"    "{종로/청계}"

[[9]]
[1] "{동대문,종로/청계}" "{명동}"            

[[10]]
[1] "{동대문}"         "{명동,종로/청계}"

[[11]]
[1] "{동대문,명동}" "{종로/청계}"  

[[12]]
[1] "{강남역}" "{명동}"  

[[13]]
[1] "{강남역}" "{명동}"  

[[14]]
[1] "{명동}"   "{이태원}"

[[15]]
[1] "{명동}"   "{이태원}"

[[16]]
[1] "{동대문}"    "{신촌/홍대}"

[[17]]
[1] "{동대문}"    "{신촌/홍대}"

[[18]]
[1] "{동대문,신촌/홍대}" "{명동}"            

[[19]]
[1] "{동대문}"         "{명동,신촌/홍대}"

[[20]]
[1] "{동대문,명동}" "{신촌/홍대}"  

[[21]]
[1] "{명동}" "{잠실}"

[[22]]
[1] "{명동}" "{잠실}"

[[23]]
[1] "{신촌/홍대}" "{종로/청계}"

[[24]]
[1] "{신촌/홍대}" "{종로/청계}"

[[25]]
[1] "{동대문}" "{이태원}"

[[26]]
[1] "{동대문}" "{이태원}"

[[27]]
[1] "{동대문,이태원}" "{명동}"         

[[28]]
[1] "{동대문}"      "{명동,이태원}"

[[29]]
[1] "{동대문,명동}" "{이태원}"     

[[30]]
[1] "{명동}"                "{신촌/홍대,종로/청계}"

[[31]]
[1] "{명동,신촌/홍대}" "{종로/청계}"     

[[32]]
[1] "{명동,종로/청계}" "{신촌/홍대}"     

[[33]]
[1] "{강남역}" "{동대문}"

[[34]]
[1] "{강남역}" "{동대문}"

[[35]]
[1] "{강남역,동대문}" "{명동}"         

[[36]]
[1] "{강남역,명동}" "{동대문}"     

[[37]]
[1] "{강남역}"      "{동대문,명동}"

이렇게 하면, 우리는 간단하게 동일한 ITEM으로 구성된 규칙들을 동일하게 표현할 수가 있습니다. 그럼 이제 중복된 규칙들을 제거해보도록 하겠습니다. 중복 제거에는 역시 unique 혹은 duplicate를 사용하는 것이 가장 좋습니다. 현재 우리는 중복된 값(value)가 필요한 것이 아니라, logical(TRUE, FALSE)정보가 필요한 상황이므로 duplicated를 사용하는 것이 맞습니다.

lhs Direction rhs support confidence lift count Rules
2 {명동} => {동대문} 0.4683432 0.6487527 1.316471 7412 {명동}=>{동대문}
4 {명동} => {종로/청계} 0.3392519 0.4699344 1.261180 5369 {명동}=>{종로/청계}
6 {명동} => {신촌/홍대} 0.2921774 0.4047265 1.296862 4624 {명동}=>{신촌/홍대}
8 {동대문} => {종로/청계} 0.2437129 0.4945506 1.327244 3857 {동대문}=>{종로/청계}
13 {명동} => {강남역} 0.2286743 0.3167615 1.143492 3619 {명동}=>{강남역}
15 {명동} => {이태원} 0.2241880 0.3105470 1.280208 3548 {명동}=>{이태원}
17 {동대문} => {신촌/홍대} 0.2098446 0.4258238 1.364464 3321 {동대문}=>{신촌/홍대}
22 {명동} => {잠실} 0.1859598 0.2575930 1.276751 2943 {명동}=>{잠실}
24 {종로/청계} => {신촌/홍대} 0.1681410 0.4512464 1.445925 2661 {종로/청계}=>{신촌/홍대}
26 {동대문} => {이태원} 0.1674460 0.3397872 1.400748 2650 {동대문}=>{이태원}
34 {동대문} => {강남역} 0.1579679 0.3205539 1.157182 2500 {동대문}=>{강남역}

이제 다 완성이 되었으니 다시 시각화를 해보도록 하겠습니다.

아까보다 확실히 깔끔해졌습니다. 다음으로는 네트워크 형식의 시각화를 진행하겠습니다.

Available control parameters (with default values):
main     =  Graph for 44 rules
nodeColors   =  c("#66CC6680", "#9999CC80")
nodeCol  =  c("#EE0000FF", "#EE0303FF", "#EE0606FF", "#EE0909FF", "#EE0C0CFF", "#EE0F0FFF", "#EE1212FF", "#EE1515FF", "#EE1818FF", "#EE1B1BFF", "#EE1E1EFF", "#EE2222FF", "#EE2525FF", "#EE2828FF", "#EE2B2BFF", "#EE2E2EFF", "#EE3131FF", "#EE3434FF", "#EE3737FF", "#EE3A3AFF", "#EE3D3DFF", "#EE4040FF", "#EE4444FF", "#EE4747FF", "#EE4A4AFF", "#EE4D4DFF", "#EE5050FF", "#EE5353FF", "#EE5656FF", "#EE5959FF", "#EE5C5CFF", "#EE5F5FFF", "#EE6262FF", "#EE6666FF", "#EE6969FF", "#EE6C6CFF", "#EE6F6FFF", "#EE7272FF", "#EE7575FF",  "#EE7878FF", "#EE7B7BFF", "#EE7E7EFF", "#EE8181FF", "#EE8484FF", "#EE8888FF", "#EE8B8BFF", "#EE8E8EFF", "#EE9191FF", "#EE9494FF", "#EE9797FF", "#EE9999FF", "#EE9B9BFF", "#EE9D9DFF", "#EE9F9FFF", "#EEA0A0FF", "#EEA2A2FF", "#EEA4A4FF", "#EEA5A5FF", "#EEA7A7FF", "#EEA9A9FF", "#EEABABFF", "#EEACACFF", "#EEAEAEFF", "#EEB0B0FF", "#EEB1B1FF", "#EEB3B3FF", "#EEB5B5FF", "#EEB7B7FF", "#EEB8B8FF", "#EEBABAFF", "#EEBCBCFF", "#EEBDBDFF", "#EEBFBFFF", "#EEC1C1FF", "#EEC3C3FF", "#EEC4C4FF", "#EEC6C6FF", "#EEC8C8FF",  "#EEC9C9FF", "#EECBCBFF", "#EECDCDFF", "#EECFCFFF", "#EED0D0FF", "#EED2D2FF", "#EED4D4FF", "#EED5D5FF", "#EED7D7FF", "#EED9D9FF", "#EEDBDBFF", "#EEDCDCFF", "#EEDEDEFF", "#EEE0E0FF", "#EEE1E1FF", "#EEE3E3FF", "#EEE5E5FF", "#EEE7E7FF", "#EEE8E8FF", "#EEEAEAFF", "#EEECECFF", "#EEEEEEFF")
edgeCol  =  c("#474747FF", "#494949FF", "#4B4B4BFF", "#4D4D4DFF", "#4F4F4FFF", "#515151FF", "#535353FF", "#555555FF", "#575757FF", "#595959FF", "#5B5B5BFF", "#5E5E5EFF", "#606060FF", "#626262FF", "#646464FF", "#666666FF", "#686868FF", "#6A6A6AFF", "#6C6C6CFF", "#6E6E6EFF", "#707070FF", "#727272FF", "#747474FF", "#767676FF", "#787878FF", "#7A7A7AFF", "#7C7C7CFF", "#7E7E7EFF", "#808080FF", "#828282FF", "#848484FF", "#868686FF", "#888888FF", "#8A8A8AFF", "#8C8C8CFF", "#8D8D8DFF", "#8F8F8FFF", "#919191FF", "#939393FF",  "#959595FF", "#979797FF", "#999999FF", "#9A9A9AFF", "#9C9C9CFF", "#9E9E9EFF", "#A0A0A0FF", "#A2A2A2FF", "#A3A3A3FF", "#A5A5A5FF", "#A7A7A7FF", "#A9A9A9FF", "#AAAAAAFF", "#ACACACFF", "#AEAEAEFF", "#AFAFAFFF", "#B1B1B1FF", "#B3B3B3FF", "#B4B4B4FF", "#B6B6B6FF", "#B7B7B7FF", "#B9B9B9FF", "#BBBBBBFF", "#BCBCBCFF", "#BEBEBEFF", "#BFBFBFFF", "#C1C1C1FF", "#C2C2C2FF", "#C3C3C4FF", "#C5C5C5FF", "#C6C6C6FF", "#C8C8C8FF", "#C9C9C9FF", "#CACACAFF", "#CCCCCCFF", "#CDCDCDFF", "#CECECEFF", "#CFCFCFFF", "#D1D1D1FF",  "#D2D2D2FF", "#D3D3D3FF", "#D4D4D4FF", "#D5D5D5FF", "#D6D6D6FF", "#D7D7D7FF", "#D8D8D8FF", "#D9D9D9FF", "#DADADAFF", "#DBDBDBFF", "#DCDCDCFF", "#DDDDDDFF", "#DEDEDEFF", "#DEDEDEFF", "#DFDFDFFF", "#E0E0E0FF", "#E0E0E0FF", "#E1E1E1FF", "#E1E1E1FF", "#E2E2E2FF", "#E2E2E2FF", "#E2E2E2FF")
alpha    =  0.5
cex  =  1
itemLabels   =  TRUE
labelCol     =  #000000B3
measureLabels    =  FALSE
precision    =  3
layout   =  NULL
layoutParams     =  list()
arrowSize    =  0.5
engine   =  igraph
plot     =  TRUE
plot_options     =  list()
max  =  100
verbose  =  FALSE

 시각적으로 확인해도 역시나 명동과 동대문이 매우 인기 관광지라는 것을 알 수가 있습니다. 이번 데이터를 분석하면서 안타까운 부분은 외래관광객들의 방문지역이 대부분 서울 명동, 동대문, 종로 등에 집중이 되어 있다는 것입니다. 만약 우리가 해외여행을 간다고 했을 때, 예를 들어 일본여행을 간다고 계획을 할 때를 생각해보겠습니다.(그런 분은 없을 것이라고 생각을 하는데… 지금 예를 드는거지, “이시국에 일본 여행 얘기하냐” 하실 분은 참아주셨으면 합니다.) 먼저 일본의 도쿄, 오사카, 삿포로, 후쿠오카, 대마도 등 어디로 갈지 다양한 선택지에 두고 고민을 할 수 있습니다. 그리고 오사카, 도쿄 등을 가서 거기서 또 어떤 관광지에 가서 시간을 보낼지 계획을 짤 수가 있습니다. 현재 데이터를 놓고만 보면 한국을 찾는 외래관광객들은 대부분 서울 중심지역에서만 시간을 보내고, 지방의 아름다운 대한민국의 관광지는 크게 관심이 없다는 것입니다. 이 문제를 해결해야 대한민국 관광산업이 발전할 수 있지 않을까 라는 생각을 합니다.

Google Maps 시각화

 마지막으로 구글맵스를 활용하여 시각화를 해보도록 하겠습니다. 구글 Maps를 활용하기 위해서는 구글 api key가 필요한데, 그 부분은 여러분들이 검색을 통해 api키를 얻어오셔야 합니다.

딱히 큰 의미는 없지만, 이렇게 지도상에 그래프를 표시할 수도 있습니다. 여기까지 연관분석에 대해 다루었습니다.

Comments