TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''


아래와 같이 numpy 배열의 데이터타입이 object 인 경우. numpy 내에 object로 스트링으로 숫자나 글자들이 들어가있을 수도 있다. 추출한 행,열의 dtype을 확인하여라.


np
.isnan(np.array([np.nan, 0], dtype=object)) TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''


반응형

Built in Type in Python

- NoneType: None . 실수형도아니고 정수형도 아니고,..

- Int : 컴퓨터 메모리에서는 2진수로 표현되고있는데, 10진수를 2진수로 표현하고있음. -inf ~ int로 표현할 수 없다.

- Float: 실수조차도 메모리에서는 2진수로 표현하기하는데, 0과 1사이의 무수히 많은 수가 있는데, 이를 표현하긴 불가능하다. 즉, 표현할수 있는 실수가 정해져있다. 유효숫자가 16자리가 이상이면 정확도가 떨어진다.

- Complex: 복소수를 표현

- Bool: True, False


조금 복잡한 구조: str, list (아직 만들지 않은 타입도 저장할 수 있다), tuple, dict, set <- Data structure: 한번에 여러개를 저장할 수 있게한다. 


Algorithm


입력을 받아 출력으로 변환하는 계산 과정.

Correct: 모든 입력에 대해 항상 올바른 출력을 내토 끝남. 어떤숫자든.

Solve: 타당한 알고리즘은 문자를 푼다.


Theta, Big-O, Omega Noation


Theta noat : f(n)으로 표현한 수식으로 표햔한 것같으로... g(n)으로. 정확하게 알고있는 것을 세타임. 양측 바운더리를 알고 있을 때 표기

이미 대표적으로 알고있는 함수들 g(n)이라고 할 떄, log n 

내가 만든 알고리즘은 f(n) = theta(g(n))

Big-O: g(n)에 대표적인 함수를 알고있을 떄, 상한을 알고있을 때. 최악의 경우의 표기법

Omega: g(n)에 대표적인 함수를 알고있을 떄, 상한을 알고있을 때


Approach


Incremental approach: 

Divide and conquer Approach (분할/정복/결합): 예, 왼쪽 반과 오른쪽과 따로따로 나눠서 생각해보자, 또 왼쪽반을 1/2, 1/2으로 나눠보자. 2개로 나눴을 때는 해결하기가 쉽다, 이를 정복(Conquer)한다고 한다. 예) Mergeg sort



Doubly Linked list



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Doubly Linked list
def delete(self, data):
    here = self.search(data) # 어디 있는지 찾아야함. bool으로 받음.
    if here:
        if here.prev != None: # 맨앞에 노드가 잇으면
            here.prev.next = here.next  # 나보다 전노드가 잇으면교체
        else:
            self.head = here.next
        if here.next != None: # Tail node
            here.next.prev = here.prev 
        else# tail인경우
            here.next
            
    
    
cs



Ciruclar lists 


Stack (LIFO:last in First Out ) vs Queue (FIFO)


stack은 파이썬의 list 을 쓰면된다. 굳이 구현할 필요 없다. 

원소를 넣는 것은 push한다고하고, 원소를 뺼떄는 pop하면된다.

스텍예제)

infix notation: 수식은 operand, opertor가 필요한데, 파이써든 C언어든 오퍼랜드 사이에 오퍼레이터를 넣어서 작성한다. 이를 infix natation이라 한다. 

그러나, 예를 들어서 CPU을 동작시키려면 postfix-expression줘야한다. 이렇게 만들면 괄호가 필요가 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# postfix expression 
 
def eval_post(e);
    'e: string. operand : 1자리수, operator:4칙연산'
    stack = []
    for k in e:
        if k not in ('+''-''*''/'):
            stack.append(int(k))
        else:
            op2 = stack.pop()
            op1 = stack.pop()
            if k == '+':
                stack.append(op1 + op2)
    return stack.pop()
    
cs


Queue:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Queue
 
class ListQueue:
    def __init__(self):
        self.size = 0
        self.items = []
 
    def enqueue(self, data):
        self.items.insert(0, data)
        self.size += 1
    
    def dequeue(self, data):
        data = self.items.pop()
        self.size -= 1
        return 
 
    def __str__(self):
        return str(self.items)
 
 
cs



Tree


Hierachical form of data strucutres (<->sequential form)

- Parent-child relationship between the items

- Root: the ancestor of all other nodes in the tree. (최상위 조상)

- Application: Parsing expression, Sorting, Searches, Document(XML, HTML)


Parent Node: 부모 노드

Root node:최상위 노드

Subtree: tree내 그 하위 트리,

Degree: children node의 수

Leaf Node: children이 없는 노드

Edge: 노드-노드의 연결선

Sibling: 부모가 같은 노드. 형제노드

Level: root에서 몇개 내려왔는가? (e.g root level = 0임)

Height of tree: 트리의 길이. 가장 긴 노드의 (e.g. A-B-F-L : height 4이다)

Depth: 루트로부터 몇개내려왔는지?


Binary: 각 노드의 children이 최대 2개이다. children이 없을수도있고(leaf), 하나 있을수도있고 2개있을 수도 있다.


Quick-sort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def partition(A, first, last):
'마지막 원소보다 큰애들은 뒤로 작은애들은 앞으로 보내는 함수'
    x = A[last]
    i = first - 1
    for j in range(first, last): # last 전까지만 봄. last 은 이미 어사인함
         if A[j] <= x:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i+1] ,A[last] = A[last], A[i+1]
    return i+1
 
 
def quicksort(A, first, last):
    'first, last : int. index number'
 
    if last - first > 0
        p = partiion(A, first, last)
        quicksort(A, first, p-1)
        quicksort(A, p+1, last)
 
 
cs



반응형


 산업/주제 분류

 질문

 비고

 예상응답
 산업공통

Support / Confidence / Lift 을 설명하여라

 여름용모델... 겨울용모델로 따로 만들수도;; 
  장바구니 알고리즘 단점에 대한 해결법을 제시하여라. 모든 상품에 대해서 추천이 나오지 않을 수 있다. 어떻게 할 것인가?    1. 자주사는 상품만 

2. Rule이 안나오는 상품에 대해서는 어떤 p(A)->P(A) 해당 카테고리 내 베스트 상품을 넣기도 함.

 

딥러닝에서 부스팅 방법을 활용하지 않는 이유가 무엇이라고 생각하나? 

  
 

당신은 왜 데이터 사이언티스트인가요? 

  SKT 전무가 물어봄

3가지를 잘해야하는데...
데이터 사이언티스트라고 얘기하기보단 소신을 갖고 얘기하는 편이.. 

  다른 경쟁자에 비해서, 어떤 우월점을 가지고 있죠? 압박이 아니라..  
 

 최근에 딥러닝은 ROI가 안좋아

  
  당신을 왜 뽑아야하나요?  
 

 데이터 엔지니어

 

1. 대용량 인프라구축

2. 로그 플로우 디자인

3. 실제 서비스 인프라의 베이스라인을 잡음 

  머신러닝 엔지니어 

빅데이터 인프라 활용

현실 서비스에 유용한 feature를 적용 및 서비스 개선

연구의 현실성/타당성을 검증한 뒤 실제적용 

  선행연구 엔지니어

 계속 갈 수는 없을듯? 예) 네이버렙스->분사. 카카오AI도 마찬가지.

논문이나 선행 획득해야하는 기술을 follow up

가장 관심이 높은 분야

모두 살아남기 어렵다 

 CRM

모든 고객의 가치는 동일한가? 악플을 다는 사람은 어떤 가치인가?

1. 돈을 많이 쓰는 고객

2. 일반고객

3, 불량고객 

Background: 본인이 잘 아는 부분에 대해, 악플을 많이 달긴 하더라. 전체서비스에 대해 불만이 다 있는 것은 아니고, 특정 컨텐츠에 대해서만 불만이 있거나 

 

 비용관점 vs 모객 관점?

유지비용보다 더 큰 이익이 되는 고객만 vs 고객 한명이라도 더 모집 

 
 

 자발적 이탈 vs 비자발적 이탈

예) 비자발적 이탈: 사용요금 미수

자발적이탈모델을 만들 때는 비자발적 이탈 사용자는 제외하고 모델을 만들어야함.

 

 조기사망/사고사/자연사

- 게임사: 게임 컨텐츠를 충분히 즐기고 그만두는 경우 

- 사고사: 중간에 다른 외부요인으로 그만두는 경우

- 조기사망: 조기 이탈

 

 화장품(아모레퍼시픽) - CRM

 한 번만 (단일 구매 행동) 구매전략을 세우기 위해서, 분석대상에 포함시킬 것 인가?   한번만 사는 사람들은 자기 니즈에 있어, 크로스셀링의 관점에서는 고객이 아닐 수 있다(?)
  카테고리까지는 추천해주는 경우는 안산제품중에서 어떻게 추천해줄것인가? 특정제품을 더 추천해줄것인가? 아니면 카테고리까지만 보여줄것인가?  해당 트렌젝션(립스틱)이 발생한 경우,  A:최대판매량, B:MD추천, C: 인구학적정보가 유사한 인구가 많이 산 제품 등

항공사

 신규 노선 또는 부진노선을 이용할 확률이 높은 고객을 사전에 예측하고, 그 고객의 속성을 파악할 수 있다면?

Background:  항공사는 대부분 에이전시를 이용해서 판다. 

 상용수송: 사람을 태우는게 아니라, 화물운송등.. (여행이 45% 나머지가 55%가 화물운송)

- 대부분 노선을 1회 이용한다.2~5회 이상은 왔다갔다하는 거일 수 있음

- 대상기간 내 한번만 가는 경우-> 연관성분석하기가 어려움.

- 과거 노선이 현재 폐지되었을 수 있음.

- 한 도시에 여러 공항이 생겨있을 수 있음.

 - Web graph로 시각화 하여+ Assocication Rule 적용 (룰적용시에는 min_sup을 결과보면서 조정을 해야할 듯)


Support 을 기본적으로 보고, Lift 1이상을 보는 게 좋을듯

 컨텐츠(카카오)

 서비스 이탈 vs 작품이탈

지금까지 쭉 읽고있었는데, 매일보다가 안들어오는 경우. 전체 컨텐스 서비스가 아니라, 서비스내 작품 내 관점

이탈이 되기전 관리하자

 

 

이탈 가능성 변수를 생성 

 

[열람패턴]

작품수와 열람수가 줄어드는자

열람 패턴이 불규칙한지

여 장르를 보는사람이 낮고

영화 또는 방송만 보는 사람은 이탈가능성이낮다

최신편수가가 많을수록 가능성 낮음

[작품] 연재종료/휴재 

[유상구매] 유상구매를 하는 사람일수록

[이탈경험] 복귀기간, 이탈경험

[환경] 여러 단말기일수록 낮을듯

컨텐츠(NC소프트)

 프로젝트 했던 과정에 대한 질문

 실무진면접

 
 

 입사 후 진행하고 싶은 프로젝트에 대화

  

 

 전직장 퇴사이유에 대한 질문

 

 

 카카오

#graph 이론
#tree 이론
#quick_sort 구현
#divide and conquer이 쓰인 유명한 알고리즘 예시
#l1, l2 차이 비교. 하는 이유
#likelihood의 개념, 확률과 likelihood의 차이
#코드에서 time이 얼마나 걸릴지? O(n2) 등등 
  
    


딥러닝은 병렬처리 가능/ SVM은 병렬처리의 최적화가 어렵다다던데;;


Background


고객획득과정: 예) 5억들어 MASS 광고(방문자 10만명) -> 2주생존율 (10%, 방문자 1만명) -> 구매 전환율 (50%, 방문자 5천명).

AARRR: 고객 획득과정:

 -> Acqusition, Activation, Retention, Referral, Revenue 구매전환율을 고려해서 역산해서 광고비를 계산해서 비용을 산정하기도 함

https://www.greensystem.vn/en/blog/product-manager-framework-aarrr-metrics.html


신용평점모형(평점표 모형, Scorecard model)




Abbreviations


 CLTV(Customer Life Time value)

 AARRR model: Acqusition, Activation, Retention, Referral, Revenue 


반응형

'Data science' 카테고리의 다른 글

오토마우스: 간호사, 의사 보수교육 사이버연수 자동클릭  (0) 2022.10.29
Data structure  (0) 2020.01.28
Network analysis  (0) 2019.11.20
Undersampleing & Oversampling  (0) 2019.07.08
Regular expression  (0) 2019.03.12

현금이 많은 기업을 찾아라.


현금및현금성자산이 풍부하다는 것은 기업이 매출 채권을 원활하게 현금으로 회수하고 있다는 의미이다.

- Key point: 주당순현금을 계산하여라 (주당순현금 = (현금및현금성자산 - 비유동부채) / 발행주식수

* 주당순현금에 기반한 주가상승은 일시적일 수 있다.

* CP (Commercial paper, 기업어음)과 CD(Certificate of deposit) 양도성예금증서는 현금처럼 생각할 수 있지만, 대차대조표에 허위기재되는 경우가 많아 분리해 생각하는것이 합리적이다.

비유동부채를 차감하는 이유는 1년안에 갚아야하는 유동부채는 회사내 가지고있는 매출채권으로 상쇄가 가능하다고 가정하기 때문이다.

주당순현금은 주식가격을 상쇄시킬 수 있다. 아래의 예시를 들어보자. 아래는 라온시큐어라는 보안솔루션 관련 회사이다. 이 회사는 현금성자산이 220억정도에, 비유동부채가 160억이다. 따라서 순현금으로 고려할 수 있는 부분은 60억정도는 자산의 순현금이라고 고려할 수있다. 현재 보통주로만 3,100만 주식이 발행되었다(1억1천주가 발행되고 나머지는 감자되었다.) 따라서 60억 / 3,100만이니 .. 이 회사는 약 20원정도의 주당순현금을 가지고 있다고 할 수있다. 주가가 2,200원이라면, 현금이 붙어있는 20원정도를 제외하고, 2,180원정도에 구매할 수 있다는 뜻이다. 생각보다 현금을 많이 보유한 회사는 찾기가 어렵다. 




유가증권이 풍부한 기업을 찾아라.


유가증권에는 4가지 종류가 있는데, 이 중, 매도가능증권(AFS, available for sale securities), 지분법적용투자주식(Securities under equity method) 에 주목하자. 매도가능증권과 지분법적용투자주식은 둘다 증권(주식)이라는 점에서 공통점이지만, 지분법적용투자주식인 한 회사의 지분율 20%이상 보유한 경우, 특별한 계상으로 고려될 수 있다. 또한,  지분법적용투자주식은 평가이익이 과세소득에서 제외된다. 또한 지분법적용투자주식은 평가차익이 발생한경우 손익계산서에 수익으로기록할 수도있다. 그러나, 현실에는 외부에 수익을 숨기고 싶어하는 경우 매도가능증권으로 처리하는 경우가 많다. 지금 당장의 수익이 발생하지 않은 것으로 보일 수 있기 때문이다.

* Key: 매도가능증권(AFS)가 많은 경우도 주목해서 살피자. 현금이 많은 주식을 사는 것과 같다.

* 주당 유가증권의 가치를 계산하자.



유형자산과 부동산가치


기업이 영업활동을 위해 장기간 보유해야하는 물리적 실체가 있는 자산을 유형자산(PPE, Property plant and equipment)라고 한다. 물리적 실체가 없으면 무형자산(intangible asset)이라고 한다. 이러한 계정과목 중, 우리가 주목해야할 자산은 유형자산이다. 유형자산은 실제 취득원가로 기록되괴, 감가를 해서 비용으로 감안하는데, 특정 자산들은 오히려 늘어나는 경우가 있다. 그럼에도 이 자산이 실제가격과 괴리가 큰 자산들이 있는데, 이가 '부동산'자산이다.

* Key: 유형자산 중 부동산자산가치가 있는 회사를 찾는 것은 프리미엄을 줄 수 있다. (하지만, 실제 부동산자산이 있다고 알아도 평가가 어렵다)

또한, 유형자산을 사놓고 놀리면 안되므로, 유형자산이 얼마나 가성비 좋게 활용되고 있는지 어림잡아 계산할 수 있는데, 이가 유형자산회전율(PPE turnover)이다. 유형자산회전율은 매출액 / 유형자산의 계산식으로 나누는데, 매출발생에 유형자산이 얼마나 효율적으로 쓰이고 있는지를 활용할 수 있다. 매출액이 매우 큰데, 유형자산이 작은 경우, 유형자산회전율은 매우 커지는데 적은 유형자산으로도 효율적으로 매출을 낼 수 있다는 것을 암시한다.

* Key: 유형자산회전율은 동종업계보다 높은 것이 좋다. PPE turnover = 매출액 / 유형자산 

* 유형자산회전율이 점점 낮아지는 것은 유형자산을 취득한 것처럼 보일 수도 있기때문에, 분식회계의 신호가 될 수 있다.


아래의 예시는 경동나비엔의 2018년 (46기)의 사업보고서 내용중 일부이다. 유형자산이 2,480억정도가 잡혀있다. 실제 자산이 5800억정도인데 절반이 유형자산으로 잡혀있다. 보일러 제조업이다보니 생산설비(건물, 구축물, 기계, 차량 등)이 많다는 이야기이다. 이를 이용해서 한 해에 버는 매출은 7200억이었다. PPE turnover 가 3(=7200억/2480억)에 가까운데,  유형자산을 놀리지 않고 실제로 잘 사용하고 있다는 말이다. 실제로 'II-사업의 내용'에 보면 당해년도 공장가동율도 기입이되는데 4개의 공장을 합쳐 8시간 정규기준으로 92%의 공장가동율을 보이고 있다.



하지만, 이런 유형자산을 매입해서 사용하는 경우 '자본적지출'과 '수익적지출'이라는 두 가지 방법으로 비용을 계상할 수 있다. 자본적지출은(CAPEX,, capital expenditure)라고하여, 자산의 사용 연수를 증가시키거나 가치를 실질적으로 높혀주는데 돈을 사용한 경우다. 일반적인 개인의 경우 인테리어 비용은 실제 부동산거래시 시가에도 반영할 수 있고, 내부사용연수도 증가시키므로 자본적지출이라고 할 수 있다. 한편, 수익적지출(OPEx, operational expenditure)은 취득한 유형자산을 운영하기위해 돈을 지출한 경우를 의미한다. 예를 들어, 아파트를 지어놓고 필요한 경비원을 고용하는데 드는 비용은 수익적지출이라고 할 수 있다. 이는 아파트의 사용연수나 실직적 가치를 높혀주는데는 도움이 되지 않는다. 여기서 중요한 것은 자본적지출(CAPEX)으로 지출한 경우, 손익계산서에는 변화가 없지만, 수익적지출(OPEX)으로 계상한경우에는 실제 순수익이 줄어드는 효과가 난다. 

따라서, 보수적으로 회계를 하는 기업이면 수익적지출로 처리하겠지만, 회사가 적자를 보는 것을 보기 싫은 경우 자본적지출로 계상해버리면 유형자산으로 취급하여 PPE turnover가 낮아진다.


감가상각


유형자산을 계산할 것은 감가상각이다. 감가상각은 정액법과 정률법이 있다. 정액법은 해마다 같은 금액을 감가상각하는 것이고, 정률법은 비율로 (%)으로 자산을 줄여나가는 것이다. 중고차로 예를 들면, 중고차의 경우 초기 감가상각이 매우 큰데, 출고하자마자 2~300만원이 날아가고, 매해 감가상각을 받는다. 그러다 2~5년후에는 거의 가격이 매해 얼마 줄ㅈ ㅣ않는데 이렇게 비율로 줄어드는 것이 정률법이다. 우리나라 회계에는정률법을 쓰는 것 권장하고있지만, 감가상각을 할 겨우, 이윤에서 감가상각부분이 제외되어 순이익이 줄어들게된다. 회사가 올해 손실을 줄이고싶다면 정액법을 쓰는 경우도 있겠지만, 그 반대의 경우도 있다. 이를 참고로, 역분식회계라고 한다.

Key: 감가상각도 하나의 비용으로 생각하여 순이익을 계산한다.


개발비


개발비란 기업이 신제품이나 신기술을 개발하기위해 연구활동을 수행하면서 발생한 비용인데, 미래에 경제적 효익을 가져다줄 것을 의미한다. 중요한 것은 이는 회계상으로 비용이 아니라, 자산으로 분류된다는 사실이다. 따라서 이 개발비는 자산중에서도, 무형자산으로 취급한다는 것이다. 이점은 기술개발이 계속 필요한 회사한테 매우 중요한데 다음의 예시를 들어보자.

개발비 100억짜리의 프로젝트가 있다고하자. 이 개발비 100억이 한번에 투입되었다고 가정하면, 올해 순이익에서 100억을 차감해야하는 것은 당연하다. 이에 따른, 주가하락과 경영상의 애로, 투심저하 등이 당연히 있을테니, 이를 방지하기위해서 무형자산으로 분리해서 천천히 감가상각하자는 것이다.

이런 개발비를 경상연구개발비(판매 및 일반관리비, '판관비'라고도 한다)로 할 경우와, 무형자산으로 취급할 경우가 다르다. 판관비로 취급하면 매출액에서 판관비를 제외하면서 손익계산서를 작성(손실로 기록)하지만, 무형자산으로 하면 아무런 영향을 받지 않는다. MS가 1990년대에 반시장독점으로 재판을 받고있을 때, 수익을 줄이기위해서 연구개발비를 경상연구개발비로 털어내면서 수익을 줄이고자 하였던 사실도 있다.

-Key: 연구개발비 부분을 무형자산으로 분류할지, 경상연구개발비로 분류하는지 잘 살펴보고, 수익이 과대/과소하지 않은지 평가한다.


손익계산서 개념과 원리


손익계산서(IS, income statement*)는 당기 영업을 한후에, 매출액(sales)부터 맨아래 당기순이익(NI, net income)까지 계산한 플로우를 알려주는 기술서이다. 이 손익계산서를 이해하려면, 매출액, 매출총이익, 영업이익, 계속사업이익, 당기순이익까지 이어지는 플로우를 알아야한다.

햄버거를 팔았다고하자. 매출액은 햄버거를 판 총 금액이다. 이 햄버거는 패티, 빵 등 매출원가(COGS, cost of goods sold)가 있으므로, 이를 제외하고 계산할 수 있다. 이 금액이 매출총이익(gross margin)이이다. 이 매출총이익에서 광고, 프로모션 등 판매비와 관리비(SG&A, selling goods and administrative expense)가 있을 수 있으므로, 이를 제외하고 계산하고자 한다. 이 금액이 영업이익이다. 영업이익(EBIT, operation income)은 결국 매출액에서 이것저것 드는 부대비용을 제외한 금액이다. 이 영업이익은 순전히 햄버거 판 금액만 있는것이 아니라, 회사가 가지고있는 기타 자산들을 사고팔면서 이득을 볼 수 있다. 이런 금액을 제외한 것이, 계속사업이익(ordinary income)이다. 계속사업이익도 특별손실/법인세비용 등을 제외하고나면 드디어 당기순이익(Net income)이 나온다.

매출총이익 = 매출액(sales) – 매출원가(COGS, COS)

 

매출원가(COGS) = 기초재고액 + 당기매입액 기말재고액

영업이익 = 매출총이익 판관비(SG&A)

 

판관비 = 급여, 퇴직급여, 복리후생비, 감가상각, 접대비, 세금공과, 광고비, 대송상각비, 통신비, 여비교통비, 보험료, 교육훈련비

 계속사업이익

 당기순이익

 

 

매출채권이 급속도로 느는 회사를 조심해라 (기업이 전년도에 비해 매출채권이 크게 들었다면, 매출채권을 이용해서 부풀려 분식회계를 할 수도 있다). 이런 회사들을 매출채권회수기간(DSO, days sales outstanding)이 늘어날 수도 있다.

*영어로도 알아두는것을 추천한다. 필자는 해외주식도 권한다



투자자라면 영업이익율이 높은 기업의 주식을 매입해라-EBITA


아래의 표에서 영업이익을 늘리고자하면, 매출총이익을 늘리거나 판관비를 줄여야한다. 여기서 매출총이익을 늘리는 방향도 있지만, 판관비를 줄이는 방법도 있다. 판관비에서 가장 특이적인 것은 감가상각인데 감가상각비를 어떻게하냐에따라 영업이익이 올랐다 내렸다 할 수 있다. 따라서, 회사의 감가상각을 알기위해, 정률법, 정액법 중 어떤것을 적용했는지 파악해야한다(왜곡될 소지가 있다)

이러한 문제를 해결할 수 있는 대안으로 EBITDA라는 개념이다.

EBITDA = 영업이익 + 감가상각비

위의 수식을 보면 영업이익은 매출총이익-판관비인데 EBITDA을 계산해보면, 매출총이익-판관비(감가상각비제외)와 같다. 감가상각비로 장난칠 수 있는 부분을 제외한다는 것이다. EBITDA는 감가상각비를 제거함으로써, 기업 본연의 영업능력을 평가하는 지표가 된다.

매출총이익 = 매출액(sales) – 매출원가(COGS, COS)

 

매출원가(COGS) = 기초재고액 + 당기매입액 기말재고액

영업이익 = 매출총이익 판관비(SG&A)

 

판관비 = 급여, 퇴직급여, 복리후생비, 감가상각, 접대비, 세금공과, 광고비, 대송상각비, 통신비, 여비교통비, 보험료, 교육훈련비

 

EV(Enterprise value)/EBITDA = (시총+순차입금)/EBITDA

*순차입금 = 총차입금현금 및 현금성자산



기타


너무 많지도, 너무 적은 매출채권은 주의하라

너무 많아도, 너무 적어도 문제가되는 재고자산


반응형

Network 이란? Nodes와 Ties로 구성되어있는 개체. 텍스트로 구성되어있는 것을 semantic network.


Nodes: 단어/객체

Ties


- Ties: 정의 단어들간의 관계. 이 관계를 중요하게 고려해야한다. Co-occurence을 기준으로(Within 문장/문단/문서). 예를 들어, 문장 내에서 동시에 출현하는 것을 한 동시출현으로 볼것인지, 문단으로 볼것인지, 문서로 볼 것인지. 이 정보를 추출 하는 것이 가장 중요하다.

- Weight: Co-occurences

- Direction /


Objective


1. 단어의 공통적인 출현(단어 사이의 유사도)

2. 선택된 단어에 대해서, 어떤 관계를 맺고이는지를 확인할 수 있다. 문서마다 얼마나 다른지도 확인 할 수 있음. (관계가 같다 라는 귀무가설을 두고 통계적 검정을 할 수 있다. 네트워크끼리도 샘플링 분포를 그려서 차이를 둔다. 샘플링 분포를 시뮬레이션 방법으로 사용한다(Montecalo marcov chain)

 - 시뮬레이션을 할 때, 리샘플링(Resampleing)을 주로하는데: Bootsraping(replacement) / Permuation(without replacement)이 있다. 

3. 문서나 단어의 특성을 표현(For embedding, vectorization)


*단어를 선택할 때, 1) 이론적인 백그라운드를 이용하여 선택하거나, 단어의 빈도(예, 탑10 단어)를 이용해서 선택함

각각의 노드에 대한 측정값

Degree centrality: degree(직접적으로 연결된 다른 노드의 수)가 얼마나 많은지. 해당노드의 degree / N -1 (N: 노드 수)

Betweeness centrality: 해당 노드가 다리 역할을 하는지 안하는지 

(sigma_st = node s 부터 node t까지의 가장 짧은 path의 총 합. sigma_st(v):은 v을 통해서 가는 가장 짧은 path의 수

Clossness centrality: 다른 노드와 더 가깝게 연결된 노드가 더 중심적인 역할.

Eigenvector centrality: 다른 노드의 중심도에 의해 해당 노드의 중심도가 결과. 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import networkx as nx
import itertools
 
= nx.Graph()
g.nodes()  # 노드 확인
g.add_nodes_from(unique_nouns)
 
for pair in list(itertools.combinations(list(unique_nouns), 2)):
    if pair[0== pair[1]:
        continue
    for sent in final_sentences:
        if pair[0in sent and pair[1in sent:
            if pair in list(g.edges()) or (pair[1],pair[0]) in list(g.edges()):  # Tie가 이미 있으면 가중치 추가
                g[pair[0]][pair[1]]['weight'+= 1  # 1 증가
            else:
                g.add_edge(pair[0], pair[1], weight=1 )  # Tie가 없으면 이미 가중치 감소
                
g.edges()  # EdgeView: 엣지확인
g['carrot']  # 해당 노드에 대해 어느정도 가중치가 있는지
cs



Quadratic Assignment procedure


Tie

Simulation 방법중 resampling 을 사용한다. iid에 영향을 받지 않는다. 노드 생기는건 iid가 아니다. Simultion 

두 네트워크 내의 차이가 얼마나 차이가 나는지지를 QAP을 이용해서.

Square matrix간의 correltation. 인접행렬


gcor 값가지고는 p-value차이가 안나는데,

QAP을 가지고 차이가 있는지 확인할 수 있다.


반응형

'Data science' 카테고리의 다른 글

Data structure  (0) 2020.01.28
데이터사이언티스트 면접  (0) 2020.01.15
Undersampleing & Oversampling  (0) 2019.07.08
Regular expression  (0) 2019.03.12
머신러닝 모델 분류  (0) 2019.03.12

2013년에 인공신경망 분야의 유명한 컨퍼런스인 신경정보처리시스템(NIPS, Nueral information processing systems)에 소개된 논문입니다. 단어나, 진단명, 음식명 등과 같이 어떤 개념들을 임베딩할 때 사용할 수 있을 것 같아, 공부겸 아래와 같이 국문번역을 진행해봤습니다.


원문: Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., & Dean, J. (2013). Distributed representations of words and phrases and their compositionality. In Advances in neural information processing systems (pp. 3111-3119).





Requirement Background knowledge



조밀행렬간의 곱(Dense matrix multiplication): 

(source : https://github.com/maxeler/Dense-Matrix-Multiplication)


Skip-gram:







Abstract


  최근 소개된 Continous Skip-gram 모델은 간결한 구문이나 의미론적 단어 관계를 활용할 수 있는 분산벡터표현모델이다. 본 연구에선는 벡터와 훈련속도를 향상시킬 수 있는 여러가지 모델들을 제안한다. 출현빈도가 높은 단어들을 샘플링함으로서,  본 연구에서는 좀 더 일반적인 벡터표현을 학습하고, 속도를 향상시킬수 있었다. 또한, 이에 계층적 네거티브 샘플링(Negative samping)이라고 부르는 소프트맥스(Hierachial softmax)에 대한 대한도 제시한다. 벡터표현에 대한 제한점은 단어의 순서에 대한 차이가 없단는 것과 관용구같은 표현이에 대해서는 표현이 불가능하다는 것이 있다. 예를 들어 'Canada' + 'Air'의 합친 의미는 'AirCanada'라고 할 수 없다. 이러한 예제로부터, 텍스트 내에 구의 의미를 찾는 간단한 방법을 제시하고, 많은 구에 대한 훌륭한 벡터표현을 학습하다는 것이 가능함을 보였다.




Introduction


  벡터공간에서의 단어의 분산표현(Distributed representation)은  유사한 단어를 그룹핑 하고, 벡터공간에 표현할 수 있게 함으로써 알고리즘을 학습시키는 것을 가능하게 자연어처리분야에 큰 진보를 가져왔다. Rumelhart 외 2인이 1986년에 제한 방법이 가장 초기에 제안된 방법인데, 이러한 방법은 통계적인 방법을 이용하였다. 이후에, 벡터표현은 기계번역이나 자동음성인식 등 자연어처리 여러분야에 응용되어 사용되었다.

  최근에 Mikolvo et al 은 Skip-gram 모델을 소개했는데, 많은 양의 비정형 텍스트에 대해서도 단어의 향상된 벡터표현을 가능하게 했다. 이전에 사용되었던 신경망구조와는 달리, Skip-gram은 조밀행렬간의 곱(dense matrix multiplications)을 하지 않는다. (역주: Requirment에 제시한 그림과 같이 행렬이 매우 큰 경우에 각 연산을 하려면 상당한 계산비용이 드는데 이러한 과정이 없다는 의미이다.) 반면 아래와 같이 (Figure 1), 각 벡터를 신경망으로 연결해서 표현하기때문에, 계산비용에 있어 요율적이다. 


 인공신경망을 이용한 단어의 표현은 학습된 벡터를 명시적으로 많은 패턴들로 인코딩해주기 때문에 매우 흥미롭다. 또한, 많은 패턴들이 선형해석으로 가능하다 (역주: 선형으로 연산하면 우리가 알고있는 연산처럼 생각할 수 있다는 의미로 생각됨. 다음의 예시를 참고) . 예를 들어, 벡터(Madrid) - 벡터(Spain) + 벡터(France)을 하면 벡터(Apple)과 같은 벡터보다, 나라-수도의 관계이기 떄문에, 벡터(Paris)가 나올 것이다.


 본 연구에서는 원래 Skip-gram 모델을 여러가지를 활용하여 발전시킨것을 소개한다. 본 연구는 훈련과정에서 출현빈도가 높은 단어들을 샘플링하여 훈련속도를 약 2배에서 10배까지 향상시킨 결과를 보여줄 것이고, 상대적으로 출현빈도가 낮은 단어에 대해서도 좀 더 향상된 단어의 표현이 가능했음을 보여줄 것이다. 또한, 노이즈대조추정(Noise Contrastive Estimation, NCE)의 간단한 변형을 제시하여, Skip-gram의 훈련속도를 향상시키고, 사전연구와 비교했을 때 출현빈도가 높은 단어의 표현이향상됨을 보여줄것이다.


 단어의 표현은 관용적표현구 각각 분리할 수 없는 것에 대해서는 불가능하다는 것에 제한점은 있다. 예를 들어, 'Boston Globe'는 신문인데, 이를 'Boston'과 'Globe'로 분리하여 의미를 조합하면 젆혀 다른의미가 되기 때문에 이러한 과정에는 제한이 있다. 그러므로, 단어를 나누지말고 전체 구(global phrases)을 한번에 벡터로 표현하는 것이 더 표현이 정확할 수 있다. 그외, 단어의 벡터를 구성하는 목적으로사용될 수 있는 Recursive autoencorder가 이러한 경우에 사용될 수 있다.


 단어기반부터 구 기반까지의 모델의 활용인 상대적으로 간단하다. 첫째로, 우리는 많은 구를 활용하여, 각각의 구를 토큰화(tokenization)하여 각각 토큰을 훈련에 사용하였다. 이렇게 사용된 구의 표현을 제대로 벡터에 표현되었는지 확인하기위해서, 단어와 구를 포함하는 유추문제를 테스트 세트로 개발하였다. 전형적인 유사적 쌍은 "Montreal":"Montreal Canadien"::"Toronto":"Toronto Maple leaf"인데, Montreal Canadien - Montreal + Toronto 를하면 Toronto Maple leaf가 나온다는 것을 확인했다. (역주: 몬트리얼 케너디언은 하키팀이고, 토론토 메이플 리프도 케나다팀이다. 따라서 몬트리얼이라는 지역을 제외하면, 하키팀이라는 개념만 암고, 토론토를 추가했으므로 토론토 하키팀이 되야하므로 Toronto maple leaf가 나온 것이다.)


 마지막으로, Skip-gram의 또다른 성질에 대해서 설명할 것이고, 간단하게 벡터를 더하는 것이 새로운 의미를 줄 수 있다는 사실을 확인했다. 예를 들어, '러시아'+'강(River)'는 ''볼가강"과 유사도가 높고, "독일"+"수도(Capital)"은 "베를린"과 유사도가 높음을 확인했다.



The Skip-gram model


Skip-gram 모델의 훈련 목적은 문헌 내에 주변단어들을 예측할 수 있는 단어의 표현을 찾는 것이다. 더 정확히는 어떤 문장이 w1, w2, w3... wt의 단어의 조합으로 이루어졌을때, Skip-gram의 훈련 목적은 평균 로그 확률(the average log probability)을 최대화 하는 것이다. 본 문헌에서는 축약된 내용이 너무 많아, "word2vec Explained: deriving Mikolov et al.'s negative-sampling word-embedding method." 논문을 따라서 설명하는 것이 더 편할 것 같아 다음과 같이 추가하였다. 


앞서, 몇가지 용어를 정의할 필요가 있다.

  • Corpus (말뭉치): 문장의 조합
  • Context : 현재 단어의 예측하고자하는 주변단어
Word2vec의 훈련단

 w을 단어의 뭉치(corpus)라고하고, 그 주변문맥을 c라고 하자. 그러면 이는 조건부 확률로 어떤 단어 w가 나오면, c가 나올 확률을 제시할 수 있는데 이를 표기하면 다음과 같다.


그리고, 어떤 문헌이 같이 주어졌을 때, 파라미터(ceta)을 찾기위해서는 아래와 같이 말뭉치의 확률을 최대화 하는 방향으로 최적화를 한다. 예를 들어, 원문이 "나는 사과를 먹는다"였다라고 하면, [   ] 사과를 [    ] 에서 앞단어와 뒷단어를 찾는 확률을 구하는 것이 Skip-gram의 주 목적인데, 여기서 w가 '사과를'을 의미하고 전/후 단어가 c을 의미한다. 위와 같은 상황에서, 텍스트 전체가 있고, 최적화하고싶은 파라미터가 있는 경우에는 다음과 같은 조건부 확률을 최대화 하는 방향으로 모델을 만들어야한다. 여기서 c(w)은 단어 w 에대한 세트이다. 




w는 단어를 의미하고. Wo는 출력될 단어, Wi는 입력되는 단어를 의미한다. 또한, p(w|w) 은 다시 아래와 같은 수식을 따른다.

(source:https://arxiv.org/pdf/1402.3722.pdf)



Vw는 입력 단어가 표현된 벡터를 의미하고 ,V'w은 출력단어에 대한 벡터의 표현값이다. 


위의 식과 아래 식을 종합해보면, 첫번째 식 1/T * sum (sum())을 최대화 하려면, 결국에 log p(w|w)가 최대화 되어야한다. 결국 p(w|w)가 최대화 되어야한다는 의미이다. p(w|w)가 크려면 결국 분자가 커지거나, 분모가 작아져야하는데 그러려면 아래와 같은 수식으로 다시 풀어서 쓸 수 있을 것 같다. 분자가 최대화 된다는 말은 









Q. Skip-gram의 가중치의 전치행렬이 다를수 있다는데, 이게 다를수가 있나?


food2vec을 만들어서 특정 원소를 보면, 가공식품에 대한 요소가 있을거고, 어떤 요소를보면 다이어트에 유리한 요소가 잇을 것인데 이러한 요소에 대한 차이를 확인해보자.

반응형

+ Recent posts