기본적인 데이터 다루기

## csv 파일을 불러온다.
seoul0 <- read.csv("C:\\r_project\\dv\\201812_202212_주민등록인구및세대현황_연간.csv", 
                   fileEncoding = "euc-kr")

## 데이터 프레임의 변수와 맨 위 몇개의 관측치를 읽어온다.
head(seoul0)
##                         행정구역 X2018년_총인구수 X2018년_세대수
## 1       서울특별시  (1100000000)        9,765,623      4,263,868
## 2 서울특별시 종로구 (1111000000)          153,065         73,735
## 3   서울특별시 중구 (1114000000)          125,725         61,502
## 4 서울특별시 용산구 (1117000000)          228,999        108,974
## 5 서울특별시 성동구 (1120000000)          308,221        137,209
## 6 서울특별시 광진구 (1121500000)          355,559        162,606
##   X2018년_세대당.인구 X2018년_남자.인구수 X2018년_여자.인구수 X2018년_남여.비율
## 1                2.29           4,773,899           4,991,724              0.96
## 2                2.08              74,825              78,240              0.96
## 3                2.04              61,947              63,778              0.97
## 4                2.10             110,640             118,359              0.93
## 5                2.25             151,359             156,862              0.96
## 6                2.19             172,794             182,765              0.95
##   X2019년_총인구수 X2019년_세대수 X2019년_세대당.인구 X2019년_남자.인구수
## 1        9,729,107      4,327,605                2.25           4,744,059
## 2          151,290         73,947                2.05              73,746
## 3          126,171         62,739                2.01              61,910
## 4          228,670        110,126                2.08             110,356
## 5          300,889        135,838                2.22             147,273
## 6          351,350        164,428                2.14             170,262
##   X2019년_여자.인구수 X2019년_남여.비율 X2020년_총인구수 X2020년_세대수
## 1           4,985,048              0.95        9,668,465      4,417,954
## 2              77,544              0.95          149,384         75,003
## 3              64,261              0.96          125,240         63,686
## 4             118,314              0.93          230,040        113,093
## 5             153,616              0.96          293,556        135,870
## 6             181,088              0.94          346,682        167,427
##   X2020년_세대당.인구 X2020년_남자.인구수 X2020년_여자.인구수 X2020년_남여.비율
## 1                2.19           4,701,723           4,966,742              0.95
## 2                1.99              72,635              76,749              0.95
## 3                1.97              61,222              64,018              0.96
## 4                2.03             110,722             119,318              0.93
## 5                2.16             143,387             150,169              0.95
## 6                2.07             167,310             179,372              0.93
##   X2021년_총인구수 X2021년_세대수 X2021년_세대당.인구 X2021년_남자.인구수
## 1        9,509,458      4,426,007                2.15           4,618,040
## 2          144,683         73,494                1.97              70,183
## 3          122,499         63,519                1.93              59,630
## 4          222,953        111,036                2.01             107,210
## 5          285,990        134,233                2.13             139,380
## 6          339,996        167,949                2.02             164,058
##   X2021년_여자.인구수 X2021년_남여.비율 X2022년_총인구수 X2022년_세대수
## 1           4,891,418              0.94        9,428,372      4,446,296
## 2              74,500              0.94          141,379         72,524
## 3              62,869              0.95          120,437         63,139
## 4             115,743              0.93          218,650        109,805
## 5             146,610              0.95          281,000        133,305
## 6             175,938              0.93          337,416        169,291
##   X2022년_세대당.인구 X2022년_남자.인구수 X2022년_여자.인구수 X2022년_남여.비율
## 1                2.12           4,570,048           4,858,324              0.94
## 2                1.95              68,395              72,984              0.94
## 3                1.91              58,563              61,874              0.95
## 4                1.99             105,087             113,563              0.93
## 5                2.11             136,633             144,367              0.95
## 6                1.99             162,541             174,875              0.93
## 총계를 나타내는 첫 행을 삭제한다. 
seoul0 <- seoul0[-1,]

## 데이터 프레임의 요약/기초통계를 본다. 
summary(seoul0)
##    행정구역         X2018년_총인구수   X2018년_세대수     X2018년_세대당.인구
##  Length:25          Length:25          Length:25          Min.   :1.910      
##  Class :character   Class :character   Class :character   1st Qu.:2.170      
##  Mode  :character   Mode  :character   Mode  :character   Median :2.240      
##                                                           Mean   :2.274      
##                                                           3rd Qu.:2.370      
##                                                           Max.   :2.630      
##  X2018년_남자.인구수 X2018년_여자.인구수 X2018년_남여.비율 X2019년_총인구수  
##  Length:25           Length:25           Min.   :0.9100    Length:25         
##  Class :character    Class :character    1st Qu.:0.9400    Class :character  
##  Mode  :character    Mode  :character    Median :0.9600    Mode  :character  
##                                          Mean   :0.9592                      
##                                          3rd Qu.:0.9800                      
##                                          Max.   :1.0300                      
##  X2019년_세대수     X2019년_세대당.인구 X2019년_남자.인구수 X2019년_여자.인구수
##  Length:25          Min.   :1.860       Length:25           Length:25          
##  Class :character   1st Qu.:2.110       Class :character    Class :character   
##  Mode  :character   Median :2.210       Mode  :character    Mode  :character   
##                     Mean   :2.233                                              
##                     3rd Qu.:2.340                                              
##                     Max.   :2.580                                              
##  X2019년_남여.비율 X2020년_총인구수   X2020년_세대수     X2020년_세대당.인구
##  Min.   :0.9000    Length:25          Length:25          Min.   :1.800      
##  1st Qu.:0.9400    Class :character   Class :character   1st Qu.:2.050      
##  Median :0.9500    Mode  :character   Mode  :character   Median :2.160      
##  Mean   :0.9544                                          Mean   :2.173      
##  3rd Qu.:0.9800                                          3rd Qu.:2.300      
##  Max.   :1.0300                                          Max.   :2.510      
##  X2020년_남자.인구수 X2020년_여자.인구수 X2020년_남여.비율 X2021년_총인구수  
##  Length:25           Length:25           Min.   :0.8900    Length:25         
##  Class :character    Class :character    1st Qu.:0.9300    Class :character  
##  Mode  :character    Mode  :character    Median :0.9500    Mode  :character  
##                                          Mean   :0.9492                      
##                                          3rd Qu.:0.9700                      
##                                          Max.   :1.0200                      
##  X2021년_세대수     X2021년_세대당.인구 X2021년_남자.인구수 X2021년_여자.인구수
##  Length:25          Min.   :1.760       Length:25           Length:25          
##  Class :character   1st Qu.:2.010       Class :character    Class :character   
##  Mode  :character   Median :2.120       Mode  :character    Mode  :character   
##                     Mean   :2.135                                              
##                     3rd Qu.:2.280                                              
##                     Max.   :2.470                                              
##  X2021년_남여.비율 X2022년_총인구수   X2022년_세대수     X2022년_세대당.인구
##  Min.   :0.8900    Length:25          Length:25          Min.   :1.720      
##  1st Qu.:0.9300    Class :character   Class :character   1st Qu.:1.990      
##  Median :0.9400    Mode  :character   Mode  :character   Median :2.080      
##  Mean   :0.9468                                          Mean   :2.107      
##  3rd Qu.:0.9600                                          3rd Qu.:2.250      
##  Max.   :1.0200                                          Max.   :2.430      
##  X2022년_남자.인구수 X2022년_여자.인구수 X2022년_남여.비율
##  Length:25           Length:25           Min.   :0.8800   
##  Class :character    Class :character    1st Qu.:0.9300   
##  Mode  :character    Mode  :character    Median :0.9400   
##                                          Mean   :0.9436   
##                                          3rd Qu.:0.9600   
##                                          Max.   :1.0200

시각화를 위한 long form <-> wide form으로의 변환

## 데이터 구조변환을 다루는 라이브러리 reshape2를 불러온다. 
library(reshape2)

## 데이터 프레임의 차원을 본다. 
dim(seoul0)
## [1] 25 31
## long form으로 데이터를 변환한다. 
seoul1 <- melt(seoul0, id.vars = c("행정구역"))

head(seoul1)
##                           행정구역         variable   value
## 1   서울특별시 종로구 (1111000000) X2018년_총인구수 153,065
## 2     서울특별시 중구 (1114000000) X2018년_총인구수 125,725
## 3   서울특별시 용산구 (1117000000) X2018년_총인구수 228,999
## 4   서울특별시 성동구 (1120000000) X2018년_총인구수 308,221
## 5   서울특별시 광진구 (1121500000) X2018년_총인구수 355,559
## 6 서울특별시 동대문구 (1123000000) X2018년_총인구수 348,052
## 데이터 프레임의 변수명을 다시 지정한다. 
names(seoul1) <- c("id", "index0", "value")

head(seoul1)
##                                 id           index0   value
## 1   서울특별시 종로구 (1111000000) X2018년_총인구수 153,065
## 2     서울특별시 중구 (1114000000) X2018년_총인구수 125,725
## 3   서울특별시 용산구 (1117000000) X2018년_총인구수 228,999
## 4   서울특별시 성동구 (1120000000) X2018년_총인구수 308,221
## 5   서울특별시 광진구 (1121500000) X2018년_총인구수 355,559
## 6 서울특별시 동대문구 (1123000000) X2018년_총인구수 348,052
## 연도 변수를 생성한다. 
seoul1$year <- as.numeric(substr(seoul1$index0, 2, 5))

## 각 관측치의 값이 무엇을 의미하는지에 대한 설명(향후 변수명)을 생성한다. 
seoul1$type <- substr(seoul1$index0, 8, 20)

head(seoul1)
##                                 id           index0   value year     type
## 1   서울특별시 종로구 (1111000000) X2018년_총인구수 153,065 2018 총인구수
## 2     서울특별시 중구 (1114000000) X2018년_총인구수 125,725 2018 총인구수
## 3   서울특별시 용산구 (1117000000) X2018년_총인구수 228,999 2018 총인구수
## 4   서울특별시 성동구 (1120000000) X2018년_총인구수 308,221 2018 총인구수
## 5   서울특별시 광진구 (1121500000) X2018년_총인구수 355,559 2018 총인구수
## 6 서울특별시 동대문구 (1123000000) X2018년_총인구수 348,052 2018 총인구수
## 필요 없어진 두 번째 변수를 삭제한다. 
seoul1 <- seoul1[, -2]

## 변수에서 필요 없는 ","를 삭제한다. 
seoul1$value <- as.numeric(gsub(",", "", seoul1$value))

head(seoul1)
##                                 id  value year     type
## 1   서울특별시 종로구 (1111000000) 153065 2018 총인구수
## 2     서울특별시 중구 (1114000000) 125725 2018 총인구수
## 3   서울특별시 용산구 (1117000000) 228999 2018 총인구수
## 4   서울특별시 성동구 (1120000000) 308221 2018 총인구수
## 5   서울특별시 광진구 (1121500000) 355559 2018 총인구수
## 6 서울특별시 동대문구 (1123000000) 348052 2018 총인구수
## id와 연도를 기준으로 wide form으로 변환한다. 
seoul2 <- dcast(seoul1, id + year ~ type)

head(seoul2)
##                               id year 남여.비율 남자.인구수 세대당.인구 세대수
## 1 서울특별시 강남구 (1168000000) 2018      0.92      259611        2.37 228775
## 2 서울특별시 강남구 (1168000000) 2019      0.92      260806        2.34 232981
## 3 서울특별시 강남구 (1168000000) 2020      0.92      257999        2.30 234872
## 4 서울특별시 강남구 (1168000000) 2021      0.92      255047        2.28 234233
## 5 서울특별시 강남구 (1168000000) 2022      0.92      253072        2.27 232777
## 6 서울특별시 강동구 (1174000000) 2018      0.98      211816        2.41 177247
##   여자.인구수 총인구수
## 1      282753   542364
## 2      284363   545169
## 3      281232   539231
## 4      277995   533042
## 5      276030   529102
## 6      215757   427573

텍스트 함수를 이용한 변수 정리

## 텍스트 함수를 이용하여 서울특별시 자치구 / 코드를 분리한다. 

## id변수를 따로 뽑는다. 
index0 <- seoul2$id

head(index0)
## [1] "서울특별시 강남구 (1168000000)" "서울특별시 강남구 (1168000000)"
## [3] "서울특별시 강남구 (1168000000)" "서울특별시 강남구 (1168000000)"
## [5] "서울특별시 강남구 (1168000000)" "서울특별시 강동구 (1174000000)"
## 공백을 기준으로 끊는다. 
index1 <- strsplit(index0, " ")

head(index1)
## [[1]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 
## [[2]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 
## [[3]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 
## [[4]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 
## [[5]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 
## [[6]]
## [1] "서울특별시"   "강동구"       "(1174000000)"
## 리스트를 접근하는 법
index1[[2]]
## [1] "서울특별시"   "강남구"       "(1168000000)"
## 리스트의 길이
length(index1)
## [1] 125
## 반복문을 이용하여 구별 이름과 코드를 추출한다. 

name <- c()
code <- c()

for (i in 1:length(index1))
{
  temp_name <- index1[[i]][2]
  temp_code <- index1[[i]][3]
  name <- append(name, temp_name)
  code <- append(code, temp_code)
}

name
##   [1] "강남구"   "강남구"   "강남구"   "강남구"   "강남구"   "강동구"  
##   [7] "강동구"   "강동구"   "강동구"   "강동구"   "강북구"   "강북구"  
##  [13] "강북구"   "강북구"   "강북구"   "강서구"   "강서구"   "강서구"  
##  [19] "강서구"   "강서구"   "관악구"   "관악구"   "관악구"   "관악구"  
##  [25] "관악구"   "광진구"   "광진구"   "광진구"   "광진구"   "광진구"  
##  [31] "구로구"   "구로구"   "구로구"   "구로구"   "구로구"   "금천구"  
##  [37] "금천구"   "금천구"   "금천구"   "금천구"   "노원구"   "노원구"  
##  [43] "노원구"   "노원구"   "노원구"   "도봉구"   "도봉구"   "도봉구"  
##  [49] "도봉구"   "도봉구"   "동대문구" "동대문구" "동대문구" "동대문구"
##  [55] "동대문구" "동작구"   "동작구"   "동작구"   "동작구"   "동작구"  
##  [61] "마포구"   "마포구"   "마포구"   "마포구"   "마포구"   "서대문구"
##  [67] "서대문구" "서대문구" "서대문구" "서대문구" "서초구"   "서초구"  
##  [73] "서초구"   "서초구"   "서초구"   "성동구"   "성동구"   "성동구"  
##  [79] "성동구"   "성동구"   "성북구"   "성북구"   "성북구"   "성북구"  
##  [85] "성북구"   "송파구"   "송파구"   "송파구"   "송파구"   "송파구"  
##  [91] "양천구"   "양천구"   "양천구"   "양천구"   "양천구"   "영등포구"
##  [97] "영등포구" "영등포구" "영등포구" "영등포구" "용산구"   "용산구"  
## [103] "용산구"   "용산구"   "용산구"   "은평구"   "은평구"   "은평구"  
## [109] "은평구"   "은평구"   "종로구"   "종로구"   "종로구"   "종로구"  
## [115] "종로구"   "중구"     "중구"     "중구"     "중구"     "중구"    
## [121] "중랑구"   "중랑구"   "중랑구"   "중랑구"   "중랑구"
code
##   [1] "(1168000000)" "(1168000000)" "(1168000000)" "(1168000000)" "(1168000000)"
##   [6] "(1174000000)" "(1174000000)" "(1174000000)" "(1174000000)" "(1174000000)"
##  [11] "(1130500000)" "(1130500000)" "(1130500000)" "(1130500000)" "(1130500000)"
##  [16] "(1150000000)" "(1150000000)" "(1150000000)" "(1150000000)" "(1150000000)"
##  [21] "(1162000000)" "(1162000000)" "(1162000000)" "(1162000000)" "(1162000000)"
##  [26] "(1121500000)" "(1121500000)" "(1121500000)" "(1121500000)" "(1121500000)"
##  [31] "(1153000000)" "(1153000000)" "(1153000000)" "(1153000000)" "(1153000000)"
##  [36] "(1154500000)" "(1154500000)" "(1154500000)" "(1154500000)" "(1154500000)"
##  [41] "(1135000000)" "(1135000000)" "(1135000000)" "(1135000000)" "(1135000000)"
##  [46] "(1132000000)" "(1132000000)" "(1132000000)" "(1132000000)" "(1132000000)"
##  [51] "(1123000000)" "(1123000000)" "(1123000000)" "(1123000000)" "(1123000000)"
##  [56] "(1159000000)" "(1159000000)" "(1159000000)" "(1159000000)" "(1159000000)"
##  [61] "(1144000000)" "(1144000000)" "(1144000000)" "(1144000000)" "(1144000000)"
##  [66] "(1141000000)" "(1141000000)" "(1141000000)" "(1141000000)" "(1141000000)"
##  [71] "(1165000000)" "(1165000000)" "(1165000000)" "(1165000000)" "(1165000000)"
##  [76] "(1120000000)" "(1120000000)" "(1120000000)" "(1120000000)" "(1120000000)"
##  [81] "(1129000000)" "(1129000000)" "(1129000000)" "(1129000000)" "(1129000000)"
##  [86] "(1171000000)" "(1171000000)" "(1171000000)" "(1171000000)" "(1171000000)"
##  [91] "(1147000000)" "(1147000000)" "(1147000000)" "(1147000000)" "(1147000000)"
##  [96] "(1156000000)" "(1156000000)" "(1156000000)" "(1156000000)" "(1156000000)"
## [101] "(1117000000)" "(1117000000)" "(1117000000)" "(1117000000)" "(1117000000)"
## [106] "(1138000000)" "(1138000000)" "(1138000000)" "(1138000000)" "(1138000000)"
## [111] "(1111000000)" "(1111000000)" "(1111000000)" "(1111000000)" "(1111000000)"
## [116] "(1114000000)" "(1114000000)" "(1114000000)" "(1114000000)" "(1114000000)"
## [121] "(1126000000)" "(1126000000)" "(1126000000)" "(1126000000)" "(1126000000)"
## 코드에서 필요한 부분만 추출한다. 
code <- substr(code, 2, 6)

code
##   [1] "11680" "11680" "11680" "11680" "11680" "11740" "11740" "11740" "11740"
##  [10] "11740" "11305" "11305" "11305" "11305" "11305" "11500" "11500" "11500"
##  [19] "11500" "11500" "11620" "11620" "11620" "11620" "11620" "11215" "11215"
##  [28] "11215" "11215" "11215" "11530" "11530" "11530" "11530" "11530" "11545"
##  [37] "11545" "11545" "11545" "11545" "11350" "11350" "11350" "11350" "11350"
##  [46] "11320" "11320" "11320" "11320" "11320" "11230" "11230" "11230" "11230"
##  [55] "11230" "11590" "11590" "11590" "11590" "11590" "11440" "11440" "11440"
##  [64] "11440" "11440" "11410" "11410" "11410" "11410" "11410" "11650" "11650"
##  [73] "11650" "11650" "11650" "11200" "11200" "11200" "11200" "11200" "11290"
##  [82] "11290" "11290" "11290" "11290" "11710" "11710" "11710" "11710" "11710"
##  [91] "11470" "11470" "11470" "11470" "11470" "11560" "11560" "11560" "11560"
## [100] "11560" "11170" "11170" "11170" "11170" "11170" "11380" "11380" "11380"
## [109] "11380" "11380" "11110" "11110" "11110" "11110" "11110" "11140" "11140"
## [118] "11140" "11140" "11140" "11260" "11260" "11260" "11260" "11260"
dim(seoul2)
## [1] 125   8
head(seoul2)
##                               id year 남여.비율 남자.인구수 세대당.인구 세대수
## 1 서울특별시 강남구 (1168000000) 2018      0.92      259611        2.37 228775
## 2 서울특별시 강남구 (1168000000) 2019      0.92      260806        2.34 232981
## 3 서울특별시 강남구 (1168000000) 2020      0.92      257999        2.30 234872
## 4 서울특별시 강남구 (1168000000) 2021      0.92      255047        2.28 234233
## 5 서울특별시 강남구 (1168000000) 2022      0.92      253072        2.27 232777
## 6 서울특별시 강동구 (1174000000) 2018      0.98      211816        2.41 177247
##   여자.인구수 총인구수
## 1      282753   542364
## 2      284363   545169
## 3      281232   539231
## 4      277995   533042
## 5      276030   529102
## 6      215757   427573
## 구별 이름, 코드가 포함된 데이터프레임을 새로 만든다. 
seoul3 <- data.frame(name, code, seoul2[,2:8])

## tip: 데이터 프레임을 정렬하고 싶다
seoul4 <- seoul3[order(seoul3$code, -seoul3$year), ]

head(seoul4, 10)
##       name  code year 남여.비율 남자.인구수 세대당.인구 세대수 여자.인구수
## 115 종로구 11110 2022      0.94       68395        1.95  72524       72984
## 114 종로구 11110 2021      0.94       70183        1.97  73494       74500
## 113 종로구 11110 2020      0.95       72635        1.99  75003       76749
## 112 종로구 11110 2019      0.95       73746        2.05  73947       77544
## 111 종로구 11110 2018      0.96       74825        2.08  73735       78240
## 120   중구 11140 2022      0.95       58563        1.91  63139       61874
## 119   중구 11140 2021      0.95       59630        1.93  63519       62869
## 118   중구 11140 2020      0.96       61222        1.97  63686       64018
## 117   중구 11140 2019      0.96       61910        2.01  62739       64261
## 116   중구 11140 2018      0.97       61947        2.04  61502       63778
##     총인구수
## 115   141379
## 114   144683
## 113   149384
## 112   151290
## 111   153065
## 120   120437
## 119   122499
## 118   125240
## 117   126171
## 116   125725
## 원래 정렬로 되돌리기

seoul4 <- seoul4[order(as.numeric(rownames(seoul4))), ]

head(seoul4, 15)
##      name  code year 남여.비율 남자.인구수 세대당.인구 세대수 여자.인구수
## 1  강남구 11680 2018      0.92      259611        2.37 228775      282753
## 2  강남구 11680 2019      0.92      260806        2.34 232981      284363
## 3  강남구 11680 2020      0.92      257999        2.30 234872      281232
## 4  강남구 11680 2021      0.92      255047        2.28 234233      277995
## 5  강남구 11680 2022      0.92      253072        2.27 232777      276030
## 6  강동구 11740 2018      0.98      211816        2.41 177247      215757
## 7  강동구 11740 2019      0.98      215335        2.38 183390      220732
## 8  강동구 11740 2020      0.97      226216        2.34 196499      233754
## 9  강동구 11740 2021      0.96      227002        2.29 201613      235662
## 10 강동구 11740 2022      0.96      225221        2.28 202169      234846
## 11 강북구 11305 2018      0.96      156071        2.23 143395      163093
## 12 강북구 11305 2019      0.95      153235        2.18 144277      160719
## 13 강북구 11305 2020      0.95      150143        2.11 145896      157912
## 14 강북구 11305 2021      0.95      145705        2.07 144536      153477
## 15 강북구 11305 2022      0.94      142567        2.03 144313      151093
##    총인구수
## 1    542364
## 2    545169
## 3    539231
## 4    533042
## 5    529102
## 6    427573
## 7    436067
## 8    459970
## 9    462664
## 10   460067
## 11   319164
## 12   313954
## 13   308055
## 14   299182
## 15   293660
## 변수명을 영어로 새로 저장한다. 
names(seoul3) <- c("gu", "code", "year", 
                   "gender_ratio", "men", "pop_household", 
                   "household", "women", "total")

## 성비를 다시 계산한다. 
seoul3$gender_ratio2 <- with(seoul3, men/women)

head(seoul3)
##       gu  code year gender_ratio    men pop_household household  women  total
## 1 강남구 11680 2018         0.92 259611          2.37    228775 282753 542364
## 2 강남구 11680 2019         0.92 260806          2.34    232981 284363 545169
## 3 강남구 11680 2020         0.92 257999          2.30    234872 281232 539231
## 4 강남구 11680 2021         0.92 255047          2.28    234233 277995 533042
## 5 강남구 11680 2022         0.92 253072          2.27    232777 276030 529102
## 6 강동구 11740 2018         0.98 211816          2.41    177247 215757 427573
##   gender_ratio2
## 1     0.9181547
## 2     0.9171587
## 3     0.9173885
## 4     0.9174518
## 5     0.9168279
## 6     0.9817341

막대그래프의 시각화

## 시각화와 기초연산을 위한 패키지를 불러온다. 
library(ggplot2)
library(dplyr)
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 기본적인 막대그래프를 그려보자. 

## 파이프라인을 사용하여 서울시 구별 총 인구의 기술통계를 뽑아보자. 
seoul_18_22 <- seoul3 %>%
  group_by(year) %>%
  summarize(total = sum(total))

seoul_18_22
## # A tibble: 5 × 2
##    year   total
##   <dbl>   <dbl>
## 1  2018 9765623
## 2  2019 9729107
## 3  2020 9668465
## 4  2021 9509458
## 5  2022 9428372
ggplot(seoul_18_22, aes(x = year, y = total)) + geom_col()

## 특정 구만 뽑는다면
jongro0 <- seoul3[seoul3$gu == "종로구",]

ggplot(jongro0, aes(x = year, y = total)) + geom_col()

## 25개 자치구 다 뽑아보자
ggplot(seoul3, aes(x = year, y = total)) + geom_col() + facet_wrap(~gu)

## 두 개의 막대그래프를 같이 그려보자
## 종로구의 여성과 남성 인구 추이는?
jongro0
##         gu  code year gender_ratio   men pop_household household women  total
## 111 종로구 11110 2018         0.96 74825          2.08     73735 78240 153065
## 112 종로구 11110 2019         0.95 73746          2.05     73947 77544 151290
## 113 종로구 11110 2020         0.95 72635          1.99     75003 76749 149384
## 114 종로구 11110 2021         0.94 70183          1.97     73494 74500 144683
## 115 종로구 11110 2022         0.94 68395          1.95     72524 72984 141379
##     gender_ratio2
## 111     0.9563522
## 112     0.9510214
## 113     0.9463967
## 114     0.9420537
## 115     0.9371232
jongro1 <- select(jongro0, c(gu, year, men, women))
jongro1
##         gu year   men women
## 111 종로구 2018 74825 78240
## 112 종로구 2019 73746 77544
## 113 종로구 2020 72635 76749
## 114 종로구 2021 70183 74500
## 115 종로구 2022 68395 72984
## 시각화를 위해 long form으로 변환하자
jongro2 <- melt(jongro1, id.vars = c("gu", "year"))
jongro2
##        gu year variable value
## 1  종로구 2018      men 74825
## 2  종로구 2019      men 73746
## 3  종로구 2020      men 72635
## 4  종로구 2021      men 70183
## 5  종로구 2022      men 68395
## 6  종로구 2018    women 78240
## 7  종로구 2019    women 77544
## 8  종로구 2020    women 76749
## 9  종로구 2021    women 74500
## 10 종로구 2022    women 72984
## long form data의 시각화시 변수명으로 그룹을 구분한다. 
ggplot(jongro2, aes(x = year, y = value, fill = variable)) + 
  geom_col(position = "dodge")

## 하나의 막대그래프에 쌓아보자. 
ggplot(jongro2, aes(x = year, y = value, fill = variable)) + 
  geom_col(position = position_stack())

## 막대그래프의 쌓는 순서를 바꿔보자. 
ggplot(jongro2, aes(x = year, y = value, fill = variable)) + 
  geom_col(position = position_stack(reverse = TRUE))

## 쌓는 그래프를 백분율 기준으로 바꿔보자. 
ggplot(jongro2, aes(x = year, y = value, fill = variable)) +
  geom_col(position = "fill")

## +- 그래프를 그려보자
## 송파구만 추출해 보자. 
songpa0 <- seoul3[seoul3$gu == "송파구",]

## 송파구 필요한 변수만 추출해 보자. 
songpa1 <- select(songpa0, c(gu, year, total))

songpa1
##        gu year  total
## 86 송파구 2018 666635
## 87 송파구 2019 675961
## 88 송파구 2020 667960
## 89 송파구 2021 658338
## 90 송파구 2022 658801
## lag문의 사용
lag(songpa1$total)
## [1]     NA 666635 675961 667960 658338
c(NA, songpa1$total[1:4])
## [1]     NA 666635 675961 667960 658338
## 시차 변수를 추가한다. 
songpa1$total_reg <- lag(songpa1$total)

## 연도 간 인구 증가를 구한다. 
songpa1$div <- with(songpa1, total - total_reg)

## 첫 행 데이터를 날린다. 
songpa1 <- songpa1[-1, ]

## 부호에 따라 그룹을 구분한다. 
songpa1$pos <- ifelse(songpa1$div >=0, "1_plus", "2_minus")

## 부호 그룹에 따라 시각화를 표현한다. 
ggplot(songpa1, aes(x = year, y = div, fill = pos)) + geom_col()

## 히스토그램을 그려보자. 
## 2022년 데이터만 추출한다. 
seoul_2022 <- subset(seoul3, year == 2022)

head(seoul_2022)
##        gu  code year gender_ratio    men pop_household household  women  total
## 5  강남구 11680 2022         0.92 253072          2.27    232777 276030 529102
## 10 강동구 11740 2022         0.96 225221          2.28    202169 234846 460067
## 15 강북구 11305 2022         0.94 142567          2.03    144313 151093 293660
## 20 강서구 11500 2022         0.92 273203          2.08    273697 295963 569166
## 25 관악구 11620 2022         1.01 244748          1.72    283623 242004 486752
## 30 광진구 11215 2022         0.93 162541          1.99    169291 174875 337416
##    gender_ratio2
## 5      0.9168279
## 10     0.9590157
## 15     0.9435712
## 20     0.9230985
## 25     1.0113387
## 30     0.9294696
## 서울특별시 자치구 2022년 인구의 히스토그램을 그려보자. 
ggplot(seoul_2022, aes(x = total)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## bin 수를 다듬어보자. 
ggplot(seoul_2022, aes(x = total)) + geom_histogram(bins = 5)

## 동일한 형식의 그림을 여러 장 그릴 때는?

## 코드명을 저장한다. 
loop <- seoul3$code
loop
##   [1] "11680" "11680" "11680" "11680" "11680" "11740" "11740" "11740" "11740"
##  [10] "11740" "11305" "11305" "11305" "11305" "11305" "11500" "11500" "11500"
##  [19] "11500" "11500" "11620" "11620" "11620" "11620" "11620" "11215" "11215"
##  [28] "11215" "11215" "11215" "11530" "11530" "11530" "11530" "11530" "11545"
##  [37] "11545" "11545" "11545" "11545" "11350" "11350" "11350" "11350" "11350"
##  [46] "11320" "11320" "11320" "11320" "11320" "11230" "11230" "11230" "11230"
##  [55] "11230" "11590" "11590" "11590" "11590" "11590" "11440" "11440" "11440"
##  [64] "11440" "11440" "11410" "11410" "11410" "11410" "11410" "11650" "11650"
##  [73] "11650" "11650" "11650" "11200" "11200" "11200" "11200" "11200" "11290"
##  [82] "11290" "11290" "11290" "11290" "11710" "11710" "11710" "11710" "11710"
##  [91] "11470" "11470" "11470" "11470" "11470" "11560" "11560" "11560" "11560"
## [100] "11560" "11170" "11170" "11170" "11170" "11170" "11380" "11380" "11380"
## [109] "11380" "11380" "11110" "11110" "11110" "11110" "11110" "11140" "11140"
## [118] "11140" "11140" "11140" "11260" "11260" "11260" "11260" "11260"
## 코드명의 중복을 제거한다. 
loop <- unique(loop)
loop
##  [1] "11680" "11740" "11305" "11500" "11620" "11215" "11530" "11545" "11350"
## [10] "11320" "11230" "11590" "11440" "11410" "11650" "11200" "11290" "11710"
## [19] "11470" "11560" "11170" "11380" "11110" "11140" "11260"
## 코드명을 오름차순으로 정렬한다. 
loop <- sort(loop)
loop
##  [1] "11110" "11140" "11170" "11200" "11215" "11230" "11260" "11290" "11305"
## [10] "11320" "11350" "11380" "11410" "11440" "11470" "11500" "11530" "11545"
## [19] "11560" "11590" "11620" "11650" "11680" "11710" "11740"
## 현재 파일의 저장경로를 확인한다.  
getwd()
## [1] "C:/r_project/dv/markdown"
## 현재 파일의 저장경로를 변경한다. 
setwd("C:\\r_project\\dv")

## loop문으로 코드명 순의 파일을 저장한다. 

for (i in loop)
{
  sub_seoul <- seoul3[seoul3$code == i,]
  ggplot(sub_seoul, aes(x = year, y = total)) + geom_col()
  ggsave(filename = paste(i,".png", sep = ""), device = png, width = 12, height = 6)
}

막대그래프의 시각화 개선

##노도강을 추출해 보자. 
nodogang0 <- subset(seoul3, gu == "노원구" | gu == "도봉구" | gu == "강북구")
nodogang0
##        gu  code year gender_ratio    men pop_household household  women  total
## 11 강북구 11305 2018         0.96 156071          2.23    143395 163093 319164
## 12 강북구 11305 2019         0.95 153235          2.18    144277 160719 313954
## 13 강북구 11305 2020         0.95 150143          2.11    145896 157912 308055
## 14 강북구 11305 2021         0.95 145705          2.07    144536 153477 299182
## 15 강북구 11305 2022         0.94 142567          2.03    144313 151093 293660
## 41 노원구 11350 2018         0.94 263919          2.50    217655 279833 543752
## 42 노원구 11350 2019         0.94 257923          2.46    216966 274982 532905
## 43 노원구 11350 2020         0.93 252383          2.40    218270 270654 523037
## 44 노원구 11350 2021         0.93 246053          2.35    217378 264903 510956
## 45 노원구 11350 2022         0.93 242145          2.32    217540 261589 503734
## 46 도봉구 11320 2018         0.96 166160          2.46    138087 173253 339413
## 47 도봉구 11320 2019         0.96 163051          2.41    138508 170311 333362
## 48 도봉구 11320 2020         0.95 158620          2.34    139114 166637 325257
## 49 도봉구 11320 2021         0.95 154487          2.29    138656 162879 317366
## 50 도봉구 11320 2022         0.94 151398          2.25    138356 160296 311694
##    gender_ratio2
## 11     0.9569448
## 12     0.9534343
## 13     0.9508017
## 14     0.9493605
## 15     0.9435712
## 41     0.9431304
## 42     0.9379632
## 43     0.9324931
## 44     0.9288419
## 45     0.9256697
## 46     0.9590599
## 47     0.9573721
## 48     0.9518894
## 49     0.9484771
## 50     0.9444902
bar_vis0 <- nodogang0 %>%
  group_by(gu) %>%
  summarize(avr_pop = mean(total))

bar_vis0
## # A tibble: 3 × 2
##   gu     avr_pop
##   <chr>    <dbl>
## 1 강북구 306803 
## 2 노원구 522877.
## 3 도봉구 325418.
ggplot(bar_vis0, aes(x = gu, y =avr_pop)) + geom_col()

## 막대의 위치를 조정해 보자  
ggplot(bar_vis0, aes(x = reorder(gu, avr_pop), y =avr_pop)) + geom_col()

ggplot(bar_vis0, aes(x = reorder(gu, -avr_pop), y =avr_pop)) + geom_col()

## 임의의 위치 조정법을 알아보자. 
## 데이터 프레임의 변수 순서를 변경하는 방법
bar_vis0
## # A tibble: 3 × 2
##   gu     avr_pop
##   <chr>    <dbl>
## 1 강북구 306803 
## 2 노원구 522877.
## 3 도봉구 325418.
bar_vis1 <- bar_vis0[c(2, 3, 1),]
bar_vis1
## # A tibble: 3 × 2
##   gu     avr_pop
##   <chr>    <dbl>
## 1 노원구 522877.
## 2 도봉구 325418.
## 3 강북구 306803
ggplot(bar_vis1, aes(x = gu, y =avr_pop)) + geom_col()

## 문자 변수에 level을 먹여보자. 
bar_vis2 <- bar_vis0
bar_vis2$gu <- factor(bar_vis2$gu, levels = c("노원구", "도봉구", "강북구"))

summary(bar_vis0)
##       gu               avr_pop      
##  Length:3           Min.   :306803  
##  Class :character   1st Qu.:316111  
##  Mode  :character   Median :325418  
##                     Mean   :385033  
##                     3rd Qu.:424148  
##                     Max.   :522877
summary(bar_vis2)
##       gu       avr_pop      
##  노원구:1   Min.   :306803  
##  도봉구:1   1st Qu.:316111  
##  강북구:1   Median :325418  
##             Mean   :385033  
##             3rd Qu.:424148  
##             Max.   :522877
bar_vis2
## # A tibble: 3 × 2
##   gu     avr_pop
##   <fct>    <dbl>
## 1 강북구 306803 
## 2 노원구 522877.
## 3 도봉구 325418.
ggplot(bar_vis2, aes(x = gu, y =avr_pop)) + geom_col()

## 단위를 잡아보자
bar_vis2$pop <- round(bar_vis2$avr_pop / 10000, 1)
ggplot(bar_vis2, aes(x = gu, y =pop)) + geom_col() +
  labs(x = "자치구", y = "인구(만명)")

## 축 이름 폰트 크기를 잡아보자
ggplot(bar_vis2, aes(x = gu, y = pop)) + geom_col() +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25))

## 축단위 폰트를 잡아보자
ggplot(bar_vis2, aes(x = gu, y = pop)) + geom_col() +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 12), axis.text.y = element_text(size = 12))

## y축 단위를 잡아보자
ggplot(bar_vis2, aes(x = gu, y = pop)) + geom_col() +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) +
  scale_y_continuous(breaks = c(0, 25, 50, 75), limits = c(0, 75))

## 레이블 부여
ggplot(bar_vis2, aes(x = gu, y = pop)) + geom_col() +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) +
  scale_y_continuous(breaks = c(0, 25, 50, 75), limits = c(0, 75)) +
  geom_text(aes(label = pop), vjust = -0.2, size = 8)

## bar 색, 모양  다듬기 교체
ggplot(bar_vis2, aes(x = gu, y = pop)) + 
  geom_col(fill = "grey60", color = "black", size = .5) +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) +
  scale_y_continuous(breaks = c(0, 25, 50, 75), limits = c(0, 75)) +
  geom_text(aes(label = pop), vjust = -0.3, size = 7)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.

## 막대그래프를 그룹별로 겹쳐서 그려보자. 
nodogang0
##        gu  code year gender_ratio    men pop_household household  women  total
## 11 강북구 11305 2018         0.96 156071          2.23    143395 163093 319164
## 12 강북구 11305 2019         0.95 153235          2.18    144277 160719 313954
## 13 강북구 11305 2020         0.95 150143          2.11    145896 157912 308055
## 14 강북구 11305 2021         0.95 145705          2.07    144536 153477 299182
## 15 강북구 11305 2022         0.94 142567          2.03    144313 151093 293660
## 41 노원구 11350 2018         0.94 263919          2.50    217655 279833 543752
## 42 노원구 11350 2019         0.94 257923          2.46    216966 274982 532905
## 43 노원구 11350 2020         0.93 252383          2.40    218270 270654 523037
## 44 노원구 11350 2021         0.93 246053          2.35    217378 264903 510956
## 45 노원구 11350 2022         0.93 242145          2.32    217540 261589 503734
## 46 도봉구 11320 2018         0.96 166160          2.46    138087 173253 339413
## 47 도봉구 11320 2019         0.96 163051          2.41    138508 170311 333362
## 48 도봉구 11320 2020         0.95 158620          2.34    139114 166637 325257
## 49 도봉구 11320 2021         0.95 154487          2.29    138656 162879 317366
## 50 도봉구 11320 2022         0.94 151398          2.25    138356 160296 311694
##    gender_ratio2
## 11     0.9569448
## 12     0.9534343
## 13     0.9508017
## 14     0.9493605
## 15     0.9435712
## 41     0.9431304
## 42     0.9379632
## 43     0.9324931
## 44     0.9288419
## 45     0.9256697
## 46     0.9590599
## 47     0.9573721
## 48     0.9518894
## 49     0.9484771
## 50     0.9444902
bar_vis1 <- nodogang0 %>%
  group_by(gu) %>%
  summarize(men = round(mean(men),0),
            women = round(mean(women),0))

bar_vis1
## # A tibble: 3 × 3
##   gu        men  women
##   <chr>   <dbl>  <dbl>
## 1 강북구 149544 157259
## 2 노원구 252485 270392
## 3 도봉구 158743 166675
## long form으로 데이터를 바꾸어보자. 
bar_vis1_2 <- melt(bar_vis1, id.vars = c("gu"))

bar_vis1_2
##       gu variable  value
## 1 강북구      men 149544
## 2 노원구      men 252485
## 3 도봉구      men 158743
## 4 강북구    women 157259
## 5 노원구    women 270392
## 6 도봉구    women 166675
## 노도강 3구의 남/녀 인구를 막대그래프로 비교해 보자. 
ggplot(bar_vis1_2, aes(x = gu, y = value, fill = variable)) + geom_col(position = "dodge")

## 그래프를 좀 다듬어 보자. 
ggplot(bar_vis1_2, aes(x = reorder(gu, -value), y = value, fill = variable)) + 
  geom_col(position = "dodge") +
  labs(x = "자치구", y = "인구(만명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) +
  scale_y_continuous(breaks = c(0, 100000, 200000, 300000), labels = c(0, 10, 20, 30),
                     limits = c(0, 350000)) +
  geom_text(aes(label = value), vjust = -0.3, position = position_dodge(1), size = 5)

## 레이블 변수를 만들어 보자. 
bar_vis1_2$label <- round(bar_vis1_2$value / 10000, 2)

## 그레이 스케일로 다듬어 보자. 
ggplot(bar_vis1_2, aes(x = reorder(gu, -value), y = value, fill = variable)) + 
  geom_col(position = "dodge", color = "black", size = 0.5) +
  labs(x = "자치구", y = "인구(만명)", fill = "성별") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12),
        legend.title = element_text(size = 20), legend.text = element_text(size = 15)) +
  scale_y_continuous(breaks = c(0, 100000, 200000, 300000), labels = c(0, 10, 20, 30),
                     limits = c(0, 350000)) +
  geom_text(aes(label = label), vjust = -0.3, position = position_dodge(1), size = 5) +
  scale_fill_manual(values = c("grey70", "grey50"), labels = c("남성", "여성"))

## 히스토그램에 대해 같은 작업을 해 보자. 
ggplot(seoul_2022, aes(x = total/10000)) + 
  geom_histogram(bins = 5, color = "black", fill = "grey70") +
  labs(x = "인구(만명)", y = "빈도(개)") + 
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12),
        legend.title = element_text(size = 20), legend.text = element_text(size = 15)) +
  scale_y_continuous(breaks = c(0, 5, 10, 15), labels = c(0, 5, 10, 15),
                     limits = c(0, 15))

## 여러 가지 색의 그라데이션을 입혀보자. 
## https://colorbrewer2.org/

## 노원구만 추출해 보자. 
nowon <- subset(seoul3, gu == "노원구")
nowon
##        gu  code year gender_ratio    men pop_household household  women  total
## 41 노원구 11350 2018         0.94 263919          2.50    217655 279833 543752
## 42 노원구 11350 2019         0.94 257923          2.46    216966 274982 532905
## 43 노원구 11350 2020         0.93 252383          2.40    218270 270654 523037
## 44 노원구 11350 2021         0.93 246053          2.35    217378 264903 510956
## 45 노원구 11350 2022         0.93 242145          2.32    217540 261589 503734
##    gender_ratio2
## 41     0.9431304
## 42     0.9379632
## 43     0.9324931
## 44     0.9288419
## 45     0.9256697
## 기본적인 막대그래프
ggplot(nowon, aes(x = year, y = pop_household)) + geom_col()

## 그라데이션을 선택적으로 입힌 막대그래프
ggplot(nowon, aes(x = year, y = pop_household)) + geom_col() +
  geom_col(fill = c("#810f7c", "#8856a7", "#8c96c6", "#b3cde3", "#edf8fb")) +
  theme_bw() +
  labs(x = "연도", y = "가구당 인구 수(명)") + 
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12),
        legend.title = element_text(size = 20), legend.text = element_text(size = 15)) +
  scale_y_continuous(breaks = c(0, 1, 2, 3), limits = c(0, 3)) +
  geom_text(aes(label = pop_household), vjust = -0.3, size = 7)

직선 그래프(꺾은선그래프, line graph)

## 서울 여성 인구 추이를 뽑아보자. 
seoul_women_18_22 <- seoul3 %>%
  group_by(year) %>%
  summarize(women = sum(women))

seoul_women_18_22
## # A tibble: 5 × 2
##    year   women
##   <dbl>   <dbl>
## 1  2018 4991724
## 2  2019 4985048
## 3  2020 4966742
## 4  2021 4891418
## 5  2022 4858324
ggplot(seoul_women_18_22, aes(x = year, y = women)) + geom_line()

## 스케일을 주의해야 한다. 
ggplot(seoul_women_18_22, aes(x = year, y = women)) + geom_line() +
  ylim(0, 5000000)

## 점과 표식을 추가해 보자. 
ggplot(seoul_women_18_22, aes(x = year, y = women)) + geom_line() +
  geom_point()

## 여러 개의 선을 그려보자.
jongro2
##        gu year variable value
## 1  종로구 2018      men 74825
## 2  종로구 2019      men 73746
## 3  종로구 2020      men 72635
## 4  종로구 2021      men 70183
## 5  종로구 2022      men 68395
## 6  종로구 2018    women 78240
## 7  종로구 2019    women 77544
## 8  종로구 2020    women 76749
## 9  종로구 2021    women 74500
## 10 종로구 2022    women 72984
## 종로구의 남녀 인구 변화 추이를 색으로 구분하여 그려보자. 
ggplot(jongro2, aes(x = year, y = value, color = variable)) + geom_line()

## 종로구의 남녀 인구 변화 추이를 선의 형태로 구분하여 그려보자. 
ggplot(jongro2, aes(x = year, y = value, linetype = variable)) + geom_line()

## 자치구별 추이를 몰아서 그려보자

head(seoul3)
##       gu  code year gender_ratio    men pop_household household  women  total
## 1 강남구 11680 2018         0.92 259611          2.37    228775 282753 542364
## 2 강남구 11680 2019         0.92 260806          2.34    232981 284363 545169
## 3 강남구 11680 2020         0.92 257999          2.30    234872 281232 539231
## 4 강남구 11680 2021         0.92 255047          2.28    234233 277995 533042
## 5 강남구 11680 2022         0.92 253072          2.27    232777 276030 529102
## 6 강동구 11740 2018         0.98 211816          2.41    177247 215757 427573
##   gender_ratio2
## 1     0.9181547
## 2     0.9171587
## 3     0.9173885
## 4     0.9174518
## 5     0.9168279
## 6     0.9817341
## 자치구별 성별 추이를 몰아서 그려보자. 
ggplot(seoul3, aes(x = year, y = total, color = gu)) + geom_line()

## 자치구별 성비 추이를 몰아서 그려보자. 
ggplot(seoul3, aes(x = year, y = gender_ratio2, color = gu)) + geom_line()

ggplot(seoul3, aes(x = year, y = gender_ratio2, color = gu)) + geom_line() +
  ylim(0.8, 1.1)

## 여러 개의 꺾은선그래프를 그릴 때 주의점: why?
seoul3$gangdong01 <- ifelse(seoul3$gu == "강동구", "강동구", "그 외")

ggplot(seoul3, aes(x = year, y = gender_ratio2, color = gu, linetype = gangdong01))+ 
  geom_line(size = .75) +
  scale_color_manual(values = c("grey70", "grey30", "grey70", "grey70", "grey70", 
                    "grey70", "grey70", "grey70", "grey70", "grey70", 
                    "grey70", "grey70", "grey70", "grey70", "grey70", 
                    "grey70", "grey70", "grey70", "grey70", "grey70", 
                    "grey70", "grey70", "grey70", "grey70", "grey70")) +
  ylim(0.8, 1.1) +
  theme(legend.position = "none")

## 가구당 인구 수의 그래프
ggplot(seoul3, aes(x = year, y = pop_household, color = gu)) + geom_line()

## 다 때려넣어 그러보자
ggplot(seoul3, aes(x = year, y = total)) + geom_line() + geom_point() +
  facet_wrap(~gu)

라인 그래프의 시각화

## 기본 그래프
songpa1
##        gu year  total total_reg   div     pos
## 87 송파구 2019 675961    666635  9326  1_plus
## 88 송파구 2020 667960    675961 -8001 2_minus
## 89 송파구 2021 658338    667960 -9622 2_minus
## 90 송파구 2022 658801    658338   463  1_plus
ggplot(songpa1, aes(x = year, y = div)) + geom_line()

## y축을 적절하게 바꿔보자.
ggplot(songpa1, aes(x = year, y = div)) + geom_line() +
  ylim(-15000, 15000) + 
  geom_hline(yintercept = 0, linetype = 2)

## 연도별 점을 추가해 보자. 
ggplot(songpa1, aes(x = year, y = div)) + geom_line() + geom_point() +
  ylim(-15000, 15000) + 
  geom_hline(yintercept = 0, linetype = 2) 

## 기타 모양을 다듬어 보자.
songpa1$div_label <- round(songpa1$div / 1000, 2)
ggplot(songpa1, aes(x = year, y = div_label)) + 
  geom_line(size = .75, color = "grey40") + geom_point(size = 3) +
  theme_classic() +
  geom_hline(yintercept = 0, linetype = 2) +
  scale_y_continuous(breaks = c(-15, -10, -5, 0, 5, 10, 15), limits = c(-16, 16)) +
  labs(x = "연도", y = "인구 증감(천명)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12))

산점도(scatterplot)를 그려보자.

## 서울 25개구 남성인구 - 여성인구의 관계를 알아보자
seoul_gu_mw_18_22 <- seoul3 %>%
  group_by(gu) %>%
  summarize(men = mean(men),
            women = mean(women))

seoul_gu_mw_18_22
## # A tibble: 25 × 3
##    gu         men   women
##    <chr>    <dbl>   <dbl>
##  1 강남구 257307  280475.
##  2 강동구 221118  228150.
##  3 강북구 149544. 157259.
##  4 강서구 281234. 301248 
##  5 관악구 248049. 245863 
##  6 광진구 167393  178808.
##  7 구로구 198178. 203350 
##  8 금천구 117333. 114450 
##  9 노원구 252485. 270392.
## 10 도봉구 158743. 166675.
## # … with 15 more rows
## 기본 산점도를 그려보자. 
ggplot(seoul_gu_mw_18_22, aes(x = men, y = women)) + geom_point()

## 산점도에서 회귀직선을 추가해 보자. 
ggplot(seoul_gu_mw_18_22, aes(x = men, y = women)) + geom_point() +
  stat_smooth(method = lm)
## `geom_smooth()` using formula = 'y ~ x'

head(seoul3)
##       gu  code year gender_ratio    men pop_household household  women  total
## 1 강남구 11680 2018         0.92 259611          2.37    228775 282753 542364
## 2 강남구 11680 2019         0.92 260806          2.34    232981 284363 545169
## 3 강남구 11680 2020         0.92 257999          2.30    234872 281232 539231
## 4 강남구 11680 2021         0.92 255047          2.28    234233 277995 533042
## 5 강남구 11680 2022         0.92 253072          2.27    232777 276030 529102
## 6 강동구 11740 2018         0.98 211816          2.41    177247 215757 427573
##   gender_ratio2 gangdong01
## 1     0.9181547      그 외
## 2     0.9171587      그 외
## 3     0.9173885      그 외
## 4     0.9174518      그 외
## 5     0.9168279      그 외
## 6     0.9817341     강동구
## 서울 25개구 성비 - 가구원수의 관계를 그려보자. 

seoul_gph_18_22 <- seoul3 %>%
  group_by(gu) %>%
  summarize(gender_ratio = mean(gender_ratio),
            pop_household = mean(pop_household))

seoul_gph_18_22
## # A tibble: 25 × 3
##    gu     gender_ratio pop_household
##    <chr>         <dbl>         <dbl>
##  1 강남구        0.92           2.31
##  2 강동구        0.97           2.34
##  3 강북구        0.95           2.12
##  4 강서구        0.934          2.19
##  5 관악구        1.01           1.81
##  6 광진구        0.936          2.08
##  7 구로구        0.976          2.25
##  8 금천구        1.02           2.03
##  9 노원구        0.934          2.41
## 10 도봉구        0.952          2.35
## # … with 15 more rows
## 상관관계를 그려보자. 
cor(seoul_gph_18_22[,2:3])
##               gender_ratio pop_household
## gender_ratio     1.0000000    -0.3808132
## pop_household   -0.3808132     1.0000000
## 한강 이북/이남을 구분해 보자. 
gn <- c("강서구", "양천구", "구로구", "영등포구", "동작구", "관악구", 
        "금천구", "서초구", "강남구", "송파구", "강동구")
seoul_gph_18_22$gn <- ifelse(seoul_gph_18_22$gu%in%gn, "한강 이남", "한강 이북")

seoul_gph_18_22
## # A tibble: 25 × 4
##    gu     gender_ratio pop_household gn       
##    <chr>         <dbl>         <dbl> <chr>    
##  1 강남구        0.92           2.31 한강 이남
##  2 강동구        0.97           2.34 한강 이남
##  3 강북구        0.95           2.12 한강 이북
##  4 강서구        0.934          2.19 한강 이남
##  5 관악구        1.01           1.81 한강 이남
##  6 광진구        0.936          2.08 한강 이북
##  7 구로구        0.976          2.25 한강 이남
##  8 금천구        1.02           2.03 한강 이남
##  9 노원구        0.934          2.41 한강 이북
## 10 도봉구        0.952          2.35 한강 이북
## # … with 15 more rows
## 기본 그래프
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household)) + geom_point()

## 회귀직선을 추가해 보자. 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household)) + geom_point() +
  stat_smooth(method = lm)
## `geom_smooth()` using formula = 'y ~ x'

## 스케일을 주의해 보자. 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household)) + geom_point() +
  stat_smooth(method = lm) +
  ylim(0, 3)
## `geom_smooth()` using formula = 'y ~ x'

## 그룹을 색깔로 구분하여 나타내보자. 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household, color = gn)) + geom_point()

## 그룹을 모양으로 구분하여 나타내 보자. 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household, 
                            shape = gn)) + geom_point()

##여러 그룹으로 구분해 보자: 노도강의 예
nodogang0
##        gu  code year gender_ratio    men pop_household household  women  total
## 11 강북구 11305 2018         0.96 156071          2.23    143395 163093 319164
## 12 강북구 11305 2019         0.95 153235          2.18    144277 160719 313954
## 13 강북구 11305 2020         0.95 150143          2.11    145896 157912 308055
## 14 강북구 11305 2021         0.95 145705          2.07    144536 153477 299182
## 15 강북구 11305 2022         0.94 142567          2.03    144313 151093 293660
## 41 노원구 11350 2018         0.94 263919          2.50    217655 279833 543752
## 42 노원구 11350 2019         0.94 257923          2.46    216966 274982 532905
## 43 노원구 11350 2020         0.93 252383          2.40    218270 270654 523037
## 44 노원구 11350 2021         0.93 246053          2.35    217378 264903 510956
## 45 노원구 11350 2022         0.93 242145          2.32    217540 261589 503734
## 46 도봉구 11320 2018         0.96 166160          2.46    138087 173253 339413
## 47 도봉구 11320 2019         0.96 163051          2.41    138508 170311 333362
## 48 도봉구 11320 2020         0.95 158620          2.34    139114 166637 325257
## 49 도봉구 11320 2021         0.95 154487          2.29    138656 162879 317366
## 50 도봉구 11320 2022         0.94 151398          2.25    138356 160296 311694
##    gender_ratio2
## 11     0.9569448
## 12     0.9534343
## 13     0.9508017
## 14     0.9493605
## 15     0.9435712
## 41     0.9431304
## 42     0.9379632
## 43     0.9324931
## 44     0.9288419
## 45     0.9256697
## 46     0.9590599
## 47     0.9573721
## 48     0.9518894
## 49     0.9484771
## 50     0.9444902
## 필요한 변수만 추출해 보자. 
nodogang1 <- select(nodogang0, "gu", "year", "gender_ratio2")
nodogang1
##        gu year gender_ratio2
## 11 강북구 2018     0.9569448
## 12 강북구 2019     0.9534343
## 13 강북구 2020     0.9508017
## 14 강북구 2021     0.9493605
## 15 강북구 2022     0.9435712
## 41 노원구 2018     0.9431304
## 42 노원구 2019     0.9379632
## 43 노원구 2020     0.9324931
## 44 노원구 2021     0.9288419
## 45 노원구 2022     0.9256697
## 46 도봉구 2018     0.9590599
## 47 도봉구 2019     0.9573721
## 48 도봉구 2020     0.9518894
## 49 도봉구 2021     0.9484771
## 50 도봉구 2022     0.9444902
## wide form으로 바꿔보자. 
nodogang2 <- melt(nodogang1, id.vars = c("gu", "year"))
nodogang2
##        gu year      variable     value
## 1  강북구 2018 gender_ratio2 0.9569448
## 2  강북구 2019 gender_ratio2 0.9534343
## 3  강북구 2020 gender_ratio2 0.9508017
## 4  강북구 2021 gender_ratio2 0.9493605
## 5  강북구 2022 gender_ratio2 0.9435712
## 6  노원구 2018 gender_ratio2 0.9431304
## 7  노원구 2019 gender_ratio2 0.9379632
## 8  노원구 2020 gender_ratio2 0.9324931
## 9  노원구 2021 gender_ratio2 0.9288419
## 10 노원구 2022 gender_ratio2 0.9256697
## 11 도봉구 2018 gender_ratio2 0.9590599
## 12 도봉구 2019 gender_ratio2 0.9573721
## 13 도봉구 2020 gender_ratio2 0.9518894
## 14 도봉구 2021 gender_ratio2 0.9484771
## 15 도봉구 2022 gender_ratio2 0.9444902
## 기본적인 그래프를 그려보자. 
ggplot(nodogang2, aes(x = year, y = value)) + geom_point()

## 색으로 구분해 보자. 
ggplot(nodogang2, aes(x = year, y = value, color = gu)) + geom_point() 

## 모양으로 구분해 보자. 
ggplot(nodogang2, aes(x = year, y = value, shape = gu)) + geom_point() 

## 색과 모양으로 구분해 보자. 
ggplot(nodogang2, aes(x = year, y = value, color = gu, shape = gu)) + geom_point() 

## 각 그룹별 회귀식을 뽑아보자. 
ggplot(nodogang2, aes(x = year, y = value, color = gu)) + geom_point() +
  stat_smooth(method = lm)
## `geom_smooth()` using formula = 'y ~ x'

## 연속형 변수를 산점도에 도입해 보자. 

## 강동구를 추출한다. 
gangdong0 <- seoul3[seoul3$gu == "강동구",]

gangdong0
##        gu  code year gender_ratio    men pop_household household  women  total
## 6  강동구 11740 2018         0.98 211816          2.41    177247 215757 427573
## 7  강동구 11740 2019         0.98 215335          2.38    183390 220732 436067
## 8  강동구 11740 2020         0.97 226216          2.34    196499 233754 459970
## 9  강동구 11740 2021         0.96 227002          2.29    201613 235662 462664
## 10 강동구 11740 2022         0.96 225221          2.28    202169 234846 460067
##    gender_ratio2 gangdong01
## 6      0.9817341     강동구
## 7      0.9755495     강동구
## 8      0.9677524     강동구
## 9      0.9632525     강동구
## 10     0.9590157     강동구
## 강동구의 연도별 성비를 나타내되, 가구수를 색의 채도로 나타내 보자. 
ggplot(gangdong0, aes(x = year, y = gender_ratio2, color = pop_household)) + geom_point(size = 10)

## 강동구의 연도별 성비를 나타내되, 가구수를 점의 크기로 나타내. 
ggplot(gangdong0, aes(x = year, y = gender_ratio2, size = pop_household)) + geom_point()

산점도의 개선

## 기본  그래프 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household, 
                            shape = gn)) + geom_point()

## 개선된 시각화 그래프
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household, 
                            shape = gn, color = gn)) + geom_point(size = 3) +
  labs(x = "남녀 성비(남성÷여성)", y = "가구당 인구 수(명/가구)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) +
  scale_color_manual(values = c("grey70", "grey50"))

산점도 그룹별 시각화의 응용: 클러스터링

library(stats)

## 그룹화를 위해 평균-표준편차 일치법에 따른 표준화를 해 보자. 
km0 <- scale(seoul_gph_18_22[,2:3])
km0
##       gender_ratio pop_household
##  [1,]  -1.02903804   0.759755554
##  [2,]   0.65020158   0.926577664
##  [3,]  -0.02149427  -0.360335758
##  [4,]  -0.55885095   0.009056057
##  [5,]   1.99359328  -2.231126567
##  [6,]  -0.49168136  -0.610568924
##  [7,]   0.85171033   0.366532008
##  [8,]   2.46378037  -0.896549684
##  [9,]  -0.55885095   1.319801210
## [10,]   0.04567532   0.986156989
## [11,]   1.05321909  -0.741643439
## [12,]  -0.29017261  -0.276924703
## [13,]  -1.90224264  -0.550989599
## [14,]  -1.02903804  -0.110102593
## [15,]  -1.09620762   1.617697835
## [16,]   0.11284490  -0.062439133
## [17,]  -0.49168136   0.414195468
## [18,]  -0.55885095   1.164894965
## [19,]   0.44869283   2.022837246
## [20,]   0.91887992  -0.741643439
## [21,]  -0.69319011  -0.848886224
## [22,]  -0.89469887   0.438027198
## [23,]  -0.08866385  -1.051455930
## [24,]   0.24718407  -1.265941500
## [25,]   0.91887992  -0.276924703
## attr(,"scaled:center")
##  gender_ratio pop_household 
##       0.95064       2.18448 
## attr(,"scaled:scale")
##  gender_ratio pop_household 
##    0.02977538    0.16784346
## 난수 발생을 seed number로 통제하자. 
set.seed(1092)

## k-means algorithm으로 그룹화를 해 보자. 
group0 <- kmeans(km0, 3)

## group0에 저장된 개체들을 보자. 
ls(group0)
## [1] "betweenss"    "centers"      "cluster"      "ifault"       "iter"        
## [6] "size"         "tot.withinss" "totss"        "withinss"
## 어떠한 클러스터로 묶였는지 확인해 보자. 
group0$cluster
##  [1] 2 2 1 1 3 1 3 3 2 2 3 1 1 1 2 1 2 2 2 3 1 2 1 1 3
## 분류된 클러스터를 저장하자. 
seoul_gph_18_22$group <- group0$cluster

## 저장된 클러스터를 시각화로 나타내 보자. 
ggplot(seoul_gph_18_22, aes(x = gender_ratio, y = pop_household, 
                            shape = factor(group), color = factor(group))) + geom_point(size = 3) +
  labs(x = "남녀 성비(남성÷여성)", y = "가구당 인구 수(명/가구)") +
  theme(axis.title.x = element_text(size = 25), axis.title.y = element_text(size = 25),
        axis.text.x = element_text(size = 15), axis.text.y = element_text(size = 12)) 

기타 그래프

## 서울 자치구의 인구 추이 변동을 오차막대로 나타내 보자. 

gu_eb <- seoul3%>%
  group_by(year) %>%
  summarize(avr = mean(total),
            sd = sd(total))

ggplot(gu_eb, aes(x = year, y = avr)) + geom_point() + geom_line(linetype = 2) +
  geom_errorbar(aes(x = year, ymin = avr - sd, ymax = avr + sd), width = 0.1) +
  ylim(0, 600000)

## 설문조사 5점척도 산점도 그리기
set.seed(1092)

## x와 y는 상관관계가 있으나, x와 z는 무관하다.
x0 <- runif(1000, -3, 3) 
y0 <- x0 + rnorm(1000)*1.5
z0 <- runif(1000, -3, 3)

head(x0)
## [1] -1.289664  1.963158  2.839664 -2.907506  2.170996  2.411724
head(y0)
## [1] -1.368153  1.465921  3.418183 -4.060787  2.085187  5.605103
head(z0)
## [1]  0.6464605 -1.0839320 -1.2993282  2.7151296 -0.1998669  1.9135951
cor(x0, y0)
## [1] 0.7802218
cor(x0, z0)
## [1] -0.0249793
summary(x0)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -2.999057 -1.604780 -0.030823 -0.004196  1.592606  2.998428
summary(y0)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -6.080046 -1.671330 -0.151957  0.004334  1.724956  6.648104
summary(z0)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -2.98860 -1.30430  0.10370  0.08237  1.64066  2.99754
x1 <- ifelse(x0 >=2, 5, ifelse(x0>=1, 4, ifelse(x0>=-1, 3, ifelse(x0>=-2, 2, 1))))
y1 <- ifelse(y0 >=2, 5, ifelse(y0>=1, 4, ifelse(y0>=-1, 3, ifelse(y0>=-2, 2, 1))))
z1 <- ifelse(z0 >=2, 5, ifelse(z0>=1, 4, ifelse(z0>=-1, 3, ifelse(z0>=-2, 2, 1))))

table(x1)
## x1
##   1   2   3   4   5 
## 179 167 303 162 189
table(y1)
## y1
##   1   2   3   4   5 
## 203 145 311 123 218
table(z1)
## z1
##   1   2   3   4   5 
## 156 151 350 165 178
cor(x1, y1)
## [1] 0.7376018
cor(x1, z1)
## [1] -0.0277825
survey <- data.frame(x1, y1, z1)

survey
##      x1 y1 z1
## 1     2  2  3
## 2     4  4  2
## 3     5  5  2
## 4     1  1  5
## 5     5  5  3
## 6     5  5  4
## 7     1  3  4
## 8     3  4  3
## 9     2  1  5
## 10    4  3  5
## 11    1  1  3
## 12    3  2  5
## 13    1  1  4
## 14    3  3  2
## 15    4  4  4
## 16    5  5  5
## 17    5  3  3
## 18    1  3  1
## 19    4  3  3
## 20    3  3  3
## 21    4  5  4
## 22    1  1  3
## 23    1  1  3
## 24    2  2  1
## 25    2  2  3
## 26    5  3  3
## 27    1  1  3
## 28    5  5  1
## 29    1  1  3
## 30    5  5  2
## 31    1  3  3
## 32    3  3  2
## 33    5  3  2
## 34    5  5  2
## 35    1  1  5
## 36    2  1  2
## 37    3  4  1
## 38    3  2  4
## 39    3  2  4
## 40    2  1  4
## 41    4  3  4
## 42    4  5  3
## 43    1  1  5
## 44    3  3  3
## 45    2  3  4
## 46    3  5  3
## 47    2  3  3
## 48    5  5  3
## 49    1  1  3
## 50    3  3  5
## 51    1  2  3
## 52    1  3  4
## 53    3  3  3
## 54    1  2  5
## 55    1  3  4
## 56    2  3  4
## 57    2  1  3
## 58    3  3  5
## 59    3  5  1
## 60    1  2  4
## 61    5  5  3
## 62    4  5  5
## 63    3  2  3
## 64    1  2  4
## 65    3  5  3
## 66    1  1  5
## 67    3  3  1
## 68    3  5  3
## 69    1  1  3
## 70    5  5  2
## 71    3  5  5
## 72    4  4  3
## 73    1  1  4
## 74    2  2  3
## 75    2  2  5
## 76    5  5  1
## 77    3  3  5
## 78    1  2  4
## 79    3  3  4
## 80    2  1  2
## 81    1  1  4
## 82    4  5  3
## 83    4  5  3
## 84    5  3  5
## 85    1  4  2
## 86    5  5  3
## 87    2  2  1
## 88    5  3  4
## 89    4  5  3
## 90    4  5  5
## 91    4  5  5
## 92    5  5  3
## 93    5  5  2
## 94    5  5  4
## 95    3  2  1
## 96    3  2  4
## 97    3  5  3
## 98    4  2  3
## 99    3  4  3
## 100   3  3  4
## 101   3  2  2
## 102   3  3  2
## 103   1  1  4
## 104   4  4  1
## 105   5  5  1
## 106   4  3  5
## 107   3  4  3
## 108   3  2  3
## 109   3  4  1
## 110   4  4  3
## 111   5  5  3
## 112   5  5  3
## 113   3  5  2
## 114   5  5  4
## 115   1  3  3
## 116   3  3  4
## 117   2  1  3
## 118   1  1  4
## 119   2  1  5
## 120   3  3  3
## 121   3  3  1
## 122   3  3  3
## 123   3  4  5
## 124   3  3  4
## 125   5  4  3
## 126   4  5  5
## 127   5  5  4
## 128   4  3  3
## 129   3  2  5
## 130   3  3  5
## 131   2  3  2
## 132   5  3  3
## 133   2  3  3
## 134   3  1  3
## 135   1  1  1
## 136   5  3  3
## 137   5  3  3
## 138   3  3  1
## 139   2  2  5
## 140   5  5  1
## 141   2  1  3
## 142   3  2  1
## 143   3  3  3
## 144   1  1  3
## 145   3  3  1
## 146   5  5  3
## 147   4  4  3
## 148   4  3  2
## 149   2  1  1
## 150   5  5  4
## 151   2  3  1
## 152   2  5  4
## 153   5  5  2
## 154   5  5  1
## 155   3  1  2
## 156   3  3  1
## 157   2  2  3
## 158   4  4  3
## 159   1  1  3
## 160   4  3  4
## 161   1  1  1
## 162   1  1  5
## 163   4  4  2
## 164   4  5  5
## 165   2  2  4
## 166   5  4  3
## 167   4  3  3
## 168   3  4  5
## 169   3  3  4
## 170   3  3  3
## 171   3  3  3
## 172   1  2  3
## 173   4  5  5
## 174   3  2  2
## 175   1  2  3
## 176   3  3  3
## 177   3  3  2
## 178   1  2  3
## 179   1  3  5
## 180   3  2  3
## 181   3  3  5
## 182   5  4  5
## 183   3  3  5
## 184   5  5  4
## 185   4  3  3
## 186   4  5  3
## 187   1  3  2
## 188   5  5  3
## 189   2  1  2
## 190   3  4  4
## 191   1  1  4
## 192   1  1  4
## 193   2  4  5
## 194   2  1  2
## 195   1  3  4
## 196   1  1  3
## 197   1  1  2
## 198   3  4  1
## 199   5  5  5
## 200   4  5  3
## 201   3  3  4
## 202   3  3  2
## 203   1  1  5
## 204   1  2  5
## 205   3  3  2
## 206   3  2  5
## 207   4  5  2
## 208   3  3  3
## 209   4  5  4
## 210   3  1  4
## 211   1  1  3
## 212   3  4  4
## 213   2  1  3
## 214   2  2  3
## 215   4  4  5
## 216   2  3  3
## 217   2  2  1
## 218   2  2  1
## 219   5  5  5
## 220   2  3  3
## 221   3  3  5
## 222   2  1  4
## 223   4  3  5
## 224   2  2  5
## 225   2  3  5
## 226   5  5  5
## 227   2  3  2
## 228   1  3  5
## 229   2  2  5
## 230   2  3  4
## 231   4  3  5
## 232   1  1  3
## 233   1  2  4
## 234   3  3  3
## 235   3  1  3
## 236   3  3  5
## 237   2  3  4
## 238   3  3  1
## 239   5  5  2
## 240   3  3  3
## 241   3  3  3
## 242   4  4  5
## 243   3  2  3
## 244   1  1  3
## 245   4  3  3
## 246   1  1  3
## 247   4  5  3
## 248   3  5  5
## 249   5  3  1
## 250   5  4  1
## 251   3  1  2
## 252   4  3  5
## 253   3  1  3
## 254   1  1  3
## 255   4  3  3
## 256   1  1  4
## 257   2  2  1
## 258   5  3  2
## 259   5  3  1
## 260   1  2  2
## 261   3  3  5
## 262   1  3  4
## 263   2  1  3
## 264   4  3  1
## 265   1  1  4
## 266   2  1  3
## 267   3  3  4
## 268   4  4  3
## 269   1  1  4
## 270   2  2  4
## 271   5  4  3
## 272   3  1  5
## 273   5  5  5
## 274   3  3  3
## 275   4  3  3
## 276   3  3  2
## 277   3  2  1
## 278   1  1  4
## 279   4  4  5
## 280   1  1  2
## 281   5  5  3
## 282   1  1  4
## 283   3  3  1
## 284   5  5  3
## 285   2  3  3
## 286   3  3  1
## 287   5  5  3
## 288   5  3  3
## 289   3  4  3
## 290   1  3  3
## 291   5  3  3
## 292   3  4  4
## 293   4  5  5
## 294   2  3  3
## 295   1  2  2
## 296   4  3  2
## 297   3  3  5
## 298   4  3  5
## 299   1  1  4
## 300   2  1  4
## 301   3  3  1
## 302   2  3  3
## 303   4  3  3
## 304   2  1  1
## 305   3  5  3
## 306   3  1  1
## 307   3  2  4
## 308   5  5  2
## 309   1  1  3
## 310   4  4  4
## 311   2  2  3
## 312   2  1  3
## 313   2  3  2
## 314   1  4  5
## 315   2  1  3
## 316   5  5  3
## 317   5  5  3
## 318   3  5  1
## 319   3  3  4
## 320   3  2  2
## 321   4  5  3
## 322   3  1  3
## 323   3  1  5
## 324   3  4  5
## 325   2  1  3
## 326   5  5  3
## 327   3  3  2
## 328   3  3  4
## 329   1  1  3
## 330   3  3  2
## 331   4  4  5
## 332   4  5  4
## 333   2  1  5
## 334   1  2  1
## 335   2  2  5
## 336   4  4  3
## 337   4  4  3
## 338   3  3  3
## 339   4  3  1
## 340   3  2  1
## 341   2  4  3
## 342   5  5  3
## 343   3  4  1
## 344   4  3  1
## 345   1  1  3
## 346   2  2  5
## 347   1  1  5
## 348   1  1  3
## 349   2  3  3
## 350   3  4  2
## 351   2  3  5
## 352   3  3  4
## 353   5  5  1
## 354   3  2  1
## 355   3  4  2
## 356   3  2  4
## 357   5  5  5
## 358   2  1  1
## 359   3  3  3
## 360   2  2  3
## 361   3  1  4
## 362   2  2  3
## 363   1  1  3
## 364   3  2  5
## 365   5  4  1
## 366   2  2  3
## 367   2  2  1
## 368   4  4  2
## 369   4  3  1
## 370   3  3  5
## 371   4  3  4
## 372   3  3  3
## 373   3  3  1
## 374   2  3  1
## 375   3  5  2
## 376   3  3  1
## 377   1  1  3
## 378   1  1  2
## 379   4  3  4
## 380   1  1  1
## 381   5  2  4
## 382   3  3  1
## 383   3  3  5
## 384   3  3  5
## 385   5  3  5
## 386   3  3  3
## 387   2  1  3
## 388   3  1  1
## 389   2  1  2
## 390   1  1  3
## 391   2  4  1
## 392   1  1  2
## 393   4  2  1
## 394   1  2  1
## 395   3  3  3
## 396   1  1  2
## 397   3  5  5
## 398   5  5  1
## 399   3  3  5
## 400   4  3  1
## 401   4  3  3
## 402   4  4  4
## 403   4  5  2
## 404   3  4  2
## 405   2  2  3
## 406   4  4  4
## 407   5  4  1
## 408   5  4  5
## 409   3  3  4
## 410   1  1  5
## 411   3  3  3
## 412   3  3  3
## 413   4  2  5
## 414   1  1  3
## 415   2  2  2
## 416   1  3  3
## 417   1  2  4
## 418   5  5  4
## 419   1  1  1
## 420   5  5  3
## 421   1  1  5
## 422   2  3  5
## 423   3  3  2
## 424   2  3  4
## 425   3  3  3
## 426   2  3  2
## 427   1  1  5
## 428   5  5  4
## 429   4  4  2
## 430   1  3  2
## 431   1  1  3
## 432   5  5  4
## 433   3  3  4
## 434   5  5  3
## 435   4  5  4
## 436   2  2  3
## 437   3  3  3
## 438   3  3  2
## 439   1  1  3
## 440   3  3  2
## 441   3  3  5
## 442   1  2  2
## 443   3  1  3
## 444   4  5  1
## 445   5  5  3
## 446   3  3  1
## 447   4  3  3
## 448   5  5  1
## 449   3  5  3
## 450   5  4  1
## 451   1  1  3
## 452   5  5  2
## 453   1  1  2
## 454   4  2  2
## 455   4  3  3
## 456   5  5  2
## 457   3  1  2
## 458   1  1  3
## 459   5  5  5
## 460   1  1  1
## 461   1  1  1
## 462   3  3  3
## 463   4  5  2
## 464   2  1  2
## 465   3  3  1
## 466   3  3  5
## 467   3  2  3
## 468   2  3  3
## 469   4  3  1
## 470   5  5  4
## 471   4  2  2
## 472   1  1  5
## 473   3  1  1
## 474   1  2  4
## 475   4  3  4
## 476   5  5  3
## 477   2  1  1
## 478   5  5  5
## 479   1  1  5
## 480   2  2  1
## 481   1  3  5
## 482   5  5  4
## 483   3  3  5
## 484   4  2  4
## 485   5  5  3
## 486   4  5  4
## 487   4  3  3
## 488   3  3  2
## 489   4  5  3
## 490   5  3  4
## 491   3  5  2
## 492   3  2  4
## 493   4  5  3
## 494   5  5  1
## 495   5  5  4
## 496   4  3  1
## 497   5  5  3
## 498   5  4  3
## 499   2  3  2
## 500   2  2  1
## 501   2  1  3
## 502   3  2  4
## 503   3  4  1
## 504   3  1  1
## 505   3  3  4
## 506   5  5  3
## 507   1  1  1
## 508   5  5  3
## 509   3  2  3
## 510   4  5  4
## 511   2  2  3
## 512   4  5  3
## 513   2  1  2
## 514   2  3  4
## 515   5  5  5
## 516   1  3  4
## 517   5  5  3
## 518   2  3  3
## 519   3  3  3
## 520   4  5  4
## 521   3  1  3
## 522   4  5  3
## 523   3  3  2
## 524   3  5  4
## 525   3  4  3
## 526   4  4  2
## 527   3  1  3
## 528   5  3  3
## 529   4  2  5
## 530   4  5  4
## 531   3  3  3
## 532   5  3  3
## 533   3  4  3
## 534   3  3  3
## 535   3  3  3
## 536   1  1  5
## 537   3  4  3
## 538   2  3  1
## 539   4  4  1
## 540   1  2  4
## 541   1  3  3
## 542   3  2  3
## 543   4  5  1
## 544   5  4  3
## 545   4  5  3
## 546   3  5  5
## 547   2  1  3
## 548   5  4  4
## 549   3  2  2
## 550   5  5  1
## 551   5  5  2
## 552   3  3  2
## 553   4  3  5
## 554   1  3  2
## 555   5  5  3
## 556   2  5  3
## 557   2  2  4
## 558   1  3  3
## 559   3  3  3
## 560   4  3  1
## 561   2  1  4
## 562   3  4  1
## 563   3  1  5
## 564   3  1  1
## 565   4  4  1
## 566   3  2  3
## 567   3  2  3
## 568   3  3  4
## 569   2  1  2
## 570   3  1  1
## 571   3  3  5
## 572   4  5  3
## 573   5  5  3
## 574   5  5  4
## 575   4  4  2
## 576   1  1  3
## 577   1  1  3
## 578   4  4  1
## 579   5  4  5
## 580   2  3  2
## 581   1  1  1
## 582   3  2  2
## 583   5  5  4
## 584   2  2  3
## 585   3  1  2
## 586   3  3  3
## 587   1  1  2
## 588   2  2  5
## 589   3  4  2
## 590   1  3  5
## 591   3  3  3
## 592   3  3  2
## 593   1  1  5
## 594   3  4  4
## 595   5  5  4
## 596   1  1  4
## 597   2  3  5
## 598   1  2  4
## 599   2  2  3
## 600   4  3  5
## 601   3  3  4
## 602   2  1  4
## 603   2  1  1
## 604   3  1  3
## 605   5  4  2
## 606   3  3  2
## 607   1  2  2
## 608   1  1  1
## 609   5  4  4
## 610   2  2  5
## 611   2  2  2
## 612   1  1  4
## 613   3  2  3
## 614   1  1  3
## 615   1  1  3
## 616   5  5  5
## 617   3  5  1
## 618   5  5  3
## 619   5  5  1
## 620   2  2  1
## 621   2  3  5
## 622   4  3  3
## 623   3  2  4
## 624   3  3  1
## 625   4  4  3
## 626   3  5  1
## 627   4  3  3
## 628   4  3  5
## 629   3  3  5
## 630   1  1  1
## 631   3  5  4
## 632   3  3  5
## 633   5  5  1
## 634   2  3  4
## 635   1  1  5
## 636   4  5  1
## 637   2  1  5
## 638   3  4  3
## 639   3  2  2
## 640   3  2  5
## 641   3  4  2
## 642   4  5  5
## 643   5  3  3
## 644   5  4  4
## 645   3  4  3
## 646   3  4  3
## 647   5  5  3
## 648   1  2  3
## 649   5  5  3
## 650   1  1  3
## 651   1  1  5
## 652   5  4  5
## 653   3  4  4
## 654   4  5  3
## 655   4  3  2
## 656   5  5  2
## 657   5  4  4
## 658   3  4  5
## 659   5  5  4
## 660   2  2  5
## 661   3  3  3
## 662   2  3  2
## 663   2  3  2
## 664   4  4  1
## 665   1  2  3
## 666   1  2  5
## 667   1  1  1
## 668   3  3  2
## 669   5  5  1
## 670   1  1  3
## 671   5  5  4
## 672   4  5  2
## 673   3  3  5
## 674   2  2  4
## 675   3  2  4
## 676   2  3  2
## 677   3  3  3
## 678   1  2  4
## 679   1  1  4
## 680   2  1  4
## 681   4  4  2
## 682   1  1  5
## 683   3  1  3
## 684   3  3  2
## 685   3  3  3
## 686   1  1  4
## 687   1  1  3
## 688   3  2  2
## 689   1  1  5
## 690   3  3  3
## 691   2  1  3
## 692   5  3  3
## 693   3  4  1
## 694   2  3  3
## 695   4  4  2
## 696   3  4  3
## 697   1  1  3
## 698   4  5  1
## 699   5  5  1
## 700   3  3  3
## 701   1  1  3
## 702   3  3  2
## 703   4  5  5
## 704   2  2  3
## 705   3  3  3
## 706   4  3  5
## 707   4  5  1
## 708   1  1  1
## 709   2  3  4
## 710   4  3  2
## 711   3  3  3
## 712   5  5  2
## 713   5  5  5
## 714   3  4  1
## 715   3  3  2
## 716   5  5  3
## 717   2  3  3
## 718   3  4  3
## 719   2  2  3
## 720   3  2  3
## 721   4  5  3
## 722   3  3  3
## 723   3  5  3
## 724   5  5  4
## 725   4  5  2
## 726   5  3  3
## 727   2  3  5
## 728   3  3  2
## 729   4  3  4
## 730   1  3  2
## 731   1  2  3
## 732   1  3  1
## 733   5  3  5
## 734   3  1  3
## 735   5  5  2
## 736   1  1  2
## 737   3  4  1
## 738   4  3  4
## 739   3  3  2
## 740   1  1  3
## 741   4  2  3
## 742   3  3  1
## 743   1  1  4
## 744   2  1  3
## 745   5  5  4
## 746   5  5  5
## 747   4  4  4
## 748   3  3  3
## 749   3  3  3
## 750   2  1  4
## 751   5  3  3
## 752   3  2  3
## 753   2  3  3
## 754   3  3  4
## 755   5  5  2
## 756   3  5  1
## 757   3  1  5
## 758   1  1  1
## 759   5  5  3
## 760   4  5  1
## 761   1  3  4
## 762   4  4  5
## 763   4  3  3
## 764   5  5  1
## 765   5  5  2
## 766   3  4  2
## 767   1  1  3
## 768   3  5  2
## 769   5  3  3
## 770   1  3  3
## 771   5  5  5
## 772   2  2  1
## 773   3  3  1
## 774   4  5  3
## 775   3  3  3
## 776   3  2  5
## 777   1  1  4
## 778   1  1  3
## 779   1  1  2
## 780   3  4  3
## 781   5  4  4
## 782   5  4  4
## 783   5  4  4
## 784   4  4  5
## 785   2  2  4
## 786   4  5  5
## 787   2  3  4
## 788   2  2  4
## 789   5  5  3
## 790   3  3  5
## 791   3  3  2
## 792   3  3  2
## 793   3  5  4
## 794   2  3  3
## 795   2  1  1
## 796   3  3  5
## 797   4  5  3
## 798   2  1  5
## 799   4  4  1
## 800   2  1  2
## 801   5  5  3
## 802   1  1  1
## 803   3  3  5
## 804   3  2  5
## 805   5  5  3
## 806   5  5  5
## 807   1  1  4
## 808   3  3  4
## 809   1  1  3
## 810   3  4  4
## 811   2  1  4
## 812   3  3  5
## 813   4  5  1
## 814   2  2  3
## 815   4  4  3
## 816   2  2  2
## 817   3  2  3
## 818   3  2  5
## 819   5  4  5
## 820   5  5  3
## 821   2  3  3
## 822   5  5  5
## 823   5  5  3
## 824   3  3  5
## 825   3  4  2
## 826   5  5  2
## 827   4  5  2
## 828   1  1  2
## 829   1  3  3
## 830   4  5  1
## 831   5  5  3
## 832   1  2  5
## 833   2  1  2
## 834   5  5  5
## 835   1  1  3
## 836   1  3  1
## 837   4  4  5
## 838   1  3  1
## 839   5  5  3
## 840   4  5  5
## 841   5  4  5
## 842   1  1  3
## 843   1  1  4
## 844   3  1  1
## 845   2  3  3
## 846   5  5  3
## 847   4  4  3
## 848   3  3  2
## 849   1  1  2
## 850   3  3  3
## 851   2  2  1
## 852   2  1  3
## 853   4  3  4
## 854   3  3  5
## 855   1  1  5
## 856   2  1  1
## 857   3  3  5
## 858   1  2  4
## 859   5  3  1
## 860   2  1  5
## 861   3  5  1
## 862   3  3  4
## 863   5  5  5
## 864   1  3  3
## 865   3  4  2
## 866   4  5  2
## 867   4  4  4
## 868   3  3  3
## 869   5  4  1
## 870   4  3  3
## 871   3  3  3
## 872   4  3  1
## 873   5  4  3
## 874   5  4  2
## 875   5  4  3
## 876   4  3  3
## 877   2  1  5
## 878   1  4  5
## 879   1  3  3
## 880   4  5  1
## 881   1  1  4
## 882   3  4  1
## 883   3  3  4
## 884   5  5  3
## 885   3  4  1
## 886   4  5  3
## 887   2  3  5
## 888   5  5  3
## 889   2  3  2
## 890   3  3  4
## 891   2  1  3
## 892   3  3  2
## 893   1  1  5
## 894   3  2  3
## 895   1  2  4
## 896   1  3  3
## 897   2  1  4
## 898   2  1  2
## 899   3  2  1
## 900   3  5  1
## 901   5  5  1
## 902   2  2  4
## 903   2  1  2
## 904   4  5  2
## 905   5  4  2
## 906   5  5  1
## 907   3  3  3
## 908   2  1  2
## 909   4  1  3
## 910   4  5  5
## 911   2  2  3
## 912   2  2  5
## 913   3  2  5
## 914   5  5  4
## 915   2  2  3
## 916   4  2  4
## 917   3  5  3
## 918   2  1  3
## 919   2  1  5
## 920   3  3  2
## 921   5  3  2
## 922   3  3  1
## 923   3  3  3
## 924   1  1  3
## 925   3  5  5
## 926   1  2  1
## 927   1  1  3
## 928   4  3  3
## 929   3  3  1
## 930   5  3  1
## 931   3  5  2
## 932   2  3  5
## 933   3  2  1
## 934   3  3  3
## 935   2  1  3
## 936   5  4  2
## 937   3  3  3
## 938   5  4  3
## 939   4  3  3
## 940   3  2  5
## 941   2  1  2
## 942   5  2  2
## 943   3  3  1
## 944   2  3  5
## 945   2  3  1
## 946   4  5  4
## 947   3  3  3
## 948   3  2  3
## 949   3  3  5
## 950   5  5  3
## 951   3  2  3
## 952   2  1  3
## 953   4  5  1
## 954   2  3  2
## 955   5  5  3
## 956   5  5  3
## 957   1  1  3
## 958   3  3  3
## 959   5  3  1
## 960   5  5  3
## 961   5  5  3
## 962   3  3  3
## 963   4  5  2
## 964   5  5  3
## 965   2  2  1
## 966   3  1  3
## 967   4  5  5
## 968   2  1  3
## 969   3  3  3
## 970   1  3  2
## 971   5  5  1
## 972   4  5  2
## 973   3  3  4
## 974   1  2  3
## 975   5  4  5
## 976   3  4  3
## 977   5  4  4
## 978   3  5  1
## 979   5  5  3
## 980   5  5  5
## 981   5  5  4
## 982   5  2  2
## 983   2  2  5
## 984   4  4  3
## 985   1  3  3
## 986   5  5  3
## 987   2  2  5
## 988   5  4  4
## 989   3  1  1
## 990   5  5  1
## 991   3  1  5
## 992   4  4  5
## 993   2  1  5
## 994   5  3  5
## 995   1  3  1
## 996   4  4  3
## 997   1  1  1
## 998   2  2  3
## 999   3  5  5
## 1000  4  4  5
## 두 그래프는 큰 차이가 없어 보인다. 
ggplot(survey, aes(x = x1, y = y1)) + geom_point()

ggplot(survey, aes(x = x1, y = z1)) + geom_point()

## 점이 찍혀있는 정도에 따른 시각화
ggplot(survey, aes(x = x1, y = y1)) + geom_point() +
  stat_bin2d(bins = 4) +
  scale_fill_gradient(low = "lightblue", high = "darkblue")

ggplot(survey, aes(x = x1, y = z1)) + geom_point() +
  stat_bin2d(bins = 4) +
  scale_fill_gradient(low = "lightblue", high = "darkblue")

## 난수를 이용한 시각화
## 난수 발생을 위한 seed number를 선언한다. 
set.seed(10921092)
survey$x2 <- with(survey, x1 + rnorm(1000)/5)
survey$y2 <- with(survey, y1 + rnorm(1000)/5)
survey$z2 <- with(survey, z1 + rnorm(1000)/5)

ggplot(survey, aes(x = x2, y = y2)) + geom_point() + stat_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(survey, aes(x = x2, y = z2)) + geom_point() + stat_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

### 수고하셨습니다