반응형

     정보

    • 업무명     : R을 이용한 점수 변화 그래프 및 바람 장미 시각화

    • 작성자     : 이상호

    • 작성일     : 2020-10-12

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • 안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.

    • 다년간 축적된 경험 (기상학 학술 보고서 및 국/영문 학술 논문 게재, 블로그 운영, IT 회사 웹 개발 담당) 및 노하우를 바탕으로 개개인에게 맞춤형 솔루션을 수행할 수 있습니다.

    • 특히 재능 플랫폼 (크몽, 오투잡, 해피캠퍼스, 레포트 월드)에서 누구보다도 경쟁력 있는 가격으로 양질의 서비스를 제공하고 있습니다.

      • 아스키 형식의 텍스트 (text) 파일부터 과학자료 형식 (HDF, H5, NetCDF, Grib, Grb) 및 Data Base (DB) 자료까지 다양한 형태의 자료를 이용하여 수집, 전처리, 분석, 시각화해 드립니다.

      • 또한 웹 사이트에 대한 정보를 이용한 웹 크롤링 및 그에 따른 엑셀 및 DB 구축도 가능합니다.

      • 아울러 기초 통계 (빈도분포, Prired t-test, Wilcoxn 등)에서 지도/비지도 학습을 통한 회귀모형 구축에 이르기 까지 효율적인 통계 정보를 제공합니다.

      • 최근 대한민국의 후속위성인 천리안위성 2A호 웹 서비스 서브시스템 및 환경위성 2B호 통합 자료처리 서브시스템에 대한 웹 개발을 수행하였습니다.

    • 그리고 해솔 블로그에서는 다양한 기상학/천문학 정보와 더불어 사무 자동화/프로그래밍 언어를 소개하오니 방문 부탁드립니다.

    • 좋은 하루 보내세요.

     

    [재능플랫폼] 오투잡

     

    [IT개발 - 응용프로그래밍] 통계 분석, 데이터 분석, 시각화를 성실하게 해 드립니다. - 재능마켓 �

    판매가격:10,000원, [소개] - 데이터산업진흥원 데이터 가공 공급기업 선정 - 정보통신산업 진흥원 데이터 가공 공급기업 선정 - 다년간 축적된 경험 노하우를 바탕으로 개개인에게 맞춤형 솔루션�

    www.otwojob.com

     

    [재능플랫폼] 크몽

     

    데이터수집, 파싱, 크롤링 해 드립니다. | 50,000원부터 시작 가능한 총 평점 0점의 IT·프로그래밍,

    0개 총 작업 개수 완료한 총 평점 0점인 shlee1990의 IT·프로그래밍, 데이터분석·리포트, 데이터 마이닝·크롤링 서비스를 0개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터분석·리포트, 데

    kmong.com

     

     요청

    [세부 사항]

    • R 스크립트를 이용하여 아래 왼쪽 그래프와 같은 출력

    • R 스크립트를 n = 30인 모의 생성 자료에 적용하여 그래프 출력을 제시

     

     완료

    [사용 OS]

    • Windows 10

     

    [사용 언어]

    • R v4.0.2

     

    [명세]

    • 점수 변화 그래프

    • 초기값 설정
    n = 30
    x = rnorm(n, 50, 10)
    y = 50 +
      0.5 * (x - 50) +
      sqrt(1 - 0.5^2) * rnorm(n, 0, 10)

     

     

    • 시각화

      • par를 통해 영역 설정

      • png를 통해 그림 저장 (그림 해상도: 600 dpi)

      • axis의 경우 side (1, 2)에 따라 가로축 및 세로축 설정

      • 시각용 데이터 (data)를 이용하여 lines 및 points에서 점선 그래프 표시

    n = 30
    x = rnorm(n, 50, 10)
    y = 50 +
      0.5 * (x - 50) +
      sqrt(1 - 0.5^2) * rnorm(n, 0, 10)
    
    par(mfrow = c(1, 1))
    png(file = paste(globalVar$figConfig, paste0("Img_001_", format(Sys.time(), "%Y%m%d"), ".png"), sep='/'), width = 8, height = 5, units="in", res = 600)
    
    plot(c(-1.2, 1.2), c(20, 80), type = "n", xlab = "exams", ylab = "score", main = "score changes", axes = FALSE)
    
    axis(side = 1, at = c(-1, 1), labels = c("mid", "final"))
    axis(side = 2, at = seq(20, 80, 10))
    color = rainbow(n)
    order.1 = order(x)
    
    x = x[order.1]
    y = y[order.1]
    
    xAxisMin = -1
    xAxisMax = 1
    
    for (i in 1:n) {
      xPos = -1 + ((2 * i) / (n + 1))
    
    
      data = data.frame(
        x = c(xAxisMin, xPos, xPos, xAxisMax)
        , y = c(x[i], x[i], y[i], y[i])
      )
    
      # 선 그리기
      lines(data$x, data$y, col = color[i])
    
      # 점 그리기
      points(data[c(1, 4),], col = color[i], pch = 19)
    }
    dev.off()

     

     

     

    • 바람장미 그래프

      • 라이브러리 및 입력 자료 읽기

    library(openair)
    
    data(mydata)
    
    str(mydata)

     

     

    • 시각화

      • par를 통해 영역 설정

      • png를 통해 그림 저장 (그림 해상도: 600 dpi)

    k = 18
    
    par(mfrow = c(1, 1))
    png(file = paste(globalVar$figConfig, paste0("Img_002_", format(Sys.time(), "%Y%m%d"), ".png"), sep='/'), width = 8, height = 5, units="in", res = 600)
    
    histogram = hist(mydata$wd, breaks = seq(0, 360, length = k + 1))
    
    radius = histogram$counts / max(histogram$counts, na.rm = TRUE)
    
    s = seq(0, 2 * pi, length = 361)
    
    par(mfrow = c(1, 2))
    
    plot(cos(s), sin(s), type = "l", axes = FALSE, lty = "dotted", xlab = "", ylab = "", main = "wind direction")
    text(0, 0, "*")
    text(0, 1, "N"); text(1, 0, "E"); text(0, -1, "S"); text(-1, 0, "W")
    
    
    plot(cos(s), sin(s), type = "l", axes = FALSE, lty = "dotted", xlab = "", ylab = "", main = "wind direction")
    text(0, 0, "*")
    text(0, 1, "N"); text(1, 0, "E"); text(0, -1, "S"); text(-1, 0, "W")
    
    number = k
    
    for (i in 1:number) {
    
      sector = s[histogram$breaks[i] + 1]
      sectorArea = seq(sector, sector + (2 * pi) / number, length = 1000)
    
      xx = c(0, radius[i] * cos(sectorArea))
      yy = c(0, radius[i] * sin(sectorArea))
    
      polygon(xx, yy)
    }
    dev.off()

     

     

    [소스 코드]

    #===============================================================================================
    # Routine : Main R program
    #
    # Purpose : 재능상품 오투잡
    #
    # Author : 해솔
    #
    # Revisions: V1.0 May 28, 2020 First release (MS. 해솔)
    #===============================================================================================
    
    # 다음 R 스크립트를 완성하여 아래 왼쪽 그래프와 같은 출력이 나오도록 하자.
    # n (= 10)명 학생들의 중간시험성적 mid와 기말시험성적 final의 변롸를 보여준다.
    # mid로부터 final에 이르는 변화를 수평, 수직, 수평 선분을 이어 보여준다.
    # mid의 수평축 위치는 -1이고 final의 수평축 위치는 1이다.
    # mid의 순위가 i (=1, ..., n)인 학생의 수직선분의 수평축 위치는 -1 + ((2 * i) / (n + 1))이다.
    # 그리고 완성된 R 스크립트를 n = 30인 모의생성자료에 적용하여 그래프 출력을 제시하라.
    
    n = 30
    x = rnorm(n, 50, 10)
    y = 50 +
      0.5 * (x - 50) +
      sqrt(1 - 0.5^2) * rnorm(n, 0, 10)
    
    par(mfrow = c(1, 1))
    png(file = paste(globalVar$figConfig, paste0("Img_001_", format(Sys.time(), "%Y%m%d"), ".png"), sep='/'), width = 8, height = 5, units="in", res = 600)
    
    plot(c(-1.2, 1.2), c(20, 80), type = "n", xlab = "exams", ylab = "score", main = "score changes", axes = FALSE)
    
    axis(side = 1, at = c(-1, 1), labels = c("mid", "final"))
    axis(side = 2, at = seq(20, 80, 10))
    color = rainbow(n)
    order.1 = order(x)
    
    x = x[order.1]
    y = y[order.1]
    
    xAxisMin = -1
    xAxisMax = 1
    
    for (i in 1:n) {
      xPos = -1 + ((2 * i) / (n + 1))
    
    
      data = data.frame(
        x = c(xAxisMin, xPos, xPos, xAxisMax)
        , y = c(x[i], x[i], y[i], y[i])
      )
    
      # 선 그리기
      lines(data$x, data$y, col = color[i])
    
      # 점 그리기
      points(data[c(1, 4),], col = color[i], pch = 19)
    }
    dev.off()
    
    # openair::mydata에서 변수 wd는 바람이 불어오는 방향이다 (wd = 0은 북이고 wd = 90은 동, wd = 180은 남, wd = 270은 서이다).
    # wd에 대한 히스토그램을 아래 왼쪽 그림을 바탕으로 아래 오른쪽 그림과 같은 부채꼴 모양이 되도록 R 스크립트를 완성하라.
    # k (=9)개 구간으로 나눈 히스토그램이다.
    # 최대 빈도 구간의 부채꼴에 대하여 반경이 1이 되도록 한다.
    # 그리고 18 (=k)개 구간의 부채꼴 히스토그램을 제시하라.
    
    library(openair)
    
    data(mydata)
    
    str(mydata)
    
    k = 18
    
    par(mfrow = c(1, 1))
    png(file = paste(globalVar$figConfig, paste0("Img_002_", format(Sys.time(), "%Y%m%d"), ".png"), sep='/'), width = 8, height = 5, units="in", res = 600)
    
    histogram = hist(mydata$wd, breaks = seq(0, 360, length = k + 1))
    
    radius = histogram$counts / max(histogram$counts, na.rm = TRUE)
    
    s = seq(0, 2 * pi, length = 361)
    
    par(mfrow = c(1, 2))
    
    plot(cos(s), sin(s), type = "l", axes = FALSE, lty = "dotted", xlab = "", ylab = "", main = "wind direction")
    text(0, 0, "*")
    text(0, 1, "N"); text(1, 0, "E"); text(0, -1, "S"); text(-1, 0, "W")
    
    
    plot(cos(s), sin(s), type = "l", axes = FALSE, lty = "dotted", xlab = "", ylab = "", main = "wind direction")
    text(0, 0, "*")
    text(0, 1, "N"); text(1, 0, "E"); text(0, -1, "S"); text(-1, 0, "W")
    
    number = k
    
    for (i in 1:number) {
    
      sector = s[histogram$breaks[i] + 1]
      sectorArea = seq(sector, sector + (2 * pi) / number, length = 1000)
    
      xx = c(0, radius[i] * cos(sectorArea))
      yy = c(0, radius[i] * sin(sectorArea))
    
      polygon(xx, yy)
    }
    dev.off()

     

    [결과물]

    • 점수 변화 그래프

     

    • 바람장미 그래프

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
     
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기