package 'hflights' successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\205\AppData\Local\Temp\RtmpwtIKSj\downloaded_packages
# 공통 패키지 로드
library(ggplot2)
Warning message:
"package 'ggplot2' was built under R version 3.6.3"
package 'ggthemes' successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\205\AppData\Local\Temp\RtmpILoNVt\downloaded_packages
# 데이터 로드
# read.csv의 옵션 default 값은 T
df <- read.csv('r-ggagi-data/example_coffee.csv', header = T, stringsAsFactors = T)
# 데이터 구조 파악
str(df)
'data.frame': 46832 obs. of 23 variables:
$ number : int 1 2 3 4 5 6 7 8 9 10 ...
$ companyName : Factor w/ 36991 levels "-10","#11(Sharp eleven)",..: 2 4 5 6 7 8 9 10 11 12 ...
$ adress : Factor w/ 45197 levels "","강원도 강릉시 강동면 안인진리 3-5번지 통일공원 G동 2층 ",..: 32695 45012 14332 25672 35262 44619 44059 16795 4038 16983 ...
$ adressBystreet : Factor w/ 38866 levels "","강원도 강릉시 가작로 13, 1층 (교동)",..: 28058 38633 12180 22436 1 38386 37843 14490 3373 14482 ...
$ dateOflicensing : int 20080917 20101124 20130902 20121108 20020911 20130822 20140605 20111209 20130315 20110908 ...
$ stateOfbusiness : Factor w/ 2 levels "운영중","폐업 등": 1 1 1 1 2 1 1 1 1 1 ...
$ dateOfclosure : int NA NA NA NA 20071105 NA NA NA NA NA ...
$ startdateOfcessation: logi NA NA NA NA NA NA ...
$ duedateOfcessation : logi NA NA NA NA NA NA ...
$ dateOfreOpen : logi NA NA NA NA NA NA ...
$ areaOfsite : logi NA NA NA NA NA NA ...
$ zip : logi NA NA NA NA NA NA ...
$ waterwork : Factor w/ 5 levels "","간이상수도",..: 4 4 4 4 4 4 4 4 4 4 ...
$ numOfmenWorker : int NA NA NA NA 0 NA NA NA NA NA ...
$ yearOfStart : int 2008 2010 2013 2012 2002 2013 2014 2011 2013 2011 ...
$ multipleUse : Factor w/ 3 levels "","N","Y": 2 2 2 2 2 2 2 2 2 2 ...
$ grade : Factor w/ 8 levels "","갑","관리",..: 1 1 1 1 1 1 1 1 1 1 ...
$ sizeOfsite : num 20.8 212.7 20 64.2 11.4 ...
$ numOfwomenWorker : int NA NA NA NA 0 NA NA NA NA NA ...
$ vicintyOfsite : Factor w/ 8 levels "","결혼예식장주변",..: 1 1 4 1 1 1 1 3 1 3 ...
$ sanitaryName : Factor w/ 2 levels "","휴게음식점": 2 2 2 2 2 2 2 2 2 2 ...
$ businessCondition : Factor w/ 2 levels "","커피숍": 2 2 2 2 2 2 2 2 2 2 ...
$ totalOfworker : int NA NA NA NA 0 NA NA NA NA NA ...
# 불필요한 변수 제거
# 로우데이터를 같은 변수로 하면 수정 할 때 문제생김 (df2를 df2로 할 경우)
df2 <- subset(df, select=c(-adressBystreet, -dateOfclosure, -startdateOfcessation, -duedateOfcessation, -dateOfreOpen, -zip))
str(df2)
'data.frame': 46832 obs. of 17 variables:
$ number : int 1 2 3 4 5 6 7 8 9 10 ...
$ companyName : Factor w/ 36991 levels "-10","#11(Sharp eleven)",..: 2 4 5 6 7 8 9 10 11 12 ...
$ adress : Factor w/ 45197 levels "","강원도 강릉시 강동면 안인진리 3-5번지 통일공원 G동 2층 ",..: 32695 45012 14332 25672 35262 44619 44059 16795 4038 16983 ...
$ dateOflicensing : int 20080917 20101124 20130902 20121108 20020911 20130822 20140605 20111209 20130315 20110908 ...
$ stateOfbusiness : Factor w/ 2 levels "운영중","폐업 등": 1 1 1 1 2 1 1 1 1 1 ...
$ areaOfsite : logi NA NA NA NA NA NA ...
$ waterwork : Factor w/ 5 levels "","간이상수도",..: 4 4 4 4 4 4 4 4 4 4 ...
$ numOfmenWorker : int NA NA NA NA 0 NA NA NA NA NA ...
$ yearOfStart : int 2008 2010 2013 2012 2002 2013 2014 2011 2013 2011 ...
$ multipleUse : Factor w/ 3 levels "","N","Y": 2 2 2 2 2 2 2 2 2 2 ...
$ grade : Factor w/ 8 levels "","갑","관리",..: 1 1 1 1 1 1 1 1 1 1 ...
$ sizeOfsite : num 20.8 212.7 20 64.2 11.4 ...
$ numOfwomenWorker : int NA NA NA NA 0 NA NA NA NA NA ...
$ vicintyOfsite : Factor w/ 8 levels "","결혼예식장주변",..: 1 1 4 1 1 1 1 3 1 3 ...
$ sanitaryName : Factor w/ 2 levels "","휴게음식점": 2 2 2 2 2 2 2 2 2 2 ...
$ businessCondition: Factor w/ 2 levels "","커피숍": 2 2 2 2 2 2 2 2 2 2 ...
$ totalOfworker : int NA NA NA NA 0 NA NA NA NA NA ...
# 최초 커피숍 찾기
range(df2$yearOfStart)
# 결측치를 제거해야 출력됨
range(df2$yearOfStart, na.rm=T) # 결측치 제거
subset(df2, subset = (yearOfStart == 1964))
<NA>
<NA>
1964
2015
number
companyName
adress
dateOflicensing
stateOfbusiness
areaOfsite
waterwork
numOfmenWorker
yearOfStart
multipleUse
grade
sizeOfsite
numOfwomenWorker
vicintyOfsite
sanitaryName
businessCondition
totalOfworker
23035
23035
엠에스커피
경기도 수원시 팔달구 매산로1가 16-5번지
19641125
폐업 등
NA
상수도전용
0
1964
N
0
0
기타
휴게음식점
커피숍
0
46290
46290
홀릭
부산광역시 중구 남포동4가 4-4번지 (2층)
19640929
폐업 등
NA
0
1964
N
기타
0
0
기타
휴게음식점
커피숍
0
# 가장 오래된 운영중인 커피숍 찾기
df_filter <- subset(df2, subset = (stateOfbusiness == '운영중'))
range(df_filter$yearOfStart, na.rm = T) # 결측치 제거
subset(df_filter, subset = (yearOfStart == 1967))
# 조건으로 특정 컬럼값 찾기 - which(), rownames 열조건 colnames
# 조건이 TRUE일 때만 찾아줌
# colnames(stat_table) == 1993
which(colnames(stat_table) == 1993)
which.max(colnames(stat_table))
26
48
# 원하는 컬럼으로 분할
stat_table_26_93 <- stat_table[,c(26:48)]
stat_table_26_93
# 서울특별시 종로구 (1111000000) => 서울특별시 종로구 이렇게 만들기
# 문자열 분리 - str_split_fixed()
install.packages('stringr')
package 'stringr' successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\205\AppData\Local\Temp\RtmpILoNVt\downloaded_packages
library('stringr')
# ( 기준으로 2개 분리
temp <- str_split_fixed(df[,1], '\\(', 2)
head(temp)
서울특별시
1100000000)
서울특별시 종로구
1111000000)
서울특별시 중구
1114000000)
서울특별시 용산구
1117000000)
서울특별시 성동구
1120000000)
서울특별시 광진구
1121500000)
# 공백 기준으로 시 구 분리 => 분리해야 더 다양한 분석 가능
new_city <- str_split_fixed(temp[,1], ' ', 2)
head(new_city)
서울특별시
서울특별시
종로구
서울특별시
중구
서울특별시
용산구
서울특별시
성동구
서울특별시
광진구
# 변수명 변경
colnames(new_city) <- c('Provinces', 'City')
head(new_city)
Provinces
City
서울특별시
서울특별시
종로구
서울특별시
중구
서울특별시
용산구
서울특별시
성동구
서울특별시
광진구
# 새로운 dataframe 생성
df_new <- data.frame(new_city, df[,c(2:7)])
df_new[df_new$Provinces == '세종특별자치시',]
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
82
세종특별자치시
185,212
72,733
2.55
93,058
92,154
1.01
83
세종특별자치시
185,212
72,733
2.55
93,058
92,154
1.01
# City 공백 => NA
df_new[df_new == ' '] <- NA
head(df_new)
df_new[df_new$Provinces == '세종특별자치시',]
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
서울특별시
NA
10,078,850
4,197,478
2.40
4,962,774
5,116,076
0.97
서울특별시
종로구
155,695
72,882
2.14
76,962
78,733
0.98
서울특별시
중구
126,817
59,614
2.13
63,292
63,525
1.00
서울특별시
용산구
235,186
108,138
2.17
114,119
121,067
0.94
서울특별시
성동구
298,145
126,915
2.35
148,265
149,880
0.99
서울특별시
광진구
362,197
158,769
2.28
177,946
184,251
0.97
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
82
세종특별자치시
NA
185,212
72,733
2.55
93,058
92,154
1.01
83
세종특별자치시
NA
185,212
72,733
2.55
93,058
92,154
1.01
# NA 행 삭제 - complete.cases() NA 가 있는 행 FALSE
df_new2 <- df_new[complete.cases(df_new),]
head(df_new2)
df_new2[df_new2$Provinces == '세종특별자치시',]
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
2
서울특별시
종로구
155,695
72,882
2.14
76,962
78,733
0.98
3
서울특별시
중구
126,817
59,614
2.13
63,292
63,525
1.00
4
서울특별시
용산구
235,186
108,138
2.17
114,119
121,067
0.94
5
서울특별시
성동구
298,145
126,915
2.35
148,265
149,880
0.99
6
서울특별시
광진구
362,197
158,769
2.28
177,946
184,251
0.97
7
서울특별시
동대문구
362,604
160,110
2.26
181,825
180,779
1.01
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
head(complete.cases(df_new))
FALSE
TRUE
TRUE
TRUE
TRUE
TRUE
# is.na() NA 가 있는 값 TRUE
head(is.na(df_new))
Provinces
City
Population
Households
PersInHou
Male
Female
SexRatio
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
# NA 가 있는 행 불러오기
df_new3 <- df_new[is.na(df_new$City),]
df_new3
# 그룹별로 동일한 함수 적용 - tapply(적용할 변수, 그룹지을 변수, 적용할 변수)
# tapply(heigh, sex, mean) - 성별로 키 값 평균
# 도(첫번째 변수)별 인구수 합계
sum_pop <- tapply(df_fin$Population, df_fin$Provinces, sum)
sum_pop
강원도
1547166
경기도
18723822
경상남도
4428762
경상북도
3215695
광주광역시
1476974
대구광역시
2491137
대전광역시
1525656
부산광역시
3517491
서울특별시
10078850
세종특별자치시
<NA>
울산광역시
1169768
인천광역시
2914271
전라남도
1902638
전라북도
2523806
제주특별자치도
615250
충청남도
2671383
충청북도
2414568
# Level 값이 남아있어 나온 세종특별자치시 삭제
df_fin[, 1] <- factor(df_fin[, 1]) #값이 없는 level 삭제됨
sum_pop <- tapply(df_fin$Population, df_fin$Provinces, sum)
sum_pop