본문 바로가기

파이썬 & 머신러닝과 딥러닝

9일차 - 서울시 CCTV 현황, 인구현황, 범죄현황을 기반으로 데이터 분석 실습

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#폰트적용
plt.rcParams['font.family'] = 'New Gulim'
plt.rcParams['font.size'] = 14
plt. rcParams['axes.unicode_minus'] = False # '-'나오는 거 설정

 

 

# 데이터 구해오기
1. 서울시 자치구 년도별 CCTV 현황
2. 서울시 주민등록인구 (구별) 현황

 

CCTV.csv
0.00MB
POP.csv
0.00MB

 


 

1번 : CCTV 파일을 열어서 CCTV 데이터 프레임을 만들자

문자열로 인식한 문제

 

 


 

2. POP.csv를 읽어서 POP이라는 데이터프레임을 만들기

POP.csv 읽어오기

 

 

 


 

3. 컬럼 인덱스를 구별, 한국인, 외국인, 고령자, 인구수 로 변경

column 인덱스 변경 모습

 

 


 

4. CCTV 데이터에서 총계로 내림차순 정렬 해보기

내림차순 정렬

 

첫번째 행 NaN을 없앤 모습

 

 


 

 5. CCTV 최근 증가율
(2023 + 2022 + 2021) / 총계 * 100 -> 최근증가율 

 

 


 

6. POP에 외국인비율, 고령자비율을 추가

* 외국인비율 = 외국인/인구수 *100
* 고령자비율 = 고령자/인구수 *100

 


 

7. CCTV 컬럼 인덱스 중에서 구분 -> 구별, 총계 -> CCTV 총계로 바꾸기

 


 

8. CCTV, POP을 구별을 기준으로 병합해서 data_result에 저장

구별을 기준으로 merge 로 병합

 

25개

 

25개
24개뿐

 

띄어쓰기된 '중 구'를 '중구'로 변경 -> 25개 출력

 


 

9. CCTV와 POP을 병합 단, CCTV 컬럼 중에서 CCTV 총계, 최근증가율만 가져와서 병합하기


 

10. data_result에 index를 구별로 설정하자

'강남구' 입력시 관련 정보 잘 출력되는 모습

 


 

상관관계 분석

● 상관관계 계수 : -1 ~ 1

0.1 이하 : 관계없음, 무시

0.3 이하 : 약한 상관 관계

0.7 이하 : 뚜렷한 상관 관계

1.0 이하 : 높은 상관 관계

 

 

고령자 비율, 외국인 비율, 인구수 대비  CCTV 총계 상관관계

-> np.corrcoef() 함수를 통해 상관관계 출력

-> 1은 무시 가능 소숫점 숫자만 보기

 


 

11. CCTV 총계를 내림차순으로 정렬해서 막대그래프로 시각화

-> data_result라는 DataFrame에서 CCTV총계를 sort_values()함수로 정렬 후 plot(kind='bar') 로 막대그래프로 시각화

 

 

인구대비 CCTV 비율

 


 

12. Scatter 그래프를 사용해서 인구수(x축), CCTV총계(y축) 그려보기

 

scatter (산포도) 그래프 : 정보를 x, y 축에 찍는 점의 위치, 크기, 색으로 표현할 수 있다.

 


 

13. 경향선을 추가

 

경향선 : 오차를 적게 해주는 선 

np.polyfit() : 일차방정식의 기울기, y절편 구하기 가능

f1이라는 함수가 만들어졌다. -> 값을 대입해 예측값 구하기 가능

 

인구수가 증가하면 CCTV총계가 증가함을 알 수 있다.

 

-> 경향선으로 인구수 대비 CCTV총계가 연관이 있다는걸 알 수 있다.

 

 

 

size, color 정보 추가

colorbar() : 어떤 색이 값이 높고 낮은지 colorbar을 표현해 알 수 있다.

-> 인구수대비 CCTV가 많은 곳이 원이 크다.

-> 노란색에 가까울수록 외국인 비율이 높다.

 

 


 

14. scatter 그래프의 각 점에 구 이름을 추가해보기

 

-> 경향선의 오차가 1000 이상인 것만 정보를 표시

-> 점이 어떤구에 대한 정보인지 알 수 있다.

 


 

범죄 현황 분석

- 서울시 5대 범죄 발생현황 통계

CRIME.csv
0.00MB

 

 

 

column 이름 변경

 


 

1. 각 범죄마다 검거율을 계산해서 추가하자
(검거/발생) * 100

 

강도가 object로 존재하는 문제

 

강도가 object로 존재하는 문제 해결 -> 0으로 바꾼 후 타입 int로

해결된 모습

 

 

검거율 계산해서 추가한 모습

 


 

2. 각 검거율이 100보다 크면 그 값을 100으로 조정하기

최대 100으로 검거율 조정

 

 


 

3. 각 '검거' 컬럼을 삭제

 


 

4. 컬럼이름에서 '발생'을 제거해보기

예) 살인발생 -> 살인

 

 


 

데이터 정규화 (Normalize)

column 마다 값의 편차가 크면 그걸 줄여주기

 

MinMaxScaler() : 최댓값, 최솟값을 구해서 최소를 0 최대를 1이 되게 바꾸기 (실수 형태만 가능)

from sklearn import preprocessing 선언

5개의 데이터만 선택한 모습

 

다시 행의 인덱스 값 복원해야함

 

column, index 제대로 설정된 모습

 

-> 5대 범죄가 1과 0사이 값으로 만들어지도록 정규화한 결과

 


 

6. CRIME_norm에 CRIME의 각 검거율을 추가하기

각각의 범죄 검거율도 잘 포함된 모습

 


 

7. CRIME_norm에 data_result의 인구수, CCTV총계, 최근증가율, 외국인비율, 고령자비율을 추가

 

 


 

8. 범죄 컬럼을 만들기
* 범죄 : 모든 범죄의 발생 수의 합

 

위 표에서 각 구별로 각각 값들을 더해 줘야함

 

'범죄' 라는 column에 범죄 발생 수의 합이 추가된 모습

 


 

8. 살인검거율 부터 폭력검거율 까지 더해서 '검거'로 만들기

'검거'가 잘 만들어진 모습

 

 


 

Seaborn을 활용한 상관관계분석

import seaborn as sns 선언

 

pairplot() : 두개의 값을 짝을 지어서 상관관계 분석하여 그래프로 그려줌

kind='reg' : 상관관계를 나타내는 경향선 추가

 

-> 7개 항목의 각각의 조합을 출력

 

 

-> CCTV가 많은 곳은 범죄 많이 발생

-> 범죄가 많은 곳에 인구수 많다.

 

 


 

9. 검거의 최대값으로 각 검거값을 나누고 100을 곱해서 다시 검거에 저장

 

가장 큰 값은 1이고 가장 작은 값은 0이 아닌 비율로

Heatmap() : 데이터에 대한 정보를 한 번에 표로 나타내기

 

합이 잘 정렬된 모습

 

 

annot=True : 수치값 적기

fmt='.2f' : 소숫점 두번째 자리까지

 


 

웹데이터 수집

이때까지는 가져온 데이터로 실습했는데 확보하기 힘들어 데이터를 하나하나 입력을 해야하는 경우

그때 사용할 수 있는 방식이 웹스크래핑

웹스크래핑 : 조직적이고 자동화된 방법으로 웹사이트들을 탐색해서 원하는 정보를 획득하기

(웹크롤링이라고 할 수 없음)

 

웹 스크래핑을 위해 필요한 패키지

requests 패키지 - 웹페이지 다운로드

beautifulsoup 패키지 - 웹페이지 구조 분석

pandas 패키지 - 데이터 저장, 처리 및 분석

 

Web이 어떻게 동작?

web은 web server가 필요

각각의 web server에는 홈페이지에 관한 정보를 파일로 갖고 있음 (준비된 상태)

내 pc(client)에 web browser이 있고 주소창에 주소를 쳐서 웹페이지에 가서 원하는 페이지를 요청함 -> request

요청이 정상적이면 웹페이지는 파일을 내 PC에 전달해줌 -> responce

이 과정을 반복

-> 웹페이지의 정보를 스크래핑 하기 위해서는 web서버에서 오는 responce에 있는 파일 분석이 필요

 

주소창에 https://www.naver.com 주소 치고 엔터

: 네이버 서버에 첫번째 페이지를 보고싶다고 request를 보낸 것

 

 

웹페이지 구성 요소

HTML : 웹페이지의 골격 구조 및 콘텐트

CSS : 웹페이지 디자인

JAVA Script : 웹페이지의 동적 동작

 

주요 웹스크래핑 대상

웹페이지에서 주요 데이터 정보를 표현하고 있는 HTML이 웹스크랩핑의 대상이 되는 경우가 대부분

 

HTML(HyperText Markup Language)

웹페이지를 위한 지배적인 마크업 언어, 구조적 문서를 만들 수 있는 방법 제공

  • 하이퍼텍스트 : 서로 연결되어 있는 링크를 통해 읽는 순서가 결정되어 있지 않는 형태로 한 문서에서 다른 문서로 접근할 수 있는 텍스트
  • 마크업 언어 : 태그(문서의 구조를 표현하는 역할)를 이용해 문서와 데이터의 구조를 표시하는 언어

 

HTML 기본 구조

- 가장 기본 구조

<html> 태그를 사용해 <html> 과 </html> 사이의 모든 텍스트가 HTML 이라고 선언됨

(태그는 대소문자 구분 x)

 

- HTML은 크게 두 부분 head와 body로 구분됨

  • head : 타이틀이나, 메타데이터등의 웹페이지 자체 정보를 담고 있음
  • body : 주요 웹페이지 컨텐트를 담고 있음, 주요 크롤링 대상

<HTML> <HEAD> </HEAD> <BODY> </BODY> <HTML>

 

 

주요 HTML 태그

<P> : 본문 태그, 문단 태그

<BP> : 줄바꾸기

<HR> : 수평줄삽입

<A> : 하이퍼링크 태그 <a href="http://www.yu.ac.kr"> 영남대학교 </a>

<UL>, <LI> : 글머리 기호 목록 생성, 목록 요소 생성

<OL>,<LI> : 순서 번호 목록 생성, 목록 요소 생성 

<DIV> : 공간 분할 태그

 

 

위치에 따른 Tag 관계

  • Parent : 다른 태그를 포함하고 있는 태그 
  • Child : 다른 태그 내부에 있는 태그
  • Sibling

 

HTML Tag의 ID, Class 속성

  • 웹 브라우저 화면에는 변화가 없음
  • HTML 각 태그에 특별한 속성이 ID 와 CLASS 속성을 부여할 수 있다.
  • CSS 등에서 특정 태그를 지칭하기 위해 주로 활용됨
  • 웹스크래핑에도 특정 태그를 지칭하기 위해 자주 활용됨
  • ID : 중복될 수 없음

 


 

웹페이지 다운로드

requests 패키지 : 다양한 형태의 request를 웹서버에 보내 웹페이지를 다운로드한다.

get, post, put, delete 를 할 수 있다.

r = request.get("http://www.yu.ac.kr")

 

다운로드 성공 여부 확인

status_code 속성으로 확인 가능

 

요청 후 다운로드 상태 확인

항상 정상적으로 웹 요청이 끝나고 난 후 다음 단계로 진행해야한다.

 


 

웹스크래핑 기초 실습

영문으로 나온 모습

 

접속한 페이지가

영문을 사용한 웹브라우저에서 접속하면 영문으로 나오고

한글을 사용한 웹브라우저에서 접속하면 한글로 나오는 페이지임

-> /index.do 가 붙은 한글페이지로 url 수정하여 한글페이지에 직접 접근

 

한글로 request 응답 받음

 

 

BeautifulSoup 사용해보기

text를 html구조에 맞춰서 파싱 -> beutifulsoup 사용

from bs4 import BeautifulSoup 선언

 

 

soup이 root이고 자식들 출력해보기

 

html코드만 저장

 

p태그 검색

 

p태그 중에서 mini-title만 찾기