ch 11 - Data Import & Label Encoding in R

Intro

  • 설문조사가 끝났으면 이제 정리를 해야 한다.
  • 일련의 과정은 보통 코딩이라 부른다.

(1) 주요 패키지

  • 이번 포스트부터 gt 패키지를 사용하려고 한다.
    • gt: ggplot2와 같이 Table를 문법으로 컨트롤 할 수 있도록 구현된 패키지이다.
    • kableExtra: HTML로 출력할 수 있도록 도와주는 패키지이다.

문제점

  • SmartPLS 프로그램을 쓴다 하더라도 기본적으로 모든 데이터의 entry는 수치형으로 일단 바뀌어 있어야 한다.
  • 우선 데이터를 불러와서 확인해보자.
library(tidyverse)
library(gt)
library(kableExtra)


# 데이터 불러오기
data <- read_csv("data/thesis_mater.csv")

data %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1EI_2EI_3EP_1EP_2EP_3ER_1ER_2ER_3SS_1SS_2SS_3SC_1SC_2SC_3SR_1SR_2SR_3F1F2F3NF1NF2NF3Firm_AgeFirm_SizeWE1WE2WE3genderfounder_employeeage_of_respondentEducation_LevelBusiness_Area
2343343241133332212233135 years aboveAbove 15 membersNo, I don't have experienceYesYesFemaleEmployee30-39Undergraduate SchoolOthers
552353444222222222222322Less than 2 yearsLess than 5 membersNo, I don't have experienceNoYesMaleEmployeeYounger than 30Undergraduate SchoolMedia and Entertainment
1221121212211221212111115 years aboveLess than 5 membersAs founder or employee, I have startup experiences more than 3 timesNoYesFemaleFounder of CompanyYounger than 30Undergraduate SchoolOthers
332121213213111233332322Less than 2 yearsLess than 5 membersNo, I don't have experienceYesYesMaleEmployeeYounger than 30Undergraduate SchoolOthers
5352544444545555554544553-4 yearsLess than 5 membersAs founder or employee, I have startup experiences more than 3 timesNoYesMaleFounder of Company30-39Undergraduate SchoolOthers
1331332314123312211231315 years above5-9 membersAs founder or employee, I have startup experience, one timeNoNoFemaleEmployeeYounger than 30Undergraduate SchoolOthers
  • 위 데이터에서 보면 알 수 있듯이, WE1 ~ Business_Area 까지의 데이터는 모두 문자로 되어 있다.
  • Python에서는 LabelEncoder라는 것이 있다.
  • R에서는 기본 문법인 factor만 있어도 가능하다.

Factor의 활용

  • 이제 본격적으로 코딩을 시작한다.
  • 데이터 전처리에서 쉬운 방법은 없다.

(1) 기본

  • 가상의 데이터를 만든 후 factor를 활용하자.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))
temp
##   x gender
## 1 1 Female
## 2 1   Male
## 3 2   Male
  • 이제 gender를 변환하자.
temp$gender <- as.numeric(factor(temp$gender))
temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • factor로 변환한 뒤, as.numeric으로 형 변환을 하면 쉽게 바꿀수는 있다.
  • 위와 같이 형변환을 하면 1이 무엇을 의미하는지, 2는 무엇을 의미하는지 알 수 없게 된다. (즉, 정보의 손실이 올 수 있다.)

(2) 응용

  • 이제 factor를 조금 더 활용해 본다.
  • 같은 가상의 데이터를 사용한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"))

temp$gender <- as.numeric(factor(temp$gender), 
                          levels = c("Female", "Male"), 
                          labels = c(1, 2))

temp
##   x gender
## 1 1      1
## 2 1      2
## 3 2      2
  • 결과는 똑같다. 그러나, 각 label에 대한 해석이 보다 명확해지기 때문에 추후 분석결과보고서를 작성할 때 보다 쉽게 작성할 수 있다.

(3) 적용

  • 이제 내 데이터에 적용해보자.
  • 적용해야 할 변수는 모두 Firm_Age ~ Business_Area 까지이다.
  • 여기에서 하나의 Rule을 만들어야 한다.
    • 각 범주마다 하나씩 맞추는 노가다는 지양해야 한다.
    • 따라서, 범주의 값은 모두 알파벳순으로 정렬한다.
    • 이를 프로그래밍으로 해결한다.
temp <- data.frame(x = c(1, 1, 2), 
                   gender = c("Female", "Male", "Male"),
                   grade = c("A", "B", "C"))

temp
##   x gender grade
## 1 1 Female     A
## 2 1   Male     B
## 3 2   Male     C
  • 데이터가 하나 더 생겼다. 다음과 같은 함수를 만든다.
factor2numeric <- function(x) {
  # input 변수가 문자형인지 확인하여 다음 코드를 실행한다. 
  # 만약 문자가 아니면 `else` 코드로 넘어간다. 
  if(is.character(x) == TRUE) { 
      # levels 함수를 사용하면 알파벳으로 자동 정렬해준다.
      char_levels <- levels(factor(x)) 
      
      # 변환되기 전 factor의 `level`를 확인한다.
      print("----변환 시작 전----")
      print(char_levels)   
      
      # factor형으로 변환했다. 
      x <- factor(x, 
                  levels = char_levels, 
                  labels = c(1:length(char_levels))) # 이 코드는 labels 숫자로 정의한다. 
     
       # 변환되기 전 factor의 `level`를 확인한다.
      print(levels(x)) 
      print("----변환 종료----")
  } else {
    # 에러 메시지를 출력한다
    print("This is not character!!")
  } 
  return(x)
}

# 전체 데이터에서 character인 데이터를 사용자 정의 함수를 적용하였다. 
data2 <- data %>% 
  mutate_if(is.character, factor2numeric)
## [1] "----변환 시작 전----"
## [1] "3-4 years"         "5 years above"     "Less than 2 years"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "10-14 members"       "5-9 members"         "Above 15 members"   
## [4] "Less than 5 members"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "As founder or employee,  I have startup experience, one time"        
## [2] "As founder or employee, I have startup experiences more than 3 times"
## [3] "As founder or employee, I have startup experiences, two times"       
## [4] "No, I don't have experience"                                         
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "No"  "Yes"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Female" "Male"  
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Employee"           "Founder of Company"
## [1] "1" "2"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "30-39"           "40-49"           "50 or above"     "Younger than 30"
## [1] "1" "2" "3" "4"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
## [1] "Graduate School"      "High School"          "Undergraduate School"
## [1] "1" "2" "3"
## [1] "----변환 종료----"
## [1] "----변환 시작 전----"
##  [1] "E-Commerce"                 "Education"                 
##  [3] "Energy"                     "Enterprise Services"       
##  [5] "Fintech"                    "Logistics"                 
##  [7] "Manufacturing"              "Media and Entertainment"   
##  [9] "Medical and Healthcare"     "Online to Offline Commerce"
## [11] "Others"                     "Real Estate and Household" 
## [13] "Transportation/Automotive"  "Travel"                    
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
## [1] "----변환 종료----"

(4) 중복치와 결측치 확인

  • 모든 것을 온라인으로 받다보니, 중복치와 결측치가 발생할 수 있다.
  • 따라서 해당 내용이 있는지 확인한다.
sum(duplicated(data2))
## [1] 5
  • 중복치가 5개 인것으로 확인이 된다.
  • 중복치를 제거하는 것은 간단하다.
data3 <- data2 %>% distinct()
  • 이번에는 결측치를 확인한다.
colSums(is.na(data3))
##              EI_1              EI_2              EI_3              EP_1 
##                 0                 0                 0                 0 
##              EP_2              EP_3              ER_1              ER_2 
##                 0                 0                 0                 0 
##              ER_3              SS_1              SS_2              SS_3 
##                 0                 0                 0                 0 
##              SC_1              SC_2              SC_3              SR_1 
##                 0                 0                 0                 0 
##              SR_2              SR_3                F1                F2 
##                 0                 0                 0                 0 
##                F3               NF1               NF2               NF3 
##                 0                 0                 0                 0 
##          Firm_Age         Firm_Size               WE1               WE2 
##                 0                 0                 0                 0 
##               WE3            gender  founder_employee age_of_respondent 
##                 0                 0                 0                 0 
##   Education_Level     Business_Area 
##                 0                 0
  • column마다 결측치를 확인한 결과 모두 0인 것을 확인할 수 있다.

(5) 결과 확인

  • 이제 변환된 결과를 확인한다.
# 결과값을 확인한다. 
data3 %>% 
  head() %>% 
  kable() %>% 
  kable_styling("striped") %>% 
  scroll_box(width = "100%")
EI_1EI_2EI_3EP_1EP_2EP_3ER_1ER_2ER_3SS_1SS_2SS_3SC_1SC_2SC_3SR_1SR_2SR_3F1F2F3NF1NF2NF3Firm_AgeFirm_SizeWE1WE2WE3genderfounder_employeeage_of_respondentEducation_LevelBusiness_Area
23433432411333322122331323422111311
5523534442222222222223223441221438
12211212122112212121111124212124311
33212121321311123333232234422214311
53525444445455555545445514212221311
13313323141233122112313122111114311

파일 내보내기

  • 이제 SmartPLS에서 사용할 수 있도록 csv 파일 형태로 내보낸다.
write_csv(data3, "~/Desktop/thesis_master2.csv")

소결론

  • 데이터 전처리는 중요하다. 그러나, 시간이 조금 걸린다.
  • 설문조사에서 특히 문제가 되는 부분은 문자열 데이터를 수치형 데이터로 변환해주는 문제가 있다.
    • 이를 프로그래밍으로 해결하면 보다 쉽게 접근할 수 있다.
  • 이제 본격적으로 분석을 해보자.

ch 10 - 연구모델 개발과 가설 설정

I. 연구모델 개발과 가설 설정

  • 교재에서는 스마트폰 프로젝트의 연구모델 데이터를 기반으로 작성하였지만, 이번 포스트 이후 부터는 필자의 학위논문 데이터를 기반으로 책 내용과 병행하려고 한다.

(1) 연구모델 개요

  • 학위논문 주제: The Mediating Effect of Entrepreneurial Performance on the Relationship between Entrepre-neurial Orientation and Social Capital: The cases from the Philippines
  • 주요요인은 기업가적지향성, 사회적자본이며, 종속변수는 기업의 성과로 구성되어 있다. png
  • 설문지 공개관련:
    • 설문지 Sample이 필요하신 분들은 2021년 2월 이후에 요청하기를 바란다. (졸업이후)
    • 교재는 스마트폰 프로젝트의 연구 모델이라는 주제로 Sample 설문지 문항에 대한 내용이 있다. (p 127)

(2) 연구모델 개발

  • 연구모델은 아래와 같다. png

데이콘 대회 참여 - 제주 신용카드 데이터 경진대회 피벗테이블 작성

강의 홍보

공지

  • 본 포스트는 필자의 수업을 듣는 사람들을 위해 작성하였습니다.

I. 구글 드라이브와 Colab과 연동

  • 구글 드라이브와 Colab과 연동하면 보다 쉽게 데이터에 접근할 수 있다.
  • 구글 인증만 하면 된다.
# Google Drive와 마운트
from google.colab import drive
ROOT = '/content/drive'
drive.mount(ROOT)

(1) 데이터 다운로드

(2) 구글 드라이브에 다운로드 받은 폴더를 올린다.

  • 이 때, 경로통일을 위해 Colab Notebooks/python_elice/dacon/data로 경로 지정을 한다.
# Project Folder 연결
from os.path import join  

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/python_elice/dacon/data'
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH)
print(PROJECT_PATH)
/content/drive/My Drive/Colab Notebooks/python_elice/dacon/data
  • 아래 코드를 반드시 실행시켜야 해당 경로로 이동된다.
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/python_elice/dacon/data
  • 실제 업로드된 데이터가 있는지 확인한다.
!ls
201901-202003.csv  submission.csv
  • 만약 에러가 발생이 되면 경로가 잘못 지정된 것이니, 폴더 경로를 재확인한다.
  • 경로에러가 발생할 시, 숙련자는 수정이 바로 가능하지만, 비숙련자는 가급적 [런타임 초기화]를 클릭한 후, 처음부터 다시 실행시키는 것을 추천한다.

(3) 데이터 불러오기

  • 지난주간 과제로 내주었던 판다스 데이터를 불러오도록 한다.
  • 시간이 다소 소요될 수 있다.
import pandas as pd
train = pd.read_csv("201901-202003.csv")
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 24697792 entries, 0 to 24697791
Data columns (total 12 columns):
 #   Column        Dtype 
---  ------        ----- 
 0   REG_YYMM      int64 
 1   CARD_SIDO_NM  object
 2   CARD_CCG_NM   object
 3   STD_CLSS_NM   object
 4   HOM_SIDO_NM   object
 5   HOM_CCG_NM    object
 6   AGE           object
 7   SEX_CTGO_CD   int64 
 8   FLC           int64 
 9   CSTMR_CNT     int64 
 10  AMT           int64 
 11  CNT           int64 
dtypes: int64(6), object(6)
memory usage: 2.2+ GB

(4) 데이터 샘플링

  • 전체 데이터를 시각화 등 사용하면 시각화 시, 다소 느리게 출력될 수 있으니, 연습 차원에서는 가급적 샘플링 기법을 적용해서 데이터를 재정한다.
  • 1000개의 데이터만 객체로 저장한다.
sample_train = train.sample(n=100000, random_state=1)
  • 원 데이터와 샘플 데이터의 행의 크기를 비교한다.
len(train)
24697792
len(sample_train)
100000
  • 물론, 위 샘플을 조금 늘려도 좋긴하지만, 가급적 시각화 코드가 모두 작성이 된 이후에 해보는 것을 추천한다.

II. 과제 - 피벗테이블

  • 판다스 패키지를 활용한다.
  • AMT는 매출 데이터이다.
  • 과제 1. 시도별 매출 데이터의 피벗테이블을 작성한다.
  • 과제 2. 업종별 매출 데이터의 피벗테이블을 작성한다.
  • 마지막 과제 3. 시도별-업종별 매출 데이터의 피벗테이블을 작성한다.
  • (옵션), 날짜별로 매출 데이터의 피벗테이블을 작성한다.

(공통) 판다스 피벗 테이블

  • 가장 좋은 교재는 메뉴얼이다.
  • 주요 파라미터는 다음과 같다.
    • data: DataFrame
    • values: Column to aggregate
    • index: column, array or list
    • aggfunc: function, list of functions, dict, default numpy.mean

(1) 시도별 매출 데이터

  • 시도별 매출 데이터의 피벗테이블을 작성한다.
pd.pivot_table(sample_train,                        # 데이터
               index='CARD_SIDO_NM',                # 기준변수
               values = 'AMT',                      # 타겟변수
               aggfunc="sum")                       # 산술식
  • 결과를 확인한다.

(2) 업종별 매출 데이터의 피벗테이블

  • 이번에는 업종별 피벗테이블을 작성해본다.
pd.pivot_table(sample_train,                        # 데이터
               index='STD_CLSS_NM',                 # 기준변수
               values = 'AMT',                      # 타겟변수
               aggfunc="sum")                       # 산술식
  • 결과를 확인한다.

(3) 시도별-업종별 매출 데이터의 피벗테이블

  • 이 때에는 피벗테이블에서 상위 5개의 데이터만 출력하도록 한다.
  • 표시될 행이 많아야 하기 때문에 아래와 같이 setting을 한다.
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.max_colwidth', -1)
pivoted = pd.pivot_table(sample_train,                                   
                         index=['CARD_SIDO_NM', 'STD_CLSS_NM'],          
                         values = 'AMT',                               
                         aggfunc="sum")
pivoted\
.sort_values(['CARD_SIDO_NM', 'AMT'], ascending=[True, False])\
.groupby('CARD_SIDO_NM').head(5)\
.reset_index()\
.set_index(['CARD_SIDO_NM','STD_CLSS_NM'])

(4) 옵션-날짜별 매출 데이터의 피벗테이블

  • 이번에는 날짜별 매출 데이터의 피벗테이블 작성
pd.pivot_table(sample_train,                        # 데이터
               index='REG_YYMM',                    # 기준변수
               values = 'AMT',                      # 타겟변수
               aggfunc="sum")                       # 산술식

III. 과제 - 시각화

(1) 월별 막대그래프

  • 간단한 예제로 옵션-날짜별 매출 데이터의 피벗테이블을 작성한다.
pd.pivot_table(sample_train, index='REG_YYMM', values = 'AMT', aggfunc="sum").plot(kind='bar')                   

png

ch 09 - PLS-SEM 통계 분석기법(2)

I. PLS-SEM 통계 기초

  • 교재를 참고하여 통계 기초에 대한 간단한 설명을 서술한다.
    • 이는 다른 통계 책에도 있는 내용이기는 하다.
    • 지난 시간에, PLS-SEM의 분포, 유의 수준과 신뢰수준의 관계, 신뢰도와 타당도, 탐색적 요인분석과 확인적 요인분석, 회귀분석에 대해 설명함

(1) 추정과 신뢰구간

  • 추정(estimation)이란 모집단에 대한 어떠한 정보도 없는 상태에서 모집단을 대표할 수 있는 표본 추출하여 표본의 통계량을 구한 다음 이를 이용해서 모집단의 모수 예측
    • 점추정(Point Estimation): 추정하고자 하는 모수를 하나의 수치로 추정
    • 신뢰구간 추정(Confidence Interval Estimation): 추정하고자 하는 모수가 존재하리라고 예상되는 신뢰구간을 정하여 추정하는 방법
      • 신뢰구간에서는 보통 t분포 이용.
  • 신뢰구간의 결정방법은 다음과 같음
    • 첫째, 추출된 표본평균($\bar{x}$)를 구한다.
    • 둘째, 표본평균($\bar{x}$)의 표준편차인 표준오차(standard error)를 산출한다.
    • 셋째, 신뢰수준($1-\alpha$)에 따른 $t$값을 구한다.
    • 마지막으로, 표본평균($\bar{x}$)을 중심으로 표준오차와 $t$값을 곱한 값만큼 좌우($\pm$)로 떨어진 값$\bar{x}\pm t\left (\alpha/2, n-1\right)S/\sqrt{n}$으로 이루어진 구간이 신뢰구간이 됨

(2) SmartPLS에서 PLS 알고리즘

  • PLS Algorithm을 실행 시, 잠재변수 점수는 물론 이를 이용해 측정모델의 외부가중치(outer weights), 외부적재치(outer loadings)와 구조모델의 경로계수(path coefficients), 내생잠재변수의 $R^2$ 등의 추정이 가능함.

(3) 부트스트래핑

  • PLS-SEM은 데이터가 정규분포를 이룬다고 가정하지 않음
  • 무소적 검증을 통해 유의성을 검증하지 않음
  • 대신, 부트스트래핑을 통해 계수의 유의성 검증 진행
    • 비모수적 접근을 통해서 각 계수들에 대한 검증통계량인 t값을 추정.
  • 절차는 원데이터(raw data)로부터 많은 수의 부표본(subsamples)인 부트스트랩 표본을 복원추출하여 반복적인 회귀분석과정을 통해 t값 산출
    • 보통 부트스트랩 표본은 5,000개 필요
  • 예를 들면, 산출된 t값을 이용하여 계수의 유의성을 판단할 수 있음.
    • 5% 유의수준(양측검증)에서 특정 경로계수에 대해 산출된 t값이 $\pm1.96$보다 크면 통계적으로 유의한 차이를 나타낸다고 해석 가능

(4) 외부가중치, 외부적재치 및 경로계수

  • 경로계수(path coefficient)는 $P_{12}, P_{23}$와 같이 표시되며, 이는 표준화된 회귀계수
  • 외부가중치(outer weight)는 잠재변수와 형성적 측정변수 간 표준화 회귀계수 의미
    • ($W_{11},W_{12}$)와 같이 표시됨
  • 외부적재치(outer loading)는 잠재변수와 반영적 측정변수 간 표준화 회귀계수 의미
    • ($L_{35},W_{36}$)와 같이 표시됨
  • 모든 표준화 계수는 -1+1사이의 값을 가짐

(5) 블라인드 폴딩과 예측적 적합성

  • 예측적 적합성(predictive relevance)에 대한 기준으로 $R^2$과 함께 Stone-Geisser의 $Q^2$값을 확인할 필요가 있다.
    • 이 값은 누락거리 D(omission distance)에 의한 블라인드폴딩(Blindfolding) 절차를 통해 얻을 수 있다.
    • 0보다 큰 $Q^2$은 외생잠재변수가 내생잠재변수에 대해 예측적 적합성을 가지고 있음 의미
    • 반대로 0보다 작다면, 예측적 적합성이 부족하다고 봄

(6) 효과크기($f^2$)

  • 효과크기 $f^2$은 외생잠재변수의 내생잠재변수에 대한 $R^2$에 기여하는 정도를 평가하는 척도
  • 효과크기 $f^2$에 대한 평가는 다음과 같다.
    • 0.02: 작은 효과
    • 0.15: 중간 효과
    • 0.35: 큰 효과
  • 효과크기에 대한 수치는 다음과 같다.

$f^{2}=\frac{R_{선택된\ 외생잠재변수\ 포함}^{2}-R_{선택된\ 외생잠재변수\ 제거}^{2}}{1-R_{선택된\ 외생잠재변수\ 포함}^{2}}$

ch 09 - PLS-SEM 통계 분석기법(1)

I. PLS-SEM 통계 기초

  • 교재를 참고하여 통계 기초에 대한 간단한 설명을 서술한다.
    • 이는 다른 통계 책에도 있는 내용이기는 하다.

(1) PLS-SEM의 분포

  • PLS-SEM은 검증 통계량으로 t분포t값을 활용함.
    • t분포는 평균이 0, 표준편차가 1인 종모양의 좌우대칭인 분포
    • 유의수준 확인 지표는 p값을 활용함. (사회과학 분야에서는 유의수준 5% 이내)

(2) 유의수준과 신뢰수준의 관계

  • 유의수준이 $\alpha$ 이면 신뢰수준은 $1−\alpha$ 가 됨.
    • 즉, 신뢰수준은 허용오차수준인 유의수준에 따라 결정됨.

(3) 신뢰도(Reliability)와 타당도(Validity)

  • PLS-SEM은 측정모델과 구조모델을 동시에 분석함.
    • 반영적 측정모델과 형성적 측정모델에 대한 신뢰도와 타당도검증이 이루어져야 함.
    • 측정 모델에 대한 검증 결과 신뢰도와 타당도가 입증되지 않으면 구조모델의 결과도 신뢰할 수 없음

딥러닝 소개 - Object Detection

강의 홍보

공지

  • 본 자료는 강의 수업의 보충 자료로 사용되었습니다.
  • 자세한 내용은 Reference를 확인하시기를 바랍니다.

Setup File

%%shell
# clone Mask_RCNN repo and install packages
git clone https://github.com/matterport/Mask_RCNN
cd Mask_RCNN
python setup.py install 
Cloning into 'Mask_RCNN'...
remote: Enumerating objects: 956, done.
remote: Total 956 (delta 0), reused 0 (delta 0), pack-reused 956
Receiving objects: 100% (956/956), 116.76 MiB | 34.72 MiB/s, done.
Resolving deltas: 100% (566/566), done.
WARNING:root:Fail load requirements file, so using default ones.
running install
running bdist_egg
running egg_info
creating mask_rcnn.egg-info
writing mask_rcnn.egg-info/PKG-INFO
writing dependency_links to mask_rcnn.egg-info/dependency_links.txt
writing top-level names to mask_rcnn.egg-info/top_level.txt
writing manifest file 'mask_rcnn.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'mask_rcnn.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
creating build
creating build/lib
creating build/lib/mrcnn
copying mrcnn/model.py -> build/lib/mrcnn
copying mrcnn/config.py -> build/lib/mrcnn
copying mrcnn/utils.py -> build/lib/mrcnn
copying mrcnn/__init__.py -> build/lib/mrcnn
copying mrcnn/visualize.py -> build/lib/mrcnn
copying mrcnn/parallel_model.py -> build/lib/mrcnn
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/model.py -> build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/config.py -> build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/utils.py -> build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/__init__.py -> build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/visualize.py -> build/bdist.linux-x86_64/egg/mrcnn
copying build/lib/mrcnn/parallel_model.py -> build/bdist.linux-x86_64/egg/mrcnn
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/model.py to model.cpython-36.pyc
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/config.py to config.cpython-36.pyc
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/utils.py to utils.cpython-36.pyc
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/__init__.py to __init__.cpython-36.pyc
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/visualize.py to visualize.cpython-36.pyc
byte-compiling build/bdist.linux-x86_64/egg/mrcnn/parallel_model.py to parallel_model.cpython-36.pyc
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying mask_rcnn.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying mask_rcnn.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying mask_rcnn.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying mask_rcnn.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/mask_rcnn-2.1-py3.6.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing mask_rcnn-2.1-py3.6.egg
Copying mask_rcnn-2.1-py3.6.egg to /usr/local/lib/python3.6/dist-packages
Adding mask-rcnn 2.1 to easy-install.pth file

Installed /usr/local/lib/python3.6/dist-packages/mask_rcnn-2.1-py3.6.egg
Processing dependencies for mask-rcnn==2.1
Finished processing dependencies for mask-rcnn==2.1
  • tensorflow_version 2.x 버전 호환이 어렵기 때문에 down grade를 지원한다.
'''
TensorFlow 2 gives: AttributeError: module 'tensorflow' has no attribute 'placeholder'
because MaskRCNN is using TF 1
So downgrade to 1 (default version in Colab is 2?)
'''
%tensorflow_version 1.x
TensorFlow 1.x selected.

(1) 패키지 불러오기

  • 기본 패키지를 불러온다.
import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt

(2) 경로설정

# 프로젝트 경로 설정
ROOT_DIR = os.path.abspath("./Mask_RCNN/")

# Mask RCNN 불러온다
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize

# COCO config 경로 불러온다. 
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/"))
import coco

%matplotlib inline 

# 훈련 모형 및 log를 저장한다. 
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# 가중치 파일에 대한 경로를 지정한다. 
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")

# COCO trained weights 가중치를 불러온다. 
if not os.path.exists(COCO_MODEL_PATH):
    utils.download_trained_weights(COCO_MODEL_PATH)

# image 경로 설정
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
Using TensorFlow backend.


Downloading pretrained model to /content/Mask_RCNN/mask_rcnn_coco.h5 ...
... done downloading pretrained model!

(2) Config

  • MS-COCO 데이터셋을 사용한다.
  • 이 때, coco.py 클래스를 설정한다.
class InferenceConfig(coco.CocoConfig):
    # Set batch size to 1 since we'll be running inference on
    # one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()
Configurations:
BACKBONE                       resnet101
BACKBONE_STRIDES               [4, 8, 16, 32, 64]
BATCH_SIZE                     1
BBOX_STD_DEV                   [0.1 0.1 0.2 0.2]
COMPUTE_BACKBONE_SHAPE         None
DETECTION_MAX_INSTANCES        100
DETECTION_MIN_CONFIDENCE       0.7
DETECTION_NMS_THRESHOLD        0.3
FPN_CLASSIF_FC_LAYERS_SIZE     1024
GPU_COUNT                      1
GRADIENT_CLIP_NORM             5.0
IMAGES_PER_GPU                 1
IMAGE_CHANNEL_COUNT            3
IMAGE_MAX_DIM                  1024
IMAGE_META_SIZE                93
IMAGE_MIN_DIM                  800
IMAGE_MIN_SCALE                0
IMAGE_RESIZE_MODE              square
IMAGE_SHAPE                    [1024 1024    3]
LEARNING_MOMENTUM              0.9
LEARNING_RATE                  0.001
LOSS_WEIGHTS                   {'rpn_class_loss': 1.0, 'rpn_bbox_loss': 1.0, 'mrcnn_class_loss': 1.0, 'mrcnn_bbox_loss': 1.0, 'mrcnn_mask_loss': 1.0}
MASK_POOL_SIZE                 14
MASK_SHAPE                     [28, 28]
MAX_GT_INSTANCES               100
MEAN_PIXEL                     [123.7 116.8 103.9]
MINI_MASK_SHAPE                (56, 56)
NAME                           coco
NUM_CLASSES                    81
POOL_SIZE                      7
POST_NMS_ROIS_INFERENCE        1000
POST_NMS_ROIS_TRAINING         2000
PRE_NMS_LIMIT                  6000
ROI_POSITIVE_RATIO             0.33
RPN_ANCHOR_RATIOS              [0.5, 1, 2]
RPN_ANCHOR_SCALES              (32, 64, 128, 256, 512)
RPN_ANCHOR_STRIDE              1
RPN_BBOX_STD_DEV               [0.1 0.1 0.2 0.2]
RPN_NMS_THRESHOLD              0.7
RPN_TRAIN_ANCHORS_PER_IMAGE    256
STEPS_PER_EPOCH                1000
TOP_DOWN_PYRAMID_SIZE          256
TRAIN_BN                       False
TRAIN_ROIS_PER_IMAGE           200
USE_MINI_MASK                  True
USE_RPN_ROIS                   True
VALIDATION_STEPS               50
WEIGHT_DECAY                   0.0001

객체 검출 과정 및 코드 구현

  • MaskRCNN 모형을 생성한다.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)
model.load_weights(COCO_MODEL_PATH, by_name=True)
WARNING:tensorflow:From /tensorflow-1.15.2/python3.6/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.

WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:341: The name tf.log is deprecated. Please use tf.math.log instead.

WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:399: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:423: calling crop_and_resize_v1 (from tensorflow.python.ops.image_ops_impl) with box_ind is deprecated and will be removed in a future version.
Instructions for updating:
box_ind is deprecated, use box_indices instead
WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:720: The name tf.sets.set_intersection is deprecated. Please use tf.sets.intersection instead.

WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:722: The name tf.sparse_tensor_to_dense is deprecated. Please use tf.sparse.to_dense instead.

WARNING:tensorflow:From /content/Mask_RCNN/mrcnn/model.py:772: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.cast` instead.
  • 각각의 클래스 이름을 지정한다.
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
               'bus', 'train', 'truck', 'boat', 'traffic light',
               'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
               'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
               'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
               'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
               'kite', 'baseball bat', 'baseball glove', 'skateboard',
               'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
               'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
               'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
               'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
               'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
               'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
               'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
               'teddy bear', 'hair drier', 'toothbrush']

(1) 객체 검출 지정

  • 객체 검출을 지정한다.
# 이미지 폴더에서 랜덤으로 객체 검출을 진행한다. 
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

# 모형을 실행한 후 결과값을 저장한다. 
results = model.detect([image], verbose=1)

# 결과를 시각화 한다. 
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.



Processing 1 images
image                    shape: (480, 640, 3)         min:    0.00000  max:  255.00000  uint8
molded_images            shape: (1, 1024, 1024, 3)    min: -123.70000  max:  151.10000  float64
image_metas              shape: (1, 93)               min:    0.00000  max: 1024.00000  float64
anchors                  shape: (1, 261888, 4)        min:   -0.35390  max:    1.29134  float32

png

머신러닝 알고리즘 - 분류 Tutorial

개요

  • Kaggle 대회인 `Titanic’대회를 통해 분류 모형을 만들어본다.
  • 본 강의는 수업 자료의 일부로 작성되었다.

I. 사전 준비작업

  • Kaggle API 설치 및 연동해서 GCP에 데이터를 적재하는 것까지 진행한다.

(1) Kaggle API 설치

  • 구글 코랩에서 API를 불러오려면 다음 소스코드를 실행한다.
!pip install kaggle
Requirement already satisfied: kaggle in /usr/local/lib/python3.6/dist-packages (1.5.6)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.23.0)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.24.3)
Requirement already satisfied: python-slugify in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.0.1)
Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from kaggle) (4.41.1)
Requirement already satisfied: certifi in /usr/local/lib/python3.6/dist-packages (from kaggle) (2020.6.20)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from kaggle) (2.8.1)
Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from kaggle) (1.15.0)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (3.0.4)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle) (2.10)
Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.6/dist-packages (from python-slugify->kaggle) (1.3)

(2) Kaggle Token 다운로드

  • Kaggle에서 API Token을 다운로드 받는다.
  • [Kaggle]-[My Account]-[API]-[Create New API Token]을 누르면 kaggle.json 파일이 다운로드 된다.
  • 이 파일을 바탕화면에 옮긴 뒤, 아래 코드를 실행 시킨다.
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
  print('uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))
  
# kaggle.json을 아래 폴더로 옮긴 뒤, file을 사용할 수 있도록 권한을 부여한다. 
!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json

Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.

CNN with Computer Vision

강의 홍보

공지

  • 본 Tutorial은 교재 핸즈온 머신러닝 2판를 활용하여 본 강사로부터 국비교육 강의를 듣는 사람들에게 자료 제공을 목적으로 제작하였습니다..

  • 강사의 주관적인 판단으로 압축해서 자료를 정리하였기 때문에, 자세하게 공부를 하고 싶은 분은 반드시 교재를 구매하실 것을 권해드립니다.

데이콘 대회 참여 - 제주 신용카드 데이터 경진대회 Colab with Drive

공지

  • 본 포스트는 필자의 수업을 듣는 사람들을 위해 작성하였습니다.

I. 구글 드라이브와 Colab과 연동

  • 구글 드라이브와 Colab과 연동하면 보다 쉽게 데이터에 접근할 수 있다.
  • 구글 인증만 하면 된다.
# Google Drive와 마운트
from google.colab import drive
ROOT = '/content/drive'
drive.mount(ROOT)
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly

Enter your authorization code:
··········
Mounted at /content/drive

(1) 데이터 다운로드

(2) 구글 드라이브에 다운로드 받은 폴더를 올린다.

  • 이 때, 경로통일을 위해 Colab Notebooks/python_elice/dacon/data로 경로 지정을 한다.
# Project Folder 연결
from os.path import join  

MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/python_elice/dacon/data'
PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH)
print(PROJECT_PATH)
/content/drive/My Drive/Colab Notebooks/python_elice/dacon/data
  • 아래 코드를 반드시 실행시켜야 해당 경로로 이동된다.
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/python_elice/dacon/data
  • 실제 업로드된 데이터가 있는지 확인한다.
!ls
201901-202003.csv  submission.csv
  • 만약 에러가 발생이 되면 경로가 잘못 지정된 것이니, 폴더 경로를 재확인한다.
  • 경로에러가 발생할 시, 숙련자는 수정이 바로 가능하지만, 비숙련자는 가급적 [런타임 초기화]를 클릭한 후, 처음부터 다시 실행시키는 것을 추천한다.

(3) 데이터 불러오기

  • 지난주간 과제로 내주었던 판다스 데이터를 불러오도록 한다.
  • 시간이 다소 소요될 수 있다.
import pandas as pd
train = pd.read_csv("201901-202003.csv")
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 24697792 entries, 0 to 24697791
Data columns (total 12 columns):
 #   Column        Dtype 
---  ------        ----- 
 0   REG_YYMM      int64 
 1   CARD_SIDO_NM  object
 2   CARD_CCG_NM   object
 3   STD_CLSS_NM   object
 4   HOM_SIDO_NM   object
 5   HOM_CCG_NM    object
 6   AGE           object
 7   SEX_CTGO_CD   int64 
 8   FLC           int64 
 9   CSTMR_CNT     int64 
 10  AMT           int64 
 11  CNT           int64 
dtypes: int64(6), object(6)
memory usage: 2.2+ GB

(4) 데이터 샘플링

  • 전체 데이터를 시각화 등 사용하면 시각화 시, 다소 느리게 출력될 수 있으니, 연습 차원에서는 가급적 샘플링 기법을 적용해서 데이터를 재정한다.
  • 1000개의 데이터만 객체로 저장한다.
sample_train = train.sample(n=1000, random_state=1)
  • 원 데이터와 샘플 데이터의 행의 크기를 비교한다.
len(train)
24697792
len(sample_train)
1000
  • 물론, 위 샘플을 조금 늘려도 좋긴하지만, 가급적 시각화 코드가 모두 작성이 된 이후에 해보는 것을 추천한다.

II. 과제 - 피벗테이블

  • 판다스 패키지를 활용한다.
  • AMT는 매출 데이터이다.
  • 과제 1. 시도별 매출 데이터의 피벗테이블을 작성한다.
  • 과제 2. 업종별 매출 데이터의 피벗테이블을 작성한다.
  • 마지막 과제 3. 시도별-업종별 매출 데이터의 피벗테이블을 작성한다.
  • (옵션), 날짜별로 매출 데이터의 피벗테이블을 작성한다.

III. 과제 - 시각화

IV. 분석 Report 작성

딥러닝 소개 - 텐서플로 기본

강의 홍보

공지

  • 본 Tutorial은 교재 핸즈온 머신러닝 2판를 활용하여 본 강사로부터 국비교육 강의를 듣는 사람들에게 자료 제공을 목적으로 제작하였습니다.

  • 강사의 주관적인 판단으로 압축해서 자료를 정리하였기 때문에, 자세하게 공부를 하고 싶은 분은 반드시 교재를 구매하실 것을 권해드립니다.