영화 마이너리티 리포트 한번보기!
분류 Classfication
데이터분석은 인문학적 소양이 매우 필요하다.
기술로만은 불가능 하다.
암이었다가 암이 아닌 모델이 훨씬 더 좋은 모델이라고 한다.
1. 각 데이터의 표준화 필요
2. 분류의 결과가 악성이나 양성
id값이 필요한 이유 A란 사람의 생활패턴이 필요
2~4 = 1~ 10
0.2 -0.2 0.4-0.2 0.4-0.3
------ 0 ------ 1 ------ 0.5
0.4-0.2 0.4-0.2 0.4-0.2
최대값 -a a - 최대값
--------- 현 위치 ---------
최대값-최소값 최대값 - 최소값
2 - 5 -3 5-1 4
---- ---- ---- ---
2 - 1 1 2-1 1
0.4-0.3 0.1 0.3-0.2 -0.2
--- -- ------ ----
0.4-0.2 0.2 0.4-0.2 0.2
(max(x) -min(x)) - (max(x)-x)
-------------------------
max(x) - min(x)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# getwd() | |
# setwd("D:/BigData/Source") | |
# getwd() | |
# 1~20까지의 값을 갖는 5행 4열의 행렬 mData생성 | |
mData <- matrix(c(1:20), nrow=5) | |
mData | |
# mData의 1열을 제외한 2~4열의 값을 갖는 행렬 mdData 생성 | |
mdData <- mData[,-1] # 행이라면 반대로 [-1,] | |
mdData | |
# mData의 각 행의 합을 출력 | |
sumData <- apply(mData,1,sum) # 행 | |
sumData | |
sumData <- apply(mData,2,sum) # 열 | |
sumData | |
# breastcancer.csv 파일 불러오기 | |
bcData <- read.csv("./BigData/breastcancer.csv") | |
# bcData를 편집기로 확인 | |
fix(bcData) | |
# bcData 기본적인 데이터 구성 확인 데이터가 어떤 속성으로 구성되어 있는지 | |
str(bcData) # b는 1 m은 2 Factor 두가지라는 소리 | |
# 환자를 식별하는 값이 id 열은 행으로 구분할 수 있기 때문에 제거하고 분석 | |
bcDelData <- bcData[-1] | |
bcDelData | |
# 예측하고자 하는 정보는 진단 | |
# 진단 열의 종류와 값의 정보 출력 | |
table(bcDelData$진단) | |
bcDelData$진단[3] | |
# 예측하고자 하는 정보가 가독성이 어려운 경우에는 가독성을 갖도록 정보를 변경 | |
str(bcData) | |
# 진단 열의 데이터 클래스 형식이 Factor 를 변경할때는 replace가 아닌 factor를 이용 | |
bcDelData$진단 <- factor(bcDelData$진단, levels =c("B","M"), c("양성","악성")) | |
bcDelData | |
# 진단 열의 값의 확률을 확인 : prop.table() | |
table(bcDelData$진단) | |
prop.table(table(bcDelData$진단)) | |
# 소수점 이하의 출력을 제어 | |
round(prop.table(table(bcDelData$진단))*100,1) | |
# 사용자 함수 생성 : normalize | |
# 값을 표준화 (0~1)하는 함수 | |
normalize <- function(x){ | |
result <- (max(x)-min(x) -(max(x)-x)) / (max(x)-min(x)) | |
#rangeN<- max(x) min(x) | |
#result <- (rangeN - (max(x)-x)) / rangeN | |
return(result) | |
} | |
normalize(c(1,2,3,4,5)) | |
normalize(c(0.01,0.02,0.03,0.04,0.05)) | |
# 진단 항목을 제외한 모든 항목을 normalize함수를 사용하여 값을 표준화 | |
fix(bcDelData) | |
# 데이터 프레임 형식의 항목들을 함수처리 하는 경우에는 lapply() 행렬의 합 곱 등 | |
bcData_normalize <- as.data.frame(lapply(bcDelData[2:31],normalize))#32개중에 id 빼서 31개 진단을 빼고 | |
fix(bcData_normalize) | |
# 데이터를 훈련(training)데이터와 평가(test)데이터로 구분 | |
bcData_train <- bcData_normalize[1:469,] # 행으로 자름 | |
bcData_train | |
bcData_test <- bcData_normalize[470:569,] | |
bcData_test | |
# 진단 항목에 대한 데이터도 훈련데이터와 평가 데이터로 구분 | |
bcData_train_label <- bcDelData[1:469, 1] # 1부터469까지 첫번째를 가져옴 470or 500 으로하면 1:1 매칭이 안된다 | |
bcData_train_label | |
bcData_test_label <- bcDelData[470:569, 1] | |
bcData_test_label | |
# knn 알고리즘을 실행하기 위해서 필요한 라이브러리 설치 | |
install.packages("class") | |
library(class) | |
# knn알고리즘 : knn(훈련데이터, 평가데이터, 분석할 값(범주), 이웃의 개수) | |
# train : 학습용 데이터/test : 평가용 데이터/ cl : 학습용 데이터의 결과(진단)요소/ k : 평가의 고려되는(계산되는) 이웃한 데이터(값)의 개수 | |
bcData_eval_pred<-knn(train=bcData_train, test=bcData_test,cl=bcData_train_label, k=5) #주로 k값은 홀수로 값을 변경하며 3개보단 5개를 했을때 좋은 결과를 도출 | |
bcData_eval_pred | |
# 예측한 결과를 테이블 형식으로 확인할때 사용 : crossTable() | |
install.packages("gmodels") | |
library(gmodels) | |
CrossTable(x=bcData_test_label, y=bcData_eval_pred, prop.chisq = FALSE) | |
# 출력 결과를 그래프로 그리기 | |
install.packages("ggplot2") | |
library(ggplot2) | |
qplot(bcData_train$반지름_평균, bcData_train$부드러움_평균, data=bcData_train, color=bcData_train_label) | |
qplot(bcData_train$대칭도_평균, bcData_train$오목점_평균, data=bcData_train, color=bcData_train_label) | |
군집 분석 (Cluster Analysis)
그룹으로 묶어서
다수의 대상(소비자, 제품, 기타)들 그들이 소유하는 특성을 토대로 유사한 대상들끼리 그룹핑
군집내의 구성원들은 가그벅 유사하게, 군집들간에는 가그벅 상이하게 대상을 그룹핑
시장세분화, 유사브랜드 그룹핑 -> 어느 브랜드와 직접적 경쟁관계에 있는지 알 수 있음
k-means 군집화
--
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
getwd() | |
# protein.csv 파일을 읽어서 food 데이터 생성 | |
food <- read.csv("./BigData/protein.csv") | |
# 처음 6개의 관측값을 출력/ 더 많은 관측값을 출력하고 싶으면 head(food, n= 출력하고 싶은 수) | |
# 마지막 6개의 관측값을 출력하고 싶을 때에는 tail(food) / 자기 자신이 선택하고싶으면 food[1:6,] | |
head(food) | |
str(food) | |
# 붉은 고기와 흰고기를 대상으로 군집 | |
# kmeans(데이터,centers =) | |
greMeat <- kmeans(food[,c("RedMeat", "WhiteMeat")],centers =3 ) | |
greMeat | |
# RedMeat 몇퍼+ WhiteMeat 몇퍼가 군집을 이루어 3개의 결과가 나타난다 | |
# 10번 라인의 kmeans 결과가 가독성이 부족함 | |
# 가독성을 고려하여 각 국각가 어느 클러스터에 해당하는지 확인할 수 있도록 | |
result <- order(greMeat$cluster) | |
data.frame(food$Country[result], greMeat$cluster[result]) | |
# 그래프 | |
# x축은 RedMeat, y축은 WhiteMeat으로 그래프 생성 | |
plot(food$RedMeat,food$WhiteMeat, xlim=c(4,17), xlab="RedMeat", ylab="WhiteMeat",type="n")#x좌표 범위 지정/ type ="n" 점을 사라지게 | |
# 21라인에서 생성한 그래프의 각 위치에 해당하는 국가를 입력 | |
# text(x=x축의 위치, y=y축의 위치, labels=해당하는 위치에 입력될 값을 지정, col=색상의 시작값) | |
text(x=food$RedMeat, y=food$WhiteMeat, labels = food$Country, col = greMeat$cluster) | |
# 모든 섭취원에 대해 5개의 클러스터로 군집화 | |
greMeat.All <- kmeans(food[,-1],centers =5 ) | |
greMeat.All | |
result.All <- order(greMeat$cluster) | |
data.frame(food$Country[result.All], greMeat$cluster[result.All]) | |
plot(food$RedMeat,food$WhiteMeat, xlim=c(2,20), xlab="RedMeat", ylab="WhiteMeat",type="n")#x좌표 범위 지정/ type ="n" 점을 사라지게 | |
text(x=food$RedMeat, y=food$WhiteMeat, labels = food$Country, col = rainbow(7)) | |
plot(food$Milk,food$Eggs,xlim=c(0,30),xlab="Milk", ylab="Eggs", type="n") | |
text(x=food$Milk, y=food$Eggs, labels=food$Country,col=greMeat.All$cluster) | |
# 모든 섭취원에 대한 5개의 군집(greMeat.All)에서 Cereals과 Fish의 섭취량을 기준으로 그래프를 생성 | |
# x축 y축 셋팅을 안하면 알아서 자동으로 표준화 시켜준다. | |
plot(food$Cereals, food$Fish, xlab="Cereals", ylab="Fish", type="n") | |
text(x=food$Cereals, y=food$Fish, labels=food$Country,col=greMeat.All$cluster) | |
# 지도위에 나라이름 해당하는 나라의 위도와 경도가 있다. 그 위치에 이름을 쓰는게 아니라 점을 찍어주면 된다. | |
# 그러기 위해서는 군집의 결과를 패키지로 지도패키지 설치/로드 | |
install.packages("ggmap") | |
library(ggmap) | |
install.packages("rworldmap") | |
library(rworldmap) | |
# 지도에 그래프를 그리기 위해서는 필요한 것이 있다. | |
# 1. 나라 이름/ 2. 국가 대표 좌표(위도/경도) | |
# R패키지에서 사용하는 ggmap과rworldmap은 character형식으로 접근해야한다. | |
# food에 포함되어있는 국가명을 추출하여 chararcter 형식으로 데이터를 생성 -> country | |
country <- as.character(food$Country) | |
country | |
# 추출한 국가의 위도와 경도 값을 가져와야 함, 지도의 위치값으로 변환 : geocode() 자동으로 국가명을 가져와 위도와 경도를 위치값으로 변환(location) | |
eu.limits <- geocode(country) | |
eu.limits | |
# 지도를 그리기 위해서 getMap함수를 사용 해상도가 높은 것은 에러 백퍼 발생 ! | |
newMap <- getMap(resolution = "low") # low 흑백으로 가져옴 | |
# 지도가 2행 1열로 출력 아래 위 오른쪽 왼 | |
par(mfrow=c(2,1), mai=c(0.3,0.6,0.1,0.1)) | |
#그리기 x좌표의 길이는 | |
plot(newMap, xlim=range(eu.limits$lon), ylim=range(eu.limits$lat), asp=1) | |
points(eu.limits$lon, eu.limits$lat, col=greMeat$cluster, pch=20, cex=2) | |
text(eu.limits$lon, eu.limits$lat, labels=food$Country, cex=1.1) | |
# 그래프 생성하니 위치정보가 잘못된 국가가 있다 -> 위치 정보를 쉉 | |
# Czeochos 5, USSR 23 항상 값은 벡터형식으로 | |
eu.limits[5,] <- c(14.26, 50.50) | |
eu.limits[23,] <- c(27.3929020, 55.7215090) | |
plot(newMap, xlim=range(eu.limits$lon), ylim=range(eu.limits$lat), asp=1) | |
points(eu.limits$lon, eu.limits$lat, col=greMeat$cluster, pch=20, cex=2) | |
# lat을 빼면 글씨가 1만큼 위도가 이동한 상태에서 text가 출력된다. | |
# text(eu.limits$lon,eu.limits$lat,labels=food$Country, cex=1.1) | |
text(eu.limits$lon,eu.limits$lat-1,labels=food$Country, cex=1) | |
# greMeat 클러스터와 비교하기 위해 greMeat.All 클러스터와 대상으로하는 지도를 출력 | |
plot(newMap, xlim=range(eu.limits$lon), ylim=range(eu.limits$lat), asp=1) | |
points(eu.limits$lon, eu.limits$lat, col=greMeat.All$cluster, pch=20, cex=2) | |
text(eu.limits$lon,eu.limits$lat-1,labels=food$Country, cex=1) |
--