Numpy, polyfit과 poly1d

I'm Cape·2023년 5월 21일
0

제로베이스 데이터 취업 스쿨 3주차 스터디노트 7호

Polynomial

이게 뭔데? 라고 물으신다면, 다항식이라고 합니다.
그래서 그게 뭔데? 라고 물으신다면, 저도 몰라요. 이거 뭐야... 무서워...

수업 코드에서는 np.polyfitnp.poly1d를 사용하고 있다.
이 method들을 사용하면 수포자도 쉽게 경향성을 파악할 수 있다.

각설하고, 사용해보자.
다음의 데이터를 사용한다.

import numpy as np

population = merged["인구수"]
cctv_num = merged["소계"]

coeffs = np.polyfit(population, cctv_num, 1)
poly_func = np.poly1d(coeffs)
  • np.polyfit()
    주어진 데이터를 설명해주는 다항식을 생성해내고, cofficient를 반환한다.
    (무엇을 반환하는가? 공식 문서: Returns polynomial coefficients, highest power first.)

  • np.poly1d()
    다항식 함수를 반환한다. x에 값을 넣으면, 다항식으로 계산된 결과가 출력된다.

예를 들어,

x2+2x+3x^2 + 2x + 3

이 다항식을 갖고 싶다면 다음처럼 사용하면 된다.

poly_func = np.poly1d([1, 2, 3])

그리고 앞의 다항식에 3을 넣었을 때 결과값을 알고 싶다면?
poly_func(3)을 출력하면 된다.
이걸 생각하면 np.polyfit이 어떤 값을 반환하는지도 알게 된다.

현재 활용중인 dataframe이 담긴 변수명은 merged이다.
인구와 CCTV 개수의 관계를 알고 싶으니,

population = merged["인구수"]
cctv_num = merged["소계"]
# deg=1은 1차 함수로 coefficient를 반환해달라는 말인듯
coeffs = np.polyfit(population, cctv_num, deg=1)

coeffs를 출력해보면 다음과 같다.

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

즉, 인구를 x축으로 하고 CCTV를 y값으로 하는
1차 함수는 다음과 같다.

y=1.11155868x+1.06515745y = 1.11155868x + 1.06515745

poly_func = np.poly1d(coeffs)

경향에 따르면, 인구수가 20만인 곳은 CCTV 개수가 얼마나 될까?
이것이 궁금하다면, 다음과 같이 한다.

poly_func(200000)

공식문서: np.polyfit, np.poly1d 별로임

numpy 공식문서 찾아보니 polynomial 모듈이 업데이트 되었고,
가능하면 np.polyfit이나 np.poly1d는 쓰지 말라고 한다.
(numpy.polynomialPolynomial 객체 신규 생성됨)

As noted above, the poly1d class and associated functions defined in numpy.lib.polynomial, such as numpy.polyfit and numpy.poly, are considered legacy and should not be used in new code. Since NumPy version 1.4, the numpy.polynomial package is preferred for working with polynomials.

직접 보고싶다면 >>> 링크

바뀐 객체를 사용해서 코딩해보자

from numpy.polynomial import Polynomial

population = merged["인구수"]
cctv_num = merged["소계"]

# 비교적 편하긴 하다
poly_func = Polynomial.fit(population, cctv_num, 1)

그 외, 작은 정보

np.linspacenp.arrange의 차이는 무엇일까?
np.linspace는 범위 내 값들의 간격을 설정해줄 수 있고,
np.arrange는 범위 내 값들의 개수를 설정해줄 수 있다.

profile
Impact

0개의 댓글