-
[2월 1주차-2/5(2)]서울시 구별 CCTV 현황 분석하기 📊Why Not SW CAMP 5기/수업 기록 2025. 2. 5. 17:51
1. 프로젝트 개요
강남 3구(강남구, 서초구, 송파구)의 주민들이 자신의 구가 가장 안전하다고 생각한다는 기사를 접한 후, 실제 서울시 각 구별 CCTV 현황과 인구 대비 CCTV 비율을 분석해보는 프로젝트를 진행했습니다. 이를 통해 데이터 기반으로 체감 안전도와 실제 CCTV 설치 현황 간의 관계를 탐색하고, 시각화하여 보다 명확한 결론을 도출하고자 합니다.
🔗 관련 기사: 국감브리핑 - 강남 3구 체감 안전도
2. 분석 목표
✅ 서울시 각 구별 CCTV 개수 파악
✅ 인구 대비 CCTV 비율 분석 및 순위 비교
✅ 평균치를 기준으로 CCTV 부족 지역 식별
✅ 데이터 시각화를 통해 경향 분석
3. 데이터 준비 및 전처리
1) 필요한 라이브러리 설치 및 불러오기
우선, 데이터 분석을 위해 Pandas, Numpy, Matplotlib 라이브러리를 사용합니다.
# Anaconda Prompt에서 실행 (엑셀 파일을 읽기 위한 xlrd 설치) conda install -c anaconda xlrd
# 데이터 분석 및 시각화 관련 라이브러리 불러오기 import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager, rc import platform
2) 서울시 CCTV 데이터 불러오기
서울시의 각 구별 CCTV 개수를 담고 있는 데이터를 불러옵니다.
CCTV_seoul = pd.read_csv("cctv_data/data1/01. CCTV_in_Seoul.csv", encoding='utf-8')
데이터를 확인하면 컬럼명이 다음과 같습니다.
CCTV_seoul.columns # 결과: ['기관명', '소계', '2013년도 이전', '2014년', '2015년', '2016년']
분석을 위해 "기관명" 컬럼명을 **"구별"**로 변경합니다.
CCTV_seoul.rename(columns={CCTV_seoul.columns[0]: '구별'}, inplace=True)
3) 서울시 인구 데이터 불러오기
서울시 각 구의 인구수를 포함한 데이터를 불러옵니다.
pop_seoul = pd.read_excel('cctv_data/data1/01. population_in_Seoul.xls', header=2, usecols="B,D,G,J,N")
각 컬럼의 의미를 명확히 하기 위해 이름을 변경합니다.
pop_seoul.rename(columns={'자치구': '구별', '계': '인구수', '계.1': '한국인', '계.2': '외국인', '65세이상고령자': '고령자'}, inplace=True)
이제 불필요한 합계 행과 결측치를 제거해 데이터 정리 작업을 완료합니다.
pop_seoul.drop([0], inplace=True) # 합계 행 삭제 pop_seoul.dropna(inplace=True) # 결측치 제거
4) CCTV 증가율 추가
각 구별 2013년도 이전과 이후의 CCTV 증가율을 계산하여 추가합니다.
CCTV_seoul['최근증가율'] = (CCTV_seoul['2014년'] + CCTV_seoul['2015년'] + CCTV_seoul['2016년']) / CCTV_seoul['2013년도 이전'] * 100
증가율이 높은 상위 5개 구를 확인하면 다음과 같습니다.
CCTV_seoul.sort_values(by='최근증가율', ascending=False).head()
4. CCTV 데이터와 인구 데이터 병합
이제 두 데이터를 구별을 기준으로 병합하여 분석을 진행합니다.
data_result = pd.merge(CCTV_seoul, pop_seoul, on='구별')
불필요한 컬럼을 제거하고, 새로운 컬럼 **"CCTV비율"**을 추가하여 인구 대비 CCTV 개수를 계산합니다.
data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100
5. matplotlib를 이용한 CCTV와 인구현황 시각화 📈
데이터 분석 후, 효과적인 인사이트를 얻기 위해 시각화를 진행합니다.
1) 한글 깨짐 방지를 위한 폰트 설정
먼저, 운영체제에 따라 한글 폰트 설정을 해줍니다. Windows에서는 Malgun Gothic(맑은 고딕), Mac에서는 AppleGothic을 사용합니다.
plt.rcParams['axes.unicode_minus'] = False # 마이너스 폰트 깨짐 방지 if platform.system() == 'Darwin': # Mac rc('font', family='AppleGothic') elif platform.system() == 'Windows': # Windows path = 'c:/Windows/Fonts/malgun.ttf' font_name = font_manager.FontProperties(fname=path).get_name() rc('font', family=font_name) else: print("sorry")
2) 구별 CCTV 설치 현황 시각화
CCTV 개수를 기준으로 정렬 후, 각 구별 CCTV 현황을 막대 그래프로 나타냅니다.
plt.figure(figsize=(10, 10)) data_result['소계'].sort_values().plot(kind='barh', grid=True) plt.xlabel('CCTV 개수') plt.ylabel('서울시 구별') plt.title('서울시 구별 CCTV 설치 현황') plt.show()
결과 분석:
- 강남구, 서초구, 양천구 등의 CCTV 개수가 많습니다.
- 도봉구, 마포구등의 CCTV 개수는 상대적으로 적습니다.
3) 인구 대비 CCTV 비율 시각화
단순 CCTV 개수보다 인구 대비 CCTV 비율이 더 중요한 기준이 될 수 있습니다.
이를 계산하여 정렬한 후 시각화합니다.data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100 plt.figure(figsize=(10, 10)) data_result['CCTV비율'].sort_values().plot(kind='barh', grid=True) plt.xlabel('인구 대비 CCTV 비율 (%)') plt.ylabel('서울시 구별') plt.title('서울시 구별 인구 대비 CCTV 비율') plt.show()
결과 분석:
- 단순히 CCTV 개수가 많은 구가 아니라, 인구 대비 CCTV 비율이 높은 구를 확인할 수 있습니다.
- 일부 지역은 인구 대비 CCTV 비율이 낮아, 추가 설치가 필요할 가능성이 있습니다.
7. CCTV 개수와 인구수의 관계 분석
인구수가 많을수록 CCTV가 많이 설치되어야 합리적일 것입니다. 이를 확인하기 위해 산점도(scatter plot)를 그려봅니다.
plt.figure(figsize=(6, 6)) plt.scatter(data_result['인구수'], data_result['소계'], s=50) plt.xlabel('인구수') plt.ylabel('CCTV 개수') plt.grid() plt.title('서울시 인구수와 CCTV 개수의 관계') plt.show()
1) 선형 회귀 분석 (Linear Regression)
CCTV 개수와 인구수의 관계를 더 잘 파악하기 위해 선형 회귀 분석을 적용하여 **추세선(Regression Line)**을 추가합니다.
# 선형 회귀 모델 fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1) f1 = np.poly1d(fp1) fx = np.linspace(100000, 700000, 100) plt.figure(figsize=(10, 10)) plt.scatter(data_result['인구수'], data_result['소계'], s=50) plt.plot(fx, f1(fx), ls='dashed', lw=3, color='r') # 추세선 추가 plt.xlabel('인구수') plt.ylabel('CCTV 개수') plt.grid() plt.title('서울시 인구수와 CCTV 개수의 관계 (선형 회귀)') plt.show()
결과 분석:
- 인구수와 CCTV 개수 사이에는 어느 정도의 양의 상관관계가 있습니다.
- 하지만, 일부 구는 예상보다 더 많은 CCTV를 가지고 있고, 일부 구는 적은 CCTV를 보유하고 있습니다.
8. 서울시에서 CCTV 설치가 부족한 구 분석
위의 분석에서 기대되는 CCTV 개수와 실제 설치된 개수 사이의 차이(오차) 를 계산하여, CCTV가 부족한 구를 분석합니다.
# 오차 계산 (예상 CCTV 개수 - 실제 CCTV 개수) data_result['오차'] = np.abs(data_result['소계'] - f1(data_result['인구수'])) # 오차가 큰 순으로 정렬 df_sort = data_result.sort_values(by='오차', ascending=False) # 시각화 plt.figure(figsize=(14, 10)) plt.scatter(df_sort['인구수'], df_sort['소계'], c=data_result['오차'], s=50) plt.plot(fx, f1(fx), ls='dashed', lw=3, color='r') # 추세선 추가 # 오차가 큰 10개 구의 이름을 그래프에 표시 for n in range(10): plt.text(df_sort['인구수'][n] * 1.02, # x 좌표 df_sort['소계'][n] * 0.98, # y 좌표 df_sort.index[n], # 구 이름 fontsize=15) plt.xlabel('인구수') plt.ylabel('CCTV 개수') plt.colorbar() # 오차 크기 표현 plt.grid() plt.title('서울시 인구수 대비 CCTV 개수의 차이 (오차 분석)') plt.show()
결과 분석:
- 강남구, 서초구, 용산구 등은 인구 대비 CCTV 개수가 많아, 상대적으로 CCTV가 잘 설치된 구입니다.
- 반면, 강서구, 송파구 등은 인구 대비 CCTV 개수가 적어 추가 설치가 필요한 구로 볼 수 있습니다.
9. 최종 결론
이번 분석을 통해, 다음과 같은 결론을 도출할 수 있었습니다.
✅ 강남 3구(강남, 서초, 송파)의 체감 안전도가 높은 이유
- 단순히 강남구만 CCTV가 많은 것이 아니라, 서초구와 용산구도 인구 대비 CCTV 개수가 많습니다.
- 따라서 강남 3구 전체가 다른 구보다 CCTV 설치율이 높아 체감 안전도가 높은 것으로 해석할 수 있습니다.
✅ CCTV가 부족한 지역
- 강서구, 송파구, 구로구 등은 인구 대비 CCTV 개수가 적습니다.
- 이 지역들은 추가적인 CCTV 설치가 필요할 가능성이 있습니다.
✅ 인구와 CCTV 개수의 관계
- 인구가 많을수록 CCTV 개수도 증가하는 경향이 있지만, 일부 구는 기대보다 많거나 적은 CCTV를 보유하고 있습니다.
- 특히, 강남구, 서초구는 예측보다 많은 CCTV가 있고, 강서구, 송파구는 부족합니다.
이번 분석을 통해 데이터 기반으로 보다 객관적인 시각에서 서울시 CCTV 설치 현황을 확인할 수 있었습니다.
향후 추가적인 데이터(범죄율, 민원 데이터 등)를 활용하면 더욱 정밀한 분석이 가능할 것입니다. 🚀'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[2월 1주차-2/6(2)]🎂 내 생일의 기온 변화를 시각화하기 (0) 2025.02.06 [2월 1주차-2/6(1)]📊 Python 데이터 시각화 & CSV 데이터 처리 정리 (0) 2025.02.06 [2월 1주차-2/5(1)]Pandas 기초: 데이터 분석을 위한 필수 라이브러리 (0) 2025.02.05 [2월 1주차-2/4]📌 파이썬: 함수, 모듈, 클래스 정리 (0) 2025.02.04 [2월 1주차-2/3]Spyder에서 파이썬 실습 정리 🐍 (1) 2025.02.03