R-Studio ggplot패키지의 사용.

R-Studio의 ggplot과 그 이하 함수를 활용하여 이쁘게 시각화 하기.

Featured image

파일 소스

우클릭 -> 다른이름으로 링크저장 이용해 주세요
치킨집 가공.xlsx
Koweps_Codebook.xlsx

사용 예시 소스코드 1

library(readxl)

# 데이터 핸들링
fileName <- "치킨집 가공.xlsx"
examData <- read_excel(fileName)
examData

# 컬럼 이름 바꿔준다.
colnames(examData) <- c("address", "name")
# str_ 관련 함수 사용을 위해 메모리 로딩
library(stringr)
# xlxs 파일의 전체 행 수를 구한다.
rowVal <- nrow(examData)
# 구할 구 이름을 따로 변수에 저장한다.
guName <- "서대문구"
# bool 변수에 str_locate 함수의 테이블 값을 대입한다.
# 주소지가 서울 특별시 서대문구 이면 TRUE를 반환
bool <- str_locate(examData$address, paste("서울특별시 ", guName, sep=""))[1:rowVal] == 1
# bool <- str_locate(examData$address, paste("서울특별시 ", guName, sep="")) == 1
# 상위 6개만 출력해본다.
head(bool)

# bool 이 true 값인 행만 뽑아옴.
newData <- subset(examData, bool)
newData

# 주소 속성 원자값들중 시작 11번 문자열 인덱스 부터 16번째까지 추출.
addr <- substr(newData$address, 11, 16)
head(addr, 30)
# [1] "교남동 39"  "관철동 45"  "숭인동 22"  "재동 107"   "창신동 33"  "관수동 12"  "창신동 43"  "신문로1가 "
# [9] "동숭동 1-"  "수송동 14"  "예지동 15"  "명륜2가 2"  "인사동 20"  "필운동 20"  "관철동 5-"  "종로5가 2" 
# [17] "명륜2가 1"  "운니동 95"  "창신동 20"  "동숭동 1-"  "낙원동 13"  "명륜2가 1"  "적선동 15"  "종로5가 3" 
# [25] "명륜4가 1"  "명륜3가 1"  "재동 84-"   "내수동 16"  "내자동 1-"  "수송동 70" 

library(dplyr)
# gsub로 문자열 중 원하는 문자열로 정규식 필터함
addrNum <- gsub("[0-9]", "", addr) # 숫자 제거
addrTrim <- gsub(" ", "", addrNum) # 공백 제거
addrTrim <- gsub("-", "", addrTrim) # '-' 제거
addrTrim

# 데이터 프레임 만들기
ta <- table(addrTrim)
ta <- as.data.frame(ta)
colnames(ta) <- c("동이름", "매장수")
ta

# 정렬
ta <- arrange(ta, desc(매장수))
ta

# 트리맵 설치
# install.packages("treemap")
library(treemap)
library(digest)

# 제목정하기
myTitle <- paste(guName, " 동별 치킨집 분포", sep="")
treemap(ta, index="동이름", vSize="매장수", title=myTitle)

# stars() : 나이팅게일 차트

# sav 파일 불라오기(사용 프로그램 : spss)
# install.packages("foreign")
library(foreign)

fileName <- "Koweps_hpc10_2015_beta1.sav"
rawWelfare <- read.spss(file=fileName, to.data.frame=T)
str(rawWelfare)

# 코드북 파일 : Koweps_Codebook.xlsx
welFare <-rawWelfare[c('h10_g3', 'h10_g4', 'h10_g10', 'h10_g11', 'h10_eco9', 'p1002_8aq1', 'h10_reg7')]

# csv 파일로 변환하기
welFare <- rename(welFare, gender=h10_g3, birth=h10_g4, marriage=h10_g10, religion=h10_g11, code_job=h10_eco9, income=p1002_8aq1, code_region=h10_reg7)
write.csv(welFare, "welFare.csv", row.names = F, quote = F)

# 로그 출력
# sink("S20191023AM_00000001_Log")
# bool
# sink()

사용 예시 소스코드 2

# 데이터 전처리 하기.
welFare <- read.csv("welFare.csv")
class(welFare$gender)
unique(welFare$gender)
table(welFare$gender)

# 결측치 변환하기
welFare$gender <- ifelse(welFare$gender==9, NA, welFare$gender)

# 결측치 유무 검사
table(is.na(welFare$gender))
# FALSE
# 16664 

# 코딩 변경 하기
welFare$gender <- ifelse(welFare$gender==1, "male", "female")
table(welFare$gender)

# 데이터 프레임 만들기
myData <- as.data.frame(table(welFare$gender))
colnames(myData) <- c("성별", "빈도수")
myData

# title : 주제목, subtitle : 부제목
library(ggplot2)
ggplot(myData, aes(x=성별, y=빈도수, color=성별, fill=성별)) + geom_bar(stat = "identity") + labs(title="성별 빈도", subtitle="부제목", caption="(동해물과 백두산이 마르고 닳도록)")

# 연속형데이터(비정형) 핸들링하기
summary(welFare$income)
table(is.na(welFare$income))

# 월급의 결측치는 분석에서 제외한다.
qplot(welFare$income, bins=10)
qplot(welFare$income, bins=50) + xlim(0, 1000)

# 결측치 조정하기
library(dplyr)
welFare$income <- ifelse(welFare$income %in% c(0, 9999), NA, welFare$income)
table(is.na(welFare$income))

# 소득이 있는 사람들 중 성별로 그룹핑하여 평균 급여 보기
gender_income <- welFare %>% filter(!is.na(income)) %>% group_by(gender) %>% summarise(mean_income=mean(income))
gender_income

# ggplot 그려보기
ggplot(data=gender_income, aes(x=gender, y=mean_income, color=gender, fill=gender)) + geom_col() + ggtitle("성별 월급 평균")

사용 예시 소스코드 3

welFare <- read.csv("welFare.csv")
colnames(welFare)

# 연속형 데이터 구현하기
birth <- welFare$birth
birth

summary(birth)

# ggplot2 를 이용하여 차트 그리기
library(ggplot2)

# birth를 기준으로 세로막대 그리기
qplot(birth, bins=30)

age <- 2015 - birth + 1
welFare$age <- age

# age를 기준으로 분류함.
summary(welFare)
qplot(age, bins=30)

# 월급
age_income <- welFare %>% filter(!is.na(income)) %>% group_by(age) %>% summarise(mean_income=mean(income))
age_income

# ggplot 그리기
ggplot(data=age_income, aes(x=age, y=mean_income))+geom_line() + labs(title="나이와 월급의 관계")

##################################
welFare <- read.csv("welFare.csv")
welFare

# 나이 계산
welFare$age <- 2015 - welFare$birth + 1
range(welFare$age)

# 청년, 중년, 노년
welFare <- welFare %>% mutate(ageg=ifelse(age<30, "young", ifelse(age>=60, "old", "middle")))

head(welFare[c("age", "ageg")], 10)
unique(welFare$ageg)
table(welFare$ageg)

# chat 구하기
chartData <- as.data.frame(table(welFare$ageg))
colnames(chartData) <- c("연령대", "빈도수")
chartData$빈도수 <- sort(chartData$빈도수, decreasing = F)
chartData
# 
# # ggplot2 이용해서 세로막대 차트 그리기
# ggplot(data=chartData, aes(x=연령대, y=빈도수, col=연령대, fill=연령대)) + geom_bar(stat = "identity") + scale_x_discrete(limits=c("young", "middle", "old"))

ageg_income <- welFare %>% filter(!is.na(income)) %>%  group_by(ageg) %>%  summarise(mean_income=mean(income))
ageg_income$ageg <- as.factor(ageg_income$ageg)

ageg_income <- transform(ageg_income, ageg=factor(ageg, levels=c("young", "middle", "old")))
ggplot(data=ageg_income, aes(x=ageg, y=mean_income, col=ageg, fill=ageg)) + geom_col() + scale_x_discrete(limits=c("young", "middle", "old")) + theme(legend.position = "right")

사용 예시 소스코드 4

# 데이터 테이블 조인하기
aa <- data.frame(col1=c("김", "이"), col2=c(100,200))
bb <- data.frame(col1=c("김", "박"), col2=c(300,400))

left_join(aa, bb, id="col1")
right_join(aa, bb, id="col1")
full_join(aa, bb, id="col1")

welFare <- read.csv("welFare.csv")
welFare
unique(welFare$code_job)

# lib추가후 xlsx 읽어들임
library(readxl)
list_job <- read_excel("Koweps_Codebook.xlsx",sheet=2, col_names = T)
head(list_job, 10)

welFare <- left_join(welFare, list_job, id="code_job")
head(welFare[c("code_job", "job")], 10)

# 직업과 소득이 둘다 있는 경우만...
job_income <- welFare %>% filter(!is.na(job) & !is.na(income)) %>% group_by(job) %>% summarise(mean_income=mean(income))
job_income

# 직업 소등 탑10
job_income_top_10 <- job_income %>% arrange(desc(mean_income)) %>% head(10)
job_income_top_10$job <- as.factor(job_income_top_10$job)
attributes(job_income_top_10$job)

# 범례 순서 바꾸기
job_income_top_10 <- transform(job_income_top_10, job=factor(job, levels=job))
# ggplot(data=job_income_top_10, aes(x =reorder(job, mean_income), y = mean_income, col=job, fill=job)) + geom_col()
ggplot(data=job_income_top_10, aes(x=job, y = mean_income, col=job, fill=job)) + geom_col()

#################################
# 지역별 연령대 비율 
library(ggplot2)

welfare <- read.csv('welfare.csv')
welfare$code_region

# 지역구분
mRegion <- c('서울', '수도권(인천/경기)', '부산/경남/울산', '대구/경북', '대전/충남', '강원/충북', '광주/전남/전북/제주도')

list_reg <- data.frame(code_region = c(1:7), region = mRegion)
list_reg

welfare <- left_join(welfare, list_reg, id = 'code_region')
welfare

welfare$age <- 2015 - welfare$birth + 1
welfare <- welfare %>% mutate(age_group = ifelse(age < 30, 'young', ifelse(age < 60, 'mid', 'old')))

# 지역별 / 연령별 그룹핑하여 빈도수 비율
reg_age_group <- welfare %>% group_by(region, age_group) %>% summarise(cnt = n()) %>% mutate(tot_group = sum(cnt)) %>% mutate(pct = round(100 * cnt / tot_group, 1))
reg_age_group

# 차트 만들기
ggplot(data = reg_age_group, aes(x = region, y = pct, fill = age_group)) + geom_col() + coord_flip() + theme_minimal(base_family = 'AppleGothic')

# 포지션 건들기.
ggplot(data = reg_age_group, aes(x = region, y = pct, fill = age_group)) + geom_col(position = "dodge2") + coord_flip() + theme_minimal(base_family = 'AppleGothic')