산점도 그래프 그리기
빅데이터 분석 기사 자격증 실기 시험을 R로 치렀다. 첫 도전은 실패...
그런데 후기를 보니, 동일한 문제를 파이썬으로 풀면 좀 더 쉽게 풀 수 있었다는 후기들을 보며 둘 다 비교하면서 공부하면 좋겠다는 생각에 공부 정리 겸 하나씩 예제를 풀어보려고 한다. 코딩은 구글 코랩으로 R과 파이썬을 비교해보면서 진행하였다.
[문제] 도미와 빙어 분류 (KNN을 이용하여 분류하기)
- 도미의 길이와 무게 변수 만들기
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
bream_length <- c(25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0)
bream_weight <- c(242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0)
변수 : 파이썬은 숫자만 넣지만, R 은 숫자들을 c()로 묶어서 벡터로 만든다.
- matplotlib.pyplot 패키지를 불러와야 함 (import)
- 산점도 그리기 : plt.scatter(x, y)
- 그래프 보여주기 : plt.show()
- 따로 패키지 불러오기 없이 plot 함수 사용 : plot(x, y) or plot(y ~ x)
- xlabel, ylabel 은 변수명으로 자동으로 표시됨
그래프 : R이 파이썬보다 간단하다. 매우~~
- 점 색깔 : plt.scatter(c="color")
- 점 크기 : plt.scatter(s=50)
- 점 모양 : plt.scatter(marker="s")
- 제목 : plt.title()
- 라벨 : plt.xlabel(), plt.ylable()
참고로 점의 모양 예시 : s 대신 아래 문자를 넣으면 모양이 바뀜
- 점 색깔 : plot(col="color")
- 점 크기 : plot(cex=2)
- 점 모양 : plot(pch=19)
- 제목 : plot(main="")
- 라벨 : plot(xlab="", ylab="")
참고로 점의 모양 예시 : pch= 숫자를 아래와 같이 넣으면 모양이 바뀜
R은 plot() 안에 제목, 라벨, 숫자, 모양을 모두 넣지만, 파이썬은 각각을 표시하는 명령어 입력한다.
한 발짝 더 나아가 보자.
도미와 병어를 하나의 산점도에 같이 표시하고, 특정 좌표 점도 추가해보자
plt.scatter(x1, y1)
plt.scatter(x2, y2)
plt.scatter(30,600, marker='^')
plot(x1, y1)
points(x2, y2)
points(30, 600, pch=17)
-> R은 추가로 그리는 그래프가 plot()으로 그린 그래프의 범위를 벗어나면 보이지 않는다. 그래서 좌표축의 범위를 넣어주어야 한다. xlim=c(최소, 최대), ylim=c(최소, 최대)
파이썬은 plt.scatter(x, y)로 R은 points(x, y)로 multi 산점도 그래프를 그릴 수 있다.
이제부터 본적적인 KNN 알고리즘 실현해보기이다. 도미와 빙어의 무게와 길이 데이터를 합친 후 이 값이 작으면 빙어, 크면 도미로 구별한다.
- 길이 = 빙어 길이 + 도미 무게
- 무게 = 빙어 무게 + 도미 무게
- 두 데이터를 각각의 열로 만들어 합치기 : [l, w] for l, w zip(길이, 무게)
: 파이썬은 두 리스트를 합쳐 하나의 리스트를 만들 때는 리스트+리스트
두 변수를 각각의 열로 만들 때는 ZIP 함수를 사용한다.
- 길이 <- c(빙어 길이, 도미 길이)
- 무게 <- c(빙어 무게, 도미 무게)
- 각각의 열로 만들어서 합치기 : cbind(길이, 무게)
R의 cbind()는 파이썬의 ZIP 함수
먼저 빙어를 0, 도미를 1로 만든 변수(fish_target)를 만든다.
다음으로 7:3으로 train, test 데이터 세트를 만든다. 이때 사용하는 패키지는 sklearn.model_selection
R은 우선 길이, 무게, 물고기 종류를 하나의 변수로 만든다.
그리고 나서 7:3으로 나누는 작업을 한다. 이때 사용하는 함수는 sample()이다. 전체 데이터 행수는 nrow(data)로 구한 후 여기서 70% 만 무작위로 선택해서 숫자를 부여한다. 그리고 이 숫자를 가지는 것을 train, 가지지 않는 것을 test로 해서 구별한다.
파이썬은 train_test_split() 함수로,
R은 sample() 함수를 사용하여 train, test를 나눈다.
KNN 패키지 불러와서(from ~ import)
인접 거리를 1과 34로 두고 train_x, train_y를 모델을 만든다. : model= kn.fit(train_x, train_y)
여기서 N=1을 두고 훈련시키면 예측률이 높고, N=34로 두면 예측률이 낮아지므로 각각의 모델을 만들어서 test_x를 넣어 훈련시킨다. (model.fit)
그리고 난 후 이 각각의 모델에 test_x를 넣어 test_y와 얼마나 일치하는지를 score 함수를 이용하여 살펴보려고 한다. (model.score)
R에서는 KNN을 부르는 패키지는 "class"이다. 이것을 libray로 불러온 후 knn 함수를 사용하여 train_x, train_y를 넣어 훈련시킨다. 이때 파이썬에서 했던 것처럼 k=1, k=34로 나누어서 두 개로 모델링을 한다.
그리고 난 후 이 모델 (knn.1, knn.2)에 test_x를 넣어 나온 값과 test_y를 비교한다.
R은 파이썬에서 Score 함수가 따로 없으므로 table 함수를 사용하여 0을 0으로 찾은 것과 1을 1로 찾은 것을 합해서 전체 개수로 나누어서 일치율을 계산한다.
KNN 머신러닝을 할 때,
파이썬은 KNeiborClassifier(n_neighbors=1)를,
R은 knn(k=1) 함수를 사용
첫 번째 예제를 마치며...
개인적으로 R이 더 간편했다. 특히 데이터 전처리나 산점도를 그릴 때는 좀 더 편했다. 최대한 내장 함수만을 이용하여 예제를 풀려고 노력했다. 이번 예제는 파이썬의 강점인 머신러닝이 특별히 R보다 더 뛰어나다는 생각은 들지 않았다. 이상치 제거, 결측치 제거, 표준화/정규화 작업은 다음 예제에서는 넣어서 진행하려고 한다.
파이썬 코드 (구글 코랩)
https://colab.research.google.com/drive/149O--I9iWvJXeroiPE5ncH2PUGEc51Im?usp=sharing
R 코드 (구글 코랩)
https://colab.research.google.com/drive/1UXcr1efYHkmV-Jr-TbwbwggP6cuMKlh9?usp=sharing