col = ['살인','강도','강간','절도','폭력']
crime_anal_norm = crime_anal_gu[col] / crime_anal_gu[col].max()
crime_anal_norm.head()
col2 = ['강간검거율','강도검거율','살인검거율','절도검거율','폭력검거율']
# 각 값을 최대값으로 나누어 저장
crime_anal_norm[col2] = crime_anal_gu[col2]
crime_anal_norm.head()
result_CCTV = pd.read_csv('../data/CCTV파일',encoding='utf-8', index_col='구별')
crime_anal_norm[['인구수','CCTV']] = result_CCTV[['인구수','소계']]
crime_anal_norm.head()
crime_anal_norm['범죄'] = np.mean(crime_anal_norm[col],axis=1)
crime_anal_norm.head()
np.mean
: 평균을 구하는 함수, axis
에 따라 행(1), 열(0)로 계산set_style()
: white, dark, whitegrid, darkgrid, ticksdespine()
: 그래프의 왼쪽과 아래쪽만 선을 그리는 스타일offset
: x축, y축 사이의 거리 조절import seaborn as sns
x = np.linspace(0,14,100)
y1 = np.sin(x)
y2 = 2 * np.sin(x + 0.5)
y3 = 3 * np.sin(x + 1.0)
y4 = 4 * np.sin(x + 1.5)
plt.figure(figsize=(10,6))
plt.plot(x,y1,x,y2,x,y3,x,y4)
plt.show()
sns.set_style('white')
plt.figure(figsize=(10,6))
plt.plot(x,y1,x,y2,x,y3,x,y4)
sns.despine()
plt.show()
tips = sns.load_dataset('tips')
tips.head()
plt.figure(figsize=(8,6))
sns.boxplot(x=tips['total_bill'])
plt.show()
plt.figure(figsize=(8,6))
sns.boxplot(x='days', y='total_bill',data=tips)
plt.show()
boxplot에 컬럼을 지정
컬럼 지정
x
: x축 지정
y
: y축 지정
data
: 데이터 지정
hue
: 값을 구분할 기준
palette
: seaborn이 제공하는 색상 선택(Set1~3)
plt.figure(figsize=(8,6))
sns.boxplot(x='days', y='total_bill',hue='smoker',data=tips,palette='Set3')
plt.show()
plt.figure(figsize=(8,6))
# color : 0 ~ 1(검정색 ~ 흰색)
sns.swarmplot(x='day',y='total_bill', data=tips, color='.5')
plt.show()
plt.figure(figsize=(8,6))
sns.boxplot(x='day',y='total_bill',data=tips)
sns.swamplot(x='day',y='total_bill',data=tips, color='.25')
plt.show()
sns.set_style('darkgrid')
sns.lmplot(x='total_bill', y='tip', data=tips, size=7)
plt.show()
flights = sns.load_dataset('flights')
flights.head()
flights = fligths.pivot('month','year','passengers')
flights.head()
annot
: 값 표시 True, 값 미표시 Falsefmt
: 자료형 결정(d - 정수, f - 실수)cmap
: 컬러맵 설정plt.figure(figsize=(10,8))
sns.heatmap(flights, annot=True, fmt='d')
plt.show()
sns.set(style='ticks')
iris = sns.load_dataset('iris')
iris.head(10)
sns.pairplot(iris)
plt.show()
x_var
: x축으로 사용할 컬럼y_var
: y축으로 사용할 컬럼sns.pairplot(
iris, x_vars=['sepal_width','sepal_length'], y_vars=['petal_width', 'petal_length'])
plt.show()
anscombe = sns.load_dataset('anscombe')
anscombe.head()
sns.set_style('darkgrid')
sns.lmplot(x='x', y='y', data=anscombe.query("dataset == 'I'"), ci=None, size=7)
plt.show()
sns.lmplot(
x='x',
y='y',
data=anscombe.query("dataset == 'I'"),
ci=None,
scatter_kws={'s':80},
size=7
)
plt.show()
sns.lmplot(
x='x',
y='y',
data=anscombe.query("dataset == 'II'"),
order=1,
ci=None,
scatter_kws={'s':80},
size=7
)
plt.show()
sns.lmplot(
x='x',
y='y',
data=anscombe.query("dataset == 'II'"),
order=2,
ci=None,
scatter_kws={'s':80},
size=7
)
plt.show()
sns.lmplot(
x='x',
y='y',
data=anscombe.query("dataset == 'III'"),
ci=None,
scatter_kws={'s':80},
size=7
)
plt.show()
sns.lmplot(
x='x',
y='y',
data=anscombe.query("dataset == 'III'"),
robust=True,
ci=None,
scatter_kws={'s':80},
size=7
)
plt.show()
sns.pairplot(crime_anal_norm, vars=['강도','살인','폭력'], kind='reg',size=3);
kind = 'reg'
: 회귀분석 옵션 중 하나로, his, kde,scatter 가 옵션으로 있다.def drawPlot():
sns.pairplot(
crime_anal_norm, x_vars=['인구수','CCTV'], y_vars=['살인','강도'],
kind='reg',
size=4
)
plt.show()
drawPlot()
def drawPlot():
sns.pairplot(
sns.pairplot(
crime_anal_norm,
x_vars=['인구수','CCTV'],
y_vars=['살인검거율','폭력검거율'],
kind='reg',
size=4
)
plt.show()
drawPlot()
def drawPlot():
sns.pairplot(
sns.pairplot(
crime_anal_norm,
x_vars=['인구수','CCTV'],
y_vars=['절도검거율','강도검거율'],
kind='reg',
size=4
)
plt.show()
drawPlot()
def drawGraph():
target_col = ['강간검거율','강도검거율','살인검거율','절도검거율','폭력검거율','범죄']
crime_anal_norm_sort = crime_anal_norm.sort_values(by='검거', ascending=False)
plt.figure(figsize=(10,10))
sns.heatmap(
crime_anal_norm_sort[target_col],
annot=True,
fmt='f',
linewidths='0.5
cmap='RdPu'
)
plt.title('범죄 검거 비율(정규화된 검거의 합으로 정렬)')
plt.show()
drawGraph()
def drawGraph():
target_col = ['강간','강도','살인','절도','폭력','범죄']
crime_anal_norm_sort = crime_anal_norm.sort_values(by='범죄', ascending=False)
plt.figure(figsize=(10,10))
sns.heatmap(
crime_anal_norm_sort[target_col],
annot=True,
fmt='f',
linewidths='0.5
cmap='RdPu'
)
plt.title('범죄비율(정규화된 발생 건수로 정렬)')
plt.show()
drawGraph()
기본적인 명령
Map(location=[위도, 경도]
, Map(location=(위도, 경도)
tiles
: 스타일 설정(OpenStreetMap, Stamen Terrain/Toner/Watercolor, CartoDB positron, CartoDB dark_matter 등)zoom_start
: 줌 설정(0~18)save
: 지도를 html 형식으로 저장Marker
: 지도에 마커 추가popup, tooltip
: 마커 클릭 또는 커서 이동 시 문구 출력(html 문법 사용 가능)icon
: 다양한 모양의 아이콘 지원add_to
: Map을 매개변수로 받아 해당 지도에 마커 추가conda install -c conda-forge folium
import folium
1
m =folium.Map(location=[위도, 경도])
m
m.save('../data/index.html')
2
folium.Map(location=[위도,경도], tiles='Stamen Toner', zoom_start=13)
3
my_map = folium.Map(location=[위도, 경도], zoom_start=12, tiles='Stamen Terrain')
folium.Marker([마커찍고 싶은 위치의 위도, 경도], popup='<i>Mt.Hood Meadows</i>').add_to(my_map)
folium.Marker([마커찍고 싶은 위치의 위도, 경도],popup='<b>Timberline Lodge</b>').add_to(my_map)
my_map
4
m = folium.Map(location=[위도, 경도], zoom_start=12, tiles='Stamen Terrain')
folium.Marker(
location=[마커찍고 싶은 위치의 위도, 경도],
popup='Mt.Hood Meadows',
icon=folium.Icon(icon='cloud'),
).add_to(m)
folium.Marker(
location=[마커찍고 싶은 위치의 위도, 경도],
popup='Timberline Lodge',
icon=folium.Icon(color='green'),
).add_to(m)
folium.Marker(
location=[마커찍고 싶은 위치의 위도, 경도],
popup='한글테스트',
icon=folium.Icon(color='red', icon='info-sign'),
).add_to(m)
icon 옵션
folium.Icon()
으로 매개변수를 받는다.icon
: 아이콘 형태 결정icon_color
: 아이콘 컬러 설정color
: 마커 컬러 설정andgle
: 기울기 설정prefix
: 아이콘에 따라 'fa', 'glyphicon' 사용5
m = folium.Map(location=[위도,경도], tiles='Stamen Toner', zoom_start=13)
folium.Circle(
radius=100,
location=[원 중심 위도,경도],
popup='The Waterfront',
color='crimson',
fill=False,
).add_to(m)
folium.CircleMarker(
location=[위도,경도],
radius=50,
popup='Laurelhurst Park',
color = '#3186cc',
fill=True,
fill_color='#3186cc',
).add_to(m)
ClickForMarker : 지도위에 마우스로 클릭 시 마커 생성
popup
: 마커 클릭 시 문구 출력
Circle 마커
Circle
, CircleMarker
: 동일한 동작, 옵션이지만 radius만 다르게 적용된다.
location
,popup
, tooltip
Marker와 동일
radius
: 원의 반지름
fill
, fill_color
: 원 내부 색상 설정
6
m = folium.Map(location=[위도,경도], tiles='Stamen Terrain', zoom_start=13)
m.add_child(folium.LatLngPopup())
m
LatLngPopup()
: 지도위에 마우스 클릭시 위도, 경도 문구 출력7
m = folium.Map(location=[위도,경도], tiles='OpenStreetMap', zoom_start=13)
m.add_child(folium.ClickForMarker())
folium.Choropleth()
: 색상이나 패턴을 사용하여 특정 통계에 대한 데이터를 사전 정의된 영역과 관련시켜 시각화한 지도 유형geo_data
: 지도 데이터 파일(json 등)data
: Series or DataFrame 형태의 시각화 하고자 하는 데이터columns
: [지도 데이터와 매핑할 값, 시각화하고자 하는 데이터]key_on
: feature.데이터 파일과 매핑할 값fill_color
: 시각화에 쓰일 색상fill_opacity
: 투명도line_opacity
: 투명도legend_name
: 컬러 범주명import json
state_data = pd.read_csv('../data/파일 이름')
m = folium.Map(location=[48, -102], zoom_start=3)
m.choropleth(
geo_data='../data/02.us-states.json'),
data=state_data,
columns=['state','Unemployment'],
key_on='feature.id',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Unemployment Rate (%)',
)
m
import pandas as pd
df = pd.read_csv('../data/02. 서울특별시 동작구_주택유형별 위치 정보 및 세대수 현황_20210825.csv',encoding='euc-kr') # or cp949
df.tail(2)
# Nan 데이터 제거
df = df.dropna()
df.info()
df = df.reset_index(drop=True)
df.tail(2)
del df['연번 ']
# folium
m = folium.Map(
location=[37.50589466533131,126.93450729567374],zoom_start=13
)
for idx,row in df.iterrows():
# location
lat,lng = row.위도, row.경도
# Marker
folium.Marker(
location=[lat,lng],
popup=row.주소,
tooltip=row.분류,
icon=folium.Icon(
icon='home',
color= 'lightred' if row.세대수 >= 199 else 'lightblue',
icon_color='darkred' if row.세대수 >= 199 else 'darkblue',
)
).add_to(m)
# Circle
folium.Circle(
location=[lat,lng],
radius=row.세대수 * 0.2,
fill=True,
color='pink' if row.세대수 >= 518 else 'green',
fill_color='pink' if row.세대수 >= 518 else 'green'
).add_to(m)
m
import json
crime_anal_norm = pd.read_csv('파일이름', index_col=0, encoding='utf-8')
geo_path = '../data/json파일이름'
geo_str = json.load(open(geo_path, encoding='utf-8'))
my_map = folium.Map(location=[위도,경도], zoom_start=11, tiles='Stamen Toner')
my_map.choropleth(
geo_data=geo_str,
data=crime_anal_norm['살인'],
columns = [crime_anal_norm.index, crime_anal_norm['살인']],
fill_color='PuRd',
key_on='feature.id',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 살인 발생 건수',
)
my_map = folium.Map(location=[위도,경도], zoom_start=11, tiles='Stamen Toner')
my_map.choropleth(
geo_data=geo_str,
data=crime_anal_norm['강간'],
columns = [crime_anal_norm.index, crime_anal_norm['강간']],
fill_color='PuRd',
key_on='feature.id',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 강간 발생 건수',
)
my_map = folium.Map(location=[위도,경도], zoom_start=11, tiles='Stamen Toner')
my_map.choropleth(
geo_data=geo_str,
data=crime_anal_norm['범죄'],
columns = [crime_anal_norm.index, crime_anal_norm['범죄']],
fill_color='PuRd',
key_on='feature.id',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 범죄 발생 건수',
)
tmp_criminal = crime_anal_norm['범죄'] / crime_anal_norm['인구수']
my_map = folium.Map(location=[위도,경도], zoom_start=11, tiles='Stamen Toner')
my_map.choropleth(
geo_data=geo_str,
data=tmp_criminal,
columns = [crime_anal_norm.index, tmp_criminal],
fill_color='PuRd',
key_on='feature.id',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='정규화된 범죄 발생 건수',
)
crime_anal_station = pd.read_cdv('파일이름',index_col=0, encoding='utf-8')
col = ['살인검거','강도검거','강간검거','절도검거','폭력검거']
tmp = crime_anal_station[col] / crime_anal_station[col].max() # 정규화
crime_anal_station['검거'] = np.mean(tmp,axis=1) # numpy axis=1 은 행(가로),pandas axis=1은 열(세로)
crime_anal_station.tail()
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)
my_map
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11
)
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
# 경계선 추가
my_map = folium.Map(
location=[37.5502, 126.982],
zoom_start=11
)
# 범죄율 : 지도로 표현
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)
# 검거율 : Circle로 표현
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
crime_loc_raw = pd.read_csv('파일 이름',thousands=',', encoding='euc-kr')
crime_loc_raw.head()
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.head()
col = ['살인','강도','강간','절도','폭력']
crime_loc_norm = crime_loc / crime_loc.max() # 정규화
crime_loc_norm.head()
crime_loc_norm['종합'] = np.mean(crime_loc_norm,axis=1)
crime_loc_norm.head()
crime_loc_norm_sort = crime_loc_norm.sort_values(by='종합',ascending=False)
def drawGraph():
plt.figure(figsize=(10,10))
sns.heatmap(
crime_loc_norm_sort,
annot=True,
fmt='f',
linewidth=0.5,
cmap='RdPu'
)
plt.title('범죄 발생 장소')
plt.show()
drawGraph()