프로젝트 - 서울시CCTV현황

허재정·2024년 2월 22일

EDA

목록 보기
2/13
post-thumbnail

1. 분석 데이터 불러오기

  • 서울시 구별 CCTV현황 데이터 (.csv)
import pandas as pd
CCTV_Seoul = pd.read_csv("../data/01. Seoul_CCTV.csv")
# 한글이 깨질 경우 : encoding='utf-8' 
  • 컬럼명 변경
CCTV_Seoul.rename(columns={"기관명":"구별"}, inplace=True)

서울시 구별 인구 현황 데이터 (.xls)

popul_seoul = pd.read_excel(
        "../data/01. Seoul_Population.xls", header=2, usecols="B, D, G, J, N" # header는 자료 읽기 시작할 행  컬럼의 '합계'만 가져오기
    )

  • 컬럼명 변경
popul_seoul.rename(
        columns={
            popul_seoul.columns[0]: "구별",
            popul_seoul.columns[1]: "인구수",
            popul_seoul.columns[2]: "한국인",
            popul_seoul.columns[3]: "외국인",
            popul_seoul.columns[4]: "고령자"
        },
        inplace=True
    )

2. 분석 데이터 흝어보기

CCTV 데이터

  • 가장 많은 CCTV를 보유한 구
CCTV_Seoul.sort_values(by='소계', ascending=False).head()

  • '최근증가율' 컬럼 추가
  • 이전에 보유한 CCTV 개수 대비 최근 3년(2014~2016)간 CCTV를 가장 많이 설치한 구는?
CCTV_Seoul["최근증가율"] = (
	(CCTV_Seoul["2014년"] + CCTV_Seoul["2015년"] + CCTV_Seoul["2016년"]) / CCTV_Seoul["2013년도 이전"] * 100
)

CCTV_Seoul.sort_values(by='최근증가율', ascending=False).head()

인구 데이터

  • 첫 행(row[0]의 '합계' 데이터 삭제
  • drop 메서드로 필요없는 행 삭제
popul_seoul.drop([0], inplace=True) popul_seoul.head()

외국인과 고령자 비율 컬럼 추가

  • 데이터 행 25개를 컬럼 연산으로 한번에 연산 가능
popul_seoul["외국인비율"] = popul_seoul["외국인"] / popul_seoul["인구수"] * 100
    popul_seoul["고령자비율"] = popul_seoul["고령자"] / popul_seoul["인구수"] * 100
    popul_seoul.head()

3. 분석 데이터 병합

"구별"로 CCTV 와 인구데이터 병합

merge_data = pd.merge(CCTV_Seoul, popul_seoul, on="구별")

필요없는 연도별 데이터 컬럼 삭제

del merge_data["2013년도 이전"]
    del merge_data["2014년"]
    merge_data.drop(["2015년", "2016년"], axis=1, inplace=True)

Index 지정

  • 시각화 작업을 위해 인덱스를 변경
  • 인덱스로 지정하려면 중복되는 값이 없어야 함
  • set_index() - 인덱스 재정의
 merge_data.set_index("구별", inplace=True)
 merge_data.head()


상관관계(correlation) 파악

  • 두 변량 사이에 한쪽이 증가하면 다른 쪽도 증가 또는 감소하는 경향이 있을 때, 이 두 변량 사이에는 상관관계가 있다고 함
  • 단, 상관관계가 있다하여 두 변량이 인과관계인 것은 아님
  • 데이터의 관계를 찾을 때, 최소한의 근거가 있어야 해당 데이터를 비교하는 의미가 있음
  • 상관계수가 0.2 이상인 데이터를 비교하는 것은 의미가 있음
  • 상관계수 연상을 위해서는 int나 float 자료형이어야 함
merge_data.corr()

  • CCTV 전체 수(소계)와 가장 상관관계가 있는 데이터는 "인구수"(0.232555)
  • 인구대비 CCTV 비율을 새로운 컬럼으로 만듬
merge_data["CCTV비율"] = merge_data["소계"] / merge_data["인구수"] * 100

4. 분석데이터 시각화

pandas에서 plot그리기

  • pandas DataFrame은 데이터 변수에서 바로 plot() 함수를 사용할 수 있음
  • 데이터가 많을 경우 정렬한 후 그리는 것이 효과적일 때가 많음
 merge_data["인구수"].plot(kind="bar", figsize=(10, 6))
    merge_data["인구수"].plot(kind="barh", figsize=(10, 9))

'소계' 및 'CCTV비율' 컬럼 시각화

def drawGraph():
        merge_data["소계"].sort_values().plot(
            kind="barh", grid=True, title="가장 CCTV가 많은 구", figsize=(10, 9)
        )
    drawGraph()
    def drawGraph():
        merge_data["CCTV비율"].sort_values().plot(
            kind="barh", grid=True, title="인구대비 CCTV비율이 가장 높은 구", figsize=(10, 9)
        )
    drawGraph()

데이터의 경향 시각화

  • 인구수와 소계 컬럼으로 산점도(scatter plot) 그리기
 def drawGraph():
        plt.figure(figsize=(14, 10))
        plt.scatter(merge_data["인구수"], merge_data["소계"], s=50)
        plt.xlabel("인구수")
        plt.ylabel("CCTV")
        plt.grid(True)
        plt.show()
        
    drawGraph()

  • numpy 이용해 1차 직선 만들기
    * numpy가 제공하는 함수를 이용해 1차 직선(y=ax+b)을 만들어 그래프로 비교
    • np.polyfit() : 직선을 구성하기 위한 계수
      (기울기와 y절편)를 계산
    • np.poly1d(): polyfit으로 찾은 계수로 파이썬에서 사
      용할 수 있는 함수로 만들어주는 역할
import numpy as np
    
    pf1 = np.polyfit(merge_data["인구수"], merge_data["소계"], 1)
    // array([1.11155868e-03, 1.06515745e+03])
    
    f1 = np.poly1d(pf1)
    // poly1d([1.11155868e-03, 1.06515745e+03])
  • 인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수?
    경향선을 그리기 위한 X 데이터 생성
    np.linspace(a, b, n): a부터 b까지 n개의 등간격 데이터 생성
    ```
    fx = np.linspace(100000, 700000, 100) // 100,000과 700,000 사이에 100개의 수 생성
    def drawGraph():
        plt.figure(figsize=(14, 10))
        plt.scatter(merge_data["인구수"], merge_data["소계"], s=50)
        plt.plot(
    		fx, f1(fx), ls="dashed", lw=3, color="g"
    	)
        plt.xlabel("인구수")
        plt.ylabel("CCTV")
        plt.grid()
        plt.show()
        
    drawGraph()

profile
Data Science 스터디로그

0개의 댓글