[EDA] 서울시 CCTV 분석 2 - 그래프로 표현하기

박미영·2023년 3월 31일
0

서울시 CCTV 분석

📌데이터 시각화


import matplotlib.pyplot as plt
# import matplotlib as mpl

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

# = %matplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")



📌소계 컬럼 시각화

data_result["소계"].plot(kind="barh", grid=True, figsize=(10, 10));


제일 끝에 ;을 붙여주면 그래프 위 글자를 없애준다.

data_result["소계"].plot(kind="barh", grid=True, figsize=(10, 10))

📍소계 정렬 후 컬럼 시각화

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




📌데이터의 경향 표시

📍인구수와 소계 컬럼으로 scatter plot 그리기

def drawGraph():

    plt.figure(figsize=(14, 10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50) # s=size
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()

drawGraph()



📍Numpy를 이용한 1차 직선 만들기

import numpy as np
def drawGraph():

    plt.figure(figsize=(14, 10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50) # s=size
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw: 굵기
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()

drawGraph()

📍np.polyfit()

직선을 구성하기 위한 계수를 계산


- 두 변수에 대한 직선의 계수
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1

📍np.poly1d()

polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어주는 기능

f1 = np.poly1d(fp1)
f1



  • 인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수는?
f1(400000)



📍np.linspace()

  • 경향선을 그리기 위한 x 데이터 생성
  • np.linspace(a, b, n): a부터 b까지 n개의 등간격 데이터 생성
fx = np.linspace(100000, 700000, 100)




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

📍그래프 다듬기

경향과의 오차 만들기

  • 경향(trend)과의 오차를 만들자
  • 경향은 f1 함수에 해당 인구를 입력
  • f1(data_result["인구수"])



fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1) # 1: 1차원
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100) # 100: 간격
data_result.head(3)



📍경향(trend)과의 오차

data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head(1)



경향과 비교해서 데이터의 오차가 너무 나는 데이터를 계산

df_sort_f = data_result.sort_values(by="오차", ascending=False) # 내림차순
df_sort_t = data_result.sort_values(by="오차", ascending=True) # 오름차순

  • 경향 대비 CCTV를 많이 가진 구
df_sort_f.head()

  • 경향 대비 CCTV를 적게 가진 구
df_sort_t.head()



📍color 커스텀

from matplotlib.colors import ListedColormap

# colormap을 사용자 정의(user define)로 세팅
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = ListedColormap(color_step)
  • colormap 사용 전
def drawGraph():

    plt.figure(figsize=(14, 10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50) # s=size
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw: 굵기
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()

drawGraph()

  • colormap 사용 후
def drawGraph():

    plt.figure(figsize=(14, 10))
    # c: 색을 어떤 데이터 기준으로 구분할 것인가, cmap: 어떤 색을 사용할 것인가
    plt.scatter(data_result["인구수"], data_result["소계"], s=50, c=data_result["오차"], cmap=my_cmap)
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw: 굵기
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.colorbar()
    plt.grid(True)
    plt.show()

drawGraph()



📍상위, 하위 5개 데이터 커스텀

def drawGraph():

    plt.figure(figsize=(14, 10))
    # c: 색을 어떤 데이터 기준으로 구분할 것인가, cmap: 어떤 색을 사용할 것인가
    plt.scatter(data_result["인구수"], data_result["소계"], s=50, c=data_result["오차"], cmap=my_cmap)
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw: 굵기
    
    for n in range(5):
        # 상위 5개
        plt.text(
            df_sort_f["인구수"][n] * 1.02,  # x좌표
            df_sort_f["소계"][n] * 0.98,    # y좌표
            df_sort_f.index[n],             # title - 구이름
            fontsize=15
        )

        # 하위 5개
        plt.text(
            df_sort_t["인구수"][n] * 1.02,  # x좌표
            df_sort_t["소계"][n] * 0.98,    # y좌표
            df_sort_t.index[n],             # title - 구이름
            fontsize=15
        )

    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.colorbar()
    plt.grid(True)
    plt.show()

drawGraph()

📌CCTV_result.csv 저장

# 01. CCTV_result.csv 저장
data_result.to_csv("../data/01. CCTV_result.csv", sep=",", encoding="utf-8")




느낀 점😊

먼가 후다다닥 강의 따라가면서 만든거 같은데 머릿속에 잘 들어왔는지 잘 모르겠다. 그래도 그래프가 그려지고 하는게 신기😍
파이썬 코드 치듯이 얼른 코드를 보지 않고 머릿속으로 생각해서 그려보고 싶다.
언젠가는 그렇게 되겠지!!?


"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글

관련 채용 정보