Colab
- Colab 들어가는 법 : 구글 로그인 -> 구글 드라이브 -> 새로 만들기 -> Colab 선택
- 다음 코드는 코랩에서 실행된 코드입니다.
! pip install numpy
import numpy as np
arr = np.array([1,2,3,4])
print(arr)
print(type(arr))
arr2 = np.array([[1,2,3,4],[5,6,7,8]])
print(arr2)
print(type(arr)) # <class 'numpy.ndarray'>
arr2.shape # 빠르게 데이터 구조를 파악할 때 사용. (2, 4) = 2 * 4의 크기를 갖는 array
# 기본적으로 numpy에서 연산을 할 때는 크기가 서로 동일한 array끼리 연산.
# 이 때, 같은 위치에 있는 요소들 끼리 연산이 진행.
# 자원 갯수 확인
arr.ndim # 3
# 전체 데이터 갯수를 빠르게 확인
arr.size # 24
arr.dtype # dtype('int64')
arr.itemsize # 8
np.linspace(0, 4, 5) # array(0., 1., 2., 3., 4.]) # 0~4까지 5개의 값을 채워줘
np linspace(0, 100, 20) # 0~100까지 20개의 원소를 채워줘 (원소는 실수형이 기본이다)
np.zeros((3, 3)) # 3x3의 zero 행렬을 만들어줘
np.ones((3, 2, 4)) # 3x2x4의 1 행렬을 만들어줘
np.full((3,3), 3) # 3x3의 행렬을 3으로 채워줘
a1 = np.array([1,2,3,4,5])
print(a1)
print(type(a1))
print(a1.shape)
print(a1[0], a1[1], a1[2], a1[3], a1[4])
a1[0] = 4
a1[1] = 5
a1[2] = 6
print(a1)
a2 = np.array([ [1,2,3], [4,5,6], [7,8,9] ]) # 2차원행렬. 3x3
a2.shape # (3, 3)
print(a2[0,0], a2[1,1] a2[2,2]) # 1 5 9
a3 = np.array([ [ [1,2,3], [4,5,6], [7,8,9] ],
[ [1,2,3], [4,5,6], [7,8,9] ],
[ [1,2,3], [4,5,6], [7,8,9] ] ])
a3.shape # (3, 3, 3)
###
# eye(): 단위행렬(identity matrix) 생성
np.eye(2) # [ [1, 0]. [0,1] ]
np.empty(10) # array([ 쓰레기 값들])
np.zeros_like(a1) # a1의 shape을 이용해서 0행렬을 만들어라
np.full_like(a1, 10) # a1의 shape을 이용해서 10을 채운 행렬을 만들어라
np.random.random((3,3)) # 실수로 3x3 행렬을 채워라
np.random.randint(0, 10, (3, 3)) # 0~10 사이의 정수로 3x3 행렬을 채워라
# 정규분포를 고려한 랜덤한 수의 배열 생성
# 평균 = 0, 표준편차 = 1 인 3 x 3의 배열
np.random.normal(0, 1, (3, 3))
# 균등분포를 고려한 랜덤한 수의 배열 생성
np.random.rand(3,3)
# 표준 정규분포를 고려한 랜덤한 수의 배열 생성
np.random.randn(3,3)
np.ones((3,3), dtype=bool) # 1로 가득찬 3x3배열을 생성하는데 이것을 bool타입으로 원소를 변환하여 넣는다.
date = np.array('2023-01-01', dtype=np.datetime64)
date # array('2023-01-01', dtype='datetime64[D]')
date + np.arange(50) # array(['2023-01-01', '2023-01-02', ...])
###
a1 # [4 5 6 4 5]
b1 = [False, True, True, False, True]
print(a1[b1]) # [5 6 5] # True인 index만 출력
b1 = np.insert(a1, 1, 10) # a1 배열에 첫번째 인덱스에 10을 추가해라.
b1 # array([4, 10, 5, 6, 4, 5])
Numpy와 Type속성
넘파이 배열의 속성
- shape : 배열의 형태(모양)를 튜블(Tuple) 자료형으로 표현
- ndim : 몇 차원의 배열인지 나타냄(축의 개수)
- size : 원소(element, 요소)의 개수를 나타냄
- type : 배열원소의 자료형을 나타냄, 넘파이 배열의 모든 원소는 같은 자료형
- itemsize : 배열원소의 크기를 바이트 단위로 표시
배열의 속성
다양한 차원의 데이터를 쉽게 생성
- np.linspace(0, 100, 20)
- np.zeros(shape) : 0으로 구성된 N차원 배열 생성
- np.ones(shape) : 1로 구성된 N차원 배열 생성
- np.empty(shape) : 초기화되지 않은 N차원 배열 생성
- np.full(shape) : 주어진 값으로 채워진 새로운 배열
- np.tril(shape) : 허삼각행렬(Lower triangular matrix)을 반환
- np.eye(shape) : 단위행렬 생성
- np.full_like(shape) : 주어진 Array의 형태와 타입을 갖는, 주어진 값으로 채워진 새로운 배열
- np.linspace(shape) : 지정한 구간을 균일한 간격으로 나누는 숫자들을 반환
- np.randomrandom(shape) : [0, 1) 사이의 범위에서 균일한분포를 갖는 난수를 주어진 형태로 반환
- Np.random.randint(shape) : 주어진 범위에서 임의의 정수를 반환
Numpy에서 날짜와 시간
넘파이에서 날짜와 시간은 datetime64 객체로 표현한다. 기존 파이썬의 datetime.datetime과 넘파이의
?
datetime.datetime은 시간을 마이크로초(10-6)단위까지 관리하며, 넘파이의 datetime64는 아토초(1
?
1. 문자열 형식으로 전달해서 생성
import numpy as np
np.datetime64('2020-01-01')
2. 유닉스 시간을 이용하는 방법
import numpy as np
np.datetime64([1000, 'ns') #나노초
np.datetime64(10000, 'D') #일
np.datetime64(1000000, 's') #초
3. array()함수를 사용하는 방법
np.array()함수에 첫번째 인자로 str타입의 날짜 리스트를 넣고, 두번째 인자로 dtype을 datetime64로 한다.
- dtype에서 datetime64를 넣어줄 때, 뒤의 []안에 어떤 값을 넣는지에 따라 날짜 단위 지정 가능
import numpy as np
np.array(['2020-01-01', '2000-01-01'], dtype='datetime64')
np.array(['2020-01-01', '2000-01-01'], dtype='datetime64[Y]')
np.array(['2020-01-01', '2000-01-01'], dtype='datetime64[s]')
np.arange('2005-05', '2006-02', dtype='datetime64[M]') # 2005-05부터 2006-02까지 월단위로 배열 생성
단위 코드
Y : 년
M : 월
W : 주
D : 일
h : 시간
m : 분
s : 초
ms : 밀리초
us : 마이크로초
ns : 나노초
ps : 피코초
fs : 펨토초
as : 아토초
np.datetime64('2022-01-01', 's')
Matplotlib
Matplotlib란
- 파이썬에서 가장 널리 사용되는 시각화 라이브러리
- 2차원 선 그래프(plot), 산점도(scatter plot), 히스토그램(Histogram)등의 데이터 분석 시각화에 많이 사용되는 MATLAB 형태의 그래프Matplotlib 특징
- 표준 플롯을 쉽게 그릴 수 있을 뿐 아니라 복잡한 플롯과 세부적인 변경도 자유롭다.
- Matplotlib은 Numpy나 Pandas에서 사용되는 자료 구조 (ndrary, DataFram 등)를 쉽게 시각화
기본 그래프 그리기
matplotlib.pyplot 모듈
- matplotlib.pyplot 모듈은 주로 plt라는 별칭으로 사용
- plot() 함수
- 선 그래프
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(0, 10)**2
plt.plot(y)
plt.show()
- 나눔 한글 폰트 설치하고 런타임 재시작하기
!sudo apt-get install -y fonts-nanum !sudo fc-cache -fv !rm ~/.cache/matplotlib -rf
### plot() 함수
- 수치 데이터를 설정하면 선 그래프를 그린다.
- 그래프를 화면에 표시하기 위해 plt.show() 함수를 호출한다.
- 그래프의 타이틀, x, y축 이름을 설정할 수 있다.
```python
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
x = np.arange(0, 10)
y = x**2
plt.plot(x, y)
plt.title('플롯 그래프')
plt.xlabel('X축')
plt.ylabel('Y축')
plt.show()
- 만약 폰트 설치해도 오류가 나는 경우
!apt-get update -qq
!apt-get install fonts-nanum* -qq
import matplotlib.font_manager as fm
import warnings
warnings.filterwarnings(action='ignore')
path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = fm.FontProperties(fname=path, size=10).get_name()
plt.rc('font', family=font_name)
여러개의 그래프 그리기
x = np.linspace(0, 10, 100)
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y)
plt.plot(x, z)
plt.show()
그래프 스타일 지정
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.sin(x + 0.5)
y3 = np.sin(x + 1)
plt.plot(x, y1, 'r--') # -과 .은 선의 스타일이다.
plt.plot(x, y2, 'b.')
plt.plot(x, y3, 'g-.')
plt.show()
스타일 지정하기
그래프 형상 (Figure) 설정
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.sin(x + 0.5)
y3 = np.sin(x + 1)
plt.plot(x, y1, 'r--', label='Sin A')
plt.plot(x, y2, 'b.', label='Sin B')
plt.plot(x, y3, 'g-.', label='Sin C')
plt.legend(loc='upper right')
plt.show()
### 표시할 축의 범위 설정
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
plt.plot(x, y1, 'r--', label='Sin A')
plt.xlim([2, 8]) # trim. 시작위치,간격 등 정의
plt.ylim([-1, 0.8])
plt.show()
### 눈금 설정 - ticks
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, 'b-.', linewidth=3)
plt.xticks(np.arange(0, 10, 2))
plt.yticks(np.arange(-1.0, 1.1))
plt.show()
### 눈금의 레이블 지정
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, linewidth=3)
plt.xticks([0, 5, 10], labels=['Jan', 'Feb', 'Mar'])
plt.yticks([-1, 0, 1], labels=['min', 'ave', 'max'])
plt.show()
### 눈금 레이블의 회전 표시
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, linewidth=3)
plt.xticks([0, 5, 10], labels=['Jan', 'Feb', 'Mar'], rotation=90)
plt.yticks([-1, 0, 1], labels=['min', 'ave', 'max'])
plt.show()
### 눈금 삭제 - plt.tick_params() 함수를 사용해서도 지울 수 있다.
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, linewidth=3)
plt.xticks([])
plt.yticks([])
plt.show()
### 색상설정
x = np.arange(10)
plt.plot(x, x, color = "r")
plt.plot(x, x+2, color = "green")
plt.plot(x, x+4, color = "#524FA1")
plt.plot(x, x+6, 'k-')
plt.show()
그래프의 구조
### 그래프 크기 설정 figsize = 차트의 사이즈
x = np.arange(1, 30)
y = np.log(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.show()
### plot() 함수로 만들어진 Figure 객체를 얻어서 크기 설정
x = np.arange(1, 30)
y = np.log(x)
plt.plot(x, y)
fig = plt.gcf()
fig.set_size_inches(8, 6)
plt.show()
### subplot함수를 이용해서 차트를 여러개 그릴 수 있다.
x = np.linspace(0, 10, 30)
y = np.sin(x)
z = np.cos(x)
plt.style.use('ggplot')
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(x, y, 'r-')
plt.subplot(2, 2, 2)
plt.plot(x, z, 'g--')
plt.subplot(2, 2, 3)
plt.plot(x, z, 'b-.')
plt.show()
subplot을 사용해 작성한 그래프
산점도
- 연속형 데이터를 직교 좌표계에 점으로 표현하는 그래프이다.
- 전체적인 데이터의 분포를 확인하거나, x-y 두 변수의 상관 관계를 확인한다.
- 점의 크기, 모양, 색상 등으로 데이터를 표현한다.
- scatter() 함수로 그린다.
- scatter() 함수의 파라미터로 스타일 설정
- s : 점의 면적
- c : 색상
- alpha : 점의 투명도
n= 50
x = np.random.rand(n)
y = np.random.rand(n)
area = (30 * np.random.rand(n))**2
colors = np.random.rand(n)
plt.scatter(x, y, s=area, c=colors, alpha=0.7)
plt.show()
막대 그래프 (Bar Plot)
- 범주형 데이터의 값을 막대의 높이와 색상으로 표현하는 그래프
- 범주별 크기를 비교하거나 범주별 데이터의 분포를 확인할 수 있다.
- bar() 함수로 그린다.
name = ['A','B','C','D']
y = [5. , 25. , 50. , 20.]
z = [8. , 20. , 25. , 6.]
fig, ax = plt.subplots(1, 2)
fig.set_size_inches(12, 5)
ax[0].bar(name, y, color='#33aaff')
ax[1].bar(name, z, color=['r', 'g', 'b', 'k'])
plt.show()
## 가로 barh() 함수
x = ['A','B','C','D']
y = [5. , 25. , 50. , 20.]
plt.barh(x, y)
plt.show()
히스토그램
- 연속형 데이터를 일정 구간으로 나누고, 각 구간에 속하는 데이터의 개수를 막대로 표시한다.
- 막대그래프는 범주형 데이터, 히스토그램은 연속형 데이터를 표시한다.
- hist() 함수로 그린다.
- color : 막대 그래프의 색상
- bins : x축의 개수
x = np.random.normal(172, 10, 250)
plt.hist(x, bins=20, color='#05ae1c')
plt.show()
박스플롯 (Boxplot)
- 데이터의 4분위수를 표현한다
- boxplot() 함수로 그린다
- patch_artist : 박스 내부를 색상으로 채운다.
- sym : 데이터를 표시하는 색상과 모양을 문자열로 설정한다.
x = np.random.normal(10, 3, 100)
y = np.random.normal(13, 3, 100)
z = np.random.normal(8, 5, 100)
plt.boxplot([x, y, z], patch_artist=True, sym='ro')
plt.xticks([1, 2, 3], ['A', 'B', 'C'])
plt.show()
이미지 표시
- imshow() 함수로 이미지 표시
- imshow() 함수로 설정하는 데이터는 배열 형태로 설정한다.
- savefig() 함수에 파일명을 설정해서 저장한다.
### imshow - 이미지도 plot이다.
import matplotlib.pyplot as plt
import matplotlib.image as img
image = img.imread('myimg.png')
plt.imshow(image)
plt.xticks([])
plt.yticks([]) # 아마 빈배열을 넣으면 원본에 맞는 크기가 나오는듯하다. (꽉차게)
plt.show()
### savefig
x = np.arange(1, 30)
y = np.log(x)
plt.plot(x, y)
fig = plt.gcf()
fig.set_size_inches(8, 6)
plt.savefig('fig1.png')
'프로그램 > SKT FLY AI' 카테고리의 다른 글
SKT FLY AI : 5일차 - ML (0) | 2023.06.30 |
---|---|
SKT FLY AI : 2일차 - 실습 (0) | 2023.06.27 |
SKT FLY AI : 2일차 - 끄적이는 글(2). 머신러닝(기계학습) (0) | 2023.06.27 |
SKT FLY AI : 2일차 - 끄적이는 글(1) - Crawling, Seaborn, folium (0) | 2023.06.27 |
SKT FLY AI : 1일차 - 끄적이는 글(2). pandas (0) | 2023.06.26 |