인공지능의 역사

인공지능은 최근에 시작된것 같지만 실제로는 지금으로부터 1950년 초반부터 시작된 학문입니다. 이번 글에서는 인공지능의 역사를 몇가지 중요한 사건들을 중심으로 설명해드리고자 합니다.

https://medium.com/@armand_ruiz/deep-learning-with-data-science-experience-8478cc0f81ac

1943년
이 해는 워랜 맥클록, 월터 피츠에 의해 인공신경망에 관한 최초의 연구가 이뤄진 해입니다.
이 두학자는 인간의 뇌가 뉴런의 복잡한 연결로 이뤄진 것을 착안해서 인공적으로 지능을 만들 수 있을 것이라는 것을 이론적으로 증명했습니다

위키백과 : 앨련 튜링

1950년
앨런 튜링이라는 인공지능의 역사에 중요한 인물이 있습니다.
앨런 튜링은 “계산기계와 지성”이라는 논문을 통해서 “인공지능의 개념적인 토대를 놓았다”라고 할 수 있습니다. 인공지능이라는 말을 어떻게 정의할 수 있을까요?
정의하기가 굉장히 까다롭습니다.

인공지능 = 인공+지능
인공지능은 인공+지능이라는 일상에서 많이 사용하는 어렵지 않은 단어의 연결이죠. 그러나 이 단어가 조합하게 되면 정의를 내리기가 복잡해집니다. 특히 지능이라는 단어가 더 그렇다고 할 수 있습니다.

그렇기 때문에 학자마다 각기 다른 주장을 하게되고 또 의견도 분분하게 됩니다.

예를 들어서 지식은 신에게로부터 부여 받은 것이다 라고 생각하면… 인공지능에 대한 접근은 사람이 기계에게 지능을 부여해주는 방향으로 연구가 진행됩니다.

반면에 지식은 스스로 습득해가는 것이다라고 생각하면… 기계에게 많은 데이터를 주고 이를 통해서 스스로 학습하게 하는 방향으로 연구하게됩니다.

앨런 튜링은…  지능에 대한 철학적이고 설명하기 어려운 개념들에 대한 논쟁을 벗어나서
“자신이 기계와 이야기하는지 혹은 사람과 하는지 분간할 수 없다면 그것은 기계가 지능을 가지고 있다”라고 보아야 한다는 논리를 주장을 하게 됩니다. 이것을 튜링-테스트라고 합니다.

예를 들어서 채팅창을 통해서 대화를 하는데… 나와 대화하는 것이 사람인지 아니면 기계인지 알 수 없다면 그 기계는 지능을 가지고 있다. 라고 하자는 내용입니다.

https://medium.com/rla-academy/dartmouth-workshop-the-birthplace-of-ai-34c533afe992

1956년
그로부터 몇년 후에 아주 중요한 컨퍼런스가 열립니다.
당시에 수학자이자 컴퓨터 과학자인 존 매카시는 인공지능이라는 말을 처음 사용하게되고 이 회의에서 튜링의 “생각하는 기계”를 구체화하고 논리적인 형식을 갖춘 시스템으로 이행시키는 방안을 연구하기 시작합니다. 
이 회의에 참석한 사람들은 당대의 석학들로 이때만해도 많은 과학자들은 인공지능의 미래에 대해서 낙관하고 앞으로 몇십년만 지나면 “기계가 사람이 할 수 있는 일을 하며 심지어 자신의 존재에 대해서도 자각할 것”이라는 엄청난 주장을 했습니다. 

당시에는 인공지능에 대한 관심이 대단히 높았고 또 당대의 최고 석학들이 이런 말을 했으니까 세상에 많은 사람들이 주목을 하게되었습니다.

1958년
프랭크 로젠블렛이라는 학자가 등장하면서 퍼셉트론 이론이라는 아주 중요한… 현재 딥러닝의 기본 모델을 만들었습니다. 이것을 연결주의라고 합니다.
여기서 중요한 개념이 나오는데…
인공지능은 지식을 어떻게 정의하는가에 따라서 기호주의와 연결주의로 나눌 수 있습니다.

데카르트와 같은 이성주의 철학자는 “신으로부터 부여 받은 이성을 통해서 사유한다”라고 주장했죠. 이런 철학적인 영향을 받은 컴퓨터 과학자들은 신에게 인간이 지능을 부여 받았듯… 사람이 기계에게 지식을 부여함으로 완성된다. 라고 주장했습니다.

이에 영향을 받은 연구자들은 기계에게 인간이 이해할 수 있는 어떤 기호 체계를 기계에게 지식형태로 주입하고 했습니다. 예를 들어서 연역적 추론이나 의사결정트리 같은 알고리즘입니다. 이것을 기호주의라고 하고 마빈 민스키와 같은 연구자들이 대표적인 학자들입니다. 

반면에 연결주의는 베이컨과 같은 경험주의 철학에 영향을 받았습니다.
경험주의는 “경험을 통해서 지식을 얻을 수 있다”라고 주장했기 때문에 이런 학문에 영향을 받은 인공지능 학자들은 기계가 스스로 생각하고 학습할 수 있도록 만들자고 주장했고 이런 것을 구현하기 위해서 인간의 뇌에서 영감을 받아서 만든 개념이 바로 퍼셉트론의 개념입니다.

퍼셉트론 이론과 같이 우리의 뇌가 수많은 뉴런으로 연결되어 있다는 것에 착안해서 입력에 가중치를 곱해서 나오는 출력이 일정 신호 이상이면 1, 그렇지 않으면 0을 표현하는 이론입니다.
이후 딥러닝으로 발전하게 됩니다.

1969년 
마빈 민스키와 페퍼트가  『퍼셉트론즈』라는 책 출판합니다.
그 책에 보면 퍼셉트론 이론의 결정적 문제점이 있다라고 지적합니다.
M. Minsky – “퍼셉트론은 선형분리만 가능하다. 그러니까 복잡한 문제들은 해결 할 수 없다. 이걸 해결하려면 퍼셉트론을 다층으로 만들어야 XOR 같은 문제를 해결 할 수 있는데… 나도 못하고 지구상의 누구도 다층 퍼셉트론을 학습할 수 없을 것이다” 라고 주장했습니다.

그 이유는 딥러닝을 하다보면 엄청나게 많은 hidden layer 층을 쌓는데… 히든 레이어 안에서 입출력 데이터는 오차를 측정할 기준이 없기 때문에 가중치를 조정할 방법도 역시 없다라고 주장했습니다.
마빈 민스키 교수라는 당대 최고의 석학이 했던 이 말은 모든 연구자들에게 큰 영향을 주게되어서 인공신경망 이론은 거의 끝이라고 할 수 있을 깊은 암흑기에 들어가게됩니다.

1970년대
반면 기호주의적인 이론은 인공지능의 대세로 등장하면서 초기에는 많은 발전을 이루었지만 이후에 한계에 봉착합니다.
그 이유는 당시에 구현한 시스템이 해당 분야에서만 문제를 풀 수 있고 다른 분야에서는 전혀 쓸모가 없다는 것을 알게된 것이죠.

예를 들어 체스를 두는 인공지능을 만들었다면… 해당 인공지능은 그 일 외에 아무것도 할 수 없다는 것입니다.
“몇년 안에 기계가 사람의 하는 모든 일을 대체할 것이다”라고 주장했던 말을 기억했던 사람들은 인공지능에 대해서 큰 실망을 하게되고 이로인해 인공지능은 첫번째 암흑기에 들어가게 됩니다.

1980년대
이후에 인공지능은 범용적인 분야 즉, 사람과 같은 지식을 구현하기 보다는 세부적인 일들, 어떤 특정한 문제들을 해결하기 위한 시스템으로 발전해가고 이것을 전문가 시스템이라고 합니다.

즉, 전문가들의 지식과 경험을 데이터베이스화 하여 이를 통해서 문제를 해결하는 방법입니다.
이 가운데서 가장 잘알려진 시스템이 미국 스탠포드대에서 개발한 “마이신(MYCIN)”입니다.
마이신은 500가지의 룰이 준비되어 있으면서 질문에 차례로 답변하면 항생제를 처방하도록 디자인된 시스템으로 69%의 확률로 적절한 처방을 할 수 있었다고 합니다.

이것도 처음에 좋은 반응을 얻었지만…  의학 분야에 해결해야 할 문제가 점점 복잡해지고 문제의 영역이 확대되면서 이러한 시스템의 가장 중요한 부분인 “지식데이터 구축”이 어렵다는 현실적인 한계에 부딪히게 됩니다.
예를 들어서 마이신이 심장병이나, 암, 폐렴 이런 분야에는 답변을 할 수 없었다는 것이죠. 만약 그렇게 하려면 모든 분야에 룰을 만들어야 하는데… 그것이 가능한가? 그렇지 않다는 것입니다.

결국 규칙기반의 인공지능을 구글 브레인의 수장으로 있는 <제프 딘>은 “그동안 인공지능 분야에 더딘 진보를 이루며 깨달은 것은 – 인간이 컴퓨터에 직접 코딩을 하며 세계의 모든 규칙을 정의해서 컴퓨터에게 가르칠 수 없다-는 것이다.” 라고 말하며 결론적으로 그의 말은 컴퓨터가 스스로 학습하면서 배우지 않으면 안된다라는 결론에 이르렀다는 것이죠.

2006년
오랬동안 깊은 암흑의 길을 걷던 연결주의 인공지능은 당시에 마빈 민스키 교수가 했던 여러가지 문제들을 “다층퍼셉트론의 도입, 오류 역전파, 효과적인 활성함수 개발 등”으로 기존의 여러가지 불가능해보이던 문제를 극복하고 재기에 성공합니다.
이에 주도적인 역할을 한 것이 제프리 힌튼 교수입니다. 
힌튼 교수는 당시에 많은 사람이 외면했던 다층 퍼셉트론 이론을 꾸준히 연구해서 “A fast learning algorithm for deep belief nets”이라는 인공신경망의 기념비적인 논문을 발표합니다.
이 논문 이후에 학자들은 다시 인공신경망 이론에 관심을 가지기 시작합니다. 
그의 논문에 보면 Deep brief Nets이라는 용어가 등장하는데 이것이 바로 딥러닝의 시작이라고 할 수 있습니다.

위키백과, 제프리 힌튼

2012년
또 오늘날 많은 사람들에게 인공지능의 성능을 각인시켜준 엄청난 사건이 있었습니다.
그것은 인공지능을 활용한 이미지 분류 챌린지입니다.
수년전 부터 이미지 인식 오류률 26%대에서 0.1%를 줄이려고 당대의 수재들이 모여서 연구하고 노력해왔지만 그 결과는 그리 좋지 못했습니다. 그러나 CNN이라는 이미지 분류 알고리즘이 등장하면서 에러율을 10%대로 끌어 내린 엄청난 사건이 일어나면서 사람들은 이런 놀라운 결과를 만들어낸 인공신경망 알고리즘에 주목하게 됩니다.

https://devopedia.org/imagenet

2016년
이후 우리나라에서 인공지능의 붐이 불기 시작한 것은 구글 알파고가 이세돌에게 바둑 승리하면서 인공지능에 대한 관심이 더욱 높아지게됐습니다.
바둑은 체스와 달리 경우의 수가 너무나 많기 때문에 인공지능이 인간을 이길 수 없다고 예측했고 아마도 이세돌 9단이 4:1정도로 이길 것이라고 전문가들은 예측했지만 결과는 정반대로 알파고가 4:1로 승리했습니다.

https://www.kdnuggets.com/2016/03/alphago-not-solution-ai.html

이 세기의 이벤트였던 이 대결로 인공지능의 성능에 눈부신 발전에 모두 놀라게 됐습니다.

현재 인공지능은 놀라운 속도로 발전하고 있으며 이를 가능하게 해주는 것은 바로 알고리즘, 하드웨어의 발전, 빅데이터 처리 기술이라고 할 수 있습니다.

데이터 품질 평가

4차산업혁명 시대가 도래하며 데이터에 대한 중요성이 점점 높아지고 있습니다. 그리고 이런 데이터의 중요성과 함께 높아지는 것이 데이터의 품질에 대한 사용자의 요구입니다.

데이터의 품질은 요즘 같이 경쟁이 심화되는 사회에서 정확한 데이터에 의한 신속한 의사결정이 필요하기 때문에 많은 양질의 데이터를 확보하는 것은 불확실한 미래를 예측하는 중요한 자원이됩니다.
그러나 반대로 어떤 의사결정에 활용했던 데이터가 품질이 낮을 경우 혹은 검증되지 않았을 경우에는 이 데이터를 통해서 했던 의사결정 역시 잘못될 확률이 높아질 것이고 이로 인한 리스크 역시 크다고 할 수 있습니다.

https://reciprocitylabs.com/resources/what-is-risk-mitigation/

데이터의 중요성은 수전부터 그 중요성에 대한 논의가 계속되어 왔음에도 불구하고 데이터를 사용하는 수요자의 입장에서는 여전히 다양한 불만이 제기되어 왔습니다.
그 대표적인 것이 데이터의 중복, 데이터의 누락, 데이터의 관계나 구조의 높은 복잡도라고 할 수 있습니다.

그렇다면 왜 이러한 문제들이 발생하게 되는 것일까요?

몇가지 이유가 있겠지만 데이터를 생산하는 주체의 낮은 업무이해, ERD와 같은 관리 문서의 부재, 데이터 입력의 오류, 복잡한 입력 프로세스, 예외가 많은 업무, 예외 처리의 부재와 가장 중요하다고 할 수 있는 체계적이지 않은 데이터 운영 조직 등… 다양한 곳에서 데이터 품질에 대한 이슈를 찾을 수 있겠습니다.

그렇기 때문에 데이터 품질활동을 위해서는 데이터의 생산, 데이터의 교환/축적, 정보생산, 정보활용의 각 부분에 대하여 Life-Cycle을 이해하고 단계별 품질관리 활동을 수행해야 합니다.

그렇다면 이런 활동을 하기 위한 “데이터 품질관리 방법은 어떤것이 있을까?”에 대한 질문을 할 수 있을 것입니다. 먼저는 데이터 품질 관리를 위한 분석작업이 선행되어야 합니다. 그리고 이 분석 방법은 크게 InSide-Out, OutSide-In의 두가지 방법이 있습니다.

Inside-Out 방식은 “데이터 자체를 분석함으로 품질을 관리하는 형태의 접근법”이라고 할 수 있습니다. 즉 데이터 그 자체에 주목하고 분석하는 기법으로 데이터의 컬럼분석, 패턴분석, 코드분석, 중복분석, 상관분석, 참조무결성 분석 등이 그것이라고 할 수 있습니다.

반면 Outside-In 방식은 “외부의 비지니스, 서비스 품질 이슈”로 부터 접근하는 방법으로 데이터 규칙, 업무 규칙, 각종 비지니스룰 기반으로 부터의 접근하는 방법입니다.

이 두가지 방법 중에 더 시간이 걸리고 어려운 것은 Outside-In 방식입니다. 이것은 업무프로세스에 대한 이해가 있어야지만 가능한 분석방법이기 때문입니다.

다음으로는 데이터의 품질관리 프로세스에 대해서 생각해보겠습니다.
품질관리는 정의에 따라 차이가 있겠지만 크게 6가지 단계로 정의할 수 있습니다.

데이터 품질관리 프로세스
  • 진단정의 단계(Define) : 품질 이슈에 대한 수요 및 현황을 조사하여 진단 대상을 선정하고 방향을 정의하는 단계
  • 품질진단(Measure) : 품질 진단 대상에 대한 상세 수준의 품질 진단 수행 계획 수립 후 영역별 진단 실시
  • 결과분석(Analyze) : 오류원인 분석, 업무 영향도 분석을 통해 개선과제 정의
  • 개선(Improve) : 상세 수준의 품질 개선 계획 및 영역별 품질 개선 수행
  • 통제(Control) : 목표 대비 결과 분석, 평가를 통한 품질관리 수행

이런 데이터의 품질관리를 통해서 사용자는 데이터의 제공에 대한 안정성, 데이터 신뢰성, 데이터 활용의 용어성 등에 대한 보장을 받게 됩니다. 만일 데이터를 생산만하고 그 품질에 대한 보장이 되지 않는다면 데이터를 활용하여 의사결정을 한다는 것은 큰 위험을 감수해야만 할 것입니다.

반면 이러한 품질관리를 지속적으로 수행한다면 사용자는 데이터 품질에 대한 정확성, 일관성, 유용성, 접근성, 적시성, 보안성 등의 조건을 만족하게되고 데이터를 활용한 의사결정이나 인공지능 모델에 대한 신뢰도를 높일 수 있습니다.

마이데이터란

마이데이터는 데이터3법과 함께 최근 핫이슈로 떠오르고 있는 용어입니다.
데이터3법은 이전 글에서 다뤘기 때문에 이번에는 마이데이터에 대해서 이야기해보겠습니다.

마이데이터는 사용하는 용어 자체가 비교적 이해하기 쉬운 단어들로 되어 있어서 내용에 대한 설명을 듣기 전에도 이미 마음속으로 이러한 뜻이 아닐까 하는 이미지를 그려볼 수 있을 것입니다.

마이데이터는 말 그대로 “마이(My)+데이터(Data)”의 조합으로 만든 신조어라고 할 수 있습니다. 그러니까 쉽게 말해서 “나의 데이터”라는 의미입니다. 그러나 이렇게만 생각해서는 그것이 무엇인지 이해하는 것은 쉽지 않습니다.

금융위원회에서는 마이데이터를 “정보주체인 개인이 본인의 정보를 적극적으로 관리, 통제하고, 이를 신용관리, 자산관리, 나아가 건강관리까지 개인 생활에 능동적으로 활용하는 일련의 과정”이라고 정의하고 있습니다.

간단히 말하면 마이데이터는 “데이터의 주체는 자신”라는 소유권을 명확하게 하고 나의 소유이기 때문에 “나 자신이 데이터를 능동적으로 활용할 수 있도록 함”을 의미한다고 할 수 있습니다.

한국데이터산업진흥원 제공

마이데이터의 개념의 도입으로 개인이 데이터의 소유자이며 활용자라는 것을 명확히 하였습니다. 물론 그 전에도 데이터는 자신의 소유였지만 사실 내 데이터는 각 기업들이 주도적으로 관리하고 사용해왔습니다.

기업들은 사용자의 구매기록, 대출기록, 개인의 신용도정보 등을 가지고 기업의 활동에 활용하기도 하고 다른 기업에 양도하면서 (물론 개인의 동의가 필요한 부분입니다.) 여러가지 마케팅에 사용해왔습니다. 쉽게 말해서 개인의 데이터이지만 그동안은 기업이 영리의 목적으로 사용해 왔다는 것이죠. 개인이 데이터의 권리를 가지고 활용한 사람의 비율은 약 7% 수준 정도로 상당히 낮은 수치입니다.
또 일부 기업이 많은 양의 데이터를 확보하고 그것을 통해서 시장을 지배해왔기 때문에 기업간 정보 불균형이 발생했고 또 새로운 플레이어가 시장에 들어오기 힘든 구조였습니다.

이러한 문제들을 해결하기 위해서 데이터 소유자인 개인이 각 기업에 있는 금융 데이터를 요구하여 자신이 정하는 제3의 업체에 위탁할 수 있게 된것입니다. 이러한 사업이 마이데이터 사업이고 네이버, 카카오페이, 토스 같은 기업들이 참여하게 되었습니다. 고객들은 자신의 모든 금융 데이터를 한곳에 모아서 자산관리를 하게되고 금융위원회의 허가를 득한 마이데이터 사업자들은 이러한 정보를 통해서 고객에게 더 많은 서비스를 제공할 수 있게됩니다.

물론 이전에도 이러한 것이 불가능한 것은 아니었지만 기업들이 경쟁 기업에 자신의 고객데이터를 쉽게 주지 않았지만 이번에 개정된 데이터3법은 이러한 내용을 법적으로 가능하도록 개정한 것입니다.

언뜻 보면 참 편리하고 좋아보이지만 여전이 문제점들이 있습니다.
일단 가장 문제가 될듯한 것이 개인정보에 대한 유출과 이를 악용하는 사례가 되겠습니다. 물론 금융위원회에서 허가한 업체들이 개인의 데이터를 활용하고 강화된 보안정책을 펴겠지만 그 이전에도 여러차례의 대규모 금융정보유출 사태가 있었기 때문에 여전히 큰 문제가 되리라고 예상됩니다.
또 하나는 기업간에 과연 원활한 협조가 되겠는가 하는 것입니다. 기존의 데이터를 소유한 금융권 업체들은 후발주자들에게 데이터를 내어줘야하는 상황이기 때문에 데이터 오픈에 적극적이지 않을 것이라는 문제가 있습니다.

그럼에도 불구하고 마이데이터 사업은 개선의 여지가 있겠지만 앞으로 개인의 금융정보를 활용한 다양한 서비스가 등장할 것이라는데는 이견이 없습니다.

데이터 거래와 가치평가

데이터의 가치란 무엇이고 그 가격은 어떻게 평가되는가?
데이터의 가격을 책정하는 것은 어떤 프로세스를 통해서 진행되는가?
데이터의 가치를 판단하는 명확한 평가 기준은 무엇인가?

아쉽게도 현재 국내에서는 이러한 데이터의 가치를 평가하는 표준은 정해져있지 않지만 그 중요성에 대해서는 업계에서 인지하고 있고 데이터산업진흥원을 중심으로 데이터의 가치를 평가하는 관련 연구가 진행되고 있는 중입니다.

국외에서는 일찍부터 데이터 거래의 중요성을 인식하고 관련 법령 정비와 거래 플랫폼을 만드는 노력을 해왔고 현재는 그 시장의 규모가 점점 커지고 있다. 대표적인 사례는 인포노믹스(Infonomics), DAWEX, 귀양데이터거래소, 프라운호퍼 같은 곳이 그 대표적인 기관입니다.

국내에서는 데이터의 가치를 평가하고 그에 맞는 가격을 책정하는 노력은 비교적 최근에 이뤄져왔다고 할 수 있습니다. 그렇다고 데이터 이전에 데이터 거래가 없었다는 것은 아닙니다. 전통적인 데이터거래는 데이터 구축을 전문업체에 비용과 함께 의뢰하고 완성된 데이터베이스를 납품 받는 형식으로 이뤄졌습니다. 이러한 모델은 다소 폐쇄적이고 제한적인 거래라고 할 수 있습니다. 그리고 데이터의 가격은 데이터 구축에 필요한 인건비 수준에서 책정되었습니다.

그러나 4차산업혁명의 시대에 들어서 데이터의 중요성과 가치가 높아지고 이를 찾는 기업이나 연구소 등이 많아지면서 데이터거래 시장은 폐쇄형에서 오픈마켓 형태의 데이터 거래소를 변화해 나가고 있습니다. 국내에서도 한국데이터거래소데이터스토어를 중심으로 데이터 거래가 이뤄지고 있습니다.

https://kdx.kr/main

이런 변화하는 시장환경에서 데이터의 가치평가와 가격 평가는 자연스럽게 중요한 문제로 떠오르고 있습니다.

그러나 이러한 데이터의 가치평가는 몇가지 어려움을 가지고 있습니다.

첫째, 데이터는 경험재이기 때문에 사용하기 전에 그 가치를 미리 평가한다는 것이 어렵다는 것입니다. 이는 소비자의 활용능력에 따라 가치의 변동이 심하다는 특징을 포함하고 있어 일방적인 기준으로 가치를 판단을 한다는 것이 쉽지 않기 때문입니다.

둘째, 데이터는 한 사람이 재화나 서비스를 소비하여도 다른 사람이 그 재화나 서비스를 소비할 수 있는 양이 감소하지 않는 비경합재의 성경이 있기 때문입니다. 이는 한번 생산에 많은 비용이 들어가지만 이를 복제하는데는 약간의 노력만으로 가능하며 복제한다고 해서 원본 데이터가 손상되는 것이 아닌 특징이 있기 때문에 무한정 복사가 가능하고 이러한 특징은 소모할 수록 줄어드는 전통적인 재화의 가치평가와는 다른 것입니다.

셋째, 사용자의 의도에 따라 용도가 무한정으로 변화하기 때문에 수요를 예측하기 어렵다는 것입니다. 이는 같은 데이터라도 각각의 사용방법이 다르고 그로 인해서 창출하는 가치가 다르다는 특징이 있고 또 다른 데이터라도 같은 목적으로 사용되는 경우가 있어서 이것을 모두 예측하고 그 가치를 평가한다는 것은 불가능합니다.

이 외에도 데이터는 무료라는 인식과 데이터 컨텐츠의 품질은 공급자만 알 수 있다는 것도 데이터 가치 측정이 어려운 이유 중에 하나입니다.

그러나 이런 상황에도 불구하고 데이터의 가치평가와 그에 맞는 가격책정은 중요한 이슈입니다. 그렇기 때문에 각 기업에서는 데이터를 거래하는 주체들에게 합리적인 가치판단 기준을 제공하고자 노력하고 있습니다.

https://www.dawex.com/en/product/

DAWEX의 경우는 데이터를 평가하는 기준으로 위와 같은 기준들을 정하고 있습니다. 특이한 것은 데이터 자체의 특징이나 가치도 중요하지만 데이터 생산자의 평판이나 신뢰도를 중요하게 생각한다는 것입니다. 이는 데이터 거래의 중요한 특징이라고 할 수 있습니다. 대부분 데이터는 어떤 의사결정에 중요한 지표로 사용되기 때문에 신뢰할 수 있는 곳에서 생산된 정보여야지만 이를 통해서 내릴 수 있는 결정 역시 신뢰할 수 있기 때문입니다.

중국 구이양 빅데이터 거래소
http://www.gbdex.com/website/view/dealPlat-index.jsp

우리나라 역시 데이터의 가치평가를 위해서 몇가지 기준을 산정하고 있습니다. 데이터스토어에서는 “원가기준 가격책정”과 “경쟁사기준 가격정책”으로 나눠서 가격을 산정하고 있습니다.

데이터가격산정정책
https://www.datastore.or.kr/bizone/calculation/info

프라운호퍼는 독일정부출연 연구기관으로 데이터기반 사업자가 사업을 위해 구매하게 되는 데이터소스의 가치비교를 위한 모형을 개발하여 3가지 영역에 18개 평가지표를 제안하고 이를 공유하고 있습니다. 이밖에도 데이터를 평가하기 위한 다양한 방법론은 분석하고 평가하고 있습니다.

데이터의 가치가 곧 가격이라는 공식은 성립되지 않습니다. 그 가치는 활용의 목적에 따라서 각기 다르기 때문입니다. 그러나 가치를 올바로 평가하고 산정하는 일관적인 프로세스는 필요합니다.

첫째, 평가 대상의 선정과정입니다. 이때 타겟 데이터상품을 정의하고 유사상품을 수집하는 과정의 포함됩니다.
둘째, 가치평가지표 도출과정입니다. 이때 개념적 가치평가지표를 개발하고 이를 계량화하는 노력이 필요합니다. 이러한 지표 도출과 계량화는 데이터가 생산된 산업 도메인마다 차이가 존재합니다. 이런 도메인간의 차이를 이해하고 적절히 분석하는 것이 필요합니다. 특히 비정형 데이터의 경우는 데이터의 정량적인 사이즈도 중요하지만 수집된 정보의 출처와 품질이 중요합니다.
셋째, 상품간 가치비교 과정입니다. 이는 지표별 가중치를 산출하여 가치를 평가하고 가능하다면 유사 산업 도메인의 데이터를 함께 평가해보는 것도 중요합니다.

빅데이터 분석 플랫폼

• 1강 데이터의 이해
◦ 강좌소개
◦ 데이터의 이해
◦ 데이터 마이닝이란

• 2강 빅데이터의 이해
◦ 빅데이터의 이해
◦ 빅데이터의 출현 배경
◦ 빅데이터 활용사례

• 3강 빅데이터 처리기술의 이해
◦ 빅데이터 처리시스템의 이해
◦ 빅데이터 처리시스템의 설계원칙

• 4강 하둡분산 데이터저장기술
◦ 하둡분산시스템 이해
◦ HDFS
◦ MapReduce

• 5강 하둡에코시스템
◦ 하둡에코시스템의 이해
◦ Sql-on-Hadoop
◦ hive
◦ HBase

• 6강 가상화 플랫폼 : Docker
◦ 가상화 플랫폼의 이해
◦ 도커의 역사
◦ 도커의 특징
◦ 도커 설치 실습

• 7강 하둡 설치
◦ 하둡 설치 실습
◦ 주요 명령어
◦ 예제

• 8강 아파치 스파크 이해1
◦ 하둡의 문제점
◦ 인메모리 데이터처리 시스템의 등장
◦ 아파치 스파크의 등장

• 9강 아파치 스파크 이해2
◦ 스파크의 장점
◦ RDD의 개념
◦ 스파크 스크립트

• 10강 데이터 분석 방법론
◦ 빅데이터분석 방법론

• 11강 4차산업혁명과 빅데이터
◦ 4차 산업혁명의 이해
◦ 4차 산업혁명의 특징
◦ 인공지능의 역사

• 12강 빅데이터와 인공지능
◦ 인공지능의 역사
◦ 인공지능, 머신러닝, 딥러닝
◦ 딥러닝의 현재
◦ 딥러닝 알고리즘 소개

데이터 법률

어떤 문제가 발생했을 경우 그 분쟁을 해결하기 위해서 보통 법원의 판결을 받습니다. 그리고 법원은 이러한 소송이 발생할 경우에 판사의 자의적인 판단이 아닌 법전의 정의에 기초하여 분쟁의 판결을 내립니다. 그렇기 때문에 법전에 정의되어 있지 않은 용어로 인해서 법적인 판단을 구하는 것은 불가하죠.

그렇다면 최근에 많은 이슈와 분쟁의 원인이 되는 데이터와 개인정보에 대해서는 법으로 어떻게 정의하고 있을까요?

https://ko.wikipedia.org/wiki/data

데이터란?
정보처리능력을 갖춘 장치를 통하여 생성 또는 처리되어 기계에 의한 판독이 가능한 형태로 존재하는 정형 또는 비정형의 정보를 말함 (데이터기반행정 활성화에 관한 법률)

개인정보란?
살아 있는 개인에 관한 정보로서 성명, 주민등록번호 및 영상 등을 통하여 개인을 알아볼 수 있는 정보와 해당 정보만으로는 특정 개인을 알아볼 수 없더라도 다른 정보와 쉽게 결합하여 알아볼 수 있는 것 즉, 가명정보도 포함(개인정보보호법)

최근까지 정부는 이러한 개인정보의 유출을 엄격히 법으로 금지하고 있었습니다. 그러나 정부는 4차산업혁명 대응을 위해서 개인정보를 기존의 규제에서 개방으로 그 정책을 변경하면서 데이터 이용을 활성화하는 「개인정보 보호법」, 「정보통신망 이용촉진 및 정보보호 등에 관한 법률(약칭 : 정보통신망법)」, 「신용정보의 이용 및 보호에 관한 법률(약칭 : 신용정보법)」등 3가지 법률을 개정하게 됩니다. 이것을 “데이터 3법”이라고 합니다.

좀 더 자세히 설명하면 이는 미래 신산업 이라고 할 수 있는 인공지능, 클라우드, 사물인터넷 등 신기술의 활용과 발전을 위해 데이터의 이용이 필수적인 상황에서 데이터의 활용을 촉진하는 한편 정보주체의 권리를 강화하고 개인정보보호의 콘트롤 타워로서 개인정보보호위원회의 위상을 제고하는 것이 주요 내용이라고 할 수 있습니다.

“4차 산업혁명 시대를 맞아 핵심 자원인 데이터의 이용 활성화를 통한 신산업 육성이 국가적 과제로 대두되고 있다. 특히, 신산업 육성을 위해서는 인공지능(AI), 인터넷기반 정보통신 자원통합(클라우드), 사물인터넷(IoT) 등 신기술을 활용한 데이터 이용이 필요하다. 한편 안전한 데이터 이용을 위한 사회적 규범 정립도 시급하다. 데이터 이용에 관한 규제 혁신과 개인정보 보호 협치(거너번스) 체계 정비의 두 문제를 해결하기 위해 데이터 3법 개정안이 발의됐다.” (대한민국정책브리핑, 데이터 3법)

데이터3법의 주요 내용을 크게 3가지 특징으로 이야기 할 수 있습니다.

첫째 개인정보는 민감정보, 성명, 주민등록번호, 영상 정보 등을 통하여 개인을 알아볼 수 있는 정보 외에도 “해당 정보만으로는 특정 개인을 알아볼 수 없더라도 다른 정보와 쉽게 결합하여 알아볼 수 있는 정보”로 구분했습니다.

둘째, 가명정보를 “개인정보의 일부를 삭제하거나 일부 또는 전부를 대체하는 등의 방법으로 추가정보 없이는 특정 개인을 알아볼 수 없도록 처리(이하 “가명처리”)함으로써 원래의 상태로 복원하기 위한 추가정보의 사용·결합 없이는 특정 개인을 알아볼 수 없는 정보”로 정의하고, 통계작성, 과학적 연구, 공익적 기록보존 등 목적을 위해서는 정보주체의 동의 없이 처리할 수 있도록 했습니다.

셋째, 시간·비용·기술 등을 합리적으로 고려할 때 다른 정보를 활용하여도 더 이상 개인을 알아볼 수 없는 정보(익명정보)에 대해서는 법을 적용하지 않는다는 점을 규정했습니다.

다음의 내용은 “대한민국정책 브리핑”에서 제공하는 내용을 정리한 것입니다. 자세한 내용은 해당 링크를 참조하시기 바랍니다.

① 개인정보 보호법 개정안
개인정보의 개념을 명확히 해서 혼선을 줄이고, 안전하게 데이터를 활용하기 위한 방법과 기준 등을 새롭게 정했다. 데이터를 기반으로 한 새로운 기술·제품·서비스의 개발, 산업 목적을 포함하는 과학연구, 시장조사, 상업 목적의 통계작성, 공익 기록보존 등을 위해서 가명정보를 이용할 수 있도록 했다.
개인정보처리자의 책임성을 강화하기 위해 각종 의무를 부과하고, 법 위반 시 과징금 도입 등 처벌도 강화해서 개인정보를 안전하게 보호할 수 있도록 제도적 장치를 마련했다.
개인정보의 오·남용과 유출 등을 감독할 감독기구는 개인정보보호위원회로, 관련 법률의 유사·중복 규정은 「개인정보 보호법」으로 일원화했다.
개정 목적 및 주요 내용
ㅇ 데이터 기반의 신산업 육성과 양질의 일자리 창출에 기여
ㅇ 일원화된 개인정보 보호체계를 통해 기업과 국민의 혼란 방지와 체계적 정책 추진
ㅇ EU GDPR 적정성 평가의 필수 조건인 감독기구의 독립성 확보

② 정보통신망법 개정안
개정 목적 및 주요 내용
ㅇ 정보통신망법 내 개인정보 관련 다른 법령과의 유사·중복조항 정비와 협치(거버넌스) 개선
ㅇ 개인정보 보호 관련 사항은 「개인정보보호법」으로 이관
ㅇ 온라인상 개인정보 보호 관련 규제와 감독 주체 ‘개인정보보호위원회’로 변경

③ 신용정보법 개정안
개정 목적 및 주요 내용
ㅇ 빅데이터 분석·이용의 법적 근거 명확화와 빅데이터 활용의 안전장치 강화
ㅇ 「개인정보 보호법」과의 유사ㆍ중복 조항을 정비하는 등 데이터 경제의 활성화를 위한 규제 혁신
ㅇ 금융분야 데이터산업으로서 신용정보 관련 산업에 관한 규제체계 선진화
ㅇ 새로운 개인정보 자기결정권의 도입
ㅇ 금융분야 빅데이터 분석 및 이용에 법적 근거 명확화
ㅇ 개인정보보호위원회 기능 강화
ㅇ 신용정보 관련 산업의 규제체계 선진화 등

이러한 법률 개정에 가장 큰 변화중에 하나는 가명정보를 3가지 조건하에서는 동의없이 사용할 수 있도록 했다는 것입니다.

신용정보법 개정안 중 개인정보, 가명정보, 익명정보의 개념과 활용범위

정리해보면 데이터3법은 데이터의 활용, 보호, 거버넌스 관점에서 빅데이터 분석과 이용에 법적 근거가 마련되었다는데 중요한 의의를 가질 수 있습니다.

다만 아직도 정비할 여러가지 여지가 있는 것도 사실입니다. 특히 개인정보보호법에서는 “당초 수집목적과 합리적으로 관련된 범위”에서 데이터를 이용할 수 있다고 정의하고 있고 신용정보법에서는 “당초 수집한 목적과 상충되지 아니하는 목적으로 이용하는 경우”로 규정하고 있는 부분들이 있어 해당 법간의 범위에 차이가 있어 향후 조정의 여지가 필요하다는 것이 전문가들의 주장입니다.

또 개인정보보호위원회가 개인정보보호법을 관장하는 독립적 감독기관이 되었지만 신용정보에 대해서는 금융위원회가 신용정보법 소곤 부서로 역활을 수행하는 부분도 역시 조율이 필요한 부분입니다.

데이터 경제

데이터는 4차 산업혁명을 견인하는 핵심 동인으로 데이터 경제는 데이터, 데이터 기술, 데이터 제품 및 서비스에 기반한 경제로 정의됩니다. 이는 4차 산업혁명과 맞물려 데이터가 모든 산업의 발전과 새로운 가치 창출의 촉매 역할을 하는 현재 산업의 전반적인 흐름을 보여주는 용어라고 할 수 있겠습니다.

이 데이터 경제의 정의는 2011년 데이비드 뉴먼의 가트너 보고서(How to Plan, Participate and Prosper in the Data Economy)에서 데이터 경제의 개념이 처음 등장했습니다. 이 보고서에서 빅데이터, 오픈데이터, 연결데이터 등 데이터로 파생되는 경제를 아우르는 용어로 표현되었습니다.

데이터 경제는 어려운 용어이지만 쉽게 정의한다면 “데이터 경제란 모든 유형의 데이터를 분석한 정보를 자산으로 새로운 가치(혁신적 비지니스 모델, 수익성장 등)를 창출하며 성장하는 신흥 경제를 지칭” 한다고 할 수 있습니다.

이러한 데이터 경제를 통해서 파생되는 산업이 데이터 산업으로 데이터의 생산, 수집, 처리, 분석, 유통, 활용 등을 통해 가치를 창출하는 상품과 서비스를 생산하고 제공하는 산업입니다.

https://www.bbc.com/news/entertainment-arts-41559076

한때는 데이터를 3차 산업혁명의 동력이었던 원유에 비유하여 “Data is the new Oil”이라는 말이 있었습니다. 그러나 데이터가 4차 산업혁명의 중요한 동력인것은 맞지만 데이터를 물리적인 재화인 원유와는 차별되어야 한다는 개념이 최근 등장하고 있고 그 이론이 많은 동의를 얻고 있습니다.

특히 데이터는 원유나 기타 물리적인 재화들과는 달리 “비경쟁, 비고갈, 재생, 무제한, 쉽게 운반, 저렴한 가격, 복제가 쉬움, 생태계 존재 등” 다양한 특징이 있습니다.

데이터 경제의 가치창출은 다음과 같은 “공급-수요”가 있고 그 안에 데이터를 유통하고 수용자를 찾아 연결해주는 “중개”가 존재합니다. 중개의 역활은 데이터의 유통과 활용 가이드를 통해서 공급자와 수요자의 매개 역활을 수행합니다.

데이터 산업 활성화 전략 – 4차산업혁명위원회

이러한 데이터 산업은 2019년부터 데이터 분석, 연결, 권리 등으로 발전하고 있습니다. 특히 EU는 GDPR(General Data Protection Regulation)을 통해서 개인의 데이터권리를 보호하도록 사업자의 의무와 벌칙을 강화하고 있습니다. 우리나라도 데이터3법을 통해서 데이터의 사용성을 넓히되 개인의 권리를 보호하는 법안들이 통과되어 실행되고 있습니다. 추후에 데이터3법에 대한 내용을 정리해보겠습니다.

이러한 예전에 없던 신산업이 등장하면서 우리나라도 관련 분야의 신규인력 확충을 위해서 기업과 정부차원의 노력이 계속되고 있습니다.
국내 데이터산업에 종사하고 있는 인력은 총 31만 8,062명으로 전년 대비 7.9% 증가했습니다. 향후 5년 내에 일반산업을 포함하여 전 산업에서 필요로 하는 데이터 직무 인력은 총 2만 2,607명이고 데이터 개발자, 데이터 분석가 순으로 많이 필요하다고 조사되고 있습니다.

향후 5년 내 전산업의 데이터직무 빅데이터 관련 필요 인력
https://kosis.kr/statHtml/statHtml.do?orgId=127&tblId=DT_127004N_122

그러나 이러한 필요에도 불구하고 국내 데이터 경제 발전을 저해하는 몇가지 장애 요인이 있습니다.

첫째, 데이터 활용에 대한 낮은 인식
• 짧은 데이터 활용의 역사로 인해 데이터 활용을 통한 가치 창출에 대한 이해 및 인식 부족
둘째, 데이터 전문 인력 부족
• 데이터산업을 제외한 타 산업의 업체들에 데이터 전문 인력이 공급되고 있지 않아 잠재적 활용 가능성을 가진 기업들의 데이터 활용 부진
셋째, 개인정보 활용 제약
• 개인정보보호법, 정보통신망법 등의 법제로 인해 개인정보 활용에 제약
• 지난 몇 년간 일어난 개인정보유출사건으로 인해 개인정보 활용에 대한 국민적 신뢰 부재
넷째, 데이터 상품 저작권 미비
• 데이터를 가공․분석한 결과에 대한 저작권이 법적으로 보호되지 않아 적극적으로 데이터 상품 개발을 추진할 유인 부족
다셋째, 활용 가능한 원시데이터 부족
• 민간부문에서 거래되는 데이터는 가공 또는 활용이 불가능한 통계형 데이터
• 데이터 분석․가공을 위한 민간부문의 원시 데이터의 양이 절대적으로 부족
여섯째, 공공데이터의 낮은 품질
• 공공데이터의 양은 절대적으로 많으나 이를 활용하기에는 데이터의 질이 너무 낮음
일곱째, 데이터 표준 부재
• 데이터 표준이 부재함에 따라 이종 데이터 간결합 비용 증가
여덟째, 데이터 수요자․공급자 파악의 어려움
• 데이터 거래에 참여할 의사가 있음에도 필요로 하는 데이터를 가진 공급자 또는 자신이 보유한 데이터를 구매할 수요자를 파악하기 어려움
아홉째, 데이터 가공․중개 업체 부족
• 데이터 가공․중개업체들은 데이터 상품 최종 수요자로부터 데이터 상품을 의뢰받고 이를 생산하기 위한 데이터 공급자들에게 데이터를 구매하여 최종 데이터 상품을 생산
• 하지만 데이터 공급자 및 구매자의 연결고리 역할을 하는 데이터 가공․중개 업체의 수가 절대적으로 부족
출처 : ICT기반 신산업 발전을 위한 데이터 거래 활성화 방안(정보통신정책연구원,2018)

연구는 이러한 장애요인을 데이터법제도 정비, 거래소 운영 및 거래정보 포털 운영, 데이터 가격 산정 가이드라인, 데이터 전문인력 양성 등으로 극복할 수 있다고 설명하고 있습니다.

종합하면 국내 데이터경제의 활성화를 위해서는 첫째, 데이터 활용 촉진을 위한 데이터 경제 거버넌스 구축. 둘째, 데이터 활용 촉진을 위한 공공 및 민간 분야의 최고 데이터분석책임관 제도 도입. 셋째, 민간 수요 확산을 견인할 데이터 경제 생태계 조성. 넷째, 데이터 거래 활성화를 위한 데이터 가격 산정방안 개발 및 확산 방안 구축. 다섯째, 데이터 주도 혁신을 위한 데이터 우선 문화 확산. 여섯째, 데이터 경제 발전을 위한 안전한 데이터 이용환경 구축이 필요합니다.
출처 : 데이터 경제 기반 정책 연구 최종 보고서(4차산업혁명위원회, 2018)

데이터 가치 사실은 가치창출활동, 제품이 개발되고 생산되어 판매되는 일련의 프로세스로 데이터 산업은 데이터를 수집, 인사이트를 도출, 분석결과 이용, 피드백 등 각 단계에 필요한 행위들을 정의하고 관리할 필요가 있습니다.

The Value Chain and Competitive advantage, Free Press, NewYork

데이터 거래 전문가는 어떠한 역할을 할까요?
그림에서와 같이 수집된 다양한 형태의 데이터 즉, 비정형 텍스트, 이미지, 동영상, 음성 데이터 등과 고객의 다양한 정보들, 센서 및 다양한 IoT 기기에서 발생하는 정보들을 결합 및 가공하여 잠재 고객 세그먼트를 생성하여 재판매하는 역할을 수행합니다.

전 세계적으로 약 4,000개 이상의 데이터 중개회사가 존재하며 그 규모도 2,000억 달러에 달합니다. 그러나 이러한 데이터 중개회사를 통한 고객 정보 유출과 같은 개인정보 및 보안 침해 사례가 발생하기도 하여 데이터의 이용과 활용에 법적인 제도 정비가 필요한 실정입니다.

https://clearcode.cc/blog/what-is-data-broker/

우리나라의 경우는 2019년부터 약 10개 분야의 빅데이터 생산/유통을 위한 빅데이터 플랫폼을 구축하고 운영(20년도 5개 분야 추가예정)하고 있습니다. 1차년도의 플랫폼 구축, 2차년도 분야별플랫폼 연계, 3차년도 데이터기반 유통시장확대 추진을 계획하고 있습니다.

국가데이터맵
https://www.data.go.kr/tcs/opd/ndm/view.do

범정부 데이터 플랫폼은 공공기관이 보유한 공공데이터의 소재와 메타데이터 정보를 통합관리하기 위한 목적으로 추진정인 범정부 사업입니다. 공공기관이 활용하는 모든 메타데이터는 기관 메타관리시스템으로 통합관리되고 범정부적 활용을 위해 메터데이터 정보는 용어, 형식을 표준화하여 데이터사전으로 관리됩니다.
범정부 데이터 플랫폼에 수집된 모든 공공데이터는 국가데이터맵을 통해 데이터의 소재 정보 및 연관관계를 시각화된 형식으로 제공됩니다.
범정부 데이터플랫폼의 주요 목표는 데이터 플랫폼 구축, 메터데이터 수집 체계 구축, 메타데이터 관리체계 구축, 국가데이터맵 구축입니다.

국가데이터맵의 개념 및 모델(TTA Journal, 2019)

Word2Vec 시각화

Word2Vec은 간단을 간단히 말하면 “문장안에 있는 여러 단어들을 벡터 형태로 표현하는 것” 말 그대로 Word to Vector라고 할 수 있습니다. 워드라는 말은 쉽게 이해할 수 있지만 벡터(Vector)는 어떤 뜻일까요?

물리학이나 수학에서 약간씩 차이가 있지만 공통적으로 어떤 공간에서 위치와 방향성을 가지는 값을 표현하는 것이라고 할 수 있습니다. 그러니까 문장에 많은 Word를 어떤 공간에 위치값을 표시할 뿐만아니라 이 값들이 어떤 방향성이 있는지를 표시하는 기법이 Word2Vec이라고 하겠습니다.

위의 이미지는 word2vec의 가장 유명한 그림 중에 하나입니다. 각 단어들을 보면 어떤 방향성이 있고 숫자 값을 가지고 있습니다. 그렇기 때문에 유사도를 계산 할 수도 있고 각 단어의 관계에 대한 연산이 가능합니다.
예를 들어서 “KING-MAN+WOMAN=QUEEN”이라는 관계가 나온다는 것이죠.
또 “한국-서울+도쿄=일본”라는 관계를 추출할 수 있습니다. 아래 링크를 방문해보시고 다양한 케이스를 테스트해보시기 바랍니다.
https://word2vec.kr/search/

이것은 전통적인 방법인 One-Hot-Encoding을 통해서 단어를 표현하는 것의 문제점을 극복할 수 있는 아주 유용한 방법입니다. 이렇게 단어들을 벡터로 바꾸는 것을 워드 임베딩(Word-Embedding)이라고 하고 그중에서 가장 대표적인 모델이 Word2Vec 모델로 해당 단어와 함께 자주 등장하는 단어는 비슷한 단어일것이라는 가정으로 출발합니다.

본 예제는 Word2Vec의 원리와 이론을 소개하는 것은 아니고 실제로 단어를 2차원 공간에 표시하는 방법에 대한 예제코드이기 때문에 해당 이론이 궁금하신 분들은 인터넷에 공개된 많은 예제들이 있으니 참고해보시기 바랍니다.

예제를 실해하기 위해서 먼저 필요한 라이브러리를 import합니다.
분석할 데이터는 인터넷 쇼핑몰의 마우스를 구매한 후에 남긴 후기들을 모은 것입니다. 예를 들어 제품의 이름을 선택했을 경우에 해당 단어와 가장 거리가 가까운 단어들이 긍정의 단어들이라면 제품의 평가가 좋을 것일테고 반대로 제품이 부정적인 단어들과 거리가 가깝다면 반대의 경우라고 생각할 수 있겠습니다.

import pandas as pd
import numpy as np

df_r = pd.read_excel("./mouse_review.xlsx")
df_r.head()

파일을 읽어온 뒤에 pandas의 head() 함수로 상위 5개의 데이터를 추출해봅니다.
데이터는 사용자, 작성일, 리뷰 내용, 별점, 제품명 정보가 있습니다.

이번에 사용할 text 정보는 리뷰 내용입니다. 리뷰에 보면 여러가지 특수기호, 영문자 등이 있기 때문에 정규식을 통해서 한글 외에 나머지 데이터를 걸러냅니다. 걸러낸 데이터는 review_train 컬럼을 만들어서 원본 데이터와 별도로 저장해둡니다.

df_r['review_train'] = df_r['review'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
df_r.head()

1차로 정규화를 끝낸 텍스트 데이터를 통해서 문장을 형태소별로 분리해줍니다. 또 사용하지 않는 단어들의 사전을 모아서 불용단어를 걸러냅니다. 분석하고자 하는 상황에 맞춰서 불용어를 등록해줍니다.

from konlpy.tag import Okt

stop_words = ['가','요','변','을','수','에','문','제','를','이','도','은','다','게','요','한','일','할','인데','거','좀','는데','ㅎㅎ','뭐','까','있는','잘','습니다','다면','했','주려','지','있','못','후','중','줄']

okt = Okt()
tokenized_data = []
for sentence in df_r['review_train']:
    temp_X = okt.morphs(sentence, stem=True) # 토큰화
    temp_X = [word for word in temp_X if not word in stop_words] 
    tokenized_data.append(temp_X)

이제 시각화를 위한 준비를 해줍니다. 시각화는 matplolib을 사용합니다.
한글화를 위해서 폰트를 설정해줍니다.
본 예제는 Mac OS환경에서 테스트 되었기 때문에 폰트의 위치는 Window 사용자와 틀릴 수 있으니 테스트 환경에 맞게 폰트 정보를 변경해줍니다.

import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname='/System/Library/Fonts/Supplemental/AppleGothic.ttf').get_name()
rc('font', family=font_name)

리뷰 텍스트의 정보들을 간단히 표시해줍니다.
학습에 필요한 단계는 아니니 데이터에 대한 정보를 보고자 하지 않는다면 그냥 넘어가셔도 되겠습니다. 본 예제에 사용된 데이터는 대부분 길이가 0~50글자 사이의 비교적 짧은 문장들이라는 것을 알 수 있습니다.

print('리뷰의 최대 길이 :',max(len(l) for l in tokenized_data))
print('리뷰의 평균 길이 :',sum(map(len, tokenized_data))/len(tokenized_data))
plt.hist([len(s) for s in tokenized_data], bins=50)
plt.xlabel('length of samples')
plt.ylabel('number of samples')
plt.show()

이제 Word2Vec 모델을 생성할 차례입니다.
Word2Vec 모델은 가장 잘 알려진 gensim 라이브러리를 활용해보겠습니다.

사용한 파라메터의 자세한 정보는 아래 링크를 참조해보시기 바랍니다.
본 모델은 좌우 5개의 단어를 참조하는 100차원의 워드 벡터를 만드는 모델로 cobow 알고리즘을 사용하고 최소 5번 이하로 등장하는 단어들은 제외하겠습니다. worker는 thread의 갯수로 테스트하는 하드웨어의 성능에 따라서 조정할 수 있습니다.
https://radimrehurek.com/gensim/models/word2vec.html

from gensim.models import Word2Vec
model = Word2Vec(sentences = tokenized_data, size = 100, window = 5, min_count = 5, workers = 4, sg = 0)

학습 데이터가 많지 않기 대문에 학습 시간은 오래 걸리지 않습니다.
학습이 끝난 후에 단어들을 추출해서 벡터 리스트를 생성합니다. 해당 리스트 하나를 출력해보면 아래와 같은 데이터가 표시됩니다.

vocabs = model.wv.vocab.keys()
word_vocab_list = [model.wv[v] for v in vocabs]
array([ 0.45729467, -0.45482287,  0.2776271 , -0.38435346,  0.4311736 ,
       -0.36617622,  0.12129851, -0.309033  , -0.09569103, -0.27311006,
        0.28018764, -0.13276236,  0.13590969,  0.0521839 , -0.01882668,
        0.13234554, -0.02577238,  0.43111804, -0.6007069 ,  0.52846146,
        0.01065135, -0.20410554,  0.08504212, -0.5189065 ,  0.06219423,
       -0.10900757,  0.19578645, -0.01295294, -0.20757432, -0.17270625,
        0.08728364,  0.4751571 , -0.06208701, -0.3829262 ,  0.4810491 ,
       -0.27205822, -0.16547562, -0.2804698 ,  0.1357591 ,  0.16740464,
        0.53618526, -0.17420012,  0.06363445,  0.655636  ,  0.05952126,
       -0.6312642 ,  0.11448789, -0.00824977, -0.26018238, -0.33553734,
        0.18489622,  0.03913857, -0.5856825 , -0.08111028,  0.6696569 ,
        0.4201213 , -0.2061224 , -0.03785964, -0.0813726 ,  0.0297378 ,
       -0.5556496 , -0.0006753 ,  0.25876167,  0.08983239, -0.10351149,
        0.24005203,  0.21328437,  0.0797505 , -0.23059952, -0.32846287,
       -0.0017608 ,  0.51077896,  0.36693272,  0.2767188 , -0.47870687,
       -0.3036568 , -0.06708886, -0.4789917 , -0.08152916,  0.19817959,
        0.07031752, -0.34857494,  0.5963662 ,  0.02050934,  0.29983994,
        0.07854129,  0.40096822,  0.00098353, -0.26964054, -0.12954848,
        0.33181033, -0.07866482,  0.40206903, -0.37808138, -0.10669091,
       -0.15223539, -0.01180514, -0.13499472,  0.31345636,  0.08265099],
      dtype=float32)

Word2Vec에서 제공하는 함수인 most_similar()를 통해서 입력하는 단어와 가장 가까운 단어 정보를 표시해봅니다. “클릭”과 가장 가까운 단어는 “버튼”,”소리” 등의 순서로 각 단어간의 연관성이 매우 높다는 것을 알 수 있습니다.

아마도 마우스라는 제품의 특징상 클릭이라는 단어와 함께 버튼, 소리, 게임, 느낌 등의 단어가 많이 등장했다는 것을 알 수 있습니다.

print(model.wv.most_similar("클릭"))
[('버튼', 0.9999016523361206), ('소리', 0.9998948574066162), ('게임', 0.9998838305473328), ('느낌', 0.9998810291290283), ('아니다', 0.9998774528503418), ('되다', 0.9998745918273926), ('이나', 0.9998740553855896), ('만', 0.9998738765716553), ('재질', 0.9998738169670105), ('누르다', 0.9998728036880493)]

이제 각 단어와의 관계를 그래프로 나타내보겠습니다. 해당 데이터는 100차원의 데이터이고 그려보고자 하는 것은 2차원에 표시되는 그래프이기 때문에 차원을 축소할 필요가 있습니다.

잘알려진 차원축소 알고리즘으로 PCA기법이 있습니다.

PCA(Principal Component Analysis)는 차원축소(dimensionality reduction)와 변수추출(feature extraction) 기법으로 널리 쓰이고 있는 기법으로 데이터의 분산(variance)을 최대한 보존하면서 서로 직교하는 새 기저(축)를 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법입니다. 
https://ratsgo.github.io/machine%20learning/2017/04/24/PCA/

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
xys = pca.fit_transform(word_vocab_list)
xs = xys[:,0]
ys = xys[:,1]

#plt.figure(figsize=(10 ,10))
plt.scatter(xs, ys, marker = 'o')
plt.xlim(0,1), plt.ylim(0,0.01)
for i, v in enumerate(vocabs):
    plt.annotate(v, xy=(xs[i], ys[i]))

해당 기법을 통해서 아래와 같은 그래프를 그렸습니다. 해당 그래프는 전체 그래프에서 일부 구간(xlim, ylim)을 표시한 것으로 전체 데이터는 아닙니다.

높은 차원의 데이터를 평면으로 축소하면서 데이터의 구간이 많이 겹치는 것을 알 수 있습니다. 이러한 문제는 데이터를 더 높은 차원의 공간(3차원)에 표시한다던가 아니면 의미 없는 데이터들을 추출해서 데이터의 수를 줄여서 표시할 수도 있습니다.

Abstract Class와 Interface Class

추상클래스(Abstract Class)와 인터페이스(Interface) 대해서 알아보겠습니다.

추상화에 대한 이야기는 이미 객체지향언어의 특징에서 다뤘기 때문에 간단히 설명하고 넘어간 후 추상클래스를 어떻게 만드는지에 대해서 알아보겠습니다.

추상화는 객체에서 어떤 공통된 요소들(Attribute, Method)를 추출해서 클래스를 만드는 것이라고 했습니다. 그렇다면 추상화된 클래스는 일반 클래스와는 그 성격이 어떻게 다를까요?

일반 클래스는 new 라는 명령어를 통해서 객체를 만들어 낼 수 있지만 추상클래스는 new 라는 명령어를 통해서 객체를 만들어 낼 수 없고 상속이라는 과정을 통해서 객체를 구현해야 합니다. 자바에서는 이러한 클래스를 일반 클래스와 차별적으로 abstract class라고 표현합니다. 참고로 일반 클래스는 abstract를 붙이지 않습니다.

메서드도 마찬가지입니다. 일반 메서드는 구현체가 존재하지만 추상 메서드는 구현체가 존재하지 않고 이를 상속 받는 클래스에서 구현할 수 있도록 선언만 해줍니다. 이렇게 선언만 한 메서드를 추상메서드라고 표현하며 메서드의 앞에 abstract를 붙여줍니다.

클래스를 선언할 때에 하나라도 추상메서드가 포함된 클래스는 추상클래스가 됩니다.

그러다면 추상 클래스는 왜? 그리고 언제 사용하는 것일까요?

만약 게임 캐릭터를 만든다고 가정해봅니다.
캐릭터는 여러가지가 있겠죠. 기사, 궁수, 마법사, 힐러 등…

이러한 캐릭터에서 공통적인 요소들을 만들어 낼 수 있을까요?

캐릭터의 체력, 스피드, 키, 체중, 달리기, 걷기, 점프 등의 요소들을 공통적인 요소로 만들 수 있을 것입니다. 그리고 그 요소들을 Unit 이라는 추상클래스를 만들고 모든 게임 캐릭터는 해당 유닛 클래스를 상속하도록 만들 수 있을 것입니다.

public abstract class Unit {
	private String name;
	private int point_x;
	private int point_y;
	private int stamina;
	private int height;
	private int weight;
	
	
	public Unit(String name, int x, int y) {
		this.name = name;
		this.point_x = x;
		this.point_y = y;
	}
	
	public void move(int x, int y) {
		point_x += x;
		point_y += y;
	}
	
	public String getName() {
		return name;
	}
	
	public int getPointX() {
		return point_x;
	}
	
	public int getPointY() {
		return point_y;
	}
	
	public abstract void weapon();
	public abstract void jump();
	public abstract void run();
	
}

게임 프로젝트의 설계자는 이제 각 캐릭터 개발자에게 Unit 클래스를 상속해서 각기 캐릭터를 만들라고 지시 할 수 있을 것입니다. 그렇게 된다면 각 개발자들은 각 캐릭터마다 체력, 스피드, 키, 체중 등의 요소를 지정하고 달리고, 걷고, 점프 하는 동작들을 구현할 수 있을 것입니다.

이런 설계는 개발하면서 굉장히 중요한 부분입니다.
만약 이런 부분이 없이 각가의 개발자에게 캐릭터를 만들어 내라고 한다면 아마도 많은 혼란이 있을 것입니다. 만들어진 코드도 동일한 행위를 하는 다양한 이름으로 구현될 것입니다. 또 각각의 객체에 정의하는 초기값도 역시 프로그래머 각각 정의하게 될테니 개발하는 과정에서 많은 시간과 자원이 낭비될 것입니다.

이러한 것을 방지하기 위해서 추상클래스를 정의하고 이를 상속하도록 하는 것이 프로그램의 통일성을 주는데 용이합니다.

그렇다면 인터페이스는 언제 사용하는 것일까요?

인터페이스는 추상클래스와 비슷한 점이 많습니다. 다만 차이가 있다면 인터페이스는 공통적인 객체의 정의라기 보다는 행위에 집중합니다. 즉 구현체가 같은 행위를 한다는 것을 보장한다는 것입니다.
그렇기 때문에 추상클래스는 상속이라고 표현하지만 인터페이스는 행위의 구현이라고 표현합니다.

예를 들어서… 다른 언어를 한국어로 번역을 하는 프로그램을 만들어 본다고 생각해봅니다. 설계자는 번역의 행위에 집중할 것입니다. 다른 언어를 한국어로 번역하는 행위, 한국어를 다른 어로 번역하는 행위 이렇게 행위를 정의할 것입니다. 그리고 이 두행위를 하는 인터페이스 클래스를 만듭니다.

public interface TranslateInterface {
	public String translate2korean(String sentence);
	public String translate2foreignlanguage(String sentence);
}

이 인터페이스 클래스에는 두가지 역할을 하는 메서드 외에는 존재하지 않습니다. 그리고 이 파일을 다른 개발자들에게 나눠주고 이 파일을 통해서 인터페이스의 미구현 부분을 구현(implement)하라고 할 것입니다. 개발자들은 이 파일을 통해 각각 번역기를 구현할 때에 어떻게 구현해야 하는가에 대하여 고민할 필요가 없이 translate2korean, translate2foreignlanguage 메서드를 구현할 것이며 방식 역시 각가의 메서드에 source 문장을 주고 target 언어로 리턴하는 부분을 구현하면 됩니다.

지금까지 설명드린 것처럼 인터페이스와 추상클래스는 상속(혹은 구현)하는 과정을 통해서 프로그램을 더 명식적으로 만들어주고 협업시에 효율을 높여줍니다. 코드의 유지보수나 재사용에도 큰 장점이 있습니다.

객체지향 언어의 특징

캡슐화(Encapsulation)

보통의 사용자가 스마트폰을 사용하는데는 스마트폰의 구조와 작동원리에 대한 지식 보다는 사용에 필요한 기능이 무엇인지 또 어떤 때에 어떻게 사용하는지에 대해서만 알면 됩니다. 터치를 했을 경우에 소프트웨어가 어떻게 동작하고 하드웨어가 어떻게 동작하는지에 대해서 몰라도 사용하는데는 지장이 없습니다.

만약 기기가 전부 오픈되어 있어서 사용자가 조작하지 말아야 할 부분까지 만질 수 있도록 되어 있다면 친절하다기 보다는 사용자의 실수나 기기의 고장의 원인이 될 것입니다.

프로그램도 마찬가지로 사용자가 내부의 주요 소스코드에 접근하는 것은 오히려 좋지 않습니다. 많은 변수들이 내부에서 생성되고 소멸되는데 그런 민감한 변수들을 조작하는 것은 프로그램 오류의 원인이 됩니다.

개발자는 이러한 것을 미연에 방지하도록 주요 로직과 변수들을 숨기고 오직 사용자가 최소한의 프로그램 동작에 필요한 것들만 접근하고 사용할 수 있도록 하는 것이 좋습니다.

이러한 것을 객체지향의 캡슐화 혹은 정보은닉이라고 표현합니다.

추상화(Abstraction)

추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념이나 기능을 간추려 내는 것이라고 할 수 있습니다.

예를 들어 여러 브랜드의 다양한 자동차가 있습니다. 모든 자동차들은 그 종류에 따라서 크기, 무게, 넓이, 높이 등의 차이가 있습니다. 그러나 이러한 차이에도 불구하고 모든 자동차들을 잘 관찰하면 몇가지 공통된 특징을 찾아 낼 수 있습니다.

스티어링 휠, 바퀴, 주행장치, 제동장치, 문, 헤드라이트 등 공통점을 찾아내서 하나의 기본 개념을 만듭니다. 이렇게 만들어진 객체를 추상화된 객체라고 할 수 있습니다. 추상화된 객체는 “IS A”관계로 나타낼 수 있습니다. 즉, “기아자동차의 K7은 자동차이다”라는 관계를 만들어 낼 수 있습니다. 이와 마찬가지로 “현대자동차의 그랜저는 자동차이다”라는 관계가 맺어집니다. 이렇게 하면 자동차로부터 추상화된 객체는 “IS A” 관계가 됩니다.
그러나 “자동차는 K7이다.” 관계는 좀 어색합니다.

이 개념은 간단하지만 추상화의 매우 중요한 개념입니다.

같은 개념을 이전 프로그램 코드로 본다면 사람의 모든 특징을 조합하여 Human이라는 추상클래스를 만들었다고 생각해 봅니다. 그리고 Man 이라는 인터페이스 클래스를 만듭니다. 이제 Human + Man = Adam 이라는 클래스를 만들었습니다.

이 Adam이라는 객체를 통해서 “David”, “John” 객체를 만듭니다.
이렇게 하면 David ≠ John 이지만 Human = David, Human = John의 관계는 성립하게 됩니다.

public class HumanDemo {
	public static void main(String[] args) {
		Adam david = new Adam("David", 180, 80);		
		Human john = new Adam("John", 178, 75);
		Man mark = new Adam("Mark", 178, 75);
	}
}

이렇게 추상화한 객체와 이를 상속 받은 객체 사이에 “IS A”의 관계가 성립한다는 것이 추상화의 중요한 개념입니다.

상속(Inheritance)

상속은 추상화된 클래스 즉, 객체의 일반적인 특성이 정의된 클래스를 사용하여 새로운 객체를 만드는 것을 의미합니다. 단 추상화된 클래스는 반드시 추상클래스라는 의미는 아니니 혼동 없으시기 바랍니다.

이는 보통 부모-자식 클래스 혹은 상위-하위 클래스로도 이름할 수 있습니다. 앞으로는 자식 클래스로 이름하겠습니다. 부모 클래스는 super를 통해서 접근이 가능합니다.

자식클래스는 부모 클래스의 속성을 물려 받을 수 있습니다. 별도로 정의하지 않아도 되지만 필요하다면 정의할 수도 있는데 이것을 Overriding이라고 합니다.

이러한 상속의 개념을 이해하고 설계에 반영하면 객체의 재사용이나 기능 추가 혹은 유지보수 등에 큰 장점이 있습니다.

자바(JAVA)에서 상속은 extends를 통해서 가능하고 extends를 통해서는 단일 상속 밖에는 지원하지 않습니다. 그러나 interface class의 경우 implements를 통해서 다중 상속도 가능합니다.

다형성(Polymorphism)

객체지향의 특징에서 가장 이해하기 어려운 개념이 바로 다형성 개념일 것입니다. 다형성은 말 그대로 상속 받은 메서드가 자식 클래스에서 다양한 방식으로 개발 할 수 있도록 허용하는 것이다. 이 다형성이 상속과 연계되어서 자바의 높은 언어적인 효율성이 발휘된다고 할 수 있습니다.

이 다형성을 잘 이해하고 설계하면 코드도 간결해질 뿐더러 변화에도 유연하게 대처할 수 있습니다.

아래의 코드는 일반적인 형태의 코드입니다. 한국인, 중국인, 영국인 객체를 선언하고 각각 모국어를 말하는 클래스입니다. 이 세 객체는 “말한다”라는 하나의 기능을 수행하는 메소드를 가지고 있지만 각기 다른 이름으로 구현되어 있습니다.

package ch01;

public class SpeakDemo {
	public static void main(String[] args) {
		Korean k = new Korean();
		Chinese c = new Chinese();
		Briton b = new Briton();
		
		k.speakKorean();
		c.speakChinese();
		b.speakEnglish();
	}
}

class Korean {
	public void speakKorean() {
		System.out.println("한국어");
	}
}

class Chinese {
	public void speakChinese() {
		System.out.println("중국어");
	}
}

class Briton{
	public void speakEnglish() {
		System.out.println("영어");
	}
}

이제 위의 코드에서 Korean, Chinese, Brion 클래스에서 공통적인 요소를 추출하여 추상클래스를 만들고 이 세 언어의 공통적인 기능인 “speak()” 메소드를 정의하겠습니다. 이 추상클래스를 공통으로 상속 받는 객체들은 반드시 speak() 메소드를 구현해야 합니다.
그러나 이 speak() 메소드를 상속 받은 클래스는 각자의 상황에 맞춰서 해당 메소드를 다르게 구현합니다. 추상클래스에서는 정의만 하고 이를 상속하는 클래스에서 각기 다른 방식으로 내용을 구성하는 것입니다.

package ch01;

public class SpeakDemo2 {
	public static void main(String[] args) {
		Language ko = new Korean();
		Language ch = new Chinese();
		Language br = new Briton();
		
		ko.speak(); ch.speak(); br.speak();
	}
}

abstract class Language {
	public abstract void speak();
}

class Korean extends Language {
	@Override
	public void speak() {
		System.out.println("한국어");
	}
}

class Chinese extends Language {
	@Override
	public void speak() {
		System.out.println("중국어");
	}
}

class Briton extends Language { 
	@Override
	public void speak() {
		System.out.println("영어");
	}
}

위와 같은 방식으로 코딩하면 세 객체간의 관계가 명료해지고 또 다른 언어가 생성 될 때에 상속을 받고 speak() 부분만 구현하면 되기 때문에 코드가 간결해지고 재활용이 가능해집니다. 그리고 부모 객체의 메소드를 자식에서 구현할 때에 명시적으로 @Override를 어노테이션을 표기해주면 더욱 명시적입니다.

비슷한 개념으로 @Overload가 있습니다.
해당 개념은 하나의 메소드 이름을 각기 다른 매개 변수를 사용해서 호출하는 것으로 가장 많이 쓰는 예로는 System.out.print() 함수가 있습니다. 해당 함수는 String, boolean, long, int 등 매개변수를 다르게 해도 모두 동일한 print()를 사용합니다.

그러므로 오버로딩의 조건은 메서드의 이름이 같고, 매개 변수의 타입이 틀려야 합니다. 만약 Overload가 되지 않았다면 아마도 자바는 비슷한 이름의 지금 보다 훨씬 더 많은 메소드를 보유하면서 개발자를 힘들게 만들었을 수도 있을 것입니다.