## 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
## 데이터 구조변환을 다루는 라이브러리 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)
## 서울 여성 인구 추이를 뽑아보자.
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))
## 서울 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'
### 수고하셨습니다