의미없는 경험은 없다!

  • 빅콘테스트란? 국내 최대 규모의 데이터 사이언스 경연 대회이다. 신한카드, LG U Plus, Finda 등 20여개에 이르는 다양한 참여사들이 주관하며, 그에 따라 참가자의 수준 또한 상당히 높은 편이다
  • 빅콘테스트에는 데벤져스 DAVANGERS 의 이름으로 팀을 이루어 참여했다.
    • 팀원들 모두가 각기 다양한 배경과 경험을 토대로 지금까지 공부해 왔으며 모인 모습이 마치 어벤져스같다는 의미에서 데이터 + 어벤져스를 합해 DAVENGERS라는 이름을 짓게 되었다.
    • 팀원들은 경영&빅데이터 2명 (정현, 경주), 수학&빅데이터 1명 (경훈), 경영&컴퓨터공학 1명(혜나), 그리고 컴퓨터공학 1명(규환) 총 다섯명으로 구성되어 있다. 지금 봐도 화려한 라인업이다.

      0우리들의 포토이즘

  • 이름이 정해지는 순간

    1데이터분석 + 어벤져스 = 데벤져스!

    2우리의 핵심 모토

    3

빅콘테스트 팀 합류

4팀장 하정현씨의 모집글

  • 팀원들은 서강대학교 데이터사이언스학회인 INSIGHT에서 조직했다. 나는 당시 신입기수였던 8기였고, 다른 팀원분들은 7기 선배 기수로서 이미 한 텀동안 데이터 분석 경험이 있는 분들이었다. 데이터 분석 특성상 데이터를 분석하고 이를 바탕으로 인사이트를 도출한 이후, 커뮤니케이션 전략까지 설계해야 한다. 비단 회사에서도 마찬가지로, 팀의 목표에 따라 데이터를 철저히 분석하고 이후 경영팀과 상의해야 한다. 팀플레이에도 익숙한 친구들이라고 생각했고, 학회에 들어가고 나서도 적극적으로 참여하던 친구들이었기에 주저 없이 합류했다. 사실 주제 자체도 재밌어보이는 것이 컸다.

주제설명

  • 빅콘테스트에는 이노베이션 분야(신한카드) / 퓨처스 부문(핀다) / 챔피언 부문(엘지 유플러스) 3가지의 분야가 존재한다.
    • 분야마다 참여사가 다르고, 그에 따라 시상금도 다르고, 주제도 다르고, 원하는것도 달랐기에 주제를 정하는 것이 제일 중요했다. 빅콘테스트 공식 사이트에 내용이 엄청 자세해서 사이트 꼼꼼히 보고 토론했다. 경쟁률도 중요하지만 주제 별 도메인이 너무나도 달랐기에 신중해야하는 순간이었다. 챔피언 부문의 경우에는 비슷한 프로젝트로 수상한 선배들도 있고, 이노베이션에도 비슷한 프로젝트로 수상한 선배들이 있었기에 무엇을 선택해도 0에서 시작하는 환경은 아니었다.
  • 긴 토론 후, **신한카드**에서 주관하는 ‘**MZ세대가 떠나는 친환경 ESG 제주여행 루트짜기’**의 주제에 참여했다. 아이디어와 인사이트를 활용한, 데이터 기반의 전략 도출이 중요한 분야였고 데벤져스 팀의 강점이 드러날 수 있으리라 생각하여 결정하게 되었다.
    • (선정 이유) 여행 관련 데이터라 재밌게 할 수 있을 것 같았고, 모델링과 더불어 스토리라인이 잘 드러나는 분야였기에 흥미로웠다.
    • (다른 분야와의 비교) 제주도 여행뿐만 아니라 ESG를 기반한 인덱스를 만드는 느낌이라 재미가 있어 보였다. 이에 반해, 퓨처스 챔피언분야는 방법이 이미 정해져 있고 모범답안이 존재하는 느낌으로 느껴졌다. 치별화된 결과를 만들만했던 건 이노베이션 분야였다.
    • 신한카드가 데이터 및 IT에 큰 흥미를 가지고 사업을 확장하는 모습도 결정의 주안점에 있었다.
    • 주최사는 제주관광공사/신한카드이며, 데이터 제공사 : 신한카드/제주관광공사/산림빅데이터/ Leeds University이다.

진행

0. 매일매일 가을을 갈아넣은 빅콘

  • 경훈이형은 회사를 다니고 정현/경주/혜나/규환은 학교에 다니면서 학회를 하는 스케줄이었다. 주말을 모두 고정 회의시간으로 정했고 일반 주중에도 남는 시간에 만나서 진행하기로 결정했다. 처음 조직된 상황으로부터 3주밖에 시간이 남지 않아서 데이터 ~ 모델링 ~ 경영 전략에 이르기까지 빡센 일정이었다.
  • 주로 만남은 (1) 바오로관 라운지, (2) 스타벅스-신촌 / 서강대학교정문, (3) 인사이트 세션 교실에서 이루어졌다. 당시 평범한 공대생이었던 나는 바오로관 라운지가 어딘지 몰랐는데, 앞으로의 대학생활에 있어 영혼의 안식처가 될 줄은 몰랐다.

    5파라가 어딘지 몰랐던 시절

    6인사이트 세션 다음날 파라에서 시켜먹은 엽떡!

1. 데이터 정제 및 수집

  • 사실 데이터가 너무 많아서 이노베이션 분야로의 참여를 주저했었다. 지역별 탄소를 어떻게 계산할지부터 위도 경도가 담긴 데이터까지, 처음에 어떻게 시작해야할지에 대하여도 감이 잘 잡히지 않았다.
    1. 데이터 수정 및 정제
      • 신한카드에서 직접적으로 제공해 준 데이터들은 물론 엑셀에 잘 설명되어 있었지만, 우리가 팀플레이하기에는 이들을 다 암기하기는 어렵겠다 생각했다. 그래서 기존의 이름으로부터, T4, C5 이런식으로 데이터를 간략화하여 명명하도록 정해두었다. 예를 들어, t6 → t6_jeju_sns_keyword.csv, t7_jeju_sns_emotion_keyword.csv 등으로 이해하기 쉽게 제목을 변경했다.
      • 데이터의 row는 실제 현업의 데이터였다보니 그 양이 상당히 많았다. t1의 경우 316174개, t4의 경우 103만개 등 각각에 대하여 address들을 mapping해야만 했다. 법정동 정의서 기반으로 진행했다.
    2. 주소매칭 후 데이터 통합
      • 처음에 카카오 혹은 네이버지도에서 제공하는 도로명주소 변환API를 활용하면 DataFrame끼리 잘 merge되리라고 생각했다. 그러나 주소가 안 채워진 것들을 삭제하고 나니 컬럼 수가 반이 된 거 같아 무언가 이상하다 생각했다. API를 돌리니 주소가 똑같이 나와 다시 몇번씩 해봤는데도 같은 결과가 나왔다.
      • t5 파일의 경우 ‘기존의 도로명 주소’를 다시 카카오맵 API를 통해 ‘정제된 도로명 주소’로 변환하는 것이 목표였는데, 몇몇 컬럼은 도로명 주소가 검색이 안 되어서 변환되지 않았다.
      • API Request 사용량이 매일 정해져 있어 일일 제한수만큼만 가능했다. 카카오맵 API 사용 블로그를 참조하여 예외처리를 통해서 걸렀었는데 다시 해보려하니까 keyError 잘 안되어서 찾아보니 몇개 안 변환했는데도 불구하고 리밋에 도달한 상태였다.
      • → 카카오 API하는 작업도 생각보다 오래 걸리고, 에러들을 일일히 확인하기도 어려웠고, 애초에 몇만개의 컬럼을 프로세싱하기는 어려웠다. 그러나 주소가 변환되어야 각각에 일치하는 것끼리 데이터 row별로 일치시켜 통일해 진행할 수 있었기에 진행했다.
    3. 데이터 크롤링
      • 데이터 크롤링으로부터 탄소 발자국 알고리즘의 설계까지 10월 3일 월요일날 하기로 결정했다.
      • 비짓제주, 제주관광공사, 네이버플레이스 등으로부터, 여행지 목록 데이터, 여행지 이동 데이터를 산출하는 것이 목표이다.
      • 주변관광지/음식점/숙소까지 크롤링해서 합친 비짓제주관광지데이터를 하나로 통합했다.

2. 여행관련 탄소발자국 계산기 구축

  • **<기존 탄소="" 발자국="" 계산기의="" 한계="">**
    • 기존에 탄소발자국 계산기들이 있지만, 이용한 전기 사용량 등 일반인들이 구체적으로 기억하고 있기 어려운 값들을 정확하게 입력 값에 넣어야 탄소배출량이 계산되는 형태였다. 따라서 우리가 구축하고자 하는 탄소발자국 계산기는, 정확한 수치를 알고 있지 않은 일반인들도 자신이 이용한 숙소 형태나 음식점 정도만 선택한다면 대략적인 탄소 배출량을 알 수 있게 해주는 계산기이다. 또한, 여행이라는 특정 상황에서의 탄소발자국을 계산한다는 점에서 의미가 있다.
    • 우리는 실제 사용성을 고려하여 엑셀이 아닌, 배포/관리/시각화가 용이한 파이썬 기반의 웹 어플리케이션 Streamlit을 이용하여 계산기를 구현했다. 계산기 중간중간에 탄소배출량을 절감하는 팁을 추가해 친환경 여행을 유도하였다. 예를 들어, 렌터카 차종을 선택할 때는 탄소배출량이 적은 연료타입을 알려주고, 숙소를 선택할 때는 호텔의 탄소배출량이 높다는 사실을 강조하는 식이다.
  • 참조한 링크
    • 다양한 블로그 등에 사전에 구현된 음식 탄소발자국 계산기, IBM 탄소발자국 계산공식, 탄소나무계산기 등과 같은 웹 공개 자료와, London 영국 의회에서 발행한 보고서나 논문들을 추가적으로 또한 리서치하여 반영하고자 했다. 세번째의 산림청, 국립산림과학원 탄소나무 계산기 참조를 참조하여 웹으로 어느정도 비슷하게 구현하리라는 목표를 세우고 진행했다.
  • 주요 역할 분담은 다음과 같다.
    • 정현 - 데이터 전처리 (주소 기반), 탄소계산기/관광업 : 데이터 수집, 로직 설계
    • 경훈 - 데이터 전처리 (주소 기반), 탄소계산기/요식업 : 로직 검증, 탄소계산기/관광업 : 데이터 수집, 로직 설계, 여행 알고리즘 설계
    • 경주 - 탄소계산기/교통업 : 데이터 수집, 로직 설계, 추가 비짓제주 및 네이버 지도 데이터 크롤링
    • 혜나 - 탄소계산기/요식업 : 데이터 수집, 로직 설계, 탄소계산기/교통업 : 로직 검증, 기타 로직 검증
    • 규환 - 프로젝트 웹 페이지 구현, Streamlit을 활용한 탄소 발자국 계산기 구현, 로직 검증, 여행객 페르소나 헥사곤 구현
      • 탄소 발자국 계산기의 경우 음식, 관광 등 각자 분야별 나누어서 데이터분석 후 로직구현을 하도록 정리했다. 배출 계산 단계가 복잡하였기 때문에, 각각에 대해서 person처럼 정리하거나, 사칙연산으로 Streamlit 상에서 구현할 수 있도록 했다.

여행 카테고리별 구현

  • (1) 음식 분야
    • 혜나가 음식 분야를 먼저 완성하여 streamlit으로 초안을 만드는 데에 들어갔다.
    • 한국일보에서 개발해 둔 [<한끼밥상 탄소계산기="">](https://interactive.hankookilbo.com/v/co2e/), [다른 탄소발자국 계산기](https://foodfootprint.nl/en/foodprint-finder/)를 바탕으로 교차검증하여 없는 식품에 대하여 리서치하거나 산출된 배출량에 대하여 확인 후 값을 나오도록 설계했다.
    • 기존의 탄소배출량 계산기와 달리, 사용자가 정확한 음식 재료를 몰라도 쉽게 계산할 수 있는 계산기를 개발할 수 있었다.
    • 데이터의 경우 제주 가맹점 데이터에 있는 음식점 목록식품별 탄소배출량 데이터를 이용했다. 추가적으로, 음식점별 메뉴 정보를 얻기 위해 네이버 지도를 크롤링했다.
    • 이용한 음식점이 주어진 데이터에 있는 경우, 음식점 대표메뉴들의 탄소배출량 평균을 해당 음식점의 탄소배출량으로 산정했다. 이용한 음식점이 주어진 데이터에 없는 경우에는, 음식점 유형별 탄소배출량을 일반화해 사용했다. 네이버지도의 태그를 활용해 제주도 음식점을 고기국수집, 횟집 등의 15개의 유형으로 분류한 후, 유형에 속하는 메뉴들의 탄소배출량 평균해당 유형의 탄소배출량으로 산정했다.
    • 음식의 카테고리를 정하는 데에 사실 재료부터 탄소 발자국을 계산하는 데에 들어가기 때문에, 전문가인 경훈이형에게 많이 물어봤던 기억이 난다.

      7

  • (2) 숙박 분야
    • 숙박 카테고리의 경우 정현이누나가 맡아서 진행했다.
    • 데이터의 경우 제공된 비짓제주 데이터주소별 온실가스 배출량 데이터를 이용했습니다. t5 숙소 c3 랑 매칭시켜서 등급별 탄소배출량 평균을 낸 후, 비짓제주 숙박 크롤링이랑 c3 매칭시켜서 호텔 등급별 탄소배출량 평균을 냈다.
    • 추가적으로 숙박 공공데이터를 리서치해 반영하였다. 문화체육관광부 관광숙박업 등록 현황 또한 참조했다.
    • 이용한 숙소가 주어진 데이터에 있어서, 주소 매칭을 통해 실제 탄소배출량을 알 수 있는 경우, 해당 숙소의 탄소배출량을 이용했다. 이용한 숙소가 주어진 데이터에 없는 경우, 숙소유형별 탄소배출량을 일반화해 사용했다. 앞서 구한 숙소별 실제 탄소배출량을 이용해 호텔, 리조트 등의 숙소유형별로 평균값을 계산했다.
    • 사용자가 계산기를 이용할 때도 위의 로직처럼 이용 숙소가 데이터에 있는 경우와 없는 경우로 분리된다. 이를 통해, 사용자는 정확한 전기사용량 등을 몰라도 탄소배출량을 쉽게 계산할 수 있습니다.
  • (3) 관광 분야
    • 관광 분야의 경우 정현, 경주가 맡아서 진행했다.
    • 선정 데이터 : 주어진 데이터는 t4_nature, t4_tour, t1_culture 를 주소 매칭하여 활용하기로 했다. t4_nature는 자연 경관 관광데이터로서, ‘성산일출봉’, ‘천지연폭포’, ‘천제연폭포’, ‘주상절리대’, 등의 경관이 포함된다. 추가적으로 관광 공공데이터를 리서치해 반영하였다. 관광의 경우, 관광지 목록 데이터와 주소별 온실가스 배출량 데이터를 이용했다. 또한, 비짓제주 사이트의 관광지 정보를 크롤링한 데이터를 추가로 이용했다.
    • 아이디에이션 을 통해, → 입장객 수, 카테고리별 탄소배출량, 관광시간을 산출하기로 결정했다.
      1. 관광지카테고리별 (t4) 입장객 수 비율 : 논문 참고 + 추가 자료조사 필요
      2. 관광지 카테고리별 평균 탄소 배출량 : (1인당 계산)
      3. 관광지 카테고리별 평균 관광시간
        • 아이패드 메모장

        8

      • c3랑 매칭된 거+c3 매칭 실패들 등 데이터를 일원화함 약간의 충돌도 있었지만, 일반화한 모든 관광지의 탄소배출량 모음을 구현하도록 노력했다. 관광지별 대분류랑 중분류까지 나와있는 csv 등 을 활용해 관광지 루트 추천에도 반영했다.
  • (4) 교통 분야
    • 교통은 주어진 세개의 내부 데이터를 이용해 탄소배출량을 구했다. 추가적으로, 비행기는 탄소배출량이 굉장히 큰 교통편인데, 내부데이터에 자세하게 나오지 않아, 출발공항이용좌석에 따른 탄소배출량을 알 수 있는 구글플라이트 외부데이터를 이용했다.
    • 탑승 인원수, 이동거리, 차종 등을 질문에 담아 탄소 배출량을 최대한 정확히 산출하고자 했습니다.
  • 이상치 처리
    • 아무래도 위치정보를 이용한 탄소배출량은 100% 정확할 수 없기에 탄소배출량에 대한 이상치를 처리했다.
      • 예를 들어, ‘섭지코지’의 경우 탄소배출량이 매우 높은데, 그 이유는 주소 권역이 너무 넓게 설정되어 있어 여러 건물들이 함께 존재하기 때문임을 확인했다.
      • → 따라서 사분위수를 이용해 발견된 이상치들은 모두 카테고리별 평균값으로 대체했다.
    • 우리 프로젝트의 친환경 여행이었기에, 육각형 중 카테고리 부분 점수 선택할때 자연은 5이상으로만 선택할수있게 하는 등의 조치가 필요하리라 생각했다. 자연이 은근 탄소 배출이 안 높게 나오기도 했고 후처리로도 생각보다 잘 걸러지지 않았기 때문이다. 관광지 탄소 배출량은 다 건물로 매칭한 거라 은근 높게 나온다는 것이 문제였다.
      • → 논문 등에 나와있는 유형별 탄소배출량이랑 비교해보고 타당한지 파악하고, 너무 수치 높게나오는 것은 건물 추정 입장객수를 활용해 수치를 정확하게 수정했다.
        • 교통 / 비행기 $224 kgCO_2$(왕복)
        • 숙소 / 그랜드호텔 1박에 $28kgCO_2$ → 3박이면 $84kgCO_2$
        • 음식 / 이탈리안레스토랑 $3.2kgCO_2$ → 12끼면 $2-30kgCO_2$
        • 관광 / 아직은 천차마별이지만 $0 -3kgCO_2$느낌 -> 12개 한다하면 $1 -30kgCO_2$정도?
      • 사람들이 상식적으로 생각하기에 자연관광지면 탄소배출이 적게나온다는 생각이 드는게 일반적이기에, 우리도 그거에 맞게 탄소배출량 줄이구 그래서 관광지 선택될때도 자연꺼 많이 포함되게 나오도록 조정했다.
    • 단순 해수욕장 등의 자연인데 높은경우는 이상치들 제외한 md_cat 별 평균으로 대체했다. 상세분류 md_cat들에 대해서 각각을 boxplot을 그려보고, 이상치를 어떻게 정의할 것인가에 대해 토론 후 이상치를 제외한 평균으로 각 이상치를 대체해야했다. 우리가 원하는 것은 자연 관광지들에 대하여 탄소 배출을 적게 정의하는거니까 평균 밑으로 어느정도 기준점을 잡아서 진행했다.
    • 대분류&중분류 있는 관광지 이상치: 중분류 내 이상치 제외한 중분류 평균으로 대체
    • 중분류 없는 관광지 이상치: 중분류 내에서 이상치 처리 완료한 상태에서 대분류 평균으로 대체
  • 번외
    • 대상 차량 선별기준 : 일반 승용차 / 연비 최상 (-탄소배출과 반비례요소) / 탄소배출 최소 -> 선정 : 현대자동차 아이오닉 N (2019년형)
    • 중간에 너무 엄밀하게 하다 보니 상세한 분류를 어떻게 해야하는지에 따라서 많은 이야기 후 결정하였다. 그 중 기억이 남았던 부분은 말고기가 반추동물이 아니기 때문에 탄소 배출량이 다르다는 말이었다… 구글링 해도 자료가 나오지 않아 돼지고기와 비슷하다 판단하여 적용했다. (사실 말고기를 안 먹기도 하고)

      9

    • 정현이누나가 잘못 보낸 링크에 리액션해주는 모습이다.. 언제였는지 이제는 기억도 안 난다

      10

3. 친환경 제주 여행 루트와 팁 제안

  • 친환경 뿐만 아니라, 자유여행을 선호하는 MZ세대에게 매력적인 여행 루트를 제공하기 위해 개인화 추천을 중요하게 고려했다. 따라서 단순히 탄소배출량을 최소화하는 것이 아닌, 사용자의 여행취향도 고려하여 최적의 탄소배출량을 도출하는, 여행루트 추천시스템을 설계하였다. 이를 위해서는 사용자 데이터셋과 여행지 데이터셋이 필요하다
  • 이때부터는 수업 끝나면 계속 만나서 빅콘만 계속했던 것 같다. 그 때를 생각해봐도, 갤러리를 보아도 그 때의 순간들이 가득하다. 사실 9월 내내동안 데이터만 만질 때도 매일 만나긴했지만..ㅎㅎ 다음 phase로 넘어간 느낌

    11예쁜 에어비앤비 방에서 빅콘하는 낭만

    12

    13

데이터셋 구축

  • 3.1. 사용자 데이터셋 생성
    • 저희는 취향저격 Hexagon이라는 지표를 개발했다. 개인화된 여행루트를 추천하기 위한, 사용자의 취향이 반영된 6개 요소의 그래프이다. 각 요소에 대해 사용자는 1점부터 10점까지 부여할수 있다. 이 중 액티비티 선호, 자연 선호, 문화유적 선호 지표방문할 관광지를 선정하기 위한 지표로써, 해당 카테고리의 점수가 높을수록 그 카테고리의 관광지가 루트에 많이 포함된다.
    • 핫플 선호, 맛집 추구 지표는 사용자가 잘 알려진 곳과 숨겨진 곳 중 어떤 것을 선호하는지를 반영하기 위한 지표로써, 점수가 높을수록 보다 유명한 곳이 추천된다. 여행 밀도 지표방문할 관광지의 총 개수를 선정하기 위한 것으로, 점수가 높을수록 많은 관광지에 방문한다.
    • 육각형 지표를 구축했으니 이제 사용자에게 INPUT을 입력받는다.
      • 우선, 제주도의 어떤 지역을 여행할 것인지 선택한다. 동부,서부 같은 큰 단위로도, 구좌읍 같은 작은 단위로도 모두 선택 가능하다. 그리고 이용할 교통수단을 선택한다. 이 때 친환경 여행을 위한 렌터카 선택 팁도 함께 제공해 친환경 여행을 유도했다.
      • 그 다음, 취향저격 HEXAGON을 입력받는다. 이 모든 과정은 스트림릿을 활용해 구현했으며, 오른쪽 링크를 통해 확인하실 수 있다.
  • 3.2. 여행지 데이터셋 생성
    • 음식점, 숙박, 관광지 데이터가 필요했는데, 내부데이터 정보가 부족하다고 판단해, 여행지 상세 정보를 제공하는 비짓제주 사이트를 크롤링해 보완했다.
    • 첫번째로 음식점 데이터이다. 비짓제주 사이트에 있는 1646개의 음식점을 크롤링했다. 탄소발자국 계산을 위해 음식점별 해시태그를 바탕으로 음식점을 유형별로 분류한 후, 앞서 구축한 탄소발자국 계산기를 이용해 탄소배출량을 계산했다.
    • 두번째로 숙소데이터 총 939개로, 음식점 데이터와 마찬가지로 숙소를 숙박업종별로 분류한 후, 탄소발자국 계산기를 이용해 탄소배출량을 계산했다. 마지막으로 관광지 데이터 총 1101개이며, 여행루트 추천의 메인이 되는 데이터라고 볼 수 있다. 탄소배출량 계산을 위해 제공된 데이터인 ‘주소별 온실가스배출량 데이터’를 이용했다.
    • 이렇게 모인 데이터에 대해 관광지별 지표 점수를 계산했다. 앞서 설명드린 것처럼 사용자가 자연선호도를 높게 입력하면, 자연성이 높은 관광지가 추천된다. 이를 위해서 저희는 한 관광지를 한 카테고리로 분류하는 것이 아니라, 그 관광지의 상대적인 자연성, 액티비티성, 문화유적성 비율을 산정했다. 예를 들면, ‘성산일출봉’을 ‘자연’ 카테고리로 분류하는 것이 아닌, 자연성 0.77, 액티비티성 0.68 과 같이 점수를 산정했다.
  • 3.3. 여행지 클러스터링
    1. 우선 텍스트 전처리를 하고, 토큰화를 진행했다. 그다음 Word2Vec를 이용해 관광지를 벡터로 변환하여 수치화하는 워드 임베딩 과정을 거쳤다.

      bookmark

    2. 그다음 거리 기반의 군집화 방법인 k means 클러스터링을 진행하였고, 고차원의 데이터 셋차원 축소하는데 효과적인 t-SNE를 이용해, 150차원의 문장벡터를 2차원으로 축소한 후 결과를 시각화했다.
    3. 생성된 6개의 클러스터 중 클러스터1은 해당되는 관광지수가 적으면서, 국내 여행의 목적과 맞지 않는 의료관광과 관련된 클러스터라고 판단해 제거했다.
    4. 이후 클러스터별 상위 10개 명사를 바탕으로, 유사하다고 판단되는 클러스터를 병합했고, 최종적으로 자연, 액티비티, 문화유적 세 개의 클러스터가 형성되었습니다.
    5. 그 다음 클러스터링 결과를 이용해 자연성, 액티비티성, 문화유적성 점수를 산정하는 작업을 진행했다.
      • K-means 알고리즘 특성 상 클러스터의 중심에 위치한 관광지가 해당 클러스터를 가장 잘 대표하므로, 중심점과의 거리가 가까울수록, 해당 클러스터의 속성이 많이 포함된다고 판단했다.
      • 따라서 점수를 (1-거리)의 제곱으로 설정해, 클러스터 중심점과의 거리가 가까울수록 1, 멀수록 0에 가까운 지표를 산정했다.
      • kmeans 클러스터링 개수 일단 6개로 지정하여 (빨주노초파귤) 개수 조정하면서 괜찮은 클러스터를 찾도록 했다.
      • 클러스터 결과 : 최종 크롤링 데이터+명사만 포함+kmeans 8개

          - cluster 0 ['카멜리아힐' '휴애리 자연생활공원' '아침미소목장' '김경숙해바라기농장' '아날로그감귤밭' '제주허브동산' '이니스프리제주하우스’..]
          - cluster 1 ['성산일출봉(UNESCO 세계자연유산)' '사려니숲길' '산굼부리' '섭지코지' '한라산국립공원' '에코랜드 테마파크' '비자림..]
          - cluster 2 ['제주국제공항' '하도해변' '제주레일바이크' '서귀포잠수함(대국해저관광)’…]
          - cluster 3 ['새별오름' '용눈이오름' '다랑쉬오름(월랑봉)' '백약이오름' '따라비오름’…]
          - cluster 4 ['오설록티뮤지엄' '아쿠아플라넷 제주' '방주교회' '성이시돌목장’…]
          - cluster 5 ['우도(해양도립공원)' '협재해수욕장' '월정리해변' '제주올레 12코스'…]
          - cluster 6 ['제주4.3평화공원' '마라도(마라해양도립공원)' '용머리해안' '정방폭포..]
          - cluster 7 ['썬플라워의원' 'THE WE' '서귀포의료원' '솔담한방병원' '제주대학교병원' '제주우리병원' '제주한라병원' '제주카약' '중앙병원' '한국건강관리협회제주특별자치도부']
        

추천시스템 구현

  • 탄소 배출량만을 최소화하는 친환경 여행 루트를 설계하는 것은 쉽지만, 그러한 여행 루트는 사람들에게 매력적으로 다가오지 못할 것이다. 따라서, 탄소 배출량을 줄이는 친환경 여행 루트를 짜되, 충분히 흥미롭게 느껴지는 루트를 설계하는 게 목적이다.
    • 저탄소 생태관광 시나리오를 참고하여 이에 주안점을 두고 루트를 설계하는 데에 고려했다. 이를 요약하면 아래와 같다. 그래도 생태관광이기에 자연 경관을 관광지로 선택하였다.
      • (최대 배출) 택시 + 호텔, 콘도리조트
      • (보편 배출) LPG 렌터카 + 펜션
      • (최소 배출) 휘발유 렌터카 + 친구집

      14

    • 저비용으로 설계하는 것 또한 대회에서의 주안사항이었기에 약 70만원 - 100만원으로 그 range를 두고 항공비/식비/숙박비를 지출할 수 있도록 설계했다.
  • 최단경로 알고리즘 이용해서 탄소배출계산기 바탕으로 MZ 세대에 적합한 여행루트 설계
    • 숙소와 관광명소 크롤링
      • 숙소/관광명소를 키워드로 네이버 블로그나 인스타그램을 크롤링해서 얻은 데이터를 자연어처리 후 감성분석과 클러스터링한 후, 이를 바탕으로 개인에게 맞는 관광지 추천할 예정이다.
      • 관광지 근처의 음식점 5개중에서는 네이버 지도 기반 더 유명한 것을 추천하도록 했다.
    • 저탄소 배출 관광지

      $input탄소 + (1-input)다른지표$

      • 다른 지표로는 인기있거나 맛집을 넣었다. 관광지 인기도 지표를 만든 것처럼 음식점도 지표를 만들어 넣었다.
  • 참조하여 구현
  • 기본 로직
    • 기본적으로는 ‘관광-밥-관광-밥’, ‘관광-밥-관광-밥-관광’, ‘관광-밥-관광-관광-밥-관광’으로 관광지들을 주요 노드에 두고 밥을 그 사이 끼어넣었다. 방문 관광지 개수는 6개에서 16개 사이로 나왔다.
    • 여행 첫 날의 경우 비행기 시간에 따라 첫 관광, 혹은 첫 관광밥 생략가능하도록 조정했다. 비행기로 제주도 가는 사람이 많으니 첫 시작지점은 제주공항이고 계산기는 교통에서 선택하도록 했으며, 마지막날은 비행기 시간에 따라 [:-2] 요소 생략가능하도록 설계했다.
    • 제주도를 크게 동서남북의 네 가지 권역으로 나누었다.
      • 관광지 주변 숙박이 없는 경우가 많아서, 각 지역별로 가장 유명한 펜션/민박을 하나씩 뽑았다. 꼭 조회수 기반이 아니더라도 인기있는 곳을 추천할수있도록 정의했다.

      15

제주 어셈블 코드

코드는 이러한 과정들을 구체적으로 구현하는데, 주로 데이터 처리, 필터링, 최적화 알고리즘 등을 포함한다. 예를 들어, pandas 라이브러리를 사용하여 데이터를 처리하고, numpyscipy를 사용하여 수학적 계산을 수행하며, 다양한 알고리즘 라이브러리를 통해 최적화 문제를 해결한다. 또한, 사용자의 입력을 받고 결과를 출력하는 사용자 인터페이스 부분도 중요한 역할을 한다. 전체적으로 이러한 코드의 구성은 사용자에게 맞춤형 여행을 제공하는데 필수적인 요소다.

제주_어셈블 코드의 개괄은 다음과 같다. 이 알고리즘은 사용자의 위치, 선호도, 그리고 각 관광지의 특성을 고려하여 개인화된 여행 경로와 식사, 숙박 장소를 제공한다. 전체 과정은 데이터 처리, 최적화 계산, 사용자 입력 처리 등을 포함하여 사용자에게 만족스러운 여행 경험을 제공하는 것을 목표로 한다.

  1. Assemble 함수:
    • Filtering: 사용자의 현재 위치와 관광지 인기도를 바탕으로 관광지를 필터링한다. 적절한 후보군(22개에서 최대 103개)을 선정한 후, 이를 더 관리하기 쉽게 일정 수(예: 22개)로 랜덤 샘플링한다.
    • 지역 분류: 관광지를 소분류(loc1, 예: 애월)와 대분류(loc2)로 나누어 관리한다. 유명하지 않은 숨겨진 장소도 포함하여 다양성을 확보한다.
    • Combination: 필터링된 관광지들 중에서 사용자가 하루에 방문할 관광지 수(num tour weighted)에 따라 가능한 모든 조합을 생성한다. 각 조합에 대해 관광 목적, 인기도, CO2 배출량을 합산하여 최적의 조합을 선정한다.
  2. CO2 최소화 및 최적 경로:
    • CO2 최소화: CO2 배출량이 일정 비율 이하인 조합들 중에서, 사용자의 선호도와 가장 유사한 경로를 선택한다.
    • 최단거리 경로(Recommended tour): 선택된 관광지들 중에서 이동 거리를 최소화하는 순서로 방문 경로를 결정한다. 가능한 모든 순서의 조합(permutation)을 고려하여 계산한다.
    • Min route: 전체 경로 중 이동 거리가 가장 짧은 경로를 최종적으로 선택한다.
  3. 식사 및 숙박 장소 추천:
    • 식사 장소 결정: 사용자가 식사 시간에 맞춰 방문할 수 있는 식당을 daily route에 포함시킨다. 이때 주변 음식점의 정보, 식사 가능 시간, CO2 배출량 및 인기도를 고려한다.
    • 숙박 장소 결정: 일정의 마지막 관광지 근처에서 숙박할 수 있는 장소를 추천한다. 사용자의 선호도에 따라 호텔, 펜션, 게스트하우스 등 다양한 유형의 숙소를 고려한다.
  4. 유저 적합성 고려:
    • User fit 식당 선정: 사용자의 선호도(bad value)에 따라 식당을 선정하고, 점심과 저녁을 교차하여 배열한다. 만약 적당한 식당이 없으면 지역별 대표 식당(good food)을 제공한다.
  5. 숙소 고려
    1. 숙소 추천 시스템:
      • 일정의 마지막 관광지: 하루 일정의 마지막 관광지를 기준(min route[-1])으로 주변 숙박 시설을 찾는다.
      • 주변 숙박 시설 탐색: 마지막 관광지 이름을 기준으로 주변 숙박 시설을 검색한다. 만약 검색된 숙박 시설이 없거나 분류되지 않은 경우, 추가적인 처리 과정을 통해 적합한 숙박 시설을 찾는다.
    2. 사용자 선호도에 따른 숙소 유형 분류:
      • 여유로운 사용자(beak value < 0.2): 사용자가 여유로운 여행을 선호한다고 판단되면, 호텔, 리조트, 콘도와 같은 고급 숙소를 추천한다.
      • 보통의 여행자(0.2 ≤ beak value < 0.8): 평균적인 여행 선호도를 가진 사용자에게는 펜션, 민박, 모텔, 여관 등을 추천한다.
      • 활동적인 여행자(beak value ≥ 0.8): 활동적이고 경제적인 여행을 선호하는 사용자에게는 게스트하우스, 캠핑, 글램핑 등을 추천한다.
    3. 예외 처리:
      • 숙소 미발견 시 대응: 적합한 숙소를 찾지 못하는 경우, 사전에 정의된 ‘good accom’ 목록에서 대체 숙소를 추천한다. 이 목록에는 각 지역별로 대표되는 숙소가 포함되어 있어, 사용자에게 일정한 품질의 숙박 시설을 제공할 수 있다.
        • assemble(df, user) 로 함수를 불러서 쓸 수 있다.

    16

  • 새벽에 경훈이 형 코드가 잘 돌아가지 않아서,, 혜나랑 열심히 삽질하다, 첫 번째 페르소나가 나왔던 감격스런 순간이다. 깨 있던 혜나와 나는 정말 이 때 기뻤다. 당일 오전 여섯시에 경주는 지쳐 자고 있었고 정현이누나는 집을 갔다가 방으로 다시 오는 길이었던걸로 기억한다.

    17드디어 나온 페르소나

  • 대고객 커뮤니케이션 방안

    1. 인스타그램 활용 방안이다.
      • 취향저격 Hexagon에 따라 추천된 여행루트밤하늘 별자리로 표현해, 인스타그램에 공유하는 이벤트를 제안했다. 이는 탄소배출량을 줄이면, 공기가 맑아지고 밤하늘의 별이 더 밝게 빛나게 된다는 점에서 착안하였다.
      • MZ 세대는 인스타그램을 활발히 이용하기 때문에, MZ 세대 이용자를 확보할 수 있을 것으로 기대했다.
    2. 제주도 북두칠성 버스킹 라이브
      • 현대카드는 매년 슈퍼콘서트를 개최해 큰 홍보 효과를 누렸지만, 콘서트는 개최 과정에서 많은 탄소가 배출된다는 문제가 있다. 현대카드가 고객의 문화생활을 타게팅하기 위해서 현대카드 슈퍼콘서트같은거나 현대카드 뮤직라이브러리를 운영하는데 제주도에서도 저녁부터 시작해서 조명없는 어쿠스틱 콘서트 하면 좋을 것 같다고 생각했다.
      • 별도의 조명이 필요없는 칠성대 분수 공원에서 진행하는 친환경적인 버스킹 콘서트를 신한카드 측에 제안하는 것으로 마무리했다.
    3. 신한카드 ESG 제주 여행 콘테스트
      • 기존에 존재하는 신한 그린 인덱스 지수를 활용하여 여행 시 탄소 절감을 잘 실천한 고객을 선정하거나, 친환경 여행 브이로그 영상 우수작을 선정하는 콘테스트이다.
      • 위 3가지의 방법을 통해 신한카드의 친환경 경영 이미지를 구축할 수 있으며, ‘친환경 여행’이라는 MZ세대의 새로운 트렌드를 만들어나갈 수 있을 것이라 기대한다.
      • 제주관광공사 측면에서랑 신한카드 가 데이터를 제공했다는 것에 착안하여, 제주 관광객과 신한카드 이용고객에 대한 커뮤니케이션 방안을 제안했다.

제출 당일

  • 분석 주제, 사용한 데이터, 전처리, 모델링, 결과, 활용 방안 등 모두가 쉽게 이해할 수 있을만큼 탄탄한 스토리를 구성했다. 나랑 경주가 같이 작업에 들어갔다. 창업팀 등 다양한 활동으로 나는 프레젠테이션 자료를 빨리 잘 만든다는 장점을 가지고 있고, 경주는 디자인적으로나 경영적으로 어떠한 장표가 어울리는지 잘 알고 있어서 끊임없이 파일을 주고받으며 완성을 시켜나갔던 것 같다.
  • 제출당일, 밤을 새고 긴박하게 제출했던 우리들의 모습이다. 고등학교 때도 대학교 때도 밤을 샌 적 없었는데 에어비앤비로 방을 대여해 열심히 달렸던 기억이 난다.

    18

  • 경훈 취뽀 이후 현직자 데이까지 예측한 혜나 정현의 모습이다

    19

  • 수업도 째고.. 마감 5분전 벼락치기 제출 완료
  • **1차 서류평가 기준**
    • 탄소 계산기(40%) + 여행루트(50%) + 고객 커뮤니케이션 방안(10%)
    • 단순 탄소 배출량 최소화보다, 탄소배출량 절감 TIP등을 활용한 탄소 중립을 실천하는 여행 루트 개발하기
  • 제출완료 “귀하의 건승을 기원합니다”

    20

발표심사(11.28)

  • 2차 PT 발표심사는 현장 발표로 진행되며, 발표순서는 2022 빅콘테스트 서포터즈에서 추첨방식으로 선정 예정이었다. 이노베이션분야의 경우 11. 28(월)이고, 12팀 중에 2번째로 선정되어 열시 쯤 발표가 진행될 예정이었고, 청계천 주변 한국지능정보사회진흥원 서울사무소에서 발표를 진행했다.
  • **2차 발표평가 기준은 다음과 같았다.**
    • 1차 서류심사 내용 구체화 및 발표능력
    • 심사위원 질의에 대한 논리적 대응 및 설명력
  • 아침 일찍 만나서 사진 왕창 찍었다.

    21

    22

  • 빅콘테스트 이노베이션분야 2차 PT발표 질의응답
    • 1-1 질문과 답변: 숙소에서의 탄소 배출량 계산에 수용 인원을 고려했는지 여부.
      • 답변: 숙소의 성격과 수용 인원이 다양하여 정확한 인원 수와 객실별 탄소 배출량을 알기 어렵다. 따라서 건물에서 나오는 총 탄소 배출량을 기준으로 하며, 특정 건물에 대한 정보가 없을 경우 유형별 평균값을 사용하여 계산한다.
    • 2번째 질문과 답변: MZ 세대의 특성을 반영한 탄소 저감 여행과 여러 명이 여행할 경우의 여행 루트 설계에 대한 고려 사항.
      • 답변: MZ 세대의 특성을 반영하여 인기도, 유행, 독특한 장소 선호 등을 고려하여 알고리즘을 설계했다. 여러 명이 여행할 경우 각자 선호도를 조정하여 그룹에 최적화된 경로를 찾는데, 이는 알고리즘의 인풋 값을 조정하여 다양화된 추천을 받는 방식으로 해결할 수 있다.
    • 3번째 질문과 답변: GeoPy 라이브러리를 사용한 직선 거리 계산의 정확성.
      • 답변: 실제 주행 거리와 직선 거리가 다를 수 있으나, 네이버 API 사용의 비용과 속도 문제로 GeoPy 라이브러리를 사용하여 직선 거리(유클리디언 거리)를 계산했다.
    • 4번째 질문과 답변: 숙박 시설의 속성별 선택과 탄소 배출량 계산에 대한 고민.
      • 답변: 여행 밀도와 선호도에 따라 숙박 시설을 선택하며, 데이터베이스에 있는 호텔의 탄소 배출량 정보를 활용하여 저탄소 숙소를 추천한다.
    • 5번째 질문과 답변: 개인의 선호도에 고착되지 않고 다양한 관광지를 추천하는 대응책.
      • 답변: 알고리즘에 랜덤성을 도입하고, 리커트 척도를 10점으로 설정하여 사용자가 다양한 선호도를 입력할 수 있게 함으로써, 똑같은 입력에도 다른 결과가 나오도록 설계하여 다양화된 추천을 제공한다.
    • 이후 메일이 오고 나서 시상식때 최종 결과가 나옴을 전달받았다.

      232022년 2학기의 결실!

시상식(12.21)

  • 최우수상을 받을 수 있었다.

    24

    25

  • 의미 없는 경험은 없다!
    • 2학기 거의 전체, 3개월에 달하는 기간동안 여념 없이 대회에 참여함과 동시에, 공대생 3학년의 신분으로 학교를 다니면서도, 나의 경우엔 창업팀에서의 성과가 나와서 빅콘 대회 당일에도 다이슨 어워드 시상식을 갔다오는 등 빡빡했던 스케줄이었다.
    • 그러한 긴 기간동안, 적지 않은 명수의, 아주 다각화된 배경을 가지고 있는 다섯명의 구성원들과 함께했던 시간들을 떠올려 보면 정말 후회없다. 의견 충돌이 있을 때에도 서로 충분히 근거에 빗대어 설명했고 그 합치된 의견에 대해서는 함께 나아갔다. 피땀흘려 함께했던 시간들이 대학생활 중 따스했던 추억으로 남아있다. 상을 수상할 수 있어 좋았지만, 좋은 친구들과 열심히 협업했던 스물셋의 소중한 기억으로도 충분했다.

      26동아리 자기소개 페이지에서도 이루어진 빅콘자랑 ~

  • 진로로서의 고민 해결
    • 소프트웨어 엔지니어로서의 꿈은 초등학생 때부터 스티브 잡스를 동경하며 지속적으로 바라 온 목표였고, 고등학생 때 부터는 딥러닝 엔지니어의 꿈을 위해 노력하고 있습니다. 대학에서도 데이터를 다루는 역량과 더불어 이로부터 인사이트를 창출하는 작업으로부터 다양한 방법론을 효율적으로 적용할 수 있으리라 느껴 INSIGHT 동아리에 합류했다.
    • INSIGHT, 특히 데벤져스에서 빅콘을 준비하며 정말 다양한 배경과 도메인을 가지고, 각자의 목표를 향해 나아가는 열정적인 학회원들과 교류하며 깊은 리스펙은 물론 서로로부터 좋은 에너지와 시너지를 낼 수 있었다. 데이터 분석 뿐만 아니라 개발, 딥 러닝에 이르기까지 많은 분야로부터 열정적으로 참여할 기회 그 자체였다.

27

신한카드&월드뱅크 그린인덱스 워크샵

  • 빅콘테스트 사무국에서 오랜만에 정현이누나를 통해서 연락이 왔다. 탄소 데이터 관련하여 대학생 대회 프로젝트를 발표하는 자리였다. 이전 피피티로부터 부족한 부분을 채운 이후, 어색할 수 있는 부분들을 영어로 모두 수정했다. 큰 자리에서 발표하는 기회가 많이 있을 것 같지는 않으리라 생각했기에 내가 발표를 진행했다.

28또다시 울린 정현이누나의 버스터콜

29