[EDA] 01. 서울시 CCTV 현황 분석 15~20

쩡이·2023년 8월 2일

EDA

목록 보기
3/12

keyword
데이터 경향 표시, 강조하고 싶은 데이터 시각화

6. 데이터의 경향 표시

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

  • np.polyfit(): 직선을 구하기 위한 계수 계산
  • np.poly1d(): polyfit으로 찾은 계수를 파이썬에서 사용할 수 있는 함수로 만들어주는 기능
  • np.linspace(a, b, n) : 경향선을 그리기 위한 X 값을 생성하는 기능
    a부터 b까지 n개의 등간격 x값에 해당하는 데이터 생성
import numpy as np
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)
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")
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()

drawGraph()

인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수는? 아래 그래프에서 답을 찾을 수 있다


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

경향과의 오차 만들기

  • 경향(trend)과의 오차를 만든다
  • 경향은 f1 함수에 해당 인구를 입력
    -> f1(data_result["인구수"])
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)
fx = np.linspace(100000,700000,100)

#data_result에 오차 컬럼이 추가됨
data_result["오차"] = data_result["소계"]-f1(data_result["인구수"])

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

#경향 대비 CCTV를 많이 가진 5개 구
df_sort_f.head()
#경향대비 CCTV를 적게 가진 5개 구
df_sort_t.head()

#오차를 기준으로 구를 색깔로 나타내서 시각화

from matplotlib.colors import ListedColormap

#colormap을 사용자 정의(user define)로 세팅
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3489db"]

my_cmap = ListedColormap(color_step)


#시각화된 그래프 그리기
def drawGraph():
    
    plt.figure(figsize=(14,10)) #그래프 사이즈
    plt.scatter(data_result["인구수"], #x축
    data_result["소계"], #y축
    s=50, #표식 사이즈 
    c=data_result["오차"], #컬러바가 오차에 따라 범위가 설정돼서, 각 구에 맞는 색깔이 들어감
    cmap=my_cmap) #컬러바의 색깔 사용자화 한 것
    plt.plot(fx,f1(fx), ls="dashed", lw=3, color="g") # 경향선 그리기(x축, y축, ls:선종류, lw:선 두께, color) 
    
    #오차가 상위5개 하위5개 구에만 알 수 있도록 표식에 이름 붙이기
    for n in range(5):
        #상위 5개
        plt.text(
            df_sort_f["인구수"][n] * 1.02, #x좌표, 표식과 이름이 겹쳐서 출력되지 않도록 1.02곱해줌
            df_sort_f["소계"][n] * 0.98,   #y좌표
            df_sort_f.index[n],   #title
            fontsize=15
        )
        
        #하위 5개
        plt.text(
            df_sort_t["인구수"][n] * 1.02,
            df_sort_t["소계"][n] * 0.98,
            df_sort_f.index[n],
            fontsize=15
        )
    plt.xlabel("인구수") #x축 범례
    plt.ylabel("CCTV") #y축 범례
    plt.colorbar() #컬러바 그리기
    plt.grid(True)  #격자표시
    plt.show()

drawGraph()

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기