ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    * 참고문헌 : 실리콘밸리 데이터 과학자가 알려주는 따라하며 배우는 데이터 과학(저자 : 권재명)

    댓글

by KUKLIFE