[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개의 댓글