11주차 수업 복습
데이터과학 기초
Matplotlib
파이썬을 이용하여 주어진 데이터를 정적, 동적, 대화식 그래프 형식으로 시각화해주는 통합 라이브러리 패키지.
(기본적으로 선그래프, 막대그래프, 점그래프 지원)
import matplotlib.pyplot as plt
B=[2,4,6,8,10]
plt.plot(B)
plt.show()
x축에 해당되는 값이 지정되지 않는 경우, x축에 넘파이 배열의 인덱스가 할당되고, y축에는 넘파이 배열의 값이 할당.
따라서 (0,2) (1,4) (2,6) (3,8) (4,10) 의 점들을 연결하는 막대그래프가 생성됨
import matplotlib.pyplot as plt
X=[13,20,30,40,50,60,70,80,90,100]
Y=[0,2,1,3,2,4,7,12,15,5]
plt.plot(X,Y)
plt.xlabel("score")
plt.ylabel("count")
plt.show()
위 경우는 x축과 y값을 지정하여 그린 경우이다. plt.xlabel(), plt.ylabel() 을 통하여 레이블을 지정하는 것도 가능!
import matplotlib.pyplot as plt
X=[13,20,30,40,50,60,70,80,90,100]
Y=[0,2,1,3,2,4,7,12,15,5]
plt.bar(X,Y)
plt.xlabel("score")
plt.ylabel("count")
plt.show()
위 경우는 x축 y축 값을 지정 후, 막대그래프로 그린 경우이다. plt.bar(x,y)를 통해 그릴 수가 있다.
(#주의: plt.show()를 반드시 해야만 출력한 그래프를 눈으로 확인할 수가 있다)
ex> 강수량 그래프 그리기
import matplotlib.pyplot as plt
X=[1,2,3,4,5,6,7,8,9,10,11,12]
Y2011=[9,29,15,110,53,405,1131,167,26,32,56,7]
Y2020=[61,53,16,17,112,40,270,676,182,0,120,5]
plt.plot(X,Y2011,label="2011")
plt.plot(X,Y2020,label="2020")
plt.xlabel("Month")
plt.ylabel("Precipitation(mm)")
plt.legend(loc="upper left")
plt.title("Precipitations in Seoul")
plt.show()
NumPy (Numerical Python)
행렬 계산이 편리한 파이썬 라이브러리 패키지. 기계학습 응용 프로그램에서 데이터는 NumPy가 제공하는 다차원 배열(행렬) 상에서 저장되어 처리된다.
넘파이 1차원 배열
>>> import numpy as np
>>> temp=[1,3,5,7,9]
>>> A=np.array(temp)
>>> A
array([1, 3, 5, 7, 9])
>>> A*2
array([ 2, 6, 10, 14, 18])
>>> A*0.3
array([0.3, 0.9, 1.5, 2.1, 2.7])
>>> A=A*0.3
>>> A
array([0.3, 0.9, 1.5, 2.1, 2.7])
배열 연산
자산에서 대출을 모두 공제한 후 자산 잔액을 계산하는 예제. 배열 원소 또는 배열 간에 수학 연산자 적용 가능.
import numpy as np
asset=np.array([1000,2000,1500,900])
debt=np.array([300,1200,0,1500])
print("asset",asset)
print("debt",debt)
asset=asset-500
print("500 deducted each")
print("asset",asset)
print("balance after debt deduction")
balance=asset-debt
print("balance",balance)
print("asset",asset)
print("balances over 1000")
print(balance>500)
asset=balance
debt=debt-debt
print("asset", asset[0],asset[1],asset[2],asset[3])
print("debt",debt)
#실행 결과
asset [1000 2000 1500 900]
debt [ 300 1200 0 1500]
500 deducted each
asset [ 500 1500 1000 400]
balance after debt deduction
balance [ 200 300 1000 -1100]
asset [ 500 1500 1000 400]
balances over 1000
[False False True False]
asset 200 300 1000 -1100
debt [0 0 0 0]
넘파이 arange
np.arange(start,stop,step)
배열의 범위를 의미, start에서 stop-1 범위까지 step 간격만큼 값을 생성하는 역할. (step 생략 시 디폴트 값은 1)
>>> num=np.arange(1,100)
>>> num
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
>>> odd=np.arange(1,100,2)
>>> odd
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33,
35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67,
69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99])
>>> even=np.arange(2,100,2)
>>> even
array([ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34,
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68,
70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98])
ex> 넘파이로 구구단을 출력해보자!
import numpy as np
first=np.arange(2,10)
second=np.arange(1,10)
for i in range(0,first.size):
print(second*first[i])
#실행 결과
[ 2 4 6 8 10 12 14 16 18]
[ 3 6 9 12 15 18 21 24 27]
[ 4 8 12 16 20 24 28 32 36]
[ 5 10 15 20 25 30 35 40 45]
[ 6 12 18 24 30 36 42 48 54]
[ 7 14 21 28 35 42 49 56 63]
[ 8 16 24 32 40 48 56 64 72]
[ 9 18 27 36 45 54 63 72 81]
구간 분할하기
np.linspace(start,end,level) : start에서 end의 범위를 level-1 개수의 구간으로 분할
ex> np.linspace(1,100,7) ==(100-1)/6 = 16.5 씩 자르기
>>> import numpy as np
>>> a=np.linspace(1,100,7)
>>> print(a)
[ 1. 17.5 34. 50.5 67. 83.5 100. ]
>>> import numpy as np
>>> a=np.linspace(50,1000)
>>> print(a)
[ 50. 69.3877551 88.7755102 108.16326531 127.55102041
146.93877551 166.32653061 185.71428571 205.10204082 224.48979592
243.87755102 263.26530612 282.65306122 302.04081633 321.42857143
340.81632653 360.20408163 379.59183673 398.97959184 418.36734694
437.75510204 457.14285714 476.53061224 495.91836735 515.30612245
534.69387755 554.08163265 573.46938776 592.85714286 612.24489796
631.63265306 651.02040816 670.40816327 689.79591837 709.18367347
728.57142857 747.95918367 767.34693878 786.73469388 806.12244898
825.51020408 844.89795918 864.28571429 883.67346939 903.06122449
922.44897959 941.83673469 961.2244898 980.6122449 1000. ]
zero 배열 만들기
- 1차원 배열 만들기
>>> print(np.zeros(9))
[0. 0. 0. 0. 0. 0. 0. 0. 0.]
- 2차원 배열 만들기
>>> print(np.zeros((5,5)))
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
(행,열) , 5x5 의 2차원 배열을 만들어 출력한다.
(주의!: (5,5) 전체를 괄호 안에 넣어서 전달해야 함!)
- 3차원 배열 만들기
>>> print(np.zeros((3,4,5)))
[[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]]
4x5 행렬이 총 3개 생성된다.
import numpy as np
x=np.full(2,5) #원소가 2개인 1차원 배열을 초기값 5로 생성
y=np.full((3,4),fill_value=1) #3행 4열 2차원 배열을 생성, 원소 초기값은 1
z=np.full((3,4,5),fill_value=3) #4행 5열 2차원 배열을 3개 생성, 원소 초기값은 3
print("ndim",x.ndim,y.ndim,z.ndim) #ndim: 특정 배열의 차원을 확인 할 수 있음
print("shape",x.shape,y.shape,z.shape) #shape: 배열의 행렬 크기 확인 가능
print("size",x.size,y.size,z.size) #size: 원소의 총 개수 확인 가능
ndim 1 2 3
shape (2,) (3, 4) (3, 4, 5)
size 2 12 60
배열 행, 열 별 최대 최소값 찾기
import numpy as np
x=np.random.randint(10,size=(3,4)) #난수 (0~9) 로 3행 4열 배열 생성
print(x)
col_max=np.amax(x,axis=0) #각 열의 최대값
row_max=np.amax(x,axis=1) #각 행의 최대값
col_min=np.amin(x,axis=0) #각 열의 최소값
row_min=np.amin(x,axis=1) #각 행의 최소값
print()
print(col_max)
print(row_max)
print(col_min)
print(row_min)
print()
max_pos=np.argmax(x) #배열 원소 중 최대값의 위치
min_pos=np.argmin(x) #배열 원소 중 최소값의 위치
col_max_pos=np.argmax(x,axis=0) #배열의 각 열에서 최대값의 위치
row_min_pos=np.argmin(x,axis=1) #배열의 각 행에서 최소값의 위치
print("max_pos", max_pos)
print("min_pos", min_pos)
print("col_max_pos", col_max_pos)
print("row_min_pos", row_min_pos)
[[0 9 6 6]
[0 3 9 7]
[1 6 3 9]]
[1 9 9 9]
[9 9 9]
[0 3 3 6]
[0 0 1]
max_pos 1
min_pos 0
col_max_pos [2 0 1 2]
row_min_pos [0 0 0]
배열의 합 구하기
import numpy as np
x=np.random.randint(10,size=5)
y=np.random.randint(10,size=(3,4))
x_sum=np.sum(x)
y_sum=np.sum(y)
col_mean=np.mean(y,axis=0)
row_mean=np.mean(y,axis=1)
print(x)
print(y)
print()
print(x_sum)
print(y_sum)
print(col_mean)
print(row_mean)
[6 5 8 2 0]
[[5 4 1 0]
[5 5 9 9]
[3 9 7 7]]
21
64
[4.33333333 6. 5.66666667 5.33333333]
[2.5 7. 6.5]
ex> 인구 통계 그래프 그리기
import numpy as np
import matplotlib.pyplot as plt
gu=['강남', '강동', '강서', '관악', '구로', '노원', '동작', '마포', '서초', '성북', '송파', '양천', '영등포',
'용산', '은평']
population=[55029,440390,598273,517334,439371,537303,408912,385925,435107,454744,
682741,462285,400986,245185,484546]
area=[39.5, 24.59, 41.44, 29.57, 20.12, 35.44, 16.35, 23.85, 46.98, 24.57, 33.87, 17.41, 24.55, 21.87,
29.71]
np_gu=np.array(gu)
np_population=np.array(population)
np_area=np.array(area)
plt.bar(np_gu,np_population)
plt.ylabel("인구 (명)")
plt.show()
여러가지 함수 동시에 그리기
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(1,10)
y0=np.log(x)
y1=x
y2=x**2
plt.plot(x,y0,x,y1,x,y2)
plt.show()
삼각함수 그리기
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,4*np.pi,100)
y1=np.sin(x)
y2=np.cos(x)
plt.plot(x,y1,x,y2)
plt.show()
Pandas
빠르고, 융통성 있고, 사용하기 쉬운 데이터 분석과 조작을 지원하는 오픈 소스 파이썬 라이브러리.
넘파이와 달리 행과 열에 레이블을 부여하여 편리하게 데이터 조작이 가능
csv,xlsx,SQL 데이터베이스 등의 외부 파일 데이터를 읽어서 배열 OR 행렬에 저장토록 해줌. 다양한 연산 함수 제공
시리즈(series)는 같은 자료형의 데이터를 저장할 수 있는 1차원 배열
데이터 프레임(data frame)은 같은 자료형의 데이터를 저장하는 2차원 배열로 행, 열로 구성됨. 기능은 내부적으로 넘파이로 구현되어 있음.
데이터프레임 행에 부여된 레이블 =index. 열에 붙여진 레이블은 column.
판다스는 데이터 프레임에서 행렬에 대한 필터링, 정렬을 포함하는 다양한 연산 함수를 제공.
시리즈(Series)
판다스로 만들어진 1차원 배열.
>>> import pandas as pd
>>> item=['Seoul','Tokyo','Paris','New York']
>>> city=pd.Series(item)
>>> print(city)
0 Seoul
1 Tokyo
2 Paris
3 New York
dtype: object
데이터 프레임 (Data Frame)
행과 열이 있는 2차원 배열 테이블. 행에 index를 부여하지 않을 경우, 0~n-1의 일련번호가 부여됨.
>>> import pandas as pd
>>> item={'City':['Seoul','Tokyo','Paris','New York'],'Nation':['Korea','Japan','France','USA']}
>>> city=pd.DataFrame(item)
>>> print(city)
City Nation
0 Seoul Korea
1 Tokyo Japan
2 Paris France
3 New York USA
ex> 데이터 프레임에 인덱스 추가
>>> import pandas as pd
>>> item={'City':['Seoul','Tokyo','Paris','New York'],'Nation':['Korea','Japan','France','USA']}
>>> city=pd.DataFrame(item,index=['KR','JP','FR','US'])
>>> print(city)
City Nation
KR Seoul Korea
JP Tokyo Japan
FR Paris France
US New York USA
Pandas 이용하여 파일 읽기
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
pop=pd.read_csv(r"C:\Users\user\Desktop\21-1\소웨이\실습11장\population.csv")
print(pop)
기간 지역 인구 면적 인구밀도
0 2019 송파구 682741 34 20156
1 2019 강서구 598273 41 14438
2 2019 강남구 550209 40 13929
3 2019 노원구 537303 35 15162
4 2019 관악구 517334 30 17496
5 2019 은평구 484546 30 16308
6 2019 양천구 462285 17 26559
7 2019 성북구 454744 25 18505
8 2019 강동구 440390 25 17909
9 2019 구로구 439371 20 21837
10 2019 서초구 435107 47 9261
11 2019 동작구 408912 16 25003
12 2019 중랑구 402024 19 21736
13 2019 영등포구 400986 25 16334
14 2019 마포구 385925 24 16180
15 2019 광진구 366972 17 21507
16 2019 동대문구 363023 14 25537
17 2019 도봉구 335631 21 16245
18 2019 서대문구 323171 18 18335
19 2019 강북구 317695 24 13462
20 2019 성동구 308979 17 18327
21 2019 금천구 251820 13 19341
22 2019 용산구 245185 22 11213
23 2019 종로구 161869 24 6769
24 2019 중구 136488 10 13704
'💻STUDY > PYTHON STUDY' 카테고리의 다른 글
13주차 수업 복습 (0) | 2021.06.03 |
---|---|
12주차 수업복습 (0) | 2021.05.29 |
10주차 수업 복습 (0) | 2021.05.13 |
9주차 수업 복습 (0) | 2021.05.09 |
8주차 배운거 복습 (0) | 2021.04.28 |
댓글