Kibana에서 지도 정보 시각화 하기

스르륵·2022년 8월 19일
0

데이터파이프라인

목록 보기
10/10

키바나는 강력한 시각화 도구이다.
이번에는 지도정보 데이터를 바탕으로 시각화를 해볼 것이다.

실제 프로젝트에서는 API 등을 통해 실시간으로 업데이트되는 데이터를 받아오거나 직접 수집하겠지만, 우선은 간단하게 시각화부터 해보기 위해 데이터를 파일로 받아서 엘라스틱서치에 저장해볼 것이다.

1. 서울 행정동 별 인구 분석하기

서울 열린데이터 광장에서 제공하는 행정동 별 인구 분석에 대한 자료를 받으려 했는데...
정책이 바뀌었는지 더이상 전체 동별, 성별 분류가 된 데이터는 따로 신청해서 받아야 한다.
우선 신청은 해두고, 2020년 3분기 데이터를 찾을 수 있어서 이걸로 진행한다.


데이터는 탭으로 구분되어있고 각 숫자는 세자리마다 콤마로 구분되어 있다.
로그스태시 필터링을 통해 쉼표는 삭제하고 '동' 컬럼의 동이름이 합계, 소계로 되어있는 로우는 삭제할 것이다.

logstash configuration

로그스태시에서 파일 읽어오기로 데이터를 불러와보면,

이런 형태를 볼 수 있다. \t로 구분될 때 마다 컬럼이므로, 컬럼명을 각각 붙여준 뒤 "동" 컬럼의 값이 동 이름이 아닌 합계, 소계일 경우에는 제외하도록 하고, 각 숫자는 정규식을 통해 쉼표를 제거할 것이다.
그리고 로그스태시에서 자동으로 생성하는 데이터들 (@version, host 등..)과 어짜피 모두 2020년 3분기 데이터이므로 해당 컬럼까지 삭제할 것이다.


파싱 결과 이렇게 데이터를 정형화 할 수 있다.
이제 이 데이터를 엘라스틱 서치로 저장하면된다.

# logstash_seoul.conf

input {
  file {
    path => "/usr/share/logstash/seoul_pop.txt"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  mutate {
    gsub => [
      "message", ",", ""
    ]
  }

  csv {
    separator => "      " # tab 눌러줘야함
    columns => ["PERIOD", "DISTRICT", "DONG", "HOUSEHOLD", "SUM_1", "MALE_1", "FEMALE_1", "SUM_2", "MALE_2", "FEMALE_2", "SUM_3", "MALE_3", "FEMALE_3", "POP_PER_HOUSEHOLD", "ELDERS"]
    remove_field => ["PERIOD", "message", "@timestamp", "path", "@version", "host"]
  }
  if [DONG] == "동" or [DONG] == "합계" or [DONG] == "소계" {
    drop { }
  }
}

output {
  elasticsearch {
    hosts => ["https://<HOST>:9200"]
    index => "seoul_population"
    user => "<HOSTNAME>"
    password => "<PASSWORD>"
    ssl => true
    cacert => "/usr/share/logstash/http_ca.crt"
  }
}

로그스태시 실행 전에 인덱스 매핑을 먼저 해두자

PUT seoul_population
{
  "mappings": {
    "properties": {
      "DISTRICT": {"type": "keyword"},
      "DONG": {"type": "keyword"},
      "HOUSEHOLD": {"type": "integer"},
      "SUM_1": {"type": "integer"},
      "MALE_1": {"type": "integer"},
      "FEMALE_1": {"type": "integer"},
      "SUM_2": {"type": "integer"},
      "MALE_2": {"type": "integer"},
      "FEMALE_2": {"type": "integer"},
      "SUM_3": {"type": "integer"},
      "MALE_3": {"type": "integer"},
      "FEMALE_3": {"type": "integer"},
      "POP_PER_HOUSEHOLD": {"type": "float"},
      "ELDERS": {"type": "integer"}
    }
  }
}


엘라스틱서치에 데이터 적재 성공!

QGIS를 이용한 사용자 벡터 레이어 생성

우리는 지도 위에 동별 경계를 표시할 필요가 있는데 보통 지도에는 시군구 경계정도만 나온다. 따라서 geojson 이라는 것을 통해 벡터 레이어를 생성해야 한다. 나라에서 제공하는 벡터 레이어와 QGIS를 사용해서 필요한 동 경계 레이어를 만들어보자.

이렇게 동별 경계를 얻을 수 있는데, 해당 내용은 다른 글로 다시 정리하도록 하겠다.

(추후 추가)

2. Kibana에서 지도 시각화하기

지도 시각화 부분이 라이센스가 필요한 것으로 전환된 것 같다. 최신버전 8.3.3을 깔아서 하다보니 이런일이...
이전 버전으로 내린 뒤 다시 해야할 것 같다.

참고로 8.1 버전 이후로 바뀐 점이 많아서 인터페이스도 다른 점이 꽤 있는 것 같고 라이센스 문제도 종종 만나게 되는 것 같다. --> (추후 수정)

우선 아쉽지만 다른 시각화 부분을 진행해본다.

서울에서 외국인이 많이 사는 구는?


키바나 시각화를 통해 구 별로 전체 외국인의 수를 Area로 나타내고, 남녀 외국인을 막대그래프로 나타내 보았다. 구로, 금천, 영등포가 압도적으로 많은 외국인이 살고있다는 것을 알 수 있다. 그리고 그 세 구 외에는 모두 여자 외국인이 더 많은 것을 볼 수 있다.


다음은 파이썬 클라이언트로 오픈 API를 통해 데이터를 엘라스틱서치에 저장하고 키바나로 수집된 데이터를 지도위에 표시하는 작업을 하려고 했는데, 역시 지도위에 표시하는 것이기 때문에 라이센스가 걸린다. 시각화는 버전 수정 후 다시 하도록 하고 우선은 API를 클라이언트로 호출하고 엘라스틱서치에 저장하는 것 까지만 진행해봐야겠다.

profile
기록하는 블로그

0개의 댓글