# 09-6. 직업별 월급 차이
# - " 어떤 직업이 월급을 가장 많이 받을까 ?"
# 분석 절차
# 1. 변수 검토 및 전처리
# - 직업
# - 월급
# 2. 변수 간 관계 분석

class(welfare$code_job) # numeric 확인
table(welfare$code_job) # 각 빈도수 확인

# 2. 전처리
# 
# --> 직업 분류코드 목록 불러오기

library(readxl)

list_job <- read_excel("C:\\rStudy\\20200402\\Koweps_Codebook.xlsx", col_names =T, sheet=2)

# 컬럼이름을 헤더값으로 불러온다 # sheet 2번을 불러온다.

head(list_job)
dim(list_job)

welfare <- left_join(welfare, list_job, id="code_job")

# id가 code_job을 기준으로 원래 welfare 파일과 list_job 파일을 join 시키라는 의미
# welfare라는 DF 에도 code_job 이라는 컬럼이 있고, list_job도 code_job 컬럼이 있다.
# 공통적인 기준 필드가 되어서 이 컬럼을 기준으로 합친다.
# welfare의 code_job 컬럼 중 첫 번쨰 값이 942면, list_job의 942와 일치하는 것을
# 찾아서 맞는 값을 넣어준다. 만약 값이 없다면 Na값이 들어가고
# 반대로 welfare에는 없는데 list_job 에는있다면 값이 삽입되지 않는다.
# (left_join 이므로) - 왼쪽 파일을 기준으로 잡는다.
welfare %>% 
  filter(!is.na(code_job)) %>% 
  select(code_job, job) %>% 
  head(10)

# 1. 직업별 월급 평균표 만들기

job_income <- welfare %>% 
  filter(!is.na(job) & !is.na(income)) %>% 
  group_by(job) %>% 
  summarise(mean_income = mean(income))

# 2. 상위 10개 추출

top10 <- job_income %>% 
  arrange(desc(mean_income)) %>% 
  head(10)

# 3. 그래프 만들기

ggplot(data=top10, aes(x = reorder(job, mean_income), y=mean_income)) +
    geom_col() +
  coord_flip() # 이걸 빼면 막대가 세로로 그려진다

# 4. 하위 10 추출
bottom10 <- job_income %>% 
   arrange(mean_income) %>%
  head(10)

# 5. 그래프 만들기

ggplot(data=bottom10, aes(x = reorder(job, -mean_income), y=mean_income)) +
    geom_col() +
  coord_flip() + # 이걸 빼면 막대가 세로로 그려진다
  ylim(0, 850) # 상위 10개 직업의 연봉과 축을 동일시하기 위해서 맞춤

# 09-7. 성별 직업 빈도
# 
# - "성별로 어떤 직업이 가장 많을까?"
# 
# ​
# 
# 분석 절차
# 
# 1. 변수 검토 및 전처리
# 
# - 성별
# 
# - 직업
# 
# 2. 변수 간 관계 분석
# 
# - 성별 직업 빈도표 만들기
# 
# - 그래프 만들기
# 
# ​
# 
# 1. 성별 직업 빈도표 만들기

#남성 직업 빈도 상위 10개 추출

job_male <- welfare %>% 
  filter(!is.na(job) & sex == "male") %>% # 전체중에 직업 컬럼에서 na가 없는 애들& 성별이 남자인 애들
  group_by(job) %>% # 직업별로 그룹을 지정(직업군에 따른 남자의 합산 결과)
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  head(10)

# 여성 직업 빈도 상위 10개 추출

job_female <- welfare %>% 
  
  filter(!is.na(job) & sex == "female") %>% 
  
  group_by(job) %>% # 직업별로 그룹을 지정(직업군에 따른 여자의 합산 결과)
  
  summarise(n = n()) %>% 
  
  arrange(desc(n)) %>% 
  
  head(10)
# 2. 그래프 그리기

# 남자 그래프

ggplot(data = job_male, aes(x = reorder(job, n), y=n)) +
  
  geom_col() +
  
  coord_flip()

#여성 그래프

ggplot(data = job_female, aes(x = reorder(job, n), y=n)) +
  
  geom_col() +
  
  coord_flip()

# 09-8. 종교 유무에 따른 이혼율
# 
# -"종교가 있는 사람들이 이혼을 덜 할까?"
# 
# 분석 절차
# 
# 1. 변수 검토 및 전처리
# 
# - 종교
# 
# - 혼인 상태
# 
# 2. 변수 간 관계 분석
# 
# - 종교 유무에 따른 이혼율 표 만들기
# 
# - 그래프 만들기
# 
# ​
# 
# 1. 변수 검토하기

class(welfare$religion) # numeric

table(welfare$religion) # 1 : 8047, 2 : 8617



# 2. 전처리

# 종교 유무 이름 부여

welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")

table(welfare$religion) # no : 8617, yes : 8047


# 
# 혼인 상태 변수 검토 및 전처리하기
# 
# 1. 변수 검토하기

class(welfare$marrige) # numeric


# 2. 전처리

# 이혼 여부 변수 만들기

welfare$group_marriage <- ifelse(welfare$marrige == 1, "marriage",
                                 
                                 ifelse(welfare$marrige == 3, "divorce", NA))


# 3. 그래프 그리기

qplot(welfare$group_marriage)
# 
# 종교 유무에 따른 이혼율 분석하기
# 
# 1. 종교 유무에 따른 이혼율 표 만들기

religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  summarise(n = n()) %>%  # 개수 뽑기
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100, 1))

#count() 활용

religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  count(religion, group_marriage) %>% 
  
  group_by(religion) %>% 
  
  mutate(pct=round(n/sum(n)*100,1))

# 2. 이혼율 표 만들기

#이혼 추출

divorce <-religion_marriage %>% 
  
  filter(group_marriage == "divorce") %>% 
  
  select(religion, pct)

# 3. 그래프 만들기 

ggplot(data = divorce, aes(x=religion, y=pct)) + geom_col()
# 
# 연령대 및 종교 유무에 따른 이혼율 분석하기
# 
# 1. 연령대별 이혼율 표 만들기

ageg_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  group_by(ageg, group_marriage) %>% 
  
  summarise(n = n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100, 1))

#count() 활용

ageg_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  count(ageg, group_marriage) %>% 
  
  group_by(ageg) %>% 
  
  mutate(pct = round(n/sum(n)*100, 1))
# 2. 연령대별 이혼율 그래프 만들기

# 초년 제외, 이혼 추출

ageg_divorce <- ageg_marriage %>% 
  
  filter(ageg != "young" & group_marriage == "divorce") %>% 
  
  select(ageg, pct)
# 그래프 만들기

ggplot(data = ageg_divorce, aes(x=ageg, y=pct)) +geom_col()


# 3. 연령대 및 종교 유무에 따른 이혼율 표 만들기

# 연령대, 종교유무, 결혼상태별 비율표 만들기

ageg_religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage) & ageg != "young") %>% 
  
  group_by(ageg, religion, group_marriage) %>% 
  
  summarise(n = n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100,1)) # pct 는 % 약자
# count() 활용

ageg_religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage) & ageg != "young") %>% 
  
  count(ageg, religion, group_marriage) %>% 
  
  group_by(ageg, religion) %>% 
  
  mutate(pct = round(n/sum(n)*100, 1))

# 연령대 및 종교 유무별 이혼율 표 만들기

df_divorce <- ageg_religion_marriage %>% 
  
  filter(group_marriage == "divorce") %>% 
  
  select(ageg, religion, pct)

# 4. 연령대 및 종교 유무에 따른 이혼율 그래프 만들기

ggplot(data = df_divorce, aes(x=ageg, y=pct, fill = religion)) +
  
  geom_col(position = "dodge")

# 09-9. 지역별 연령대 비율
# 
# - " 노년층이 많은 지역은 어디일까?"
# 
# 1. 변수 검토 및 전처리
# 
# - 지역
# 
# - 연령대
# 
# 2. 변수 간 관계 분석
# 
# - 지역별 연령대 비율
# 
# - 그래프 만들기
# 
# ​
# 
# [지역(code_region) 별 연령대 비율 분석하기]
# 
# 1 "서울",
# 
# 2 "수도권(인천/경기",
# 
# 3 "부산/경남/울산",
# 
# 4 "대구/경북",
# 
# 5 "대전/충남",
# 
# 6 "강원/충북",
# 
# 7 "광주/전남/전북/제주도"

​

# 1. 지역 변수 검토하기

table(welfare$code_region) # 1, 2, 3, 4번 등 각 지역 빈도수 확인

class(welfare$code_region) # character

table(welfare$age) # 나이 빈도수 확인

​

# 2. 전처리

list_region <- data.frame(code_region=c(1:7),
                          
                          region = c("서울",
                                     
                                     "수도권(인천/경기",
                                     
                                     "부산/경남/울산",
                                     
                                     "대구/경북",
                                     
                                     "대전/충남",
                                     
                                     "강원/충북",
                                     
                                     "광주/전남/전북/제주도"))


welfare <- left_join(welfare, list_region, id="code_region")

​

welfare %>% 
  
  select(code_region, region) %>% 
  
  head # 잘 실행 되었는지 확인하는 코드

# 1. 지역별 연령대 비율 표 만들기

region_ageg <- welfare %>% 
  
  group_by(region, ageg) %>% 
  
  summarise(n=n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct=round(n/tot_group*100,2))

​

head(region_ageg)

# fct 의 의미는 factor 의 약자.(팩터형을 의미함)

​

#count() 활용

region_ageg <- welfare %>% 
  
  count(region, ageg) %>% 
  
  group_by(region) %>% 
  
  mutate(pct = round(n/sum(n)*100,2))

# 2. 그래프 만들기

ggplot(data = region_ageg, aes(x=region, y=pct, fill=ageg))+
  
  geom_col()+
  
  coord_flip()

# 3. 막대 정렬하기 : 노년층 비율 높은 순

#노년층 비율 내림차순 정렬

list_order_old <- region_ageg %>% 
  
  filter(ageg == "old") %>% 
  
  arrange(pct)

# 지역명 순서 변수 만들기

order <- list_order_old$region

​

# 4. 그래프 그리기

ggplot(data = region_ageg, aes(x = region, y=pct, fill=ageg)) +
  
  geom_col()+
  
  coord_flip()+
  
  scale_x_discrete(limits=order)



#####################################################
# 주제 : 지하철역 주변 아파트 가격 알아보기

#-------------------------------------------------------
# 내용 :
# 지하철 주변의 아파트 시세를 알아보고
# 지하철역에서 아파트까지의 거리에 따라
# 가격분포가 어떻게 다른 지를 비교.

#-------------------------------------------------------
# 결과 시각화 :
# 구글 지도를 활용하여 서울시 지도에 
# 지하철역과 주변 아파트 실거래가 표시

#-------------------------------------------------------
# 주의 사항
# Google Map Platform 출시로 인해 ggmap 패키지 변경됨

# 구글 API 키가 반드시 필요.
# googleAPIkey = "본인의 API 키 입력"

#-------------------------------------------------------
# 활용 데이터 

# 지하철역 주소 정보 : 서울 열린 데이터 광장
# URL : http://data.seoul.go.kr
# URL2 : http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12035&srvType=S&serviceKind=1

# 국토교통부 실거래가 공개 시스템
# URL : http://rtdown.molit.go.kr

# Google Maps Platform
# URL : https://cloud.google.com/maps-platform




#####################################################
# 1. 공공데이터 다운로드
# 1-1. 지하철역 정보 다운로드 및 전처리
# 1-2. 아파트 실거래가
# 1-3. 구글 지도 정보

# 2. 지하철역 데이터 가공하기
# 2-1. 원시 데이터 가져오기
# 2-2. 지하철역 좌표 정보 구하기

# 3. 아파트 실거래가 데이터 가공하기
# 3-1. 전용면적별 거래 가격
# 3-2. 아파트 단지별 평균 거래 금액
# 3-3. 시군구와 번지를 하나로 합치기
# 3-4. 좌표 정보 추가 후, 최종 데이터 만들기

# 4. 아파트 실거래가 데이터 가공하기
# 4-1. 마포구 지도 가져오기
# 4-2. 지하철역 위치 및 아파트 가격 정보 표시하기

##########################################################

#install_github() 사용을 위한 devtools 설치 및 로드 
install.packages("devtools") #깃헙에 올라온 패키지들을 받으려면 devtools 라는 패키지가 필요하기 때문에 먼저 설치해준다.
library(devtools)

# github에서 ggmap 패키지 설치 및 로드 
install.github("dkahle/ggmap") # devtools 가 있어야 이 패키지를 다운받을 수 있다.

# 또는 install.packages("ggmap") : 이 의미는 미러사이트를 통해서 설치하겠다는 의미
library(ggmap)

# dplyr 패키지 설치 및 로드 
install.packages("dplyr")
library(dplyr) 

#####################################################
# 2. 지하철역 데이터 가공하기

#-------------------------------------------------------
# 2-1. 원시 데이터 가져오기
# csv 파일을 가져와서 station_data 변수에 할당

#실시간 금액은 국민은행에서 공시지가를 다운받아서 넣어야 함
station_data <- read.csv("C:\\Rwork\\역별_주소_및_전화번호.csv")

# station_data의 "구주소"컬럼 속성 : Factor
# station_data 속성 확인

str(station_data) # factor 타입

#-------------------------------------------------------
# 2-2. 지하철역 좌표 정보 구하기

# as.character() 함수로 문자형으로 변환한 후 station_code에 할당
station_code <- as.character(station_data$"구주소")

# google api key 등록
googleAPIkey <- "AIzaSyC8BVOCtGMXacY8URBfmH1SWiYIErRWJ5M"
register_google(googleAPIkey)

# geocode() 함수로 station_code 값을 위도와 경도로 변환
station_code <- geocode(station_code) # 여기가 5분정도 시간 걸리는 부분

# station_code 데이터 앞부분 확인
head(station_code) # 여기까지가 2-2번 작업 완료

#------------------------------------------------------------------
# 일부 데이터가 NA 값으로 나올 경우에는
# 아래처럼 인코딩을 변경하여 다시 좌표정보를 구한다.

# 2-3. 지하철역 좌표 정보 구하기

# 문자형으로 변환하고 utf8로 변환한 후 위도와 경도로 변환
# 51개의 주소값을 utf8로 변환하고 geocode() 로 전달한다.
# geocode() 함수에 의해서 위도, 경도에 의한 값이 다시 모두 꺼내진다.
station_code <- as.character(station_data$"구주소") %>% enc2utf8() %>% geocode()

# station_code 데이터 앞부분 확인
head(station_code)

#------------------------------------------------------------------
# 기존 station_data 에 위도/경도 정보를 추가.
# station_data와 station_code를 합친 후 station_code_final 에 할당
station_code_final <- cbind(station_data, station_code)

# station_code_final 의 앞부분 확인
head(station_code_final)


####################################
# 3. 아파트 실거래가 데이터 가공하기
#--------------------------------------------
# 3-1. 전용 면적별 거래 가격

# csv 파일을 가져와서 apart_data변수에 할당
apart_data <- read.csv("C:\\rwork\\아파트_실거래가.csv")

#apart_data 앞부분 데이터 확인
head(apart_data)

#ceiling() / floor()
# 전용면적의 값을 반올림하여 정수로 표현
apart_data$전용면적 = round(apart_data$전용면적)

# 데이터 앞부분 확인
head(apart_data)


#count() : 지정한 집단별 행의 갯수
# count(데이터셋, 컬럼명)
# arrange() : 기본형(오름차순) / arrange(desc()) 를 이용하면 내림차순 정렬 가능

# 전용면적을 기준으로 빈도를 구한 후 빈도에 따라 내림차순 정렬
count(apart_data, 전용면적) %>% arrange(desc(n))

# 전용면적이 85인 데이터만 추출하여 apart_data_85에 할당
apart_data_85 <- subset(apart_data, 전용면적="85") #subset은 ifelse 가 필요없다. 딱 맞는 값만 꺼내주기 때문.

#----------------------------------------------
# 3-2. 아파트 단지별 평균 거래 금액

# 쉼표를 공백("")으로 대체하여 제거
apart_data_85$거래금액 <- gsub(",", "", apart_data_85$거래금액)

# 결과 확인하기
head(apart_data_85)

# 거래 금액을 정수형으로 변환하여 : as.integer(거래금액)
# 단지명별 평균을 구한 후, mean(as.integer(거래금액)~단지명) # 평균 거래값
# apart_data_85_cost 변수에 할당.
# aggregate() : R 내장 함수. 그룹별로 묶어서 연산할 때 사용. # group_by 라는 함수는 필요없게 된다.
# aggregate(집계할 내용, 데이터셋, 집계함수)
# 집계할 내용 : 연산컬럼명~기준컬럼명
apart_data_85_cost <- aggregate(as.integer(거래금액)~단지명,
                                apart_data_85,
                                mean)

# "as.integer(거래금액)"을
# "거래금액"으로 변경하여 저장
# rename(데이터 셋, "변경 후 이름" = "변경 전 이름")
apart_data_85_cost <- rename(apart_data_85_cost,
                             "거래금액" = "as.integer(거래금액)")

# 단지명이 중복된 행을 제거하고, duplicated(apart_data_85$단지명)
# apart_data_85 에 저장
# duplicated() : 중복 행 제거 함수
#                           중복 된 값(TRUE) / 처음 나오는 값(FALSE)
#                            FALSE 에 해당하는 값들을 배열로 반환
apart_data_85 <- apart_data_85[!duplicated(apart_data_85$단지명),]

#결과 확인하기
head(apart_data_85)

# "단지명"을 기준으로
# 중복 제거한 데이터셋(apart_data_85)에
# 평균 거래 금액 데이터 셋(apart_data_85_cost) 합치기
# 이 때 left_join() 함수를 사용.
# left_join(데이터 셋, 데이터 셋, 기준컬럼)
# 합한 후, 동일한 컬럼명이 존재할 경우,
# 컬럼명_x, 컬럼명_y 형태로 자동 구분.
# head(apart_data_85_cost) : 컬럼명 확인
# 
# head(apart_data_85) : 컬럼명 확인 

apart_data_85 <- left_join(apart_data_85,
                           apart_data_85_cost,
                           by="단지명")

#결과 확인하기
head(apart_data_85)

# 평균 거래금액("거래금액.y")을 이용하여 시각화 작업을 할 예정.
# "단지명", "시군구", "번지", "전용면적", "거래금액.y" 만 추출하고 저장

apart_data_85 <- apart_data_85 %>% select("단지명",
                                         "시군구",
                                          "번지",
                                          "전용면적",
                                          "거래금액.y")

#-------------------------------------------------------------

# 3-3. 시군구와 번지를 하나로 합치기

# 테스트 코드
# "시군구"와 "번지"열을 합친 후, : paste(컬럼명, 컬럼명)
# apart_address에 저장
# 주의 사항 : paste() 함수를 이용하면 컬럼과 컬럼 사이에 공백 발생.
# 공백 없이 합할 경우 : paste0() 함수를 사용.
#시군구와 번지를 합친 것을 데이터프레임 형태로 생성하고 그 값을 apart_address 로 할당
apart_address <- paste(apart_data_85$시군구,
                       apart_data_85$번지) %>% data.frame()

#"," 을 "주소"로 변경하여 저장
apart_address <- rename(apart_address, "주소"=".")


# 결과 확인하기
head(apart_address)

#------------------------------------------------------------

# 3-4. 좌표 정보 추가 후, 최종 데이터 만들
# 아파트 주소를 위/경도로 변환하여
# apart_address_code 에 저장

apart_address_code <- as.character(apart_address$"주소") %>% enc2utf8() %>% geocode()

View(apart_address_code)

# 데이터 세트를 합친 후,
# apart_data_85 : 단지명, 전용면적, 거래금액(평균거래금액) 추출
# apart_address : 주소 추출
# apart_address_code : 위도, 경도 추출
# 일부 열만 apart_code_final에 저장


apart_code_final <- cbind(apart_data_85,
                          apart_address,
                          apart_address_code) %>% select("단지명",
                                                         "전용면적",
                                                         "거래금액",
                                                        "주소",
                                                         lon, lat)
head(apart_code_final)


######################################
# 4. 구글 지도에 지하철역과 아파트 가격 표시하기
#--------------------------------------------------------
# 4-1. 마포구 지도 가져오기
# 마포구 지도 정보를 가져와 mapo_map에 저장

mapo_map <- get_googlemap("mapogu", #마포구를 검색
                          maptype = "roadmap", # 도로지도를 요청
                          zoom=12) # zoom=12 를 안쓰면 완전히 축소해서 출력함(12배 확대한다고 설정)

# 구글 지도 호출
ggmap(mapo_map)

# 4-2. 지하철역 위치 및 아파트 가격 정보 표시하기

# ggplot2 패키지 설치

install.packages("ggplot2")

# ggplot2 패키지 로드

library(ggplot2)

# 지하철역 위치 표시 및 역명 표시
ggmap(mapo_map) +                                      # 지도를 먼저 그리고
  geom_point(data = station_code_final,    # 빨간 점으로 위도경도값을 찍어주고
             aes(x=lon, y=lat),
             colour = "red",
             size=3) +
  geom_text(data = station_code_final,       # 그 위에다가 글씨를 쓰라는 의미
            aes(label = 역명, vjust = -1))
# -1이 역명이 위에 찍힐지 아래에 찍힐지를 정하는 기능임.(geom_text 함수를 help로 찾아서 옵션값이 어느 것을 허용하는지 찾아봐야 함)
# v(버티컬) hjust(호리즌탈), 0으로 하면 빨간색 위치, 1로하면 반대로
# 홍대입구역 지도 정보를 가져와 hongdae_map 변수에 저장

hongdae_map <- get_googlemap("hongdae station",
                             
                             maptype = "roadmap",
                             
                             zoom=15)

ggmap(hongdae_map) # 그냥 단순 맵 출력

#홍대입구역 지도에 지하철 정보 및 아파트 정보 일괄 표시
ggmap(hongdae_map) +
  
  geom_point(data = station_code_final,
             aes(x = lon, y=lat),
             colour = "blue",
             size=6) +
  
  geom_text(data = station_code_final,
            aes(label = 역명, vjust = -1), colour = "red")+
  
  geom_point(data = apart_code_final,
             aes(x = lon, y=lat)) +
  
  geom_text(data = apart_code_final,
            aes(label=단지명, vjust=-1), colour = "red")+
  
  geom_text(data = apart_code_final,
            aes(label = 거래금액, vjust=1), colour="red")

+ Recent posts