데이터 오픈마켓
국가교통 데이터 오픈마켓에서 제공하고 있는 서비스를 메뉴얼을 통해 확인해보세요.
시작하기
1단계) 데이터 오픈마켓 접속
데이터 오픈마켓을 이용하기 위해서는 사이트 상단의 회원가입을 통해 이용할 수 있습니다.
2단계) 회원가입
회원가입은 네이버, 구글 아이디를 통한 간편 가입 및 이메일/문자 인증을 통한 가입이 가능합니다.
데이터 상품 구매
데이터를 활용하기 위해서는 우선 데이터 구매하여야 합니다. 구매 후 데이터를 다운받아 보세요.
1단계) 데이터 검색
홈페이지 상단에 데이터 상품 → 데이터 검색을 클릭합니다.
2단계) 상품 선택
① 검색조건 - 찾고자 하는 카테고리, 기업 등의 조건을 통해 데이터를 쉽게 찾을 수 있습니다.
② 외부 데이터 - 빅데이터 플랫폼에 있는 다른 데이터도 함께 확인할 수 있습니다.
③ 데이터 상품 - 구매하고자 하는 데이터 상품을 클릭하면 상품 구매로 넘어갑니다.
3단계) 상품 구매
① 상품 구매 및 요약 - 선택한 상품의 간단한 요약 정보를 제공해주며 상품 구매 버튼을 눌러 상품 구매를 할 수 있습니다.
② 상품 설명 - 상품에 대한 상세한 설명(판매업체, 등록일자, 주기, 용량 등)을 확인할 수 있습니다.
③ 샘플 데이터 - csv 파일의 경우 테이블 형태로 샘플 데이터 모습을 보여주고 데이터 정의서를 통해 데이터 구조를 제공합니다.
4단계) 데이터 구매
구매할 데이터를 선택 후 선택 구매하기 버튼을 눌러주세요.
활용목적 및 구매조건을 확인 한 후 결제를 진행하시면 됩니다.
결제가 완료된 데이터는 나의 구매내역에서 다운로드 받으실 수 있습니다.
데이터 경진대회
국가교통 데이터 오픈마켓에서는 국토교통 데이터 경진대회 등의 공모전을 개최하고 있습니다.
공모전에 참여하거나 직접 공모전을 개최할 수 있습니다.
공모전 개최
1단계) 회원 가입
- 오픈마켓 회원가입을 합니다.
교통데이터 오픈마켓 회원이면 누구나 무료로 공모전을 등록하실 수 있습니다.
2단계) 공모전 등록 및 승인요청
- 공모전 등록 메뉴에서 공모전 개요를 작성해서 오픈마켓 관리자에게
승인 요청 합니다.
(공모명, 주최 사, 공모기간, 공모전지원 요강 등)
3단계) 공모전 검토 및 진행
- 제출된 공모전 요강을 확인하고 담당자와 협의하여 공모전을 승인하면,
공모전 페이지를 오픈합니다.
(공모전 내용 확인을 위해 공모전 담당자에게 연락 드려 상세히 협의 진행)
4단계) 공모전 운영
- 교통데이터 오픈마켓은 마켓회원 대상으로 등록된 공모전 참여를 독려하여
성공적인 공모전 운영을 지원합니다.
(회원 SMS 및 이메일 발송, 메인 배너 홍보 등)
5단계) 공모전 종료
- 공모전 참가자에 대한 평가를 지원하고 선정 결과를 공모전 페이지에 제공하고 종료합니다.
→
→
→
→ 
공모전 참여
1단계) 공모전 선택
공모전 현황을 확인하고 참가할 공모전을 선택합니다.
2단계) 공모전 확인
공모전의 주제, 참가에 관한 요강을 확인해주세요.
3단계) 공모전 참여
공모전에 참가하고 자료를 제출합니다.
4단계) 공모전 결과발표
공모전 결과는 전문가의 심사를 거쳐 홈페이지에 게재됩니다.
참고) 공모전 Q/A
공모전 관련 문의사항이 있으면 언제나 문의해주세요.
데이터 활용사례
데이터를 어떻게 활용하는지 어떤 가치가 있는지 확인해보세요.
다양한 기업이나 공공기관에서 데이터를 활용하여 정책이나 사업을 추진하고 있어요.
활용사례
예시
데이터를 활용한 각 기관의 활용사례를 확인해보세요.
리빙랩
한국교통연구원에서 제공하는 리빙랩을 활용하여 교통 정보를 분석하고 다양한 API를 활용해보세요.
참고) 보육교육 교통정보 시각화
데이터 오픈마켓에는 보육교육 시설의 교통정보를 시각화하여 어린이 보호구역에 대한 어린이, 청소년의 안전을 진단하고 정책 수립에 활용할 수 있습니다.
참고) 서울 버스정류장 시각화
서울시 버스정류장의 위치정보 시각화를 확인해보세요.
커뮤니티
전문가 포럼, 소모임 등 데이터 분석이나 자료를 공유할 수 있는 공간을 구성하였습니다.
전문가 포럼
데이터 관련 소식이나 전문가의 데이터 분석관련 내용을 확인할 수 있습니다.
기업 홍보
데이터 관련 기업에서 기업을 홍보할 수 있는 공간입니다.
찾아가는 설명회
오픈마켓에서는 데이터 설명회를 개최하고 플랫폼 및 교통 데이터의 대한 소개를 하고 있습니다.
1:1 멘토링
1:1 멘토링을 통해 교통 데이터 분석부터 서비스 제공까지 컨설팅 받을 수 있습니다.
소모임
소모임 활동으로 주제별 커뮤니티를 형성하고 분석방법을 공유해보세요.
자료실
자료실을 통해 데이터를 주고 받아보세요.
내 정보관리
나의 회원정보를 수정하거나 구매내역, 문의내역을 확인할 수 있습니다.
안심구역 신청을 통해 오프라인 안심구역에 방문하여 가명정보 등 민감 데이터의 사용도 가능합니다.
나의 구매내역
내가 구매한 데이터를 확인하고 다운로드 받을 수 있습니다. API의 경우 호출할 수 있는 예제도 제공됩니다.
나의 문의내역
오픈마켓 내에서 문의한 데이터, Q/A 등의 문의내역을 확인할 수 있습니다.
나의 안심구역
안심구역 신청 및 신청현황 확인을 통해 승인된 사용자의 안심구역 이용이 가능합니다.
개인정보 관리
개인정보를 수정하고 업데이트 할 수 있습니다.
판매회원 전환
구매회원은 언제든지 사업자 등록증 등을 통해 데이터를 판매할 수 있습니다.
관심데이터 관리
메인화면에서 내가 구매하고자하는 키워드의 데이터를 확인할 수 있습니다.
고객센터
고객센터에는 공지사항, FAQ, Q/A, 데이터 신청 및 문의 등 전반적인 사이트 이용에 도움이 되거나 불편사항 등을 건의할 수 있는 공간입니다.
공지사항
공지사항에는 각종 공모전 개최계획, 새로운 데이터 제공 계획 등을 확인하실 수 있습니다.
FAQ
FAQ는 자주 묻는 질문들을 모아놓았습니다. Q/A에 질의하기 전에 먼저 확인해주세요.
Q/A
데이터 및 사이트 이용에 있어서 불편사항을 문의할 수 있고 건의도 가능합니다.
데이터 신청 및 문의
데이터 관련 전용 게시판입니다. 신규 데이터의 신청 및 문의사항을 올려주세요.
데이터 안심구역
국가교통 데이터 안심구역은 국토교통 분야의 민감 데이터를 오프라인 안심구역을 통해 활용할 수 있습니다.
시작하기
데이터 안심구역에 방문하기 전에 오픈마켓에서 활용할 데이터를 신청해주세요.
1단계) 데이터 검색
홈페이지 상단에 데이터 상품 → 데이터 검색을 클릭합니다.
2단계) 데이터 선택
데이터를 확인 후 안심구역 신청 버튼을 누릅니다.
신청이 완료되었단 화면이 나오면 안심구역 데이터 신청이 완료된 것입니다.
3단계) 안심구역 신청
안심구역에서 활용할 데이터를 선택 후 안심구역 신청 버튼을 누릅니다.
보안 서약서 및 방문일자 등을 기입한 후 이용신청을 완료합니다.
4단계) 신청현황 확인
방문신청 일자 및 신청상태를 확인합니다. 방문승인이 완료되면 안심구역 이용이 가능합니다.
안심구역에 있는 분석 시스템을 통해 데이터를 분석 및 활용합니다.
IRIS Analyzer
IRIS Analyzer는 다양한 데이터 소스로부터 인사이트를 얻기 위한 가장 쉽고 빠른 도구로써, 데이터를 빠르게 탐색하거나 시각화하여 기초적인 분석 작업을 수행할 수 있습니다.
- ‘검색’ 기능에서는 데이터 모델의 데이터를 Discovery-Service 명령어로 필터링, 통계 변환, pivot 등을 실행할 수 있습니다.
- ‘피벗’ 메뉴에서는 데이터 모델의 데이터를 행과 열 기준으로 통계 및 변환하고 차트 기능을 제공받을 수 있습니다.
- ‘이상탐지’ 메뉴에서는 과거 동일한 시간대의 참조 데이터 대비 조회 기간 데이터의 이상탐지 결과를 히트맵과 상/하한 임계치 차트로 제공받을 수 있습니다.
- ‘분석 템플릿’ 메뉴에서는 분석 작업시 입력/설정한 내용(데이터 모델, 시간 설정, 검색어 등)를 다시 수행하거나 다른 사용자에게 공유할 수 있도록 템플릿으로 저장할 수 있습니다.
검색
검색화면의 데이터는 데이터 모델을 대상으로 합니다.
DBMS, ObjectStorage, HDFS 등 다양한 데이터소스로부터 생성한 데이터 모델을 선택하고, 조회할 검색 시간을 설정한 후에 IRIS Discovery-Service 명령어를 통해 필터링, 변환, 피버팅, 통계, 다양한 기계 학습 기능 등을 수행할 수 있습니다.
검색 메뉴는 데이터에 대한 탐색적 데이터 분석(EDA; Exploratory Data Analysis)에 유용한 메뉴입니다. 또한, 실행된 결과를 파일로 내보내기를 하거나 시각화/피벗 등의 Analyzer의 다른 메뉴로 바로 이동이 가능합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 데이터 모델 / 시간 설정 | 데이터 모델 선택과 시간 범위 설정을 선택하는 탭 컨트롤입니다. |
2 | 데이터 모델 목록 | 데이터 모델/데이터 모델 뷰 필터, 모델 명 검색, 정렬 등을 할 수 있으며, 샘플링 설정(관리자)을 할 수 있습니다. |
3 | 컬럼 목록 | 컬럼 별 데이터 개수를 확인하고, 데이터 컬럼 명을 검색하여 목록을 필터링 할 수 있으며, 선택한 데이터 모델의 컬럼들의 표시 여부를 선택할 수 있습니다. 컬럼에 마우스를 대고 우 클릭하면 컬럼 및 컬럼 전체의 이름을 복사할 수 있는 창이 뜨고, 클릭하면 컬럼 이름이 복사가 되어 ‘Ctrl+V’로 붙여넣기가 가능해집니다. 데이터 개수를 활성화 하고 검색어를 실행하면 검색 결과에서 각 컬럼의 distinct한 데이터의 개수를 확인할 수 있습니다. |
- 시간 설정
- 미리 설정/날짜 및 시간 범위: 시간 설정 방식 중 하나를 선택할 수 있습니다.
- 미리 설정(프리셋): 미리 정의된 시간 설정 중 하나를 선택할 수 있습니다. 미리 설정의 항목들은 모두 상대 시간으로, 설정했을 경우 작업 수행 시마다 현재 시간을 기준으로 설정한 시간 범위가 검색 기간으로 적용됩니다.
- 날짜 및 시간 범위: 정해진 포맷으로 날짜 및 시간 텍스트를 직접 입력하여 범위를 설정하거나, 날짜 선택 캘린더와 시간을 시/분/초로 나눈 드롭다운을 활용하여 날짜 및 시간을 선택할 수 있습니다.
- 샘플링 설정
샘플링 기능은 대량은 원본 데이터 테이블을 조회하지 않기 위한 기능입니다. 따라서 샘플링 설정을 하게 되면 샘플링 테이블을 이용하여 조회 작업을 수행하여 검색의 효율이 높아지는 효과가 있습니다.
- 사용 안함: 원본 테이블 대상으로 조회
- 원본: 설정한 샘플링 비율을 바탕으로 샘플링 적용
- 샘플링 테이블: 샘플링 테이블을 대상으로 조회
- [기간 옵션] 미리 설정
기간 옵션 | 설명 |
---|---|
전체시간 | 저장된 모든 데이터 대상으로 |
최근 N분 | 검색 시점으로부터 N분전 0초부터 검색 시점까지 |
최근 N시간 | 검색 시점으로부터 N시간 전 0분 0초 부터 검색 시점까지 |
지난 N일 | 검색 시점으로부터 N일 전 0시 0분 0초 부터 검색 시점까지 |
지난 N분 | 검색 시점으로부터 N분 전 0초부터 검색 시점의 0초까지 |
오늘 | 금일 00:00:00 부터 검색 시점까지 |
어제 | 어제 00:00:00 부터 오늘 00:00:00 이전까지 |
이번 주 | 금주 일요일 00:00:0 0부터 검색 시점까지 |
이전 주 | 이전 주 일요일 00:00:00 부터 금주 일요일 00:00:00 이전까지 |
이번 달 | 금월 1일 00:00:00 부터 검색 시점까지 |
이전 달 | 이전달 1일 00:00:00 부터 금월 1일 00:00:00 이전까지 |
이번 분기 | 이번 분기 1일 00:00:00 부터 검색 시점까지 |
이전 분기 | 이전 분기 1일 00:00:00 부터 이번 분기 1일 00:00:00 이전까지 |
이번 년도 | 금년 1월 1일 00:00:00 부터 검색 시점까지 |
이전 년도 | 작년 1월 1일 00:00:00 부터 금년 1월 1일 00:-00:00 이전까지 |
- [기간 옵션] 날짜 및 시간 범위 설정
날짜 및 시간 범위 설정
- ‘날짜 및 시간 범위’에서는 년/월/일에서부터 시/분/초까지 상세한 일자와 시간을 사용자가 직접 설정할 수 있습니다.
시작시간과 종료 시간을 나누어 설정하며, 직접 정해진 포맷(ex. 2022/03/08 10:36:01)대로 입력하여 설정하거나 캘린더와 드롭다운 목록을 통해 설정할 수도 있습니다.
또한 종료시간의 ‘현재 시간’ 체크박스에 체크를 하면 작업 수행시마다 종료시간은 현재 시간으로 적용됩니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 검색(검색 질의어) | 검색어 입력란에 검색어를 입력할 수 있으며, 바로 하단의 검색어 추천 기능 활성화 시 이전 검색 이력, 도움말 창이 내려옵니다. 검색어/도움말 박스에서 검색 이력을 확인하고 검색 도움말 기능을 받을 수 있습니다. 이전 검색 이력은 키보드 위/아래 키나 마우스 클릭으로 선택할 수 있으며, 선택하면 바로 입력란에 이전 검색 내용이 입력됩니다. 검색어 추천 창이 자동으로 나타나는 것을 원하지 않는다면 검색어 추천 버튼을 클릭하여 off 상태로 만들면 됩니다. |
2 | 부가 기능 | 검색 옵션, 이동(피벗/시각화/이상탐지로 이동), 분석 템플릿, 불러오기, 새창으로 열기, 분석 코드 복사 등의 기능을 이용할 수 있습니다. |
3 | 결과 화면 | 검색 조건에 따른 검색 결과를 출력할 수 있습니다. |
- 부가 기능
- 검색 옵션: 최대 검색 결과 개수, 최대 통계 결과 개수에 관한 설정을 할 수 있습니다.
- 실행: 검색 작업을 실행하는 버튼이며, 실행 중에는 실행을 멈출 수 있는 중지 버튼으로 바뀝니다.
- 이동: 데이터 모델, 시간 설정, 필터링 검색어 내용 그대로 피벗/고급 시각화/이상탐지 화면으로 이동할 수 있습니다.
- 분석 템플릿: 현재 검색 조건과 데이터 모델, 시간, 검색어를 템플릿으로 저장할 수 있습니다. 저장된 분석 템플릿은 권한에 따라 제작된 템플릿을 다른 사람과 공유할 수 있습니다.
- 불러오기: 저장된 분석 템플릿과 다른 사람이 저장한 분석 템플릿을 권한에 따라 불러와 실행할 수 있습니다. 또한 접속 계정에서 수행한 검색어의 이력을 볼 수 있으며, 이 중에서 재실행 검색어를 선택할 수 있습니다.
- 새 창으로 열기: 현재 설정 그대로 새 창(탭)에서 검색 작업을 실시할 수 있습니다. 여러 개의 창으로 작업할 때 유용합니다.
- 분석코드 복사: Rest API로 검색어 실행 결과를 받을 수 있는 예제 코드(R/Python/Node.js 코드)를 클립보드에 복사할 수 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 이벤트 | 이벤트 탭에 DSL 검색어(*)의 결과가 출력됩니다. |
2 | 컬럼 분포 확인 | 검색 명령어를 실행한 후, 검색 명령어 결과 내에서 선택한 컬럼 값의 종류와 상위 10개 값의 개수 등의 컬럼 분포를 확인할 수 있습니다. |
3 | 검색 결과 그리드 | 특정 셀의 값을 클릭하여 필터링 할 수 있습니다. |
4 | 내보내기 | 내보내기 버튼을 클릭하면 로컬 PC 또는 HDFS에 파일 형태로 저장할 수 있습니다. 로컬 PC에 저장하는 파일 형식은 CSV/TSV/JSON이 있습니다. HDFS에 저장할 때는 연결 정보를 설정하고, 디렉토리 path를 지정한 후에 구분자를 입력하여 파일로 저장할 수 있습니다. ‘콤마(,)’가 디폴트 구분자이며, ‘tab(t)’ 구분자, '│' 구분자 등의 다양한 구분자를 설정할 수 있습니다. |
- 검색 결과 그리드
검색에 추가
- ‘검색에 추가'를 클릭하면, 현재 검색 조건에 ‘선택한 셀'이 자동으로 추가되어 필터링 된 재검색 결과가 화면에 출력됩니다.
검색에서 제외
- ‘검색에서 제외'를 클릭하면, 현재 검색 조건에 ‘선택한 셀'이 자동으로 추가되어 필터링 된 재검색 결과가 화면에 출력됩니다.
새로운 검색
- 기존 검색과 무관하게 다른 컬럼을 선택하여 재검색을 수행하고자 할 경우에 사용할 수 있습니다.
피벗
IRIS Analyzer의 피벗 분석 메뉴는 데이터의 행과 열을 재정렬하고 간단한 계산을 수행하여 테이블로 결과를 출력합니다.
테이블의 출력 결과를 가로막대형, 세로막대형, 꺾은선형, 원형 차트로 표시할 수 있습니다.
또한, 개별 차트의 세부 옵션을 설정할 수 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 데이터모델/시간설정 | 검색하고자 하는 데이터 모델과 검색 기간을 설정할 수 있습니다. |
2 | 데이터 모델 목록 | 데이터 모델/데이터 모델 뷰 필터, 모델 명 검색, 정렬 등을 할 수 있으며, 샘플링 설정(관리자)을 할 수 있습니다. |
3 | 컬럼 목록 | 선택한 데이터 모델의 컬럼들을 확인할 수 있습니다. |
4 | 데이터 설정 표기 | 데이터 모델/시간/검색어 등의 설정된 정보들을 확인할 수 있습니다. |
5 | 피벗 영역 | 피벗 영역에서 유형에 따른 피벗 방식을 설정할 수 있습니다. ‘>>’버튼을 눌러 피벗 영역을 숨기거나 다시 보이게 할 수 있습니다. |
6 | 결과 화면 | 검색 및 피벗 조건에 따른 피벗 결과를 출력할 수 있습니다. |
- 부가 기능 : 사용자의 작업을 돕는 역할이며, 다음과 같은 기능들이 있습니다.
- 다른 화면으로 이동: 데이터 모델, 시간 범위, 검색어 등 현재 선택되고 입력된 설정을 가지고 검색/고급 시각화/이상탐지 화면으로 이동할 수 있습니다.
- 시각화 저장: 현재 검색 조건과 여러가지 설정들을 템플릿으로 저장할 수 있습니다.
- 불러오기: 검색 이력 및 시각화 목록 창을 열 수 있습니다.
- 새창에서 실행: 현재 설정 그대로 새 창에서 검색 작업을 실행하는 버튼입니다.
시각화
시각화 기능은 사용자가 검색 결과의 각 필드, 행, 열 등을 GUI 화면 상에서 적절히 조합함으로써 원하는 분석 결과를 쉽고 빠르게 도출하기 위하여 사용되는 강력한 분석 툴입니다.
피벗과는 달리 시각화에 중점을 두어 차트에 최적화된 직관적인 사용자 인터페이스를 제공하며, 다양한 차트 설정 및 시각화 옵션을 제공합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 데이터 모델/시간설정 | 검색하고자 하는 데이터모델과 검색 기간을 설정할 수 있습니다. |
2 | 데이터 모델 목록 | 데이터모델/데이터모델뷰 필터, 모델 명 검색, 정렬 등을 할 수 있으며, 샘플링 설정(관리자)을 할 수 있습닝다. |
3 | 컬럼 목록 | 선택한 데이터 모델의 컬럼들을 확인할 수 있으며, 컬럼 별 필터를 적용할 수 있습니다. |
4 | 검색 정보 표기 및 부가 기능 | 데이터 모델/시간/검색어 등의 설정된 정보들을 확인할 수 있으며, 실행/이동/분석 템플릿/불러오기/새 창으로 열기 기능을 활용할 수 있습니다. |
5 | 분석 유형 설정 | 시계열/분포/관계형/이상치/예측/지도형 등의 분석 유형을 선택할 수 있습니다. |
6 | X/Y축 등의 설정 및 차트 결과 | 차트의 X,Y축 혹은 그룹에 컬럼을 지정하고 차트의 결과를 볼 수 있습니다. |
이상탐지
이상탐지 기능은 사용자가 지정한 데이터와 시간 범위 내에서 다양한 옵션과 알고리즘을 통해 급격한 변화나 평소에는 나타나지 않는 값 등 이상치를 검출하는 기능을 제공합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 데이터 모델/시간설정 | 검색하고자 하는 데이터모델과 검색 기간을 설정할 수 있습니다. |
2 | 데이터 모델 목록 | 데이터모델/데이터모델뷰 필터, 모델 명 검색, 정렬 등을 할 수 있으며, 샘플링 설정(관리자)을 할 수 있습닝다. |
3 | 컬럼 목록(필드 목록) | 선택한 데이터 모델의 컬럼(필드)들을 확인할 수 있습니다. |
4 | 검색 정보 표기 | 데이터 모델/시간/검색어 등의 설정된 정보들을 확인할 수 있습니다. |
5 | 카드 추가 | (+) 버튼을 통해 카드를 추가할 수 있으며, 추가된 카드들은 해당 영역에 바둑판식으로 나열됩니다. 카드 추가 버튼을 눌렀을 때, 팝업으로 뜨는 ‘실행 옵션’에서 여러가지 설정을 할 수 있으며, ‘상세 옵션 숨기기/펼치기‘ 버튼을 통해 상세 옵션을 확인하실 수 있습니다. |
- 실행 옵션
키 필드: 분석 대상으로 지정할 키 필드입니다. 복수 개 설정이 가능합니다. 키 필드 설정에 대한 자세한 내용은 [참고]를 확인하세요.
값 필드: 분석 대상으로 지정할 값 필드입니다. 복수 개 설정이 가능합니다. 키 필드 설정에 대한 자세한 내용은 [참고]를 확인하세요.
모델: 이상탐지 분석 시에 사용할 분석 모델을 선택합니다. Default는 SPC 입니다.
- SPC(Statistical Process Control): 참조그룹의 데이터의 평균과 표준편차로 관리상한선, 관리하한선을 설정하여 관리하는 모델
- IQR(Inter-Quartile Range): 백분위수(percentile)를 기준으로 삼사분위수(Q3)에서 일사분위수(Q1)를 뺀 값으로 정의할 수 있습니다. 즉, IQR = Q3 –Q1(75% 범위 값에서 25% 범위 값을 뺀 나머지 범위) 입니다.
- 없는 Key 값: 키 필드 데이터 중 누락된 데이터를 이상상황으로 처리할지 여부를 선택할 수 있습니다.
- 결측치: 누락된 데이터(missing value)에 대한 처리 방법을 결정합니다. “처리하지 않음” 외에 다른 항목을 선택할 경우, 누락된 데이터를 선택한 값으로 대체합니다. 사용자가 이 값을 지정할 수도 있습니다.
- 시간 설정 : 이상탐지 분석 중 시간 범위에 대한 설정을 할 수 있습니다.
- 비교 기간: 분석할 데이터의 시간 범위를 지정합니다.
- 참조 기간: 분석에 참조할 데이터의 시간 범위를 지정합니다. ‘참조 기간 자동 조정’ 체크 시, 참조 기간이 상대 시간일 경우, 비교 기간과 참조 기간이 겹치지 않도록 참조기간을 조정합니다.
- 단위: 분석 시 비교기간 시간 범위 내에서 summary를 수행할 단위입니다.
- 요일 분류: 비교 기간의 요일에 따라 분석할지 평일/휴일로 분류하여 분석할지를 결정합니다. ex) 비교 기간의 요일이 화요일이면 참조 기간의 화요일 데이터를 참조합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 키 필드 추가 | 분석 대상으로 지정할 키 필드입니다. 복수개 설정이 가능합니다. |
2 | 값 필드 추가 | 분석 대상으로 지정할 값 필드입니다. 복수개 설정이 가능합니다. |
- 키 필드 설정하기
- ‘+ 추가’ 버튼을 클릭하면, 필드 리스트가 오픈 됩니다. 필드 리스트는 필드 유형과 필드 명으로 구성되어 있습니다.
- 오픈 된 필드 리스트 중에서 키 필드로 지정하고자 하는 필드를 선택하면, 상세 설정 popup이 오픈 되고, ‘최대 키 개수’, ‘특정 값 지정’을 통한 필터 설정 등을 수행할 수 있습니다.
- ‘최대 키 개수’ 입력란 하단의 라디오 버튼 그룹은 특정 키 필드에 대해서 수행하기 위한 일종의 필터 옵션입니다. ‘모든 값’을 선택할 경우 필터를 설정하지 않고 모든 키 필드 값에 대해 분석을 수행하며, ‘특정 값 지정’을 선택한 경우에는 아래 그림처럼 상위 10개 키 값이 그리드 뷰로 출력되어 이를 체크박스로 선택할 수 있습니다.
- 원하는 값을 ‘특정 값 지정’에서 찾지 못한 경우, ‘직접 입력’을 선택 후 입력란에 값을 입력하는 방식으로 원하는 키 값을 직접 지정할 수 있습니다. (콤마(,)로 구분하여 입력)
- 값 필드 설정하기
- ‘+ 추가’ 버튼을 클릭하면, 필드 리스트가 오픈 됩니다. 필드 리스트는 필드 유형과 필드 명으로 구성되어 있습니다.
- 오픈 된 필드 리스트 중에서 값 필드로 지정하고자 하는 필드를 선택하면, 아래와 같은 상세 설정 popup이 오픈 되고, 문자형/시간형 컬럼에 대하여 ‘제외값’, ‘함수‘ 를 통한 설정을 할 수 있으며, 숫자형 컬럼에 대하여 ‘최솟값’, ‘최댓값’, ‘제외값’과 ‘함수’를 통한 설정을 수행할 수 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 실행 옵션 정보 버튼 | 마우스를 버튼 위에 올리면 해당 카드의 실행 옵션 내용을 툴팁으로 보여줍니다. |
2 | 제목 | 실행 옵션에서 설정한 카드 제목을 표시합니다. |
3 | 스케일 모드 ON/OFF | Heatmap 일 때만 등장하는 기능으로, Heatmap 차트의 각 cell별 색상을 모든 값에 대하여 계산할지 행 단위로 계산할지 여부를 선택합니다. |
4 | 확대/축소 버튼 | 카드를 확대하거나 축소하는 버튼입니다. |
5 | 메뉴 버튼 | 클릭하면 설정 변경/복사/다시 실행/삭제와 같은 기능 메뉴를 선택할 수 있습니다. |
6 | 차트 영역 | 차트가 그려지는 영역입니다. 실행 옵션에 따라 Heatmap 혹은 Line Plot이 그려집니다. |
7 | 카드 추가 | ‘+’ 버튼을 누르면 카드가 추가됩니다. |
- 기능 메뉴
설정 변경
- 선택하면 실행 옵션 다이얼로그를 다시 팝업 합니다. 이를 통해 실행 옵션을 변경하고 이상 탐지 분석을 다시 수행할 수 있습니다.
복사
- 실행 옵션 및 분석 결과를 복사하여 새로운 카드를 추가합니다.
다시 실행
- 설정된 현재 실행 옵션으로 이상탐지 분석을 다시 수행합니다. 네트워크 이상 등으로 분석 결과를 수행하지 못했거나 결과가 적절하지 못할 때 다시 실행 기능을 활용해 실행을 초기화 할 수 있습니다.
삭제
- 해당 카드를 카드 영역에서 완전히 삭제합니다.
분석 템플릿
시각화는 분석 화면에서 검색 조건과 여러가지 설정 정보를 담고 있는 일종의 템플릿입니다.
시각화 관리 화면에서는 각 화면에서 사용자가 작성하여 저장한 시각화 객체들을 수정하거나 삭제할 수 있습니다. 또한 특정 시각화를 다른 사용자가 접근할 수 있도록 권한을 부여할 수도 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 새로고침 버튼 | 시각화 목록을 다시 불러와 갱신할 수 있습니다. |
2 | 목록 설정 | 그리드에 표시되는 항목들을 필터링하거나 선택할 수 있습니다. |
3 | 시각화 목록 | 소유자 정보, 작업(시각화 이름 변경/수정/복제/삭제/URL 복사), 수정일, 구분(분석화면 이름), 데이터 모델 정보를 확인할 수 있으며, 접근 권한을 설정할 수 있습니다. 또한 목록에서 모델명 좌측에 위치한 ‘▶ 아이콘’을 클릭하여 현재 생성된 데이터 모델의 상세 정보를 확인할 수 있으며, ‘▼ 아이콘’을 통해 데이터 모델의 상세 정보를 닫을 수 있습니다. |
- 시각화 목록
- 소유자: 시각화 내용을 작성/저장한 사용자의 정보를 확인할 수 있습니다.
- 작업: 시각화 이름 변경/수정/복제/삭제/URL 복사가 가능합니다.
- 수정일: 시각화를 마지막으로 수정한 일시를 확인할 수 있습니다.
- 구분: 시각화 유형 혹은 시각화를 저장한 분석 화면 이름을 확인할 수 있습니다.
- 데이터 모델: 시각화의 데이터 모델 정보를 확인할 수 있습니다.
- 접근 권한: 접근 권한을 설정할 수 있습니다.
-
접근 권한 설정
- 사용자/그룹 탭: 사용자 혹은 그룹을 전환하기 위한 탭입니다.
- 모든 사용자 체크 박스: 모든 사용자에게 공유하고자 할 때 체크합니다.
- 현재 권한 목록(권한이 있는 사용자): 현재 접근 권한을 가진 사용자 혹은 사용자 목록에서 추가한 권한을 부여하고자 하는 사용자 목록입니다.
- 사용자 목록(사용자 추가): 모든 사용자 목록. “추가” 버튼을 클릭하면 현재 권한 목록에 추가됩니다.
피벗 설정
피벗 설정하기 - 테이블
피벗 분석 메뉴에서 가장 기본이 되는 차트로, 데이터를 테이블 형태로 보여줍니다. 개별 차트에 그려지는 데이터는 테이블 에서 먼저 필터, 정렬을 수행 한 후, 개별 차트에서 그려집니다.
-
필터
- 필터를 클릭하면 피벗 대상 데이터 모델의 컬럼 목록이 나옵니다. 컬럼이 문자형이면 필터유형이 문자/시간형이면 필터 유형이 ‘일치’만 있는 창이 나오고, 컬럼이 숫자형이면 필터 유형이 ‘일치’와 '사이’가 각각 나옵니다.
문자/시간형 컬럼
- = : 해당 컬럼 값이 일치 조건 입력란에 입력한 값과 일치하는 데이터를 피벗 실행의 대상으로 제한합니다.
- !=: 해당 컬럼 값이 입력한 값이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- LIKE: 해당 컬럼 값이 입력한 값을 포함하는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- NOT LIKE: 해당 컬럼 값이 입력한 값을 포함하지 않는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- 다음으로 시작함: 해당 컬럼 값이 입력한 값으로 시작하는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- 다음으로 끝남: 해당 컬럼 값이 입력한 값으로 끝나는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NULL: 해당 컬럼 값이 Null인 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NOT NULL: 해당 컬럼 값이 Null이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
숫자형 컬럼
- '=' : 해당 컬럼 값이 일치 조건 입력란에 입력한 값(숫자)과 일치하는 데이터를 피벗 실행의 대상으로 제한합니다.
- '!=': 해당 컬럼 값이 입력한 값(숫자)이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '<=': 해당 컬럼 값이 입력한 값(숫자)보다 작거나 같은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '<' : 해당 컬럼 값이 입력한 값(숫자)보다 작은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '>=': 해당 컬럼 값이 입력한 값(숫자)보다 크거나 같은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '>' : 해당 컬럼 값이 입력한 값(숫자)보다 큰 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NULL: 해당 컬럼 값이 Null인 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NOT NULL: 해당 컬럼 값이 Null이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
-
행 선택(선택 항목)
- 사용자는 피벗 실행의 결과로 출력될 데이터를 행 단위로 그룹핑하기 위하여 그룹핑할 필드를 지정할 수 있습니다. 컬럼 목록에서 특정 컬럼을 선택하고, 최대 행의 수 등을 설정합니다.
문자형 컬럼
정렬: 행 단위로 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’입니다.
- 기본값: 정렬을 하지 않습니다.
- 오름차순: 출력될 데이터를 해당 컬럼 값의 알파벳 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 해당 컬럼 값의 알파벳 단위 내림차순으로 정렬합니다.
최대 행 수: 사용자는 피벗 테이블 실행 결과로 화면에 출력될 데이터 목록의 최대 행 수를 지정할 수 있습니다. Default는 ‘500’으로 설정되어 있습니다. 즉, 화면에 출력될 데이터 목록은 최대 500 라인이며, 500 라인 이후의 데이터 목록은 출력되지 않습니다.
숫자형 컬럼
범위 만들기
- 숫자형 컬럼의 경우, 피벗 실행결과로 출력되는 각 열을 컬럼 값의 개별 숫자별로 표현할 것인지, 일정 범위를 지정하여 표현할 것인지 여부를 묻는 항목입니다.
- 범위를 지정하고자 할 경우, “예” 버튼을 클릭하여 아래와 같이 연계된 항목들을 설정할 수 있습니다. 범위를 지정하지 않는 경우, “아니오” 버튼을 클릭합니다.
범위 크기
- “범위 만들기” 항목에서 컬럼 값의 범위를 지정할 경우에 설정합니다. 사용자는 해당 컬럼 값을 그룹핑 할 범위의 크기를 지정할 수 있습니다.
범위 시작
- “범위 만들기” 항목에서 컬럼 값의 범위를 지정할 경우에 설정합니다. 해당 컬럼 값을 그룹핑하는 경우, 범위가 시작되는 값을 지정합니다.
범위 끝
- “범위 만들기” 항목에서 컬럼 값의 범위를 지정할 경우에 설정합니다. 해당 컬럼 값을 그룹핑하는 경우, 범위의 마지막 값을 지정합니다.
정렬
그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’으로 설정되어 있습니다.
- 기본값: IRIS DB에 저장된 순서로 출력됩니다.
- 오름차순: 출력될 데이터를 숫자 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 숫자 단위 내림차순으로 정렬합니다.
최대 행 수
- 사용자는 피벗 테이블 실행 결과로 화면에 출력될 데이터 목록의 최대 행 수를 지정할 수 있습니다. Default는 ‘500’으로 설정되어 있습니다. 즉, 화면에 출력될 데이터 목록은 최대 500 라인이며, 500 라인 이후의 데이터 목록은 출력되지 않습니다.
시간형 컬럼
단위: 사용자는 이벤트가 발생한 시각 단위로 데이터를 그룹핑 할 수 있습니다.
- 이벤트의 시각 단위는 1년, 1개월, 1일, 1시간, 1분, 10분, 1초 중에서 선택 가능합니다.
- “단위” 항목은 시간 컬럼 설정을 위한 필수 항목이며, Default은 ‘1시간’ 입니다.
정렬: 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 아래와 같이 지정할 수 있습니다. Default는 ‘기본값’입니다.
- 기본값: IRIS DB에 저장된 순서로 출력됩니다.
- 오름차순: 출력될 데이터를 시각 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 시각 단위 내림차순으로 정렬합니다.
-
열 선택(선택 항목)
- 사용자는 출력될 결과의 열에 해당되는 컬럼을 설정할 수 있습니다. 컬럼 리스트에서 특정 컬럼을 선택하고, 최대 열의 수와 대소문자 구분 여부를 설정합니다. “대소문자 구분 여부” 는 pivot집계를 할 때, 대/소문자 구분 여부를 선택합니다.
문자/숫자형 컬럼
- 정렬: 열 단위로 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’으로 설정되어 있습니다.
- 대소문자 구분여부: 열 선택이 1개 이상 일 때 사용가능한 값으로, pivot 을 수행할 때 대문자와 소문자를 서로 다른 값으로 간주하여 처리할 지 선택하는 옵션입니다. 체크를 해제하면 대/소문자 구분을 하지 않아 같은 데이터로 처리됩니다. (ex. ABC = abc)
- 최대 열 수: 사용자는 피벗 테이블 실행 결과로 화면에 출력될 데이터 목록의 열의 최대수를 지정할 수 있습니다. 피벗 테이블 실행 결과, 너무 많은 데이터가 출력되면, 오히려 사용자가 분석하는데 불편을 겪을 수 있으므로, 효율적인 분석을 위한 최소한의 데이터로 피벗 실행결과의 출력을 제한하는 것입니다.
시간형 컬럼
- 정렬: 열 단위로 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’으로 설정되어 있습니다.
- 대소문자 구분여부: 열 선택이 1개 이상 일 때 사용가능한 값으로, pivot 데이터의 집계를 할 때, 대/소문자 구분을 할지/하지 않을 지 선택하는 옵션입니다. 옵션 선택에 따라 대소문자 값을 구분하여 다른 값으로 집계할 지의 여부를 결정할 수 있습니다.
-
값 선택(선택 항목)
- 사용자는 출력될 결과값을 설정할 수 있습니다. “값 선택”에는 default로 Event Object의 개수가 설정되어 있으며, 특정 컬럼에 대한 피벗 실행 결과 값을 콤보박스에서 선택하여 설정할 수 있습니다.
문자형 컬럼
값: 피벗 실행 결과로 출력될 해당 필드의 첫 번째 값, 마지막 값, 또는 출력되는 필드 값의 개수를 지정할 수 있습니다.
- 첫 번째 값: 출력되는 특정 필드의 값 중, 첫 번째 값만 출력합니다.
- 마지막 값: 출력되는 특정 필드의 값 중, 마지막 값만 출력합니다.
- 개수: 출력되는 특정 필드의 count 가 출력됩니다.
- 값의 개수: 출력되는 특정 필드의 값의 개수( distinct count ) 가 출력됩니다.
시간형 컬럼
값: 피벗 실행 결과로 출력될 해당 필드의 첫 번째 값, 마지막 값, 또는 출력되는 필드 값의 개수를 지정할 수 있습니다.
- 시작: 출력되는 특정 필드의 값 중, 첫번째 시간 값만 출력합니다.
- 종료: 출력되는 특정 필드의 값 중, 마지막 시간 값만 출력합니다.
- 값의 개수: 선택한 특정 필드의 값의 개수( distinct count )가 출력됩니다.
숫자형 컬럼
값: 피벗 실행 결과로 출력될 해당 필드의 통계 항목을 지정할 수 있습니다.
- 합계: 통계 대상 이벤트에 대하여, 해당 필드 값의 합계 산출
- 개수: 통계 대상 이벤트의 개수 산출
- 평균: 통계 대상 이벤트에 대하여, 해당 필드 값의 평균값 산출
- 최대: 통계 대상 이벤트에 대하여, 해당 필드 값의 최댓값 산출
- 최소: 통계 대상 이벤트에 대하여, 해당 필드 값의 최솟값 산출
- 표준 편차: 통계 대상 이벤트에 대하여, 해당 필드 값의 표준편차 산출
- 중간값: 통계 대상 이벤트에 대하여, 해당 필드 값의 중간값 산출
- 값의 개수: 통계 대상 이벤트에 대하여, 해당 필드 값의 개수(distinct count)가 출력됩니다.
피벗 결과 분석하기 - 테이블
번호 | 구분 | 설명 |
---|---|---|
1 | 목록 개수 드롭다운 | 결과 영역에 출력되는 피벗 실행 결과에 대하여, 페이지 당 출력 가능한 리스트의 수를 10개, 20개, 50개 단위로 지정할 수 있습니다. |
2 | 내보내기 버튼 | 사용자가 설정한 피벗의 실행 결과를 파일로 다운로드하거나 HDFS 등의 원격 위치에 저장할 수 있습니다. 버튼을 클릭하면 검색과 동일한 내보내기 창이 팝업 됩니다. |
3 | 피벗 결과 그리드 | 피벗 결과 혹은 피벗 결과의 일부분을 출력한 그리드입니다. |
4 | 검색 화면 이동 메뉴 | 현재 설정된 필터/행/열/값 선택 등을 검색어로 변환하여 검색 화면으로 이동합니다. |
피벗 설정하기 - 차트(막대/꺾은선형)
-
가로막대형 차트
- 막대형 차트는 수치의 크기를 막대의 길이로 표현하는 차트입니다. 범주형 Y축, 수치형 데이터를 X축으로 막대그래프로 보여 줍니다.
-
세로막대형 차트
- 막대형 차트는 수치의 크기를 막대의 길이로 표현하는 차트입니다. 범주형 X축, 수치형 데이터를 Y축으로 막대 그래프로 보여줍니다.
-
꺾은선형 차트
- X축에 따른 Y축의 값을 Line 차트 형태로 보여주는 차트로, 주로 시계열 데이터를 표현하는데 많이 활용됩니다. 시간에 따른 값의 추이를 볼 때 유용합니다.
-
필터
- 사용자는 필터를 사용하여 피벗 실행의 대상이 되는 데이터의 범위를 제한할 수 있습니다. 사용자는 특정 필드의 값의 범위를 설정함으로써, 피벗 실행의 대상이 되는 데이터를 제한하게 됩니다. 예를 들어, 인터넷 서비스 로그에서 서비스 실패 원인을 분석하기 위하여, 서비스가 성공한 로그는 분석 대상에서 제외하고자 할 경우, cause 필드의 값으로 ‘fail’이 포함된 로그로 필터를 설정할 수 있습니다. 필터 항목은 선택 사항이므로, 사용자가 필터를 설정하지 않으면 전체 데이터에 대하여 피벗이 실행됩니다. (테이블 설정과 동일합니다.)
시간형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 첫 번째 값, 마지막 값, 또는 출력되는 컬럼 값의 개수를 지정할 수 있습니다.
- 시작: 출력되는 특정 컬럼의 값 중, 첫번째 시간 값만 출력합니다.
- 종료: 출력되는 특정 컬럼의 값 중, 마지막 시간 값만 출력합니다.
- 값의 개수: 선택한 특정 컬럼의 값의 개수( distinct count )가 출력됩니다.
문자형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 첫 번째 값, 마지막 값, 또는 출력되는 컬럼 값의 개수를 지정할 수 있습니다.
- 첫 번째 값: 출력되는 특정 컬럼의 값 중, 첫 번째 값만 출력합니다.
- 마지막 값: 출력되는 특정 컬럼의 값 중, 마지막 값만 출력합니다.
- 개수: 출력되는 특정 컬럼의 count 가 출력됩니다.
- 값의 개수: 출력되는 특정 컬럼의 값의 개수( distinct count ) 가 출력됩니다.
숫자형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 통계 항목을 지정할 수 있습니다.
- 합계: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 합계가 산출됩니다.
- 개수: 통계 대상 이벤트의 개수가 산출됩니다.
- 평균: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 평균값이 산출됩니다.
- 최대: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 최댓값이 산출됩니다.
- 최소: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 최솟값이 산출됩니다.
- 표준 편차: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 표준편차가 산출됩니다.
- 중간값: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 중간값이 산출됩니다.
- 값의 개수: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 개수( distinct count ) 가 출력됩니다.
-
X축
- 사용자가 피벗 차트의 X축에 대하여 설정할 수 있도록 지원합니다. 피벗 테이블의 “행 선택”에 대응되는 설정으로, 차트 유형에 따라 “X 축” 항목은 필수 항목일 수 있습니다. 이 때는 사용자가 반드시 설정하여야 합니다.
-
Y축
- 사용자가 피벗 차트의 Y축에 대하여 설정할 수 있도록 지원합니다. 피벗 테이블의 “값 선택”에 대응되는 설정으로, “Y 축” 항목은 이벤트의 개수가 default로 설정됩니다.
-
색상(범례)
- 사용자는 X 축에 표시되는 막대 그래프 각각의 값을 표시하는 범례를 추가하거나 삭제할 수 있습니다. 피벗 테이블의 “열 선택”에 대응되는 설정입니다.
피벗 결과 분석하기 - 차트(막대/꺾은선형)
- 출력된 피벗 차트에서 특정 그래프에 마우스 오버하면 해당 그래프에 대한 자세한 정보가 Pop-up으로 오픈 됩니다.
- 범례에서 특정 항목을 클릭하면, 클릭한 범례에 해당하는 필드를 미선택으로 변경하게 되므로, 차트에서 해당 범례가 사라지게 됩니다.
- 차트의 특정 영역을 드래그하여 해당 영역의 차트만 Zoom-in하여 분석할 수 있습니다.
- Zoom-in된 상태에서 원래의 차트 상태로 복구하려면 우측 상단의 ‘확대/축소 재설정’ 버튼을 클릭하면 됩니다.
- 막대 등 차트에 그려진 특정 도형을 클릭하면 선택한 도형의 필드-값으로 검색 화면으로 이동하거나 새 창에서 검색 작업을 수행할 수 있습니다.
피벗 설정하기 - 차트(원형)
원형 차트는 원 안에서 수치의 크기를 원호의 크기로 표현하는 차트입니다. 데이터를 백분율로 변환하여 데이터의 계열(범주형 변수)이 각각 얼마만큼의 비중을 가지는 지 파악하기에 유용합니다.
-
필터
- 피벗 대상 데이터 모델의 컬럼 목록을 확인할 수 있습니다. 컬럼이 문자형이면 필터 유형이 ‘일치’만 있는 창이 나오고, 컬럼이 숫자형이면 필터 유형이 ‘일치’와 '사이’가 각각 나옵니다.
문자/시간형 컬럼
- = : 해당 컬럼 값이 일치 조건 입력란에 입력한 값과 일치하는 데이터를 피벗 실행의 대상으로 제한합니다.
- !=: 해당 컬럼 값이 입력한 값이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- LIKE: 해당 컬럼 값이 입력한 값을 포함하는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- NOT LIKE: 해당 컬럼 값이 입력한 값을 포함하지 않는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- 다음으로 시작함: 해당 컬럼 값이 입력한 값으로 시작하는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- 다음으로 끝남: 해당 컬럼 값이 입력한 값으로 끝나는 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NULL: 해당 컬럼 값이 Null인 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NOT NULL: 해당 컬럼 값이 Null이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
숫자형 컬럼
- '=' : 해당 컬럼 값이 일치 조건 입력란에 입력한 값(숫자)과 일치하는 데이터를 피벗 실행의 대상으로 제한합니다.
- '!=': 해당 컬럼 값이 입력한 값(숫자)이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '<=': 해당 컬럼 값이 입력한 값(숫자)보다 작거나 같은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '<' : 해당 컬럼 값이 입력한 값(숫자)보다 작은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '>=': 해당 컬럼 값이 입력한 값(숫자)보다 크거나 같은 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- '>' : 해당 컬럼 값이 입력한 값(숫자)보다 큰 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NULL: 해당 컬럼 값이 Null인 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
- IS NOT NULL: 해당 컬럼 값이 Null이 아닌 데이터를 피벗 실행의 대상으로 제한할 경우에 사용합니다.
-
색상(범례)
- 사용자는 원의 각각의 값을 표시하는 범례를 추가하거나 삭제할 수 있습니다. 피벗 테이블의 “열 선택"에 대응되는 설정입니다.
문자/시간형 컬럼
- 최대 색상 수: 테이블 유형에서 '최대 행 개수'와 동일합니다.
숫자형 컬럼
- 범위 만들기: 숫자형 필드의 경우, 피벗 실행결과로 출력되는 각 열을 필드 값의 개별 숫자별로 표현할 것인지, 일정 범위를 지정하여 표현할 것인지 여부를 묻는 항목입니다. 범위를 지정하고자 할 경우, “예” 버튼을 클릭하여 아래와 같이 연계된 항목들을 설정할 수 있습니다. 범위를 지정하지 않는 경우, “아니오” 버튼을 클릭합니다.
- 범위 크기: “범위 만들기” 항목에서 필드 값의 범위를 지정할 경우에 설정합니다. 사용자는 해당 필드 값을 그룹핑 할 범위의 크기를 지정할 수 있습니다.
- 범위 시작: “범위 만들기” 항목에서 필드 값의 범위를 지정할 경우에 설정합니다. 해당 필드 값을 그룹핑하는 경우, 범위가 시작되는 값을 지정합니다.
- 범위 시작: “범위 만들기” 항목에서 필드 값의 범위를 지정할 경우에 설정합니다. 해당 필드 값을 그룹핑하는 경우, 범위가 시작되는 값을 지정합니다.
- 범위 끝: “범위 만들기” 항목에서 필드 값의 범위를 지정할 경우에 설정합니다. 해당 필드 값을 그룹핑하는 경우, 범위의 마지막 값을 지정합니다.
시간형 컬럼
- 단위: 어떠한 시간 단위로 데이터를 그룹핑 할 것인지 지정합니다. 시간 유형의 컬럼을 지정했을 때만 나타납니다.
-
크기
- 원형 차트에서 파이의 크기를 결정하기 위한 컬럼을 설정하는 기능입니다. 피벗 테이블의 ‘값 선택‘과 동일합니다.
Event Object의 개수
- 정렬: 이벤트가 발생 시, 이벤트(데이터)의 개수에 대한 정렬을 할 수 있습니다.
문자형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 첫 번째 값, 마지막 값, 또는 출력되는 컬럼 값의 개수를 지정할 수 있습니다.
- 첫 번째 값: 출력되는 특정 컬럼의 값 중, 첫 번째 값만 출력합니다.
- 마지막 값: 출력되는 특정 컬럼의 값 중, 마지막 값만 출력합니다.
- 개수: 출력되는 특정 컬럼의 count 가 출력됩니다.
- 값의 개수: 출력되는 특정 컬럼의 값의 개수( distinct count ) 가 출력됩니다.
정렬: 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’입니다.
- 기본값: IRIS DB에 저장된 순서로 출력됩니다.
- 오름차순: 출력될 데이터를 해당 컬럼 값의 알파벳 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 해당 컬럼 값의 알파벳 단위 내림차순으로 정렬합니다.
숫자형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 통계 항목을 지정할 수 있습니다.
- 합계: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 합계가 산출됩니다.
- 개수: 통계 대상 이벤트의 개수가 산출됩니다.
- 평균: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 평균값이 산출됩니다.
- 최대: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 최댓값이 산출됩니다.
- 최소: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 최솟값이 산출됩니다.
- 표준 편차: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 표준편차가 산출됩니다.
- 중간값: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 중간값이 산출됩니다.
- 값의 개수: 통계 대상 이벤트에 대하여, 해당 컬럼 값의 개수( distinct count ) 가 출력됩니다.
정렬: 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 지정할 수 있습니다. Default는 ‘기본값’으로 설정되어 있습니다.
- 기본값: IRIS DB에 저장된 순서로 출력됩니다.
- 오름차순: 출력될 데이터를 숫자 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 숫자 단위 내림차순으로 정렬합니다.
시간형 컬럼
값: 피벗 실행 결과로 출력될 해당 컬럼의 첫 번째 값, 마지막 값, 또는 출력되는 컬럼 값의 개수를 지정할 수 있습니다.
- 시작: 출력되는 특정 컬럼의 값 중, 첫번째 시간 값만 출력합니다.
- 종료: 출력되는 특정 컬럼의 값 중, 마지막 시간 값만 출력합니다.
- 값의 개수: 선택한 특정 컬럼의 값의 개수( distinct count )가 출력됩니다.
정렬: 그룹핑되어 출력되는 데이터를 어떻게 정렬할 것인지를 아래와 같이 지정할 수 있습니다. Default는 ‘기본값’입니다.
- 기본값: IRIS DB에 저장된 순서로 출력됩니다.
- 오름차순: 출력될 데이터를 시각 단위 오름차순으로 정렬합니다.
- 내림차순: 출력될 데이터를 시각 단위 내림차순으로 정렬합니다.
피벗 결과 분석하기 - 차트(원형)
- 출력된 피벗 차트에서 원하는 파이 부분에 마우스 오버하면 해당 그래프에 대한 자세한 정보가 Pop-up으로 오픈 됩니다.
- 범례에서 특정 항목을 클릭하면, 클릭한 범례에 해당하는 필드를 미선택으로 변경하게 되므로, 차트에서 해당 범례가 사라지게 됩니다.
- 특정 파이를 클릭하면 선택한 파이의 필드-값으로 검색 화면으로 이동하거나 새 창에서 검색 작업을 수행할 수 있습니다.
시각화 설정
시각화 분석 설정 및 차트 옵션
- 분석 설정
- 시각화 화면에서 데이터 모델을 선택한 뒤, 필드 목록에서 마우스 드래그&드랍으로 원하는 위치의 박스에 끌어다 놓음으로써 X축, Y축 박스에 필드를 설정할 수 있으며, 끌어다 놓은 이후에는 박스가 드래그한 필드로 설정됩니다.
- 상세한 옵션을 변경하고 싶다면 X축, Y축에 해당하는 박스를 더블 클릭한 후, 새로 팝업 되는 창에서 설정을 변경하면 됩니다. 설정 가능한 옵션의 종류는 필드의 타입 및 X축/Y축 등에 따라 달라집니다.
- 데이터 모델 및 시간 범위와 함께 해당 시각화 유형에서 필요로 하는 모든 설정을 끝냈다면 ‘실행 아이콘(▶)’을 눌러 시각화 작업을 진행할 수 있습니다.
시각화 분석 (1) 시계열
[시계열] 꺾은선형
꺾은선형은 시간의 경과에 따른 데이터의 변화를 꺾은선으로 시각화 하는 분석 방법입니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | 차트의 X축에 관한 설정 UI 입니다. 피벗의 “행 선택”과 대응됩니다. 꺾은선 차트의 경우 시간 필드만 X축에 설정할 수 있으며, 선택한 데이터 모델의 시간 필드가 자동으로 설정이 됩니다. 또한, 시간 범위 설정을 변경할 때마다 “Summary 시간 단위”가 어느정도 자동 조정이 됩니다. |
4 | Y축 | 차트의 Y축에 관한 설정 UI 입니다. 피벗의 “값 선택”과 대응됩니다. 설정한 필드를 지정한 “Summary 방식”에 따라 계산하여 수치화한 값으로 Y축을 구성합니다. 설정하지 않으면 Default로 “이벤트 개수”가 설정됩니다. (-count(*)) |
5 | 그룹 | 트의 색상/범례 분할에 관한 설정 UI 입니다. 각 데이터를 그룹핑할 컬럼을 지정하는 기능입니다. 피벗의 “열 선택”과 대응되나, 집계에 영향을 주지 않고 분류(Classify) 기능만 수행합니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
X축
- Summary 시간 단위: 시각화 작업을 수행할 때 어떠한 시간 단위(1년, 1개월, 1일, …)로 summary를 수행할지 선택하는 옵션입니다.
- 최대 행 수: 시각화 작업 결과의 데이터 개수를 제한하는 옵션입니다.
-
Y축
- Summary 방식: 시각화 작업을 수행할 때 지정한 필드를 어떠한 함수로 summary를 수행할지 선택하는 옵션입니다. 문자형 필드의 경우 “데이터 개수”, 숫자형 필드의 경우 “합계”가 기본으로 설정됩니다.
- 최대 열 수: 시각화 작업 결과 개수를 제한하는 옵션입니다. 최대 행 수와는 다르게 테이블 기준 열 수, 차트 기준으로는 범례 개수를 제한합니다.
-
그룹
- 최대 열 수: 시각화 작업 결과 개수를 제한하는 옵션입니다. 최대 행 수와는 다르게 테이블 기준 열 수, 차트 기준으로는 범례 개수를 제한합니다.
차트 옵션 - [시계열] 꺾은선형
-
일반
- Null 값: 데이터가 Null이거나 없는 등 차트에 표현할 수 없을 때 표현방식을 결정합니다.
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자값 텍스트로 표시됩니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
[시계열] 시계열 분포(산점도)
시간 필드가 포함된 데이터, X축과 Y축에 연속형인 두 변수의 값을 점으로 뿌려준 그래프로 변수 간의 관계를 파악하는데 유용한 분석 방법이며, 특히 X축을 시간 컬럼으로 지정한 시계열데이터를 시간에 따른 산점도 형태로 보여주기 용이합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | 차트의 X축에 관한 설정 UI 입니다. 꺾은선 차트의 경우 시간 필드만 X축에 설정할 수 있으나, 시계열 차트는 Scatter(산점도) 기능을 하는 차트로서 X축에 시간 컬럼 외에 다른 타입의 컬럼이 올 수 있습니다. 또한, X축 설정 중 최대 행 수는 시각화 작업 결과의 데이터 개수를 제한하는 옵션을 말합니다. |
4 | Y축 | 차트의 Y축에 관한 설정 UI 입니다. 시계열 분포(산점도)의 경우, 반드시 설정해야 합니다. |
5 | 그룹 | 트의 색상/범례 분할에 관한 설정 UI 입니다. 각 데이터를 그룹핑할 컬럼을 지정하는 기능입니다. 피벗의 “열 선택”과 대응되나, 집계에 영향을 주지 않고 분류(Classify) 기능만 수행합니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
차트 옵션 - [시계열] 시계열 분포
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
[시계열] 모션
모션 차트는 거품형 차트를 기반으로 시간에 따른 데이터의 변화를 애니메이션으로 보여주는 차트입니다.
모션차트는 시간, X축, Y축, 크기(원의 크기), 그룹(원의 색상) 에 각각 컬럼을 지정할 수 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | X축 | 차트의 X축에 관한 설정 UI입니다. 숫자 유형 컬럼만 투입할 수 있습니다. |
3 | 시간 | 시간 유형 컬럼만 투입할 수 있습니다. |
4 | Y축 | 차트의 Y축에 관한 설정 UI 입니다. 숫자 유형 컬럼만 투입할 수 있습니다. |
5 | 그룹 | 범주형 컬럼만 투입할 수 있습니다. |
6 | 크기 | 숫자 유형 컬럼만 투입할 수 있습니다. |
7 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
8 | 애니메이션 제어(모션 실행) | 애니메이션 동작에 대하여 실행/일시정지/재생/정지 등을 할 수 있습니다. |
시각화 분석 (2) 분포
[분포] 히스토그램
데이터를 동일한 폭의 구간으로 나누어 해당 구간에 속한 데이터의 빈도를 막대로 나타낸 것입니다. 도수분포표라고도 합니다. X축은 구간을 나타내고, Y축은 해당 구간에 속한 빈도를 표시합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | X축에 올 컬럼을 설정할 수 있습니다. 또한 X축은 히스토그램의 구간을 나타냅니다. |
4 | Y축 | Y축에 올 컬럼을 설정할 수 있습니다. Y축은 해당 구간에 속한 빈도를 표시합니다. |
5 | 그룹 | 차트의 색상/범례 분할에 관한 설정 UI 입니다. 피벗의 “열 선택”과 대응됩니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
X축
-
정렬: Y축 값에 따른 정렬 방식을 선택하는 옵션입니다. Default는 “기본값”이며, “기본값”으로 선택하면 정렬을 수행하지 않습니다.
-
Summary 시간 단위: 시간 타입 필드의 경우, 시각화 작업을 수행할 때 어떠한 시간 단위(1년, 1개월, 1일 등)로 summary를 수행할지 선택하는 옵션입니다.
-
범위 만들기: 숫자형 타입 필드의 경우, 실행 결과로 출력되는 각 막대를 필드 값의 개별 숫자로 표현할 것인지, 일정 범위를 지정하여 구간으로 표현할 것인지 여부를 묻는 항목입니다.
- 범위 크기: 그룹핑할 범위의 크기입니다.
- 범위 시작: 범위가 시작되는 값입니다.
- 범위 끝: 범위의 마지막 값입니다.
-
최대 행 수: 시각화 작업 결과의 데이터 개수를 제한하는 옵션입니다.
-
-
Y축
- 최대 열 수: 시각화 작업 결과 개수를 제한하는 옵션입니다. 최대 행 수와는 다르게 테이블 기준 열 수, 차트 기준으로는 범례 개수를 제한합니다.
차트 옵션 - [분포] 히스토그램
-
일반
- 스택모드: 하나의 X축 데이터가 그룹/범례를 통해 분할되었을 때, 차트의 드로잉 객체를 별개로 표현할 지 하나의 객체에 나누어 표현할지를 결정합니다.
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자값 텍스트로 표시됩니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
[분포] 막대형
막대형 그래프(Bar Chart)는 X축에 카테고리, 범주형 변수가 올 수 있고, 수치형 변수도 가능합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | X축에 올 컬럼을 설정할 수 있습니다. 또한 X축은 히스토그램의 구간을 나타냅니다. |
4 | Y축 | Y축에 올 컬럼을 설정할 수 있습니다. Y축은 해당 구간에 속한 빈도를 표시합니다. |
5 | 그룹 | 차트의 색상/범례 분할에 관한 설정 UI 입니다. 피벗의 “열 선택”과 대응됩니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
X축
-
정렬: Y축 값에 따른 정렬 방식을 선택하는 옵션입니다. Default는 “기본값”이며, “기본값”으로 선택하면 정렬을 수행하지 않습니다.
-
Summary 시간 단위: 시간 타입 필드의 경우, 시각화 작업을 수행할 때 어떠한 시간 단위(1년, 1개월, 1일 등)로 summary를 수행할지 선택하는 옵션입니다.
-
범위 만들기: 숫자형 타입 필드의 경우, 실행 결과로 출력되는 각 막대를 필드 값의 개별 숫자로 표현할 것인지, 일정 범위를 지정하여 구간으로 표현할 것인지 여부를 묻는 항목입니다.
- 범위 크기: 그룹핑 할 범위의 크기입니다.
- 범위 시작: 범위가 시작되는 값입니다.
- 범위 끝: 범위의 마지막 값입니다.
-
최대 행 수: 시각화 작업 결과의 데이터 개수를 제한하는 옵션입니다.
-
-
Y축
- Summary 방식: 시각화 작업을 수행할 때 지정한 필드를 어떠한 함수로 summary를 수행할지 선택하는 옵션입니다. 문자형 필드의 경우 “데이터 개수”, 숫자형 필드의 경우 “합계”가 기본으로 설정됩니다.
-
그룹
- 최대 열 수: 시각화 작업 결과 개수를 제한하는 옵션입니다. 최대 행 수와는 다르게 테이블 기준 열 수, 차트 기준으로는 범례 개수를 제한합니다.
차트 옵션 - [분포] 막대형
-
일반
- 스택모드: 하나의 X축 데이터가 그룹/범례를 통해 분할되었을 때, 차트의 드로잉 객체를 별개로 표현할 지 하나의 객체에 나누어 표현할지를 결정합니다.
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자값 텍스트로 표시됩니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
[분포] 원형
원형 그래프는 섹터로 구분된 원 그래프이며 Pie chart 라고도 합니다. 각 파이 조각의 크기는 전체에서 해당 데이터의 상대적 크기를 표시합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | 크기 | 파이차트의 크기에 관한 설정 UI 입니다. 피벗의 “값 선택”과 대응됩니다. 설정한 필드를 지정한 “Summary 방식”에 따라 계산하여 수치화한 값으로 크기를 결정합니다. 설정하지 않으면 Default로 “이벤트 개수”가 설정됩니다. (-count(*)) |
4 | 그룹 | 파이 차트의 그룹에 관한 설정 UI 입니다. 다른 차트의 X축 설정과 동일하며, 피벗의 “행 선택”과 대응됩니다. |
5 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
크기
- Summary 방식: 시각화 작업을 수행할 때 지정한 필드를 어떠한 함수로 summary를 수행할지 선택하는 옵션입니다. 문자형 필드의 경우 “데이터 개수”, 숫자형 필드의 경우 “합계”가 기본으로 설정됩니다.
-
그룹
-
정렬: 값에 따른 정렬 방식을 선택하는 옵션입니다. Default는 “기본값”이며, “기본값”으로 선택하면 정렬을 수행하지 않습니다.
-
Summary 시간 단위: 시간 타입 필드의 경우, 시각화 작업을 수행할 때 어떠한 시간 단위(1년, 1개월, 1일, …)로 summary를 수행할지 선택하는 옵션입니다.
-
범위 만들기: 숫자형 타입 필드의 경우, 실행 결과로 출력되는 각 막대를 필드 값의 개별 숫자로 표현할 것인지, 일정 범위를 지정하여 구간으로 표현할 것인지 여부를 묻는 항목입니다.
- 범위 크기: 그룹핑 할 범위의 크기입니다.
- 범위 시작: 범위가 시작되는 값입니다.
- 범위 끝: 범위의 마지막 값입니다.
-
최대 행 수: 시각화 작업 결과의 데이터 개수를 제한하는 옵션입니다.
-
차트 옵션 - [분포] 원형
-
일반
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자값 텍스트로 표시됩니다.
-
크기
- 최소 크기: 지정한 비율 이하의 조각들을 “other”로 통합하는 옵션입니다. 예를 들어 3으로 지정하면, 0~3% 비율의 조각들을 하나로 합쳐서 표현합니다. Default는 0이며, 0으로 입력하면 “other”로 통합하지 않습니다.
시각화 분석 (3) 관계형
[관계형] Sankey
Sankey chart는 각 변수간의 데이터의 흐름을 볼 수 있는 그래프입니다. 노드의 크기는 해당 데이터의 크기, 볼륨을 나타내고, 노드와 노드를 잇는 선의 굵기는 노드에서 노드 로 연결되는 데이터의 양을 표현합니다. 가중치는 선의 굵기, 노드의 크기를 정하는 통계량을 의미합니다. Default 는 이벤트의 개수 입니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 컬럼 설정/추가 버튼 | 차트의 컬럼에 관한 설정 UI입니다. 필드를 설정하여 각 단계별 데이터 간의 흐름을 확인할 수 있습니다. ‘+’버튼으로 컬럼을 최대 5개까지 추가 가능하며, 필드를 설정해야만 반영됩니다. |
3 | 가중치 | 데이터 간의 흐름의 크기, Sankey 차트에서는 선의 굵기에 대한 설정 UI입니다. 피벗의 “값 선택”과 유사하게 “Summary 방식”을 지정할 수 있으며, 추가로 상위/하위 N개만 출력하도록 필터를 지정할 수 도 있습니다. |
4 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
가중치
-
Summary 방식
- 시각화 작업을 수행할 때 지정한 필드를 어떠한 함수로 summary를 수행할지 선택하는 옵션입니다. 문자형 필드의 경우 “데이터 개수”, 숫자형 필드의 경우 “합계”가 기본으로 설정됩니다.
-
제한
- 지정한 숫자값 만큼 상위 or 하위 N개의 선(Links) 데이터만 요청하도록 설정합니다.
-
[관계형] 히트맵
히트맵은 cell 의 값이 높거나 양이 큰 경우에는 진한 색상, 작은 값은 연한 색상과 같은 열분포로 표현합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | 차트의 X축에 관한 설정 UI 입니다. 피벗의 “행 선택”과 대응됩니다. |
4 | Y축 | 차트의 Y축에 관한 설정 UI 입니다. 피벗의 “열 선택”과 대응됩니다. |
5 | 값 | 차트의 색상/범례 분할에 관한 설정 UI 입니다. 피벗의 “값 선택”과 대응됩니다. 설정한 필드를 지정한 “Summary 방식”에 따라 계산하여 수치화한 값으로 Y축을 구성합니다. 설정하지 않으면 Default로 “이벤트 개수”가 설정됩니다. (-count(*)) |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
-
X축
-
정렬: Y축 값에 따른 정렬 방식을 선택하는 옵션입니다. Default는 ‘기본값'이며, 기본값으로 선택하면 정렬을 수행하지 않습니다.
-
Summary 시간 단위: 시간 타입 필드의 경우, 시각화 작업을 수행할 대 어떠한 시간 단위(1년, 1개월, 1일 등)로 Summary를 수행할 지 선택하는 옵션입니다.
-
범위 만들기: 숫자형 타입 필드의 경우, 실행 결과로 출력되는 각 막대를 필드 값의 개별 숫자로 표현할 것인지, 일정 범위를 지정하여 구간으로 표현할 것인지 여부를 묻는 항목입니다.
- 범위 크기: 그룹핑 할 범위의 크기입니다.
- 범위 시작: 범위가 시작되는 값 입니다
- 범위 끝: 범위의 마지막 값입니다.
-
최대 행 수: 시각화 작업의 결과의 데이터 개수를 제한하는 옵션입니다.
-
-
Y축
- 최대 열 수: 시각화 작업 결과 개수를 제한하는 옵션입니다. 최대 행 수 와는 다르게 테이블 기준 열 수, 차트 기준으로는 범례 개수를 제한합니다.
-
값
- Summary 방식: 시각화 작업을 수행할 때 지정한 필드를 어떠한 함수로 Summary를 수행할 지 선택하는 옵션입니다. 문자형 필드의 경우 ‘데이터 개수‘, 숫자형 필드의 경우 ‘합계'가 기본으로 설정됩니다.
차트 옵션 - [관계형] 히트맵
-
일반
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자값 텍스트로 표시됩니다.
- 배경 색상: 배경의 색상을 설정할 수 있습니다.
- 구분선 색상: 구분선의 색상을 설정할 수 있습니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
- 정렬: 오름차순/내림차순 정렬을 할 수 있습니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: Y축의 텍스트 회전 각도를 결정합니다. Y축의 각각의 텍스트가 길 경우 유용합니다.
- 정렬: 오름차순/내림차순 정렬을 할 수 있습니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
시각화 분석 (4) 이상치
[이상치] Anomaly
Anomaly 그래프는 데이터에서 이상치를 찾아내어 꺾은 선형 차트로 보여줍니다. 이상치를 찾는 내부 알고리즘은 DSL 명령어 anomalies 를 적용합니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | X축 | 시간유형(timestamp/date) 컬럼을 투입할 수 있습니다. |
4 | Y축 | 수치형 데이터만 투입할 수 있습니다. |
5 | 그룹 | 범주형 데이터만 투입할 수 있습니다. |
6 | Anomaly 옵션 | Anomaly에 관한 옵션을 설정할 수 있습니다. |
7 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
차트 옵션 - [이상치] Anomaly
-
일반
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자 값 텍스트로 표시됩니다.
- 데이터 표시 색상: 데이터의 색상을 설정할 수 있습니다.
- 이상치 데이터 값 표시 색상: 이상치 데이터 값의 색상을 설정할 수 있습니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
-
Anomaly 옵션
- alg: 이상치를 찾는 알고리즘이며, bagic / robust 가 있습니다.
- bound: 이상치와 정상값을 구분하는 임계치 범위의 폭을 결정하는 값으로, 이 값이 정상값으로 판정하는 범위가 넓어집니다.
- direct: 이상치와 정상값을 구분하는 임계치가 위로만 있는 경우(above), 아래에만 있는 경우(below), 위,아래 다 있을 때(both)로 구분됩니다.
- alert_window: 이상치를 판별하는 데이터의 시간 범위를 정합니다. 데이터의 가장 최근 시간 기준입니다.
- Index_type: X축 필드의 시간 유형이며, timestamp / date 가 있습니다.
[이상치] Outlier
Outlier 그래프는 데이터에서 이상치 구간을 검출하는 분석 그래프입니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | Y축 | 숫자형 컬럼만 투입할 수 있습니다. |
4 | 그룹 | 차트의 색상/범례 분할에 관한 설정 UI 입니다. 각 데이터를 그룹핑할 컬럼을 지정하는 기능입니다. 피벗의 “열 선택”과 대응되나, 집계에 영향을 주지 않고 분류(Classify) 기능만 수행합니다. |
5 | Outlier 옵션 | Outlier에 관한 옵션을 설정할 수 있습니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
차트 옵션 - [이상치] Outlier
-
일반
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자 값 텍스트로 표시됩니다.
- 데이터 표시 색상: 데이터의 색상을 설정할 수 있습니다.
- 이상치 데이터 값 표시 색상: 이상치 데이터 값의 색상을 설정할 수 있습니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
- 글꼴: 범례의 글꼴과 글꼴 크기, 글꼴 서식 및 정렬에 관한 설정을 할 수 있습니다.
-
Outlier 옵션
- alg: 이상치를 찾는 알고리즘이며, bagic / robust 가 있습니다.
- tolerance: 임계값 범위의 scale을 지정합니다.
[이상치] 이상치
시각화 이상치 그래프는 특정 변수에 대한 기술통계량과 함께 IQR(Inter Quantile Range)기반으로 비정상적으로 벗어난 값을 찾아줍니다.
히스토그램 과 시계열 분포 에서는 실제 데이터의 분포를 보여주고, 기술통계량 에서는 데이터의 사분위수 값을 보여줍니다.
이상치에서 이상치로 판정된 데이터를 대상으로 사분위수를 보여줘서 전체 데이터의 기술통계량과 비교할 수 있게 합니다.
-
이상치 판단 기준
- 하한 임계치(Q1 - 1.5 * IQR) 보다 작은 값이거나
- 상한 임계치(Q3 + 1.5 * IQR) 보다 큰 값을 이상치로 판단합니다.
- IQR = Q3 - Q1
- Q1 : 1st 사분위수(25% 값) , Q3 : 3rd 사분위수(75% 값)
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 대상 컬럼 | 통계량 및 이상치를 계산할 대상 필드(컬럼)를 설정합니다. . 다른 차트와 마찬가지로 Drag & Drop으로 설정하며, 숫자형 타입의 필드만 설정할 수 있습니다. |
3 | 히스토그램 | 대상 필드의 값 분포를 히스토그램으로 나타냅니다. |
4 | 기술통계량 | 해당 필드의 최소/최대, 중간값, 평균 등의 각종 기술통계량 값을 표 형태로 출력합니다. |
5 | 시계열분포 | 대상 필드의 시계열 분포를 산점도로 나타냅니다. |
6 | 이상치(Outlier) | 해당 필드의 정상 범주를 벗어나는 값들에 대해 최소/최대, 중간값, 평균 등의 각종 기술통계량 값을 표 형태로 출력합니다. |
7 | 분석 결과 다운로드 | 해당 차트 혹은 그리드를 파일로 저장합니다. 차트의 경우에는 png, 그리드의 경우에는 csv로 저장합니다. |
8 | 새로 고침 | 해당 차트 혹은 그리드의 데이터를 서버에 다시 요청하여 불러옵니다. |
시각화 분석 (5) 예측
[예측] Forecast
Forecast는 시계열 데이터에서 미래 시점의 값을 예측하기 위해 DSL forecasts 의 결과를 보여주는 시각화 차트입니다.
DSL 명령어 forecasts 의 결과는 예측에 사용된 과거 데이터와 함께 미래시점의 데이터가 같이 출력됩니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | Y축 | 시간유형(timestamp/date) 컬럼을 투입할 수 있습니다. |
4 | 그룹 | 수치형 데이터만 투입할 수 있습니다. |
5 | Outlier 옵션 | Forecast에 관한 옵션을 설정할 수 있습니다. |
6 | 파일 저장 | 파일 저장 버튼을 누르면 시각화에서 만든 차트가 이미지 파일(png)로 저장됩니다. |
차트 옵션 - [예측] Forecast
-
일반
- 데이터 값 표시: 데이터의 수치 값을 차트상에 표시할지 여부를 결정합니다. “켜기”로 설정하면 차트의 각 포인트마다 데이터 수치가 숫자 값 텍스트로 표시됩니다.
- 데이터 표시 색상: 데이터의 색상을 설정할 수 있습니다.
- 예측치 데이터 값 표시 색상: 이상치 데이터 값의 색상을 설정할 수 있습니다.
- 예측치 최대·최소 데이터 표시: 예측치의 최대, 최소 데이터 값의 색상을 설정할 수 있습니다.
-
X축
- 축: X축 표시 여부를 결정합니다.
- 축 제목: X축 하단에 표시할 제목과 표시 여부를 결정합니다.
- 레이블 회전: X축의 텍스트 회전 각도를 결정합니다. X축의 각각의 텍스트가 길 경우 유용합니다.
- 글꼴: X축의 글꼴과 글꼴 크기, 글꼴 서식 및 정렬에 관한 설정을 할 수 있습니다.
-
Y축
- 축: Y축 표시 여부를 결정합니다.
- 축 제목: Y축 좌단에 표시할 제목과 표시 여부를 결정합니다.
- 간격: Y축의 수치 간격을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최솟값: Y축의 최솟값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 최댓값: Y축의 최댓값을 결정합니다. 입력하지 않으면 자동으로 결정됩니다.
- 글꼴: Y축의 글꼴과 글꼴 크기, 글꼴 서식 및 정렬에 관한 설정을 할 수 있습니다.
-
범례
- 범례: 범례의 표시 여부를 결정합니다.
- 표시 위치: 범례의 표시 위치(오른쪽/아래/위/왼쪽)를 결정합니다.
- 글꼴: 범례의 글꼴과 글꼴 크기, 글꼴 서식 및 정렬에 관한 설정을 할 수 있습니다.
-
Forecast 옵션
- alg: 시계열 데이터 예측에 사용되는 알고리즘이며, Default 로 linear 알고리즘이 설정되어 있습니다.
- F_coeff: 예측값이 계산되어 결과로 나오는 기간을 구하는 데 사용되는 계수입니다.
- Index_type: X축 필드의 시간 유형을 나타내며, timestamp / date 중에 선택하여 사용할 수 있습니다.
시각화 분석 (6) 지도형
[지도형] 마커 맵
마커 맵은 데이터의 위/경도 좌표 지점을 지도 상에 포인트 또는 깃발 등으로 시각화 한 지도를 뜻합니다. 값(Value) 컬럼을 지정하여 수치 값을 마커의 색상으로 표현할 수도 있습니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | Value | 값으로 지정할 컬럼을 투입합니다. 값 컬럼을 지정하면 차트 옵션의 색상 설정에 따라 값 수치를 마커의 색상으로 시각화 할 수 있습니다. |
4 | 경도 | 경도로 지정할 컬럼을 투입합니다. |
5 | 위도 | 위도로 지정할 컬럼을 투입합니다. |
[지도형] 클러스터 맵
통계값을 이용해 데이터를 클러스터링하여 지도 위에 표시하는 지도 차트 입니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | 경도 | 경도로 지정할 컬럼을 투입합니다. |
4 | 위도 | 위도로 지정할 컬럼을 투입합니다. |
5 | Group by | 군집으로 묶은 클러스터링 데이터를 그룹핑하기 위한 컬럼을 지정하는 기능입니다. 적절한 컬럼을 지정하면 지도 상에 데이터가 원형 차트로 시각화됩니다. |
6 | 이벤트 개수 | 군집으로 묶은 클러스터링 데이터를 시각화 할 때 원의 크기를 결정할 컬럼을 지정하는 기능입니다. 기본값은 이벤트 개수(count(*))이며, 다른 컬럼을 지정하고 집계 함수를 설정할 수 있습니다. (ex. 인구수의 평균) |
[지도형] 지역맵
Analyzer에서 제공하는 지역 경계 좌표 정보를 토대로, 지도 영역(콜렉션)을 사용하여 데이터를 지도 위에 히트맵처럼 표시하는 지도 차트 입니다.
번호 | 구분 | 설명 |
---|---|---|
1 | 분석 유형 선택 | 시계열 / 분포 / 관계형 / 이상치 / 예측 / 지도형 카테고리 중 분석 유형을 선택할 수 있습니다. |
2 | 차트 옵션 | Null값 표시 방식, 레이블 회전, 범례 위치 등 차트의 스타일/표현 방식에 대한 옵션 설정창을 띄우는 버튼입니다. 이 옵션들은 시각화 작업 결과 데이터에는 영향을 주지 않습니다. |
3 | Value | 데이터를 시각화 할 때 색상을 결정하기 위한 컬럼을 지정하는 기능입니다. 기본값은 이벤트 개수(count(*))이며, 다른 컬럼을 지정하고 집계 함수를 설정할 수 있습니다. |
4 | Feature Collection | 미리 정의되어 있는 지역 경계 좌표 정보(city; 시, dong; 동, state; 도)입니다. 현재는 대한민국만 제공합니다. |
5 | Feature ID | Feature Collection과 매치 시킬 컬럼을 지정하는 기능입니다. 미리 선택한 Feature Collection에 따라 관련된 Feature ID를 잘 지정함으로써 어떤 값이 어떠한 데이터인지 알 수 있도록 해야 합니다. |
6 | Feature 모두 표시 | 경계가 나뉘어 있지 않은 구간의 지역일지라 하더라도, 나머지 경계를 토대로 모든 Feature 값이 모두 표시되게 할 수 있습니다. |
데이터 분석/시각화 따라하기
데이터 분석 및 시각화를 따라해보세요.
공간자기상관성 분석
개요
-
공간데이터(Spatial data)들은 순수한 자신만의 정보를 가지고 있을 뿐만 아니라, 지리적(geographical space)에 관한 정보를 함께 포함하고 있다. 이러한 공간데이터를 분석하기 위하여 기존의 많은 선형모델들을 적용하여 해석하려고 했으나, ‘공간’이라는 요인을 고려하지 못하여 의미있는 분석결과를 도출하지 못하였다.
-
Doreian(1981)에 따르면 “변수들이 무작위적이고 오류항이 독립적이며 동일한 분포를 갖는 다는 가정을 하는 전통적인 선형분석 방법들로 공간준거 데이터(spatially-referenced data)를 분석할 경우 많은 사회경제현상, 인구현상 및 자연현상(natural phenomena)이 공간상에서 나타나는 특성인 의존성(spatial dependence) 및 상호작용(spatial interaction)을 통제하지 못한다.”고 하였다.
-
Tober의 지리의 제1법칙(the first law of geography) - Everything is realted everything else, but near things are more related than distant things. 에서와 같이 공간상의 객체들은 공간상에 무작위(random)하게 있지 않고 서로간에 영향을 주고받으며 존재한다고 할 수 있다.
-
이와 같이 지리적 공간상에서 공간객체간의 상호의존성과 상호작용을 공간적자기상관(spatial autocorrelation)이라고 할 수 있다.
-
Anselin and Bera(1998)는 “공간상에 분포하는 공간객체들은 위치의 유사성이 높아짐에 따라 객체들이 갖는 값의 유사성도 높아가는 현상”이라고 정의하기도 하였다.
-
공간적자기상관에는 '정적 공간자기상관(positive spatial autocorrelation)'과 '부적 공간자기상관(negative spatial autocorrelation)'이 있다. 정적 공간자기상관은 공간실체들이 서로 유사한 값을 갖으며 군집적으로 분포하는 경우이며, 반대로 부적 공간자기상관은 공간실체들이 서로 상이한 값들을 갖으며 군집적으로 분포하는 경우이다.
분석 데이터
- 행정동 단위의 모든 데이터에 적용 가능
- Ex: 행정동별 교통, 유동인구, 범죄 데이터 등
- 현재 MBD 데이터는 불완전하기 때문에 행정동 별 임의의 데이터를 대상으로 분석 노트북을 작성하였음
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
import geopandas as gpd
shp_link = "AL_00_D001_20200106(EMD).shp"
import sys
import os
sys.path.append(os.path.abspath('..'))
from pysal.explore import esda
import pandas as pd
import geopandas as gpd
import pysal.lib as lps
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = gpd.read_file('AL_00_D001_20200106(EMD).shp', encoding="euckr")
df.head()
A0 | A1 | A2 | A3 | geometry | |
---|---|---|---|---|---|
0 | 295 | 11110140 | 삼청동 | 2019-02-21 | POLYGON ((197597.735 454551.233, 197599.083 45... |
1 | 296 | 11110101 | 청운동 | 2019-02-21 | POLYGON ((196524.180 453809.271, 196541.748 45... |
2 | 297 | 11110168 | 동숭동 | 2019-02-21 | POLYGON ((200515.600 453698.981, 200521.372 45... |
3 | 315 | 11110166 | 연건동 | 2019-02-21 | POLYGON ((199711.309 453300.989, 199718.145 45... |
4 | 316 | 11110105 | 창성동 | 2019-02-21 | POLYGON ((197592.504 453280.724, 197592.907 45... |
df.columns
Index(['A0', 'A1', 'A2', 'A3', 'geometry'], dtype='object')
df['A0'].describe()
count 5079.000000 mean 2251.962985 std 5697.271617 min 3.000000 25% 120.000000 50% 381.000000 75% 1329.000000 max 61906.000000 Name: A0, dtype: float64
ax = df.plot(figsize=(11, 11), color="w", edgecolor="k")
#ax.set_title("South Korea")
ax.set_axis_off()
plt.show()
Similarity
wq = lps.weights.Queen.from_dataframe(df)
wq.transform = 'r'
('WARNING: ', 539, ' is an island (no neighbors)') ('WARNING: ', 663, ' is an island (no neighbors)') ('WARNING: ', 705, ' is an island (no neighbors)') ('WARNING: ', 718, ' is an island (no neighbors)') ('WARNING: ', 719, ' is an island (no neighbors)') ('WARNING: ', 725, ' is an island (no neighbors)') ('WARNING: ', 726, ' is an island (no neighbors)') ('WARNING: ', 735, ' is an island (no neighbors)') ('WARNING: ', 745, ' is an island (no neighbors)') ('WARNING: ', 746, ' is an island (no neighbors)') ('WARNING: ', 747, ' is an island (no neighbors)') ('WARNING: ', 748, ' is an island (no neighbors)') ('WARNING: ', 749, ' is an island (no neighbors)') ('WARNING: ', 919, ' is an island (no neighbors)') ('WARNING: ', 953, ' is an island (no neighbors)') ('WARNING: ', 1472, ' is an island (no neighbors)') ('WARNING: ', 1653, ' is an island (no neighbors)') ('WARNING: ', 1778, ' is an island (no neighbors)') ('WARNING: ', 2001, ' is an island (no neighbors)') ('WARNING: ', 2364, ' is an island (no neighbors)') ('WARNING: ', 2864, ' is an island (no neighbors)') ('WARNING: ', 3057, ' is an island (no neighbors)') ('WARNING: ', 3140, ' is an island (no neighbors)') ('WARNING: ', 3213, ' is an island (no neighbors)') ('WARNING: ', 3308, ' is an island (no neighbors)') ('WARNING: ', 3337, ' is an island (no neighbors)') ('WARNING: ', 3400, ' is an island (no neighbors)') ('WARNING: ', 3597, ' is an island (no neighbors)') ('WARNING: ', 3769, ' is an island (no neighbors)') ('WARNING: ', 4000, ' is an island (no neighbors)') ('WARNING: ', 4251, ' is an island (no neighbors)') ('WARNING: ', 4327, ' is an island (no neighbors)') ('WARNING: ', 4328, ' is an island (no neighbors)') ('WARNING: ', 4329, ' is an island (no neighbors)') ('WARNING: ', 4330, ' is an island (no neighbors)') ('WARNING: ', 4331, ' is an island (no neighbors)') ('WARNING: ', 4333, ' is an island (no neighbors)') ('WARNING: ', 4334, ' is an island (no neighbors)') ('WARNING: ', 4336, ' is an island (no neighbors)') ('WARNING: ', 4337, ' is an island (no neighbors)') ('WARNING: ', 4338, ' is an island (no neighbors)') ('WARNING: ', 4341, ' is an island (no neighbors)') ('WARNING: ', 4346, ' is an island (no neighbors)') ('WARNING: ', 4347, ' is an island (no neighbors)') ('WARNING: ', 4362, ' is an island (no neighbors)') ('WARNING: ', 4372, ' is an island (no neighbors)') ('WARNING: ', 4373, ' is an island (no neighbors)') ('WARNING: ', 4379, ' is an island (no neighbors)') ('WARNING: ', 4380, ' is an island (no neighbors)') ('WARNING: ', 4381, ' is an island (no neighbors)') ('WARNING: ', 4382, ' is an island (no neighbors)') ('WARNING: ', 4383, ' is an island (no neighbors)') ('WARNING: ', 4384, ' is an island (no neighbors)') ('WARNING: ', 4385, ' is an island (no neighbors)') ('WARNING: ', 4386, ' is an island (no neighbors)') ('WARNING: ', 4474, ' is an island (no neighbors)') ('WARNING: ', 4542, ' is an island (no neighbors)') ('WARNING: ', 4567, ' is an island (no neighbors)') ('WARNING: ', 4629, ' is an island (no neighbors)') ('WARNING: ', 4637, ' is an island (no neighbors)') ('WARNING: ', 4703, ' is an island (no neighbors)') ('WARNING: ', 4856, ' is an island (no neighbors)') ('WARNING: ', 5061, ' is an island (no neighbors)') ('WARNING: ', 5062, ' is an island (no neighbors)')
Moran's I
- 전체연구지역의 공간적자기상관 관계를 하나의 값으로 보여주는 글로벌 지수(global index)이다.
- 공간적자기상관을 파악하기 위한 유용한 측정척도로, 인접해 있는 공간단위 (neighboring spatial units)들이 갖는 값(values)을 비교하여 이 계수를 산출하게 된다.
- 만일 인접한 공간단위들이 '전체 연구지역(entire study area)'에 걸쳐 유사한 값을 갖는 경우, Moran I 계수는 높은 '정적 공간상관'을 갖는 반면, 인접한 공간 단위들이 서로 상이한 값들을 갖게 되면 Moran I 계수는 높은 '부적 공간상관'을 갖게 된다.
y = df['A0']
np.random.seed(12345)
mi = esda.moran.Moran(y, wq)
mi.I
0.6087514418350501
- A positive z-value: data is spatially clustered in some way.
- A negative z-value: data is clustered in a competitive way. For example, high values may be repelling high values or negative values may be repelling negative values.
mi.p_sim
0.001
fig, ax = plt.subplots(figsize=(12,10), subplot_kw={'aspect':'equal'})
df.plot(column='A0', scheme='Quantiles', k=5, cmap='GnBu', legend=True, ax=ax)
<matplotlib.axes._subplots.AxesSubplot at 0x2a362e202c8>
Anselin Local Morans' I (LISA)
- 연구지역내에서 발생할 수 있는 공간적자기상관의 국지적 변이(local variatons)를 고려한 시각적 지표이다
- LISA를 이용하면 한 변수의 공간적자기상관이 특정 지역에서 높게 나타나는 'Hot spot'을 찾을 수 있다.
- 국지적인 규모에서 공간자기상관 정도를 측정하기 위해서는, 각각의 공간단위(each areal unit)에서 공간자기상관 값이 계산되어야 하는데 여러 LISA중 가장 손쉽게 활용될 수 있는 것은 '국지 Moran (local Moran)'이다.
Moran Scatterplot
np.random.seed(12345)
wq.transform = 'r'
lag_price = lps.weights.lag_spatial(wq, df['A0'])
price = df['A0']
b, a = np.polyfit(price, lag_price, 1)
f, ax = plt.subplots(1, figsize=(9, 9))
plt.plot(price, lag_price, '.', color='firebrick')
# dashed vert at mean of the price
plt.vlines(price.mean(), lag_price.min(), lag_price.max(), linestyle='--')
# dashed horizontal at mean of lagged price
plt.hlines(lag_price.mean(), price.min(), price.max(), linestyle='--')
# red line of best fit using global I as slope
plt.plot(price, a + b*price, 'r')
plt.title('Moran Scatterplot')
plt.ylabel('Spatial Lag of Value')
plt.xlabel('Value')
plt.show()
- The upper-right quadrant and the lower-left quadrant correspond with positive spatial autocorrelation (similar values at neighboring locations).
- We refer to them as respectively high-high and low-low spatial autocorrelation.
- In contrast, the lower-right and upper-left quadrant correspond to negative spatial autocorrelation (dissimilar values at neighboring locations).
- We refer to them as respectively high-low and low-high spatial autocorrelation.
LISA
li = esda.moran.Moran_Local(y, wq)
li.q
array([3, 3, 3, ..., 3, 3, 3])
(li.p_sim < 0.05).sum()
1671
sig = li.p_sim < 0.05
hotspot = sig * li.q==1
coldspot = sig * li.q==3
doughnut = sig * li.q==2
diamond = sig * li.q==4
spots = ['n.sig.', 'hot spot']
labels = [spots[i] for i in hotspot*1]
df = df
from matplotlib import colors
hmap = colors.ListedColormap(['red', 'lightgrey'])
f, ax = plt.subplots(1, figsize=(9, 9))
df.assign(cl=labels).plot(column='cl', categorical=True, \
k=2, cmap=hmap, linewidth=0.1, ax=ax, \
edgecolor='white', legend=True)
ax.set_axis_off()
plt.show()
spots = ['n.sig.', 'cold spot']
labels = [spots[i] for i in coldspot*1]
df = df
from matplotlib import colors
hmap = colors.ListedColormap(['blue', 'lightgrey'])
f, ax = plt.subplots(1, figsize=(9, 9))
df.assign(cl=labels).plot(column='cl', categorical=True, \
k=2, cmap=hmap, linewidth=0.1, ax=ax, \
edgecolor='white', legend=True)
ax.set_axis_off()
plt.show()
spots = ['n.sig.', 'doughnut']
labels = [spots[i] for i in doughnut*1]
df = df
from matplotlib import colors
hmap = colors.ListedColormap(['lightblue', 'lightgrey'])
f, ax = plt.subplots(1, figsize=(9, 9))
df.assign(cl=labels).plot(column='cl', categorical=True, \
k=2, cmap=hmap, linewidth=0.1, ax=ax, \
edgecolor='white', legend=True)
ax.set_axis_off()
plt.show()
spots = ['n.sig.', 'diamond']
labels = [spots[i] for i in diamond*1]
df = df
from matplotlib import colors
hmap = colors.ListedColormap(['pink', 'lightgrey'])
f, ax = plt.subplots(1, figsize=(9, 9))
df.assign(cl=labels).plot(column='cl', categorical=True, \
k=2, cmap=hmap, linewidth=0.1, ax=ax, \
edgecolor='white', legend=True)
ax.set_axis_off()
plt.show()
sig = 1 * (li.p_sim < 0.05)
hotspot = 1 * (sig * li.q==1)
coldspot = 3 * (sig * li.q==3)
doughnut = 2 * (sig * li.q==2)
diamond = 4 * (sig * li.q==4)
spots = hotspot + coldspot + doughnut + diamond
spots
array([3, 0, 0, ..., 3, 0, 0])
spot_labels = [ '0 ns', '1 hot spot', '2 doughnut', '3 cold spot', '4 diamond']
labels = [spot_labels[i] for i in spots]
from matplotlib import colors
hmap = colors.ListedColormap([ 'lightgrey', 'red', 'lightblue', 'blue', 'pink'])
f, ax = plt.subplots(1, figsize=(9, 9))
df.assign(cl=labels).plot(column='cl', categorical=True, \
k=2, cmap=hmap, linewidth=0.1, ax=ax, \
edgecolor='white', legend=True)
ax.set_axis_off()
plt.show()
Reference
공간자기상관성 관련 설명자료:
- 이경주, 황명화, 한선희, & 양은정. (2015). 공간통계 분석의 이해와 활용을 위한 첫걸음.
참고자료:
-
Andresen, M. A. (2011). Estimating the probability of local crime clusters: The impact of immediate spatial neighbors. Journal of Criminal Justice, 39(5), 394-404.
-
Suthanaya, P. A. (2011). Spatial Autocorrelation Analyses of the Commuting Preferences by Bus in the Sydney Metropolitan Region. Journal of Civil Engineering, 18(1), 71-80.
-
Truong, L. T., & Somenahalli, S. V. (2011). Using GIS to identify pedestrian-vehicle crash hot spots and unsafe bus stops. Journal of Public Transportation, 14(1), 6.
-
Tselios, V. (2008). Income and educational inequalities in the regions of the European Union: geographical spillovers under welfare state restrictions. Papers in Regional Science, 87(3), 403-430.
-
Yun, J. M., & Choi, D. J. (2015). Geographically weighted regression on the characteristics of land use and spatial patterns of floating population in seoul city. Journal of Korean Society for Geospatial Information System, 23(3), 77-84.
-
김현중, & 이성우. (2013). 범죄발생의 공간의존성 변화와 핫스팟 분포, 2001-2010. 주거환경, 11(2), 27-41.
-
이연수, 진창종, & 추상호. (2012). 공간계량분석을 이용한 대중교통 이용에 영향을 미치는 공간적 특성요인 분석에 관한 연구: 서울시 행정동을 중심으로. 서울도시연구, 13(4), 97-111.
광역철도 수송 데이터 탐색적 분석 및 시각화
개요
- 운행일자를 기준으로 2019년 10월 한 달 간 운행열차의 운행내역 데이터를 사용하여 정차역에 따른 승,하차,통과 인원 및 해당 역 별 지가지수를 파악하여 광역 철도 데이터의 탐색적 분석 및 공간 데이터 시각화 분석이 이루어짐.
분석 데이터
- 일자별전철역승차인원 데이터
- 여객역코드 데이터
- 역 별 위치 데이터(위,경도)
- 역세권 별 지가지수 데이터(2014~2017)
load python library
import pandas as pd
import pandas_profiling
pd.options.mode.chained_assignment = None
from pyproj import Proj, transform
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as widgets
from ipywidgets import interact, interact_manual, GridspecLayout
import ipywidgets
from collections import OrderedDict
import geopandas as gpd
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import warnings
warnings.filterwarnings(action='ignore')
load dataset
path = '/home/yubin90/pyWork/diamond/'
def stp_cols(df):
cols = list(map(str.strip, df.columns.tolist()))
df.columns = cols
return df
ride_acvm_df = pd.read_csv(path+'TB_COL_KR_TRVL_STNP_CLSF_RIDE_ACVM.csv', low_memory=False)
ride_acvm_df = stp_cols(ride_acvm_df)
ride_acvm_df = ride_acvm_df.drop(labels='AGGR_YMDHMS', axis=1)
trvl_stn_cd_df = pd.read_csv(path+'TB_COL_KR_TRVL_STN_CD.csv', low_memory=False)
trvl_stn_cd_df = stp_cols(trvl_stn_cd_df)
trvl_stn_cd_df = trvl_stn_cd_df.drop(labels='AGGR_YMDHMS', axis=1)
trvl_stn_cd_df = trvl_stn_cd_df.drop_duplicates(subset='STN_CD')
stn_loc_df = pd.read_csv(path+'stn_loc_no_dup.csv', encoding='cp949')
code mapping
#년월 생성
ride_acvm_df['YYMM'] = ride_acvm_df['RUN_DT'].astype(str).str[:-2]
# 역명코드 dict 생성
trvl_stn_cd_dict= dict(zip(trvl_stn_cd_df.STN_CD, trvl_stn_cd_df.KOR_STN_NM))
# dict mapping(역명 한글이름 매칭)
ride_acvm_df['KOR_STOP_STN'] = ride_acvm_df['STOP_STN'].map(trvl_stn_cd_dict)
역 위치 (위,경도) 매핑
ride_acvm_with_loc = pd.merge(ride_acvm_df,stn_loc_df, how='left', left_on='KOR_STOP_STN', right_on='STN_NM')
ride_acvm_with_loc
RUN_DT | STOP_STN | STLB_TRN_CLSF_CD | UP_DN_DV_CD | ABRD_PRNB | GOFF_PRNB | NSTP_PRNB | YYMM | KOR_STOP_STN | STN_NM | LAT | LNG | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20191001 | 3900280 | 0 | D | 1148 | 3021 | 15849 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 |
1 | 20191001 | 3900280 | 7 | D | 630 | 1422 | 6902 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 |
2 | 20191001 | 3900280 | 10 | D | 49 | 127 | 615 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 |
3 | 20191001 | 3900023 | 7 | U | 19 | 4749 | 378 | 201910 | 서울 | 서울 | 37.554073 | 126.970702 |
4 | 20191001 | 3900096 | 7 | U | 1332 | 710 | 4545 | 201910 | 동대구 | 동대구 | 35.879437 | 128.628784 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
29277 | 20191031 | 3900292 | 1 | U | 10 | 6 | 60 | 201910 | 충주 | 충주 | 36.975892 | 127.909136 |
29278 | 20191031 | 3900556 | 1 | U | 0 | 0 | 41 | 201910 | 춘양 | 춘양 | 36.937810 | 128.919938 |
29279 | 20191031 | 3900611 | 1 | U | 5 | 0 | 36 | 201910 | 민둥산 | 민둥산 | 37.243701 | 128.773657 |
29280 | 20191031 | 3900703 | 1 | D | 0 | 1 | 61 | 201910 | 북천 | 북천 | 35.111383 | 127.883501 |
29281 | 20191031 | 3900703 | 1 | U | 0 | 0 | 39 | 201910 | 북천 | 북천 | 35.111383 | 127.883501 |
29282 rows × 12 columns
역 별 승,하차, 통과 인원 수 상위 10
for_top_df = ride_acvm_df[['ABRD_PRNB', 'GOFF_PRNB', 'NSTP_PRNB', 'KOR_STOP_STN']]
#승차 top 10
sum_abrd_by_stn = pd.DataFrame(for_top_df.groupby('KOR_STOP_STN')['ABRD_PRNB'].sum())
sum_abrd_by_stn = sum_abrd_by_stn[sum_abrd_by_stn.index != '청량리']
sum_abrd_by_stn.sort_values('ABRD_PRNB', ascending=False).head(10)
ABRD_PRNB | |
---|---|
KOR_STOP_STN | |
--- | --- |
서울 | 1527592 |
동대구 | 748905 |
용산 | 720647 |
대전 | 654794 |
부산 | 636205 |
수원 | 503330 |
광명 | 422479 |
영등포 | 358667 |
오송 | 270318 |
천안아산 | 250665 |
#하차 top 10
sum_goff_by_stn = pd.DataFrame(for_top_df.groupby('KOR_STOP_STN')['GOFF_PRNB'].sum())
sum_goff_by_stn.sort_values('GOFF_PRNB', ascending=False).head(10)
GOFF_PRNB | |
---|---|
KOR_STOP_STN | |
--- | --- |
서울 | 1545800 |
동대구 | 754050 |
용산 | 722747 |
대전 | 656247 |
부산 | 632395 |
수원 | 508386 |
광명 | 416549 |
영등포 | 362172 |
청량리 | 277838 |
오송 | 261490 |
#통과 top 10
sum_nstp_by_stn = pd.DataFrame(for_top_df.groupby('KOR_STOP_STN')['NSTP_PRNB'].sum())
sum_nstp_by_stn.sort_values('NSTP_PRNB', ascending=False).head(10)
NSTP_PRNB | |
---|---|
KOR_STOP_STN | |
--- | --- |
대전 | 3271135 |
광명 | 3027384 |
동대구 | 2769875 |
오송 | 2181114 |
천안아산 | 2039345 |
수원 | 1731419 |
서울 | 1632729 |
천안 | 1445134 |
익산 | 1362569 |
평택 | 1353513 |
abrd_top = sum_abrd_by_stn.sort_values('ABRD_PRNB', ascending=False).head(10).index
abrd_top = abrd_top.tolist()
abrd_top
['서울', '동대구', '용산', '대전', '부산', '수원', '광명', '영등포', '오송', '천안아산']
공공데이터 추가
- 한국감정원 월별 KTX역 역세권 지가지수(2014년 11월 ~ 2019년 7월)
*지가지수 : 기준시점의 지수를 100으로 보았을 때, 기준시점 대비 가격상승분을 반영한 해당시점의 지수를 나타냄 - 각 역 단위 실 주소 및 위,경도
land_value = pd.read_csv(path+'land_value_2017_2019.csv', encoding='cp949')
land_value[['YYMM', '오송']].head()
YYMM | 오송 | |
---|---|---|
0 | 201701 | 100.226 |
1 | 201702 | 99.968 |
2 | 201703 | 100.988 |
3 | 201704 | 101.482 |
4 | 201705 | 102.830 |
#승차인원 상위 역 지가지수 변화 그래프
#land_value.set_index(land_value['YYMM'], inplace=True)
cols = ['YYMM'] + abrd_top
land_value_plt = land_value[cols]
land_value_plt['YYMM'] = land_value_plt['YYMM'].astype(str)
font = {'family' : 'nanumgothic', 'size':10}
plt.rc('font', **font) #font option
plt.rcParams["figure.figsize"] = (25,10)
land_value_plt.plot(x='YYMM', y=abrd_top)
plt.title('월별 역의 지가지수 흐름', fontsize=18)
plt.xlabel('Date', fontsize=18)
plt.ylabel('지가지수', fontsize=18)
plt.legend(fontsize=15, loc='best')
<matplotlib.axes._subplots.AxesSubplot at 0x7f16f307b2e8>
Text(0.5, 1.0, '월별 역의 지가지수 흐름')
Text(0.5, 0, 'Date')
Text(0, 0.5, '지가지수')
<matplotlib.legend.Legend at 0x7f16f30715f8>
stn_addr = pd.read_csv(path+'stn_addr_2016.csv', encoding='cp949')
stn_addr.head()
역명 | 주소 | |
---|---|---|
0 | 가수원 | 대전 서구 가수원동 547-1 |
1 | 가야 | 부산 부산진구 백양대로 91 |
2 | 각계 | 충북 영동군 심천면 각계리 |
3 | 감곡 | 전북 정읍시 감곡면 유정리 196-1 |
4 | 강경 | 충남 논산시 강경읍 대흥리 32 |
#merge
ride_acvm_with_loc_addr = pd.merge(ride_acvm_with_loc, stn_addr, how='left', left_on='KOR_STOP_STN', right_on='역명')
ride_acvm_with_loc_addr.head()
RUN_DT | STOP_STN | STLB_TRN_CLSF_CD | UP_DN_DV_CD | ABRD_PRNB | GOFF_PRNB | NSTP_PRNB | YYMM | KOR_STOP_STN | STN_NM | LAT | LNG | 역명 | 주소 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20191001 | 3900280 | 0 | D | 1148 | 3021 | 15849 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 |
1 | 20191001 | 3900280 | 7 | D | 630 | 1422 | 6902 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 |
2 | 20191001 | 3900280 | 10 | D | 49 | 127 | 615 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 |
3 | 20191001 | 3900023 | 7 | U | 19 | 4749 | 378 | 201910 | 서울 | 서울 | 37.554073 | 126.970702 | 서울 | 서울 용산구 동자동 43-205 |
4 | 20191001 | 3900096 | 7 | U | 1332 | 710 | 4545 | 201910 | 동대구 | 동대구 | 35.879437 | 128.628784 | 동대구 | 대구 동구 동대구로 550(신암동) |
지도 설정
- 좌표계 포맷 변경
- 역 별 위경도(WG84 -> UTM-K)
proj_UTMK = Proj(init='epsg:5178') # UTM-K(Bassel)
proj_WGS84 = Proj(init='epsg:4326') # Wgs84 경도/위도, GPS
def transform_w84_to_utmk(df):
return pd.Series(transform(proj_WGS84, proj_UTMK, df['LNG'], df['LAT']), index=['LNG', 'LAT'])
ride_acvm_with_loc_addr[['LNG_utmk', 'LAT_utmk']] = ride_acvm_with_loc_addr.apply(transform_w84_to_utmk, axis=1)
ride_acvm_with_loc_addr.head()
Unnamed: 0 | RUN_DT | STOP_STN | STLB_TRN_CLSF_CD | UP_DN_DV_CD | ABRD_PRNB | GOFF_PRNB | NSTP_PRNB | YYMM | KOR_STOP_STN | STN_NM | LAT | LNG | 역명 | 주소 | LNG_utmk | LAT_utmk | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 20191001 | 3900280 | 0 | D | 1148 | 3021 | 15849 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 | 9.847740e+05 | 1.846622e+06 |
1 | 1 | 20191001 | 3900280 | 7 | D | 630 | 1422 | 6902 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 | 9.847740e+05 | 1.846622e+06 |
2 | 2 | 20191001 | 3900280 | 10 | D | 49 | 127 | 615 | 201910 | 오송 | 오송 | 36.620098 | 127.327582 | 오송 | 충청북도 청원군 강외면 봉산리 370-1 | 9.847740e+05 | 1.846622e+06 |
3 | 3 | 20191001 | 3900023 | 7 | U | 19 | 4749 | 378 | 201910 | 서울 | 서울 | 37.554073 | 126.970702 | 서울 | 서울 용산구 동자동 43-205 | 9.534382e+05 | 1.950351e+06 |
4 | 4 | 20191001 | 3900096 | 7 | U | 1332 | 710 | 4545 | 201910 | 동대구 | 동대구 | 35.879437 | 128.628784 | 동대구 | 대구 동구 동대구로 550(신암동) | 1.102084e+06 | 1.765044e+06 |
고속열차(KTX) 대상
- 승차,하차,통과인원수 0이거나 음수인 경우 제외
ride_acvm_with_loc_addr = ride_acvm_with_loc_addr[ride_acvm_with_loc_addr['STLB_TRN_CLSF_CD'] == 0]
ride_fin_df = ride_acvm_with_loc_addr[(ride_acvm_with_loc_addr[['ABRD_PRNB','GOFF_PRNB', 'NSTP_PRNB']] != 0).all(axis=1)]
ride_fin_df = ride_fin_df[['RUN_DT', 'STOP_STN', 'UP_DN_DV_CD', 'ABRD_PRNB', 'GOFF_PRNB', 'NSTP_PRNB','YYMM','KOR_STOP_STN', 'LNG_utmk', 'LAT_utmk']]
ride_fin_df_cols = ['운행년월일', '정차역코드', '상하행구분', '승차인원수', '하차인원수', '통과인원수', '운행년월','역명', 'LNG_utmk', 'LAT_utmk']
ride_fin_df.columns = ride_fin_df_cols
updown_dict = {'U':'상행', 'D':'하행'}
ride_fin_df['상하행구분'] = ride_fin_df['상하행구분'].map(updown_dict)
ride_fin_df.head()
운행년월일 | 정차역코드 | 상하행구분 | 승차인원수 | 하차인원수 | 통과인원수 | 운행년월 | 역명 | LNG_utmk | LAT_utmk | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 20191001 | 3900280 | 하행 | 1148 | 3021 | 15849 | 201910 | 오송 | 9.847740e+05 | 1.846622e+06 |
6 | 20191001 | 3900047 | 하행 | 968 | 124 | 1819 | 201910 | 수원 | 9.558390e+05 | 1.918382e+06 |
12 | 20191001 | 3900685 | 하행 | 1 | 208 | 148 | 201910 | 창원 | 1.100874e+06 | 1.696025e+06 |
13 | 20191001 | 3900902 | 상행 | 980 | 17 | 1666 | 201910 | 창원중앙 | 1.109497e+06 | 1.694457e+06 |
16 | 20191001 | 3900229 | 상행 | 2269 | 72 | 3222 | 201910 | 광주송정 | 9.355993e+05 | 1.682427e+06 |
지도 및 차트 생성
- 해당 운행일자의 각 역 별 상-하행 구분에 따른 승차,하차,통과 인원 및 역의 지가지수 변동을 인터렉티브하게 표현함
widget_time = sorted(list(ride_fin_df['운행년월'].unique()))
widget_stn = list(ride_fin_df['역명'].unique())
widget_updown = ['하행', '상행']
widget_prnb_Value = ['승차인원수', '하차인원수', '통과인원수']
ride_acvm_gpd = gpd.GeoDataFrame(
ride_fin_df, geometry=gpd.points_from_xy(ride_fin_df.LNG_utmk, ride_fin_df.LAT_utmk)
)
ride_acvm_gpd.head()
운행년월일 | 정차역코드 | 상하행구분 | 승차인원수 | 하차인원수 | 통과인원수 | 운행년월 | 역명 | LNG_utmk | LAT_utmk | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20191001 | 3900280 | 하행 | 1148 | 3021 | 15849 | 201910 | 오송 | 9.847740e+05 | 1.846622e+06 | POINT (984774.029 1846622.323) |
6 | 20191001 | 3900047 | 하행 | 968 | 124 | 1819 | 201910 | 수원 | 9.558390e+05 | 1.918382e+06 | POINT (955838.951 1918382.084) |
12 | 20191001 | 3900685 | 하행 | 1 | 208 | 148 | 201910 | 창원 | 1.100874e+06 | 1.696025e+06 | POINT (1100874.105 1696025.006) |
13 | 20191001 | 3900902 | 상행 | 980 | 17 | 1666 | 201910 | 창원중앙 | 1.109497e+06 | 1.694457e+06 | POINT (1109496.880 1694456.908) |
16 | 20191001 | 3900229 | 상행 | 2269 | 72 | 3222 | 201910 | 광주송정 | 9.355993e+05 | 1.682427e+06 | POINT (935599.278 1682426.726) |
#base map loading
whole_map = pd.read_pickle(path+'whole_map.pkl')
whole_map.columns = ['geometry']
#b_time
w1 = widgets.Dropdown(
options=widget_time,
value=widget_time[0],
description='운행년월 :',
disabled=False,
)
#b_stn
w2 = widgets.Dropdown(
options=widget_stn,
value=widget_stn[0],
description='역명 :',
disabled=False,
)
#b_dir
w3 = widgets.Dropdown(
options=widget_updown,
value=widget_updown[0],
description='상하행 :',
disabled=False,
)
#want_view
w4 = widgets.Dropdown(
options=widget_prnb_Value,
value=widget_prnb_Value[0],
description='기준인원 :',
disabled=False,
)
def view(b_time = '', b_stn = '', b_dir = '', want_view = ''):
if b_time=='All':
return ride_acvm_gpd
temp_df = ride_acvm_gpd
temp_df = temp_df[temp_df['운행년월']==b_time]
temp_df = temp_df[temp_df['역명']==b_stn]
if temp_df.shape[0] == 0:
return "데이터가 없습니다"
font = {'family' : 'NanumGothic', 'size':10}
plt.rc('font', **font) #font option
fig = plt.figure(figsize=(28,8), constrained_layout=False)
gs = fig.add_gridspec(nrows=5, ncols=8, left=0.05, right=0.48, wspace=0.5)
ax1 = fig.add_subplot(gs[:5, :4]) #row, col
ax2 = fig.add_subplot(gs[:2, 4:8]) #row, col
ax3 = fig.add_subplot(gs[3:5, 4:8])
whole_map.plot(color='white', edgecolor='black', legend=True, ax=ax1, linewidth=0.2)
gpd.GeoDataFrame(temp_df).plot(column='역명', marker='*', color="r", markersize=40,legend=True, ax=ax1)
ax1.axes.get_xaxis().set_visible(False)
ax1.axes.get_yaxis().set_visible(False)
ax1.set_title('역 위치')
#1. 역명,기준연월, 상하행
df = temp_df[(temp_df['역명'] == b_stn) & (temp_df['상하행구분'] == b_dir)]
bar_1 = df[['운행년월일',want_view]]
bar_1.sort_index().plot.bar(x='운행년월일',y=want_view, ax=ax2, fontsize=10, color="orange", rot=90)
ax2.set_title('2019년 한달 간 기준인원 변화')
#2. 해당 역 지가지수
bar_2 = pd.DataFrame(land_value[['YYMM', b_stn]])
bar_2.sort_index().plot.bar(x='YYMM',y=b_stn, ax=ax3, fontsize=10, color="purple", rot=90)
ax3.set_ylim([80, 140])
ax3.set_title('17~19년 해당 역 지가지수 변화')
interact_manual(view, b_time=w1, b_stn=w2, b_dir=w3, want_view = w4)
#from IPython.display import Image
#Image('/home/yubin90/pyWork/diamond/widget_result.png')
<function main.view(b_time='', b_stn='', b_dir='', want_view='')>
서울시 거주자 인구이동 및 소비현황 시각화
분석 개요
- 목적: 서울시 거주자의 인구이동 및 소비현황 시각화를 하고자 함
분석 데이터
- 코리아크레딧뷰로(주)의 인구전입데이터
- 코리아크레딧뷰로(주)의 인구전출데이터
- 국토교통부의 시군구행정코드 및 경계지도 데이터(공공데이터)
분석 과정
1. R 패키지 로드 및 옵션 설정
R패키지 로드
options(scipen = 999) # full number
#load packages
library(data.table)
library(dplyr)
library(ggplot2)
#map 관련 라이브러리
library(ggmap) # 필요시 yum install libjpeg-devel
library(raster)
library(rgeos) # 필요시 yum install geos geos-devel
library(maptools)
library(rgdal) # 필요시 yum install gdal gdal-devel proj proj-devel
library(sp)
library(geosphere)
library(tibble)
#network 관련 라이브러리
library(igraph)
library(ggraph)
library(visNetwork)
knitr::opts_chunk$set(warning = FALSE, message=FALSE)
ggplot 관련 테마설정
my_theme <-
theme(
panel.background = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5, face = 'bold'),
legend.text = element_text(family = 'NanumGothic',
size = 8, face = 'bold'),
legend.title = element_text(family = 'NanumGothic',
size = 10, face = 'bold')
)
my_theme_bar <- theme(panel.background = element_blank(),
plot.title = element_text(hjust = 0.5, face = 'bold'),
axis.text.x = element_text(angle = 60, hjust = 1))
데이터 로드
data_path <- "/home/joohj7/analysis/project/2020_DT_교통예측시연"
# list.files(data_path, pattern = "csv")
MOVE_TYP1 <- fread(file.path(data_path, "TB_COL_KC_T023_MOVE_TYP1.csv"))
MOVE_TYP2 <- fread(file.path(data_path, "TB_COL_KC_T023_MOVE_TYP2.csv"))
시군구행정지도와 시군구코드 매핑
#시군구 데이터 매핑
siggfunc <- function(folder, layername) {
sigg_import <-
readOGR(
dsn = folder,
layer = layername,
encoding = 'CP949')
#좌표계 변환
to_crs = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
sigg <- spTransform(sigg_import, to_crs)
siggDF <- fortify(model = sigg)
sigg@data$id <- rownames(x=sigg@data)
# 이제 두 데이터프레임을 병합
siggDF <- merge(x= siggDF,
y=sigg@data[, c("id", 'SIG_KOR_NM',
"SIG_ENG_NM", "SIG_CD")],
by='id', all.x= TRUE)
# order를 10으로 나누었을 때 나머지가 1인 행만 남김(조밀도를 줄임)
siggDF <- siggDF[siggDF$order %% 10 == 1, ]
# 부속지역을 제외(조밀도를 줄임)
siggDF <- subset(x = siggDF, subset = siggDF$piece == 1)
# id와 order 기준으로 오름차순 정렬
siggDF <- siggDF[order(siggDF$id, siggDF$order), ]
return (siggDF)
}
sigg_df<- siggfunc(folder = '/home/joohj7/analysis/project/2020_DT_교통예측시연/SIG_201905',
layername = 'TL_SCCO_SIG')
## OGR data source with driver: ESRI Shapefile
## Source: "/home/joohj7/analysis/project/2020_DT_교통예측시연/SIG_201905", layer: "TL_SCCO_SIG"
## with 250 features
## It has 3 fields
head(sigg_df, 3)
id | long | lat | order | hole | piece | group | SIG_KOR_NM | SIG_ENG_NM | ||
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 127.0086 | 37.58047 | 1 | FALSE | 1 | 0.1 | 종로구 | Jongno-gu | |
11 | 0 | 127.0100 | 37.58028 | 11 | FALSE | 1 | 0.1 | 종로구 | Jongno-gu | |
21 | 0 | 127.0117 | 37.58151 | 21 | FALSE | 1 | 0.1 | 종로구 | Jongno-gu |
3 rows | 1-10 of 11 columns
2. 데이터 전처리
서울시 데이터 필터링
#지도에서 서울시만 추출
seoulDF<- sigg_df[substr(sigg_df$SIG_CD,1,2)==11,] #서울특별시:11
#지역이름의 유일이름 추출
area_df<- unique(sigg_df[, c("SIG_CD", "SIG_KOR_NM")])
head(area_df, 3)
SIG_CD | SIG_KOR_NM | |
---|---|---|
1 | 11110 | 종로구 |
2333 | 11140 | 중구 |
4251 | 11350 | 노원구 |
3 rows
#서울에서 서울로 옮긴경우
#전입데이터
SEOUL_MOVE_TYP1 <- MOVE_TYP1[MOVE_TYP1$PRV_CTNCD<=11740 &
MOVE_TYP1$CUR_CTNCD<=11740]
SEOUL_MOVE_TYP1 <- as.data.table(SEOUL_MOVE_TYP1)
head(SEOUL_MOVE_TYP1, 3)
IRIS_KEY | IRIS_PARTITION <S3: integer64> | GB | BS_YR_MON | PRV_PVNCD | PRV_CTNCD | CUR_CTNCD | CUR_ADMCD | GENDER | AGE_BIN | |
---|---|---|---|---|---|---|---|---|---|---|
1 | 20191001000000 | 1 | 201910 | 11 | 11740 | 11215 | 11215860 | 1 | 60 | |
1 | 20191001000000 | 1 | 201910 | 11 | 11530 | 11500 | 11500530 | 1 | 20 | |
1 | 20191001000000 | 1 | 201910 | 11 | 11215 | 11260 | 11260520 | 1 | 30 |
3 rows | 1-10 of 17 columns
#전출데이터
MOVE_TYP2 <- MOVE_TYP2[IRIS_KEY==2017] #필터링
SEOUL_MOVE_TYP2 <- MOVE_TYP2[MOVE_TYP2$CUR_CTNCD<=11740 &
MOVE_TYP2$AFT_CTNCD<=11740]
SEOUL_MOVE_TYP2 <- as.data.table(SEOUL_MOVE_TYP2)
head(SEOUL_MOVE_TYP2, 3)
IRIS_KEY | IRIS_PARTITION <S3: integer64> | GB | BS_YR_MON | CUR_BS_YR_MON | CUR_CTNCD | CUR_ADMCD | AFT_PVNCD | AFT_CTNCD | |
---|---|---|---|---|---|---|---|---|---|
2017 | 20191001000000 | 2 | 201910 | 201710 | 11680 | 11680690 | 11 | 11650 | |
2017 | 20191001000000 | 2 | 201910 | 201710 | 11320 | 11320514 | 11 | 11170 | |
2017 | 20191001000000 | 2 | 201910 | 201710 | 11290 | 11290555 | 11 | 11650 |
3 rows | 1-9 of 18 columns
전입/전출 집계데이터 산출
#전입 집계
#지역구내 집계 통일
SEOUL_SUMM_TYP1 <- SEOUL_MOVE_TYP1 %>%
group_by(PRV_CTNCD, CUR_CTNCD, AGE_BIN) %>%
summarise_at(c("AVG_MON_INCOME", "MED_MON_INCOME","AVG_MON_CARDSPND"),
mean, na.rm=TRUE)
head(SEOUL_SUMM_TYP1, 3)
PRV_CTNCD | CUR_CTNCD | AGE_BIN | AVG_MON_INCOME | MED_MON_INCOME | AVG_MON_CARDSPND |
---|---|---|---|---|---|
11110 | 11110 | 20 | 1913.794 | 1796.235 | 860.4706 |
11110 | 11110 | 30 | 3213.735 | 2578.794 | 1429.9412 |
11110 | 11110 | 40 | 3579.118 | 3047.676 | 1782.8235 |
3 rows
#전출 집계
#지역구내 집계 통일
SEOUL_SUMM_TYP2 <- SEOUL_MOVE_TYP2 %>%
group_by(CUR_CTNCD, AFT_CTNCD, AGE_BIN) %>%
summarise_at(c("AVG_MON_INCOME", "MED_MON_INCOME","AVG_MON_CARDSPND"),
mean, na.rm=TRUE)
head(SEOUL_SUMM_TYP2, 3)
CUR_CTNCD | AFT_CTNCD | AGE_BIN | AVG_MON_INCOME | MED_MON_INCOME | AVG_MON_CARDSPND |
---|---|---|---|---|---|
11110 | 11110 | 20 | 1574.882 | 1502.471 | 707.7353 |
11110 | 11110 | 30 | 2587.676 | 2172.265 | 1323.1176 |
11110 | 11110 | 40 | 3142.941 | 2623.294 | 1642.7353 |
3 rows
전출지역 이름 매핑
#area center name point
center <- seoulDF %>% group_by(SIG_CD, SIG_KOR_NM) %>%
summarise_at(c("long", "lat"), function(x)(min(x)+(max(x)-min(x))/2))
center <- as.data.table(center)
#시군구 center label위치 세부조정 작업
center[SIG_KOR_NM=="서대문구"]$lat <- center[SIG_KOR_NM=="서대문구"]$lat -0.01
center[SIG_KOR_NM=="마포구"]$lat <- center[SIG_KOR_NM=="마포구"]$lat -0.005
center[SIG_KOR_NM=="종로구"]$lat <- center[SIG_KOR_NM=="종로구"]$lat -0.02
center[SIG_KOR_NM=="양천구"]$lat <- center[SIG_KOR_NM=="양천구"]$lat -0.01
center[SIG_KOR_NM=="강남구"]$lat <- center[SIG_KOR_NM=="강남구"]$lat -0.01
center[SIG_KOR_NM=="동대문구"]$lat <- center[SIG_KOR_NM=="동대문구"]$lat -0.005
center[SIG_KOR_NM=="동작구"]$lat <- center[SIG_KOR_NM=="동작구"]$lat +0.005
center[SIG_KOR_NM=="동작구"]$long <- center[SIG_KOR_NM=="동작구"]$long +0.005
center[SIG_KOR_NM=="서초구"]$long <- center[SIG_KOR_NM=="서초구"]$long -0.01
center[SIG_KOR_NM=="강북구"]$lat <- center[SIG_KOR_NM=="강북구"]$lat -0.01
center[SIG_KOR_NM=="성북구"]$lat <- center[SIG_KOR_NM=="성북구"]$lat -0.005
center[SIG_KOR_NM=="구로구"]$lat <- center[SIG_KOR_NM=="구로구"]$lat +0.001
#지역구 전출집계인구수
SEOUL_count <- SEOUL_MOVE_TYP2 %>% group_by(CUR_CTNCD, AFT_CTNCD) %>%
summarise_at("POP_CNT", sum, na.rm=TRUE)
head(SEOUL_count, 3)
CUR_CTNCD | AFT_CTNCD | POP_CNT |
---|---|---|
11110 | 11110 | 118628 |
11110 | 11140 | 467 |
11110 | 11170 | 498 |
3 rows
SEOUL_count <- merge(SEOUL_count, center,
by.x="CUR_CTNCD", by.y="SIG_CD", all.x=T)
SEOUL_count <- merge(SEOUL_count, center,
by.x="AFT_CTNCD", by.y="SIG_CD", all.x=T,
suffixes= c( ".CUR", ".AFT"))
SEOUL_count <- SEOUL_count[order(SEOUL_count$CUR_CTNCD, SEOUL_count$AFT_CTNCD), ]
# 그룹 id 계산하기
unique_mat<- unique(SEOUL_count[,c("CUR_CTNCD", "AFT_CTNCD")])
unique_mat$id <- rownames(unique_mat)
# id 매핑
SEOUL_count <- merge(SEOUL_count, unique_mat,
by=c("AFT_CTNCD", "CUR_CTNCD"))
SEOUL_count <- as.data.table(SEOUL_count)
3. 분석데이터 시각화
3.1. 서울시 인구전출 데이터 분석
지역구 전출 빈도수 (구역내&타지역포함)
# 지역구 전출 빈도수
MOVE_COUNT<- SEOUL_count%>% group_by(SIG_KOR_NM.CUR) %>%
summarise(count = sum(POP_CNT))%>%
arrange(desc(count))
head(MOVE_COUNT, 3)
SIG_KOR_NM.CUR | count |
---|---|
송파구 | 479132 |
강남구 | 435717 |
강서구 | 421715 |
3 rows
# 지역구 전출 코드 매핑
MOVE_COUNT_map <- merge(seoulDF, MOVE_COUNT,
by.x="SIG_KOR_NM", by.y='SIG_KOR_NM.CUR')
MOVE_COUNT_map <- MOVE_COUNT_map[order(MOVE_COUNT_map$id, MOVE_COUNT_map$order),]
MOVE_COUNT_map <- as.data.table(MOVE_COUNT_map)
head(MOVE_COUNT_map, 3)
SIG_KOR_NM | id | long | lat | order | hole | piece | group | SIG_ENG_NM | SIG_CD | |
---|---|---|---|---|---|---|---|---|---|---|
종로구 | 0 | 127.0086 | 37.58047 | 1 | FALSE | 1 | 0.1 | Jongno-gu | 11110 | |
종로구 | 0 | 127.0100 | 37.58028 | 11 | FALSE | 1 | 0.1 | Jongno-gu | 11110 | |
종로구 | 0 | 127.0117 | 37.58151 | 21 | FALSE | 1 | 0.1 | Jongno-gu | 11110 |
3 rows | 1-10 of 11 columns
전체 전출 빈도수(barplot)
# 서울시 지역구 인구 전출 빈도수
ggplot(data = MOVE_COUNT, aes(x=reorder(SIG_KOR_NM.CUR, -count), y=count)) +
geom_bar(stat="identity",fill="purple", alpha=0.5)+ labs(x="지역", y="빈도수")+
scale_y_continuous(limits = c(0, 600000),
breaks = seq(0, 600000, by = 200000))+
my_theme_bar + ggtitle("서울시 지역구 인구 전출 빈도수")
#전체 전출을 빈번하게 하는 지도
ggplot(data = MOVE_COUNT_map,
mapping = aes(x = long, y = lat)) +
geom_polygon(aes(group= group, fill= count),color = 'black') +
geom_text(data= center, aes(x=long, y=lat, label=SIG_KOR_NM), size=3)+
scale_fill_gradient(low = 'white', high = 'red') +
coord_fixed() + my_theme + ggtitle("서울시 지역구 인구 전출 빈도수")
지역구 전출 빈도수
#전체 전출을 빈번하게 하는 지도
MOVE_COUNT2<- SEOUL_count%>% group_by(SIG_KOR_NM.CUR) %>%
filter(SIG_KOR_NM.CUR!=SIG_KOR_NM.AFT)%>% summarise(count = sum(POP_CNT)) %>%
arrange(desc(count))
MOVE_COUNT_map2 <- merge(seoulDF, MOVE_COUNT2,
by.x="SIG_KOR_NM", by.y='SIG_KOR_NM.CUR')
MOVE_COUNT_map2 <- MOVE_COUNT_map2[order(MOVE_COUNT_map2$id, MOVE_COUNT_map2$order),]
MOVE_COUNT_map2 <- as.data.table(MOVE_COUNT_map2)
#서울내 타지역으로의 빈도수(barplot)
ggplot(data = MOVE_COUNT2, aes(x=reorder(SIG_KOR_NM.CUR, -count), y=count)) +
geom_bar(stat="identity",fill="purple", alpha=0.5)+ labs(x="지역", y="빈도수")+
scale_y_continuous(limits = c(0, 60000),
breaks = seq(0, 60000, by = 20000))+
my_theme_bar + ggtitle("서울시 지역구 전출 빈도수")
ggplot(data = MOVE_COUNT_map2,
mapping = aes(x = long, y = lat)) +
geom_polygon(aes(group= group, fill= count),color = 'black') +
geom_text(data= center, aes(x=long, y=lat, label=SIG_KOR_NM), size=3)+
scale_fill_gradient(low = 'white', high = 'red') +
coord_fixed() + my_theme + ggtitle("서울시 지역구 전출 빈도수")
-
전입 전출 데이터는 2년기준.
-
한강 이남간의 전출이 활발한편
-
첫째로 자기 지역(구)에서 전출하여 자기 지역(구)로 전입하는경우가 항상 첫번째.(10만 단위 -> 만 단위로)
-
서울내 전출 자체는 송파구>강남구>강서구>관악구>노원구 순으로 나오나
-
서울내 타지역으로의 전출만을 집계하면 강남구>관악구>서초구>마포구>영등포구 순
-
전체 전출에 비해 송파구, 강서구, 노원구의 경우 타 지역으로의 전출이 많지 않은편
-
종로구,중구, 금천구의 경우 전출인구가 많지 않은 지역
3.2. 서울거주자 인구 전출의 이동량 상위 5지역
#인구 전출 이동량이 높은 지역 산출
MOVE_COUNT2_detail <- SEOUL_count%>%
group_by(SIG_KOR_NM.CUR, SIG_KOR_NM.AFT) %>%
filter(SIG_KOR_NM.CUR!=SIG_KOR_NM.AFT)%>%
summarise(count = sum(POP_CNT)) %>%
arrange(desc(count))
MOVE_COUNT2_detail
SIG_KOR_NM.CUR | SIG_KOR_NM.AFT | count |
---|---|---|
강남구 | 송파구 | 11318 |
양천구 | 강서구 | 10006 |
강남구 | 서초구 | 9497 |
서초구 | 강남구 | 8687 |
강서구 | 양천구 | 8321 |
강동구 | 송파구 | 8182 |
송파구 | 강동구 | 7508 |
서대문구 | 은평구 | 7156 |
서초구 | 동작구 | 6760 |
관악구 | 동작구 | 6607 |
Next
123456
...
60
Previous
1-10 of 597 rows
둘째로 자기 지역(구)에서 타 지역(구)로 전출하는 경우의 순서는 1_강남구->송파구, 2_양천구->강서구, 3_강남구->서초구, 4_서초구->강남구, 5_강서구->양천구 순
서울시 내 지역구별 전출인구의 지도 매핑작업
SEO.MAP_AFT <- merge(seoulDF, SEOUL_count, by.x="SIG_CD", by.y='AFT_CTNCD')
SEO.MAP_AFT <- SEO.MAP_AFT[order(SEO.MAP_AFT$id.x, SEO.MAP_AFT$order),]
SEO.MAP_AFT <- as.data.table(SEO.MAP_AFT)
#서울시 내 지역구별 전출인구의 시각화 함수
area.out.plot<- function(area){
plt<- ggplot(data = SEO.MAP_AFT,
mapping = aes(x = long, y = lat)) +
geom_polygon(aes(group= group), fill= "white",color = 'black') +
geom_polygon(data = SEO.MAP_AFT[SIG_KOR_NM.CUR==area&SIG_KOR_NM.AFT==area],
aes(group= group), fill= "gray",color = 'black')+
geom_polygon(data = SEO.MAP_AFT[SIG_KOR_NM.CUR==area &SIG_KOR_NM.AFT!=area],
aes(group= group, fill= POP_CNT),color = 'black') +
geom_text(data= center, aes(x=long, y=lat, label=SIG_KOR_NM), size=3)+
geom_segment(data = SEOUL_count[SIG_KOR_NM.CUR==area&SIG_KOR_NM.AFT!=area] %>%
group_by(AFT_CTNCD) %>%
arrange(desc(POP_CNT))%>% head(5),
aes(x = long.CUR, y = lat.CUR,
xend = long.AFT, yend = lat.AFT),
color = "darkgreen", size = 0.5,
alpha = 0.8, lineend = "round",
arrow = arrow(length = unit(0.02, "npc")))+
scale_fill_gradient(low = 'white', high = 'red') +
coord_fixed() + my_theme
return(plt)
}
지역구별 전출 상위 5지역 지도시각화
# 강남구 인구 전출 지도
area.out.plot("강남구")
# 양천구 인구 전출 지도
area.out.plot("양천구")
# 서초구 인구 전출 지도
area.out.plot("서초구")
# 강서구 인구 전출 지도
area.out.plot("강서구")
# 송파구 인구 전출 지도
area.out.plot("송파구")
3.3. 전출 네트워크 분석
MOVE_COUNT2_detail$count <- ifelse(MOVE_COUNT2_detail$count/100<10,
NA, MOVE_COUNT2_detail$count)
MOVE_COUNT2_detail<- na.omit(MOVE_COUNT2_detail)
SIG_KOR_NM.CUR <- SEOUL_count %>%
distinct(SIG_KOR_NM.CUR) %>%
rename(label = SIG_KOR_NM.CUR)
SIG_KOR_NM.AFT <- SEOUL_count %>%
distinct(SIG_KOR_NM.AFT) %>%
rename(label = SIG_KOR_NM.AFT)
# 노드 생성 작업
nodes <- full_join(SIG_KOR_NM.CUR, SIG_KOR_NM.AFT, by = "label")
nodes <- nodes %>% rowid_to_column("id")
nodes$shape <- "circle"
# 엣지 생성 작업
edges <- MOVE_COUNT2_detail %>%
left_join(nodes, by = c("SIG_KOR_NM.CUR" = "label")) %>%
rename(from = id)
edges <- edges %>%
left_join(nodes, by = c("SIG_KOR_NM.AFT" = "label")) %>%
rename(to = id)
edges <- edges[, c("from", "to", "count")]
edges <- mutate(edges, width = round(count/10000,1)*10)
서울시 지역구 전입/전출 연관 네트워크
visNetwork(nodes, edges) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visEdges(arrows = "middle")
- 강남,송파,서초 /노원,성북,강북,중랑/광진,동대문,성동/관악,동작,마포, 영등포/ 서대문,은평,종로 등의 5가지 집단내에서 주로 이동.
- 일부지역구 (중구)는 전출이 활발한 편은 아님
3.4. 서울시 연령별 지역구 전출
#지역으로 전출
AGE_MOVE <- SEOUL_MOVE_TYP2%>% group_by(AFT_CTNCD, AGE_BIN) %>%
summarise(count = sum(POP_CNT))
AGE_MOVE <- merge(AGE_MOVE, area_df, by.x="AFT_CTNCD", by.y="SIG_CD",
all=T)
AGE_MOVE <- as.data.table(AGE_MOVE)
AGE_MOVE <- AGE_MOVE[substr(AFT_CTNCD,1,2)==11, ]
AGE_MOVE%>% group_by(AGE_BIN, AFT_CTNCD) %>%
arrange(AGE_BIN, desc(count))
AFT_CTNCD | AGE_BIN | count | SIG_KOR_NM |
---|---|---|---|
11710 | 20 | 93974 | 송파구 |
11620 | 20 | 91364 | 관악구 |
11500 | 20 | 83038 | 강서구 |
11680 | 20 | 82750 | 강남구 |
11290 | 20 | 77560 | 성북구 |
11350 | 20 | 77081 | 노원구 |
11230 | 20 | 68836 | 동대문구 |
11590 | 20 | 65388 | 동작구 |
11470 | 20 | 63370 | 양천구 |
11380 | 20 | 62790 | 은평구 |
Next
123456
...
15
Previous
1-10 of 150 rows
# 서울시 지역구 전출인구 데이터 집계
AGE_MOVE2 <- SEOUL_MOVE_TYP2%>% group_by(CUR_CTNCD, AFT_CTNCD, AGE_BIN) %>%
filter(CUR_CTNCD!=AFT_CTNCD)%>%
summarise(count = sum(POP_CNT))
AGE_MOVE2 <- merge(AGE_MOVE2, area_df, by.x="AFT_CTNCD", by.y="SIG_CD",
all=T)
AGE_MOVE2 <- merge(AGE_MOVE2, area_df, by.x="CUR_CTNCD", by.y="SIG_CD",
all=T, suffixes = c(".AFT", ".CUR"))
AGE_MOVE2 <- as.data.table(AGE_MOVE2)
AGE_MOVE2 <- AGE_MOVE2[substr(AGE_MOVE2$CUR_CTNCD,1,2)==11&
substr(AGE_MOVE2$AFT_CTNCD,1,2)==11, ]
AGE_MOVE2 <- AGE_MOVE2%>% group_by(AGE_BIN, AFT_CTNCD) %>%
arrange(AGE_BIN, desc(count))
AGE_MOVE2 <- as.data.table(AGE_MOVE2)
- 연령별 지역구 전출 네트워크 전처리
- 전출 1000이상의 데이터만 집계
- 관계를 명확히 보기위해 데이터에 가중치를 줌
연령별 지역구 네트워크
##### 연령별 지역구 네트워크 함수
age_net <- function(age){
AGE_NM.CUR <- AGE_MOVE2[,c("SIG_KOR_NM.CUR")] %>%
distinct(SIG_KOR_NM.CUR) %>%
rename(label = SIG_KOR_NM.CUR)
AGE_NM.AFT <- AGE_MOVE2[,c("SIG_KOR_NM.AFT")] %>%
distinct(SIG_KOR_NM.AFT) %>%
rename(label = SIG_KOR_NM.AFT)
AGE_nodes <- full_join(SIG_KOR_NM.CUR, SIG_KOR_NM.AFT, by = "label")
AGE_nodes <- AGE_nodes %>% rowid_to_column("id")
AGE_nodes$shape <- "circle"
AGE_edges <- AGE_MOVE2[AGE_BIN==age] %>%
filter(count>1000)%>%
left_join(AGE_nodes, by = c("SIG_KOR_NM.CUR" = "label")) %>%
rename(from = id)
AGE_edges <- AGE_edges %>%
left_join(AGE_nodes, by = c("SIG_KOR_NM.AFT" = "label")) %>%
rename(to = id)
AGE_edges <- AGE_edges[, c("from", "to", "count")]
AGE_edges <- mutate(AGE_edges, width = round(count/1000)*5)
vis <- visNetwork(AGE_nodes, AGE_edges) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visEdges(arrows = "middle")
return(vis)
}
# 20대 인구 전출 네트워크
age_net(20)
# 30대 인구 전출 네트워크
age_net(30)
# 40대 인구 전출 네트워크
age_net(40)
# 50대 인구 전출 네트워크
age_net(50)
- 20~30대에서는 활발하던 인구이동이 4-50대 이상으로 갈수록 지역구를 잘 벗어나지 않는 특성을 보임
3.5. 서울시 지역구 전입/전출비율
#전입 데이터 서울시 지역구별 집계인구
IN_CTNCD_POP <- SEOUL_MOVE_TYP1 %>%
group_by(CUR_CTNCD) %>%
filter(PRV_CTNCD!=CUR_CTNCD)%>%
summarise_at("POP_CNT", sum, na.rm=TRUE)
#전출 데이터 서울시 지역구별 집계인구
OUT_CTNCD_POP <- SEOUL_MOVE_TYP2 %>%
group_by(CUR_CTNCD) %>%
filter(CUR_CTNCD!=AFT_CTNCD)%>%
summarise_at("POP_CNT", sum, na.rm=TRUE)
#전입/전출 데이터를 현재 지역구 기준으로 병합
INOUT_CTNCD_POP<- merge(IN_CTNCD_POP,
OUT_CTNCD_POP,
by=c("CUR_CTNCD"),
suffixes=c(".MV_TYP1", ".MV_TYP2"))
INOUT_CTNCD_POP <- merge(INOUT_CTNCD_POP, area_df,
by.x="CUR_CTNCD", by.y="SIG_CD")
INOUT_CTNCD_POP <- as.data.table(INOUT_CTNCD_POP)
#전입-전출의 차이를 계산
INOUT_CTNCD_POP$MV_DIFF<- INOUT_CTNCD_POP$POP_CNT.MV_TYP1 -
INOUT_CTNCD_POP$POP_CNT.MV_TYP2
#전입-전출의 차의 증감 상태를 산출
INOUT_CTNCD_POP$status <- factor(ifelse(INOUT_CTNCD_POP$MV_DIFF<0, "감소", "증가"))
INOUT_CTNCD_POP
CUR_CTNCD | POP_CNT.MV_TYP1 | POP_CNT.MV_TYP2 | SIG_KOR_NM | MV_DIFF | status |
---|---|---|---|---|---|
11110 | 8764 | 10771 | 종로구 | -2007 | 감소 |
11140 | 7928 | 9483 | 중구 | -1555 | 감소 |
11170 | 15299 | 14996 | 용산구 | 303 | 증가 |
11200 | 23974 | 20474 | 성동구 | 3500 | 증가 |
11215 | 23541 | 23941 | 광진구 | -400 | 감소 |
11230 | 21752 | 24577 | 동대문구 | -2825 | 감소 |
11260 | 19967 | 15211 | 중랑구 | 4756 | 증가 |
11290 | 23737 | 27918 | 성북구 | -4181 | 감소 |
11305 | 16521 | 17564 | 강북구 | -1043 | 감소 |
11320 | 15278 | 14421 | 도봉구 | 857 | 증가 |
Next
123
Previous
1-10 of 25 rows
지역구 전입/전출 현황
지역구 전입/전출 현황(지도)
- 지역구 내로의 전입/전출 제외
- 송파구>은평구>강서구의 순으로 전입 인구수가 상승세
- 강남구>서초구>성북구 순으로 전출 인구수가 감소세
3.6. 서울시 연령별 소득 및 소비 현황
#현재 지역구의 평균월소득, 중위월소득, 평균신용카드소비 재집계
SEOUL_CUR_INCOME<- SEOUL_SUMM_TYP2 %>%
group_by(CUR_CTNCD, AGE_BIN) %>%
summarise_at(c("AVG_MON_INCOME", "MED_MON_INCOME","AVG_MON_CARDSPND"),
mean, na.rm=TRUE)
#현재의 사용자 시군구 코드 병합
SEOUL_CUR_INCOME <- merge(seoulDF, SEOUL_CUR_INCOME,
by.x="SIG_CD", by.y="CUR_CTNCD", all.x=T)
SEOUL_CUR_INCOME <- SEOUL_CUR_INCOME[order(SEOUL_CUR_INCOME$id,
SEOUL_CUR_INCOME$order), ]
SEOUL_CUR_INCOME <- as.data.table(SEOUL_CUR_INCOME)
#천단위 -> 만단위로 단위 조정
SEOUL_CUR_INCOME$AVG_MON_INCOME <- SEOUL_CUR_INCOME$AVG_MON_INCOME/10
SEOUL_CUR_INCOME$MED_MON_INCOME <- SEOUL_CUR_INCOME$MED_MON_INCOME/10
SEOUL_CUR_INCOME$AVG_MON_CARDSPND <- SEOUL_CUR_INCOME$AVG_MON_CARDSPND/10
서울시 지역구내 월별 중위소득집계
SEOUL_CUR_INCOME$AGE_BIN <- factor(SEOUL_CUR_INCOME$AGE_BIN)
levels(SEOUL_CUR_INCOME$AGE_BIN) <- paste0("AGE = ", levels(SEOUL_CUR_INCOME$AGE_BIN))
ggplot(data = SEOUL_CUR_INCOME ,
mapping = aes(x = long,
y = lat,
group = group)) +
geom_polygon(mapping = aes(fill =MED_MON_INCOME),
color = 'black') +
#theme_bw() +
coord_fixed() +
scale_fill_gradient(low = 'white', high = 'red') +
facet_wrap(~AGE_BIN) + my_theme
- 20-30대 까지는 지역별 소득 편차가 있지 않은편, 연령이 증가할수록 편차 발생
- 소득의 경우 극단값의 영향이 크므로 중위수의 값으로 산출
- 20대에는 가장 낮은 월소득, 30-50대에 안정적인 소득 분포, 60-70대에는 거의 낮은 소득
- 40-50대에 강남,서초,송파,양천,노원 등 일부 지역이 월별 고소득자 분포
서울시 지역구내 월별 신용카드 소비 분석
ggplot(data = SEOUL_CUR_INCOME ,
mapping = aes(x = long,
y = lat,
group = group)) +
geom_polygon(mapping = aes(fill =AVG_MON_CARDSPND),
color = 'black') +
#theme_bw() +
coord_fixed() +
scale_fill_gradient(low = 'white', high = 'red') +
facet_wrap(~AGE_BIN)+ my_theme
- 20대에는 낮은 소득에 비해 신용카드소비량이 다소 높음.