26 1월 2023

[산업] “AI의 저작권 침해 더 못참아”… 인간, 마침내 칼 빼들다

“AI의 저작권 침해 더 못참아”… 인간, 마침내 칼 빼들다

게티이미지, 그림 생성툴 만든 英 ‘스태빌리티 AI’에 소송 제기

 
워터마크까지 버젓이_이미지 생성 인공지능(AI) 스테이블 디퓨전에서 찾아볼 수 있는 이미지. 오른쪽에 저작권을 나타내는 ‘게티이미지’의 워터마크가 흐리게 보인다. 이미지를 유료로 제공하는 게티이미지의 사용 허가를 받지 않은 사진이나 그림을 생성 AI가 이용했을 가능성이 있다는 얘기다. /스테이블 디퓨전

인터넷을 통해 이미지·동영상을 제공하는 미국 회사 게티이미지가 AI(인공지능) 업체를 상대로 저작권 침해 소송을 제기했다. 게티이미지는 4억7000만장 이상 이미지를 유료로 제공하고 있는 미국 최대 규모 이미지 플랫폼이다. 이 회사는 이미지 생성 인공지능(AI) 스테이블 디퓨전을 개발한 스태빌리티 AI가 자신들의 허락을 받지 않고 수백만장의 이미지를 AI 이미지 생성에 도용했다고 주장한다. 게티이미지는 “우리는 수많은 AI 기업에 알고리즘 훈련을 위한 이미지 라이선스를 제공해왔다. 스테빌리티 AI는 상업적인 이익을 위해 우리가 소유한 이미지의 라이선스를 적합한 절차를 거치지 않은 채 사용했다”라고 밝혔다.

올해 가장 각광받을 기술로 손꼽힌 생성 AI가 저작권 문제로 법정에 서게 됐다. 생성 AI는 글, 문장, 오디오, 이미지 같은 기존 데이터를 활용해 유사한 콘텐츠를 새롭게 만들어 내는 AI다. 하지만 생성 AI가 콘텐츠를 만들어내는 과정에서 기존의 창작물을 대량으로 학습하면서 저작권 문제가 생겨났고, 결국 소송까지 가게 된 것이다. 블룸버그는 “지난해가 생성 AI에게 영광의 한 해였다면, 올해는 생성 AI 를 둘러싼 소유권, 저작권과 진정성에 대한 법적 갈등이 본격적으로 시작되는 한 해가 될 것”이라고 했다.

◇화가도, 프로그래머도 생성 AI에 줄소송

생성 AI의 등장으로 가장 먼저 위협을 느낀 창작자들도 올 들어 소송을 제기했다. 일러스트레이터·만화가인 사라 안데르센, 켈리 매커넌, 칼라 오티즈는 “AI 기업이 막대한 양의 저작물을 원작자 동의 없이 생성 AI 훈련에 사용하고 있다”고 주장하며 스태빌리티AI와 이미지 생성 AI인 미드저니 관계자들을 고소했다. 이들은 생성 AI로 발생한 피해를 창작자들에게 보상하고, 추가적인 피해를 막기 위한 사용 중지 가처분을 요구하고 있다. 소송에 참여한 매커넌은 “‘내가 생성 AI 학습에 이용이 됐을까(haveibeentrained.com)’란 사이트에서 내 이름을 검색했을 때 내 작품이 셀 수 없이 등장하는 것을 보고 소송을 결심했다”고 했다. 그가 검색한 사이트는 화가나 사진작가들이 자신의 작품이 생성 AI의 학습에 사용됐는지 확인하기 위해 사용하는 곳이다.

생성 AI의 개발이 빠르게 이뤄지면서 이와 관련된 법적 분쟁은 그림이나 사진뿐만 아니라 영상, 글, 목소리, 초상권, 코드까지 확산할 것으로 보인다. 지난해 11월에는 마이크로소프트(MS)의 소스 코드 생성 AI ‘깃허브 코파일럿’의 이용자들이 마이크로소프트를 상대로 집단소송을 제기했다. 깃허브 코파일럿은 수십억줄의 코드를 학습해 코드를 생성해주는 도구다. 프로그래머가 코드의 일부를 작성하면, AI가 어떤 코드가 들어갈지 판단해 자동완성된 코드를 알려주는 방식으로 프로그래머를 도와준다. 깃허브 사용자들은 프로그래머가 직접 만들어 깃허브에 공유한 수십억줄의 오픈소스 코드를 MS의 깃허브 코파일럿이 불법 복제하고 있다고 주장하며 손해배상을 요구하고 있다.

 

◇ “인간 창작성을 가늠할 기념비적 소송”

게티이미지에 소송을 당한 스태빌리티AI의 본사가 영국 런던에 있기 때문에 이들의 법정 다툼은 영국 법원에서 이뤄질 예정이다. 저작권 문제에 엄격한 편인 영국 법원이 인간과 생성 AI의 분쟁에서 첫 선례를 남기는 것이기 때문에 생성 AI에 막대한 투자를 하고 있는 MS나 구글과 같은 빅테크의 눈도 여기에 쏠릴 예정이다. 영국 파이낸셜타임스(FT)는 “인간이 가진 창작성의 가치를 가늠할 기념비적인 소송이 될 것”이라며 “앞으로 생성 AI가 어떻게 살아남아야 할지 결정해줄 판결이기도 하다”라고 평가했다.

국내에서도 일러스트레이터와 만화가를 중심으로 생성 AI에 대한 불만이 쏟아져 나오고 있지만 생성 AI와 관련한 저작권 규정은 아직 명확하게 정해지지 않았다. 국회와 정부는 인공지능 학습과 빅데이터 분석을 위해서 인터넷에 공개되어 있는 저작물을 사용할 때에는 저작권자의 이용 허락을 받지 않아도 된다는 내용을 저작권법 개정안에 포함하려는 시도를 하고 있다. FT는 “각국 정부는 기술 기업을 규제하고픈 입장과 AI 같은 핵심 기술을 육성해주고 싶은 입장 사이에서 고민하고 있을 것”이라고 했다.

[출처] https://www.chosun.com/economy/tech_it/2023/01/26/SYRGM7QCQ5DDXEOHG7ROYVVD2Q/

 24 total views,  2 views today

22 1월 2023

[산업] “주식 뭐 살까?” AI에 물어보니

[산업] “주식 뭐 살까?” AI에 물어보니

“주식 뭐 살까?” AI에 물어보니

[편집자 레터]

 

이번 주 위클리비즈엔 인공지능(AI)과 관련한 기사를 두 건 실었습니다. 각국에서 AI 규제가 본격화되고 있다는 소식(B8면)과 저명한 노동경제학자인 데이비드 오터 MIT 교수 인터뷰(B11면)입니다. AI 관련 기사를 많이 실은 건 그만큼 이 분야에서 놀라운 일들이 연달아 벌어지고 있기 때문입니다. 특히 지난해 말 발표된 대화형 AI ‘챗GPT’는 놀라움을 넘어 충격적인 수준입니다. 전문가들도 구분해낼 수 없는 수준으로 논문 초록을 써내는가 하면, 셰익스피어 스타일의 시(詩)나 노래 가사도 뚝딱 만들어냅니다. 프로그램 코딩도 할 줄 압니다.

저도 시험 삼아 챗GPT에 몇 가지 질문을 던졌더니, 과연 어떤 질문이든 막힘없이 술술 대답합니다. 가령 한국의 주적은 누구인지 물었더니 “한국의 주적은 북한”이라며 남북한 관계의 약사(略史)를 서술합니다. UAE의 주적은 누구냐고 묻자 “UAE는 특정한 주적을 갖고 있지 않으나, 이란과는 영토 분쟁으로 긴장 관계를 유지하고 있다”고 하는군요. 지금 어떤 주식을 사는 게 좋겠냐고 묻자 “미안하지만 투자 관련 조언은 할 수 없다”며 “최고의 주식은 개개인의 투자 성향이나 시장 상황에 따라 다르므로 알아서 연구하고 전문가 도움을 받으라”는 모범 답안을 내놓습니다.

이런 놀라운 성능 때문에 챗GPT가 조만간 튜링 테스트를 통과할 수 있을 것이라는 관측도 나옵니다. 기계가 인간에 필적하는 지능을 가졌는지 판별하는 시험인데, 지금까지 이 테스트를 통과한 AI는 없습니다. 챗GPT에게 직접 물어보니 이렇게 답변합니다. “제가 튜링 테스트를 통과하려면 인간 같은 양심과 자의식, 정서지능, 그리고 인간 정신의 복잡성을 이해하는 능력이 필요합니다. 하지만 저는 훈련받은 패턴에 근거해 텍스트를 생성하는 AI일 뿐입니다.”

내친김에 AI가 언젠가 인간의 일자리를 대체할 수 있을 것 같냐고 묻자 “창의력이나 판단력이 필요한 일들은 인간의 고유 영역이며, 쉽사리 기계로 대체되지 못한다”고 합니다. 영리한 데다 겸손하기까지 한 AI에 감탄하다 문득 이 녀석이 거짓말인들 못 하겠나 싶어 조금 섬뜩했습니다. 좋든 싫든 아마 올해는 AI 관련 뉴스를 계속해서 보고 듣게 될 것 같습니다.

[출처] https://www.chosun.com/economy/mint/2023/01/20/KAJID6DQR5GKXBRZYUMBFOXVL4/

 20 total views,  2 views today

22 1월 2023

[IT 혁신 디바이스][소프트웨어] MIT 노동 경제학 교수의 진단 “이런 사람은 AI에 안 밀려난다”

[IT 혁신 디바이스][소프트웨어] MIT 노동 경제학 교수의 진단 “이런 사람은 AI에 안 밀려난다”

MIT 노동 경제학 교수의 진단 “이런 사람은 AI에 안 밀려난다”

데이비드 오터 MIT 교수 인터뷰

인공지능(AI)과 로봇 기술이 급속히 발전하면서 일자리의 미래에 대한 걱정도 커지고 있다. 전국경제인연합회가 2021년 20·30세대 829명에게 미래사회가 도래하면 일자리가 어떻게 변하게 될 것으로 생각하는지 물었더니 10명 가운데 8명(83%)은 일자리가 줄어들 것이라고 우려했다. 최근엔 ‘미드저니’ ‘달리’ 등 그림 그리는 AI와 대화형 AI인 ‘챗GPT’가 잇따라 등장해 ‘AI가 인간의 일자리를 앗아갈 것’이라는 우려가 더욱 커졌다. 실제로 로봇 한 대가 늘어나면 인간 일자리가 0.1%포인트 줄어든다는 분석(한국은행·2021년)도 있다.

이런 현상에 대해 오랜 기간 자동화와 노동의 관계를 연구해온 데이비드 오터(56) 미국 매사추세츠공대(MIT) 교수는 어떤 생각을 갖고 있을까. MIT 부속 ‘미래의 일자리’ 연구소 공동 의장이자 저명한 노동 경제학자인 오터 교수를 WEEKLY BIZ가 화상으로 인터뷰했다.

 
데이비드 오터(56) 미국 매사추세츠공대(MIT) 교수는 친(親) 로봇, 친(親) 인공지능(AI) 학자로 알려져 있다. 세계화와 기술 변화가 일자리에 끼치는 영향에 대한 연구 업적을 인정받아 지난 2020년 하인즈 재단으로부터 ’25주년 특별공로상’을 수상하기도 했다. /데이비드 오토 교수 제공

◇“AI가 인간 대체한다는 건 과장”

-코로나 팬데믹이 노동시장을 어떻게 바꿨나.

“예상치 못한 구인난이 발생하면서 저학력 근로자에게 매우 좋은 노동시장이 형성되고 있다. 지난 40년간 고학력자가 혜택을 독식해온 노동시장에 극적인 역전이 일어난 것이다. 이런 변화는 고임금 근로자보다 저임금 근로자 임금을 많이 올려 불평등을 줄인다는 점에서 긍정적이다. 다만 이런 상황이 얼마나 지속할지는 불확실하다. AI가 발전하는 속도도 내가 예상했던 것보다 더 빠르다.”

-결국 AI나 로봇의 발전 속도를 인간이 따라갈 수 없는 것 아닌가.

“‘따라간다’는 말은 경쟁을 전제로 한다. 하지만 인간은 AI 같은 기계와 경쟁하는 관계가 아니다. 지난 200여 년간 인간은 놀랄 만한 기술을 개발하고 자동화를 도입했는데, 대부분 인간을 도와주는 역할을 했다. AI도 마찬가지다. 가령 AI가 사람 대신 완전한 글을 쓰지는 못하지만, 보조적인 역할은 충분히 할 수 있다. AI가 만들어주는 문장을 초안 삼아 글을 쓰면 시간을 절약할 수 있을 것이다.”

-그렇다면 AI가 인간의 일자리를 대체할 것이라는 걱정은 기우인가.

“물론 지금까지 기술 발전이 그랬듯 AI도 일부 일자리에 손해를 끼칠 것이다. 예를 들어 미국에서는 매년 세금을 낼 때 모든 수입 내역과 증빙 서류를 당국에 제출해야 하는데, 이 절차가 너무 복잡해서 많은 사람들이 이 일을 세무사에게 맡겼다. 그런데 지금은 이를 처리하는 AI 프로그램이 개발되면서 사람들이 값싼 비용으로 전문적인 서비스를 이용할 수 있게 됐다. 자연히 세무사 수요는 줄어든다. 하지만 아무리 AI가 대세이고 중요한 기술이라고 해도 사람이 하는 모든 일을 완전히 대체할 정도는 아니다. 노동 시장을 완전히 바꾸는 수준은 더더욱 아니다.”

오터 교수는 “AI나 로봇은 인간의 판단에 따라 쓰임새가 결정된다는 점을 기억해야 한다”고 했다. 예를 들어 중국은 전 세계에서 감시나 콘텐츠를 검열하는 데 가장 뛰어난 기술을 갖고 있는데, 이건 중국 당국의 선택과 투자로 인해 가능한 것이지 AI의 고유한 속성 때문은 아니라는 것이다. 그는 “현재로서 우리는 AI가 정확히 어떤 목적으로 사용될지 알 수 없다”며 “그러므로 어느 직업에서 어느 정도까지 인간의 일자리를 빼앗아 갈지 속단하기도 어렵다”고 했다.

 

◇미래에도 읽기·쓰기·말하기·분석이 중요

오터 교수는 다양한 실증 연구를 통해 자동화가 일자리를 빼앗는 게 아니라 오히려 늘린다는 주장을 펴왔다. 2015년 ‘왜 아직도 그렇게 많은 일자리가 있는가’라는 제목의 논문에서도 그는 “자동화와 노동이 상호 보완 작용을 하면서 생산성을 높이고 수입을 증가시키고, 이로 인해 전체 일자리도 늘어날 것”이라고 주장했다. 그런 그도 자동화와 AI가 가져올 양극화에 대해서는 상당한 우려를 갖고 있다. 그는 “현재 소매점 같은 단순 서비스 업종이 구인난에 시달리고 있지만, 장기적으로 이런 일자리는 살아남기 어렵다”며 “전문 지식이 필요 없는 단순 일자리를 줄이고, 법률이나 의료 분야 등 전문 지식을 요구하는 분야에서 일하는 사람을 늘리는 방향으로 가야 한다”고 말했다.

-미래 세대는 어떤 직업이나 전공을 가지는 게 좋을까.

“기계를 잘 활용할 수 있는 사람이 돼야 한다. 의사를 예로 들어 보자. 의사는 전문 지식을 가지고 있지만, 동시에 환자와 꾸준히 소통하는 사람이다. 사람들이 요구하는 것을 지식을 활용해 일종의 ‘번역’을 해야 하는 직업이다. 나는 이를 ‘가치 있는 일’이라고 표현하고 싶다. 이런 일은 기계가 해내지 못한다. 이처럼 앞으로는 전문적인 지식과 사람의 요구를 함께 받아들이고, 자신만의 가치를 만들어낼 수 있는 사람에게 많은 기회가 갈 것이라고 본다. 어떤 전공이 유망할 것이라고 말하기는 어렵다. 사람들이 각자 다른 적성을 갖고 있기 때문이다. 다만 근본적인 것은 바뀌지 않는다. 미래에도 읽기·쓰기·말하기·분석하기가 매우 중요할 것이다. 학교에서 분석적 사고방식을 길러야 하고, 더 나은 추론을 하고 의사 결정을 내릴 수 있도록 정보를 분석하는 능력을 키워야 한다.”

-일각에서는 빅테크 기업들이 AI와 저개발국 노동력을 활용해 이익을 극대화하고 노동력을 착취한다고 비판한다.

“과거 무역이 활발해졌을 때도 부자 나라가 자신들의 이익을 위해 가난한 나라를 착취한다는 비판이 나왔다. 하지만 무역은 한때 개도국이었던 한국이나 중국, 일본 등 많은 나라를 부자로 만들었다. 물론 현재 개도국들이 아마존이나 테슬라 같은 빅테크 기업이 발주하는 단순 업무를 하다 보니 일부 학대당하거나 낮은 임금을 받는 경우도 있다. 하지만 모두가 그런 것은 아니며, 그것이 플랫폼 노동의 본질도 아니다.

오히려 기술이 부족한 나라는 기술력 있는 나라가 무역하고 싶지 않을 정도로 자급자족하는 상황을 경계해야 한다. 예를 들어 선진국이 방글라데시에 ‘우리는 옷을 만들어줄 로봇이 있으니까 더는 당신네 나라에서 옷 살 필요가 없다’든지 ‘이제는 로봇 간호사에게 일을 시키면 된다’며 필리핀에 간호사 수입을 하지 않겠다고 나설 수 있다. 이렇게 되면 하고 싶어도 무역을 하지 못하는 상황이 발생한다. 실제로 미국 의회에서는 로봇이 발전하고 있기 때문에 이민자가 필요 없다는 주장을 하는 사람들이 있다. 이것이 진짜 비극이다.”

-자동화 시대에 정부는 어떻게 대응해야 하나.

“AI와 로봇이 가져올 변화에 대처하려면 교육, 건강, 안전 등 사회안전망을 잘 구축해야 한다. 이런 점에서 미국은 초·중등 교육 시스템에 많은 문제가 있다. 지난 40여 년간 미국은 사람에 대한 투자를 정부가 아닌 민간 기업에 맡겨야 한다는 생각에 이끌렸다. 그러다 보니 교육이나 의료 서비스 부족에 직면해 있다. 안정성이 부족하다 보니 국민은 자신의 잠재력을 발휘하지 못한다. 시장이 중요하고, 정부가 모든 걸 통제해선 안 된다는 말은 맞다. 하지만 현재 미국은 비간섭주의에 지나치게 경도돼 있다고 생각한다.”

[출처] https://www.chosun.com/economy/mint/2023/01/19/NVXUO65PORDQPADJBT3MSKTB74/

 28 total views,  4 views today

8 1월 2023

[산업] 고도화 경쟁이 알고리즘 예측 품질 떨어뜨린다

[산업] 고도화 경쟁이 알고리즘 예측 품질 떨어뜨린다

과학 수학자의 연구 이미지.jpg

 

(사진=셔터스톡)
인공지능(AI) 알고리즘 고도화 경쟁이 심할수록 알고리즘의 예측 품질이 떨어질 수 있다는 주장이 나왔다. 서비스 고객 확보를 목적으로 특정 분야에 예측 알고리즘을 특화하면서 폭넓은 예측 성능을 저하한다는 지적이다.

기술 전문지 테크 익스플로어는 고객 유치를 목표로 예측 알고리즘 고도화를 경쟁할수록 알고리즘이 부분 모집단에 전문화돼 기업과 소비자에게 영향을 끼칠 수 있다고 2일(현지시간) 보도했다.

이번 분석은 제임스 조우(James Zou) 스탠퍼드대학 바이오의학 데이터과학 조교수이자 인간 중심 AI연구소 부교수가 대학원생과 함께 수행한 논문 연구를 통해 확인했다.

현재 넷플릭스와 훌루 등 온라인 스트리밍서비스 업체가 개인 맞춤형 서비스로 예측 알고리즘을 활용하고 있다. 이 같은 서비스 기업은 많은 고객을 확보할 목표로 자사 알고리즘 추천 정확도를 높이는 데 집중한다.

조우 교수는 이 과정에서 예측 알고리즘이 좁은 분야에 전문화되며 예측 품질이 떨어질 것이라고 우려했다. 향후 이 같은 예측 알고리즘을 은행 대출이나 인재 채용 등에 적용할 경우 부정적 영향을 끼칠 수 있다.

조우 교수 연구팀은 기업이 고객을 위해 기술 경쟁을 하는 동시에 고객 데이터를 활용해 머신러닝(ML) 알고리즘을 훈련시킬 경우 알고리즘의 추천 능력에 어떤 영향을 미치는지 연구했다.

이에 연구팀은 알고리즘 고도화 경쟁을 수학적으로 분석한 뒤 표준 데이터셋을 사용해 시뮬레이션했다. 그 결과, ML 알고리즘을 경쟁시킬수록 전문화돼 사용자의 일부 집단 선호도를 예측하는 데 능숙해진다는 것을 발견했다.

조우 교수는 “시간이 지날수록 불균형은 점점 커질 것”이라며 이 같은 현상이 온라인 디지털 플랫폼의 예측 서비스 경쟁 상황에서 나타날 수 있다고 설명했다

연구팀에 참여한 안토니오 지나트(Antonio Ginart) 스탠퍼드 대학원생은 “구글이나 빙 등에서 검색어를 입력할 경우 검색 엔진은 우리와 연관성이 가장 높은 링크를 예측할 것이다”라며 “우리는 예측 결과가 더 정확한 플랫폼만 사용할 것이며, 이로 인해 최적의 ML 시스템을 위한 데이터 입력 양상이 바뀌고 미래 예측 방법을 변화시킬 것”이라고 말했다.

금융 분야에서도 이 같은 현상이 발생할 수 있다. 은행이 신용도 측정을 목적으로 예측 알고리즘을 적용할 경우 주요 소득 계층의 데이터를 다수 확보했기 때문에 이들의 신용도를 예측하는 데 능숙할 것이다. 하지만 다른 집단을 향한 신용도 예측 정확도가 감소해 평균 서비스 품질은 실제로 감소한다.

미국의 경우 은행 대출 알고리즘이 중년 백인 고객의 데이터에 의존하고 있어 구조적 불평등을 가속화하고 알고리즘의 데이터 전문화를 강화시킬 수 있다.

조우 교수는 이 같은 문제의 해결책을 찾는 데 관심을 갖고 있다고 설명했다. 그는 “이 기술은 여전히 새롭고 최첨단이다”라며 “이번 논문이 많은 연구자에게 AI 알고리즘 경쟁의 사회적 영향을 연구하는 계기가 되길 바란다”고 말했다.

 

출처 : AI타임스(http://www.aitimes.com)

 69 total views,  6 views today

5 1월 2023

[자유게시판] 우리가 알던 프로그래밍의 종말, 개발자의 새 역할은 : (옮긴이 주 :  기승전결없이 중구난방글)

[자유게시판] 우리가 알던 프로그래밍의 종말, 개발자의 새 역할은 : (옮긴이 주 :  기승전결없이 중구난방글)

우리가 알던 프로그래밍의 종말, 개발자의 새 역할은

코드 작성에서 AI 학습 지도 관리자로 진화해야

인공지능(AI)은 점점 더 많은 소프트웨어 개발 작업을 수행하고 있다. 개발자는 앞으로 코딩 도구보다 교육 모델을 더 많이 사용하게 될 것으로 보인다. 새 시대의 개발자는 AI의 작업을 감독하고, 빈틈을 줄이는 학습 관리자로 진화하게 될 것 같다.

28일(현지시간) 미국 지디넷은 ‘우리가 알고 있는 프로그래밍의 끝’이란 제목의 컬럼을 게재했다.

컴퓨팅 역사 속에 다양한 시도와 패러다임, 신기술이 등장해 소프트웨어 세계를 흔들었다. 이런 움직임은 대개 많은 프로그래밍 작업을 최종사용자에게 맡기거나 더 많은 프로세스를 자동화하게 될 것이란 약속을 내놨다.

(제공=이미지투데이)

CASE 도구, 4GL, 객체지향프로그래밍, 서비스지향아키텍처, 마이크로서비스, 클라우드, PaaS, 서버리스 컴퓨팅, 로우코드 및 노코드 등 모두 이론적으로 소프트웨어 개발의 부담을 덜어주는 방향으로 고안된 고민이었다. 이는 반대로 개발자의 직업적 안정성을 위협하기도 했다.

많은 약속이 실행된 지금 소프트웨어 개발자의 일은 더 늘었다. 오히려 그 어느때보다 가장 바쁜 시기를 보내고 있다.

문제는 개발자란 직업의 진화에 있다. 애플리케이션 개발과 유지관리에 적용된 AI는 마침내 낮은 수준의 코딩을 옛날 일로 만들 가능성을 갖게 됐다.

픽시닷에이아이란 회사의 공동 창업자이자 최고경영자(CEO)인 맷 웰시는 최근 컴퓨팅기계협회 기고문에서 “향후 10년 정도 이내에 프로그래밍이 쓸모없게 될 것”이라며 “프로그램 작성이란 기존의 아이디어는 소멸될 것이라 믿는다”고 밝혔다.

그는 “매우 전문화된 애플리케이션을 제외하고 대부분의 소프트웨어는 프로그래밍된 게 아니라 훈련된 AI 시스템으로 대체될 것”이라며 “모든게 GPU 클러스터로 작동하는 수천억 패러미터의 모델을 필요로 하는건 아니지만, 간단한 프로그래핑이 필요한 상황에서 이런 프로그램은 손으로 하는 코딩보다 AI로 만들어질 것”이라고 전망했다.

일반적 프로그래밍에서 개발자가 자유로워지면 그의 역할은 어떻게 바뀌게 될까? 전문가들은 더 까다로운 높은 수준의 애플리케이션 개발 작업에 개발자의 역량을 투입해야 한다고 점친다. IT부서는 엔터프라이즈 애플리케이션에 초점을 맞출 수 있게 되고, 복잡한 애플리케이션과 자동화 구축이 기업에 더 많은 가치를 추가할 것이라고 한다.

아르고디자인의 공동 창립자이자 수석크리에이티브 기술자인 자레드 피클린은 “최근까지 개발의 초점은 엔지니어링을 더 잘 활용하거나 더 많은 코드 작성자 풀에서 더 많이 재사용하는데 있었다”며 “이로 인해 오케스트레이션을 용이하게 하는 도구가 생겨났고, 이를 통해 일반 앱 개발자는 GUI를 사용해 머신러닝 전문가가 작성한 코드 모듈을 사용해 AI 솔루션을 오케스트레이션할 수 있다”고 밝혔다.

그는 “마찬가지로 비즈니스 전문가는 인터페이스를 사용해 전체 캠페인을 오케스트레이션할 수 있다”고 덧붙였다.

머신러닝 학습 지원 도구는 요구사항을 수집하고 엔지니어링을 활용하는데 도움을 준다. 코드 작성자는 빈틈있는 곳에 뛰어들어 빈틈을 막게 된다. 이 모든 경우 유지해야 할 상호운용성과 보안 지점을 처리하는데 IT 부서가 역할하게 된다.

현재 프로그래밍에서 AI의 역할은 도우미 정도로 여겨진다. 그러나 점차 단순한 코드 생성에서 일련의 논리를 가진 애플리케이션 작성 수준으로 진화할 것이란 게 전문가들의 의견이다.

맷 웰시는 “코파일럿 같은 AI 코딩 도우미는 표면만 긁고 있을 뿐이며, 미래의 모든 프로그램은 궁극적으로 AI로 작성되고, 인간은 감독 역할을 하게 될 것”이라며 “지난 몇년 동안 AI 분야에서 일하면서 점점 더 커지는 AI 모델의 힘을 과소평가하기 매우쉽다는 점을 배웠다”고 밝혔다.

그는 “깃허브 코파일럿이 개발자를 대체하는 것에 대해 말하는 게 아니라, 프로그램 작성의 전체 개념을 교육 모델로 대체하는 것에 대해 말하는 것”이라고 덧붙였다. 코드를 작성하는 AI를 감독하고, AI의 학습을 지도하는 역할로 개발자와 IT부서의 새 책임이란 얘기다.

코딩에서 벗어나면 개발자는 애플리케이션 개발을 더 개념적으로, 비즈니스 역할로 바라보는 새로운 길을 열게 된다.

자레드 펠킨은 “놀라운 방향에서 놀라운 변화가 일어나고 있다”며 “더 넓은 세상은 코드를 함께 묶기 위해 노드를 이동하는 시각적 인터페이스의 노코드 및 로우코드를 상상했다”며 “이것은 오케스트레이션이며 여전히 어떻게 코드가 함께 연결되는지 지식을 요구한다”고 설명했다.

그는 “현 고객 중 하나인 빌더AI는 음성 대화의 AI 분석을 사용해 요구사항을 수집한 다음 이런 경험을 추가로 설계하고 이행하는 고유한 접근 방식을 취했다”며 “심지어 줌 통화에 추가할 수 있는 음성 어시스턴트를 통해 모바일 앱을 설명하는 사람의 말을 듣고 자동으로 캡처해 프로젝트 관리자에게 기능 목록을 나열한다”고 예를 들었다.

또 “그런 다음 인간이 편집하면 AI가 앱의 아키텍처 패턴 안에서 만들어낸다”며 “코드 모듈이 존재하는 곳에 패치가 적용되고, 그렇지 않은 곳에 코드 작성자가 참여해 모듈을 추가하며, 시간이 지나면서 이 프로세스는 점점 더 자동화될 것”이라고 덧붙였다.

 

 

이는 더 많은 실시간 컴퓨팅을 의미한다. 펠킨은 “소프트웨어의 대기 시간, 렌더링, 조립이 실시간으로 호출된다”며 “알렉사에게 주방정리를 도와주는 앱을 만들어달라고 요청하는 걸 상상할 수 있다”고 했다.

그는 “AI는 기능을 인식하고 올바른 패턴을 선택해 실시간으로 앱을 휴대폰이나 웨어러블 기기에 무선 전달할 수 있다”고 강조했다.

 
김우용 기자yong2@zdnet.co.kr

[출처] https://zdnet.co.kr/view/?no=20221229101930

[옮긴이 주] 인공지능이 썼는지, 중구난방인 기승전도 없이 이상한걸 주장하는… 무얼 말하는 지 아시는분?

 70 total views,  4 views today

31 12월 2022

[profit] 유튜브 VS 블로그 성공방정식 3가지

[profit] 유튜브 VS 블로그 성공방정식 3가지

유튜브 VS 블로그 성공방정식 3가지

어디선 4만뷰 VS 어디선 100뷰가 나온 이유
마케터 초인
2022-09-30

많은 사람들이 시도하고 뛰어들고 있는 유튜브 VS 블로그의 생생한 비교

유튜브와 블로그를 운영하며 경험한 생생한 비교를 통해서 남들이 알려주지 않는 차이점과 노하우를 담아봅니다. 같은 소재와 주제를 가지고 어느 채널에서는 왜 4만 뷰가 나오는지, 어디서는 100뷰가 나오는지 직접 실험을 통해 알게 된 생생한 인사이트. 비즈니스나 개인 채널을 위한 콘텐츠 기획이나 운영에 도움 될 이야기를 전해 드립니다.


지금은 1인 미디어의 시대입니다. 개인이 인플루언서가 되고, 전업 크리에이터가 되어 회사원보다 많은 돈을 버는 시대가 도래했죠. 많은 사람들이 나만의 채널과 콘텐츠를 가지고 자신의 브랜드와 영향력을 만들고 싶어 합니다. 하지만 그만큼 많은 사람들이 부푼 꿈을 안고 시작했다가 좌절을 마주합니다.

가장 많은 사람들이 시도하고 뛰어들고 있는 유튜브 VS 블로그의 생생한 비교를 실제 진행했던 사례를 통해 요긴한 노하우는 담아가고 피해야 할 것을 기억하여 본인이 만들고 있는 또는 앞으로 만들 채널과 콘텐츠에 녹여 빠른 성공을 앞당겨보시기를 바랍니다.


13년 차 마케터의 실험

커리어를 쌓으며 지금까지 ‘본업 외’ 약 14개의 디지털 채널을 운영해오며 여러 실험을 지속하고 있습니다. 유튜브의 경우에는 작은 채널이지만 구독자 대비 20배가 넘는 뷰를 기록하며 쏠쏠한 반응을 얻었던 콘텐츠들이 여럿 있었고, 블로그의 경우에는 지금까지 누적 기준 23만명이 넘는 방문객을 기록하며 2차례 네이버 메인에 오른 적도 있었습니다. (현재는 브런치로 옮겨 블로그 운영은 쉬고 있는 상태)

유튜브와 블로그, 이 두 채널은 어떤 차이가 있을까요?

✅ 유튜브와 블로그, 두 가지 채널의 특징

젊어지고 있는 올드 미디어, 블로그

네이버 블로그가 가장 대표적으로 강력한 포털을 기반으로 오랫동안 이어져 오고 있습니다. 한때는 수익화로 이어지기 어려운 한계가 있어 티스토리나 유튜브 등 다른 채널로 인플루언서들이 많이 이탈하였지만, 여전히 검색과 연계해 가장 많은 트래픽을 일으킬 수 있는 채널로서 네이버의 적극적인 프로모션 공세와 함께 최근 다시 상승하는 추세입니다. 

❗️TMI : 2021년 네이버 블로그 포스팅 수는 전년 대비 50% 상승세를 거두었다고 하고, 주간일기 챌린지 프로모션 등을 통해 타깃을 확장하고 있는데 실제 전체 사용자 수의 70%가 MZ세대라고 합니다.

세대불문 트래픽의 제왕, 유튜브

키즈부터 영어덜트, 시니어에 걸쳐 가장 많은 사용 시간과 트래픽을 모으고 있는 전 세대의 플랫폼입니다. 수십, 수백만 팔로워를 만들며 강력한 영향력을 가진 채널로 만들 수도 있고 한번 터지는 콘텐츠 역시도 큰 포텐셜을 가지고 있기 때문에 가장 많은 사람이 이용하고 있습니다.

❗️TMI : 계속해서 신규 채널이 생겨나 주제별로 다양해지고 있는데, 한편으로는 영상 기반의 플랫폼이기 때문에 블로그 대비 콘텐츠 제작 시간이 더 오래 걸리는 특성을 가지고 있습니다.


✅ 유튜브에서 실패하는 블로거들

블로그에서 더 큰 수익의 꿈을 안고 유튜브로 넘어왔던 많은 블로거들이 유튜브에서 실패를 거두고 있는데 어떤 이유에서 일까요? 그건 두 채널의 차이를 모르기 때문입니다. 직접 블로그와 유튜브 채널을 운영하고 실험하면서 얻은 인사이트 3가지를 담아봅니다.

같은 소재로 다른 반응이 나타난 두 가지 케이스

사례1) 유튜브 영끌의 끝을 달리는 남자 10,855뷰VS 블로그 대출전쟁의 시대 201뷰

사례2) 블로그 남자, 힙한 동굴을 만들다 43,175뷰VS 유튜브 집에 BAR를 만든 남자 114뷰

1️⃣ 썸네일? 키워드? 결과를 가르는 시작

 유튜브 VS  블로그에서 각기 좋은 반응을 얻었던 콘텐츠의 유입경로는 어땠을까?

[유튜브] 본인의 채널에서 가장 많은 조회수를 기록한 영상을 보니 홈 화면에 추천으로 노출되어 유입한 경우가 가장 비중이 높습니다. 여기서 클릭을 높이기 위한 썸네일과 제목이 가장 중요하고 수많은 유튜버들이 이를 강조하는 이유이기도 합니다. 먼저 클릭을 할 수 있도록 매력적인 간판을 만드는 과정이 필요합니다. 

[블로그] 특정 분야의 키워드로 띄워야 하고 반복되는 키워드와 첨부 이미지 활용이 중요합니다. 많은 뷰 수를 기록한 포스팅은 5번 이상 핵심 키워드를 포함하고 최소 3~4장 이상의 이미지가 함께 있었고 이는 기존 포스팅보다 최대 10배의 조회수를 기록할 수 있었습니다. 그리고 네이버 메인에 올랐던 2번의 케이스도 모두 매력적인 이미지를 기반으로 메인에 노출될 수 있었습니다.

이미지와 키워드로 메인에 노출된 여러 사례들 @본인의 블로그

2️⃣ 롱텀? 숏텀? 터지는 콘텐츠의 차이

유튜브 VS  블로그에서 각각 가장 반응이 좋았던 콘텐츠의 추이는 어땠을까?

유튜브는 알고리즘! 노출과 반응이 롱텀으로 지속

한 영상을 살펴보니 유튜브 업로드 후 2달간 조회수 600을 기록했고, 이후 유튜브 알고리즘을 타고 꾸준히 유입이 지속되어 총 1만이 넘는 조회수를 만들 수 있었습니다. 특히 이제 막 시작하는 유튜버는 철저하게 알고리즘을 활용해야 합니다. 알고리즘을 타면 구독자보다 훨씬 높은 조회수를 얻을 수 있고, 더 나아가 콘텐츠 공개 이후 시간이 지난 후에도 상승의 순간을 맞이할 수도 있습니다.

블로그는 검색 키워드! 노출과 반응이 상대적으로 숏텀

블로그는 검색 키워드에 걸리는 것이 중요합니다. 검색창의 1페이지에 걸리거나 메인에 걸리게 된다면 뷰수를 극대화할 수 있습니다. 블로그 포스팅은 시간이 지나 다른 누군가의 포스팅으로 키워드 상단과 메인으로 바뀌기 때문에 계속해서 뷰 수를 쌓아가기에는 어려움이 있습니다. 

3️⃣ 기승전결? 스토리텔링? 결정적 한방!

어느 채널이나 공통적으로 기승전결의 구조화가 필요합니다. 잘 된 콘텐츠는 이 구조가 탄탄하게 갖춰져 있었고, 잘 안된 콘텐츠는 이 구조가 잘 짜여 있지 않았던 것을 확인할 수 있었습니다. 여기에 더해 스토리텔링까지 결합시킨다면 결과는 크게 차이가 날 수 있습니다. 실제로 같은 소재를 가지고 유튜브와 블로그에서 1만 VS 200뷰, 50배의 차이가 나는 결과를 얻게 되기도 하였습니다.

잘 된 유튜브 콘텐츠의 구조 – ‘대출’을 소재로 한 유튜브 콘텐츠

(목표) 대출의 숨겨진 의미를 알고, 투자의 무기로 활용해보자!

(기) 10억의 대출을 가진 남자 > 어쩌다 저렇게 대출을 많이 가지게 되었지? > 클릭!

(승) 요즘 30대가 영끌 대출로 투자를 하고 있다? > 시청자 공감

(전) 돈이란 무얼까? 대출은 권력이다! (하고 싶은 이야기) > 인사이트의 습득

(결) 10억의 대출로 투자를 하게 된 사연과 앞으로의 계획 > 긍정적 인식의 변화

결과 : 1만 조회수 / 댓글 48개

한끗을 가르는 팔리는 비결은
기승전결의 구조화였습니다.

이렇게 콘텐츠를 만들 때 잘 짜여진 구조에 기반해 스토리를 더해 유입시키고 이어 흥미와 공감을 일으키고, 변화의 과정까지 만들어내면 실패의 가능성을 낮추고, 좀 더 빠르게 성장하는 채널을 구축할 수 있을 것입니다. 아래 요약을 잘 기억하시고 이후에 활용하시면 더 높은 반응의 콘텐츠를, 팔리는 콘텐츠를 만드시는 데 도움이 되실 수 있을 것 같습니다. 


⚠️ 기억해야 할 유튜브 VS 블로그의 차이 요약

1️⃣ 뷰어가 접근하는 방식의 차이

✔️유튜브는 클릭을 높이기 위한 썸네일과 제목으로 추천 영상 유입하기

✔️블로그는 검색에 노출되기 위한 반복 키워드와 이미지 활용하기

2️⃣ 터지는 콘텐츠 추이의 차이

✔️유튜브는 알고리즘에 태워서 장기적으로 조회수 높이기

✔️블로그는 검색 상단과 메인 노출로 단기간에 조회수 극대화

3️⃣ 콘텐츠 기획할 때 접근하는 방식 차이

✔️콘텐츠의 시작과 끝, 기승전결의 구조화

✔️스토리텔링을 활용한 공감 높이기

[출처] https://wepick.kr/editor/4344480/

 90 total views,  2 views today

11 12월 2022

[알아봅시다] 모스코드 배우기

[알아봅시다] 모스코드 배우기

모스코드는 사뮤엘 F.B 모스라는 사람에 의해 발명된 의사소통 체계입니다. 이는 일련의 점과 선으로 이루어진 메시지를 코드로 전송합니다. 원래는 전신문을 이용한 의사소통을 위해 고안되었지만 여전히 현재에도 아마추어 라디오 열성팬들이 쓰고 있으며 긴급 상황에서 조난신호로 유용하게 쓰이고 있습니다. 모스코드를 배우는 것은 특별히 어렵지는 않지만 다른 언어들처럼 공부에 시간을 투자하여야 합니다. 기본 신호의 의미를 알게 되면 스스로 직접 쓰거나 메시지 번역이 가능합니다.

Learn Morse Code Step 1 이미지
1
기본 신호 의미 알기. 모스코드는 두 개의 서로 다른 기호로 이루어져 있습니다. 점(dots)과 선(dash)입니다. 문장에서 이들이 어떻게 쓰이는지 알아보는 것을 시작으로 합시다. 점은 일반 마침표와 똑같이 생겼습니다. 선은 하이픈처럼 긴 수평선입니다. 모든 영어 알파벳들을 두 기호를 사용하여 나타낼 수 있습니다. [1]

  • 모스코드의 표준 용어에 따르면, 점은 “dits”이라고 부르며 짧은 “I” 소리와 묵음 “t”로 발음합니다.
  • 선은 보통 “dahs”이며 짧은 “a”소리로 발음합니다.
Learn Morse Code Step 2 이미지
2
모스코드 알파벳을 봅시다. 모스코드 알파벳을 쭉 훑어본 뒤 각 글자를 해석하며 이를 표에서 찾아봅시다. 알파벳을 쭉 보면서 각 글자나 숫자를 잘 알아 두세요. 그리고 이에 대응되는 dit-dah(딧-다) 발음을 소리 내어 읽어보세요. 시간이 지나면 소리를 듣거나 글자만 봐도 자기도 모르게 금방 그것이 무엇인지 알게 됩니다. [2]

  • 모스코드 알파벳은 배우면 도움되는 지식이지만, 이에 숙련된 사람들은 모스코드를 글보다는 소리로 배우라고 권고합니다. 이렇게 배우면, 글로 표현되는 신호를 일일이 찾아볼 필요가 없어져 배움 과정을 간소화할 수 있습니다.[3]
  • 인터넷에서 모스코드 알파벳 복사본을 다운 받을 수 있습니다.
  1. Learn Morse Code Step 3 이미지
    3
    각 신호를 소리 내어 읽어보세요. 딧(dits)과 다(dahs)를 리듬에 맞춰 큰 소리로 읽기연습 해보세요. 딧(dits)은 짧은 한 음절 소리를 냅니다. 다(dahs)는 더 길게 끌어 딧(dit)보다 3배 긴 시간 동안 발음되어야 합니다. 빠르고 느린 리듬을 통해 모스코드 각 기호를 구별할 수 있습니다.[4]

    • 단어와 글자들 사이 띄어쓰기에 주의하세요. 각 문자들 사이에 선 하나만큼 간격을 두면서 띄어쓰기를 합니다. 완벽한 단어 하나는 7개의 점만큼 간격을 두어 띄어쓰기를 합니다. 띄어쓰기에 세심할수록 당신의 메시지가 더 이해하기 쉬워질 겁니다.
    • 모스코드는 글보다는 소리로 배우는 게 빠릅니다. 점과 선 개수를 세는 시간을 줄여 주기 때문입니다. [5]
     
Learn Morse Code Step 4 이미지
4
영리한 단어 연계를 떠올리세요. 단어 연계능력은 모스코드 글자와 숫자들을 이해하는 데 유용한 도구입니다. 예를 들어, 글자 “C”로 시작하는 단어 “catastrophic”과 글자 “C”를 연계시켜 같은 음절수와 같은 음절 강세를 갖게 할 수 있습니다. 예를 들어 “mailman”은 “M”과 그리고 “gingerbread”는 “G”와 연계시킬 수 있습니다.

  • 자신만의 단어 연계를 만들어 마음속에서 신호들의 순서가 이에 관련된 소리들과 자연스럽게 연결되도록 하세요.
  • 단어 연계를 노트북에 적어 두고 소리 내어 읽으며 익숙해질 때까지 공부하세요.
Learn Morse Code Step 5 이미지
5
 
 
기본적인 단어나 글자들을 만들어 보세요. 가장 간단한 글자들은 하나의 점이나 선으로 표시할 수 있는 글자들입니다. 예를 들어, 점 하나는 알파벳 “E”를 만들고 하나의 선은 알파벳 “T”를 만듭니다. 이렇게 시작하여 점 두 개(“l”)를 나타내고 선 두 개(“M”)을 나타냅니다. 보다 복잡한 순서의 글자를 조합하기 전에 기초적 문자들에 대한 지식을 굳혀 놓으세요.[6]

  • 형식을 처음 터득할 때 외우기 가장 쉬운 두 세 글자 단어는 (“me” = – – . )와 (“cat” = -.-. .- – ) 입니다.
  • 조난 신호 조합은 “SOS” ( . . . – – – . . . )이며 제일 먼저 배워야 할 단어입니다. 긴급 상황에서 당신의 생명을 구할 수 있어요.[7]
  1. Learn Morse Code Step 6 이미지
    1
    모스코드 녹음기록을 들어보세요. 모스코드 메시지 녹음본을 찾아 들으면 의사소통이 어떻게 이루어지는지 알 수 있어요. 각 문자와 문자 사이의 정지부분에 귀 기울이세요. 필요하다면 녹음본을 느리게 들어 각 신호를 알아듣기 쉽게 만들어보세요.[8]

    • 미국 릴레이 리그(American Radio Relay League) 보관소에서 듣기 연습을 위한 모스코드 녹음파일들을 구할 수 있어요. [9]
    • 햄 라디오를 가지고 있다면 주파수를 HF에 두고 진짜 모스부호를 맛보세요.[10]
    • 연습용 녹음본을 구매하여 교육 받아보세요. 당신의 이해력 레벨에 맞추어 수업을 들을 수 있어요. 고든 웨스트(Gordon West)의 “모스코드 선생님(Morse Code Teacher)”으로 시작해보세요.
     
     
  2. 책갈피
    Learn Morse Code Step 7 이미지
    2
    아이들 책을 번역해보세요. 아이들 이야기 책은 간결하고 간단한 언어로 쓰여졌기 때문에 모스코드 초보자가 연습하기에 최고입니다. 각 페이지를 훑으며 간결한 문장들을 코드로 바꿔보세요. 모스코드 시스템은 복잡하지 않은 메시지들을 전하기 위해 고안되었으므로 이런 책을 가지고 연습하기 좋아요.

    • 이제 막 배우기 시작한 초보라면 “Fun with Dick and Jane(딕과 제인과 재미보기)” 같은 초보 독자들을 위한 책들을 사용하세요. 이런 책들은 간단한 문장으로 쓰인 것으로 유명합니다. (“See Spot run. Run, Spot, run!” = … . . … .–. — – .-. ..- -. .-.-.- .-. ..- -. –..– … .–. — – –..– .-. ..- -. )
    • 이 방법은 빨리 모스부호 체계를 이해하는 데 유용합니다. 예를 들어, 일 분에 5개의 단어를 번역하려 하고 한 페이지에 10개의 단어가 있다고 한다면 각 페이지를 대략 2분 안에 번역하여야 합니다.[11]
     
     
  3. 책갈피
    Learn Morse Code Step 8 이미지
    3
    자신에게 모스코드를 써보세요. 무작위로 단어나 숙어들 몇 개를 추린 뒤 공부를 마치고 다음에 또 공부할 때는 이 단어들을 마구 섞은 뒤 번역해보세요. 이렇게 하면 같은 글자들을 반복적으로 보고 해석할 수 있어 지식을 강화할 수 있습니다. 단어를 간결하게 사용하여 메세지 쓰기와 읽기가 보다 효율적으로 되도록 만드세요.[12]

    • 실력이 늘었다면 모스코드로 일기를 써보세요.
    • 정기적 연습 방법으로는, 식료품 쇼핑 리스트를 모스코드로 적어보기, 사랑하는 사람들 모스코드로 적기, 짧은 시나 다른 짧은 메시지 적어보기가 있습니다.
     
     
  4. 책갈피
    Learn Morse Code Step 9 이미지
    4
    친구로부터 도움 받아보세요. 모스코드를 배우고 싶어하는 친구가 있다면 서로의 실력을 올리는 방법이 있어요. 서로 반기는 메시지를 코드로 보내고 자신의 생각을 말하거나 비밀리에 야한 농담을 하며 놀 수 있어요. 같이 배우는 사람이 있으면 서로 동기부여도 되고 배우는 게 재미있어집니다. [13]

    • 플래시 카드를 만들어 친구나 연인이 문제 내도록 하세요.
    • 일반 언어 대신 점과 선으로 된 메시지를 문자 보내보세요.
  1. Learn Morse Code Step 10 이미지
    1
    모스코드 훈련 앱을 다운받아보세요. 요즘은 Morse-It 이나 Dah Dit같은 앱을 통해 공부할 수 있습니다. 이 앱들은 시각인지 능력 그리고 오디오 녹음본으로 듣기 연습이 가능해 통합된 학습 기회를 제공합니다. 또한 모바일 기기의 화면 터치 방식으로 버튼을 누름으로써 직접적인 교감학습이 가능합니다. 이는 모스코드를 직접 치는 것처럼 느껴지게 한다는 면에서 전통교육 방식과 유사합니다. .[14]

    • 이 앱으로 집에서 여가 시간을 즐길 때나 밖에서 돌아다닐 때 모스코드를 연습할 수 있습니다.
    • 앱으로 공부하는 방식과 팬과 종이를 이용해 연습하는 방식을 잘 조합하여 여러 다른 형태의 모스코드 부호 이해도를 높이세요.
     
     
  2. 책갈피
    Learn Morse Code Step 11 이미지
    2
    모스코드 수업에 참여하세요. 많은 아마추어 라디오 클럽들이 모스코드 강의를 엽니다. 이런 강의들은 당신이 아마추어 무선 마니아인지에 상관없이 보통 모두에게 열려 있습니다. 전통적 수업방식처럼 체계적인 강의계획과 학습능력을 크게 길러주는 일대일 강의가 제공됩니다. [15]

    • 강사들은 다양한 방법을 통해 서로 다른 종류의 학습자들을 효율적으로 가르칠 수 있습니다.
    • 보통 다른 상황에서는 접근하기 힘든 유용한 프로그램이나 장치들을 수업을 통해 사용해 볼 수도 있습니다.
     
     
  3. 책갈피
    Learn Morse Code Step 12 이미지
    3
    오디오 학습 강의에 투자하세요. 근처에 강의가 없다면, 모스부호 교육 영상(또는 음성 자료)을 통해 공부하는 것이 대안이 될 수 있습니다. 당신의 속도에 맞춰 영상을 보며 연습문제를 풀거나 활동을 시도해보세요. 학습을 통해 더 어려운 내용을 소화할 수 있게 되며 실력이 쑥쑥 늘겁니다.[16]

    • 점과 선이 그려지는 소리를 들을 때 이를 필기할 노트패드와 연필을 언제나 가지고 다니세요. 녹음본을 들으며 읽기자료를 복습하세요. 여러 다른 형태의 모스코드 메시지가 알아 듣기 쉬워질 때까지 연습하세요.[17]
    • 오디오 강의의 장점은 다시 재생하여 반복하여 들을 수 있어 중요한 개념을 확실히 배울 수 있으며 당신에게 편한 학습속도에 맞출 수 있다는 겁니다.
     
     
 
 

  • 알파벳 리스트 복사본을 가지고 다니면 도움이 많이 됩니다. 항상 몸에 지니고 다닐 수 있으며 언제나 참고할 수 있기 때문입니다.
  • 안전사고 강의에서 가끔 긴급 모스코드에 대한 내용을 교육 일정에 넣는 경우도 있습니다. 모스코드를 실용적인 이유로 배운다면 이러한 강의도 유용합니다.
  • 좌절하지 마세요. 모스코드를 익히는 것은 쉽지 않아요. 그리고 하루아침에 배울 수 있는 게 아닙니다. 모든지 많이 연습할수록 더 많이 알게 됩니다.
  • 공부 시간은 언제나 짧게 잡으세요(20-30분 정도). 집중력을 잃거나 너무 많은 지식으로 머리에 과부하가 걸릴 수 있어요.
  • 당신이 좋아하는 책이나 시를 모스코드로 적어보면 알파벳을 기억하는 데 큰 도움이 됩니다.
  • 모스코드는 여러 가지 다른 방법으로 전달 가능합니다. 플래시 빛부터 시작해서 오디오 신호나 눈 깜빡임 패턴까지 다양해요.

[출처] https://ko.wikihow.com/%EB%AA%A8%EC%8A%A4%EC%BD%94%EB%93%9C-%EB%B0%B0%EC%9A%B0%EA%B8%B0

 104 total views

29 11월 2022

[MySQL] “아는 만큼 빨라진다” 마이SQL 성능 튜닝 팁 10가지  

[MySQL] “아는 만큼 빨라진다” 마이SQL 성능 튜닝 팁 10가지  

마이SQL은 세계에서 가장 광범위하게 사용되는 오픈소스 데이터베이스이며, 전체 데이터베이스의 인기 순위에서는 (근소한 차이로) 2위에 올라 있다. 마이SQL은 효과적인 관계형 데이터베이스 관리 시스템으로 오랫동안 인기 있는 애플리케이션의 중심에 위치해왔다. 그러나 사용하기가 까다로울 수 있고 성능을 개선할 수 있는 여지도 많다. 지난 몇 년 동안 몇 가지 중요한 개발도 이뤄졌다. 여기서는 바론 슈와르츠가 쓴 마이SQL 성능 튜닝 팁의 업데이트 내용을 다룬다. 
 

ⓒ Getty Images Bank

 

마이SQL 성능 팁 1. 스키마 설계는 다른 어떤 마이SQL 설정 못지않게 중요 

스키마 설계는 데이터베이스에 해야 하는 매우 중요한 일 중 하나다. 교차 관계형 데이터베이스 기술 원칙은 1970년대에 표준형이 나왔다. 마이SQL은 버전 5.6에서 기본 스토리지 엔진을 이노DB(InnoDB)로 전환했으므로 스키마 설계는 더욱 중요해졌다. 

이유가 무엇일까? 이노DB에서는 모든 것이 기본 키(primary key)다. 이는 이노DB가 데이터를 정리하는 방식과 관련된다. 이노DB에서 기본 키는 군집화되고 모든 보조 키(secondary key)는 기본 키에 엔트리 포인터를 추가한다. 스키마 설계에서 이 부분을 감안하지 않으면 성능 측면에서 불이익을 받게 된다. 데이터는 B-트리 인덱스를 사용해서 저장되므로 데이터를 순서가 정해진 방식으로(즉, 유사 순차 값) 삽입하면 기본 키의 단편화가 방지되고 따라서 리프 노드를 찾는 데 필요한 I/O 작업이 감소한다. 

순차 기본 키가 맞지 않는 경우도 있다. 대표적인 예가 범용 고유 식별자(Universally Unique IDentifier), 줄여서 UUID다. UUID와 기본 키에 대한 더 심층적인 내용은 여기서 볼 수 있다. 대부분 경우에는 순차 기본 키를 사용하는 것이 좋다. 
 

마이SQL 성능 팁 2. 보조 키를 적대시하지 말 것 

보조 키는 백그라운드 프로세스에 의해 업데이트되며 성능 영향은 흔히 생각하는 것만큼 크지 않다. 대신 보조 키를 추가하면 스토리지 요구사항이 증가하므로 디스크 사용량 측면의 문제가 있다. 인덱스가 없는 필드에 대한 필터링은 쿼리가 실행될 때마다 전체 테이블 스캔을 유발할 수 있다. 물론 이 경우 막대한 성능 영향이 발생한다. 따라서 보조 키는 없는 것보다는 있는 편이 낫다. 

단, 데이터베이스의 과도한 인덱싱은 피해야 한다. 많은 인덱스를 실행해도 원하는 성능 개선을 얻지 못할 수 있기 때문이다. 또한 부가적인 인덱스는 스토리지 비용을 높일 수 있고, 이노DB가 인덱스를 최신 상태로 유지하기 위해 많은 백그라운드 작업을 해야 한다. 
 

마이SQL 성능 팁 3. 인덱스에서 행 제공 가능 

이노DB는 인덱스에서 바로 행을 찾아서 제공할 수 있는 반면 보조 키는 기본 키를 가리키고 기본 키에는 행 자체가 포함돼 있다. 또한 이노DB 버퍼 풀이 충분히 크다면 대부분의 데이터를 메모리에 유지할 수 있다. 또한 쿼리에서 개별적인 열별 키보다 대체로 더 효과적인 복합 키를 사용할 수도 있다. 마이SQL은 테이블 액세스당 하나의 인덱스를 사용할 수 있으므로 WHERE x=1 and y=2와 같은 절로 쿼리를 실행하는 경우 x, y에 대한 인덱스를 두는 것이 전체 열에 대한 개별 인덱스를 두는 것보다 낫다. 

또한 x, y에 대한 복합 인덱스는 다음 쿼리의 성능도 개선할 수 있다. 

SELECT y FROM table WHERE x=1 

마이SQL은 커버링 인덱스를 사용하고 이 인덱스에서 메모리에 있는 y를 제공한다. 실무에서 복합 인덱스를 사용할 기회가 있으면 사용해 성능을 개선할 수 있다. 인덱스를 설계할 때는 이 인덱스가 읽히는 방식, 즉 항상 왼쪽에서 오른쪽 방향으로 읽힌다는 점을 염두에 둬야 한다. 다음 쿼리를 보자. 

SELECT a,b,c FROM table WHERE a=1 and b=2 

여기서 a, b에 대한 인덱스는 쿼리에 도움이 될 것이다. 그러나 다음과 같은 형식을 보자. 

SELECT a,b,c FROM table WHERE b=2 

인덱스는 쓸모가 없고 전체 테이블 스캔을 유발한다. 항상 왼쪽부터 인덱스를 읽는다는 개념은 일부 다른 사례에도 적용된다. 예를 들어 다음 쿼리를 보자. 

SELECT a,b,c FROM table WHERE a=1 and c=2 

여기에는 열 b에 의한 WHERE 절 필터링이 없으므로 a, b, c에 대한 인덱스는 첫 번째 열만 읽게 된다. 따라서 이 경우 마이SQL은 인덱스를 부분적으로 읽을 수 있고, 이게 전체 테이블 스캔보다는 낫지만 최선의 쿼리 성능을 얻는 측면에서는 여전히 부족하다. 

쿼리 설계와 관련된 또 다른 요소는 마이SQL에서 사용되는 일반적인 최적화인 왼쪽 끝 인덱스 접근이다. 예를 들어 a, b, c의 인덱스는 select a,c where c=x와 같은 쿼리에서는 작용하지 않는다. 이 쿼리는 인덱스의 첫 번째 부분, 즉 a, b를 건너뛸 수 없기 때문이다. select c,count(c) where a=x group by c와 같은 쿼리도 마찬가지다. b의 인덱스를 건너뛸 수 없으므로 group by에 대해 a, b, c의 인덱스를 사용할 수 없다. 그러나 select c,count(c) where a=x and b=y group by c와 같은 쿼리가 있고 이 쿼리가 a, b에 대해 필터링을 하고 c에 대해 group by를 수행한다면 a, b, c의 인덱스 하나가 필터링과 group by에 모두 도움이 될 수 있다. 

원문보기:
https://www.itworld.co.kr/tags/196293/mysql/266739#csidxb0f62748424836c8db741e9db5d0e33 

 153 total views

29 11월 2022

[python][머신러닝] Scikit-learn Tutorial: Machine Learning in Python

[python][머신러닝] Scikit-learn Tutorial: Machine Learning in Python

Scikit-learn Tutorial: Machine Learning in Python

Scikit-learn is a free machine learning library for Python. It features various algorithms like support vector machine, random forests, and k-neighbours, and it also supports Python numerical and scientific libraries like NumPy and SciPy.

In this tutorial we will learn to code python and apply Machine Learning with the help of the scikit-learn library, which was created to make doing machine learning in Python easier and more robust.

To do this, we’ll be using the Sales_Win_Loss data set from IBM’s Watson repository. We will import the data set using pandas, explore the data using pandas methods like head()tail()dtypes(), and then try our hand at using plotting techniques from Seaborn to visualize our data.

Then we’ll dive into scikit-learn and use preprocessing.LabelEncoder() in scikit-learn to process the data, and train_test_split() to split the data set into test and train samples. We will also use a cheat sheet to help us decide which algorithms to use for the data set. Finally we will use three different algorithms (Naive-Bayes, LinearSVC, K-Neighbors Classifier) to make predictions and compare their performance using methods like accuracy_score() provided by the scikit-learn library. We will also visualize the performance score of different models using scikit-learn and Yellowbrick visualization.

To get the most out of this post, you should probably already be comfortable with:

  • pandas fundamentals
  • Seaborn and matplotlib basics

If you need to brush up on these topics, check out these pandas and data visualization blog posts.

The data set

For this tutorial, we will use the Sales-Win-Loss data set available on the IBM Watson website. This data set contains the sales campaign data of an automotive parts wholesale supplier.

We will use scikit-learn to build a predictive model to tell us which sales campaign will result in a loss and which will result in a win.

Let’s begin by importing the data set.

Importing the data set

First we will import the pandas module and use a variable url to store the url from which the data set is to be downloaded.

#import necessary modules
import pandas as pd
#store the url in a variable
url = "https://community.watsonanalytics.com/wp-content/uploads/2015/04/WA_Fn-UseC_-Sales-Win-Loss.csv"

Next, we will use the read_csv() method provided by the pandas module to read the csv file which contains comma separated values and convert that into a pandas DataFrame.

# Read in the data with `read_csv()`
sales_data = pd.read_csv(url)

The code snippet above returns a variable sales_data where the dataframe is now stored.

For those who are new to pandas, the pd.read_csv() method in the above code creates a tabular data-structure known as a Dataframe, where the first column contains the index which marks each row of data uniquely and the first row contains a label/name for each column, which are the original column names retained from the data set. The sales_data variable in the above code snippet will have a structure similar to the diagram represented below.

dataframe-1

Source: Stack Overflow

In the above diagram the row0, row1, row2 are the index for each record in the data set and the col0, col1, col2 etc are the column names for each columns(features) of the data set.

Now that we have downloaded the data set from its source and converted that into a pandas Dataframe, let’s display a few records from this dataframe. For this we will use the head() method.

# Using .head() method to view the first few records of the data set
sales_data.head()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 Exterior Accessories Car Accessories Northwest Fields Sales 76 Won 13 104 101 0 5 5 0 Unknown 0.69636 0.113985 0.154215 1
1 1658010 Exterior Accessories Car Accessories Pacific Reseller 63 Loss 2 163 163 0 3 5 0 Unknown 0.00000 1.000000 0.000000 1
2 1674737 Motorcycle Parts Performance & Non-auto Pacific Reseller 24 Won 7 82 82 7750 1 1 0 Unknown 1.00000 0.000000 0.000000 1
3 1675224 Shelters & RV Performance & Non-auto Midwest Reseller 16 Loss 5 124 124 0 1 1 0 Known 1.00000 0.000000 0.000000 1
4 1689785 Exterior Accessories Car Accessories Pacific Reseller 69 Loss 11 91 13 69756 1 1 0 Unknown 0.00000 0.141125 0.000000 4

As can be seen from the above display, the head() method shows us the first few records from the data set. The head() method is a very nifty tool provided by pandas that helps us to get a feel of the content of a data set. We will talk more about the head() method in the next section.

Data Exploration

Now that we have got the data set downloaded and converted into a pandas dataframe, lets do a quick exploration of the data see what stories the data can tell us so that we can plan our course of action.

Data exploration is a very important step in any Data Science or Machine Learning project. Even a quick exploration of the data set can give us important information that we might otherwise miss, and that information can suggest important questions we can try to answer through our project.

For exploring the data set, we will use some third party Python libraries to help us process the data so that it can be effectively used with scikit-learn’s powerful algorithms. But we can start with the same head() method we used in the previous section to view the first few records of the imported data set, because head() is actually capable of doing much more than that! We can customize the head() method to show only a specific number of records as well:

# Using head() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.head(n=2)
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 Exterior Accessories Car Accessories Northwest Fields Sales 76 Won 13 104 101 0 5 5 0 Unknown 0.69636 0.113985 0.154215 1
1 1658010 Exterior Accessories Car Accessories Pacific Reseller 63 Loss 2 163 163 0 3 5 0 Unknown 0.00000 1.000000 0.000000 1

In the code snippet above, we used an argument inside the head() method to display only the first two records from our data set. The integer ‘2’ in the argument n=2 actually denotes the second index of the Dataframe Sales_data. Using this we can get a quick look into the kind of data we have to work with. For example, we can see that columns like ‘Supplies Group’ and ‘Region’ contain string data, while columns like Opportunity Result, Opportunity Number etc. contain integers. Also, we can see that the ‘Opportunity Number’ column contains unique identifiers for each record.

Now that we have viewed the initial records of our dataframe, let’s try to view the last few records in the data set. This can be done using the tail() method, which has similar syntax as the head() method. Let’s see what the tail() method can do:

# Using .tail() method to view the last few records from the dataframe
sales_data.tail()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
78020 10089932 Batteries & Accessories Car Accessories Southeast Reseller 0 Loss 2 0 0 250000 1 1 3 Unknown 0.0 0.0 0.0 6
78021 10089961 Shelters & RV Performance & Non-auto Northeast Reseller 0 Won 1 0 0 180000 1 1 0 Unknown 0.0 0.0 0.0 5
78022 10090145 Exterior Accessories Car Accessories Southeast Reseller 0 Loss 2 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4
78023 10090430 Exterior Accessories Car Accessories Southeast Fields Sales 0 Loss 2 0 0 120000 1 1 0 Unknown 1.0 0.0 0.0 5
78024 10094255 Interior Accessories Car Accessories Mid-Atlantic Reseller 0 Loss 1 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4

The tail() method in the code snippet above returns us the last few records from the dataframe sales_data. We can pass an argument to the tail() method to view only a limited number of records from our dataframe, too:

# Using .tail() method with an argument which helps us to restrict the number of initial records that should be displayed
sales_data.tail(n=2)
Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
78023 10090430 Exterior Accessories Car Accessories Southeast Fields Sales 0 Loss 2 0 0 120000 1 1 0 Unknown 1.0 0.0 0.0 5
78024 10094255 Interior Accessories Car Accessories Mid-Atlantic Reseller 0 Loss 1 0 0 90000 1 1 0 Unknown 0.0 0.0 0.0 4

We can now view only the last two records from the dataframe, as indicated by the argument n=2 inside the tail() method. Similar to the head() method, the integer ‘2’ in the argument n=2 in the tail() method points to the second index from the last two records in the data set sales_data.

What story do these last two records tell us? Looking at the ‘Opportunity Number’ column of the trailer records from the dataframe, it becomes clear to us that a total of 78,024 records are available. This is evident from the ‘index’ number of the records displayed with the tail() method.

Now, it would be good if we could see the different datatypes that are available in this data set; this information can be handy in case we need to do some conversion later on. We can do that with the dtypes() method in pandas:

# using the dtypes() method to display the different datatypes available
sales_data.dtypes
Opportunity Number int64
Supplies Subgroup object
Supplies Group object
Region object
Route To Market object
Elapsed Days In Sales Stage int64
Opportunity Result object
Sales Stage Change Count int64
Total Days Identified Through Closing int64
Total Days Identified Through Qualified int64
Opportunity Amount USD int64
Client Size By Revenue int64
Client Size By Employee Count int64
Revenue From Client Past Two Years int64
Competitor Type object
Ratio Days Identified To Total Days float64
Ratio Days Validated To Total Days float64
Ratio Days Qualified To Total Days float64
Deal Size Category int64
dtype: object

As we can see in the code snippet above, using the dtypes method, we can list the different columns available in the Dataframe along with their respective datatypes. For example, we can see that the Supplies Subgroup column is an object datatype and the ‘Client Size By Revenue’ column is an integer datatype. So, now we know which columns have integers in them and which columns have string data in them.

Data Visualization

Now that we’ve done some basic data exploration, let’s try to create some nice plots to visually represent the data and uncover more stories hidden in the data set.

There are many python libraries that provide functions for doing data visualization; one such library is Seaborn. To use Seaborn plots, we should make sure that this python module is downloaded and installed.

Let’s set up the code to use the Seaborn module:

# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# set the background colour of the plot to white
sns.set(style="whitegrid", color_codes=True)
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(11.7,8.27)})
# create a countplot
sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result')
# Remove the top and down margin
sns.despine(offset=10, trim=True)
# display the plotplt.show()

output_16_0

Now that we’ve got Seaborn set up, let’s take a deeper look at what we just did.

First we imported the Seaborn module and the matplotlib module. The set() method in the next line helps to set different properties for our plot, like ‘styles’, ‘color’ etc. Using the sns.set(style="whitegrid", color_codes=True) code snippet we set the background of the plot to a light color. Then we set the plot size with the sns.set(rc={'figure.figsize':(11.7,8.27)})code snippet, which defines the plot figure size to be 11.7px and 8.27px.

Next, we create the plot using sns.countplot('Route To Market',data=sales_data,hue = 'Opportunity Result'). The countplot() method helps us to create a countplot and it exposes several arguments to customize the countplot per our needs. Here, in the first argument of the countplot() method, we defined the X-axis as the column ‘Route To Market’ from our data set. The second argument is the data source, which in this case is the dataframe sales_data that we created in the first section of this tutorial. The third argument is the color of the barplots which we assigned to ‘blue’ for the label ‘won’ and ‘green’ for the label ‘loss’ from the ‘Opportunity Result’ column of the sales_data dataframe.

More details about Seaborn countplots can be found here.

So, what does the countplot tell us about the data? The first thing is that the data set has more records of the type ‘loss’ than records of the type ‘won’, as we can see from the size of the bars. Looking at the x axis and the corresponding bars for each label on the x axis, we can see that most of the data from our data set is concentrated towards the left side of the plot: towards the ‘Field Sales’ and ‘Reseller’ categories. Another thing to notice is that the category ‘Field Sales’ has more losses than the category ‘Reseller’.

We selected the Route To Market column for our plot because it seemed like it would provide helpful information after our initial study of the head() and tail() methods’ output. But other fields like ‘Region’ , ‘Supplies Group’ etc. can also be used to make plots in the same manner.

Now that we have got a pretty good visualization of what our overall data looks like, let’s see what more information can we dig out with the help of other Seaborn plots. Another popular option is violinplots, so let’s create a violin plot and see what that style of plot can tell us.

We will use the violinplot() method provided by the Seaborn module to create the violin plot. Let’s first import the seaborn module and use the set() method to customize the size of our plot. We will seet the size of the plot as 16.7px by 13.27px:

# import the seaborn module
import seaborn as sns
# import the matplotlib module
import matplotlib.pyplot as plt
# setting the plot size for all plots
sns.set(rc={'figure.figsize':(16.7,13.27)})

Next, we will use the violinplot() method to create the violinplot and then use the show() mehtod to display the plot –

# plotting the violinplot
sns.violinplot(x="Opportunity Result",y="Client Size By Revenue", hue="Opportunity Result", data=sales_data);
plt.show()
output_20_0

Now, that our plot is created, let’s see what it tells us. In its simplest form, a violin plot displays the distribution of data across labels. In the above plot we have labels ‘won’ and ‘loss’ on the x-axis and the values of ‘Client Size By Revenue’ in the y-axis. The violin plot shows us that the largest distribution of data is in the client size ‘1’, and the rest of the client size labels have less data.

This violin plot gives us very valuable insight into how the data is distributed and which features and labels have the largest concentration of data, but there is more than what meets the eye in case of violin plots. You can dig deeper into the additional uses of violin plots via the official documentation of the Seaborn module

Preprocessing Data

Now that we have a good understanding of what our data looks like, we can move towards preparing it to build prediction models using scikit-learn.

We saw in our initial exploration that most of the columns in our data set are strings, but the algorithms in scikit-learn understand only numeric data. Luckily, the scikit-learn library provides us with many methods for converting string data into numerical data. One such method is the LabelEncoder() method. We will use this method to convert the categorical labels in our data set like ‘won’ and ‘loss’ into numerical labels. To visualize what we are trying to to achieve with the LabelEncoder() method let’s consider the images below.

The image below represents a dataframe that has one column named ‘color’ and three records ‘Red’, ‘Green’ and ‘Blue’.

dataframe_before-1

Since the machine learning algorithms in scikit-learn understand only numeric inputs, we would like to convert the categorical labels like ‘Red, ‘Green’ and ‘Blue’ into numeric labels. When we are done converting the categorical labels in the original dataframe, we would get something like this:

dataframe_after-1

Now, let’s start the actual conversion process. We will use the fit_transform() method provided by LabelEncoder() to encode the labels in the categorical column such as ‘Route To Market’ in the sales_data dataframe and convert them into numeric labels similar to what we visualized in the above diagrams. The fit_transform() function takes user defined labels as input and then returns encoded labels. Let’s go through a quick example to understand how the encoding is done. In the code example below we have a list of cities i.e. ["paris", "paris", "tokyo", "amsterdam"] and we will try to encode these string labels into something similar to this – [2, 2, 1,3].

#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
encoded_value = le.fit_transform(["paris", "paris", "tokyo", "amsterdam"])
print(encoded_value)
[1 1 2 0]

Voila! We have successfully converted the string labels into numeric labels. How’d we do that? First we imported the preprocessing module which provides the LabelEncoder() method. Then we created an object which represents the LabelEncoder() type. Next we used this object’s fit_transform() function to differentiate between different unique classes of the list ["paris", "paris", "tokyo", "amsterdam"] and then return a list with the respective encoded values, i.e. [1 1 2 0].

Notice how the LabelEncoder() method assigns the numeric values to the classes in the order of the first letter of the classes from the original list: “(a)msterdam” gets an encoding of ‘0’ , “(p)aris gets an encoding of 1” and “(t)okyo” gets an encoding of 2.

There are many more functions provided by LabelEncoder() that are handy under a variety of encoding requirements. We won’t need them here, but to learn more, a good place to start is the official page of scikit-learn where the LabelEncoder() and its related functions are described in detail.

Since, we now have a good idea of how the LabelEncoder() works, we can move forward with using this method to encode the categorical labels from the sales_data dataframe and convert them into numeric labels. In the previous sections during the initial exploration of the data set we saw that the following columns contain string values: ‘Supplies Subgroup’, ‘Region’, ‘Route To Market’, ‘Opportunity Result’, ‘Competitor Type’, and ‘Supplies Group’. Before we start encoding these string labels, let’s take a quick look into the different labels that these columns contain:-

print("Supplies Subgroup' : ",sales_data['Supplies Subgroup'].unique())
print("Region : ",sales_data['Region'].unique())
print("Route To Market : ",sales_data['Route To Market'].unique())
print("Opportunity Result : ",sales_data['Opportunity Result'].unique())
print("Competitor Type : ",sales_data['Competitor Type'].unique())
print("'Supplies Group : ",sales_data['Supplies Group'].unique())
Supplies Subgroup' : ['Exterior Accessories' 'Motorcycle Parts' 'Shelters & RV'
'Garage & Car Care' 'Batteries & Accessories' 'Performance Parts'
'Towing & Hitches' 'Replacement Parts' 'Tires & Wheels'
'Interior Accessories' 'Car Electronics']
Region : ['Northwest' 'Pacific' 'Midwest' 'Southwest' 'Mid-Atlantic' 'Northeast'
'Southeast']
Route To Market : ['Fields Sales' 'Reseller' 'Other' 'Telesales' 'Telecoverage']
Opportunity Result : ['Won' 'Loss']
Competitor Type : ['Unknown' 'Known' 'None']
'Supplies Group : ['Car Accessories' 'Performance & Non-auto' 'Tires & Wheels'
'Car Electronics']

We have now laid out the different categorical columns from the sales_data dataframe and the unique classes under each of these columns. Now, it’s time to encode these strings into numeric labels. To do this, we will run the code below and then do a deep dive to understand how it works:

#import the necessary module
from sklearn import preprocessing
# create the Labelencoder object
le = preprocessing.LabelEncoder()
#convert the categorical columns into numeric
sales_data['Supplies Subgroup'] = le.fit_transform(sales_data['Supplies Subgroup'])
sales_data['Region'] = le.fit_transform(sales_data['Region'])
sales_data['Route To Market'] = le.fit_transform(sales_data['Route To Market'])
sales_data['Opportunity Result'] = le.fit_transform(sales_data['Opportunity Result'])
sales_data['Competitor Type'] = le.fit_transform(sales_data['Competitor Type'])
sales_data['Supplies Group'] = le.fit_transform(sales_data['Supplies Group'])
#display the initial records
sales_data.head()
  Opportunity Number Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Opportunity Result Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 1641984 2 0 3 0 76 1 13 104 101 0 5 5 0 2 0.69636 0.113985 0.154215 1
1 1658010 2 0 4 2 63 0 2 163 163 0 3 5 0 2 0.00000 1.000000 0.000000 1
2 1674737 5 2 4 2 24 1 7 82 82 7750 1 1 0 2 1.00000 0.000000 0.000000 1
3 1675224 8 2 1 2 16 0 5 124 124 0 1 1 0 0 1.00000 0.000000 0.000000 1
4 1689785 2 0 4 2 69 0 11 91 13 69756 1 1 0 2 0.00000 0.141125 0.000000 4

So what did we just do? First we imported the preprocessing module which provides the LabelEncoder() method. Then we created an object le of the type labelEncoder(). In the next couple of lines we used the fit_transform() function provided by LabelEncoder() and converted the categorical labels of different columns like ‘Supplies Subgroup’, ‘Region’, Route To Market’ into numeric labels. In doing this, we successfully converted all the categorical (string) columns into numeric values.

Now that we have our data prepared and converted it is almost ready to be used for building our predictive model. But we still need to do one critical thing:

Training Set & Test Set

A Machine Learning algorithm needs to be trained on a set of data to learn the relationships between different features and how these features affect the target variable. For this we need to divide the entire data set into two sets. One is the training set on which we are going to train our algorithm to build a model. The other is the testing set on which we will test our model to see how accurate its predictions are.

But before doing all this splitting, let’s first separate our features and target variables. As before in this tutorial, we will first run the code below, and then take a closer look at what it does:

# select columns other than 'Opportunity Number','Opportunity Result'cols = [col for col in sales_data.columns if col not in ['Opportunity Number','Opportunity Result']]
# dropping the 'Opportunity Number'and 'Opportunity Result' columns
data = sales_data[cols]
#assigning the Oppurtunity Result column as target
target = sales_data['Opportunity Result']
data.head(n=2)
  Supplies Subgroup Supplies Group Region Route To Market Elapsed Days In Sales Stage Sales Stage Change Count Total Days Identified Through Closing Total Days Identified Through Qualified Opportunity Amount USD Client Size By Revenue Client Size By Employee Count Revenue From Client Past Two Years Competitor Type Ratio Days Identified To Total Days Ratio Days Validated To Total Days Ratio Days Qualified To Total Days Deal Size Category
0 2 0 3 0 76 13 104 101 0 5 5 0 2 0.69636 0.113985 0.154215 1
1 2 0 4 2 63 2 163 163 0 3 5 0 2 0.00000 1.000000 0.000000 1

OK, so what did we just do? First, we don’t need the ‘Opportunity Number’ column as it is just a unique identifier for each record. Also, we want to predict the ‘Opportunity Result’, so it should be our ‘target’ rather than part of ‘data’. So, in the first line of the code above, we selected only the columns which didn’t match ‘Opportunity Number’and ‘Opportunity Result’ and assigned them to a variable cols. Next, we created a new dataframe data with the columns in the list cols. This will serve as our feature set. Then we took the ‘Opportunity Result’ column from the dataframe sales_data and created a new dataframe target.

That’s it! We are all set with defining our features and target into two separate dataframes. Next we will divide the dataframes data and target into training sets and testing sets. When splitting the data set we will keep 30% of the data as the test data and the remaining 70% as the training data. But keep in mind that those numbers are arbitrary and the best split will depend on the specific data you’re working with. If you’re not sure how to split your data, the 80/20 principle where you keep 80% of the data as training data and use the remaining 20% as test data is a decent default. However, for this tutorial, we are going to stick with our earlier decision of keeping aside 30% of the data as test data. The train_test_split() method in scikit-learn can be used to split the data:

#import the necessary module
from sklearn.model_selection import train_test_split
#split data set into train and test setsdata_train, data_test, target_train, target_test = train_test_split(data,target, test_size = 0.30, random_state = 10)

With this, we have now successfully prepared a testing set and a training set. In the above code first we imported the train_test_split module. Next we used the train_test_split() method to divide the data into a training set (data_train,target_train) and a test set (data_test,data_train). The first argument of the train_test_split() method are the features that we separated out in the previous section, the second argument is the target(‘Opportunity Result’). The third argument ‘test_size’ is the percentage of the data that we want to separate out as training data . In our case it’s 30% , although this can be any number. The fourth argument ‘random_state’ just ensures that we get reproducible results every time.

Now, we have everything ready and here comes the most important and interesting part of this tutorial: building a prediction model using the vast library of algorithms available through scikit-learn.

Building The Model

There’s a machine_learning_map available on scikit learn’s website that we can use as a quick reference when choosing an algorithm. It looks something like this:

ML-cheat-sheet-1

We can use this map as a cheat sheet to shortlist the algorithms that we can try out to build our prediction model. Using the checklist let’s see under which category we fall:

  • More than 50 samples – Check
  • Are we predicting a category – Check
  • We have labeled data? ( data with clear names like opportunity amount etc.) – Check
  • Less than 100k samples – Check

Based on the checklist that we prepared above and going by the machine_learning_map we can try out the below mentioned algorithms.

  • Naive Bayes
  • Linear SVC
  • K-Neighbours Classifier

The real beauty of the scikit-learn library is that it exposes high level APIs for different algorithms, making it easier for us to try out different algorithms and compare the accuracy of the models to see what works best for our data set.

Let’s begin trying out the different algorithms one by one.

Naive-Bayes

Scikit-learn provides a set of classification algorithms which “naively” assumes that in a data set every pair of features are independent. This assumption is the underlying principle of Bayes theorem. The algorithms based on this principle are known as Naive-Bayes algorithms.

On a very high level a Naive-Bayes algorithm calculates the probability of the connection of a feature with a target variable and then it selects the feature with the highest probability. Let’s try to understand this with a very simple problem statement: Will it rain today? Suppose we have a set of weather data with us that will be our feature set, and the probability of ‘Rain’ will be our target. Based on this feature set we can create a table to show us the number of times a particular feature/target pair occur. It would look something like this:

NB_occurancetable-1

In the table above the feature (column) ‘Weather’ contains the labels (‘Partially Cloudy’ and ‘Cloudy’) and the column ‘Rain’ contains the occurrence of rain coinciding with the feature ‘Weather’ (Yes/No). Whenever a feature lcoincides with rain, it’s recorded as a ‘Yes’ and when the feature didn’t lead to rain it is recorded as a ‘No’. We can now use the data from the occurrence table to create another table known as the ‘Frequency table’ where we can record the number of ‘Yes’ and the number of ‘No’ answers that each feature relates to:

NB-Frequency_Table

Finally, we combine the data from the ‘occurrence table’ and the ‘frequency table’ and create a ‘likelihood table’. This table lists the amount of ‘Yes’ and ‘No’ for each feature and then uses this data to calculate the probability of contibution of each feature towards the occurrence of rain:

NB-Probability_Table

Notice the ‘Individual Probability’ column in the table above. We had 6 occurrences of the features ‘Partially Cloudy’ and ‘Cloudy’ from the ‘Occurrence table’ and from the ‘Likelihood table’ it was clear that the feature ‘Partially Cloudy’ had 4 occurrences (2 for ‘No’ and 2 for ‘yes’). When we divide the number of occurrences of ‘No’ and ‘Yes’ of a particular feature with the ‘total’ of the ‘occurrence table’, we get the probability of that particular feature. In our case if we need to find out that which feature has the strongest probability of contributing to the occurrence of Rain then we take the total number of ‘No’ of each feature and add it to their respective number of ‘Yes’ from the ‘frequency table’ and then divide the sum with the ‘Total’ from the óccurances table’. This gives us the probability of each of these features coinciding with rain.

The algorithm that we are going to use for our sales data is the Gaussian Naive Bayes and it is based on a concept similar to the weather example we just explored above, although significantly more mathematically complicated. A more detailed explanation of ‘Naive-Bayes’ algorithms can be found here for those who wish to delve deeper.

Now let’s implement the Gaussian Naive Bayes or GaussianNB algorithm from scikit-learn to create our prediction model:

# import the necessary module
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
#create an object of the type GaussianNB
gnb = GaussianNB()
#train the algorithm on training data and predict using the testing data
pred = gnb.fit(data_train, target_train).predict(data_test)
#print(pred.tolist())
#print the accuracy score of the model
print("Naive-Bayes accuracy : ",accuracy_score(target_test, pred, normalize = True))
Naive-Bayes accuracy : 0.759056732741

Now let’s take a closer look at what we just did. First, we imported the GaussianNB method and the accuracy_score method. Then we created an object gnb of the type GaussianNB. After this, we trained the algorithm on the testing data(data_train) and testing target(target_train) using the fit() method, and then predicted the targets in the test data using the predict() method. Finally we printed the score using the accuracy_score() method and with this we have successfully applied the Naive-Bayes algorithm to build a prediction model.

Now lets see how the other algorithms in our list perform as compared to the Naive-Bayes algorithm.

LinearSVC

LinearSVC or Linear Support Vector Classification is a subclass of the SVM (Support Vector Machine) class. We won’t go into the intricacies of the mathematics involved in this class of algorithms, but on a very basic level LinearSVC tries to divide the data into different planes so that it can find a best possible grouping of different classes. To get a clear understanding of this concept let’s imagine a data set of ‘dots’ and ‘squares’ divided into a two dimensional space along two axis, as shown in the image below:

SVM-1
Source:StackOverflow

In the image above a LinearSVC implementation tries to divide the two-dimensional space in such a way that the two classes of data i.e the dots and squares are clearly divided. Here the two lines visually represent the various division that the LinearSVC tries to implement to separate out the two available classes.

A very good writeup explaining a Support Vector Machine(SVM) can be found here for those who’d like more detail, but for now, let’s just dive in and get our hands dirty:

#import the necessary modules
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
#create an object of type LinearSVC
svc_model = LinearSVC(random_state=0)
#train the algorithm on training data and predict using the testing data
pred = svc_model.fit(data_train, target_train).predict(data_test)
#print the accuracy score of the model
print("LinearSVC accuracy : ",accuracy_score(target_test, pred, normalize = True))
LinearSVC accuracy : 0.777811004785

Similar to what we did during the implementation of GaussianNB, we imported the required modules in the first two lines. Then we created an object svc_model of type LinearSVC with random_state as ‘0’. Hold on! What is a “random_state” ? Simply put the random_state is an instruction to the built-in random number generator to shuffle the data in a specific order.

Next, we trained the LinearSVC on the training data and then predicted the target using the test data. Finally, we checked the accuracy score using the accuracy_score() method.

Now that we have tried out the GaussianNB and LinearSVC algorithms we will try out the last algorithm in our list and that’s the K-nearest neighbours classifier

K-Neighbors Classifier

Compared to the previous two algorithms we’ve worked with, this classifier is a bit more complex. For the purposes of this tutorial we are better off using the KNeighborsClassifier class provided by scikit-learn without worrying much about how the algorithm works. (But if you’re interested, a very detailed explanation of this class of algorithms can be found here)

Now, let’s implement the K-Neighbors Classifier and see how it scores:

#import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
#create object of the lassifier
neigh = KNeighborsClassifier(n_neighbors=3)
#Train the algorithm
neigh.fit(data_train, target_train)
# predict the response
pred = neigh.predict(data_test)
# evaluate accuracy
print ("KNeighbors accuracy score : ",accuracy_score(target_test, pred))
KNeighbors accuracy score : 0.814550580998

The above code can be explained just like the previous implementations. First we imported the necessary modules, then we created the object neigh of type KNeighborsClassifier with the number of neighbors being n_neighbors=3. Then we used the fit() method to train our algorithm on the training set, then we tested the model on the test data. Finally, we printed out the accuracy score.

Now that we have implemented all the algorithms in our list, we can simply compare the scores of all the models to select the model with the highest score. But wouldn’t it be nice if we had a way to visually compare the performance of the different models? We can use the yellowbrick library in scikit-learn, which provides methods for visually representing different scoring methods.

Performance Comparison

In the previous sections we have used the accuracy_score() method to measure the accuracy of the different algorithms. Now, we will use the ClassificationReport class provided by the Yellowbrick library to give us a visual report of how our models perform.

GaussianNB

Let’s start off with the GaussianNB model:

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(gnb, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_38_0

In the code above, first we import the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport is created. Here the first argument is the GaussianNB object gnb that was created while implementing the Naive-Bayes algorithm in the ‘Naive-Bayes’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we use the fit() method to train the visualizer object. This is followed by the score() method, which uses gnb object to carry out predictions as per the GaussianNB algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally, we use the poof() method to draw a plot of the different scores for the GaussianNB algorithm. Notice how the different scores are laid out against each of the labels ‘Won’ and ‘Loss’; this enables us to visualize the scores across the different target classes.

LinearSVC

Similar to what we just did in the previous section, we can also plot the accuracy scores of the LinearSVC algorithm:

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(svc_model, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_41_0

In the code above, first we imported the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport was created. Here the first argument is the LinearSVC object svc_model, that was created while implementing the LinearSVC algorithm in the ‘LinearSVC’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we used the fit() method to train the ‘svc_model’ object. This is followed by the score() method which uses the svc_model object to carry out predictions according to the LinearSVC algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally, we used the poof() method to draw a plot of the different scores for the LinearSVC algorithm.

KNeighborsClassifier

Now, let’s do the same thing for the K-Neighbors Classifier scores.

from yellowbrick.classifier import ClassificationReport
# Instantiate the classification model and visualizer
visualizer = ClassificationReport(neigh, classes=['Won','Loss'])
visualizer.fit(data_train, target_train) # Fit the training data to the visualizer
visualizer.score(data_test, target_test) # Evaluate the model on the test data
g = visualizer.poof() # Draw/show/poof the data

output_43_0

Once again, we first import the ClassificationReport class provided by the yellowbrick.classifier module. Next, an object visualizer of the type ClassificationReport is created. Here the first argument is the KNeighborsClassifier object neigh, that was created while implementing the KNeighborsClassifier algorithm in the ‘KNeighborsClassifier’ section. The second argument contains the labels ‘Won’ and ‘Loss’ from the ‘Opportunity Result’ column from the sales_data dataframe.

Next, we use the fit() method to train the ‘neigh’ object. This is followed by the score() method which uses the neigh object to carry out predictions according to the KNeighborsClassifier algorithm and then calculate the accuracy score of the predictions made by this algorithm. Finally we use the poof() method to draw a plot of the different scores for the KNeighborsClassifier algorithm.

Now that we’ve visualized the results, it’s much easier for us to compare the scores and choose the algorithm that’s going to work best for our needs.

Conclusion

The scikit-learn library provides many different algorithms which can be imported into the code and then used to build models just like we would import any other Python library. This makes it easier to quickly build different models and compare these models to select the highest scoring one.

In this tutorial, we have only scratched the surface of what is possible with the scikit-learn library. To use this Machine Learning library to the fullest, there are many resources available on the official page of scikit-learn with detailed documentation that you can dive into. The quick start guide for scikit-learn can be found here, and that’s a good entry point for beginners who have just started exploring the world of Machine Learning.

But to really appreciate the true power of the scikit-learn library, what you really need to do is start using it on different open data sets and building predictive models using these data sets. Sources for open data sets include Kaggle and Data.world. Both contain many interesting data sets on which one can practice building predictive models by using the algorithms provided by the scikit-learn library.

[출처] https://www.dataquest.io/blog/sci-kit-learn-tutorial/

 103 total views

21 11월 2022

[ADsP] 취업 깡패 ADP 뿌시기! “빅데이터 분석가 최고의 자격증이에요”

[ADsP] 취업 깡패 ADP 뿌시기! “빅데이터 분석가 최고의 자격증이에요”

명실상부 데이터 분석 분야의 최고 자격증은 ADP(데이터분석 전문가)입니다. 그다음으로는 빅데이터 분석가들이 따는 빅데이터 분석기사가 있죠. ADP(데이터분석 전문가)란 데이터 이해 및 처리 기술에 대한 기본 지식을 바탕으로 데이터분석 기획, 데이터분석, 데이터 시각화 업무를 수행하는 사람들을 말합니다.  ADP는 이를 통해 프로세스 혁신 및 마케팅 전략 결정 등의 과학적 의사결정을 지원하는 직무를 수행하는 전문가들입니다. 

이제는 자격증 취득자가 2만 명이 넘는 ADsP가 아닌, 이제는 나만의 ‘한 방’이 더 필요한 시점입니다. ADP 합격률은 겨우 2.5%에 불과합니다. 그만큼 ADP를 가지고 있으면 취업시장에서 유리한 위치를 차지할 수 있습니다. 어디에서도 쉽게 알려주지 않는 ADP 자격증 수업을 클래스101에서 만나보세요. 

 

ADP 시험과
빅데이터 분석가 실기를 한 번에!

금융권과 대기업 등 많은 회사에서 이미 데이터 분석 능력을 원하고 있습니다. 유명 대기업 채용 공고에서도 ADP를 우대한다는 내용은 쉽게 찾아볼 수 있습니다. ADsP 자격증을 가지고 있다면 이제는 ADP 자격증으로 나의 커리어를 한 단계 올릴 시간입니다. ADP 합격률은 2.5%에 불과하지만 어렵기에 그만큼 더 공신력 있는 자격증입니다.  

합격률만 본다면 ‘과연 내가 할 수 있을까?’라는 생각이 덜컥 들 수 있습니다. 하지만 ADP 자격증은 어려운 만큼 취득하기만 한다면 확실한 보상이 따라오는 자격증이기도 합니다. 

하지만 현재 ADP를 위한 강의와 실기 시험을 위한 Python 교재 또한 없는 게 현실입니다. 응시자 수는 점점 늘어나고 있는데 말입니다. 많은 기업에서 우대해 주는 자격증인 만큼, 앞으로 응시자 수는 계속해서 높아질 것으로 보입니다. 

시험에 대한 정보가 부족했을 당시 직접 책을 만들어 시험에 합격한 전문가에게 ADP 자격증 실기 수업을 들어보세요. 합격 노하우를 모두 담아낸 ADP 실기 요약집과 ADP 실기에 맞게 재구성한 커리큘럼으로 가장 빠른 ADP 합격의 길을 열어드리겠습니다. 

ADP 시험은 크게 데이터 기획, 데이터 분석, 데이터 시각화로 나뉩니다. ‘데이터를 보고 기획할 수 있는가?’, ‘데이터를 보고 모델링, 검증 및 테스트, 적용을 할 수 있는가?’, ‘시각화를 할 수 있는가?’ 등을 묻는 시험입니다. 이 모든 것을 암기하기에는 방대한 양을 감당할 수 없습니다. 그래서 이번 클래스에서는 ADP 출제 경향을 분석해 수험생이 최대한 효율적으로 공부할 수 있도록 최적의 ADP 실기 커리큘럼을 구성했습니다. 

ADP 실기는 오픈북 시험입니다. 그럼에도 외워야 할 것과 외우지 말아야 할 것은 분명히 정해져 있습니다. 효율적인 시험 준비를 위해 꼭 숙달해야 하는 부분과 자료로 준비해야 하는 부분을 구분해서 가르쳐 드리겠습니다. 

실기 시험에서는 문제를 보고 어떠한 알고리즘을 적용해서 풀어야 하는지에 관한 데이터 기획 문제도 있습니다. 어떤 분석 기법을 언제 적용해야 하는지는 데이터에 따라 달라집니다. 그렇기에 비전공자도 문제에 접근할 수 있도록 이론 설명을 커리큘럼에 포함했습니다. 

또한 시험에는 분석 결과를 시각적으로 표현하는 것이 많습니다. 분석 결과를 보여주면서 설명을 할 수 있게 알려드립니다. 

최근에 시행된 빅데이터 분석가(빅데이터 분석기사) 시험도 ADP와 함께 준비하면 좋습니다. 빅데이터 분석가 시험은 ADP 실기 공부와 방향이 같습니다. 다만 시험 스타일이 조금 다를 뿐입니다. ADP는 오픈북이며 이론에 대한 설명까지 원한다면, 빅데이터 분석가는 모델을 구현할 수 있는지를 물어봅니다. 시험 난이도는 데이터분석 전문가 시험에 비해 훨씬 쉽습니다. 하나의 클래스로 ADP 실기와 빅데이터 분석가 실기까지 한 번에 준비해 보세요. 

ADP 실기 합격 
보장하는 강의 듣기!>>

 

독학으로 따는
SQLD 자격증!

데이터 관련 자격증은 ADP뿐만 아니라 다양합니다. 특히 비전공자라도 SQLD 자격증은 얼마든지 독학으로 가능합니다.

SQLD 자격증을 소지하면 다양한 업무를 보다 효율적으로 처리할 수 있습니다. SQLD 자격증을 소지하면 SQL로 데이터를 직접 다룰 수 있습니다. 업무에 필요한 대부분의 데이터는 회사 DB에 저장돼 있습니다. 그 DB에서 꺼내서 활용하기만 하면 되는데, 대부분의 사람들이 그 방법을 몰라 제대로 데이터를 활용하지 못하고 있습니다.

이때 필요한 것이 SQL입니다. SQL를 할 줄 안다는 것은 회사 보고서, 회의 자료를 사내 데이터 기반으로 쓸 수 있다는 것을 의미합니다. 꼭 보고하는 용도가 아니더라도, 언제든 내가 필요할 때 원하는 형태로 데이터를 꺼내서 업무에 활용할 수 있습니다. 이제 SQLD 자격증을 통해 데이터 역량을 갖출 시간입니다. 

SQLD 자격증을 가지게 되면 DB에 저장된 수많은 데이터를 업무에 자유자재로 활용할 수 있게 됩니다. 내 주장에 힘을 실어줄 근거 데이터를 찾거나, 번뜩이는 아이디어를 데이터로 검증할 수 있게 되는 거죠. 예전에는 엑셀만으로 충분했고, 취업을 할 때도 엑셀 사용 능력 정도를 중요하게 봤지만 요즘은 더 정확한 의사결정을 위해 업무에 필요한 데이터를 직접 추출하고 가공하는 SQLD 자격증이 더 요구되고 있는 상황입니다. 

실제로 기존 대기업 및 중견기업들의 디지털 트랜스포메이션이 가속화되면서, 이제는 대부분의 문과 직종이라 불리는 기획, 마케팅, 영업, 사업 관리, 서비스 운영 등에서 SQLD 자격증을 우대하곤 합니다. 

비전공자를 위해 생소한 용어는 이해하기 쉽게 사례로 설명해 드립니다. 단순히 줄줄 읽는 것이 아닌 실제 데이터가 처리되는 과정을 도식화해서 알려드립니다. 특히, 실무에서 자주 일어나는 실수를 미리 배워서 시행착오를 줄이고 실무 능력을 갖출 수 있도록 도와드리겠습니다. 이번 클래스 하나면 SQLD 독학을 혼자서 해낼 수 있을 뿐만 아니라 실무 능력까지 덤으로 갖추실 수 있습니다. 

SQLD 자격증 독학
인강 하나로 완성!>>

 

비트코인, 주식, 부동산에 써먹는
실용적인 데이터 분석!

데이터 분석은 자격증 뿐만 아니라 우리 실생활에서도 깊이 스며들어 있습니다. 주식, 부동산, 비트코인 등 실생활에 밀접한 주제들로 데이터 분석을 배워보세요. 내가 원하는 주제로 데이터를 분석하다 보면 어렵지 않게 데이터 분석을 공부할 수 있습니다. 

파이썬을 익히면 어렵지 않게 코드 몇 줄로 빠른 데이터 분석을 할 수 있습니다. 엑셀로는 불가능한 일도, 파이썬이라면 가능합니다. 원하는 데이터를 뽑고, 분석하고, 마지막으로 그래프로 시각화하는 능력까지 만들어드리겠습니다. 

수익화에 활용할 수 있는 실용적인 데이터 분석을 알려드리겠습니다. 15년 치 부동산 매매가 분석을 단 몇 줄의 코드로 한 번에 끝낼 수 있습니다. 직장에서도 투자에서도 이제는 데이터 분석을 활용해 보세요. 이전과는 다른 새로운 시각으로 세상을 읽게 됩니다.

[출처] https://m.post.naver.com/viewer/postView.naver?volumeNo=32969657&memberNo=47129033

 92 total views,  2 views today