R/강의복습

[22.08.16] 6일차 (ggplot, 산포도, 막대그래프, 선그래프, 데이터분석하기, 전처리)

peach_h 2022. 8. 21. 18:20
☆ 오늘 강의 요악 ☆

 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 데이터 분석 / 저자 : 김영우