문자 데이터 파싱 및 데이터 프레임 변환 후 분석 stringr

   설비를 교체를 검토 할 때,  항상 필요한 것이 있다.   최근에 어떤 부위에 얼마만큼 고장 났고,  생산에 문제가 있는지 분석 해야 한다. 

  이 때 필요한 것은 문자열 분석이다.   설비 전체를 교체 할 경우에는 전체적인 고장의 경향을 보면 되는데,  부분 교체 건은  보전 반장이 입력한 보전작업일보의 텍스트로 분석해야 한다.  


   문자열 데이터를 분석 하기 위해  stringr 패키지를 사용하였다.  이것도 해들리 위컴이 만든 tidyvers 안에 포함된 패키지이다. 

# 라이브러리 로딩 
  library(stringr)
  library(dplyr)
  library(ggplot2)

 라이브러리 로딩 할때는 데이터 프레임과 그래프를 보기 위해, dplyr과 ggplot2를  사용하였다. 

  아래의 보전오더는  17년 동안 사용한 주판라인의 용접장치에 쓰이는 용접기였고,  최근에 문제가 거의 없다가,  수명이 거의 다 되어, 분석한 내용이다.     

  아래의 데이터는  영문으로 정리한 데이터이다.  현장에서 입력된 데이터는 아주 많은 데이터 정제가 필요하다.   물론 용접기와 같은 전기 장치는 전조 현상을 보이지 않고,  급짝스럽게 고장나는 특성을 가지고 있다.  그래서 최근 1년에 일어난 오더 내역만 정리 한 것이다.

 

# Sentence 넣기     
  sentence <-   c("AC A2A6 welding machine PCB replacement and inspection test",
                  "AC welding machine PCB replacement and inspection",
                  "Arc off during AC welding Replace welding machine PCB",
                  "AC welding machine welding machine PCB replacement and line check",
                  "DC Feeder Welding Machine PCB Replacement",
                  "DC communication error check and reset",
                  "DC welding machine A2A6 MAIN welding machine PCB replacement",
                  "DC welding machine replacement",
                  "dc welding machine body replacement",
                  "DC communication cable installation",
                  "diode replacement",
                  "HOIST maintenance",
                  "deep tracking pc repair",
                  "Deep tracking device PC not booting",
                  "Welder replacement due to arc failure",
                  "Arc Off Welding Arc Off Welding",
                  "Repair with Weld Head Collision Breakage",
                  "Welder communication failure Arc off Reset",
                  "Welder communication failure error occurrence check, reset",
                  "Welder communication failure check, reset",
                  "Welder communication failure cable connector cleaning work",
                  "AC welding off cleaning work during welding",
                  "Arc off during welding",
                  "Arc off during welding communication cable installation",
                  "communication failure check and reset",
                  "Trolley upper/lower guide B/R replacement")
  


아래는 데이터 파싱 할때 사용하는 함수인데,  데이터 파싱 할때는 vector의 Array 요소별로 문자를 나누어 데이터 프레임을 쌓는다.  아래는 vector 1개 sentence의 문자를 나누는 코드이다. 

 #sentence 당 문자열 파싱 하고 데이터 프레임 만들기    
  pasing_fun <-function(text, t_count){

    # 홀수 인지 짝수 인지 구분  
      divide <-  length(text) %% 2
    
      if(divide == 1){
        k = length(text) -1 
      } else {
        k = length(text)
      }
      
      result <- c()
  
    # i 인지 확인       
      i = 1
      for(i in 1:k){
        
        tv <-text[i:(i+t_count)]
        
        pasing <- c()
        
        w= 1 
        for(w in 1:t_count){
         pasing <- paste(pasing,tv[w])
         pasing <-  gsub("and", "", pasing)
        }
       
       result <-c(result, pasing) 
      
      }
      
     result <- data.frame( result) %>% 
          filter(!str_detect(result,"NA"))
      
      return(result)
  }

각 sentence별로 문자 열이 나누어 졌으면,  나누어진 문자열을 가지고 sentence를 2개로 나눌 것인가  아니면 여러개를 나눌 것인가를 정해주어야 한다.

아래코드 예제는 아래의 상황과 같다. 

 "나는 고요한 아침의 나라 대한민국에 살고 있습니다."

result_fun(1)을 사용하면,  "나는",  "고요한 "...... 으로 데이터가 나누어지고,

result_fun(2)을 사용하면  "나는 고요한", 고요한 아침의"... 으로 데이터가 나누어지고,

result_fun(3)를 사용하면, "나는 고요한 아침의".  "고요한 아침의 나라"로 데이터가 나누어지는 것이다.

# sentence 갯수를 받아 데이터 정리 하기    
  result_fun <- function(x){
  
     result = data.frame(result= "") %>% 
              filter(is.na(result))
  
     for (i in 1:length(sentence)){
       text <- str_split(sentence[i], " ", simplify = TRUE )
       temp <- pasing_fun(text, x)
       result <- rbind(result, temp)   
         
     }
     return(result)
  } 
  위와 같이 sentence의 갯수를 2개를 선택 하거나, 3개를 선택 하거나,  그 이상을 선택하여 분석 하였을때,  설비의 문제점을 쉽게 볼수 있다. 


아래를 sentence 갯수별로 나누어 함수를 호출 한 Case 이다. 

 graph_fun <- function(x){  
    p <-  result_fun(x) %>% 
        group_by(result) %>% 
        count() %>% 
        arrange(desc(n)) %>% 
        filter(n > 2) %>% 
        ggplot(aes(result, n, fill=result))+
        geom_bar(stat='identity')+coord_flip() 

  return(p)
  }

  graph_fun(2)  
sentence 2개로  만든 문자열



sentence를 2개로 만든 문자열은 대부분 어느 부위에 문제가 있는지 어떤 현상이 나타났는지 알수 있다.  

  위의 그래프를 해석 하면,  용접기에 ,  통신에러 및  동작중 용접 아크 중단을 알수 있다.
 
 graph_fun(3)
sentence 2개를 문자열을 분석 하면 대부분 알수 있지만, sentence 3개를 하였을때,  구체적으로 어떤 문제가 있었는지 보여 준다. 
sentence 3개로  만든 문자열


  여기에서는 보다 구체적으로 용접기 통신에러가 주요 문제 었고,  통신에러 때문에 PCB를 교체 하였다는 이야기가 나오고,   용접 중 에러와 같이 문제사항이 나타난다. 

graph_fun(4) 
그리고 sentence를 4개를 하였을때는  매우 놀랍게도 조치 하였던 내용만 나타난다. 



 PCB가 단종되어 그것을 뜯어서 고쳐 수리 하여,  용접기를 재사용 하였으니,  가장 합리적인 결정은 용접기를 수리 하는 것보다 교체 하는 것으로 나오게 된다. 



댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...