본문 바로가기
TIL _Today I Learned/2024.07

[DAY 11] Plotly, Folium

by gamdong2 2024. 7. 25.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.07.25

📕 학습 목록

  • Plotly, Folium을 이용한 데이터 시각화

 

📗 기억할 내용

1. Plotly

1) Plotly 란?

  • Plotly는 Python, R, JavaScript 등에서 사용할 수 있는 인터랙티브한 데이터 시각화 라이브러리
  • 다양한 그래프 유형을 제공
  • 웹 애플리케이션 및 Jupyter Notebook에 쉽게 통합하여 사용할 수 있음

2) Plotly 주요 기능

 

  • 인터랙티브 기능: 그래프를 확대/축소하거나 항목별로 세부 정보를 확인할 수 있음
  • 호환성:  웹 프레임워크와의 높은 호환성
  • 커스터마이징: 레이아웃, 색상, 주석, 데이터 포인트 등의 요소를 세밀하게 제어할 수 있음

3) 기본 플롯 유형 및 설정 방법

  • 라인 차트: 연속 데이터 시각화에 유용하며, 시간에 따른 변화를 추적할 때 효과적
import plotly.express as px
import pandas as pd

data = pd.DataFrame({
    '날짜': ['2021-01-01', '2021-02-01', '2021-03-01'],
    '가격': [100, 150, 200]
})

fig = px.line(data, x='날짜', y='가격', title='가격 변화')
fig.show()

 

  • 산점도: 변수 간 상관관계를 시각화할 때 적합하며, 마커 크기, 색상 설정으로 다양한 표현 가능
fig = px.scatter(data, x='날짜', y='가격', title='가격 변화 산점도')
fig.show()

 

  • 바 차트: 범주형 데이터를 비교할 때 유용하며, 그룹화 및 누적 바 차트로 확장 가능
fig = px.bar(data, x='날짜', y='가격', title='가격 변화 바 차트')
fig.show()

 

  • 히스토그램: 데이터 분포를 나타내며, 빈 크기와 색상을 조정할 수 있어 데이터의 분포 특성을 쉽게 파악할 수 있음
data = pd.DataFrame({'점수': [20, 25, 30, 35, 40]})
fig = px.histogram(data, x='점수', nbins=5, title='점수 분포')
fig.show()

 

4) 고급 플롯 기능

  • 서브플롯 및 삽입 플롯: 여러 플롯을 make_subplots을 사용해 한 화면에 배열하여, 다양한 시각적 비교 가능
from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(rows=1, cols=2)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1)
fig.add_trace(go.Bar(x=[1, 2, 3], y=[6, 5, 4]), row=1, col=2)
fig.show()

 

  • 3D 플롯: 데이터를 3차원으로 표현하여 깊이와 입체감을 부여할 수 있음
import numpy as np

x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
z = np.sin(np.sqrt(x**2 + y**2))

fig = go.Figure(data=[go.Surface(z=z)])
fig.show()

 

  • 맵 시각화: 지리 데이터를 효과적으로 시각화할 수 있음
fig = px.scatter_geo(data, lat='위도', lon='경도', color='변수', title='지리적 데이터 시각화')
fig.show()

 

 

2. Folium

1) Folium 이란?

  • Folium: Python 기반의 지도 시각화 라이브러리
  • 간단한 코드로 대화형 지도를 생성할 수 있어 웹 애플리케이션에 적합함

2) Folium 주요 기능

 

  • 대화형 지도 생성: 지도를 통해 다양한 시각적 요소를 제공하며, 특정 위치의 정보를 직관적으로 확인할 수 있음
  • 위치 정보 시각화: GPS 좌표를 통해 특정 위치를 표시할 수 있으며, 스타일과 색상을 통해 정보를 직관적으로 전달
  • 다양한 지도 스타일: 다양한 지도 스타일과 레이어를 제공하여 사용자 맞춤형 지도를 제작할 수 있음

3) Folium의 지도 생성 및 커스터마이징 방법

  • 기본 지도 생성: folium.Map() 함수로 지도의 중심 좌표와 줌 레벨을 설정하여 기본 지도를 생성
import folium

map = folium.Map(location=[37.5665, 126.9780], zoom_start=12)  # 서울 중심 좌표
map

 

 

  • 마커 추가: folium.Marker()를 사용해 지도 위에 마커를 추가하고, 팝업을 통해 정보를 표시
folium.Marker([37.5665, 126.9780], popup='서울').add_to(map)
map

 

  • 아이콘 및 색상 설정: 마커의 시각적 요소를 강화하기 위해 아이콘과 색상을 설정
folium.Marker([37.5665, 126.9780], 
              popup='서울',
              icon=folium.Icon(color='red', icon='info-sign')).add_to(map)
map

 

  • 다각형, 원, 경로 추가: 특정 지역을 강조하거나 경로를 표시
folium.Circle(location=[37.5665, 126.9780], radius=500, color='blue', fill=True).add_to(map)
map

 

4) 고급 기능

  • 지도 레이어와 컨트롤 기능: folium.LayerControl을 통해 사용자가 지도의 레이어를 켜고 끌 수 있게 설정할 수 있음
folium.TileLayer('stamenwatercolor').add_to(map)
folium.TileLayer('stamenterrain').add_to(map)
folium.LayerControl().add_to(map)
map

 

  • GeoJSON 데이터 시각화: folium.GeoJson을 사용해 GeoJSON 형식의 데이터를 지도에 표현
import requests

url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data/world-countries.json'
geo_json_data = requests.get(url).json()
folium.GeoJson(geo_json_data).add_to(map)
map

 

  • 스타일맵 설정: 다양한 배경 지도를 지원하여 지도 스타일을 맞출 수 있음
folium.Map(location=[37.5665, 126.9780], tiles='Stamen Terrain', zoom_start=12)

 

5) 응용 예시

  • 지역 통계 시각화: Folium을 사용해 대화형 지도로 지역별 통계를 시각화
    • 각 지역별 인구 분포나 특정 변수의 데이터를 색상으로 구분하여 표시
import pandas as pd

data = pd.DataFrame({
    'name': ['서울', '부산', '인천'],
    'lat': [37.5665, 35.1796, 37.4563],
    'lon': [126.9780, 129.0756, 126.7052],
    'population': [9776000, 3448737, 2957026]
})

map = folium.Map(location=[36.5, 127.5], zoom_start=7)

for _, row in data.iterrows():
    folium.CircleMarker(
        location=[row['lat'], row['lon']],
        radius=10,
        color='blue',
        fill=True,
        fill_color='blue',
        popup=f"{row['name']}: {row['population']}명"
    ).add_to(map)

map

 

  • 클러스터링과 히트맵: 많은 마커를 클러스터링하거나 히트맵을 통해 데이터 밀도를 표현
from folium.plugins import MarkerCluster

marker_cluster = MarkerCluster().add_to(map)
for _, row in data.iterrows():
    folium.Marker([row['lat'], row['lon']], popup=row['name']).add_to(marker_cluster)

 

 

📙 내일 일정

  • 에듀 테크 특강