#chapter4. 데이터 가공과 처리
# 교제 81p 부터 참고할 것
# 1. 외부데이터를 이용한 데이터 가공과 처리 - 파일 입출력을 활용
# 2. 데이터의 취득과 정재
#    - csv 파일을 이용하여 데이터 수집
#    - 결측값과 이상값을 분석

library(help=datasets)  # R에서 제공하는 기본 데이터 셋 
str(iris)
head(iris,10)  # 10 숫자 적어주면 숫자만큼 출력 / 반대로 tail()
summary(iris)  # 변수들의 기초 통계량
plot(iris)  # 시각적으로 보여주는 것
plot(iris$Petal.Width, iris$Petal.Length, col=iris$Species) # 품종을가지고 너비, 길이 

#3*3 행렬
x <- matrix(1:9,ncol = 3) # 3개의 열
x

# apply : 특정 영역을 대상으로 집계를 하는 함수
# apply (데이터 셋, 방향, 함수)
# 방향:  1 - 가로 방향으로 집계,  2 - 세로 방향으로 집계 
apply(x,1, sum)   # 가로 끼리의 합
apply(x,2,sum)    # 세로 끼리의 합

apply(iris[,1:4], 2, sum)  # [ , 1:4] : 행은 모두, 열은 품종을 제외한 1 ~ 4까지만 

# 데이터 수집
# 계산서 금액(total_bill), 팁 액수(tip), 계산한 사람의 성별(sex), 요일(day),
# 시간(time), 동석자수(size), 흡연자 포함여부(smoker)
tips <- read.csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv')
str(tips) #data.frame으로 되어있으며 7개의 변수를 가지고 있다는 뜻. 이것만을 가지고 우리가 알 수 있는 정보는 많이 없다. 
head(tips, 10) #위에 것 보다 조금 더 구체적으로 데이터를 보기 위해서 

# 탐색적 데이터 분석
summary(tips)
install.packages('dplyr')   # 보조 기억장치에 저장 / 막강한 함수, 데이터 추출에 사용, 함수 연결 연산자가 있어서 사용용
install.packages('ggplot2')  # r에서 지원하는 시각화는 그래프를 좀 더 고퀄로
library(dplyr)
library(ggplot2)  # 주기억장치에 저장 

# 동석자수(size)
plot(tips$size)  # 기본 동그라미로 그려진 그래프
plot(tips$size, type='l')  # 꺽은선 그래프

# dplyr 가 가진 강력한 함수 연결 
tips %>% ggplot(aes(size,color=sex))+geom_histogram(fill="white") # 배경담고, line그리고 싶으면 line, 히스토그램으로 그리고 싶으면 historam
# %>% : 함수 연결 

# 계산서 금액에 따른 팁 액수
# tips %>% ggplot(aes(total_bill : x축,tip : y축)) 만 하면 그래프 없음
# aes () : 옵션
tips %>% ggplot(aes(total_bill,tip)) + geom_point(aes(col=day))  #상관관계 나타내는 삼전도 나타냄

#성별에 따른 경향을 추가한다.
# pch : 그래프에 나타나는 모양, 동그라미냐 네모냐 세모냐
tips %>% ggplot(aes(total_bill,tip)) + geom_point(aes(col=day, pch=sex, size=3))


# 데이터 분석 - 테이블 형태로 읽어옴 / 머리글 설정 
students <- read.table("C:/R_project/studio/student.txt", header = T)
students
str(students)

#/ stringAsFactor=F : 문자열 포함하여 팩터로 읽지 마세요  
# factor -> char로 변경
students <- read.table("파일 경로/student.txt", header = T, stringsAsFactor=F)
str(students)

# as.is = T :  요인이 문자열로 해석되길 바랄 경우 T, stringsAsFactor=F와 같은 개념
# NA(결측값)을 문자열로 오해하지 않도록 설정하는 작업
students<-read.table("파일 경로/student.txt",header=TRUE,stringsAsFactors = FALSE,na.strings = "NA")
str(students)

students<-read.table("파일 경로/student.txt",header=TRUE,as.is=T,na.strings="NA")
str(students)

#doBy 패키지
#install.packages('doBy')
library(doBy)

.libPaths() # 현재 라이브러리가 저장된 위치를 확인하는 함수

quantile(iris$Sepal.Length) # 4분위수 -> 평균에서 퍼저있는 모양 볼려고

# 10분위 수  
quantile(iris$Sepal.Length, seq(0,1, by=0.1))

# 정렬
head(orderBy(~Sepal.Width, iris)) # sepal.width를 정렬하여 보여줌
head(orderBy(~Species+Sepal.Width ,iris)) # 여러 항목을 기준으로 정렬하기

# 랜덤 샘플링( 기본값: 중복을 허용하지 않음)
sample(1:10, 5 )  # 1에서 10 범위 안에 5개 숫자를 무작위로 추출해주세요 

sample(1:10, 5, replace = T)  # 중복 허용하여 추출
sample(1:10,10)
sample(1:45, 6)
str(iris)
# nrow(데이터셋) : 데이터 셋의 행의 수
head(iris[sample(nrow(iris), nrow(iris)),],10)  
# 앞에 추출할 데이터, 뒤에 원본 데이터
# iris 앞에서 6개 데이터 가져올 것이다. sample로 섞여있는 데이터 

# split(데이터, 분리조건)
split(iris, iris$Species)   # 품종별로 분류해라

# split : 전체 부분에서 일부 자르는 것
# subset : 특정 부분에서 일부 자르는 것

head(subset(iris,Species=='virginica')) # 앞에서 부터  6개의 데이터 가져오세요 / 품종이 virginica인 데이터
head(subset(iris,Species=='virginica' & Sepal.Length > 5.0))  # 두개 이상 조건 줄 때 &로 연결

#merge: 두 데이터 프레임에서 공통된 값을 기준으로 묶는 함수
x <- data.frame(name=c("aaa","bbb","ccc"), korean=c(90,100,95))
y <- data.frame(name=c("ccc","bbb","aaa"), english=c(90,95,100))
merge(x,y)

# 그룹 함수
# aggregate(그룹 조건, 데이터 셋, 함수)
aggregate(Sepal.Width~Species,iris,mean)

students <- read.table("파일 경로/student.txt", header=T, as.is=T)
students

# 파생변수,average = korean+english+math
students$average <- (students$kor+students$eng+students$math)/3
students

# 결측값 처리
test<-c(15,20,30,NA,45)
test

# 변수명[행, 열]
test[test<40]

# 3의 배수가 아닌 값만 추출
test[test %% 3 != 0]

#is.na() : 결측값입니까? true, false
test[is.na(test)]
# 결측값 제외 
test[!is.na(test)]

# 2의 배수이면서 na가 아닌 요소값만 출력하세요
test[!is.na(test) & test%%2==0]

# 데이터 프레임형태의 자료형을 이용하여 결측값을 제거하는 작업
members <-data.frame(name=c("길동","춘향","철수","영희"), age=c(13,11,22,23),
                      gender = c("M","F","M","F"))
members

# 성별이 여성인 경우만 추출 
# 데이터셋[형 조건식, 열 조건식] -> 행의 조건만 있고 전체 출력이라 열은 , 만
members[members$gender=="F",]

# 20살 미만인 남성만 출력
members[members$gender=="M" & members$age<20,]

# 데이터 정제
# 1. 결측값 처리
# is.na() 결측값 있으면 t, 아니면 f
# na.omit() : 결측값이 들어있는 행 제거
# na.rm() : T일 때 결측값을 제거하고 추출하세요 / 결측값 제거하고 통계함수 계산
# 2. 이상치값 처리

install.packages("gapminder")
# 스웨덴 비영리단체에서 만든 통계 분석 서비스
# 1952년부터 2007년까지 5년간격으로 여러나라의 인구, 1인당 gdp, 기대 수명 등
library(gapminder)
str(gapminder)

# 각 나라의 기대 수명 -> 열정보 가져오는 것 / 여러개 넣을 때는 c
install.packages("dplyr")
library("dplyr")
gapminder[,c("country","lifeExp","year")]
# 크로아티아 나라의 기대수명과 년도 보기
gapminder[gapminder$country== "Croatia",c("country","pop")]

# croatia의 1990년도 이후의 기대수명과 인구를 추출하세요
gapminder[gapminder$country== "Croatia" & gapminder$year>=1990,c("lifeExp","pop")]

# apply : 특정 영역을 대상으로 집계를 하는 함수
# apply (데이터 셋, 방향, 함수)
# 방향:  1 - 가로 방향으로 집계,  2 - 세로 방향으로 집계 
apply(gapminder[gapminder$country== "Croatia" & gapminder$year>=1990,c("lifeExp","pop")], 2, mean)

# gaminder 데이터 셋의 관측 자료 중 대한민국 인구의 최댓값과 해당 년도 출력
apply(gapminder[gapminder$country=="Korea, Rep.",c("year","pop")],2,max)
# 2007 년 아시안 대륙의 인구 총합
apply(gapminder[gapminder$continent== "Asia" & gapminder$year==2007, "pop"],2, sum)


# dplylr 라이브러리 - select(특정열을 추출할 때), filter(특정 행을 추출할 때)
# 연결 연산자 %>%  (단축키 : ctrl+shift+m)
select(gapminder, country, lifeExp, pop)
filter(gapminder, country == "Croatia")

# 전체 인구의 평균 
mean(gapminder$pop)

#summarize
summarize(gapminder, pop_mean=mean(pop))

# 대륙별 인구 평균 - group_by를 통해 대륙을 그룹으로 묶음 
summarize(group_by(gapminder, continent), pop_mean=mean(pop))

# 대륙별 각 나라의 인구의 평균을 계산하여 추출하시오
summarize(group_by(gapminder,continent, country), avg=mean(pop))

gapminder %>% group_by(continent, country) %>% summarize(avg_pop = mean(pop))

# croatia 나라의 국가이름, 년, 기대수명을 골라 평균 수명 구하는 것
temp <- filter(gapminder,country =="Croatia")
temp2 <- select(temp, country, year, lifeExp)
temp3 <- apply(temp2[,"lifeExp"],2, mean)
temp3

gapminder %>% filter(country=="Croatia") %>%  select(country, year, lifeExp) %>% summarize(mean_lifeExp=mean(lifeExp))


# plot[ y축 데이터, 옵션]
# plot[x축 데이터, y축 데이터, 옵션]
y <- c(1,1,2,2,3,3,4,4,5,5)
plot(y)

x <- 1:10
y <- 1:10
plot(x,y,xlim = c(11,0))  # 옵션 중에 xlim = : x축 눈금 lim : limit

x <- c(1,3,2,4,6,5,7,6,9)
plot(x, main = "Simple Time Series", sub = "그래프1", type="b", lty="dashed")

# type 옵션
# #“p”   점으로
# #“l”   선으로
# #“b”   점과 선 둘다 동시에
# #“o”   점과 선 둘다 동시에 (단 겹쳐짐 : overplotted)
# #“h”   히스토그램과 비슷한 형태로 (histogram)
# #“s”   계단모양으로 (stair steps)
# #“S”   계단모양으로 (upper stair steps)
# #“n”   좌표찍지 않음
# lty = 0, lty = "blank" : 그리지 않음
# lty = 1, lty = "solid" : 실선 (기본값)
# lty = 2, lty = "dashed" : 대시
# lty = 3, lty = "dotted" : 점
# lty = 4, lty = "dotdash" : 점과 대시
# lty = 5, lty = "longdash" : 긴 대시

x <- runif(100) # 난수 생성
y <- runif(100)

plot(x,y,pch=ifelse(y>0.5, 1,18),col="red")

x <- c(1,3,6,8,9)
y <- c(12,56,78,32,9)
plot(x,y)

# 화살표 그리기
arrows(3,56,1,12)

# 사각형 그릴려면 시작은 왼쪽 아래, 오른쪽 위
rect(4,20,6,50)  
rect(4,20,6,40, density = 5)  

# 그래픽 텍스트
text(4,40,"이것은 샘플입니다.")

# size = 1: 아랫쪽, 2 : 왼쪽, 3 : 위 4 : 오른쪽
mtext("상단의 문자열입니다.",side=3)

aaa <- c(250,300,250,280,310)
bbb <- c(180,200,210,190,170)
ccc <- c(210,250,260,210,270)

# axes : 기본 T, F 하면 테두리 사라짐 / x, y축을 표시하지 않습니다. 
# ann : 기본 T, F 하면 x축과 y축 라벨 사라 짐 /  x, y축 제목을 지정하지 않습니다
plot(aaa, type="o", ylim=c(0,400), col="red", axes = F, ann=F)
axis(1, at=1:5, lab=c("a","b","c","d","e")) # 축의 라벨 1 : x축 / 위에 다 f로 주고 실행해야 함
axis(2, ylim=c(0:400))
title(main="Sample Graph", col.main="red")
title(xlab = "DAY", col.lab="black")
title(ylab = "values", col.lab="blue")

lines(bbb,type="o",col="green", lty=2, pch=21)
lines(ccc, type="o", col="blue", lty=2, pch=11)

# legend(x, y, 범례 담을 내용 ) : 범례
legend(4,400,c("BaseBall","SoccerBall","BeachBall"), col = c("red", "green","blue"),lty=1:3,pch=13)

# r의 내장 데이터 cars의 데이터를 이용한 분석
# 1920년대에 수집된 데이터 셋
# 50대의 차량으로 부터 speed와 dist(제동거리) 두 변수 측정
str(cars)

# 산점도(산포도) : 두 변수 사이의 ㅣ상관관계를 점으로 표현한 그래프
# pch=1, col="red", 속도와 제동거리 비교
plot(cars$speed, cars$dist, main="속도와 제동거리의 상관관계", xlab="속도", ylab="제동거리",pch=1, col="red")

# 선 그래프 - 시간의흐름에 따라 데이터의 흐름 달라지는 데이터(시계월) -> 막대 그래프로 표현 하는것이 효율적
plot(cars$speed, cars$dist, main="속도와 제동거리의 상관관계", xlab="속도", ylab="제동거리",pch=1, col="red", type="l")

#시계열 그래프/ 자료형 (time series)
#시간의 순서에 따라 자료가 정렬되어 있는 형
# 1871년부터  1970년까지의 연동별 나일강의 유량을 기록하고 있는 시계열 데이터
Nile
str(Nile)


# 나일강의 유량을 그래프로 표시하시오
# main="나일강의 연도별 유량 변화"
# xlab="연도" ylab="유량"

plot(Nile, type="l",main="나일강의 연도별 유량 변화", xlab="연도", ylab="유량", col="red")
# 1. 산점도(산포도)
#  - x축과 y축에 점으로 표현한 그래프
#  - 연속 값으로 된 변수의 관계를 쵸현할 대 사용
# 2. 막대그래프(히스토그램)
#  - 데이터 크기를 막대로 표현한 그래프
#  - 집단간의 차이를 표현할 때 주로 사용
# 3. 선 그래프
#  - 시간에 따라 달라지는 데이터를 표현할 때 
#  - 시계열 데이터라고 부름
# 4. 상자수염 그래프
#  - 데이터의 분포를 직사각형의 상자 모양으로 표현하는 그래프
#  - 평귬나 볼때보다 데이터의 특성을 잘 나타낼 수 있다.

# 막대 그래프
x <- c(1,2,3,4,5,6)
barplot(x, names="매출")

# 복잡한 형태의 막대그래프로 표현하는 작업
#xx <- matrix(1:10, dim=c(3,2))
xx <- matrix(c(1,2,3,4,5,6), 3,2)
xx 
barplot(xx) # -> 누적 막대 그래프
barplot(xx,beside = T, names=c("korea","china")) # -> 누적 하지 말고 세워서 그리기

# 시즌 별(a,b,c,d,e) 
# aaa : baseball판매현황
# bbb : Soccer
# ccc : BeachBall

barplot(aaa, main="BaseBall 판매량", xlab="Season", ylab="판매량", names.arg=c("A","B","c","D","E"),density=c(10,20,30,40,50))

Ball_type <- matrix(c(aaa,bbb,ccc),5,3)
Ball_type
barplot(Ball_type, main="Ball Type별 시즌 판매량",xlab="Ball Type",
        ylab="매출",beside=T,names.arg=c("BaseBall","SoccerBall","BeachBall"),
        col=rainbow(5), ylim=c(0,400))
legend(10,400,c("BaseBall","SoccerBall","BeachBall"), fill=rainbow(5))


# 2015년 인구 통계 자료 로딩
people <- read.csv("C:/Users/User/Desktop/Data/people/people2015.csv", header = F)
str(people)

# 성별을 라벨로, level은 1,2만 가지도록 -> 1일때 남자, 2일때 여자
people$V1 <- factor(people$V1,levels=c(1,2),labels = c("남자","여자"))
str(people)

people$V3 <- factor(people$V3, levels =1:14, 
                    labels = c("가구주", "가구주의 배우자", "자녀", "자녀의 배우자",
                               "가구주의 부모", "배우자의 부모", "손자녀, 그 배우자",
                               "증손자녀, 그 배우자", "조부모", "형제자매, 그 배우자",
                               "형제자매의 자녀, 그 배우자", "부모의 형제자매, 그 배우자","기타 친인척", "그 외 같이 사는 사람"))

people$V4 <- factor(people$V4, levels =1:8,labels=c("안받았음","초등학교","중학교","고등학교",'대학4년제미만','대학4년제이상','석사과정','박사과정'))
str(people)

# 출생아별 빈도표 생성
table_v5 <- table(people$V5)
table_v5

barplot(table_v5, main="출생아 빈도수", xlab="출생아수",ylab="빈도수")

table_v1 <- table(people$V1)
table_v1

table_v4 <- table(people$V1,people$V4)
table_v4

barplot(table_v4, main="성별에 따른 학력 분포",xlab="학력",ylab="성별",beside = T, ylim=c(1,70000), col=c("red","blue"),legend.text=T)
hist(people$V2, breaks=c(seq(0,90,10)),main="연령별 분포",xlab="연령",ylab="빈도수")

# 파이차트
T_sales <- c(210,110,400,550,700,450)
pie(T_sales)

pie(T_sales, init.angle = 90,col=rainbow(length(T_sales)))



student.txt
0.00MB

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

R공부_그래프, 함수  (0) 2019.07.18
R 공부_db연동, 그래프그리기  (0) 2019.07.18
R 공부_txt 파일 불러오기  (0) 2019.07.18
R공부_Day1_5. 제어문과 함수  (0) 2019.07.18
R 공부_ Day1_Data Frame  (0) 2019.07.18

+ Recent posts