시각화 - 예제
시각화
EDA 연습
상관관계가 높은 변수쌍 찾기
DataSet : mtcars - R 기본 내장
-
Motor Trend Car Road Test
-
Motor Trend 잡지로 부터 추출된 자료
-
1973~1974년도 각기 종류가 다른 32대의 자동차 자료
-
mpg(Miles/gallon) : 연비
-
cyl(Number of cylinders) : 실린더 수
-
disp(Displacement) : 배기량
-
hp(Gross horsepower) : 마력
-
drat(Rear axle ratio) : 후방 차축 비율
-
wt(Weight) : 차체 무게
-
qsec (1/4 mile time) : 400m 까기 걸리는 시간
-
vs(V/S)
-
am (Transmission 0 = auto, 1 = manual)
-
gear (Number of forward gears) : 전진장치 개수
-
carb (Number of carburetors) : 기화기 수
# 데이터 로드
df <- mtcars
head(df)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
str(df)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
# 모든 변수 산점도 그리기
plot(df[, c(1:5)])
plot(df[,c(6:11)])
#plot(df) 11개 다 그리기
# mpg~disp 상관 관계 높아 보여 따로 그리기 y~x
plot(df$mpg~df$disp)
# 상관계수 구하기 cor() - 상관계수 높음, 두 변수 좀 더 자세히 분석
cor(df$mpg, df$disp)
-0.847551379262479
# mpg 아웃라이어 확인 - 아웃라이어는 없고 데이터가 위쪽에 좀더 분산되어 있음
boxplot(df$mpg)
# 히스토그램 hist() - 분산 상태 확인
hist(df$mpg)
# 히스토그램 hist()- 분산 상태 확인 2
hist(df$mpg, breaks = 10)
# disp 아웃라이어 확인 - 아웃라이어는 없고 110~320에 몰려 있음
boxplot(df$disp)
hist(df$disp)
hist(df$disp, breaks = 20)
mpg, disp
-
두 변수 모두 이상점 없음
-
두 변수 상관관계가 있음을 방해하는 요소는 없어 보임
-
확증을 하기 위해서는 가설검증과 회귀분석 진행
-
EDA 단계는 증거를 수집하고 특징을 찾는 것
다이아몬드 데이터 분석하기 - 가격에 영향을 미치는 것은?
Data set : diamonds
-
ggplot2 패키지에 포함
-
캐럿, 가격, 컷팅방법, 컬러 등 다이아몬드 정보
library('ggplot2')
Warning message:
"package 'ggplot2' was built under R version 3.6.3"
# 데이터 로드
df <- diamonds
str(df)
tibble [53,940 x 10] (S3: tbl_df/tbl/data.frame)
$ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
$ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
$ price : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
$ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
# 관측치가 많아 Data 임의개수 추출 - sample(10, 2) 10개중 2개 추출
Sample <- df[sample(nrow(df), 300),] # 53940 중 300개 추출
attach(Sample) # attach - 메모리에 올려서 $ 없이 변수사용가능
str(Sample)
tibble [300 x 10] (S3: tbl_df/tbl/data.frame)
$ carat : num [1:300] 2 0.3 0.53 0.7 0.71 0.91 0.27 1.2 0.31 0.38 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 3 2 3 5 3 3 5 4 3 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 1 2 5 3 1 2 6 2 3 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 4 4 3 4 2 6 2 2 7 ...
$ depth : num [1:300] 62.9 63.1 60.1 61.8 62.2 62 62.5 60 61.2 61.6 ...
$ table : num [1:300] 56 58 59 53 56 62 57 58 61 58 ...
$ price : int [1:300] 16064 568 1852 2499 2662 3463 799 4989 435 1200 ...
$ x : num [1:300] 7.94 4.26 5.24 5.71 5.7 6.16 4.13 6.91 4.36 4.61 ...
$ y : num [1:300] 8 4.3 5.27 5.74 5.72 6.25 4.1 6.93 4.37 4.65 ...
$ z : num [1:300] 5.01 2.7 3.16 3.54 3.55 3.85 2.57 4.15 2.67 2.85 ...
# 가격 분석
boxplot(price)
# 가격 이상치 - EDA로 원인 찾기
# price 와 관련된 그래프 그리기
par(mfrow = c(3,3))
plot(data=Sample, price~.) # y축(종속변수) price
# price 에 carat, x, y, z 등이 영항이 있어 보임
par(mfrow = c(2,2))
plot(price~carat+x+y+z)
# 상관 계수 구하기
Sample2 <- data.frame(price, carat, x, y, z)
cor(Sample2)
price | carat | x | y | z | |
---|---|---|---|---|---|
price | 1.0000000 | 0.9312732 | 0.8966988 | 0.8958036 | 0.8923548 |
carat | 0.9312732 | 1.0000000 | 0.9788762 | 0.9783356 | 0.9820316 |
x | 0.8966988 | 0.9788762 | 1.0000000 | 0.9990100 | 0.9927153 |
y | 0.8958036 | 0.9783356 | 0.9990100 | 1.0000000 | 0.9925702 |
z | 0.8923548 | 0.9820316 | 0.9927153 | 0.9925702 | 1.0000000 |
-
price에 carat, y, x, z 순으로 영향을 미치는 것 같음
-
x, y는 상관계수 거의 1
-
원인을 찾는 것이 더 어려움, 잠정적 결론
-
EDA는 결론보다 탐색하면서 궁금증을 가지고 원인을 찾는 것
# price, carat, x 특징 파악
par(mfrow = c(1, 3))
boxplot(price, main='price')
boxplot(carat, main='carat')
boxplot(x, main='x')
price, carat 에 이상치가 많음 => carat 이 price에 이상치가 생기도록 영향을 미쳤을 수 있음
# carat 오름차순 정렬
reCarat <- carat[order(carat)]
par(mfrow = c(1,1))
plot(reCarat)
-
carat 이 2차 함수와 비슷
-
carat 이 올라갈수록 값이 급격히 커짐
-
이런 성향 때문에 이상치 발생 예상
# carat 값 급격히 커지는 부분 제거
Sample2 <- subset(Sample, subset = (Sample$carat <1.0))
par(mfrow = c(1,2))
boxplot(Sample$carat, main='carat 1.0 포함')
boxplot(Sample2$carat, main='carat 1.0 미포함')
# 가격 분석 - 1 carat 넘으면 가격 이사이 발생
boxplot(Sample2$price)
자료를 탐색하고 의문점이 생기면 그 원인을 찾는 것이 탐색적 자료 분석(EDA)
섬세한 그래프를 그려 데이터 분석하기 - ggplot()
# 데이터 확인
library('ggplot2')
library('ggthemes')
str(diamonds)
Warning message:
"package 'ggthemes' was built under R version 3.6.3"
tibble [53,940 x 10] (S3: tbl_df/tbl/data.frame)
$ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
$ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
$ price : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
$ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
# x와 price 산점도 그리기
ggplot(diamonds, aes(x=x, y=price)) + geom_point()
# clarity 변수 컬러에 추가
# clarity는 여러 값에 분포되어 있어 price에 영향은 없는듯
ggplot(diamonds, aes(x=x, y=price, colour=clarity)) + geom_point()
# 테마 적용
ggplot(diamonds, aes(x=x, y=price, colour=clarity)) +
geom_point() +
theme_solarized_2()
# 데이터 겹침 조절 - alpha
# price 8000 정도까지 몰려 있음
ggplot(diamonds, aes(x=x, y=price, colour=clarity)) +
geom_point(alpha=0.03) +
guides(colour = guide_legend(override.aes = list(alpha = 1))) +
theme_solarized_2()
# legend 만 alpha 값 1 - guide()
ggplot(diamonds, aes(x=x, y=price, colour=clarity)) +
geom_point(alpha=0.03) +
guides(colour = guide_legend(override.aes = list(alpha = 1))) +
theme_solarized_2()
# x축 범위 조절(3~9), 수평선으로 평균 표시 geom_hline()
ggplot(diamonds, aes(x=x, y=price, colour=clarity)) +
geom_point(alpha=0.03) +
geom_hline(yintercept=mean(diamonds$price), color="turquoise3", alpha=.8) +
guides(colour = guide_legend(override.aes = list(alpha = 1))) +
xlim(3,9) +
theme_solarized_2()
Warning message:
"Removed 50 rows containing missing values (geom_point)."
시계열데이터 라인 그래프로 나타내기
-
Data set : 간단한 시간대별 매출 자료
# 데이터 로드
TS <- read.csv('r-ggagi-data/example_ts.csv')
str(TS)
head(TS)
'data.frame': 24 obs. of 2 variables:
$ Date : num 2014 2014 2014 2014 2014 ...
$ Sales: int 2000 2300 2400 2500 2800 3100 2900 3000 3300 3400 ...
Date | Sales |
---|---|
2014.01 | 2000 |
2014.02 | 2300 |
2014.03 | 2400 |
2014.04 | 2500 |
2014.05 | 2800 |
2014.06 | 3100 |
# 시각화 geom_line()
ggplot(TS, aes(x=Date, y=Sales)) + geom_line()
# x축에 날짜 모두 표시하기 - factor()
# group=1 하나의 라인으로 연속 그릴 때
ggplot(TS, aes(x=factor(Date), y=Sales, group=1)) + geom_line()
# 점 추가 geom_point()
ggplot(TS, aes(x=factor(Date), y=Sales, group=1)) + geom_line() + geom_point()
# 테마 적용
ggplot(TS, aes(x=factor(Date), y=Sales, group=1)) + geom_line() + geom_point() + theme_economist()
# 디자인 값 변경
ggplot(TS, aes(x=factor(Date), y=Sales, group=1)) +
geom_line(colour="orange1", size=1) +
geom_point(colour="orangered2", size=4) +
theme_economist()
# title, x, y 축 이름 추가
ggplot(TS, aes(x=factor(Date), y=Sales, group=1)) +
geom_line(colour="orange1", size=1) +
geom_point(colour="orangered2", size=4) +
xlab("년도")+ ylab("매출") + ggtitle("A기업 월별 매출") +
theme_economist()
dplyr 패키지로 데이터 선택 해 그래프 나타내기 - filter()
-
ggplot2 만든 Hadley Wickham 교수가 data.frame 객체를 쉽게 다루기 위해 만든 패키지
install.packages('dplyr')
package 'dplyr' successfully unpacked and MD5 sums checked
Warning message:
"cannot remove prior installation of package 'dplyr'"Warning message in file.copy(savedcopy, lib, recursive = TRUE):
"D:\bigdata\python\Anaconda\envs\r_study\Lib\R\library\00LOCK\dplyr\libs\i386\dplyr.dll를 D:\bigdata\python\Anaconda\envs\r_study\Lib\R\library\dplyr\libs\i386\dplyr.dll로 복사하는데 문제가 발생했습니다: Permission denied"Warning message:
"restored 'dplyr'"
The downloaded binary packages are in
C:\Users\205\AppData\Local\Temp\RtmpishXDd\downloaded_packages
library('dplyr')
library('ggplot2')
library('ggthemes')
Warning message:
"package 'dplyr' was built under R version 3.6.3"
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
# 데이터 로드 - 전국 인구조사 자료
DF <- read.csv("r-ggagi-data/example_population_f.csv")
DF <- DF[,-1] #첫번재 열은 ID숫자이기 때문에 삭제합니다.
DF <- tbl_df(DF) #tbl_df ( tibble diff라고도 함 ) 데이터 프레임 의 변형, dataframe + dplyr 속성추가
head(DF)
Warning message:
"`tbl_df()` is deprecated as of dplyr 1.0.0.
Please use `tibble::as_tibble()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated."
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
서울특별시 | 종로구 | 155695 | 72882 | 2.14 | 76962 | 78733 | 0.98 |
서울특별시 | 중구 | 126817 | 59614 | 2.13 | 63292 | 63525 | 1.00 |
서울특별시 | 용산구 | 235186 | 108138 | 2.17 | 114119 | 121067 | 0.94 |
서울특별시 | 성동구 | 298145 | 126915 | 2.35 | 148265 | 149880 | 0.99 |
서울특별시 | 광진구 | 362197 | 158769 | 2.28 | 177946 | 184251 | 0.97 |
서울특별시 | 동대문구 | 362604 | 160110 | 2.26 | 181825 | 180779 | 1.01 |
# 충청도 도시들의 인구 그래프 그리기 - filter() 조건 vs subset()
DF2 <- filter(DF, Provinces=="충청북도" | Provinces=="충청남도")
head(DF2)
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
충청북도 | 청주시 | 832387 | 334276 | 2.49 | 417505 | 414882 | 1.01 |
충청북도 | 청주시 상당구 | 178536 | 70873 | 2.52 | 89037 | 89499 | 0.99 |
충청북도 | 청주시 서원구 | 222817 | 88212 | 2.53 | 110729 | 112088 | 0.99 |
충청북도 | 청주시 흥덕구 | 251652 | 101572 | 2.48 | 126533 | 125119 | 1.01 |
충청북도 | 청주시 청원구 | 179382 | 73619 | 2.44 | 91206 | 88176 | 1.03 |
충청북도 | 충주시 | 208173 | 87078 | 2.39 | 104828 | 103345 | 1.01 |
# 그래프 그리기
Graph <- ggplot(DF2, aes(x=City, y=Population, fill=Provinces)) +
geom_bar(stat='identity') + theme_wsj()
Graph
# 오름차순 정렬 - reorder()
GraphReorder <- ggplot(DF2, aes(x=reorder(City, Population), y=Population, fill=Provinces)) +
geom_bar(stat='identity') + theme_wsj()
GraphReorder
# 남자비율이 높고 1인가구가 많은 도시
DF3 <- filter(DF, SexRatio > 1, PersInHou < 2)
DF3
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
인천광역시 | 옹진군 | 20825 | 11172 | 1.86 | 11715 | 9110 | 1.29 |
강원도 | 화천군 | 26790 | 13433 | 1.99 | 14989 | 11801 | 1.27 |
강원도 | 고성군 | 30066 | 15485 | 1.94 | 16109 | 13957 | 1.15 |
충청북도 | 괴산군 | 38027 | 19145 | 1.99 | 19309 | 18718 | 1.03 |
전라남도 | 신안군 | 43566 | 22248 | 1.96 | 22899 | 20667 | 1.11 |
경상북도 | 울릉군 | 10304 | 5365 | 1.92 | 5518 | 4786 | 1.15 |
# 시각화
Graph <- ggplot(DF3, aes(x=City, y=SexRatio, fill=Provinces)) +
geom_bar(stat='identity') + theme_wsj()
Graph
dplyr 패키지로 데이터 만들고 그래프 나타내기 - mutate()
library('dplyr')
library('ggplot2')
library('ggthemes')
# 데이터 로드 - 전국 인구조사 자료
DF <- read.csv("r-ggagi-data/example_population_f.csv")
DF <- DF[,-1] #첫번재 열은 ID숫자이기 때문에 삭제합니다.
DF <- tbl_df(DF) #tbl_df ( tibble diff라고도 함 ) 데이터 프레임 의 변형, dataframe + dplyr 속성추가
head(DF)
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
서울특별시 | 종로구 | 155695 | 72882 | 2.14 | 76962 | 78733 | 0.98 |
서울특별시 | 중구 | 126817 | 59614 | 2.13 | 63292 | 63525 | 1.00 |
서울특별시 | 용산구 | 235186 | 108138 | 2.17 | 114119 | 121067 | 0.94 |
서울특별시 | 성동구 | 298145 | 126915 | 2.35 | 148265 | 149880 | 0.99 |
서울특별시 | 광진구 | 362197 | 158769 | 2.28 | 177946 | 184251 | 0.97 |
서울특별시 | 동대문구 | 362604 | 160110 | 2.26 | 181825 | 180779 | 1.01 |
# 남녀비율 문자로 나타내는 변수 추가 - mutate() vs cbind()
DF <- mutate(DF, SexF = ifelse(SexRatio < 1, "여자비율높음",
ifelse(SexRatio > 1, "남자비율높음", "남여비율같음")))
head(DF)
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio | SexF |
---|---|---|---|---|---|---|---|---|
서울특별시 | 종로구 | 155695 | 72882 | 2.14 | 76962 | 78733 | 0.98 | 여자비율높음 |
서울특별시 | 중구 | 126817 | 59614 | 2.13 | 63292 | 63525 | 1.00 | 남여비율같음 |
서울특별시 | 용산구 | 235186 | 108138 | 2.17 | 114119 | 121067 | 0.94 | 여자비율높음 |
서울특별시 | 성동구 | 298145 | 126915 | 2.35 | 148265 | 149880 | 0.99 | 여자비율높음 |
서울특별시 | 광진구 | 362197 | 158769 | 2.28 | 177946 | 184251 | 0.97 | 여자비율높음 |
서울특별시 | 동대문구 | 362604 | 160110 | 2.26 | 181825 | 180779 | 1.01 | 남자비율높음 |
# SexF 순서있는 변수로 변환
DF$SexF <- factor(DF$SexF)
DF$SexF <- ordered(DF$SexF, c("여자비율높음", "남여비율같음", "남자비율높음"))
# 경기도 데이터 적재
DF2 <- filter(DF, Provinces=="경기도")
# 시각화 - 경기도 남자비율 높음
Graph <- ggplot(DF2, aes(x=City, y=(SexRatio-1), fill=SexF)) +
geom_bar(stat='identity') + theme_wsj()
Graph
# 서울 데이터 적재
DF3 <- filter(DF, Provinces=="서울특별시")
# 시각화 - 서울 여자 비율 높음
Graph2 <- ggplot(DF3, aes(x=City, y=(SexRatio-1), fill=SexF)) +
geom_bar(stat='identity') + theme_wsj()
Graph2
reshape2 패키지 melt() 이용 데이터 가공 후 그래프 나타내기
-
melt() : 명목형 변수로 만들어 줌
-
Data set : 전국 인구조사 자료
library("dplyr")
library("ggplot2")
library("ggthemes")
library("reshape2")
# 데이터 로드
DF <- read.csv('r-ggagi-data/example_population_f.csv')
DF <- DF[,-1] # 첫번째 열은 ID 숫자이기 때문에 삭제
DF <- tbl_df(DF) # tbl_df (tibble diff 라고도 함) 데이터 프레임의 변형, dataframe + dplyr 속성추가
head(DF)
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
서울특별시 | 종로구 | 155695 | 72882 | 2.14 | 76962 | 78733 | 0.98 |
서울특별시 | 중구 | 126817 | 59614 | 2.13 | 63292 | 63525 | 1.00 |
서울특별시 | 용산구 | 235186 | 108138 | 2.17 | 114119 | 121067 | 0.94 |
서울특별시 | 성동구 | 298145 | 126915 | 2.35 | 148265 | 149880 | 0.99 |
서울특별시 | 광진구 | 362197 | 158769 | 2.28 | 177946 | 184251 | 0.97 |
서울특별시 | 동대문구 | 362604 | 160110 | 2.26 | 181825 | 180779 | 1.01 |
# 도별 합계 = 도시별(group by) 계산 summarise() 합계 sum()
group <- group_by(DF, Provinces) # 도시별
DF2 <- summarise(group, SumPopulation=sum(Population), Male=sum(Male), Female=sum(Female))
DF2
`summarise()` ungrouping output (override with `.groups` argument)
Provinces | SumPopulation | Male | Female |
---|---|---|---|
강원도 | 1547166 | 780487 | 766679 |
경기도 | 18723822 | 9401705 | 9322117 |
경상남도 | 4428762 | 2235747 | 2193015 |
경상북도 | 3215695 | 1616853 | 1598842 |
광주광역시 | 1476974 | 731808 | 745166 |
대구광역시 | 2491137 | 1239275 | 1251862 |
대전광역시 | 1525656 | 763262 | 762394 |
부산광역시 | 3517491 | 1737975 | 1779516 |
서울특별시 | 10078850 | 4962774 | 5116076 |
울산광역시 | 1169768 | 602945 | 566823 |
인천광역시 | 2914271 | 1464320 | 1449951 |
전라남도 | 1902638 | 950693 | 951945 |
전라북도 | 2523806 | 1252574 | 1271232 |
제주특별자치도 | 615250 | 308627 | 306623 |
충청남도 | 2671383 | 1355937 | 1315446 |
충청북도 | 2414568 | 1215413 | 1199155 |
# melt(DF2, measure.vars = 바꿀변수들) - 성별을 하나의 명목형 변수로 처리 하고 싶을 때
DF3 <- melt(DF2, measure.vars = c('Male', 'Female'))
DF2
DF3
Provinces | SumPopulation | Male | Female |
---|---|---|---|
강원도 | 1547166 | 780487 | 766679 |
경기도 | 18723822 | 9401705 | 9322117 |
경상남도 | 4428762 | 2235747 | 2193015 |
경상북도 | 3215695 | 1616853 | 1598842 |
광주광역시 | 1476974 | 731808 | 745166 |
대구광역시 | 2491137 | 1239275 | 1251862 |
대전광역시 | 1525656 | 763262 | 762394 |
부산광역시 | 3517491 | 1737975 | 1779516 |
서울특별시 | 10078850 | 4962774 | 5116076 |
울산광역시 | 1169768 | 602945 | 566823 |
인천광역시 | 2914271 | 1464320 | 1449951 |
전라남도 | 1902638 | 950693 | 951945 |
전라북도 | 2523806 | 1252574 | 1271232 |
제주특별자치도 | 615250 | 308627 | 306623 |
충청남도 | 2671383 | 1355937 | 1315446 |
충청북도 | 2414568 | 1215413 | 1199155 |
Provinces | SumPopulation | variable | value |
---|---|---|---|
강원도 | 1547166 | Male | 780487 |
경기도 | 18723822 | Male | 9401705 |
경상남도 | 4428762 | Male | 2235747 |
경상북도 | 3215695 | Male | 1616853 |
광주광역시 | 1476974 | Male | 731808 |
대구광역시 | 2491137 | Male | 1239275 |
대전광역시 | 1525656 | Male | 763262 |
부산광역시 | 3517491 | Male | 1737975 |
서울특별시 | 10078850 | Male | 4962774 |
울산광역시 | 1169768 | Male | 602945 |
인천광역시 | 2914271 | Male | 1464320 |
전라남도 | 1902638 | Male | 950693 |
전라북도 | 2523806 | Male | 1252574 |
제주특별자치도 | 615250 | Male | 308627 |
충청남도 | 2671383 | Male | 1355937 |
충청북도 | 2414568 | Male | 1215413 |
강원도 | 1547166 | Female | 766679 |
경기도 | 18723822 | Female | 9322117 |
경상남도 | 4428762 | Female | 2193015 |
경상북도 | 3215695 | Female | 1598842 |
광주광역시 | 1476974 | Female | 745166 |
대구광역시 | 2491137 | Female | 1251862 |
대전광역시 | 1525656 | Female | 762394 |
부산광역시 | 3517491 | Female | 1779516 |
서울특별시 | 10078850 | Female | 5116076 |
울산광역시 | 1169768 | Female | 566823 |
인천광역시 | 2914271 | Female | 1449951 |
전라남도 | 1902638 | Female | 951945 |
전라북도 | 2523806 | Female | 1271232 |
제주특별자치도 | 615250 | Female | 306623 |
충청남도 | 2671383 | Female | 1315446 |
충청북도 | 2414568 | Female | 1199155 |
colnames(DF3)[3] <- 'Sex'
colnames(DF3)[4] <- 'Population'
head(DF3)
Provinces | SumPopulation | Sex | Population |
---|---|---|---|
강원도 | 1547166 | Male | 780487 |
경기도 | 18723822 | Male | 9401705 |
경상남도 | 4428762 | Male | 2235747 |
경상북도 | 3215695 | Male | 1616853 |
광주광역시 | 1476974 | Male | 731808 |
대구광역시 | 2491137 | Male | 1239275 |
# 남녀 비율 추가
DF4 <- mutate(DF3, Ratio = Population/SumPopulation)
DF4$Ratio <- round(DF4$Ratio, 3)
head(DF4)
Provinces | SumPopulation | Sex | Population | Ratio |
---|---|---|---|---|
강원도 | 1547166 | Male | 780487 | 0.504 |
경기도 | 18723822 | Male | 9401705 | 0.502 |
경상남도 | 4428762 | Male | 2235747 | 0.505 |
경상북도 | 3215695 | Male | 1616853 | 0.503 |
광주광역시 | 1476974 | Male | 731808 | 0.495 |
대구광역시 | 2491137 | Male | 1239275 | 0.497 |
# 시각화
G1 <- ggplot(DF4, aes(x=Provinces, y=Ratio, fill=Sex)) +
geom_bar(stat='identity') +
theme_wsj()
G2 <- geom_text(aes(y=Ratio, label=Ratio), colour = 'white')
G1 + G2
# 시각화 - coord_cartesian() 부분 확대
G1 <- ggplot(DF4, aes(x=Provinces, y=Ratio, fill=Sex)) +
geom_bar(stat='identity') +
coord_cartesian(ylim = c(0.45, 0.55)) +
theme_wsj()
G2 <- geom_text(aes(y=Ratio, label=Ratio), colour="white")
G1 + G2
# 비율값 위치 조정
DF4 <- mutate(DF4, Position = ifelse(Sex == 'Male', 0.475, 0.525))
head(DF4)
Provinces | SumPopulation | Sex | Population | Ratio | Position |
---|---|---|---|---|---|
강원도 | 1547166 | Male | 780487 | 0.504 | 0.475 |
경기도 | 18723822 | Male | 9401705 | 0.502 | 0.475 |
경상남도 | 4428762 | Male | 2235747 | 0.505 | 0.475 |
경상북도 | 3215695 | Male | 1616853 | 0.503 | 0.475 |
광주광역시 | 1476974 | Male | 731808 | 0.495 | 0.475 |
대구광역시 | 2491137 | Male | 1239275 | 0.497 | 0.475 |
# 시각화 - geom_text()
G1 <- ggplot(DF4, aes(x=Provinces, y=Ratio, fill=Sex)) +
geom_bar(stat='identity') +
coord_cartesian(ylim = c(0.45, 0.55)) + theme_wsj()
G2 <- geom_text(aes(y=Position, label=Ratio), colour="white")
G1 + G2
클리블랜드 점 그래프 그리기
-
Data set : 전국 인구조사 자료
require("dplyr")
require("ggplot2")
require("ggthemes")
# 데이터 로드
DF <- read.csv("r-ggagi-data/example_population_f.csv")
DF <- DF[,-1] #첫번재 열은 ID숫자이기 때문에 삭제합니다.
DF <- tbl_df(DF) #tbl_df ( tibble diff라고도 함 ) 데이터 프레임 의 변형, dataframe + dplyr 속성추가
head(DF)
Provinces | City | Population | Households | PersInHou | Male | Female | SexRatio |
---|---|---|---|---|---|---|---|
서울특별시 | 종로구 | 155695 | 72882 | 2.14 | 76962 | 78733 | 0.98 |
서울특별시 | 중구 | 126817 | 59614 | 2.13 | 63292 | 63525 | 1.00 |
서울특별시 | 용산구 | 235186 | 108138 | 2.17 | 114119 | 121067 | 0.94 |
서울특별시 | 성동구 | 298145 | 126915 | 2.35 | 148265 | 149880 | 0.99 |
서울특별시 | 광진구 | 362197 | 158769 | 2.28 | 177946 | 184251 | 0.97 |
서울특별시 | 동대문구 | 362604 | 160110 | 2.26 | 181825 | 180779 | 1.01 |
# 남녀비율 명목형 변수로 만들기
DF2 <- mutate(DF, SexF = ifelse(SexRatio > 1, "남자비율높음",
ifelse(SexRatio == 1, "남녀비율같음", "여자비율높음")))
# 경기도 데이터 적재
DF3 <- filter(DF2, Provinces=="경기도")
# 시각화 - geom_segment() x축 시작위치 xend=0, y축 명목형 변수 yend=City
Graph <- ggplot(DF3, aes(x=(SexRatio-1), y=reorder(City, SexRatio))) +
geom_segment(aes(yend=City), xend=0, colour="grey50") +
geom_point(size=4, aes(colour=SexF)) + theme_minimal()
Graph
시간에 따른 연령별 인구 변화 그래프 그리기
-
DataSet : 통계청 사이트에서 Download (www.kosis.or.kr)
-
시간별 인구변화 자료
library("dplyr")
library("ggplot2")
library("ggthemes")
library("reshape2")
library("scales") # 2e_07 => 200,000 표시
Warning message:
"package 'scales' was built under R version 3.6.3"
# 데이터 로드
DF <- read.csv('r-ggagi-data/example_population2.csv')
DF <- tbl_df(DF)
head(DF)
Time | Sex | Population | age0to4 | age5to9 | age10to14 | age15to19 | age20to24 | age25to29 | age30to34 | ... | age60to64 | age65to69 | age70to74 | age75to79 | age80to84 | age85to89 | age90to94 | age95to99 | age100to104 | age105to109 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1960 | Male | 12550691 | 2383544 | 1733443 | 1358903 | 1248858 | 1171363 | 960543 | 738376 | ... | 230431 | 141661 | 80707 | 45335 | NA | NA | NA | NA | NA | NA |
1960 | Female | 12461683 | 2207268 | 1617090 | 1287335 | 1169586 | 1151342 | 972537 | 817952 | ... | 288034 | 204014 | 129687 | 65864 | NA | NA | NA | NA | NA | NA |
1961 | Male | 12936583 | 2452879 | 1864580 | 1402613 | 1240278 | 1188724 | 1017695 | 765035 | ... | 239434 | 141887 | 84914 | 47111 | NA | NA | NA | NA | NA | NA |
1961 | Female | 12829090 | 2276565 | 1736162 | 1332220 | 1145417 | 1175745 | 1010896 | 844596 | ... | 296408 | 202677 | 139524 | 69374 | NA | NA | NA | NA | NA | NA |
1962 | Male | 13320983 | 2500793 | 1983775 | 1448949 | 1255899 | 1204229 | 1065655 | 793285 | ... | 241992 | 148284 | 86420 | 49893 | NA | NA | NA | NA | NA | NA |
1962 | Female | 13192047 | 2323482 | 1846082 | 1369542 | 1150735 | 1192695 | 1051348 | 874853 | ... | 296126 | 212423 | 140591 | 76638 | NA | NA | NA | NA | NA | NA |
# 남녀를 합쳐 새로운 datafram 생성 5세 => 10세 단위
group <- group_by(DF, Time)
DF2 <- summarise(group, s0=sum(age0to4, age5to9),
s10=sum(age10to14, age15to19),
s20=sum(age20to24, age25to29),
s30=sum(age30to34, age35to39),
s40=sum(age40to44, age45to49),
s50=sum(age50to54, age55to59),
s60=sum(age60to64, age65to69),
s70=sum(age70to74, age75to79),
s80=sum(age80to84, age85to89),
s90=sum(age90to94, age95to99),
s100=sum(age100to104, age105to109))
`summarise()` ungrouping output (override with `.groups` argument)
head(DF2)
Time | s0 | s10 | s20 | s30 | s40 | s50 | s60 | s70 | s80 | s90 | s100 |
---|---|---|---|---|---|---|---|---|---|---|---|
1960 | 7941345 | 5064682 | 4255785 | 2926453 | 2104964 | 1474230 | 864140 | 321593 | NA | NA | NA |
1961 | 8330186 | 5120528 | 4393060 | 2987916 | 2154627 | 1492633 | 880406 | 340923 | NA | NA | NA |
1962 | 8654132 | 5225125 | 4513927 | 3061297 | 2210697 | 1527018 | 898825 | 353542 | NA | NA | NA |
1963 | 8955786 | 5375068 | 4590600 | 3148634 | 2273571 | 1576341 | 911748 | 357878 | NA | NA | NA |
1964 | 9155797 | 5598769 | 4640279 | 3271141 | 2328024 | 1623340 | 912204 | 379013 | NA | NA | NA |
1965 | 9260938 | 5924880 | 4654662 | 3400903 | 2385998 | 1665823 | 934334 | 397242 | NA | NA | NA |
DF3 <- melt(DF2, measure.vars=c("s0", "s10", "s20", "s30", "s40", "s50", "s60", "s70", "s80", "s90", "s100"))
head(DF3)
colnames(DF3) <- c("Time", "Generation", "Population")
Time | variable | value |
---|---|---|
1960 | s0 | 7941345 |
1961 | s0 | 8330186 |
1962 | s0 | 8654132 |
1963 | s0 | 8955786 |
1964 | s0 | 9155797 |
1965 | s0 | 9260938 |
head(DF3)
Time | Generation | Population |
---|---|---|
1960 | s0 | 7941345 |
1961 | s0 | 8330186 |
1962 | s0 | 8654132 |
1963 | s0 | 8955786 |
1964 | s0 | 9155797 |
1965 | s0 | 9260938 |
# 시각화 - geom_area() 영역 그래프
G1 <- ggplot(DF3, aes(x=Time, y=Population, colour=Generation, fill=Generation)) +
geom_area(alpha=.6) + theme_wsj()
G1
Warning message:
"Removed 141 rows containing missing values (position_stack)."
# y축 값 변경 - scale_y_continuous(labels = comma)
G2 <- ggplot(DF3, aes(x=Time, y=Population, colour=Generation, fill=Generation)) +
geom_area(alpha=.6) + theme_wsj()
G2 + scale_y_continuous(labels = comma)
Warning message:
"Removed 141 rows containing missing values (position_stack)."