[제로베이스] 5주차_EDA 04

해오름·2023년 3월 7일
0

[zb]

목록 보기
10/18

📌3/2 ~ 3/6 영상 강의 EDA 범죄1~ 범죄5

데이터 읽기, 정리

  • info( )
    데이터의 전체적인 개요 확인
  • unique( )
    특정 컬럼에서 unique 조사
    nan 값이 들어가 있다


pandas pivot table

  • index, columns, values, aggufunc

예제 1. 판매 현황표 정리

  • 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( ) : 다중 컬럼에서 특정 컬럼 제거

python 모듈 설치


Google Maps API 설치


Python의 반복문

Google Maps를 이용한 데이터 정리

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()

  • 100보다 큰 숫자 찾아서 바꾸기 (100이상의 수치는 100으로 맞춘다)
crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.head()

  • 정규화 : 최고값=1, 최소값=0 , 제일 큰 값으로 나머지 데이터들을 나눠준다
crime_anal_gu["강도"] / crime_anal_gu["강도"].max()

Seabon

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")

예제1. seabon 기초

np.linspace(0, 14, 100) : 0~14까지 100개 만들어줘

  • sns.set_style( )
    "white", "dark", "whitegrid", "darkgrid"

  • despine( ) 그래프 바탕에 격자 표시를 x,y 축에서 띄워준다

예제2. seabon tips data

  • boxplot
  • swarmplot
  • lmplot

1. boxplot

  • boxplot hue, palette option
  • hue : 카테고리 데이터 표현
plt.figure(figsize=(8,6))
sns.boxplot(x="day", y="total_bill", data=tips, hue="smoker", palette="Set3") # set 1 - 3
plt.show()

2. swarmplot

  • color: 0 - 1 사이 검은색부터 흰색 사이 값을 조정 (스팟의 명암 조절)
plt.figure(figsize=(8,6))
sns.swarmplot(x="day", y="total_bill", data=tips, color="0.8")
plt.show()

3. boxplot with swarmplot

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()

4. lmplot : total_bill과 tip 사이 관계 파악

sns.set_style("darkgrid")
sns.lmplot(x="total_bill", y="tip", data=tips, height=7) # size => height 로 옵션명 변경됨
plt.show()

5. implot에서 hue option 사용

sns.set_style("darkgrid")
sns.lmplot(x="total_bill", y="tip", data=tips, height=7, hue="smoker")
plt.show()

예제3. flights

  • heatmap

heatmap, colormap

plt.figure(figsize=(10,8))
sns.heatmap(flights, annot=True, fmt="d", cmap="YlGnBu")
plt.show

 # annot : 네모 안 데이터 값 표시, fmt="d" 정수형 표현

예제4: iris data

  • 다수의 컬럼을 비교하는 pairplot

1. pairplot

sns.set_style("ticks") # 그래프 눈금 표시
sns.pairplot(iris)
plt.show()

2. hue option

sns.pairplot(iris, hue="species")
plt.show()

3. 원하는 컬럼만 pairplot

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

예제5: anscombe data

  • lmplot

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 신뢰구간

1. order option

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

2. outlier

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

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

1. pairplot 강도 , 살인, 폭력에 대한 상관관계 확인

다수의 컬럼을 비교하는 pairplot

sns.pairplot(crime_anal_norm, vars=["살인","강도","폭력"], kind="reg", height=4 )

2. 검거율 heatmap

"검거"컬럼을 기준으로 정렬

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")

folium 지도 시각화

!pip install folium

#window
!pip install charset
!pip install charset-normalizer

#conda
conda install -c conda-forge folium
  • 위도, 경도를 넣어주면 된다
  • 지도를 html로 저장 가능
  • 스타일을 tiles 옵션으로 지정
  • 마커를 추가할 수 있다
  • 다양한 모양의 아이콘 지원

1. 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

2. folium.ClickForMarker

지도위에 마우스로 클릭했을 때 마커를 생성해줍니다

 m = folium.Map(
    location=[37.544577,127.055991],
    zoom_start=15,
    tiles="OpenStreetMap"
)
m.add_child(folium.ClickForMarker(popup="ClickForMarker"))

3. folium.LatLngPopuup()

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

 m = folium.Map(
    location=[37.544577,127.055991],
    zoom_start=15,
    tiles="OpenStreetMap"
)
m.add_child(folium.LatLngPopup())

4. folium.Circle(), folium.CircleMarker()

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

5. folium.Choropleth

지도에 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

6. 아파트 유형 지도 시각화

위에서 배운 방법대로 데이터를 가져와서 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

7. reference

https://nbviewer.org/github/python-visualization/folium/tree/main/examples/
참고하면 좋을 자료들

👍마무리
내 일주일을 삭제해버린 시각화 챕터..
오타로 인한 오류도 많았고 버전이 달라 생긴 오류도 많았다
오류가 생길때마다 의욕이 똑 똑 떨어져서 공부하는데 힘들었고 집중도 잘 안됐던것 같다
파이썬이 집중은 더 잘됐던 기억..
뒤늦게 스터디 노트를 정리했는데 적었을 때 확실히 도움이 되는 것 같아서 앞으로는 빼먹지 않고 쓰도록 해야겠다. 낯선 배움일수록 꼭 노트에 기록하기

profile
study note

0개의 댓글