본문 바로가기

배운 책들 정리/만만한 통계 : R 활용

0228 만만한 통계 R 외부 챕터 8~9 - 그래프 만들기, 데이터 분석 프로젝트

0 지난 시간 복습

범주형 : 빈도표 (이상치 확인 후 결측치로 바꾸기)

연속형(최소,최대,평균,중앙값) : 요악통계

 

1 그래프 만들기 CP 8

1) 그래프 종류 1

- 산점도 : 변수 사이의 상관 관계를 확인

- 히스토그램 (연속형 변수) : 단일 변수의 분포를 보여주는 그래프. (데이터 모양과 산포를 식별하는데 도움이 됨)

(데이터를 간격으로 나눠 그래프의 막대는 각 간격의 관측치 수를 나타냄)

- 선그래프 : 시간 또는 기타 연속 간격에 따른 두 변수 간의 관계를 보여줌. 데이터 추세 또는 패턴을 파악하는데 용이함.

(시간 경과에 따라 데이터가 어떻게 변하는지)

- 상자수염그림 : 단일 변수의 데이터 범위, 중앙값, 사분위수 범위(IQR)을 보여줌. 상자는 중앙값을 나타냄.위스커는 데이터의 최소값과 최대값 또는 사용자가 정의한 특정 범위까지 확장됨.

 

*각각의 특징 요약

히스토그램은 빈도를 표시하는 데 유용합니다.

상자 및 수염 그림은 데이터의 분포를 보여주고 이상값을 식별하는 데 적합합니다.

반면에 선 그래프는 변수가 시간 또는 기타 연속 간격에 따라

어떻게 변하는지 보여주고 데이터의 추세를 식별하는 데 유용합니다.

 

* 위스커 : 상자 및 수염 플롯에서 확장되는 선을 의미함 (이상치에 해당 됨)

 

2) ggplot2 레이어 구조 이해하기 - 실습 1

# 그래프
library(ggplot2)
# 산점도
mpg <- as.data.frame(ggplot2::mpg)
ggplot(data=mpg, aes(x=displ, y=hwy))+ #배경 설정
  geom_point() # 기하학적 객체 설정 = 무엇을 그릴지 결정
# 꾸미기

mpg 데이터

 

 

3) x,y축 조정, xy축 조정

# x축 조정
ggplot(data=mpg, aes(x=displ, y=hwy))+ #배경 설정
  geom_point() + # 기하학적 객체 설정 = 무엇을 그릴지 결정
  xlim(3,6)
# 경고메시지 : 명령어가 실행되므로 무시해도 괜찮음, 하지만 참고해야 됨 = 그림에 표현 되지 않은 데이터가 있다는 내용
# y축 조정
ggplot(data=mpg, aes(x=displ, y=hwy))+ #배경 설정
  geom_point() + # 기하학적 객체 설정 = 무엇을 그릴지 결정
  ylim(20,40)

# x,y축 조정
ggplot(data=mpg, aes(x=displ, y=hwy))+ #배경 설정
  geom_point() + # 기하학적 객체 설정 = 무엇을 그릴지 결정
  xlim(3,6) +
  ylim(20,40)

x축 조정된 값 (xlim)
경고메시지 문제 생김 (그림에 표현도지ㅣ 않은 데이터가 있다는 내용)
y축 조정 (ylim)
x, y축 조정 (xlim) (ylim)

 

4) 문제 - xy축 조건식

# mpg 데이터와 midwest 데이터를 이용해서 분석 문제를 해결해 보세요.
# • Q1. mpg 데이터의 cty(도시 연비)와 hwy(고속도로 연비) 간에 어떤 관계가 있는지 알아보려고 합니다.x 축은 cty, y 축은 hwy 로 된 산점도를 만들어 보세요.
mpg <- (ggplot2::mpg)
ggplot(data = mpg, aes(x=mpg$cty, y=mpg$hwy))+
  geom_point()
# 우상향 곡선
# 상관계수
cor(mpg$cty, mpg$hwy)
# 상관분석
cor.test(mpg$cty, mpg$hwy)

# • Q2. 미국 지역별 인구통계 정보를 담은 ggplot2 패키지의 midwest 데이터를 이용해서 전체 인구와 아시아인 인구 간에 어떤 관계가 있는지 알아보려고 합니다. x 축은 poptotal(전체 인구), y 축은 popasian(아시아인 인구)으로 된 산점도를 만들어 보세요. 전체 인구는 50 만 명 이하, 아시아인 인구는 1 만 명 이하인 지역만 산점도에 표시되게 설정하세요

midwest <- (ggplot2::midwest)
ggplot(data = midwest, aes(x=poptotal, y=popasian))+
  geom_point() +
  xlim(0,500000) +
  ylim(0,10000)

1번
2번

# 상관계수
cor(midwest$poptotal,midwest$popasian)
# 상관분석
cor.test(midwest$poptotal,midwest$popasian)

추가로 상관계수까지

 

5) 막대 그래프 - 집단 간 차이 표현하기 

- 빈도분석 (범주형 데이터) geom_bar : 카이제곱의 차이 (두 범주 데이터 세트 간의 차이를 분석)

- 빈도가 아닌 다른 값 (t검정) geom_col : 평균의 차이 (이를 통해 그룹 간에 상당한 차이가 있는지 확인하여 기본 모집단에 대한 결론을 도출함)

 

6) 막대 그래프 실습

# 막대 그래프
# 데이터 준비
mpg <- as.data.frame(ggplot2::mpg)
# drv = 범주형 변수 => 빈도표
table(mpg$drv)
# 빈도 막대그래프 = 막대의 높이가 곧 빈도
ggplot(data = mpg, aes(x = drv))+
  geom_bar()
# cty = 연속형 변수 => 요약통계
summary(mpg$cty)
# 히스토그램
ggplot(data = mpg, aes(x = cty))+
  geom_bar()
  # 구간 수 설정(기본값이 30)
ggplot(data = mpg, aes(x = cty))+
  geom_bar(bins = 15)
  
# 빈도가 아닌 다른 값으로 막대그래프 그리기
# 데이터 전처리
library(tidyverse)
drv_hwy <- mpg %>% 
  group_by(drv) %>% 
  summarise(hwy_mean=mean(hwy))
drv_hwy
# 평균값으로 막대 그래프
ggplot(data=drv_hwy, aes(x=drv, y=hwy_mean))+
  geom_col()

ggplot(data = mpg, aes(x = drv))+ geom_bar()
ggplot(data = mpg, aes(x = cty))+ geom_bar()
ggplot(data=drv_hwy, aes(x=drv, y=hwy_mean))+ geom_col()
ggplot(data = mpg, aes(x = cty))+ geom_bar(bins = 15)

 

6) 막대 그래프 실습 2

# 막대 순서 조정
# 오름차순
ggplot(data=drv_hwy, aes(x=reorder(drv, hwy_mean), y=hwy_mean))+
  geom_col()
# 내림차순
ggplot(data=drv_hwy, aes(x=reorder(drv, -hwy_mean), y=hwy_mean))+
  geom_col()+
  xlab("drv") #x축 제목 설정

ggplot(data=drv_hwy, aes(x=reorder(drv, hwy_mean), y=hwy_mean))+ geom_col()
ggplot(data=drv_hwy, aes(x=reorder(drv, -hwy_mean), y=hwy_mean))+ geom_col()
ggplot(data=drv_hwy, aes(x=reorder(drv, -hwy_mean), y=hwy_mean))+ geom_col()+ xlab("drv") #x축 제목 설정

7) 막대 그래프 실습 문제

# mpg 데이터를 이용해서 분석 문제를 해결해 보세요.
# • Q1. 어떤 회사에서 생산한 "suv" 차종의 도시 연비가 높은지 알아보려고 합니다. "suv" 차종을 대상으로 평균 cty(도시 연비)가 가장 높은 회사 다섯 곳을 막대 그래프로 표현해 보세요. 막대는 연비가 높은 순으로 정렬하세요. 

mpg <- as.data.frame(ggplot2::mpg)
df <- mpg %>% 
  filter(class == "suv") %>% 
  group_by(manufacturer) %>% 
  summarise(mean_cty=mean(cty)) %>% 
  arrange(desc(mean_cty)) %>% 
  head(5)
  
  # 만든 데이터를 기반으로 막대 그래프 그리기
ggplot(data = suv_cty, aes(x=reorder(manufacturer, -cty_mean), y=cty_mean)) +geom_col()

# ggplot 사용 시 기본적으로 정렬 시 알파벳 순으로 정렬해줌
ggplot(data = df, aes(x=reorder(manufacturer, -mean_cty), y=mean_cty)) +geom_col()+
  xlab("manufacturer")+
  ylab("mean_cty")


# • Q2. 자동차 중에서 어떤 class(자동차 종류)가 가장 많은지 알아보려고 합니다. 자동차 종류별 빈도를 표현한 막대 그래프를 만들어 보세요

# 빈도표 작성
table(mpg$class)
# 빈도 막대 그래프
ggplot(data = mpg, aes(x = class))+
  geom_bar()

suv_cty

 

ggplot(data = suv_cty, aes(x=reorder(manufacturer, -cty_mean), y=cty_mean)) +geom_col()
table(mpg$class)
ggplot(data = mpg, aes(x = class))+ geom_bar()

8) 선 그래프

# 선그래프
economics <- as.data.frame(ggplot2::economics)
str(economics)

# 실업자 수로 선 그래프 그리기
# unemploy = number of unemployed in thousands
ggplot(data = economics, aes(x=date, y= unemploy))+
  geom_line()
# pce = personal consumption expenditures, in billions of dollars
ggplot(data = economics, aes(x = date, y = pce))+
  geom_line()
# pop = total population, in thousands // 소비양이 많아진다.
ggplot(data = economics, aes(x = date, y = pop))+
  geom_line()

 

str(economics)
geom_line()

9) 문제 1

# economics 데이터를 이용해서 분석 문제를 해결해 보세요.
# • Q1. psavert(개인 저축률)가 시간에 따라서 어떻게 변해왔는지 알아보려고 합니다. 시간에 따른 개인 저축률의 변화를 나타낸 시계열 그래프를 만들어 보세요

economics <- as.data.frame(ggplot2::economics)
str(economics)

# psavert = personal savings rate
ggplot(data = economics, aes(x=date, y= psavert))+
  geom_line()

# 상자그림 = 상자수염그림
mpg <- as.data.frame(ggplot2::mpg)
# 구동방식 별로 도시 연비가 어떻게 다른지에 대해서 상자그림으로 확인
ggplot(data = mpg, aes(x = drv, y = cty))+
  geom_boxplot()
# 이상치 확인
boxplot(mpg$hwy)$stats
# 12보다 작거나, 37보다 크면 이상치로 판단

geom_line
geom_boxplot

 

boxplot

 

10) 문제 2

# mpg 데이터를 이용해서 분석 문제를 해결해 보세요.
# •	Q1. class(자동차 종류)가 "compact", "subcompact", "suv"인 자동차의 cty(도시 연비)가 어떻게 다른지 비교해보려고 합니다. 세 차종의 cty를 나타낸 상자 그림을 만들어보세요.
mpg <- as.data.frame(ggplot2::mpg)
# class(자동차 종류)가 "compact", "subcompact", "suv"인 자동차 추출
css <- mpg %>% 
  filter(class %in% c("compact", "subcompact", "suv"))
ggplot(data = css, aes(x = class, y = cty))+
  geom_boxplot()
#

geom_boxplot()

 

 

2 데이터 분석 프로젝트 CP9

1) 분석 준비하기

- 한국복지패널데이터

- 건강보험청구(전국민건강보험)

- 국민건강영양조사

- 의료패널

- 가구조사 (가구원)

 

2) 분석 실습 - 로드 및 이름 변경

# 데이터 분석 프로젝트
# SPSS 파일 열기 위한 패키지 설치
install.packages("foreign")
library(foreign)
raw_data <- read.spss("./SpyderBD_01/data/Koweps_hpc10_2015_beta1.sav", to.data.frame = T)
# 데이터 전처리 과정 중에 데이터에 문제가 생기면
# 여기서부터 다시 시작
data <- raw_data
# 데이터 살펴보기
# View(data)
# 분석에서 사용할 변수 추출
welfare <- data %>% 
  select(h10_g3,
         h10_g4,
         h10_g10,
         h10_g11,
         h10_eco9,
         p1002_8aq1,
         h10_reg7
  )
head(welfare)
# 변수 이름 변경
welfare <- rename(welfare, 
                  sex = h10_g3,
                  birth_year = h10_g4,
                  marital_status = h10_g10,
                  religion = h10_g11,
                  job_code = h10_eco9,
                  income = p1002_8aq1,
                  rgion = h10_reg7)


head(welfare)
# 데이터 준비 완료

rename

 

2) 데이터 분석 절차 - 첫번째 주제 (성별에 따른 월급 차이)

# 데이터 분석 절차
# 1. 데이터 분석 주제 설정
# 2. 주제에 필요한 변수 검토, 전처리 = 결측치, 이상치
# 3. 변수 간 관계 분석

# 첫번째 주제 : 성별에 따른 월급 차이
# 1. 성별에 따른 월급 차이가 있는지
# 2. 성별, 월급 변수 검토
# 3. 성별과 월급의 관계 분석
# 성별 변수 검토 = 범주형 변수 = 빈도
# 이상치, 결측치 확인

# 이상치 없음
table(welfare$sex)
# 결측치 없음
table(is.na(welfare$sex))
# 월급 변수 검토 = 연속형 변수 = 요약통계
summary(welfare$income)

summary
이상치 확인

3) 결측치 NA 변경, 독립표본 t검정, 등분산 가정

# 이상치는 월급이 없는 사람 = 0 이라는 값을 가진 사람 제외 => 결측치 NA로 변경해야 함
table(is.na(welfare$income))
# 현재 결측치 12030개
welfare$income <- ifelse(welfare$income == 0, NA, welfare$income)
table(is.na(welfare$income))
# 현재 결측치 12044개 = 14개 추가된 것을 확인 가능
# 성별에 따른 월급 평균값 데이터가 필요함
sex_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(sex) %>% 
  summarise(income_mean = mean(income))
sex_income
# 평균 값을 가진 막대그래프 그리기
ggplot(data = sex_income, aes(x = sex, y = income_mean))+
  geom_col()
# 독립표본 t검정, 등분산 가정
sex_income_t <- welfare %>% 
  filter(!is.na(income))
sex_income_t
t.test(welfare$income ~ welfare$sex, var.equal = T)
#

table
이상치를 제거한 성별에 따른 월급 평균값
geom_col()
월급의 이상치를 제거한 welfare의 정보
t.test(welfare$income~welfare$sex, var.equal = T)

 

4) 데이터 분석 절차 - 두번째 주제 (나이에 따른 월급의 차이)

# 두번째 주제 : 나이에 따른 월급의 차이
# 1. 나이에 따른 월급 차이가 있는가?
# 2. 나이, 월급 변수 검토
# 3. 나이와 월급의 관계 분석
# 나이 = 2015 - 출생연도 + 1
head(welfare)
welfare$age <- 2015 - welfare$birth_year + 1
summary(welfare$birth_year)
summary(welfare$age)
# 이상치 없음
table(is.na(welfare$age))
table(is.na(welfare$birth_year))
# 결측치 없음

요약 통계 (생년월일, 나이)
이상치 확인

 

 

4) 데이터 분석 절차 - 세번째 주제 가기 전 (나이에 따른 월급 평균값)

# 나이에 따른 월급 평균값 데이터가 필요함
age_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(age) %>% 
  summarise(income_mean = mean(income))
age_income
# 나이에 따른 월급 평균값의 변화를 보여주는 선그래프 그리기
ggplot(data = age_income, aes(x=age, y= income_mean))+
  geom_line() # 안되는 이유!!!! (income_mean이라고 안씀)

나이에 따른 월급 평균값
geom_line()

5) 데이터 분석 절차 - 세번째 주제 (연령대와 월급의 관계 분석)

# 세번째
# 2. 연령대, 월급 변수 검토
# 3. 연령대와 월급의 관계 분석
# 연령대 변수 검토
# 나이 변수를 연령대 변수로 변환
# < 30: young, <60 : middle, >= 60 : old
welfare$age_group <- ifelse(welfare$age < 30, "young",
                           ifelse(welfare$age < 60, "middle","old"))
table(welfare$age_group)
# age 변수 검토할 때, 이상치와 결측치가 없었기 때문에 문제 없음
# 연령대에 따른 월급 평균값 데이터가 필요
age_group_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(age_group) %>% 
  summarise(income_mean = mean(income))
age_group_income
# 연령대에 따른 월급 평균값을 보여주는 막대 그래프 그리기
ggplot(data = age_group_income, aes(x=age_group, y= income_mean))+
  geom_col() 

# 연령대 순서 변경
ggplot(data = age_group_income, aes(x =age_group, y= income_mean))+
  geom_col()+
  scale_x_discrete(limits = c("young","middle","old"))

조건식 이후의 테이블 값
연령대에 따른 월급 평균값
geom_col()
scale_x_discrete(limits = c("young","middle","old"))

5) 데이터 분석 절차 - 네번째 주제 (연령대와 성별에 따른 월급의 차이)

# 네번째 주제: 연령대와 성별에 따른 월급의 차이
# 1. 연령대와 성별에 따른 월급 차이가 있는가?
# 2. 연령대와 성별, 월급 변수 검토
# 3. 연령대와 성별, 월급의 관계 분석
# 변수 검토는 앞선 분석에서 모두 완료하였음
# 연령대와 성별에 따른 월급 평균값 데이터가 필요
age_group_sex_income <- welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(age_group, sex) %>% 
  summarise(income_mean = mean(income))
age_group_sex_income
# 연령대와 성별에 따른 월급 평균값을 보여주는 막대그래프 만들기
# 누적 막대 그래프
ggplot(data = age_group_sex_income, aes(x = age_group, y = income_mean, fill = sex))+
  geom_col()+
  scale_x_discrete(limits = c("young", "middle", "old"))
# 막대를 나란히 세워서 표현하기
ggplot(data = age_group_sex_income, aes(x = age_group, y = income_mean, fill = sex))+
  geom_col(position = "dodge")+
  scale_x_discrete(limits = c("young", "middle", "old"))
#

 

welfare %>% filter(!is.na(income)) %>% group_by(age_group, sex) %>% summarise(income_mean = mean(income))
geom_col()+ scale_x_discrete(limits = c("young", "middle", "old"))
geom_col(position = "dodge")+ scale_x_discrete(limits = c("young", "middle", "old"))

 

* 핵심 (함수 정리)

- ggplot(data=a, aes(x=,y=)) + geom_~~ : 그래프 생성 함수

- geom_point : 산점도

- ylim(n1,n2) : n1부터 n2까지의 y축 범위 표현

- aes(x=,y=) : x,y축 데이터 지정

- options(scipen = 99) : 자릿수 지정 표현법 (기본적인)

- cor() : 상관계수

- cor.test() : 상관분석

- geom_col() : 막대 그래프 (이미 요약된 데이터를 통해 요약 통계 값을 나타낼 때)

ggplot(data=drv_hwy, aes(x=drv, y=hwy_mean))+
  geom_col()

- geom_bar() : 빈도 막대 그래프 (원시 형식의 데이터를 요약할 때 주로 사용)

ggplot(data = mpg, aes(x = drv))+
  geom_bar()

- xlab(" ") : x축 제목 설정

- geom_histogram(bins =10) : 구간수 10으로 설정하여 히스토그램 그래프 확인

- reorder(a,b) : b를 기준으로 a를 나타냄 (-b사용시 내림차순으로 정렬)

- geom_boxplot : 상자수염 그래프

- boxplot(mpg$hwy)$stats : 이상치 확인

- read.spss(경로, to.data.frame = T) : spss 형식의 데이터 불러오기

- rename(a=b) : 기존에 있는 b의 이름을 a로 변경

- geom_line() : 선형 그래프

- ifelse(조건, 부여, 조건2, 부여) : 조건식 부여

예시) ifelse(welfare$age < 30, "young",
                           ifelse(welfare$age < 60, "middle","old"))

-  scale_x_discrete(limits = c("a","b","c")) : x축의 이름 순서를 a,b,c로 조정

 

 

 

728x90
반응형
LIST