본문 바로가기

카테고리 없음

7일차 - 4월19일

#지하철역 주변 아파트 시세 분석
#지하철역에서 아파트까지의 거리에 따라 가격분포가 어떻게 다른지 비교
library(dplyr)
#csv 파일을 가져와서 station_data 변수에 할당
station_data <- read.csv("./day6/data/역별_주소_및_전화번호.csv")
# station_data 속성 확인
str(station_data) 
# 만약 구 주소가 Factor 형일 경우,
# as.character() 함수로 문자형으로 변환한 후 station_code에 할당
station_code <- as.character(station_data$"구주소")
head(station_code, 5)
library(ggmap)
#구글 api키 등록
googleAPIkey <- "API키 쓰기"
register_google(googleAPIkey)
#geocode()함수로 staion_code 값을 위도와 경도로 변환
station_code <- geocode(station_code)
#station_code 데이터 앞부분 확인
head(station_code)
#문자형으로 변환하고 utf8로 변환한 후 위도와 경도로 변환
station_code <- as.character(station_data$"구주소") %>% 
  enc2utf8() %>% geocode()
head(station_code)
#기존 station_data와 위도,경도를 가진 station_code를 합친 후, station_code_final에 할당 
station_code_final <- cbind(station_data, station_code)
head(station_code_final)#station_code_final의 앞부분 확인
#cbind()와 rbind()함수는 열의 속성 데이터 타입 변수의 개수, 변수 명이 동일해야 사용가능.


##아파트 실거래가 데이터 가공
#전용면적별 거래 가격
#csv파일을 가져와서 apart_data 변수에 할당

apart_data <- read.csv("./day6/data/아파트_실거래가.csv")

#apart_data 앞부분 데이터 확인

head(apart_data)

#전용면적 부분을 반올림.

apart_data$전용면적 = round(apart_data$전용면적)
head(apart_data)

#전용면적 중 빈도가 높은 값을 찾기 위해
#전용면적을 기준으로 빈도를 구한 후, 빈도에 따라 내림차순 정렬

count(apart_data, 전용면적) %>% arrange(desc(n))

#전용면적이 85인 데이터만 추출하여 apart_data_85에 할당

apart_data_85 <- subset(apart_data, 전용면적 == "85")

head(apart_data_85)#apart_data_85 앞부분 확인

#쉼표를 공백("")으로 대체하여 제거

apart_data_85$거래금액 <- gsub(",","",apart_data_85$거래금액)
head(apart_data_85)#결과확인하기

#거래금액을 정수형으로 변환하여 단지명별 평균을 구한 후, apart_data_85_cost 변수에 할당

apart_data_85_cost <- aggregate(as.integer(거래금액) ~ 단지명,
                                apart_data_85,mean)

#aggregate(계산할 변수(거래금액을 숫자로 바꿈) ~ 기준변수(단지명 기준으로 그룹화를 시킴), 
#전체데이터셋, 기초통계량 함수 명(거래금액의 평균값을 구함))----->그룹별로 연산해주는 함수

head(apart_data_85_cost)

#"as.integer(거래금액)"을 "거래금액"으로 변경하여 저장

apart_data_85_cost <- rename(apart_data_85_cost, 
                             "거래금액" = "as.integer(거래금액)")


#단지명이 중복된 행을 제거하고 apart_data_85에 저장

apart_data_85 <- apart_data_85[!duplicated(apart_data_85$단지명),]

#맨 처음만난값을 true라고 하면 그 값과 똑같은 값이 나중에 나오면 
#false로 바꿈 

head(apart_data_85)#결과 확인하기

#"단지명"을기준으로 apart_data_85와 apart_data_85_cost 합치기

apart_data_85 <- left_join(apart_data_85, apart_data_85_cost, by = "단지명")
head(apart_data_85)#결과롹인하기

#"단지명", "시군구", "번지", "전용면적","거래금액.y"만 추출하고 저장

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

#거래금액.y를 "거래금액"으로 변경한 후 저장

apart_data_85 <- rename(apart_data_85, "거래금액" = "거래금액.y")
head(apart_data_85)#결과 확인하기

#paste()함수는 두가지문자를 묶어주는데 붙이면 
#기본적으로 한칸 띄어서(공백) 붙여지게 됨.
#"시군구"와 "번지" 열을 합친 후 apart_address에 저장

apart_address <- paste(apart_data_85$"시군구", apart_data_85$"번지")
head(apart_address)#결과확인하기기

#지금현재 벡터방식으로 나열되있으므로 원래 데이터와 붙이려면 데이터 프레임으로 변경해서 붙여야함.

#"시군구"와 "번지" 열을 합친 후 데이터 프레임 구조로 저장

apart_address <- paste(apart_data_85$시군구, apart_data_85$번지) %>% 
  data.frame()
head(apart_address)#결과 확인하기

# 컬럼명이 .으로 되있는걸 확인할 수 있음

#"."을 "주소"로 변경하여 저장
apart_address <- rename(apart_address,"주소" = ".")
head(apart_address) # 결과 확인하기기

#아파트 주소를 위도,경도로 변환하여 apart_address_code에 저장
apart_address_code <- as.character(apart_address$주소) %>% 
  enc2utf8() %>% geocode()
head(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)#결과확인하기

#마포구 지도 정보를 가져와 mapo_map에 저장
mapo_map <- get_googlemap("mapogu", maptype = "roadmap", zoom = 12)
ggmap(mapo_map)#구글지도호출

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))
#vjust값은 함부로 못바꿈

#홍대입구역 지도 정보를 가져와 hongdae_map 변수에 저장, 항상 구글맵 함수를 쓸때 변수에 저장해야 지도로 나온다는 거 유의!
hongdae_map <- get_googlemap("hongdae station", maptype = "roadmap", zoom = 15)
 #홍대입구역 지도에 지하철 정보 및 아파트 정보 일괄 표시
ggmap(hongdae_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)) + 
  geom_point(data = apart_code_final, aes(x = lon, y = lat)) + 
  geom_text(data = apart_code_final, aes(label = 단지명, vjust = -1)) + 
  geom_text(data = apart_code_final, aes(label = 거래금액, vjust = 1), colour = "red")

 

 

 

 

#야구선수별 연봉대비 출루율 분석
data <- read.csv("./day6/data/주요선수별성적-2013년.csv", header =T)
head(data,25)
#연봉대비 출루율 시각화
bp <- barplot(data$연봉대비출루율,
              main=paste("야구 선수별 연봉 대비 출루율 분석","\n", "(밥값여부계산 ^^;;)"),
              col=rainbow(25) ,
              cex.names=0.7, las=2,
              names.arg=data$선수명, ylim=c(0,50))
#las옵션:글씨방향, "\n"은 줄바꿈
#y축레이블과 색상 지정
title(ylab="연봉대비출루율", col.lab="red")
#연봉대비출루율 평균값 구하고 선그리기
aver <- 0 #저장 변수 //누적변수는 반드시 초기값을 세팅해야함.
for(i in 1:length(data$연봉대비출루율)){
  aver <- aver+data$연봉대비출루율[i]
}
aver
aver <- aver/length(data$연봉대비출루율)
aver
abline(h=aver, col="blue")
#평균선에 평균출루율 데이터 추가
text(x=aver-11, y=14.5,col="black", cex=0.8, labels = paste(aver, '%', "(평균출루율)"))
#text(시작점 위치 설정, 글씨 색깔, 크기 비율, 
#각막대그래프에 데이터 추가
text(x=bp*1.01, y=data$연봉대비출루율*1.05, col = "black", cex =0.7, labels=paste(data$연봉대비출루율,'%'))
 
#나이팅게일차트로 시각화 - 범례를 따로 만들어줘야 함 
data <- read.csv("./day6/data/주요선수별성적-2013년.csv", header =T)    
head(data)
#인덱싱을 선수명으로 변경
row.names(data) <- data$선수명 #인덱싱값 변경해주는 함수 
head(data)
#득점 안타 홈런 타점 도루 볼넷 타율 출루율만 추출
data2 <- data[,c(7,8,11,12,13,14,17,19)]
head(data2, 3)
stars(data2,
      flip.labels = FALSE, draw.segments = TRUE,
      frame.plot = TRUE, full = TRUE,
      main="야구선수별주요성적분석-2013년")
#stars함수(데이터셋, 해당 값의 레이블 명을 쓰지 않겠다, 분할하겠다는 뜻,
#시각화 할 차트를 그려서 그림으로 표현하겠다는 뜻, 모든값을 , plot 주제)

#범럐용 그래프 만들기
label <- names(data2)
val <- table(label)
color <- c("black","red","green","blue","cyan","violet","yellow","grey")
pie(val,labels = label,col=color,radius = 0.1, cex=0.6)
#연봉대비출루율과 연봉대비타점율 선그래프로 시각화 
#선수명 연봉대비 출루율 연봉대비타점율만 추출
data4 <- data[,c(2,21,22)]
head(data4,3)

line1 <- data$연봉대비출루율
line2 <- data$연봉대비타점율

#par()함수를 이용하여 마진을 설정
par(mar=c(5,4,4,4)+0.1)
#연봉대비타점율 시각화
plot(line1, type="o", axes=F,
     ylab="",xlab="",ylim=c(0,50),
     lty=2, lwd=2, col="blue",
     main="한국프로야구선수별 기록분석-2013년")
# axes=F -> 축은 그리지마라

#x축 설정, axis함수의 1은 x축을 나타내고 2는 y축임.

axis(1,at=1:25,lab=data4$선수명,las=2)

#y축 설정(왼쪽)

axis(2,las=1)

#연봉대비출루율을 추가로 더 그리기 위해 par()함수를 이용하여 새로운 그래프 추가
par(new=T)
#연봉대비출루율 시각화
plot(line2,type="o",axes = F,ylab="",xlab = "",ylim=c(0,50),lty=2,col="red")

#y축 설정(오른쪽)
axis(4,las=1)
#y축 레이블 설정(오른쪽)
mtext(side = 4, line=2.5,"연봉대비 타점율")
#y축 레이블 설정(왼쪽)
mtext(side=2,line = 2.5, "연봉대비 출루율")
#배경에 가이드라인을 격자 모양으로 추가
abline(h=seq(0,50,5),v=seq(1,25,1),col="gray",lty=2)
#범례 추가
legend(18,50,names(data[21:22]), cex=0.8,col=c("red","blue"),lty = 1,lwd=2,bg="white")

 

 

 

 

 

 

 

 

 

 

 

 

 

#치킨집이 가장 많은 지역 찾기
#치킨집 분포를 트리맵을 이용하여 시각화
library(readxl)
ck <- read_excel("./day6/data/치킨집_가공.xlsx")
head(ck)

#'소재지전체주소' 열에서 XXX동만 남기고 이후 상세 주소 삭제(추출)
#특정 문자열에서 일부를 추출하는 방법 : substr(문자열, 시작위치, 끝위치)

# 서울특별시 서대문구 남가좌동 289-1번지 (지상1층) => 남가좌동
# substr() 함수를 이용하여 소재지전체주소에 있는 12~16번째 문자 가져오기
addr <- substr(ck$소재지전체주소, 12, 16)
head(addr)

#동이름이 3글자, 4글자인 경우가 있기 때문에...
#동이름 뒤에 숫자가 포함된 데이터 전처리 : gsub("어떤 글자를", "무엇으로", " 어디에 있는")
#=> 공백 / 숫자를 제거 (정규표현식)
# 숫자제거
addr_num <- gsub("[0-9]", "", addr)
head(addr_num)
# 공백제거
addr_trim <- gsub(" ", "", addr_num)
head(addr_trim)
#동별 치킨집 갯수를 확인하여 트리맵으로 표현할 준비작업.
#table(데이터 셋1) : 도수분포표 생성
#table(데이터 셋1, 데이터 셋2) : 교차표 생성
#도수분포표 => 항목별 갯수를 나타낸 것.(동별 갯수 파악)
#교차표 => 2가지 변수에서 항목간의 빈도를 파악할 수 있도록 작성한 표

#table함수를 이용하여 숫자 세기, 변수가 한개일때는 도수분포표를 만들어줌.
addr_count <- addr_trim %>% table() %>% data.frame()
head(addr_count)
#table함수로 만들어진건 factor형태로 들어가기 때문에 시각화를 하려면 dataframe화를 시켜야 한다. 

install.packages("treemap")
library(treemap)

#treemap(데이터 세트,
#           index=구분 컬럼,
#           vSize=크기를 이용할 분포 컬럼,
#           vColor=컬러,
#           title=제목)

#동이름(.)과 치킨집 갯수(Freq)
treemap(addr_count,index = ".", vSize = "Freq", title="서대문구 동별 치킨집 분포")

 

 

 

 

 

 

 

 

````````````````````````````````````````````활용해보기``````````````````````````````````````````

 

 

#용인시 1년내에 허가 받은 음식점이 가장 많은 지역 찾기(4월 19일 기준)
#음식점 분포를 트리맵을 이용하여 시각화
library(readxl)
library(dplyr)
eat <- read_excel("./day6/data/07_24_04_P_일반음식점.xlsx")
head(eat)


# substr() 함수를 이용하여 소재지전체주소에 있는 13~17번째 문자 가져오기
adde <- substr(eat$소재지전체주소, 13, 17)
head(adde)

# 숫자제거
adde_num <- gsub("[0-9]", "", adde)
head(adde_num)
# 공백제거
adde_trim <- gsub(" ", "", adde_num)
head(adde_trim)

adde_count <- adde_trim %>% table() %>% data.frame()
head(adde_count)

library(treemap)

#동이름(.)과 음식점 갯수(Freq)
treemap(adde_count,index = ".", vSize = "Freq", title="1년내에 허가받은 용인시 동별 음식점 분포")