[문의사항] 기상관측자료 분석 문의

 정보

  • 업무명     : 기상관측자료 분석 문의
  • 작성자     : 이상호
  • 작성일     : 2021-01-27
  • 설   명      :
  • 수정이력 :

 

 문의

  • 총 기온검증장치가 12개라고 생각하고, 이것의 상대적 차이를 이용하고 대응표본 티검정을 이용해서 소형백엽상과 B의 상대적 기온차이를 봤을때는 거의  평균 0.3차이가 나고,  표준편차는 0.2정도라고 해요. 그럼 최대 0.5차이 난다는 뜻이겠죠. 
  • 그리고 대응표본 티검정을 했을때는 p값이 0.05보다 작아서 유의한 차이가 있다고 해석이 되어요.
  • 이게 문제는 모든 분석에서 유의한 차이가 있다고 나와서요. 
  • 이번에는 t통계량이 0으로 가까울수록 소형백엽상과 기온검증장치가 유사하다고 결론을 내고 싶거든요. 
  • 이런 방법으로 해석을 해도 되는지 궁금해요.

 

 답변

  • 보내주신 8월 소형백엽상과 엑셀 파일에서 "최고/최저/일평균" 시트를 이용해서 통계 프로그래밍 (R)로
    검정 결과 및 그림을 송부하오니 확인 부탁드립니다.
  • 일반적으로 통계 검정 시 다음과 같이 수행했습니다. 
  • [1 단계] F 검정 : 신뢰구간 (95%) 기준에서 P값 (유의수준)에 따라 귀무가설 기각/채택 여부 선정
    • > P값 (0.05 이하) > 귀무가설 기각 > 상이한 분산 > 두 일사계의 분산 차이가 있다.
    • > P값 (0.05 초과) > 귀무가설 채택 > 동일한 분산 > 두 일사계의 분산 차이가 없다. 
  • [2 단계] T 검정 : 앞서 F 검정 결과 (상이한 vs 동일한 분산) 정보를 이용하여 T 검정을 수행
    • P값 (유의수준)에 따라 귀무가설 기각/채택 여부를 선택합니다.
      • > P값 (0.05 이하) > 귀무가설 기각 > 두 일사계는 차이가 있다.
      • > P값 (0.05 초과) > 귀무가설 채택 > 두 일사계는 차이가 없다. 
  • 따라서 T 검정 결과 "최저/최저/일평균"에 대한 두 일사계 (소형백엽상 vs B-*)는 차이가 없습니다.

 

[T 테스트]

QUE0003_T-Test_평균_B-5-소형백엽상.png

 

[F 테스트]

QUE0003_F-Test_평균_B-소형백엽상.png

 

[소스 코드]

#===============================================================================================
# Routine : Main R program
#
# Purpose : 재능상품 오투잡
#
# Author : 해솔
#
# Revisions: V1.0 May 28, 2020 First release (MS. 해솔)
#===============================================================================================

#================================================
# 요구사항
#================================================
# 기상관측자료 분석 문의사항

serviceName = "QUE0003"

library(tidyverse)
library(ggplot2)
library(lubridate)
library(openxlsx)
library(fs)
library(moonBook)
library(webr)
library(tidyverse)
library(ggstatsplot)
library(useful)


#================================================
# Set Env
#================================================
globalVar = new.env()
globalVar$inpConfig = "."
globalVar$figConfig = "."
globalVar$outConfig = "."
globalVar$logConfig = "."
globalVar$mapConfig  = "."

#================================================
# Main
#================================================
fileInfo = Sys.glob(paste(globalVar$inpConfig, "8월 소형백엽상과 기존차광통분석.xlsx", sep = "/"))

data = openxlsx::read.xlsx(fileInfo, sheet = 1) %>%
  dplyr::rename(ref = 소형백엽상)

dataL1 = data %>%
  dplyr::mutate(
    dtDate = readr::parse_date(sDate, "%Y-%m-%d")
  ) %>%
  na.omit()


typeList = sort(unique(dataL1$type))
colList = setdiff(colnames(dataL1), c("sDate", "type", "ref", "dtDate"))
dataL3 = data.frame()

typeInfo = "최대값"
colInfo = "P-1"


for (typeInfo in typeList) {
  for (colInfo in colList) {
    
    dataL2 = dataL1 %>%
      dplyr::filter(type == typeInfo) %>%
      dplyr::select(colInfo, ref) %>%
      tidyr::gather(key = "key", value = "value")
    
    if (nrow(dataL2) < 1) { next }
    
    # P값이 2.2204e-16으로서 귀무가설 기각 (두 특성의 분산 차이가 있다)
    # 따라서 상이한 분산 조건 (var.equal = FALSE)
    fTest = var.test(value ~ key, data = dataL2, conf.level = 0.95)
    fTest
    
    setLabel = paste0(typeInfo, "_", colInfo,"-", "소형백엽상")
    saveImg = sprintf("%s/%s_%s_%s.png", globalVar$figConfig, serviceName, "F-Test", setLabel)
    
    plot(fTest) +
      xlim(0, 5) +
      ggsave(filename = saveImg, width = 10, height = 6, dpi = 600)
    
    isVarEqual = TRUE
    setVarResult = sprintf("P값이 %s로서 귀무가설 채택 (동일한 분산: 두 일사계의 분산 차이가 없다)", round(fTest$p.value, 3))
    
    if (fTest$p.value < 0.05) { 
      isVarEqual = FALSE
      setVarResult = sprintf("P값이 %s로서 귀무가설 기각 (상이한 분산 : 두 일사계의 분산 차이가 없다)", round(fTest$p.value, 3))
    }
    
    
    # P값이 0.054로서 귀무가설 기각 (두 특성은 차이가 있다)
    tTest = t.test(value ~ key, data = dataL2, var.equal = isVarEqual)
  
    saveImg = sprintf("%s/%s_%s_%s.png", globalVar$figConfig, serviceName, "T-Test", setLabel)
    plot(tTest) +
      xlim(-5, 5) +
      ggsave(filename = saveImg, width = 10, height = 6, dpi = 600)
    
    setResult = sprintf("P값이 %s로서 귀무가설 채택 (두 일사계는 차이가 없다)", round(tTest$p.value, 3))
    if (tTest$p.value < 0.05) { sprintf("P값이 %s로서 귀무가설 기각 (두 일사계는 차이가 있다)", round(tTest$p.value, 3)) }
    
    tmpData = data.frame(
      "setLabel" = setLabel
      , "fVal" = fTest$statistic
      , "fPval" = fTest$p.value
      , "fResult" = setVarResult
      , "tVal" = tTest$statistic
      , "tPval" = tTest$p.value
      , "tResult" = setResult
    )    
    
    dataL3 = dplyr::bind_rows(dataL3, tmpData)
  }
}

# XLSX 파일 생성
saveXlsxFile = sprintf("%s/%s_%s.xlsx", globalVar$outConfig, serviceName, "통계 결과")

wb = openxlsx::createWorkbook()

openxlsx::addWorksheet(wb, "table")
openxlsx::writeData(wb, "table", dataL3, startRow = 1, startCol = 1, colNames = TRUE, rowNames = FALSE)

openxlsx::saveWorkbook(wb, file = saveXlsxFile, overwrite = TRUE)

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

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

  • sangho.lee.1990@gmail.com

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

  • saimang0804@gmail.com