Date:     Updated:

카테고리:

태그: ,


💡 R을 처음 배우기 위해 공부한 책입니다. 책에서 공부한 내용을 정리하고, 이를 기반으로 직접 문제를 만들어 풀이해보는 식으로 학습했습니다. KBO, MLB 야구 기록들을 csv 파일로 크롤링하여 문제에 사용했고, 야구 데이터 패키지인 Lahman을 토대로 문제를 만들기도 했습니다.


책 소개

Do it! 쉽게 배우는 R 데이터 분석


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)

Untitled 2

나름의 선형관계를 보이고 있다.



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()

Untitled 4



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 데이터의 drvhwy를 상자 그림으로 나타내보자.

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개)이 극단치로 눈에 띈다.


태그: ,

카테고리:

업데이트: