[R] Do It R 5편 ggplot2로 그래프 만들기(산점도, 선그래프, 막대그래프, box plot)
카테고리: R
💡 R을 처음 배우기 위해 공부한 책입니다.
책에서 공부한 내용을 정리하고, 이를 기반으로 직접 문제를 만들어 풀이해보는 식으로 학습했습니다.
KBO, MLB 야구 기록들을 csv 파일로 크롤링하여 문제에 사용했고,
야구 데이터 패키지인 Lahman
을 토대로 문제를 만들기도 했습니다.
책 소개
08. 그래프 만들기
ggplot2
문법은 레이어 구조로 되어 있다. 먼저 배경(축)을 만들고, 그 위에 그래프(점, 막대, 선)을 그리고, 마지막으로 축 범위, 색, 표식 등을 설정하는 순서로 나뉜다.
08-1. 산점도(scatter plot)
1) 우선 배경을 만들어준다. data
에 사용할 데이터를 지정하고 aes
에 x축과 y축에 사용할 변수를 지정한다. 2) 그리고 그래프를 그려준다. +
기호를 이용해 그래프 유형을 지정하면 된다. 산점도는 geom_point()
이다. 3) xlim()
와 ylim()
으로 축 범위를 설정할 수도 있다. 축 시작값과 종료값을 쉼표로 나열하면 된다.
#1)
ggplot(data= mpg, aes(x=displ, y=hwy))
#2)
ggplot(data= mpg, aes(x=displ, y=hwy)) + geom_point()
#3)
ggplot(data= mpg, aes(x=displ, y=hwy)) +
geom_point() +
ylim(10, 30)
# +로 층층이 이어붙인다는 점에서 레이어 구조라는 것!
❓ 문제.
Lahman 패키지에서 whip와 ERA의 관계를 산점도로 나타내고자 한다. 샘플은 2010년 이후 기록으로, 30이닝 이상을 투구한 선수이다. 그래프 축을 적절히 설정하여 한 눈에 들어오도록 하자.
💡 답.
new_pitching <- Pitching %>%
mutate(whip = (BB+H)/(IPouts/3)) %>% #whip 변수가 없으므로 새로 만들어준다
filter(yearID>=2010 & (IPouts/3)>=30) #2010년 이후 자료, 30이닝 이상 선수만 추출
ggplot(data=new_pitching, aes(x=ERA, y=whip))+
geom_point()+ #산점도
xlim(0,10)+
ylim(0,3)
나름의 선형관계를 보이고 있다.
08-2. 막대 그래프
mpg 데이터를 이용해 drv(구동방식)별 평균 hwy 막대 그래프를 만들어보자. 평균 막대 그래프를 만들려면 우선 1)집단별 평균표로 구성된 데이터 프레임이 필요하다. 2)그리고 아까의 과정처럼 그래프를 만들자. 막대 그래프는 geom_col()
함수를 사용한다. 3)reorer()
를 사용하면 막대를 크기 순으로 정렬할 수 있다. 괄호 안에 x축 변수와 기준 변수를 넣고 -
기호를 붙이면 내림차순으로 정렬된다.
#1)
df_mpg <- mpg %>%
group_by(drv) %>%
summarise(mean_hwy = mean(hwy))
df_mpg
#2)
ggplot(data=df_mpg, aes(x=drv, y=mean_hwy)) +
geom_col()
#3)
ggplot(data=df_mpg, aes(x=reorder(drv,-mean_hwy), y=mean_hwy)) +
geom_col()
geom_bar()를 이용하면 빈도 막대 그래프를 만들 수 있다. 이 때 y축 없이 x축만 지정하면 된다. 만약 x축에 연속(continuous) 변수를 지정하면 값의 분포를 확인할 수 있다.
ggplot(data=mpg, aes(x=drv)) + geom_bar() #빈도 막대 그래프
ggplot(data=mpg, aes(x=hwy)) + geom_bar() #연속 변수
❓ 문제.
Lahman데이터로 2019년 MLB의 포지션별 빈도를 그래프로 그려보자.
💡 답.
Fielding_2020 <- Fielding %>%
filter(yearID == '2020') #2020년 자료만 추출
ggplot(data=Fielding_2020, aes(x=POS)) + geom_bar()
08-3. 선 그래프
시계열 데이터를 주로 선 그래프로 나타낸다. 선 그래프를 그리기 위해 ggplot2
패키지의 economics
데이터를 이용해보자. 선 그래프는 geom_line()
함수를 사용한다.
ggplot(data=economics, aes(x=date, y=unemploy)) + geom_line()
❓ 문제.
세기말을 대표하는 홈런타자 배리본즈와 마크맥과이어, 이 둘의 통산 홈런 시계열 그래프를 Lahman데이터로 그려보자. 둘의 그래프를 색깔을 달리하여 동시에 나타내라.
💡 답.
bonds <- Batting %>%
filter(playerID=='bondsba01') #본즈의 데이터만 추출
mcgwire <- Batting %>%
filter(playerID=='mcgwima01') #맥과이어의 데이터만 추출
bonds_mc <- bind_rows(bonds, mcgwire) #둘의 데이터를 세로로 결합
#group 매개변수로 그래프 나눌 기준 선정
#shape 매개변수로 모양 나눌 기준 선정
ggplot(data=bonds_mc, aes(x=yearID, y=HR, group=playerID, colour=playerID, shape=playerID)) +
geom_line() +
geom_point() #그래프 꼭짓점에 모양 추가
08-4. 상자 그림(Box Plot)
mpg
데이터의 drv
별 hwy
를 상자 그림으로 나타내보자.
ggplot(data=mpg, aes(x=drv, y=hwy)) + geom_boxplot()
❓ 문제.
2020 아메리칸리그의 팀별 홈런을 상자 그림으로 나타내라. 이 때 50타수 이상의 타자만을 대상으로 하라.
💡 답.
batting_2019 <- Batting %>%
filter(yearID=='2019'& AB>=50 & lgID=='AL')
ggplot(data=batting_2019, aes(x=teamID, y=HR)) +
geom_boxplot()
캔자스시티 솔레르와 에인절스 트라웃의 홈런 기록(48개, 45개)이 극단치로 눈에 띈다.