ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시각화 - 예제
    R 2020. 7. 9. 14:33

    시각화

    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)."

    Chap04-2.html
    1.63MB

    'R' 카테고리의 다른 글

    확률  (0) 2020.07.13
    시각화 - D3.js  (0) 2020.07.09
    시각화  (0) 2020.07.07
    기술통계 - 실전 예제  (0) 2020.07.07
    기술통계  (0) 2020.07.06
Designed by Tistory.