25. EDA-4

wonny_·2023년 8월 5일
0

EDA

목록 보기
4/10
  • CCTV 데이터와 그래프로 표현하기

    • 한글 설정하기
import matplotlib.pyplot as plot
import matplotlib as mpl
from matplotlib import rc 

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

  • CCTV 비율 기준 그래프 작성
def drawGraph():
    data_result["CCTV비율"].sort_values().plot(
        kind="barh", 
        grid=True, 
        title="가장 CCTV가 많은 구", 
        figsize=(10, 10)
   );


  • 데이터 경향 표시

    • 인구수와 소계 컬럼으로 scatter plot 그리기
def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50)
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid()
    plt.show()
drawGraph()      


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

    • np.polyfit : 직선을 구성하기 위한 계수 계산(numpy에서 데이터를 1차 함수로 표현하고자 할 때 계수를 찾아주는 명령어)
    • np.poly1d1 : polyfit으로 찾은 계수로 python에서 사용할 수 있는 함수로 만들어 줌
import numpy as np

fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1
  • 인구가 40만인 구에서 서울시의 전체 경량에 맞는 적당한 CCTV 수?


  • 데이터의 경향을 직선으로 표현하기

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

    • ls = "dashed" : linestyle 선 스타일 점선
    • lw=3 : 선 굵기
    • color="g" : 선 색 초록
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()
    plt.show()
 drawGraph()      


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

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

데이터 세팅

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

f1 = np.polyld(fp1)
fx = np.linspace(100000, 700000, 100)

오차

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

#경향과 비교해서 데이터의 오차가 너무 나는 데이터 
#경향 대비 CCTV 많이 가진 구 
df_sort_f = data_result.sort_values(by="오차", ascending=False)
#경향 대비 CCTV 적게 가진 구 
df_sort_t = data_result.sort_values(by="오차", ascending=True)


  • 그래프로 나타내기

    • colormap을 사용자 정의로 세팅
from matplotlib.colors import listedColormap
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = listedColormap(color_step)

  • 그래프 그리기

    • plt.text : 글자를 찍는 함수(좌표 주기)
      • x좌표: df_sort_f["인구수"][n] * 1.02
      • y좌표: df_sort_f["소계"][n] * 0.98
    • df_sort_f.index[n] : 넣을 이름
    • fontsize = 15 : 폰트 사이즈
    • s : 마커의 크기
    • c : color 세팅에 방금 계산한 경향과의 오차 적용
    • cmap : 사용자 정의한 맵을 적용
def drawGraph():
    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="dashed", lw=3, color="grey")
    
    for n in range(5):
        plt.text(
            df_sort_f["인구수"][n] * 1.02, 
            df_sort_f["소계"][n] * 0.98,
            df_sort_f.index[n],
            fontsize=15, 
        )
        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.colorbar()
    plt.grid()
    plt.show()


profile
파이팅

0개의 댓글