custdata_folder_items
Custdata 폴더 아래에 custdata.tsv 파일이 있는지 꼭 확인하고 진행하세요. 저는 Project 기능을 사용하고 있어서 작업 디렉토리(Working directory, getwd() 를 이용해 확인 가능)를 따로 지정하거나, 전체 경로를 적을 필요가 없었습니다. Project 기능을 사용하지 않는다면, setwd() 를 이용해서 작업 디렉토리를 변경하시거나, 파일을 찾을 수 있는 전체 경로를 적어주면 됩니다.
# 필요한 라이브러리 불러오기
library(ggplot2)
# 예제 파일 불러오기
custdata <- read.table("./Custdata/custdata.tsv", header = TRUE, sep = "\t")
# 데이터 구조 확인
str(custdata)
## 'data.frame': 1000 obs. of 11 variables:
## $ custid : int 2068 2073 2848 5641 6369 8322 8521 12195 14989 15917 ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 2 2 1 1 2 2 2 1 ...
## $ is.employed : logi NA NA TRUE TRUE TRUE TRUE ...
## $ income : int 11300 0 4500 20000 12000 180000 120000 40000 9400 24000 ...
## $ marital.stat: Factor w/ 4 levels "Divorced/Separated",..: 2 2 3 3 3 3 3 2 2 1 ...
## $ health.ins : logi TRUE TRUE FALSE FALSE TRUE TRUE ...
## $ housing.type: Factor w/ 4 levels "Homeowner free and clear",..: 1 4 4 3 4 2 1 4 4 1 ...
## $ recent.move : logi FALSE TRUE TRUE FALSE TRUE FALSE ...
## $ num.vehicles: int 2 3 3 0 1 1 1 3 2 1 ...
## $ age : num 49 40 22 22 31 40 39 48 44 70 ...
## $ state.of.res: Factor w/ 50 levels "Alabama","Alaska",..: 22 9 10 31 9 32 12 22 13 33 ...
str() 함수를 이용해서 값을 살펴보면, 총 11개의 column 이 있습니다. custid 는 고객 번호이기 때문에 분석에 사용하진 않을 겁니다. 나머지 10개의 변수 중에서 범주형 자료는 sex, is.employed, marital.stat, health.ins, housing.type, recent.move, state.of.res 총 7개이며, 연속형(int, num) 변수는 income, num.vehicles, age 3개임을 알 수 있습니다.
# 요약 통계량 보기
summary(custdata)
## custid sex is.employed income
## Min. : 2068 F:440 Mode :logical Min. : -8700
## 1st Qu.: 345667 M:560 FALSE:73 1st Qu.: 14600
## Median : 693403 TRUE :599 Median : 35000
## Mean : 698500 NA's :328 Mean : 53505
## 3rd Qu.:1044606 3rd Qu.: 67000
## Max. :1414286 Max. :615000
##
## marital.stat health.ins
## Divorced/Separated:155 Mode :logical
## Married :516 FALSE:159
## Never Married :233 TRUE :841
## Widowed : 96
##
##
##
## housing.type recent.move num.vehicles
## Homeowner free and clear :157 Mode :logical Min. :0.000
## Homeowner with mortgage/loan:412 FALSE:820 1st Qu.:1.000
## Occupied with no rent : 11 TRUE :124 Median :2.000
## Rented :364 NA's :56 Mean :1.916
## NA's : 56 3rd Qu.:2.000
## Max. :6.000
## NA's :56
## age state.of.res
## Min. : 0.0 California :100
## 1st Qu.: 38.0 New York : 71
## Median : 50.0 Pennsylvania: 70
## Mean : 51.7 Texas : 56
## 3rd Qu.: 64.0 Michigan : 52
## Max. :146.7 Ohio : 51
## (Other) :600
우리가 관심있어하는 변수는 건강보험의 가입 여부에 대한 정보인 healt.ins 입니다. 나머지 변수들은 이를 예측하기 위해 사용할 수 있는 예측 변수들이라고 할 수 있습니다. 그 중에서 housing.type, recent.move, num.vehicles 에는 모두 똑같이 56개의 결측치(NA’s)가 있고, is.employed 에는 전체의 30%에 달하는 328개의 결측치가 있습니다. is.employed 를 모델링에 이용하려면 결측치에 대한 문제를 해결해야겠지만, housing.type, recent.move, num.vehicles 에 대한 결측치는 많지 않으니 무시하기 진행하겠습니다.
ggplot(data = custdata, aes(x = income)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
가장 기본적인 ggplot() 함수의 문법입니다. ggplot 함수 내부에 인자로 데이터를 받고, aes 내부에서는 x, y, color, size, fill 등에 이용할 column 이름을 받을 수 있습니다. 그리고 + 연산자로 다음 레이어를 추가해줍니다. geom_histogram 함수 내에서 bins 또는 binwidth 인자로 bin 의 갯수나 크기를 조절할 수 있습니다. 기본 설정은 bins = 30 인데, 이를 bins = 20 으로 바꿔서 히스토그램을 그려보세요.
# bins = 20 으로 히스토그램 그리기
연속형 변수와 범주형 변수를 같이 나타내는 도표를 그려보도록 하겠습니다. 우리의 관심사인 건강보험 가입 여부에 따라 수입은 어떻게 분포되어 있는지를 살펴봅시다. 여기서 사용할 함수는 facet_wrap() 입니다. 따로 보고자 하는 범주형 변수를 ~ 을 이용해서 지정해주면 그 변수의 갯수만큼 동일한 그래프를 그려줍니다.
ggplot(custdata, aes(x = income)) +
geom_histogram() +
facet_wrap(~ health.ins)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
그러면 결혼 상태에 따른 수입의 분포를 볼 수 있는 그래프를 그려주세요.
# 결혼 상태에 따른 수입
결혼 상태에 대한 막대 그래프는 아래와 같이 나타낼 수 있으며, aes 내에 fill 인자로 health.ins 를 선언해주면 각 결혼 상태별 건강보험 가입 여부를 확인할 수도 있습니다. 마지막으로 geom_bar() 에서 position = "fill" 인자를 추가하면 비율 그래프로 바꿀 수 있습니다. 기본값은 position = "dodge" 입니다.
ggplot(custdata, aes(x = marital.stat)) +
geom_bar()
ggplot(custdata, aes(x = marital.stat, fill = health.ins)) +
geom_bar()
ggplot(custdata, aes(x = marital.stat, fill = health.ins)) +
geom_bar(position = "fill")
거주 지역에 대한 빈도를 수평 막대 그래프로 나타내기 위해서는 아래와 같은 코드를 실행하면 됩니다.
ggplot(custdata, aes(x = state.of.res)) +
geom_bar() +
coord_flip()
그렇다면 거주 지역별로 건강보험 가입 비율의 그래프를 수평으로 나타내보세요.
# 거주 지역별 건강보험 가입 비율을 보여주는 수평 막대 그래프