📌3/2 ~ 3/6 영상 강의 EDA 범죄1~ 범죄5
- info( )
데이터의 전체적인 개요 확인
- unique( )
특정 컬럼에서 unique 조사
nan 값이 들어가 있다
- import openpyxl : xlsx 파일 읽을수있게
- import warnings
warnings.simplefilter("ignore") # 경고문, 안내장 나오지 않게하기
- aggfunc 디폴트가 평균(mean)으로 되어있다
- fill_value=0 : Non 값을 0으로 채워줘
# 2개 이상 index, values 설정
# aggufunc 2개 이상 설정
df.pivot_table(index=["Manager","Rep","Product"],
values=["Price", "Quantity"],
aggfunc=[np.sum, np.mean],
fill_value=0,
margins=True) # 총계(All) 추가
- droplevel( ) : 다중 컬럼에서 특정 컬럼 제거
count = 0
for idx, rows in crime_station.iterrows():
station_name = "서울" + str(idx) + "경찰서"
tmp = gmaps.geocode(station_name, language="ko")
tmp[0].get("formatted_address")
tmp_gu=tmp[0].get("formatted_address")
lat=tmp[0].get("geometry")["location"]["lat"]
lng=tmp[0].get("geometry")["location"]["lng"]
crime_station.loc[idx, "lat"]=lat
crime_station.loc[idx, "lng"]=lng
crime_station.loc[idx, "구별"]=tmp_gu.split()[2]
print(count)
count = count + 1
crime_anal_gu["강도검거"]/crime_anal_gu["강도발생"]
crime_anal_gu[["강도검거", "살인검거"]].div(crime_anal_gu["강도발생"], axis=0).head(3)
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[num].div(crime_anal_gu[den].values).head()
crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.head()
crime_anal_gu["강도"] / crime_anal_gu["강도"].max()
seabon 은 matpiotkub과 함께 실행된다
!conda install -y seaborn
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rc
plt.rcParams["axes.unicode_minus"] = False
rc("font", family="Malgun Gothic")
# %matplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")
np.linspace(0, 14, 100) : 0~14까지 100개 만들어줘
sns.set_style( )
"white", "dark", "whitegrid", "darkgrid"
despine( ) 그래프 바탕에 격자 표시를 x,y 축에서 띄워준다
plt.figure(figsize=(8,6))
sns.boxplot(x="day", y="total_bill", data=tips, hue="smoker", palette="Set3") # set 1 - 3
plt.show()
plt.figure(figsize=(8,6))
sns.swarmplot(x="day", y="total_bill", data=tips, color="0.8")
plt.show()
plt.figure(figsize=(8,6))
sns.boxplot(x="day", y="total_bill", data=tips)
sns.swarmplot(x="day", y="total_bill", data=tips, color="0.25")
plt.show()
sns.set_style("darkgrid")
sns.lmplot(x="total_bill", y="tip", data=tips, height=7) # size => height 로 옵션명 변경됨
plt.show()
sns.set_style("darkgrid")
sns.lmplot(x="total_bill", y="tip", data=tips, height=7, hue="smoker")
plt.show()
plt.figure(figsize=(10,8))
sns.heatmap(flights, annot=True, fmt="d", cmap="YlGnBu")
plt.show
# annot : 네모 안 데이터 값 표시, fmt="d" 정수형 표현
sns.set_style("ticks") # 그래프 눈금 표시
sns.pairplot(iris)
plt.show()
sns.pairplot(iris, hue="species")
plt.show()
sns.pairplot(iris,
x_vars=["sepal_width", "sepal_length"],
y_vars=["petal_width", "petal_length"])
plt.show()
sns.set_style("darkgrid")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), ci=None, height=7, scatter_kws={"s":60})
plt.show
# ci 신뢰구간
sns.set_style("darkgrid")
sns.lmplot(x="x",
y="y",
data=anscombe.query("dataset == 'II'"),
order=2,
ci=None,
height=7,
scatter_kws={"s":60}) # ci 신뢰구간
plt.show
sns.set_style("darkgrid")
sns.lmplot(
x="x",
y="y",
data=anscombe.query("dataset == 'III'"),
robust=True,
ci=None,
height=7,
scatter_kws={"s":60})
plt.show
다수의 컬럼을 비교하는 pairplot
sns.pairplot(crime_anal_norm, vars=["살인","강도","폭력"], kind="reg", height=4 )
"검거"컬럼을 기준으로 정렬
def DrawGraph():
# 데이터 프레임 생성
target_col = ["살인검거율", "강도검거율", "강간검거율", "절도검거율", "폭력검거율","검거"]
crime_anal_norm_sort = crime_anal_norm.sort_values(by="검거", ascending=False)
# 그래프 설정
plt.figure(figsize=(10,10))
sns.heatmap(
data=crime_anal_norm_sort[target_col],
annot=True, # 데이터값 표현
fmt="f", # "d": 정수, "f":실수
linewidths=1, # 박스간 간격 설정
cmap="RdPu"
)
plt.title("범죄 검거 비율(정규화된 검거의 합으로 정렬)")
plt.show
DrawGraph()
- 데이터 저장
crime_anal_norm.to_csv("../data/02. crime_in_Seoul_final.csv", sep=",", encoding="utf-8")
!pip install folium
#window
!pip install charset
!pip install charset-normalizer
#conda
conda install -c conda-forge folium
m = folium.Map(
location=[37.544577,127.055991],
zoom_start=15,
tiles="OpenStreetMap"
)
# icon basic
folium.Marker((37.5470849,127.0476082),
icon=folium.Icon(color="black", icon='info-sign')
).add_to(m)
# icon icon_color
folium.Marker(
location=[37.544577,127.055991],
popup="<b>Subway</b>",
tooltip="icon color",
icon=folium.Icon(
color="red",
icon_color="blue",
icon="cloud"
)
).add_to(m)
# Icon custom
folium.Marker(
location=[37.5406034,127.0687557],
popup="건대입구역",
tooltip="Icon custom",
icon=folium.Icon(
color="purple",
icon_color="white",
icon="heart",
angle=50,
prefix="fa")
).add_to(m)
m
지도위에 마우스로 클릭했을 때 마커를 생성해줍니다
m = folium.Map(
location=[37.544577,127.055991],
zoom_start=15,
tiles="OpenStreetMap"
)
m.add_child(folium.ClickForMarker(popup="ClickForMarker"))
지도를 마우스로 클릭했을 때 위도 경도 정보를 반환해줍니다
m = folium.Map(
location=[37.544577,127.055991],
zoom_start=15,
tiles="OpenStreetMap"
)
m.add_child(folium.LatLngPopup())
m = folium.Map(
location=[37.5506,127.0431],
zoom_start=15,
tiles="OpenStreetMap"
)
# Circle
folium.Circle(
location=[37.5555,127.0441], #한양대학교
radius = 100,
fill=True,
color="#fc7f2b",
fil_color="red",
popup="Circle Popup",
tooltip="Circle Tooltip"
).add_to(m)
# CircleMarker
folium.CircleMarker(
location=[37.5447,127.0397], #서울숲
radius = 100,
fill=True,
color="#4fe3cd",
fil_color="#f533ce",
popup="CircleMarker Popup",
tooltip="CircleMarker Tooltip"
).add_to(m)
m
지도에 colormap 표현
json 파일을 이용해 경계선과 id를 각 지역에 구현
import json
state_data = pd.read_csv("../data/02. US_Unemployment_Oct2012.csv ")
state_data.tail(2)
m = folium.Map([43,-102], zoom_start=3)
folium.Choropleth(
geo_data="../data/02. us-states.json", #경계선 좌표값이 담긴 데이터
data=state_data , # Serise or DataFrame
columns=["State","Unemployment"], # DataFrame columns
key_on="feature.id",
fill_color="BuPu",
fill_opacity=0.6, # 0~1
line_weight=1,
line_opacity=0.5,
legend_name="Unemployment rate (%)"
).add_to(m)
m
위에서 배운 방법대로 데이터를 가져와서 DataFrame 정리 후 시각화 한다
# folium
m = folium.Map(location=[37.5041692,126.9465365], zoom_start=13)
for idx, rows in df.iterrows():
# location
lat,lng = rows.위도, rows.경도,
# Marker
folium.Marker(
location=[lat,lng],
popup=rows.주소,
tooltip=rows.분류,
icon=folium.Icon(
icon="home",
color="lightred" if rows.세대수 >= 199 else "lightblue",
icon_color="darkred" if rows.세대수 >= 199 else "darkblue"
)
).add_to(m)
#CircleMarker
folium.Circle(
location=[lat,lng],
radius=rows.세대수*0.5,
fill=True,
color="pink" if rows.세대수 >= 518 else "green",
fill_color="pink" if rows.세대수 >= 518 else "green"
).add_to(m)
m
https://nbviewer.org/github/python-visualization/folium/tree/main/examples/
참고하면 좋을 자료들
👍마무리
내 일주일을 삭제해버린 시각화 챕터..
오타로 인한 오류도 많았고 버전이 달라 생긴 오류도 많았다
오류가 생길때마다 의욕이 똑 똑 떨어져서 공부하는데 힘들었고 집중도 잘 안됐던것 같다
파이썬이 집중은 더 잘됐던 기억..
뒤늦게 스터디 노트를 정리했는데 적었을 때 확실히 도움이 되는 것 같아서 앞으로는 빼먹지 않고 쓰도록 해야겠다. 낯선 배움일수록 꼭 노트에 기록하기