[EDA] Chapter 02. 서울시 CCTV 현황 데이터 분석

황성미·2023년 8월 2일
0
post-thumbnail
post-custom-banner

✍🏻 2일 공부 이야기.

👀👀 오늘 공부한 자세한 코드는 아래 깃허브에 올라가있어요!
https://github.com/nabi4442/ZeroBaseDataSchool/blob/main/01.%20Analysis%20Seoul%20CCTV.ipynb



데이터 시각화


CCTV가 가장 많은 구를 시각화해보자.

def drawGraph():
    data_result["CCTV비율"].sort_values().plot(
        kind = "barh", grid = True, figsize = (10,10),
        title ="가장 CCTV가 많은 구")
        #가로 바 형태의 그래프
        #정렬한 데이터프레임을 시각화하여
        #보다 한 눈에 들어오기 쉽게 함.
drawGraph()



전체 경향을 파악해보자.

단순 CCTV 수와 인구대비 CCTV 비율을 볼 때,
CCTV가 많은 구는 강남, 관악, 서초, 성북, 구로 이고
CCTV 비율이 높은 구는 성동, 강남, 종로, 용산, 서초이다.
비율로 데이터를 보아도,
전체 경향과 함께 보지 않으면 데이터를 제대로 이해하기 어려우므로 전체 경향까지 파악해보자.

def drawGraph():
    plt.figure(figsize = (14,10))
    plt.scatter(data_result["인구수"], data_result["총계"], s = 50)
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()
drawGraph()

💡 선형회귀를 추가하여 트렌드 파악하기.

  • np.polyfit : 직선을 구성하기 위한 계수 계산
  • np.poly1d : polyfit으로 찾은 계수로 python에서 사용할 함수로 만들어줌.
import numpy as np

fp1 = np.polyfit(data_result["인구수"], data_result["총계"], 1) # 선형회귀 계수 구함
f1 = np.poly1d(fp1) # 함수 생성
fx = np.linspace(100000, 700000, 100) #x 값 생성
def drawGraph():
    plt.figure(figsize = (14,10))
    plt.scatter(data_result["인구수"], data_result["총계"], s = 50)
    plt.plot(fx, f1(fx), ls = "dashed", lw = 3, color = "g") #경향선 표시(ls : 표시선 종류, lw : 굵기)
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()
drawGraph()



오차를 표시해보자.(경향에 벗어난 데이터 강조하기)

  • 경향과의 오차 만들기(전체 경향 대비 CCTV가 많은/적은 구 확인 가능)
data_result["오차"] = data_result["총계"] - f1(data_result["인구수"]) #실제값 - 예측값 


# 경향과 비교해서 데이터의 오차가 큰 데이터 계산
df_sort_f = data_result.sort_values(by = "오차", ascending = False) #내림차순(경향 대비 CCTV를 많이 가진 순)
df_sort_t = data_result.sort_values(by = "오차", ascending = True) #오름차순(경향 대비 CCTV를 적게 가진 순)

시각화

📌 사용자 정의로 colormap을 만들 수도 있음!

# 색깔 지정
from matplotlib.colors import ListedColormap

# colormap 을 사용자 정의(user define)로 세팅 HEX 색상코드 값.
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = ListedColormap(color_step)

## 이후 그래프를 그리는 코드와 같이
## plt.colorbar()를 해주면 
## 그래프와 함께 색상코드 값을 볼 수 있음

📌 정해진 좌표에 글을 표시할 수 있음!

plt.text(x좌표, y좌표, 들어갈 글, fontsize = 폰트크기값)

위 두 가지 기능을 이용해 경향 대비 CCTV를 많이 가진 구 5개, 적게 가진 구 5개를 표시해보자.
def drawGraph():
    plt.figure(figsize = (14,10))
    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") 
    
    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.colorbar()    
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()
drawGraph()



🙆🏻‍♀️🙆🏻‍♀️ 첫 번째 프로젝트 서울시 인구수 대비 CCTV 현황 파악 끝!! 🙆🏻‍♀️🙆🏻‍♀️
profile
데이터 분석가(가 되고픈) 황성미입니다!
post-custom-banner

0개의 댓글