[5주차] EDA

xktm-woonge·2023년 6월 1일
post-thumbnail

matplotlib 기초

기본 형태

plt.figure(figsize=(10, 6))
plt.plot()
plt.show()

한글 설정

import matplotlib.pyplot as plt
# import matplotlib as mpl
from matplotlib import rc
plt.rcParams['axes.unicode_minus'] = False # 마이너스 부호 때문에 한글이 깨질 수 있어 주는 설정
plt.rc('font', family = "Malgun Gothic")
get_ipython().run_line_magic('matplotlib', 'inline')

그래프 기초

삼각함수 그리기

  • np.arange(a, b, s) : a부터 b까지 s의 간격
  • np.sin(value)
import numpy as np

t = np.arange(0, 12, 0.01)
y = np.sin(t)

plt.figure(figsize=(10, 6))
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.show()

  • 격자무늬 추가 (gird)
  • 그래프 제목 (title)
  • x, y 축 제목 추가 (xlabel, ylabel)
  • 주황색,파란색 선 데이터 의미 구분(legend)
def drawGraph():
    plt.figure(figsize=(10, 6))
    plt.plot(t, np.sin(t)) # label 추가
    plt.plot(t, np.cos(t))
    plt.grid(True) #격자무늬추가
    plt.legend(labels =['sin', 'cos']) # 범례 추가
    plt.title("Example of sinwave") # 그래프 제목
    plt.xlabel('time') # 축 이름 추가
    plt.ylabel('amplitude') #진폭
    plt.show()
    
drawGraph()

그래프 커스텀

line chart

t = np.arange(0, 5, 0.5)

plt.figure(figsize=(10,6))
plt.plot(t,t, 'r--')
plt.plot(t,t ** 2, 'bs')
plt.plot(t,t ** 3, 'g^')
plt.show()

t = list(range(0, 7))
y = [1, 4, 5, 8, 9, 5, 3]

plt.figure(figsize=(10, 6))
plt.plot(
    t,
    y,
    color = 'green',
    linestyle='dashed',
    marker='o',
    markerfacecolor='blue',
    markersize=15
)
plt.grid(True)
plt.xlim([-0.5, 6.5])
plt.ylim([0.5, 9.5])
plt.show()

scatter plot

t = np.array(range(0, 10))
y = np.array([4, 5,3,2,1,5 ,6,7,4,8])

plt.figure(figsize=(10,6))
plt.scatter(t, y)
plt.grid(True)
plt.show()

t = np.array(range(0, 10))
y = np.array([4, 5,3,2,1,5 ,6,7,4,8])

colormap = t

plt.figure(figsize=(10,6))
plt.scatter(t, y, s=50, c=colormap, marker='>')
plt.colorbar()
plt.grid(True)
plt.show()

Pandas 에서 plot 그리기

matplotlib을 가져와서 사용

data_result['인구수'].plot(kind='bar', figsize=(10, 10))

data_result['인구수'].plot(kind='barh', figsize=(10, 10))

data_result['소계'].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('소계')
    plt.show()
drawGraph()

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

  • np.polyfit() : 직선을 구성하기 위한 계수를 계산
  • np.poly1d() : polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어 주는 기능
def drawGraph():
    plt.figure(figsize=(14, 10))
    plt.scatter(data_result['인구수'], data_result['소계'], s=50)
    plt.grid(True)
    plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
    plt.xlabel('인구수')
    plt.ylabel('소계')
    plt.show()
drawGraph()

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

경향과의 오차 만들기

  • 경향(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['소계'] - f1(data_result['인구수'])

data_result.head()

경향과 비교해서 데이터의 오차가 너무 큰 데이터

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

시각화

from matplotlib.colors import ListedColormap

# colormap을 사용자 정의(user define)로 설정
color_step = ['#e74c3c', '#2ecc71', '#95a7a6', '#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')
    # 상위 5개
    for i in range(5):
        plt.text(df_sort_f['인구수'][i] * 1.02, df_sort_f['소계'][i] * 0.98,df_sort_f.index[i], fontsize= 15)
        plt.text(df_sort_t['인구수'][i] * 1.02, df_sort_t['소계'][i] * 0.98,df_sort_t.index[i], fontsize= 15)
    plt.grid(True)
    plt.colorbar()
    plt.xlabel('인구수')
    plt.ylabel('소계')
    plt.show()
drawGraph()

profile
끄적끄적..

0개의 댓글