#-----------------------------------------------------------------------------------
# db연동 oracle과 연동

install.packages("rJava")
install.packages("DBI")
install.packages("RJDBC")

library(rJava)
library(DBI)
library(RJDBC)
library(dplyr)

drv <- JDBC("oracle.jdbc.driver.OracleDriver","파일 경로/ojdbc6.jar")
# DB connect
conn <- dbConnect(drv, "jdbc:oracle:thin:@//localhost:1521/(xe/orcl 맞는 것으로)", "id", "password")
#쿼리 입력
rst <- dbGetQuery(conn, "SELECT * FROM SCORE")
#출력
rst



# 77page
score <- c(80,60,70,50,90)
score

mean(score)
avg <- mean(score)
avg

# 88page
fruit <- data.frame(제품 = c("사과","딸기","수박"),
                      가격 = c(1800,1500,3000),
                      판매량 = c(24,38,13))
fruit
avgprice <- mean(fruit$가격)
avgcell <- mean(fruit$판매량)
avgprice
avgcell


#R과 mysql 연동
install.packages("rJava")
install.packages("DBI")
install.packages("RMySQL")
library(rJava)
library(DBI)
library(RMySQL)

#db connection
conn <- dbConnect(MySQL(),user="root",password="mysql비밀번호",dbname="db이름")

#db list 출력
print(dbListTables(conn))

score <- dbGetQuery(conn, "select count(*) from score")
score

#테이블 필드 목록
dbListFields(conn, "score")

# 테이블에 레코드를 삽입하는 작업
dbSendQuery(conn,"insert into score value (6,85,95,100)")

score <- dbGetQuery(conn, "select * from score")
score

# DDL(정의어) : CREATE , ALTER, DROP
# DML(조작어) : SELECT, DELETE, UPDATE, INSERT
#   execQuery() -> 테이블 바꾸지 않고 데이터 가져오는 것
#   execUpdate() -> 테이블의 내용이 바뀔 수 있는 것
# DCL(제어어) : GRANT(권한부여), REVOKE(권한제거), COMMIT(성공적인 종료), ROLLBACK(비정상정 종료)

dbGetQuery(conn, "update score set math = 90 where student_no = 6")

#dbDisconnect(conn) -> db연결 종료

# RMySql 패키지
# sqldf
install.packages("sqldf")
install.packages("chron") # 라이브러리 할 필요 없음

library("sqldf")

# sql문을 사용할 수 있도록 해주는 것 
detach("package:RMySQL", unload=TRUE)  
# RMySQL 이 메모리에서 제거되지 않으면 실행이 안될수도 있기 때문에 꺼줄때 사용하는 구문.
sqldf("select * from iris")

# 문제1
# setosa에 속하는 데이터에서 sepal.length의 평균 계산
sqldf('select avg("Sepal.Length") from iris where "Species"="setosa"')

# 문제2
# 각 품종별 sepal.length의 평균 구하시오
# db에는 . 쓸수있는데 여기선 _ 로 사용
sqldf('select avg("sepal.length") from iris group by species')

#apply(행렬 or 데이터, 방향, 함수)
# 방향 - 1 행, 2 열
d <- matrix(1:9, ncol = 3)
d

apply(d, 1, sum)
apply(d,2,sum)

head(iris)
apply(iris[,1:4], 2, sum )
# 위와 같은 뜻
colSums(iris[,1:4])

# lapply(벡터 or 리스트, 함수) : l은 list 약자
# 이때 x는 벡터, 데이터프레임, 리스트이고, 
# 함수는 x내 각 요소에 적용할 함수이다. 
# lapply()함수의 결과는 리스트로 반환된다.
# lapply()는 인자로 벡터를 받을 수 있다.
# 1~3까지의 숫자에 2를 곱한 값들을 리스트로 만든다.
result <- lapply(1:3, function(x){x*2})
result
class(result)  # 리스트 형태
#리스트 형태를 벡터로 변환하는 작업
class(unlist(result))  # numeric

x <- list(a=1:3, b=4:6)
x
lapply(x, mean) # -> list
lapply(x,sum)

# 평균 구하는 함수
colMeans(iris[,1:4])  #-> numeric

# sapply() 는 lapply()와 비슷하지만 행렬, 벡터등으로 결과를 반환함
lapply(iris[, 1:4], mean)   
sapply(iris[, 1:4], mean)
is.vector(sapply(iris[, 1:4], mean)) # vector

y <- sapply(iris[, 1:4], mean)
as.data.frame(y) # 데이터 프레임으로 변환
as.data.frame(t(y))

split(iris, iris$Species)
lapply(split(iris$Sepal.Length, iris$Species), mean) # 품종별로 sepal.length의 평균 구함 # list
sapply(split(iris$Sepal.Length, iris$Species), mean) #vector

#그래프
#R에서 사용되는 그래픽스 기능은 크게 graphics,lattice,ggplot 패키지가 있다

#1.graphics 패키지
#R에서 가장 기본이 되는 시각화 기능을 지원한다
#전체 함수의 목록은 library(help="graphics")

#산점도(산포도)
methods("plot")

install.packages("mlbench")
library(mlbench)

data(Ozone)
?Ozone


#축이름(xlab,ylab)
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone")

#점의 종류(pch)
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone",pch=20)
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone",pch="+")

#점의 크기(cex)
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone",pch=20,cex=1) 

#색상(col)
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone",pch=20,cex=1,col="red") 

# 좌표측 값의 범위(xlim, ylim)
# c(최솟값, 최댓값)
max(Ozone$V8)
max(Ozone$V8, na.rm=TRUE)  # 결측값 제거하고 최댓값 구하라
plot(Ozone$V8, Ozone$V9, xlab="Sanburg Temperature", ylab="어느도시 온도", main="Ozone",
     xlim=c(0,100), ylim=c(0,90))


# type - 그래프의 종류, p(점), l(선), b(점과 선)
data("cars")
str(cars)
head(cars)
# cars를 그리기
plot(cars, type="o", cex = 0.5)

# 같은 주행속도에 대해 두개이상의 제동거리를 가지고 있다
#  tapply(벡터, 요인, 함수) : 요인(factor) 변수를 기준으로 해서 그룹별로 나누어서 통계 분석을 하고자 할 때 유용하게 쓸 수 있는 함수입니다
# speed별로 묶어서 dist의 평균 계산

plot(tapply(cars$dist, cars$speed, mean), type = "o", xlab="speed", ylab="dist")

# 그래프 배열(mfrow)  : 그래프 여러개 그리기

# par( )를 호출하면 이전에 저장된 par 설정이 반환된다. 따라서 par(mfrow=c(nr, nc)) 호출 시
# 반환 값을 opar 변수에 저장했다가 코드의 마지막에서 par(opar)를 호출하면, mfrow 지정 이전
#의 par 설정으로 환경을 되돌릴 수 있다.

opar <- par(mfrow=c(1,2))  # 그래프를 nr개의 행, nc개의 컬럼으로 배열한다.
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone1",pch=20,cex=1,col="red")
plot(Ozone$V8,Ozone$V9,xlab="Sanburg Temperature",ylab="ElMonte Temperature",
     main="Ozone2",pch=20,cex=1)
par(opar)

# 지터 jitter : 데이터 값에 약간의 노이즈를 추가하는 방법을 말한다.
# 노이즈를 추가하면 데이터 값이 조금씩 움직여서 같은 값을 가지는 데이터가 
# 그래프에 여러 번 겹쳐서 표시되는 현상을 막아준다.

Ozone[,]

plot(Ozone$V6, Ozone$V7, xlab="Windspeed", ylab="Humidity", main="Ozone", pch=20, cex=.5)
plot(jitter(Ozone$V6), jitter(Ozone$V7), xlab="Windspeed", ylab="Humidity", main="Ozone",pch=20, cex=0.5)

# points() : 이미 생성된 plot에 점을 추가하여 그리는 옵션
# 처음꺼 위에 다음꺼 추가하고 싶을 때 라벨이나 상단 제목 제외
plot(iris$Sepal.Width, iris$Sepal.Length, cex=0.5,
     pch=10, xlab="width", ylab="length", main="iris1")
points(iris$Petal.Width, iris$Petal.Length, cex=0.5,
     pch="+", col="red")

# lines( )는 points( )와 마찬가지로 plot( )으로
#새로운 그래프가 시작된 뒤 그 위에 꺾은선을 추가하여 그리는 목적으로 사용한다

x <- seq(0, 2*pi, 0.1)
y <- sin(x)
plot(x, y, cex=.5, col="red")
lines(x, y)

example(lines)


# abline( )은 y = ax + b 형태의 직선이나 y=h 형태의 가로로 그은 직선 
# 또는 x=v 형태의 세로로 그은 직선을 그래프에 그린다. abline( )이 그리는 것은 
# 꺾이지 않고 그어진 일직선이다. 따라서 lines( )가 주어진 (x, y) 좌표들을 연결하는
# 꺾은선을 긋는 것과는 차이가 있다.

plot(cars, xlim=c(0, 25))
abline(a=-5, b=3.5, col="red")

# 선의 유형(linetype, lty)
# a & b : 함수식 y=a+bx 에서 a는 절편, b는 기울기를 의미합니다.
# h : 수평선 위치를 나타냅니다.
# v : 수직선 위치를 나타냅니다.

plot(cars, xlim=c(0, 25))
abline(a=-5, b=3.5, col="red")
abline(h=mean(cars$dist), lty=2) # y=h 형태의 수평선을 그릴 때 지정
abline(v=mean(cars$speed), lty=2) # x=v 형태의 수직선을 그릴 때 지정 # 2는 dashed로 점선 의미

# 곡선 (curve) curve(표현식, 구간 시작점, 구간 끝점)
curve(sin, 0, 2*pi)

#문자열(text) : 그래프에 문자를 그리는데 사용하는 함수
#text(x좌표,y좌표,내용)
plot(cars,cex=0.5)
text(cars$speed,cars$dist, cex=0.5,pos=4)

# 그래프에 그려진 데이터의 식별(identify)
# 이 십자 커서로 그래프에서 특정 점을 클릭하면 클릭된 점과 가장 가까운 데이터에 레이블을 표시한다
plot(cars,cex=0.5)
identify(cars$speed,cars$dist)

# 범례 (legend)
# legend(x,y,option)
# bottomright, bottomleft,bottom,left,right,center,top, topleft, topright

plot(iris$Sepal.Width, iris$Sepal.Length, pch=20, xlab="width", ylab="length")
points(iris$Petal.Width, iris$Petal.Length, pch=43, col="#FF0000")
legend("topright", legend=c("Sepal", "Petal"), pch=c(20, 43),col=c("black", "red"), bg="gray")

# 행렬에 저장된 데이터 그리기(matplot, matlines, matpoints)
# matplot, matlines, matpoints
# -2pi ~ 2pi
x <- seq(-2*pi, 2*pi, 0.01)
x

y <- matrix(c(cos(x), sin(x)), ncol=2)  # -> cos, sin의 값을 그래프로 나타내기 위해
matplot(x,y,col=c("red","blue"),cex=0.1)
abline(h=0, v=0)  # 가운데 축 보여주기 위해

# 상자 그림(boxplot)
# 데이터의 분포를 보여주는 그림으로 가운데 상자는 제1사분위수, 중앙값, 제3사분위수9를 보여준다
# 상자의 좌우 또는 상하로 뻗어나간 선(whisker라고 부름)
# 그래프에 보이는 점들은 이상치outlier에 해당
boxplot(iris$Sepal.Width)
boxstats<- boxplot(iris$Sepal.Width)
boxstats<- boxplot(iris$Sepal.Width, horizontal = TRUE)
text(boxstats$out, rep(1, NROW(boxstats$out)), labels=boxstats$out, pos=c(1, 1, 1, 1))

sv <- subset(iris, Species=="setosa" | Species=="versicolor")  # or 연산
sv$Species <- factor(sv$Species)
boxplot(Sepal.Width ~ Species, data=sv, notch=TRUE) # 그래프 오목하게 그려짐 / subset이 비록 두 개의 Species만 선택하는 역할
# 그래프 꺽인 구간 -> 중 앙값에 대한 일종의 신뢰구간
# setosa와 versicolor의 notch가 겹치지 않으므로 이 두 그룹의 중앙값은 서로 다르다고 결론을 내릴 수 있다.

# 히스토그램 : 값의 범위마다 빈도를 표시한 그래프
x <- hist(iris$Sepal.Width)
x <- hist(iris$Sepal.Width, freq=T)
ㅐ

'R 프로그래밍' 카테고리의 다른 글

R공부_참고 사이트  (1) 2019.07.18
R공부_그래프, 함수  (0) 2019.07.18
R 공부_데이터 처리  (0) 2019.07.18
R 공부_txt 파일 불러오기  (0) 2019.07.18
R공부_Day1_5. 제어문과 함수  (0) 2019.07.18

+ Recent posts