☆ 오늘 강의 요악 ☆
ggplot 관련 함수
geom_col( ) : 막대그래프 / x축과 y축 지정 필수
geom_bar( ) : 빈도수 그래프 / y축 지정안해도 자동으로 빈도수로 지정됨.
geom_line( ) : 선그래프 / 시간에 따른 데이터 변화를 나타낸다.
geom_point( ) : 산포도 / x축과 y축의 관계성을 나타냄
geom_smooth(method="lm") : 추세선 / 산포도에서 데이터가 어느방향으로 흘러가는지 보여줌
- method(lm = 선형회귀분석 / glm , gam, rlm 등 쓸 수 있음)
labs( ) : 각 타이틀의 이름을 지정할 수 있다.
qplot과 ggplot의 차이
qplot() : 문법간단, 주로전처리에서사용,데이터빠르게확인할때
ggplot() : 최종분석결과확인,다양한그래프가능,색크기폰트조절가능
막대 그래프 그리기
library(ggplot2)
library(dplyr)
# drv 종류별 hwy 평균구하기
mpg <- ggplot2::mpg
df_mpg <- mpg %>%
group_by(drv) %>%
summarize(mean_hwy=mean(hwy))
# 집단간의 차이를 알아보자 - 막대그래프
df_mpg
ggplot(data=df_mpg, aes(x=drv,y=mean_hwy))+
geom_col() # geom_col -막대그래프 함수
geom_col( ) 을 사용하면 막대그래프가 그려진다.
차트 정렬하기
reorder(df_mpg$drv, - df_mpg$mean_hwy)
# 차트 역순으로 정렬
ggplot(data=df_mpg, aes(x=reorder(df_mpg$drv, - df_mpg$mean_hwy),y=mean_hwy))+
geom_col()
빈도수 그래프 만들기
# 빈도수 차이를 나타내는 막대그래프
# y축은 기본적으로 count(발생빈도수), y축을 지정하지 않는다
ggplot(data=mpg, aes(x=drv)) + geom_bar()
ggplot에서 y축을 지정하지 않으면 자동으로 y축이 빈도수가 된다.
geom_bar를 사용
geom_col은 x축과 y축이 모두 지정되어야 한다 !!
mpg 자료 활용하기
suv 차종의 기업별 cty 평균 그래프 만들기
# suv 차종의 기업별 cty 평균 그래프 만들기
m2<- mpg %>% filter(class=="suv") %>%
select(manufacturer, cty) %>%
group_by(manufacturer) %>%
summarize(mean_c=mean(cty)) %>%
arrange(desc(mean_c)) %>%
head(5)
# 막대 그래프 만들기
ggplot(data=m2, aes(x=reorder(manufacturer, -mean_c),
y=mean_c)) + geom_col(aes(fill=manufacturer))
빈도수 그래프 만들기
ggplot(data=mpg,aes(x=class)) + geom_bar(aes(fill=class))
y축을 지정하지 않고, geom_bar를 쓰면 쉽게 만들 수 있다 !
선그래프 만들기
economics<- ggplot2::economics
ggplot(data=economics, aes(x=date, y=psavert)) + geom_line()
geom_line()을 사용하면 선그래프가 만들어진다.
산포도 그래프 그리기
산포도 ?
점으로 x축과 y축의 관계성을 나타낸 것
다이아몬드의 캐럿과 가격의 관계를 산포도 / 추세선 그리기
# 다이아몬드의 캐럿과 가격의 관계를 산점도로
dia <- ggplot2::diamonds
ggplot(data=dia, aes(x=carat, y=price)) +
geom_point(aes(colour=cut)) + geom_smooth(method="gam")
geom_point 를 사용하면 산포도를 그릴 수 있다.
geom_smooth를 사용하면 ggplot에서 추세선을 추가 할 수 있다.
추세선 ?
산점도에서 어느 방향으로 데이터가 흘러가는지 보여주는 선
타이틀 설정하기 / 범위 정하기
g <- ggplot(midwest, aes(x=area, y=poptotal)) +
geom_point() +
geom_smooth(method='lm') +
coord_cartesian( xlim=c(0,0.1), ylim=c(0,1000000)) +
labs(title="지역 vs 인구",
subtitle = "미국동부중앙",
y="인구", x="지역",
caption="중동부지역 지도")
ggplot은 plot과 마찬가지로 xlim, ylim을 이용해 그래프의 범위를 정할 수 있다.
labs( ) 함수를 이용하여 각 타이틀의 이름을 지정할 수 있다.
데이터 분석하기
설문조사 결과를 분석해보자
install.packages("foreign")
library(foreign)
library(dplyr)
library(ggplot2)
# 한국인을 조사한 데이터 가져오기
raw_welfare <- read.spss(file="f:/r_workspace/Data/Koweps_hpc10_2015_beta1.sav",
to.data.frame = T)
class(raw_welfare)
# sav 파일을 csv파일로 바꿔서 저장
write.csv(file="f:/r_workspace/Data/welfare.csv", raw_welfare, fileEncoding = "cp949")
welfare <- raw_welfare
# 데이터의 코드가 뭔지 가져오기
setwd("f:/r_workspace/Data")
codebook <- read.csv(file="Koweps_Codebook.csv",
fileEncoding = "cp949")
View(codebook)
View(welfare)
# code의 항목별 이름 쉽게 바꾸기
welfare <- rename(welfare,
gender =h10_g3,
birth =h10_g4,
marriage = h10_g10,
religion=h10_g11,
income=p1002_8aq1,
code_job = h10_eco9,
code_region=h10_reg7)
남녀 성비 알아보기
# 쓸 자료만 골라오기
welfare <- welfare %>%
select(gender,birth,marriage,religion,income,code_job, code_region )
class(welfare$gender)
table(welfare$gender)
성별이 1과 2로 분리되어 있다.
#내장된 변수의 경우 작동안됨
attach(welfare)
# gender는 factor 타입으로 분석(연속된값이아니기때문)
# 빈도표, table, bar_chart 중요
welfare$gender <- as.factor(welfare$gender)
levels(welfare$gender)
gender는 연속된 값이 아니고, 남 여로 나눠지는 값이다.
빈도표를 만들기 위해 factor 타입으로 바꿔준다.
#현재 데이터는 입력이 잘되어서 에러가 발생하지 않고 있다
welfare$gender <- ifelse(welfare$gender=="9", NA, welfare$gender)
table(is.na(welfare$gender ))#잘못된 데이터가 없다
코드를 보니, 성별에서 9는 "무응답"이였다. 9를 찾아서 NA로 값을 바꿔준다.
그리고 잘못된 데이터가 있는지 체크해본다.
welfare$gender <- ifelse(welfare$gender==1, "male", "female")
qplot(welfare$gender)
qplot 으로 간단한 그래프를 만들었다.
code를 보고, gender가 1이면 male, 아니면 female로 성별을 구분하였다.
ggplot(data=welfare, aes(x=gender)) +
geom_bar(aes(fill=gender))
ggplot으로 더 이쁜 빈도수 그래프를 만들었다 !
ggplot을 이용하면 더 세세하고, 이쁜 그래프를 만들 수 있다.
성별 평균 연봉 그래프 만들기
# 연봉 데이터 가져오기
m1 <- welfare[ welfare$gender=="male", c("gender", "income")]
f1 <- welfare[ welfare$gender=="female", c("gender", "income")]
# 평균 연봉 구하기
m1.mean = mean(m1$income, na.rm=T)
f1.mean = mean(f1$income, na.rm=T)
# 행에 m1.mean, f1.mean 추가
data <- rbind( m1.mean, f1.mean)
#열에 "male", "female" 데이터 추가
data <- cbind( c("male", "female"), data)
data
# 행 이름 0, 1로 바꾸기
rownames(data)<-c(0,1)
class(data)
# 데이터프레임으로 타입 바꾸기
d1 <- as.data.frame(data)
d2 <- data.frame(gender=c("male", "female"), gender_income=c(m1.mean, f1.mean))
ggplot(data=d1, aes(x=V1, y=V2)) + geom_col()
ggplot(data=d2, aes(x=gender, y=gender_income)) + geom_col()
omg 왜 연봉차이가 저렇게날까?
#dplyr을 사용하자
w1 <- welfare %>%
select(gender, income) %>%
group_by(gender) %>%
summarise(mean_income = mean(income, na.rm=T), )
w1
dplyr을 사용하면 한번에 두 성별의 연봉 평균을 구할 수 있다 !
몇살에 최고 연봉을 받을까?
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))
전처리에서 가장 먼저 해야할일 = 무응답 없애기 !!
# 나이를 구하기 위해 2022에서 태어난 년도를 빼고 1을 더한다
welfare$age<- 2022-welfare$birth+1
# 나이별 평균 연봉 추출해서 정렬하기
a <- welfare %>% filter(!is.na(income)) %>%
group_by(age) %>%
summarize(mean_income=mean(income)) %>%
arrange(desc(mean_income))
나이별 평균 연봉이 잘 나온 모습
ggplot(data=a, aes(x=age,y=mean_income)) + geom_line()
60 후로 정년 퇴직 때문인지, 훅 떨어지는 모습이 보인다.
~ 오늘 강의 후기 ~
저번 시간에 배운 기본 plot에 이어서, ggplot으로 다양한 그래프를 만들 수 있다는 것을 배웠다.
그리고 데이터를 직접 분석해보았다.
나중에 이 분야에서 취업을 한다면, 실질적으로 이런일을 하겠구나 라는 느낌이 왔다.
나는 다양한 그래프를 만들어 보는게 좋았다 !
※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우
'R > 강의복습' 카테고리의 다른 글
[22.08.18] 8일차(wordclou2/정규식/문자열/gsub/grep/substring) (0) | 2022.08.21 |
---|---|
[22.08.17] 7일차 텍스트마이닝 / 워드클라우드만들기 (0) | 2022.08.21 |
[22.08.12] 5일차 차트그리기(plot, barplot, pie) (0) | 2022.08.20 |
[22.08.11] 4일차 강의(arrange / filter / select / mutate / summarize / group_by / join / is.na / na.rm) (0) | 2022.08.14 |
[22.08.10] 3일차 ( 함수만들기 / ls / rm / head / table / order / rename / function / sapply ) (0) | 2022.08.14 |