웹 크롤링/파이썬 프로그래밍-1(서울시 범죄현황)

한영석·2022년 8월 21일
0

Project2(Analysis Seoul Crime)

  • 기사로 많이 나오는 강남3구가 범죄로부터 안전하다고 말할 수 있는지 한번 확인해 보자.

    • GoogleMaps, Folium, Seaborn, Pandas의 Pivot_table등을 익혀보자.

데이터 얻기

  • 구글 검색창에서 '서울시 관서별 5대 범죄 현황'을 검색하여 포털에 접속

  • 포털에 접속하여 '서울시 관서별 5대 범죄 현황' 파일을 다운로드 하기(2016년도 CSV 파일로 다운받기)


데이터 읽기

데이터 확인하고 초기 정리하기

  • 필요한 모듈 import
    • numpy와 pandas

  • 숫자값들이 콤마(,)를 사용하고 있어서 문자로 인식될 수 있다.

  • 천단위 구분 (thousands=',') 이라고 알려주면 콤마를 제거하고 숫자형으로 읽는다.

  • info() 명령으로 데이터 확인하기

    • RangeIndex가 65534개 인데 데이터들이 310개로 표기되는데 확인해보자.
  • 특정 컬럼에서 unique조사

    • nan이 들어있다..
  • '죄종'에서 NaN만 추출하여 보자.

    • 황당하게도 실제 데이터(엑셀에서 읽을 때는 정상이지만)그 후 엄청 많은 nan데이터가 보이는데 이는 index가 65535의 크기를 가지게 되면서 실제 value와의 크기 차이가 발생했기 때문이다.
    • 이럴때는 nan을 제거하는 것이 아니라 nan이 아닌 데이터만 다시 가져오자 (이 상황은 연도별로 다르게 나온다.)
  • NaN을 정리하기전엔 하나의 데이터 크기가 2MB였지만 정리한 후 12.1Kb로 정리된걸 확인할 수 있다.


Pandas pivot_table

  • 간단한 현황표 불러오기

  • Name을 인덱스로 두고 재정렬

  • 인덱스를 여러개를 두고 재정렬 가능

  • 원하는 values를 지정할 수 있음.

  • values에 함수를 적용할 수 있다.

    • 디폴트는 평균
    • 합산 등의 다른 함수를 적용할 때는 aggfunc 옵션을 지정
  • 갯수도 적용(len) 가능

  • 분류를 지정(columns)할 수 있음.

    • 없는 데이터는 NaN으로 처리되어 정렬됨.
  • Nan에 대한 처리 가능

    • fill_value=0 이란 옵션으로 처리할 수 있음.
  • 합계를 지정


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

  • 경찰서 이름을 index로 하도록 정리하자

    • defaul가 평균(mean)이므로 사건의 합을 기록하기 위해 aggfunc 옵션에 sum을 사용하는 것에 주의

  • 깔끔하게 정리된 모습

    • 그러나 이렇게 정리된 데이터의 경우 column이 multi로 잡힌다는 것이다.
  • Multi Columns Index

    • pivot_table을 적용하면 column이나 index가 다중으로 잡힌다.

  • Multi Index에 대한 접근(조회 방법)

  • 다중 컬럼에서 특정 컬럼 제거(droplevel())

    • 제거 후 조회
  • 현재 index는 경찰서 이름으로 되어있다.

    • 경찰서 이름으로 구이름을 알아보자.

Python 모듈 설치하기

  • pip 명령

    • Python의 공식 모듈 관리자
    • pip list : 현재 설치된 모듈 리스트 반환
    • pip install module_name : 모듈 설치
    • pip uninstall module_name : 설치된 모듈 제거
  • 설치 예시

    • !pip list 와 get_ipython().system("pip list")를 사용할 수 있다.
    • pip list는 설치되어 있는 모듈의 목록을 불러오는 것.
  • conda명령

    • pip를 사용하면 conda 환경에서 dependency 관리가 정확하지 않을 수 있어 아나콘다에서는 가급적 conda 명령으로 모듈을 관리하는 것이 좋다.
    • conda list : 설치된 모듈 리스트
    • conda install module_name : 모듈 설치
    • conda uninstall module_name : 모듈 제거
    • conda install -c channel_name module_name : 지정된 배포 채널에서 모듈 설치
    • 모든 모듈이 conda로 설치되는 것이 아니기때문에 설치가능한 방법으로 설치해야한다.

Google Maps API 설치

  1. 구글 검색창에 'conda install googlemaps'검색하기
  2. Googlemaps :: Anaconda.org 포털에 들어가기
  3. Googlemaps 설치하기

  • Google Map API Key 발급 - 구글 클라우드 결제 계정 만들기





  • 키제한으로 Geocoding이 안나올경우 사용자 인증정보란 위쪽에 라이브러리로 접속하여 Geocoding API 사용 설정하신후 다시돌아가서 차례대로 진행하여 Geocoding으로 제한하여 발급된 키를 googlemaps에서 사용하면된다.

  • 터미널에서 googlemaps 패키지 설치

    • ds_study 환경 활성화
    • conda install -c conda-forge googlemaps
  • 설치 후 import하여 사용해보기


Python의 반복문

  • For - loop

    • 모든 언어에는 다 반복문이 있다.
    • 저의 모국어인 MATLAB의 반복문
    • C/C++의 반복문
  • Python의 반복문은?

    • MATLAB은 반복이든, 조건이든, 함수이든 end로 끝나게 해서 구분하고 C/C++은 중괄호로 구문의 시작과 끝을 구분한다.
    • 지난시간에 잠시 경험했지만, Python은 들여쓰기(intent)로 구분한다.
for n in [1,2,3,4]:
	# 들여쓰기로 코드를 작성
    # 들여쓰기가 적용되는곳 까지가 
    # for문 그리고 
# 들여쓰기를 중단하면 for문이 아니다.
  • 예제

  • Pandas에 잘 맞춰진 반복문용 명령 iterrows()


Google Maps를 이용한 데이터 정리

  • 경찰서의 위경도 정보를 가져오기위해 Google Maps를 사용하여 데이터를 정리해보자.

  • 구글맵 import

  • 구글맵 API 단순 테스트

  • 구글맵 API에서 데이터 얻기

    • 전체 결과 크기가 1인 list형이라서 tmp[0]로 접근
    • 큰 리스트 안에 dict형이다
    • dict형에서 데이터를 얻는 get명령을 사용
  • 전체 주소에서 필요한 구이름만 가져오기

  • 경찰서 이름에서 소속된 구이름 얻기

    • 구이름과 위경도 정보를 저장할 준비
    • 반복문을 이용해서 위 표의 NaN을 모두 채우자

  • crime_station에서 index(idx)와 나머지(rows)를 받아서 반복문을 수행

    • tmp[0].get("formatted_address") 이 부분은 없어도 상관없음.
  • station_name : 구글 검색을 용이하게 하기 위해 검색어를 가급적 상세하게 잡아줌

    • 앞서 수행한 formatted_address에서 구이름을 잡는 과정은 그대로 사용
  • loc옵션을 사용

    • 행(idx)과 열('lat', 'lng', '구별')을 지정해서 구글 검색에서 얻은 정보를 기록
  • 기록후 .head()로 출력해보면

  • 좀 더 깔끔하게 컬럼명을 정리하여 다듬어보자.

    • 예를 들어 강도검거, 강도발생 등등

구별 데이터 생성

  • 데이터 읽기
    • 중간 중간 데이터를 파일로 저장해두면 테스트 코드가 긴 경우 중간부터 다시 시작할 수 있다.

  • pivot_table을 이용해서 구별로 정리하자
    • pivot_table의 func을 sum으로 잡자
    • 필요없는 컬럼은 제거(del, drop)

  • 검거율 생성하기
    • 하나의 컬럼을 다른 컬럼으로 나눈 방법

  • 다수의 컬럼을 다수의 컬럼으로 각각 나눌 수 있다.

  • 각각의 죄종으로 검거율을 생성하여 재생성하기

  • 재생성된 데이터 확인하기

  • 필요없는 컬럼은 지우기(del)

  • 문제점 발생
    • 작년 발생 범죄도 검거에 포함되다보니 단순계산상으로는 검거율이 100이 넘을 수 있음.
    • 아직 그런 디테일까지 목표가아니기에 강제로 100이상의 수치는 100으로 만든다.

  • 100보다 큰 숫자를 찾아서 변경하기

    • Pandas의 버전과 dependency에 따라 위 코드에서 문제가 발생할 경우 아래의 코드를 적용하면된다( 개별로 각각 설정하기..)
  • 컬럼명을 심플하게 변경하기


범죄 데이터 정렬을 위한 데이터 정리

  • 범죄의 경중에 따라 데이터를 정리해 보자.

  • 정규화

    • 본래의 DataFrame은 두고, 정규화된 데이터를 따로 만들자
    • 최고값을 1로 두고, 최소값을 0으로 만들자
  • 정규화된 데이터에 기존의 검거율 데이터를 추가하기

  • 구별 CCTV 자료에서 인구수와 CCTV 수를 가져오자
    (데이터 정리완료하기)

  • 정규화된 범죄발생 건수 전체의 평균을 구해서 범죄의 대표값으로 사용하자

  • 완성된 데이터


Seaborn

  • seaborn은 matplotlib와 함께 실행된다.

  • seaborn은 import하는 것만으로도 효과를 준다.

    • white 스타일
      • 테두리가 변한다.
    • dark 스타일
    • whitegrid 스타일
    • despine 적용
  • seaborn에는 실습용 데이터가 몇개 내장되어 있다.

    • 이 중 하나 tips를 불러보자.
  • boxplot을 그려보자

  • boxplot에 컬럼을 지정

  • 컬럼을 지정하고 구분을 지을 수 있다.

    • 구분하기위한 옵션으로 hue라는 옵션을 적용 (카테고리 데이터 확인)
    • 색상을 적용하기위한 옵션으로 palette 옵션을 적용
  • swarmplot

  • boxplot과 swarmplot의 콜라보

  • total bill과 tip 사이의 관계 파악

  • implot에서 hue 옵션을 사용

  • 또 다른 데이터인 flights를 불러와 테스트 해보자.

    • flights(어떤 항공사의 이력 정보)
  • pivot 옵션을 사용할 수도 있다.

  • heatmap을 이용하면 전체 경향을 알 수 있다.

  • colormap을 다르게 적용 가능

    • cmap 옵션으로 색상 적용 가능
  • 주로 머신러닝에서 사용하는 iris(꽃의 데이터)정보도 있다.

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

  • pairplot에서도 hue 옵션 적용 가능

  • 원하는 컬러만을 pairplot에 적용 시킬수있음.


서울시 범죄현황 시각화하기

데이터 시각화

  • 데이터 확인

  • pairplot으로 강도, 살인, 폭력에 대한 상관관계를 확인하기

  • 인구수, CCTV와 살인, 강도와의 관계도 알아보자

  • 인구수, CCTV와 살인/폭력 검거율의 관계

  • 인구수, CCTV와 절도/강도 검거율

  • 검거율만 가지고 heatmap 생성

    • 단, 검거를 기준으로 정렬

  • 범죄발생 건수로 heatmap 생성

    • 대표값인 범죄를 기준으로 정렬

  • 정리된 데이터 저장하기

지도 시각화 - Folium

  • Folium 지도 시각화

    • 지도시각화 도구는 많지만 현재 사용의 편의성이나 활발한 기능 개선등으로 Folium이 만족도가 높은 편
    • conda install -c conda-forge folium
    • folium은 기본적으로 크롬에서 동작이 가장 좋음
  • 근본적으로는 그냥 위경도의 좌표를 알려준다

  • 지도를 html로 저장 가능

  • 스타일을 tiles 옵션으로 지정

  • 지도에 마커를 추가할 수 있다.

  • 다양한 모양의 아이콘을 지원하여 마커를 찍을 수 있다.

  • Circle 마커

  • 클릭으로 위경도 정보를 반활할 수 있다

  • 지도에 colormap 표현

    • json 파일을 이용해서 경계선과 id를 각 지역에 구현
  • CSV 파일에 이에 매친되는 id와 값을 가지도록 함.



서울시 구별 범죄현황 지도 시각화

  • 지도 시각화에 필요한 json 파일을 구해야한다.

  • 오래된 데이터라 한계는 있지만 서울을 대상으로 하는 것에는 문제가 없다.

  • Lucy Park님의 자료에서 서울 부분만 추린 데이터

  • 범죄율에 대한 지도 시각화

  • 성범죄 발생 건수

  • 5대 범죄 발생 건수

  • 인구수 대비 범죄 발생 건수

  • 경찰서별 정보를 가지고 범죄발생과 함께 정리

  • 경찰서 위치를 지도에 표시

  • 검거에 적절한 값을 곱해서 원의 넓이로 사용

  • 구별 범죄 현황과 경찰서별 검거율을 함께 표시


서울시 범죄 현황 발생 장소 분석(추가검증)

  • 강남의 번죄 발상이 많은 것은 혹시 유흥업소의 밀집과 관련이 있지는 않은지 확인을 위해 최초 받았던 발생 장소별 데이터를 읽어보자.
  • 불러온 데이터 분류하기
  • 장소를 인덱스로 정렬하기
  • 범죄율의 평균 구하기
  • 전체 범죄율('종합')의 평균 구하기
  • '종합'을 기준으로 정렬하기

profile
코딩공부중

0개의 댓글