본문 바로가기
프로그래밍/하루하루

빅데이터 5

by Luhie 2017. 7. 28.

BigData.7z



영화 마이너리티 리포트 한번보기!


분류 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)


# 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 군집화

--

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)

--



'프로그래밍 > 하루하루' 카테고리의 다른 글

빅데이터 4  (0) 2017.07.27
빅데이터 3  (0) 2017.07.26
빅데이터 2  (2) 2017.07.25