EDA - CCTV 2 : 데이터 취업 스쿨 스터디 노트 11/27

slocat·2023년 11월 27일
0

start-data

목록 보기
25/75

3. 그래프 그리기

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html

data_result["소계"].plot(kind="barh", grid=True, figsize=(10, 10));
def drawGraph():
    data_result["소계"].sort_values().plot(
        kind="barh", grid=True, figsize=(10, 10));
drawGraph()

세미콜론을 붙이지 않으면 <Axes: xlabel='구별'> 표시가 그래프 상단에 나타난다.

4. 경향(trend) 파악하기

scatter 그리기

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

데이터의 경향을 직선으로 표현하기(선형 회귀)

https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html
https://numpy.org/doc/stable/reference/generated/numpy.poly1d.html

✔ np.polyfit()

직선을 구성하는 계수를 계산해주는 기능
인구수를 x축으로 CCTV 개수를 y축으로 하는 1차식을 표현하기 위한 계수

# np.polyfit(x좌표, y좌표, 차수)
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1

>>>
array([1.11155868e-03, 1.06515745e+03])

✔ np.poly1d()

polyfit으로 찾은 계수로 함수를 만들어준다.

f1 = np.poly1d(fp1)
f1

>>>
poly1d([1.11155868e-03, 1.06515745e+03])
print(f1)

>>>
0.001112 x + 1065

인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수는?

# 0.001112 x + 1065 식의 x 값에 400000를 대입한 결과를 반환
f1(400000)

>>>
1509.7809252413333

plot 추가하기

✔ np.linspace()

경향선을 그리기 위한 x 데이터 생성

# np.linspace(a, b, n) : a부터 b까지 n개의 등간격 데이터 생성
fx = np.linspace(100000, 700000, 100)

plt.plot 추가

def drawGraph():
    ...
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw=굵기
    ...

drawGraph()

5. 경향에서 벗어난 데이터 강조하기

오차 만들기

오차 = 실제 값 - 예측 값

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 = ["#a83232", "#a86532", ... ]
my_cmap = ListedColormap(color_step)

그래프에 데이터의 이름 찍기

plt.text(x좌표, y좌표, 이름)
plt.text(
	df_sort_f["인구수"][0] * 1.02,
	df_sort_f["소계"][0] * 0.98,
    df_sort_f.index[0],
    fontsize=15)

상위 5개, 하위 5개씩 표시하기 위해 for 반복문 사용

# 상위 5개
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
    )

✨matplotlib 기초

공식 문서를 확인하는 게 가장 좋다.
https://matplotlib.org/stable/gallery/index.html

그래프의 결과가 중요한 경우 그래프 그리는 코드를 함수로 작성한다.
그러면 나중에 별도의 셀에 그림만 나타낼 수 있다.

기본형

import matplotlib.pyplot as plt
# get_ipython().run_line_magic("Matplotlib", "inline")
%matplotlib inline

from matplotlib import rc
rc("font", family='Malgun Gothic')
# figure로 열어서 show로 닫는다
plt.figure(figsize=(10, 6))
plt.plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 2, 3, 4, 2, 3, 5, -1, 3])
plt.show()

❗Error

...\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font.

➡ 현재 글꼴에 마이너스 기호가 없어서 발생
➡ 하이픈 마이너스 기호를 사용하지 않겠다고 설정

plt.rcParams['axes.unicode_minus'] = False

삼각함수 그리기

import numpy as np

# np.arange(a, b, s): a부터 b까지의 s 간격
t = np.arange(0, 12, 0.01)
y = np.sin(t)	# sin(0), sin(0.01), ...
def drawGraph():
	plt.figure(figsize=(10, 6))
	plt.plot(t, np.sin(t), label="sin")
	plt.plot(t, np.cos(t), label="cos")
	plt.grid(True)  # 그리드 표시
	plt.legend(loc="upper right")  # 범례 표시
	#plt.legend(label=["sin", "cos"])  # 범례 표시2
	plt.xlabel("time")
	plt.ylabel("amplitude")
	plt.title("Example of sinwave")
	plt.show()

drawGraph()

그래프 커스텀

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

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

drawGraph()

다양한 스타일 지정하기

t = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]

def drawGraph():
	plt.figure(figsize=(10, 6))
	plt.plot(t, y, color="green", linestyle="dashed",
    	marker="o", markerfacecolor="blue", markersize=12)
    plt.xlim([-0.5, 6.5])	# X축의 범위 지정
    plt.ylim([0.5, 9.5])	# Y축의 범위 지정
	plt.show()

drawGraph()

점을 뿌리듯이 그리기

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

def drawGraph():
	plt.figure(figsize=(10, 6))
	plt.scatter(t, y)
	plt.show()

drawGraph()

colormap 적용하기

t = np.array(range(0, 10))
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
colormap = t

def drawGraph():
	plt.figure(figsize=(10, 6))
	plt.scatter(t, y, s=50, c=colormap, marker=">")
	plt.colorbar()
    plt.show()

drawGraph()

0개의 댓글