-
[R 기초] Gapminder Data 분석Data Science/Data Science in R 2018. 10. 9. 23:11
※ Data 가공(①)과 시각화(②)를 기준으로 작성하였으니 참고바랍니다.
① 목표 : R에 내포되어 있는 gapminder data를 가공하여 보자.
* gapminder data란?
국가별 경제 수준과 의료 수준 동향을 정리한 DataSet으로써, 첫 번째 변수는 경제적 수준을 일인당 GDP로 잡았고 두 번째 변수는 의료 수준을 평균 기대 수명으로 잡았다.
1. 가장 먼저 데이터를 로드시킨다.
> install.packages("gapminder")
2. 다음으로 gapminder data에 대해 알아본다. 먼저 gapminder data를 frame으로 변경하여 확인하여 보겠다.
> as.data.frame(gapminder)
country continent year lifeExp pop gdpPercap
1 Afghanistan Asia 1952 28.80100 8425333 779.4453
2 Afghanistan Asia 1957 30.33200 9240934 820.8530
3 Afghanistan Asia 1962 31.99700 10267083 853.1007
4 Afghanistan Asia 1967 34.02000 11537966 836.1971
5 Afghanistan Asia 1972 36.08800 13079460 739.9811
6 Afghanistan Asia 1977 38.43800 14880372 786.1134
7 Afghanistan Asia 1982 39.85400 12881816 978.0114
8 Afghanistan Asia 1987 40.82200 13867957 852.3959
9 Afghanistan Asia 1992 41.67400 16317921 649.3414
10 Afghanistan Asia 1997 41.76300 22227415 635.3414
아래처럼 나오는데.. 무엇을 의미하는지 정확히모르니 각 변수가 무엇을 의미하는지부터 확인하여 보자.
> ?gapminder
이 Data의 핵심은 lifeExp와 gdpPercap일 것으로 예상이 된다.
3. 내가 확인하고자 하는 국가는 Korea이므로 Korea의 Data만 확인하고 싶다면 gapminder$country에서 Korea만 확인해보면 된다.
#행 선택(여기서 행은 Korea를 의미)
> gapminder[gapminder$country == 'Korea, Rep.',]
# A tibble: 12 x 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Korea, Rep. Asia 1952 47.5 20947571 1031.
2 Korea, Rep. Asia 1957 52.7 22611552 1488.
3 Korea, Rep. Asia 1962 55.3 26420307 1536.
4 Korea, Rep. Asia 1967 57.7 30131000 2029.
5 Korea, Rep. Asia 1972 62.6 33505000 3031.
6 Korea, Rep. Asia 1977 64.8 36436000 4657.
7 Korea, Rep. Asia 1982 67.1 39326000 5623.
8 Korea, Rep. Asia 1987 69.8 41622000 8533.
9 Korea, Rep. Asia 1992 72.2 43805450 12104.
10 Korea, Rep. Asia 1997 74.6 46173816 15994.
11 Korea, Rep. Asia 2002 77.0 47969150 19234.
12 Korea, Rep. Asia 2007 78.6 49044790 23348.
위와 같이 나오는 것을 확인할 수 있다. 위의 frame처럼 우리나라는 52년부터 07년도까지 많은 gdp상승을 이루어 내었으며, 그에 비례하여 평균 수명도 상승하는 모습을 볼 수 있다.
* 여기서 'Korea, Rep.'의 의미는 대한민국을 의미하는 것이므로, 북한은 포함되지 않았다.
4. 그렇다면 행과 열을 선택하기 위해 Korea의 year과 lifeExp, gdpPercap을 선택해보자.
> gapminder[gapminder$country == 'Korea, Rep.', c('year', 'lifeExp', 'gdpPercap')]
# A tibble: 12 x 3
year lifeExp gdpPercap
<int> <dbl> <dbl>
1 1952 47.5 1031.
2 1957 52.7 1488.
3 1962 55.3 1536.
4 1967 57.7 2029.
5 1972 62.6 3031.
6 1977 64.8 4657.
7 1982 67.1 5623.
8 1987 69.8 8533.
9 1992 72.2 12104.
10 1997 74.6 15994.
11 2002 77.0 19234.
12 2007 78.6 23348.
위와 같이 나와 내가 필요한 정보에 대해서만 알게 되었다.
*여기서 c()는 vector를 생성하는 것을 의미한다.
5. 아래와 같이 변수만 선택도 가능하다.
> gapminder[,c('year', 'lifeExp', 'gdpPercap')]
# A tibble: 1,704 x 3
year lifeExp gdpPercap
<int> <dbl> <dbl>
1 1952 28.8 779.
2 1957 30.3 821.
3 1962 32.0 853.
4 1967 34.0 836.
5 1972 36.1 740.
6 1977 38.4 786.
7 1982 39.9 978.
8 1987 40.8 852.
9 1992 41.7 649.
10 1997 41.8 635.
# ... with 1,694 more rows
> gapminder[,c('country')]
# A tibble: 1,704 x 1
country
<fct>
1 Afghanistan
2 Afghanistan
3 Afghanistan
4 Afghanistan
5 Afghanistan
6 Afghanistan
7 Afghanistan
8 Afghanistan
9 Afghanistan
10 Afghanistan
# ... with 1,694 more rows
> gapminder[,1:3]
# A tibble: 1,704 x 3
country continent year
<fct> <fct> <int>
1 Afghanistan Asia 1952
2 Afghanistan Asia 1957
3 Afghanistan Asia 1962
4 Afghanistan Asia 1967
5 Afghanistan Asia 1972
6 Afghanistan Asia 1977
7 Afghanistan Asia 1982
8 Afghanistan Asia 1987
9 Afghanistan Asia 1992
10 Afghanistan Asia 1997
# ... with 1,694 more rows
6. 이제 변수명을 바꾸어보자. 만약 gdpPercap을 gdp_per_cap으로 변경하고 싶다면 먼저 원본데이터가 손상되지 않도록 변수에 복사해준 후 바꾸면 된다.
> f2=gapminder
> names(f2)
[1] "country" "continent" "year" "lifeExp" "pop" "gdpPercap"
> names(f2)[6] = 'gdp_per_cap'
> names(f2)
[1] "country" "continent" "year" "lifeExp" "pop" "gdp_per_cap"
7. 이제 f2 frame에 변수를 생성해보자. total gdp를 구하려면 pop과 gdpPercap을 곱해주면 된다.
# frame에 total_gdp를 추가
> f2$total_gdp = f2$pop * f2$gdp_per_cap
> f2
# A tibble: 1,704 x 7
country continent year lifeExp pop gdp_per_cap total_gdp
<fct> <fct> <int> <dbl> <int> <dbl> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779. 6567086330.
2 Afghanistan Asia 1957 30.3 9240934 821. 7585448670.
3 Afghanistan Asia 1962 32.0 10267083 853. 8758855797.
4 Afghanistan Asia 1967 34.0 11537966 836. 9648014150.
5 Afghanistan Asia 1972 36.1 13079460 740. 9678553274.
6 Afghanistan Asia 1977 38.4 14880372 786. 11697659231.
7 Afghanistan Asia 1982 39.9 12881816 978. 12598563401.
8 Afghanistan Asia 1987 40.8 13867957 852. 11820990309.
9 Afghanistan Asia 1992 41.7 16317921 649. 10595901589.
10 Afghanistan Asia 1997 41.8 22227415 635. 14121995875.
# ... with 1,694 more rows
8. 이제 가공된 Data를 통해 요약 통계량을 계산해보자.
#1952~2007년까지의 대한민국 평균 일인당 GDP
> median(f2[f2$country == 'Korea, Rep.',]$gdp_per_cap)
[1] 5140.082
# 전체 평균
> summary(f2)
country continent year lifeExp pop
Afghanistan: 12 Africa :624 Min. :1952 Min. :23.60 Min. :6.001e+04
Albania : 12 Americas:300 1st Qu.:1966 1st Qu.:48.20 1st Qu.:2.794e+06
Algeria : 12 Asia :396 Median :1980 Median :60.71 Median :7.024e+06
Angola : 12 Europe :360 Mean :1980 Mean :59.47 Mean :2.960e+07
Argentina : 12 Oceania : 24 3rd Qu.:1993 3rd Qu.:70.85 3rd Qu.:1.959e+07
Australia : 12 Max. :2007 Max. :82.60 Max. :1.319e+09
(Other) :1632
gdp_per_cap total_gdp
Min. : 241.2 Min. :5.278e+07
1st Qu.: 1202.1 1st Qu.:5.895e+09
Median : 3531.8 Median :2.234e+10
Mean : 7215.3 Mean :1.868e+11
3rd Qu.: 9325.5 3rd Qu.:1.057e+11
Max. :113523.1 Max. :1.293e+13
★ 요약통계량 함수
* 요약 통계량이란 평균(mean), 분산(variance), 중위수(median), 최소/최대(min/maximun), 분위수(percentile), 상관계수(correlation) 등 자료의 특성을 수치로 요약하여 나타내는 것
> summary(gapminder$lifeExp) # 대표적인 요약통계량 값들을 출력
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 23.60 48.20 60.71 59.47 70.85 82.60
> mean(gapminder$lifeExp) # 평균을 계산
## [1] 59.47444
> quantile(gapminder$lifeExp,probs=c(0.1,0.25,0.5,0.75,0.9)) # 자료의 순서상 위치를 출력
## 10% 25% 50% 75% 90%
## 41.5108 48.1980 60.7125 70.8455 75.0970
> cor(gapminder$lifeExp,gapminder$gdpPercap) # 두 변수의 상관계수를 출력
## [1] 0.5837062
> with(gapminder,cor(lifeExp,gdpPercap)) # 두 변수의 상관계수를 출력
# 'with'함수는 같은 객체의 이름을 반복할 필요 없게 해 준다
## [1] 0.5837062
따라서, 평균수명과 국민소득 사이에는 0.6에 육박하는 비교적 높은 (양의) 상관관계가 존재함을 알 수 있다. (즉, 잘 사는 사람이 오래산다..)②-1 Gapminder Data를 Base R 그래픽으로 시각화 시켜보자.
1. 이전에 학습했던 data 가공하는 법과 요약통계량 계산하는 법을 베이스 R 그래픽으로 시각화 시켜보자.
#hist와 plot은 Base R 그래픽이므로 따로 package install이 필요없다.
> par(mfrow = c(2,2)) #그림을 2*2 형태로 그림
> hist(gapminder$lifeExp) # 히스토그램 : 자료의 분포형태를 한 눈에 파악
> hist(gapminder$gdpPercap, nclass = 50) # nclass = 50 : 50개의 구간으로 나누어 그림
> hist(log10(gapminder$gdpPercap), nclass = 50) # log10 : 히스토그램 자료를 log10으로 나누어 그림
> plot(log10(gapminder$gdpPercap),gapminder$lifeExp, cex=.5) # 두 변수 사이의 선점도
1) 첫 번째 플롯은 평균 수명 분포를 보여준다. histogram을 보면 40~50세 그룹과 70~75세 그룹에서 두 개의 피크가 발생되는 것을 볼 수 있다. 이 것은 40~50세 그룹의 이전 Data는 후진국을, 이후 Data는 개발도상국을, 70~75세 그룹부터는 선진국을 의미함을 알 수 있다.
2) 두 번째 플롯은 일인당 평균 GDP가 양의 방향으로 치우친 것임을 보여준다. 대부분의 국가-연도는 평균 소득이 10000달러가 되지 않는다.
3) 세 번째 플롯은 GDP 변수를 log변환하여 데이터를 균등한 모양으로 만들어주었다.
4) 네 번째 플롯은 로그 변환된 GDP와 평균 기대 수명 간 관계가 강한 양의 상관 관계가 있음을 시각적으로 보여준다. 여기서 cex=.5 옵션은 점의 크기를 줄여주기 위함이다.
※ 참고로 log변환 후 상관관계는 0.81로 증가한다.
> cor(gapminder$lifeExp, log10(gapminder$gdpPercap))
[1] 0.8076179
피어슨 상관 계수에 따르면 상관 관계는 다음과 같다.
-1에 가까운 값이 얻어지면 : 누가 봐도 매우 강력한 음(-)의 상관. 오히려 너무 확고하기 때문에 일부 연구자들은 데이터를 조작한 게 아닌가 의심할 정도이다. 사회과학 한정이다. 순수학문에 가까운 분야일수록 요구되는 상관관계는 높은 편.
-0.5 정도의 값이 얻어지면 : 강력한 음(-)의 상관. 연구자는 변인 x 가 증가하면 변인 y 가 감소한다고 자신 있게 말할 수 있다.
-0.2 정도의 값이 얻어지면 : 음(-)의 상관이긴 한데 너무 약해서 모호하다. 상관관계가 없다고는 할 수 없지만 좀 더 의심해 봐야 한다.
0 정도의 값이 얻어지면 : 대부분의 경우, 상관관계가 존재하지 않을 것이라고 간주된다. 다른 후속 연구들을 통해 뒤집어질지는 모르지만 일단은 회의적이다. 2차 방정식 그래프와 비슷한 모양이 될 경우 상관관계는 있으나 상관계수는 0에 가깝게 나온다.
0.2 정도의 값이 얻어지면 : 너무 약해서 의심스러운 양(+)의 상관. 이것만으로는 상관관계에 대해 아주 장담할 수는 없다. 하지만 사회과학에선 매우 큰 상관관계가 있는 것으로 간주한다.
0.5 정도의 값이 얻어지면 : 강력한 양(+)의 상관. 변인 x 가 증가하면 변인 y 가 증가한다는 주장은 이제 통계적으로 지지받고 있다.
1에 가까운 값이 얻어지면 : 이상할 정도로 강력한 양(+)의 상관. 위와 마찬가지로, 이렇게까지 확고한 상관관계는 오히려 쉽게 찾아보기 어렵다.
②-2 Gapminder Data를 ggplot2 package를 이용하여 시각화 시켜보자.
> library(ggplot2)
> library(dplyr)
> library(gridExtra)
> library(gapminder)
> g1 = gapminder %>% ggplot(aes(x=lifeExp)) + geom_histogram() # aes() : 변수를 그래프 구성요소에 매핑해준다.
> g2 = gapminder %>% ggplot(aes(x = gdpPercap)) + geom_histogram()
> g3 = gapminder %>% ggplot(aes(x=gdpPercap)) + geom_histogram() + scale_x_log10()
> g4 = gapminder %>% ggplot(aes(x=gdpPercap, y= lifeExp)) + geom_point() +scale_x_log10()+ geom_smooth()
> grid.arrange(g1,g2,g3,g4,nrow=2,ncol=2) # 그리드를 row와 col에 맞춰 나열해준다.
다음과 같이 조금 더 세련된 그래프 형태를 볼 수 있다.
* ggplot2 기초 학습 : https://kuklife.tistory.com/45?category=797850
* 참고문헌 : 실리콘밸리 데이터 과학자가 알려주는 따라하며 배우는 데이터 과학(저자 : 권재명)
'Data Science > Data Science in R' 카테고리의 다른 글
[Data Science] 데이터 종류에 따른 분석 기법 (0) 2018.10.25 [Data Science 기초] IMDB 영화 정보 데이터 시각화 및 분석 (0) 2018.10.24 [Data Science 기초] 데이터 시각화 응용 - 변수의 종류에 따른 시각화 (0) 2018.10.23 [R 기초] 데이터 시각화 기초 - Base R package vs. ggplot2 (0) 2018.10.23 [R 기초] dplyr package (0) 2018.10.09