공공API - 기상(종관기상관측) R로 가지고 오기

기상정보를 활용하기 위해서 주로 기상자료개방포털에서 종관기상관측 데이터를 가지고 오긴 했는데 이를 매일 수작업으로 가지고 오다가 보니 오픈 API를 지원하는 것을 알게 되어서 간단하게 짜보았다.

아래 코드는 서울시를 비롯한 주요 광역시의 2018년 이후 기상데이터를 가지고 와서 특정 두 기간(18/12/01 ~ 19/01/07, 19/12/01 ~ 20/01/07) 중 평균기온의 분포를 Box Plot으로 보는 것이다.

업의 특성상 평일과 휴일간의 수치 변동이 큰 관계로 평일과 휴일을 나눠서 보았다. 연휴정보 역시 공공 API를 통해 데이터를 가지고 왔다. 관련된 코드는 xwMOOC에서 확인할 수 있다. 단 그대로 쓸 경우 2010.10.03일이 개천절이면서 동시에 추석이다 보니 레코드가 두 개가 들어 있는 바 이 부분은 정리할 필요가 있다. 아울러 지금은 모르겠는데 데이터를 받을 때 당시에 2020년 연휴정보는 포함이 되어 있지 않아 수작업으로 기입하였다.

참고로 아래 코드를 사용하기 위해서는 기상자료개방포털에서 API Key 발급이 필요하고 최상단과 최하단에 위치한  <code>, </code>를 지워야 한다.

# Library Load
rm(list=ls())
library(tidyverse)
library(httr)
library(rvest)
library(jsonlite)
library(lubridate)
#library(gridExtra)

# Variable Setting
default_url <- "https://data.kma.go.kr/apiData/getData"

getWeatherData <- function(type='json',dataCd = 'ASOS',dateCd = 'DAY',startDt,endDt,stnIds = 108){
  
  flag <- TRUE
  res <- GET(url = default_url,
             query = list(type=type,
                          dataCd = dataCd,
                          dateCd = dateCd,
                          startDt= startDt,
                          endDt =  endDt,
                          stnIds = stnIds,
                          schListCnt = as.numeric(as.Date(as.character(endDt),format='%Y%m%d') - as.Date(as.character(startDt),format='%Y%m%d')) + 1,
                          pageIndex = 1,
                          apiKey = Sys.getenv('WEATHER_D_TOKEN')))
  
  if(flag){
    json <- res %>% content(as = 'text', encoding = 'UTF-8') %>% fromJSON()
    temp_df <- as.data.frame(json$info[4])
    temp_df <- data.table(temp_df[,c('TM',"STN_ID","STN_NM",'MIN_TA','MAX_TA','AVG_TA','SUM_RN','SUM_RN_DUR'),]) # sum_rn 일강수량, min_ta 최저기온, max_ta 최고 기온 
    return(temp_df)
  }else{
    print('데이터가 조회되지 않않습니다. URL 확인 부탁드립니다.')
  } #에러 처리는 우선 적당히 마무리

}

result <- data.table()
stn_list <- c(108,112,133,143,152,156,159)

for(i in 1:length(stn_list)){
  cat('현재 진행하는 지점 번호: ',stn_list[i],"\n")
  temp_df <- getWeatherData(startDt = 20180101, endDt = 20200107, stnIds = stn_list[i])
  result <- rbind(result,temp_df)
  cat('종료\n')
}

#백업 
write.csv(result,"./data/200108_weather.csv",row.names = F)

##### 전처리 ----
names(result)[1] <-  'std_dt'
names(result) <- sapply(names(result),tolower)

result$std_dt <-  ymd(result$std_dt)
result$day <- weekdays(result$std_dt)


holidays <- fread("./data/holiday.csv")
holidays$holiday_dt <- ymd(holidays$holiday_dt)
holidays[,day := NULL,]

holidays[which(duplicated(holidays$holiday_dt))]
holidays <- holidays[holiday_nm != '개천절' & holiday_dt !='2017-10-03',,]
holidays[which(duplicated(holidays$holiday_dt))]


setkey(result,std_dt)
setkey(holidays,holiday_dt)
result <- holidays[result]
names(result)[1] <-  'std_dt'


#휴일 여부 추가 
result$yn_wkday <- ifelse((result$day %in% c('토요일','일요일') | !is.na(result$holiday_nm)),1,0) 
result[format(result$std_dt,"%m-%d") == '05-01','yn_wkday'] <- 1
result <- data.table(result)
result$yn_wkday <-  as.factor(result$yn_wkday)
result$yn_wkday <- ifelse(result$yn_wkday == 1,'휴일','평일')

group_df <- result[between(std_dt,'2018-12-01','2019-01-07') | between(std_dt,'2019-12-01','2020-01-07'),,] 
group_df$group <- ifelse(between(group_df$std_dt,'2018-12-01','2019-01-07'),"전년","올해")
group_df[yn_wkday == '휴일' & group=='올해',,]

group_df %>% ggplot(aes(x=yn_wkday,y=avg_ta,fill=group)) + geom_boxplot(outlier.color = 'red') +
  scale_y_continuous(breaks = seq(-15, 15, by = 1)) + ggtitle("전년 동기 평균 기온 분포(전년: 18/12/01 ~ 19/01/07, 올해: 19/12/01 ~ 20/01/07)") + 
  labs(x='휴일구분',y='평균기온',fill='구분') + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1),plot.title = element_text(size = 20, face = "bold")) + facet_grid(. ~ stn_nm)

Read more

OLS 기반 인과추론 시 오차항 관련 체크 필요 가정

OLS 기반 인과추론 시 오차항 관련 체크 필요 가정

배경 * 아래 글을 DANBI에서 보다가 더 알아보게 되었습니다. OLS를 떠받치는 몇 개의 기둥이 있는데 그중 실용적으로 가장 중요한 것이 일치성(consistency)다. 쉽게 말해서 OLS를 통해 도출된 추정량이 있을 때 샘플사이즈가 커지면서 이 값이 참 값으로 접근한다는 것이다. 일치성이 충족되면 우리는 적당하게 큰 표본에 대해서 추정치가 좋은 속성을 지니고 있다고

인공지능이 문제가 아니라 결국 사람이 문제가 될 것입니다.

인공지능이 문제가 아니라 결국 사람이 문제가 될 것입니다.

사람들이 AI가 필요하다고 생각하는 시점 저 판사를 얼른 AI로 교체해야 한다. 유튜브에서 뉴스를 보다 보면 정말 많이 보이는 덧글입니다. 이러한 내용의 덧글이 달릴 때마다, 정말 많은 사람들이 공감을 표하곤 합니다. 왜 이렇게 사람들은 이러한 주장에 공감을 표하는 것일까? AI는 시킨대로 하기 때문에 공정하다는 인식 여러 이유가 있겠지만, 사람들은 아마 AI가

BG/NBD 모델은 고객 생애가치를 추정하는데 사용되는 확률 모델입니다.

BG/NBD 모델은 고객 생애가치를 추정하는데 사용되는 확률 모델입니다.

1. BG/NBD 모델이란? * BG/NBD(Beta-Geometric/Negative Binomial Distribution) 모델은 **고객의 생애 가치(Customer Lifetime Value, CLV)**를 추정하는 데 사용되는 확률적 모델입니다. * 특히 고객이 반복 구매를 할지, 아니면 더 이상 활동하지 않을지를 추정하는 데 유용합니다. 이 모델은 고객의 구매 행태를 두 가지 중요한 개념으로 나눕니다: * 고객은 활성(active)

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=