23.01.30 ~ 31

박무연·2023년 1월 30일
0

🟣EDA

목록 보기
2/9
post-thumbnail

1. 프로젝트 개요

- 실제 강남3구가 범죄로부터 안전한가?

- GoogleMaps, Folium, Seaborn, PivotTable 할습

2. 데이터 개요

- thousands

df = pd.read_csv('path', thousands=',', encoding='euc-kr') 
  • thousands 숫자값을 문자로 인식 할 수 있어서 설정 why? 세자리마다 콤마(,)로 구분되어 있어

- unique를 사용하여 nan 값

  • 특정 column의 value 값 중 nan 이 있는지 확인할 때, unique()를 사용해도 된다

- isnull(), notnull()

  • 결측치가 아닌 것만 사용하고 싶을때, drop 하지 않고 notnull()로 지정하여 변수처리 해도 된다

3. 서울시 범죄 현황 데이터 정리

- 다중 컬럼

  • pivot_table을 활용해 columns를 죄종, 발생검거 지정
  • 다중 컬럼이 발생하여 없애 줘야함
crime_station.columns = crime_station.columns.droplevel([0,1]) 
crime_station.columns

5. Google Maps API

- 구글맵 불러오기

gmaps = googlemaps.Client(key = gmaps_key)
temp = gmaps.geocode('위치 지정!', language = 'ko')

6. 맵에서 필요한 정보 찾기

- 필요한것

  • 경찰서 이름으로 구 이름 알아내야 한다(formatted_address)
  • 위도 경도 정보(geometry)
  • 현재 gmaps는 하나의 리스트 안에 있다.
temp[0].get('formatted_address')['location']['lat']
  • 아무튼 잘 찾아 가야한다~~
  • iterrows()를 사용해 추가
for idx, row in crime_station.iterrows():
    #print(type(idx))
    station_name = '서울' + idx + '경찰서'
    print(station_name)
    temp = gmaps.geocode(station_name, language='ko')
    #print(temp)
    temp[0].get('formatted_address')
    temp_gu = temp[0].get('formatted_address').split() # 찾아야될거.있는위치
    
    lat = temp[0].get('geometry')['location']['lat']
    lng = temp[0].get('geometry')['location']['lng']
    
    crime_station.loc[idx,'lat'] = lat
    crime_station.loc[idx,'lng'] = lng
    
    if len(temp_gu) >=3:
        crime_station.loc[idx,'구별'] = temp_gu[2]
    else:
        print(f'이상한 것 : {idx}')
        continue
crime_station
    

- 멀티컬럼 지우기

  • 멀티컬림 하나식 접근
crime_station.columns.get_level_values(0)
  • list for문으로 합쳐주기
tmp = [
	crime_station.columns.get_level_values(0))[n] 
    + crime_station.columns.get_level_values(1)[n]
	for n in range(0, len(crime_station.columns.get_level_values(0))
]

7. 구별 데이터 정리

- 데이터를 읽어올 때, 특정 컬럼 인덱스 지정

crime_anal_station = pd.read_csv(
    '../data/02. my_crime_in_Seoul_raw.csv', index_col=0, encoding='utf-8'
) 
  • index_col 인덱스 컬럼 설정하기 위한 옵션

- 다수의 컬럼을 다른 컬럼으로 나누기

crime_anal_gu[['강도검거','살인검거']].div(crime_anal_gu['강도발생'], axis = 0).head()

- 다수의 컬럼을 다수의 컬럼으로 각각 나누기

num = ['강간검거', '강도검거', '살인검거','절도검거','폭력검거']
den = ['강간발생', '강도발생', '살인발생','절도발생','폭력발생']

crime_anal_gu[num].div(crime_anal_gu[den].values)

crime_anal_gu[num] / crime_anal_gu[den].values

8. 데이터 정리

- MinMaxScaler()

  • column / column.max()

9. 시각화

- pairplot

def drawGraph():
    sns.pairplot(
        data=crime_anal_norm,
        x_vars=['인구수','CCTV'], 
        y_vars=['살인','강도'],     
        kind='reg',
        height=4
        )
    plt.show()

drawGraph()
  • x_vars를 이용해 원하는 x를 가져와 사용할 수 있다.
  • y_vars를 이용해 원하는 y를 가져와 사용할 수 있다.
  • kind : 그래프 종류
  • height : 크기

10 범죄 현황에 대한 지도 시각화

e.g)

# 5대 범죄 검거 건수 지도 시각화

my_map = folium.Map(
    location =[37.5502,126.982],
    zoom_start = 11,
    tiles = 'Stamen Toner'
)

folium.Choropleth(
    geo_data = geo_str,
    data = crime_anal_norm,
    columns=[crime_anal_norm.index, '검거'],
    key_on = 'feature.id',
    fill_color = 'PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='정규화된 범죄 발생 건수'
).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, '범죄'],
    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

11. 서울시 범죄 현황 발생 장소 분석

- 인덱스 : 장소, 컬럼 : 범죄명

- 데이터 정규화

- 정규화값의 평균을 대표값 사용

- 결과를 heatmap

crime_loc_norm_sort = crime_loc_norm.sort_values('총합', ascending=False)

def drawGraph():
    plt.figure(figsize=(10,10))
    sns.heatmap(
        crime_loc_norm_sort,
        annot = True,
        fmt = 'f',
        linewidths=0.5,
        cmap='RdPu'
    )
    plt.title('범죄발생장소')
    plt.show()

drawGraph()
profile
Easy day!

0개의 댓글