본문 바로가기
제로베이스 데이터 스쿨/일일 스터디 노트

24일차 스터디노트 / 파이썬 Seaborn, Folium, 지도 시각화, 데이터 시각화

by 김뎀뎀 2023. 2. 3.

※제로베이스 데이터 취업스쿨 11기 수강 중

📗 24일차 공부 내용 요약

 

Seaborn과 Folium을 활용한 데이터 시각화 방법에 대해 학습하고, 지난번 정리했던 서울시 범죄현황 데이터를 시각화해보았다.

1. Seaborn : set_style(), boxplot(), swarmplot(), lmplot(), heatmap(), pairplot()

2. 서울시 범죄현황 데이터 시각화 : Seaborn 라이브러리를 활용한 데이터 시각화

3. Folium 지도 시각화 : Map(), fMarker(), Icon(), fClickForMarker(), LatLngPopup(), Circle(), CircleMarker(), Choropleth()

4. 서울시 범죄현황 지도 시각화 : Folium 라이브러리를 활용한 지도 시각화

5. 서울시 범죄 발생 장소 분석 : Seaborn라이브러리의 heatmap()을 활용한 데이터 시각화

 


📖  24일차 공부 내용 자세히

1.Seaborn

sns.set_style()

'white', 'whitegrid', 'dark', 'darkgrid’, ‘ticks’

sns.set_style('whitegrid')
plt.figure(figsize = (10,6))
plt.plot(x, y1, x, y2, x, y3, x, y4)
plt.show()

sns.boxplot()
  • hue : 카테고리 데이터 표현
  • pallette : 색상 옵션
plt.figure(figsize=(8,6))
sns.boxplot(x='day', y='total_bill', data=tips, hue='smoker', palette='Set3')
plt.show()

 

sns.swarmplot()
  • color : 0~1 사이 검은색부터 흰색 사이 값을 조절
plt.figure(figsize=(8,6))
sns.swarmplot(x='day', y='total_bill', data=tips, color='0.5')
plt.show()

sns.lmplot()
  • hue : 카테고리 데이터 표현
  • order 
  • robust : 경향에서 벗어난 값 처리
  • ci : 신뢰구간 선택
  • scatter_kws : 도트 크기
sns.set_style('darkgrid')
sns.lmplot(
    x='x', 
    y='y', 
    data=anscombe.query("dataset == 'II'"),
    order=2,
    ci=None, #ci 신뢰구간 선택
    height = 5, 
    scatter_kws={'s':50}) 
plt.show()
```

sns.heatmap()
  • annot 데이터값 표시 여부
  • fmt 정수형/실수형 표현
  • linewidths = 1 간격설정(디폴트는 0)
  • cmap 색상(colormap)
plt.figure(figsize=(8,6))
sns.heatmap(flights, annot=True, fmt='d', cmap='YlGnBu')
plt.show()

sns.pairplot()
#원하는 컬럼만 pairplot

sns.pairplot(iris,
            x_vars=['sepal_width', 'sepal_length'],
            y_vars=['petal_width', 'petal_length']
            )
plt.show()

 

2.서울시 범죄현황 데이터 시각화

강도, 살인, 폭력에 대한 상관관계 확인
sns.pairplot(
    data = crime_anal_norm,
    vars = ['살인', '강도', '폭력'],
    kind = 'reg', # kind : {'scatter', 'kde', 'hist', 'reg'}
    height=3
)
plt.show()

검거율 heatmap
#'검거'컬럼을 기준으로 정렬

def drawGraph():
    
    # 데이터 프레임 생성
    target_col = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
    crime_anal_norm_sort = crime_anal_norm.sort_values(by='검거', ascending=False) #내림차순
    
    #그래프 설정
    plt.figure(figsize=(8,8))
    sns.heatmap(
        data = crime_anal_norm[target_col],
        annot = True, #데이터값 표현
        fmt = 'f', #실수 
        linewidths = 1, #간격설정(디폴트는 0임)
        cmap = 'RdPu'
    )
    plt.title('범죄 검거 비율(정규화된 검거의 합으로 정렬)')
    plt.show()

drawGraph()

 

3.Folium 지도 시각화

folium.Map()
  • tiles option
    • "OpenStreetMap"
    • "Stamen" (Terrain, Toner, and Watercolor)
m = folium.Map(
    location = [37.5446, 127.056], 
    zoom_start = 14,
    tiles =  "OpenStreetMap"
) 
m

 

folium.Marker()
  • popup 클릭하면 출력됨, html 문법 적용 가능
  • tooltip 커서를 대면 출력됨, html 문법 적용 가능
#건대입구역
folium.Marker((37.5405, 127.0693)).add_to(m)

#성수역 #popup, tooltip 
folium.Marker(
    location = (37.5446, 127.056),
    popup = '<b>Subway</b>',#클릭하면 출력이 됨, html 문법 적용 가능
    tooltip = '<i>성수역</i>' #커서를 가져가면 출력이 됨
).add_to(m)

# html
folium.Marker(
    location = [37.5413, 127.0658],
    popup = "<a href='https://www.common-ground.co.kr/' target=_'blink'>커먼그라운드</a>", #클릭하면 출력이 됨, html 문법 적용 가능
    tooltip = "<i>COMMON GROUND</i>" #커서를 가져가면 출력이 됨
).add_to(m)

folium.Icon()
  • color 마커 컬러
  • icon_color 아이콘 컬러
  • icon 아이콘 모양
  • angle 아이콘 각도
  • prefix 아이콘 출처 (’fa’ , 'glyphicon’)
#건대입구역 # icon basic
folium.Marker(
    (37.5405, 127.0693), 
    icon=folium.Icon(color="black", icon = "info-sign")
).add_to(m)


#성수역 # icon color
folium.Marker(
    location = (37.5446, 127.056),
    popup = '<b>Subway</b>',#클릭하면 출력이 됨, html 문법 적용 가능
    tooltip= 'Icon color',
    icon=folium.Icon(
        color = 'pink',
        icon_color = 'blue',
        icon = 'cloud'
    )
).add_to(m)

# Icon custom -Font Awesome
folium.Marker(
    location = [37.5413, 127.0658],
    popup = "커먼그라운드", #클릭하면 출력이 됨, html 문법 적용 가능
    tooltip = "Icon custom", #커서를 가져가면 출력이 됨
    icon = folium.Icon(
        color = 'orange',
        icon_color = 'green',
        icon = 'music',
        angle = 30, # 기울기
        prefix = 'fa' #Font Awesome 사이트에서 찾을 수 있는 아이콘
    )
).add_to(m)

# Icon custom -glyphicon
folium.Marker(
    location = [37.5418, 127.0615],
    popup = "LCDC", #클릭하면 출력이 됨, html 문법 적용 가능
    tooltip = "Icon custom", #커서를 가져가면 출력이 됨
    icon = folium.Icon(
        color = 'lightblue',
        icon_color = 'black',
        icon = 'glyphicon glyphicon-shopping-cart',
        prefix = 'glyphicon' #glyphicon
    )
).add_to(m)


m

folium.ClickForMarker()

지도 위에 마우스를 클릭했을 때 마커를 생성한다

m.add_child(folium.ClickForMarker(popup='ClockForMarker')) 
#popup에 값이 없으면 위도와 경도 반환

 

folium.LatLngPopup()

지도를 마우스로 클릭했을 때 위도 경도 정보를 반환한다

m.add_child(folium.LatLngPopup())

 

folium.Circle(), folium.CircleMarker()
#Circle
folium.Circle(
    location = [37.5488, 127.0800], #어린이대공원
    radius = 300, #반지름
    fill = True, #원형 안의 색상을 채울것인지
    color = '#eb7734',
    fill_color = 'red',
    popup = 'Circle Popup',
    tooltip='Circle Tooltip'
).add_to(m)

#Circle
folium.CircleMarker(
    location = [37.5427, 127.0761], #건국대학교
    radius = 30, #반지름
    fill = True, #원형 안의 색상을 채울것인지
    color = '#34eb96',
    fill_color = '#298be6',
    popup = 'CircleMarker Popup',
    tooltip='CircleMarker Tooltip'
).add_to(m)

m

folium.Choropleth
m = folium.Map([43,-102], zoom_start = 3) #미국좌표

folium.Choropleth(
    geo_data = '../data/02. us-states.json', #경계선 좌표값이 담긴 데이터
    data = state_data, #Series or DataFrame
    columns = ['State', 'Unemployment'], #DataFarme Columns
    key_on = 'feature.id', # 두 데이터를 묶어준다
    fill_color = 'BuPu',
    fill_opacity = 1, #0~1
    line_opacity = 0, #0~1
    legend_name = 'Unemployment rate (%)'
).add_to(m)

m

 

 

4.서울시 범죄현황 지도 시각화

경창서별 정보와 범죄 검거 현황
my_map = folium.Map(
    location=[37.5502, 126.982], zoom_start = 11
)

#경찰서 위치 마커 표시
for idx, rows in crime_anal_station.iterrows():
    folium.Marker(
        location = [ rows['lat'], rows['lng']]
    ).add_to(my_map)
    
#경계선 표시
folium.Choropleth(
    geo_data = geo_str,
    data = crime_anal_norm['범죄'],
    columns = [crime_anal_norm.index, crime_anal_norm['범죄']],
    key_on = 'feature.id',
    fill_color = 'PuRd',
    fill_opacity = 0.7,
    line_opacity = 0.2
).add_to(my_map)


#원표시하기
#검거에 값을 곱한 뒤 원의 넓이 적용
for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        location = [ rows['lat'], rows['lng']],
        radius = rows['검거'] * 50,
        popup = rows['구분'] + ':' + '%.2f' % rows['검거'],
        color = '#3186cc',
        fill = True,
        fill_color = '#3186cc'
    ).add_to(my_map)
    
my_map

 

5.서울시 범죄 발생 장소 분석

범죄 발생 장소 피봇테이블, 정규화
#피봇테이블
crime_loc = crime_loc_raw.pivot_table(
     crime_loc_raw, index ='장소', columns ='범죄명', aggfunc =[np.sum]
 )

#다중컬럼 제거
crime_loc.columns = crime_loc.columns.droplevel([0,1])

#정규화
crime_loc_norm = crime_loc / crime_loc.max()

#종합 컬럼 추가
crime_loc_norm['종합'] = np.mean(crime_loc_norm, axis = 1)

좌) 원래 데이터 /  우) 최종 데이터

히트맵 그리기
def drawGraph():
    plt.figure(figsize = (8,8))
    sns.heatmap(
        crime_loc_norm_sort,
        annot = True,
        fmt = 'f',
        linewidths = 0.5,
        cmap = 'RdPu')
    plt.title('범죄 발생 장소')
    plt.show()
    
drawGraph()


➰ 24일차 후기

복잡해보였던 데이터들이, 몇 줄의 코드들로 명료한 시각 정보가 되는 과정이 흥미로웠다.

지도로 시각화하는 과정도 재미있었고, 앞으로 더 배워서 자유자재로 다룰 수 있다면 더 재미를 붙일 것 같다는 생각이 들었다.

데이터 직무로의 전환을 목표로 삼으면서, 직접 경험해보지는 못했던 어쩌면 막연한 목표에 내가 계속 흥미를 지속할 수 있을까라는 생각을 종종 했었다.

오늘의 과정이 내가 앞으로 습득하고 경험해야할 방대한 것들의 사소한 일부이겠지만, 내가 흥미롭게 할 수 있겠다라는 씨앗을 심어주었다. 

빠르게 나가는 진도에 조금은 벅차지만, 이 마음을 계속 유지하며 열심히 나아가야겠다.


※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.