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

svenskpotatis·2023년 9월 1일
0

📌 데이터의 경향 표시

import numpy as np
np.polyfit: p = polyfit(x, y, n)

  • x는 다항식의 입력값, y는 다항식의 결과값
  • n은 다항식의 차수
  • p는 차수에 따른 다항식의 계수 값

np.poly1d: 다항식 생성 함수

  • 입력 배열을 항으로 간주하여 다항식을 생성
  • np.poly1d(입력 배열, 근 설정, 변수명)

np.linspace: 구간 내에 숫자를 균일한 간격으로 촘촘하게 채울 수 있는 함수.

  • np.linspace(구간 시작점, 구간 끝점, 구간 내 숫자 개수)

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

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()

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

  • Linear Regression, 선형회귀, trend 파악, numpy
  • numpy를 이용한 1차 직선 만들기
    • np.polyfit: 직선을 구성하기 위한 계수 계산
    • np.poly1d: polyfit으로 찾은 계수로 python에서 사용할 함수로 만들어 줌

  • polyfit에서 찾은 계수를 넣어 함수 완성
  • 인구 300000인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수 계산
fx = np.linspace(10000, 70000, 100) 
  • 경향성을 그리기 위한 x 데이터 생성
  • np.linspace(a, b, n): a부터 b까지 n개의 등간격 데이터 생성
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()

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

그래프 다듬기

경향과의 오차 만들기

  • 경향(trend)과의 오차를 만들자
  • 경향은 f2 함수에 해당 연구를 입력
  • f1(data_result['인구수'])
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)
f1 = np.poly1d(fp1)
fx = np.linspace(10000, 70000, 100)
# 오차 column
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)  # 오름차순
  • ListedColormap
from matplotlib.colors import ListedColormap

# colormap 을 사용자 정의(user define)로 세팅
color_step = ['#e74c3c', '#2ecc71', '#95a9a6', '#2ecc71', '#3498db', '#3498db']
my_cmap = ListedColormap(color_step)
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,
            df_sort_t['소계'][n] * 0.98,
            df_sort_t.index[n],
            fontsize=15,
        )
        
    plt.xlabel('인구수')
    plt.ylabel('CCTV')
    plt.colorbar()
    plt.grid(True)
    plt.show()
drawGraph()

  • 결과 저장
data_result.to_csv('../data/01. CCTV_result.csv', sep=',', encoding='utf-8')

0개의 댓글