[ZeroBase]서울 CCTV 분석(feat. 기초) [1일]

sdubee10·2021년 10월 20일
0

데이터분석

목록 보기
2/2

1. 데이터 개요:

  • 서울 각 구의 인구에 따른 CCTV 개수를 분석해보자!

🕶️서울 CCTV 데이터 (CCTV_Seoul)


👨‍👩‍👧‍👦서울 인구현황 데이터 (pop_Seoul)


1. 데이터 추가

  • 서울 인구 현황 데이터에 외국인 비율과 고령자비율을 계산하여 추가
pop_Seoul["외국인비율"] = pop_Seoul["외국인"]/pop_Seoul["인구수"]*100
pop_Seoul["고령자비율"] = pop_Seoul["고령자"]/pop_Seoul["인구수"]*100
pop_Seoul.head()

2. 데이터 Merge

서울 CCTV 데이터와 서울 인구현황 데이터 Merge

(*주의 Merge하는 기준 column 이름 동일하게 할 것)

data_result = pd.merge(CCTV_Seoul, pop_Seoul, on="구별")

3. 불필요한 데이터 컬럼 삭제

모든 년도 데이터는 불필요하다 판단하여 삭제

#컬럼 삭제 방법 두가지 : del, drop()
del data_result["2013년도 이전"]
data_result.drop(["2014년", "2015년", "2016년"], axis =1, inplace=True)

#index를 "구별" 기준으로 변경한 후 저장:
data_result.set_index("구별", inplace=True)

4. 'CCTV 비율' 계산하여 추가

각 구마다 인구 대비 별 몇대의 CCTV가 설치되어 있는지 확인

data_result["CCTV비율"]= data_result["소계"]/data_result["인구수"] * 100

#CCTV비율이 높은 상위 5개 구
data_result= data_result.sort_values(by="CCTV비율", ascending=True).head()

#CCTV비율이 낮은 하위 5개 구
data_result= data_result.sort_values(by="CCTV비율", ascending=False).head()

CCTV비율이 높은 상위 5개 구:

CCTV비율이 낮은 하위 5개 구:


2. 시각화

- Bar 그래프 표현

가장 CCTV가 많은 구:

import matplotlib.pyplot as plt
from matplotlib import rc

plt.rcParams["axes.unicode_minus"] = False #마이너스 부호 때문에 한글이 깨질 수 있어서 주는 설정
rc("font", family="Arial Unicode MS") # Windows: Malgun Gothic
%matplotlib inline 

def drawGraph():
    data_result["소계"].sort_values().plot(
        kind="barh", 
        title="가장 CCTV가 많은 구", 
        grid=True, 
        figsize=(10, 10)
    );
drawGraph()

가장 CCTV비율이 높은 구

def drawGraph():
	data_result["CCTV비율"].sort_values().plot(
		kind = "barh",
		title = "가장 CCTV비율이 높은 구",
		grid = True,
		figsize = (10, 10)
);

drawGraph()


데이터의 경향 표시

  • scatter pot을 활용하여 인구수 대비 CCTV의 대략적인 분포를 확인하자
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.show()

Numpy를 이용한 1차 직선 생성

  • np.polyfit() : 직선을 구현하기 위한 계수를 계산
  • np.poly1d() : polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어 주는 기능
import numpy as np

# 1차원 계수 계산
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)

# 생성된 1차원에 계수 적용
f1 = np.poly1d(fp1)

# linearly spaced : 어느 위치(100000)에서 어느 위치(700000)까지 어느 정도의 간격(100)으로 포인트를 찍은 것인지
fx = np.linspace(100000, 700000, 100)/

# 그래프 그릴 크기 설정
plt.figure(figsize=(14, 10))

# .scatter(가로에 들어갈 데이터, 새로에 들어갈 데이터, scatter plot point size)
plt.scatter(data_result["인구수"], data_result["소계"], s=50)

# .plot(시작 위치, 계수가 적용된 1차함수, 라인 스타일, 라인 색)
plt.plot(fx, f1(fx), ls="--", lw=3, color="g")
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()


강조하고 싶은 데이터 시각화

  1. 1차 함수 생성
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)

fx = np.linspace(100000,700000, 100)
  1. 오차 계산
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head(2)
  1. 데이터 정렬
# 경향과 비교해서 데이터의 오차가 너무 나는 데이터
df_sort_f = data_result.sort_values(by="오차", ascending=False) #내림차순
df_sort_t = data_result.sort_values(by="오차", ascending=True) #오름차순
  1. 시각화
from matplotlib.colors import ListedColormap

color_step = ["#140511", "#002afc", "#a8fc00", "#fcbd00", "#fc7200", "#fc0000"]
my_cmap = ListedColormap(color_step)

plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], c=data_result["오차"], s = 50, cmap=my_cmap)
plt.plot(fx, f1(fx), ls="--", lw = 3, color = "g")

############

####
for n in range(5):
    #상위 5개
    plt.text(
        df_sort_f["인구수"][n] * 1.02,
        df_sort_f["소계"][n] * 0.98,
        df_sort_f.index[n],
        fontsize=15
    )
    
    #하위 5개
    plt.text(
        df_sort_t["인구수"][n] * 1.02,
        df_sort_t["소계"][n] * 0.98,
        df_sort_t.index[n],
        fontsize=15
    )
    
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid=True
plt.colorbar()
plt.show()

0개의 댓글

관련 채용 정보