<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Robin_UPDATA.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 28 Apr 2024 07:19:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Robin_UPDATA.log</title>
            <url>https://velog.velcdn.com/images/robin_updata/profile/b3ad6ff0-6601-4cf3-8630-2327ec7b1c0f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Robin_UPDATA.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/robin_updata" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[유데미(Udemy) 강의 후기] Linux Command Line 부트캠프: 리눅스 초보자부터 고수까지]]></title>
            <link>https://velog.io/@robin_updata/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B0%95%EC%9D%98%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@robin_updata/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B0%95%EC%9D%98%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 28 Apr 2024 07:19:51 GMT</pubDate>
            <description><![CDATA[<h2 id="인트로">인트로</h2>
<p>리눅스는 많이 들어보고 실제로도 사용해보긴 했지만 실제로 제대로 학습하고 이해하면서 사용하지는 잘 않는 듯 합니다. 저만 하더라도 실제로 공부를 하기보다는 터미널 환경을 어떻게 꾸미는지 더 관심이 많았습니다. 모두가 사용하기는 하지만 잘 알고 있지는 못하는 linux command line에 대해서 학습할 기회가 생겼고 이에 대한 후기를 이렇게 작성하게 되었습니다. </p>
<p>글또를 통해서 좋은 기회를 얻을 수 있었고 이렇게 <a href="https://www.udemy.com/course/linux-command-line-colt">&quot;【한글자막】 Linux Command Line 부트캠프: 리눅스 초보자부터 고수까지&quot;</a>를 들을 수 있게 되었습니다. 많은 분들이 이 강의를 통해서 제대로 된 작동방식을 이해할 수 있을 것이라고 생각하며 이러한 후기를 작성합니다.</p>
<p>linux command line은 리눅스 운영 체제에서 사용되는 텍스트 기반의 인터페이스를 의미합니다. 이는 GUI 대신 명령어를 통해 컴퓨터와 상호 작용하는 방식을 제공합니다. </p>
<p>데이터 분석을 하면서 이러한 지식을 왜 공부해야 하는지 의문이 생길 수 있는데 다음과 같은 환경에 적응하기 위해서 공부를 해야 한다고 생각합니다. </p>
<p>첫째, 리눅스 커맨드 라인은 데이터 처리와 관리를 자동화하고 효율적으로 수행하는 데 필수적입니다. 대용량 데이터를 다루는 경우, 여러 파일을 처리하거나 데이터를 필터링하고 가공하는 과정에서 리눅스 커맨드 라인은 훨씬 빠르고 효율적인 도구가 될 수 있습니다. 예를 들어, grep, sed, awk와 같은 커맨드를 사용하여 데이터를 검색하고 가공할 수 있습니다. 또한, 리눅스에서 제공하는 스크립팅 언어를 활용하여 반복적인 작업을 자동화할 수 있습니다.</p>
<p>둘째, 데이터 분석가는 종종 클라우드 환경에서 작업을 수행하고 대용량 데이터를 처리해야 합니다. 이러한 환경에서는 리눅스 기반의 운영 체제가 많이 사용됩니다. 따라서 리눅스 커맨드 라인을 이해하고 활용할 수 있는 능력은 클라우드 컴퓨팅 환경에서의 작업을 원활하게 수행하는 데 필수적입니다.</p>
<p>셋째, 데이터 분석가는 종종 서버에서 데이터를 처리하거나 배치 작업을 실행해야 합니다. 이러한 작업을 수행할 때 리눅스 커맨드 라인을 사용하면 서버 자원을 효율적으로 활용할 수 있고, 작업을 관리하고 모니터링할 수 있습니다. 또한, 리눅스 커맨드 라인을 통해 서버 설정을 관리하고 보안을 강화하는 등의 작업을 수행할 수 있습니다.</p>
<p>따라서 데이터 분석가는 리눅스 커맨드 라인을 배우고 활용함으로써 데이터 처리 및 관리 작업을 더욱 효율적으로 수행할 수 있으며, 클라우드 환경이나 서버에서의 작업을 보다 원활하게 수행할 수 있습니다. 저 또한 일부 회사에서는 리눅스를 소극적으로만 활용해서 구글링해서 배운 내용으로만으로 충분했다면 일부 회사에서는 리눅스를 본격적으로 공부했어야 하는 경험이 있습니다. 따라서 상황에 따라서 다르므로 자신의 현 상황을 보고 해당 공부를 할지 안할지 결정하면 좋을 듯 합니다.</p>
<p>대표적으로 리눅스를 활용하는 방안으로는 airflow를 사용하는 환경에 있습니다. 물론 다른 지식 또한 필요하지만 airflow를 사용함에 있어 리눅스에 대한 지식은 필수적입니다. 리눅스를 학습하면서 다양한 업무를 더욱 효율적으로 진행할 수 있습니다.</p>
<h2 id="강의-주요-내용">강의 주요 내용</h2>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/206f5eca-0e47-4ea3-9dca-4b5f33214c6d/image.png" alt=""></p>
<p>강의는 약 15시간으로 진행되며 위와 같은 차례로 구성되어있습니다. 이 강의는 단순 영상 강의 뿐만 아니라 실습과 프로젝트가 포함되어 있습니다.</p>
<p>여기에서는 커맨드 라인을 통해 파일을 생성하고 관리하는 방법부터 시작하여, 유닉스 파일 시스템을 탐색하고 데이터를 처리하는 방법을 배웁니다. 그리고는 유닉스 파일 퍼미션을 다루고, 검색 커맨드를 이용하여 원하는 파일을 찾고 내용을 검색하는 방법을 익힐 수 있습니다. 또한 터미널에서의 효율적인 작업을 위한 다양한 단축키와 기능들을 소개하며, 여러 커맨드를 함께 조합하여 데이터 파이프라인을 구축하는 방법을 연습합니다.</p>
<p>ls, pwd, cd와 같은 필수적인 커맨드부터 시작하여 touch, mkdir, file 등을 통해 실제 파일과 폴더를 만드는 방법을 익히게 됩니다. 또한 Nano와 같은 텍스트 편집기를 사용하여 파일을 편집하는 방법을 배우며, rm, mv, cp와 같은 파일 조작 커맨드를 공부합니다.</p>
<p>그 이후에는 히스토리 관리와 유용한 키보드 단축키를 통해 터미널 효율성을 향상시키고, 파일 내용을 다루는 다양한 커맨드를 익히게 됩니다. 또한 파이핑을 통해 여러 커맨드를 연결하여 강력한 데이터 파이프라인을 구축하는 방법을 배우고, find와 grep을 사용하여 파일 검색과 내용 검색을 수행하는 기술을 강화합니다. 파일 퍼미션에 대한 이해와 관련된 커맨드도 익히며, 쉘 환경을 사용자 지정하여 프롬프트와 변수를 조작하는 방법을 배웁니다. 마지막으로 cron을 통해 지루한 작업을 자동화하는 방법을 습득하여 효율적인 시스템 관리 능력을 향상시킵니다.</p>
<h2 id="강의-후기-정리">강의 후기 정리</h2>
<p>장점과 단점을 정리해보자면 아래처럼 나눠볼 수 있을 듯 합니다.</p>
<p><strong>장점</strong></p>
<ol>
<li>리눅스에 대해서 전혀 모르는 사람도 듣기에 적합할 정도로 설명이 자세하다.</li>
<li>신기한 명령어에 대해서도 배울 수 있다.</li>
<li>실습이 있기 때문에 확실히 배울 수 있다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>리눅스를 사용할 줄 아는 사람에게는 너무 기초적일 수 있다.</li>
<li>강의 자체가 길다.</li>
</ol>
<p>이러한 장단점에 기초해봤을 때 다음과 같은 사람이 듣기에 적합한 강의라고 생각합니다.</p>
<ul>
<li>리눅스에 대해서 cd, ls 정도 밖에 알지 못하는 초심자</li>
<li>리눅스에 대해서 조금은 다룰 수 있지만 더욱 이해하고 싶은 사람</li>
<li>다양한 리눅스 명령어를 사용해보고 싶은 사람</li>
</ul>
<p>반면에 다음과 같은 분들은 강의에 적합하지 않다고 생각합니다.</p>
<ul>
<li>기초적인 리눅스 지식만으로도 충분한 사람</li>
<li>어느 정도 리눅스를 알고 있으며 너무 많은 지식이 필요하지 않은 사람</li>
</ul>
<p>해당 강의를 통해서 리눅스에 대해서 더욱 잘 이해하고 프로젝트, 실무에 있어서 모두 잘 적용하시길 바랍니다.</p>
<blockquote>
<p><strong>해당 콘텐츠는 유데미로부터 강의 쿠폰을 제공받아 작성되었습니다.</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미(Udemy) 강의 후기] Git & Github 실무 활용 완벽 가이드]]></title>
            <link>https://velog.io/@robin_updata/Git%EA%B0%95%EC%9D%98%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@robin_updata/Git%EA%B0%95%EC%9D%98%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 14 Apr 2024 05:18:32 GMT</pubDate>
            <description><![CDATA[<h2 id="깃을-제대로-공부해보자">깃을 제대로 공부해보자</h2>
<p>개발을 하면서, 혹은 회사를 다니며 협업과 버전 관리는 핵심적인 요소입니다. 이에 대한 해결책 중 하나로 등장한 것이 Git과 GitHub입니다.</p>
<p>이러한 Git과 GitHub는 더 이상 선택 사항이 아닌 필수적인 도구라고 생각합니다. 하지만 저를 포함하여 이 두 기술이 어떻게 작동되는지, 그리고 이를 효과적으로 활용하기 위한 기본 이론들은 많은 실무자들에게는 여전히 낯설 수 있습니다. </p>
<p>Git은 프로젝트의 모든 버전을 추적하고 관리할 수 있도록 도와줍니다. 이를 통해 코드의 변경 내역을 기록하고, 이전 상태로 쉽게 돌아갈 수 있습니다. 또한, 여러 명의 개발자가 동시에 작업할 때 발생할 수 있는 충돌을 방지하고, 변경 내역을 팀원들과 공유하여 협업을 원활하게 할 수 있습니다. Git의 버전 관리 기능은 코드의 안정성과 신뢰성을 높이는 데 중요한 역할을 하며, 개발 프로세스를 효율적으로 관리하는 데 필수적입니다.</p>
<p>따라서 저는 Git과 GitHub에 대해서 다시금 공부를 할 필요성을 느꼈습니다. 그러던 중 글또를 통해서 좋은 기회를 얻을 수 있었고 이렇게 <a href="https://www.udemy.com/course/best-git-github/?couponCode=ST8MT40924">&quot;【한글자막】 Git &amp; Github 실무 활용 완벽 가이드&quot;</a>를 들을 수 있게 되었습니다.</p>
<p>저 뿐만 아니라 그 동안 구글링을 통해서만 깃과 깃헙에 대해서 공부해왔던 많은 분들이 이 강의를 통해서 제대로 된 작동방식을 이해할 수 있을 것이라고 생각하며 이러한 후기를 작성합니다.</p>
<h2 id="강의-주요-내용">강의 주요 내용</h2>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/b37b78e2-d988-47d8-b2a4-333100b614c1/image.png" alt=""></p>
<p>강의는 약 17시간으로 구성되어 있으며 위와 같은 차례로 진행됩니다.</p>
<p>첫 번째 섹션에서는 Git의 기초 명령어를 다루며, git init, git add, git commit 등의 명령어를 통해 Git의 핵심 원리와 개념을 익힙니다. 또한, 브랜치와 머지에 대한 이해와 충돌 해결 방법도 배웁니다.</p>
<p>두 번째 섹션에서는 Git의 심화 명령어와 개념을 살펴봅니다. git diff, git stash, git checkout 등을 통해 변경사항을 관리하고, Git의 내부 동작에 대해 좀 더 심도 있게 이해합니다.</p>
<p>세 번째 섹션에서는 GitHub를 활용한 협업과 관련된 내용을 다룹니다. git push, git pull 등의 명령어를 사용하여 원격 저장소와의 작업을 동기화하고, pull request, forking 등을 통해 오픈 소스 프로젝트에 기여하는 방법을 익힙니다.</p>
<p>마지막으로 네 번째 섹션에서는 Git의 고급 기능들을 다룹니다. rebase와 interactive rebase를 통해 Git history를 관리하고, Git tag를 이용한 태그 관리 워크플로우를 학습합니다.</p>
<hr>
<h2 id="강의-후기-정리">강의 후기 정리</h2>
<p>장점과 단점을 정리해보자면 아래처럼 나눠볼 수 있을 듯 합니다.</p>
<p><strong>장점</strong></p>
<ol>
<li>직관적이며 이해하기 쉽게 설명을 해준다</li>
<li>평소에 사용하지 않는 새로운 깃 기능 또한 설명해주면서 깃에 대해서 더 자세하게 알 수 있게 해준다.</li>
<li>강사분의 독특한 유머감각이 재미있다.</li>
<li>영어로 진행한다. 따라서 용어를 이해하기가 더 편하다.</li>
</ol>
<p><strong>단점</strong></p>
<ol>
<li>강의 시간이 17시간이나 된다. 물론 자세하긴 하지만 해당 주제에 비해 너무 긴 시간을 사용해야 한다.</li>
<li>실제로 실무에 사용하는 것보다 더 많은 지식을 전달한다. 실제로 사용하기에는 적합하지 않을 수 있다.</li>
</ol>
<p>이러한 장단점에 기초해봤을 때 다음과 같은 사람이 듣기에 적합한 강의라고 생각합니다.</p>
<ul>
<li>이미 어느정도 깃을 사용하지만 더욱 자세하게 작동원리를 이해하고 싶은 사람</li>
<li>깃을 gitlens 등 편의성 도구 등을 통해 이용해왔지만 제대로 사용해보고 싶은 사람</li>
<li>깃을 처음 사용해보는 사람</li>
</ul>
<p>반면에 다음과 같은 분들은 강의에 적합하지 않다고 생각합니다.</p>
<ul>
<li>깃렌즈, vscode 확장 등으로 깃을 사용하는데 충분하다고 생각하는 사람</li>
<li>깃을 사용할 수 있으며 작동원리에 대해서는 관심이 없는 사람</li>
</ul>
<p>해당 강의를 통해서 깃에 대해서 더욱 잘 이해하고 프로젝트, 실무에 있어서 모두 잘 적용하시길 바랍니다.</p>
<blockquote>
<p><strong>해당 콘텐츠는 유데미로부터 강의 쿠폰을 제공받아 작성되었습니다.</strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅데이터 101]]></title>
            <link>https://velog.io/@robin_updata/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@robin_updata/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sun, 18 Feb 2024 08:47:55 GMT</pubDate>
            <description><![CDATA[<h3 id="01-왜-갑자기-빅데이터공부를-준비하게-되었나">01. 왜 갑자기 빅데이터공부를 준비하게 되었나</h3>
<p>빅데이터 분석기사(이하 빅데분)은 2019년에 창설된 기사 자격증으로 SQLD, ADsP 등 데이터 관련 자격증을 공부하거나 준비해본 사람이라면 들어본 적 있는 자격증이다. 필기와 실기로 구성되어 있으며 아직 오래되지 않은 시험이기에 여러 가지로 말이 많은 상황이다.</p>
<p>사실 빅데분은 들어만 봤지 전혀 관심이 없는 자격증이었다. 그 이유는 이미 데이터분석가로서 일을 하고 있는 상황에서 자격증의 유무는 업무에 전혀 영향을 미치지 않기 때문이다. 자격증보다는 실무를 얼마나 잘하는지, 그리고 실무에 필요한 지식이 있는지 여부가 중요했지 자격증은 전혀 중요하지 않았다.</p>
<p>또한 이직도 하면서 자격증을 물어보는 경험도 없었고 첫 번째 회사도, 두 번째 회사도 자격증 없이 잘 다니고 있기에 실제로 필요성을 느끼지 못했다. 특히 SQLD를 취득할 때도 실무에는 크게 도움이 된다고 못느꼈지 때문에 빅데이터 분석기사 또한 관심이 없었다.</p>
<p>다만 최근에 회사에서 빅데이터 관련된 용어나 지식을 사용할 일이 있었는데 물론 실무적인 지식이긴 했지만 내가 이러한 분야에 대한 기초지식이 부족하기 때문에 이해가 느리다는 생각이 들었다. 당장에 업무에 도움이 되기 위해서는 구글링을 하거나 다른 공부를 하는게 맞겠지만 길게 봤을 때 빅데이터 공부가 내 커리어, 그리고 실무에도 도움이 될 거라는 생각에 빅데이터 공부를 결정하게 되었다.</p>
<p>그리고 빅데이터 공부를 하는데 자격증 또한 동시에 취득할 수 있다면 동기부여가 될 듯 하여 빅데이터 분석기사를 준비하게 되었다.</p>
<h3 id="02-일정-및-준비-계획">02. 일정 및 준비 계획</h3>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/aaaaeb1c-2a55-43e7-ad86-20e15a8c3b83/image.png" alt=""></p>
<p>빅데이터분석기사는 1년에 시험이 총 2회만 진행된다. 이 중 나는 제 9회 시험을 보려고 계획 중이다. 8회 시험을 봐도 큰 문제는 없을 듯 하지만 24년 상반기에는 큰 일이 워낙에 많아서 하반기 9월 7일 시험을 보려고 한다. </p>
<p>다만 9월 7일 시험이기에 지금부터 공부하는 건 시간 낭비가 크다고 본다. 배경 지식이 얼마나 있는지에 따라 다르겠지만 한달 넘게 공부하는건 효율적이지 않다고 생각하기 때문에 빅데이터 분석기사 공부를 시작하기에 앞서 기본적인 빅데이터 이론 공부를 진행하는 것이 더 옳다고 본다. 따라서 아래 두 가지 방식으로 공부를 시작하려고 한다.</p>
<ol>
<li>책 <strong>빅데이터를 지탱하는 기술</strong>
(<a href="https://www.yes24.com/Product/Goods/66277191">https://www.yes24.com/Product/Goods/66277191</a>)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/207c2a61-5aa7-4c7c-8160-edeb3557da04/image.png" alt=""></p>
<p>해당 책은 데이터 엔지니어링 입문용으로 많이 추천되는 책으로 전반적인 분야에 대해서 지식을 얻기에 좋을 듯 하다. 따라서 해당 책으로 우선 빅데이터 전반에 대한 공부를 하고 이후 과정에 대해서 생각해보고자 한다. 만약 해당 책만 읽었는데 내가 원하는 충분한 지식 수준을 얻었다고 판단된다면 이후 과정을 진행하지 않을 수도 있을 듯 하다.</p>
<ol start="2">
<li>강의 *<em>빅데이터처리 with Spark&amp;Hadoop 초격차 패키지 Online. *</em>
(<a href="https://fastcampus.co.kr/data_online_spkhdp">https://fastcampus.co.kr/data_online_spkhdp</a>)</li>
</ol>
<p>해당 강의는 spark와 hadoop을 바탕으로 실무 관련된 지식에 대한 강의이다. 실제 예시 프로젝트를 진행할 수 있기 때문에 더 구체적인 지식을 알 수 있을 것이라고 생각이 된다. 다만 강의가 100시간이 넘기 때문에 해당 시간을 다 강의를 들을 수 있을지는 모르겠다. 만약 위 책을 읽고 더 궁금하거나 필요한 영역이 생기면 발췌해서 강의를 수강할 수 있을 듯 하다.</p>
<p>그리고 위 내용을 공부한 다음 일단 필기 위주로 공부를 하려고 하고 실기는 현재 내가 실무를 하는 내용에서 크게 벗어나는 내용이 없는 듯 하여 가볍게만 준비하려고 한다. 빅데분 필기 주제는 크게 아래와 같다.</p>
<ol>
<li>빅데이터 분석 기획</li>
<li>빅데이터 탐색</li>
<li>빅데이터 모델링</li>
<li>빅데이터 결과해석</li>
</ol>
<p>일단 2024 이기적 빅데이터분석기사 필기 기본서(<a href="https://product.kyobobook.co.kr/detail/S000208505879">https://product.kyobobook.co.kr/detail/S000208505879</a>) 를 바탕으로 공부를 할 예정이다. 후기를 찾아보니 해당 책이 너무 자세하게 이론을 다루고 있어 전체를 공부를 할 필요는 없다고 한다. 아직 7회만 진행된 시험이라 경향이 구체화되지는 않았겠지만 실제 기출문제를 풀어보면서 어떤 문제가 나올지 경향을 대략적으로 파악한 후 이론공부를 하는 방향이 더 맞을 듯 하다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/d04f2caa-f28f-4f02-bcf1-7a0b518e15a8/image.png" alt=""></p>
<p>실기는 파이썬과 R을 선택해서 진행할 수 있다. 나는 파이썬과 판다스가 익숙하기 때문에 파이썬으로 진행을 할 예정이다. 다만 필기와 다르게 실기는 강의나 책을 보고 진행하지 않을 예정이고 실제 문제나 깃헙 등에 업로드 되어있는 문제를 보고 실제로 진행을 해볼 예정이다.</p>
<h3 id="03-앞으로-방향성">03. 앞으로 방향성</h3>
<p>작년에는 이직 준비를 하면서 새로운 내용을 공부하기보다는 이전에 했던 내용을 정리하고 면접 방법과 이력서 작성 등 직무 공부에는 소홀히 했었다. 이제는 새로운 회사에서 일하게 된 만큼 실무와 새로운 지식 등을 공부하면서 내실을 다지는 시기가 되어야겠다. 원래는 통계 공부를 진행하려고 했으나 현생에 치여 통계 공부보다는 바로 업무에 도움이 되는 분야를 우선적으로 공부하는 것을 목표로 하고 있다. 빅데이터 공부 외에도 영어 공부 등을 통해서 여러 가지로 공부를 하는 한 해가 되어야겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0. 통계학 그게 돈이 됩니까]]></title>
            <link>https://velog.io/@robin_updata/0.-%ED%86%B5%EA%B3%84%ED%95%99-%EA%B7%B8%EA%B2%8C-%EB%8F%88%EC%9D%B4-%EB%90%A9%EB%8B%88%EA%B9%8C</link>
            <guid>https://velog.io/@robin_updata/0.-%ED%86%B5%EA%B3%84%ED%95%99-%EA%B7%B8%EA%B2%8C-%EB%8F%88%EC%9D%B4-%EB%90%A9%EB%8B%88%EA%B9%8C</guid>
            <pubDate>Sun, 07 Jan 2024 10:39:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/robin_updata/post/4e013fac-fc17-4b82-ae6c-14077496f2fb/image.png" alt=""></p>
<h3 id="00-회사에서-통계학">00. 회사에서 통계학</h3>
<p>  데이터 분석가로 일한 지 약 4년이란 시간이 지났습니다. 다양한 업무를 해왔지만 그 중 실제 일어난 이벤트에 대해서 추정하고 해석하는 일도 있었습니다. 보통 그런 일이 있으면 아래처럼 대화가 흘러갑니다.</p>
<hr>
<p>A : 고객에게 새로운 혜택을 지급했더니 구매고객수가 늘어난 것 같아. 이거 효과 분석 좀 해 줘
B : 지급 전보다 지급 후에 구매고객수가 늘어난 건 맞지만 이게 꼭 혜택때문에 그런 건 아닐 수 있어요
A : 혜택 지급 전이랑 지급 후 시점 구매고객수 차이가 있는데 그게 무슨 소리야?</p>
<hr>
<p>이런 상황에서 p-value가 뭐고 그래서 유의하고... 그런 이야기는 사실 회사에서는 도움이 안됩니다. 실무자 입장에서 그런 건 궁금하지 않을 뿐더러 통계학적 지식을 모두가 동등하게 가지고 있지는 않으니까요.</p>
<p>그러나 한 편으로는 이런 생각도 했습니다. 제가 통계학적 지식이 부족해서 제대로 설명을 못드리고 있는 건 아닐까? 원래 어떤 지식을 제대로 알고있다면 그걸 제대로 설명할 수 있는 정도여야 하니까요. 이런 생각에 한 번 p-value 같은 지식을 다른 누군가에게 설명해보려고 시도했지만 매우 어려웠습니다. 그래서 저는 이런 결론을 내렸습니다. 아, 나는 통계학을 제대로 이해하지 못했구나</p>
<p>이런 배경으로 통계학을 다시 한 번 공부하고 이를 제대로 정리해보기로 했습니다. 여기서 다루는 통계학은 아마 통계학의 전체 이론 보다는 실무에서 제가 필요했고 다시 공부해보고 싶었던 내용 위주로 작성될 예정입니다. 물론 저도 마지막으로 통계<strong>학</strong>을 공부한 건 오래되었기 때문에 기초적인 내용도 다루긴 할 듯 합니다. </p>
<h3 id="01-도대체-p-value가-뭘까">01. 도대체 p-value가 뭘까?</h3>
<p>p-value를 구글링했을 때 나오는 문장은 다음과 같습니다</p>
<blockquote>
<p>p-값(p-value)은 [귀무 가설](null hypothesis)이 맞다는 전제 하에, 표본에서 실제로 관측된 통계치와 &#39;같거나 더 극단적인&#39; 통계치가 관측될 확률이다.</p>
</blockquote>
<p>일단 어려운 단어가 많이 보입니다. 귀무 가설, 표본, 실제로 관측된, 통계치, 같거나 더 극단적인</p>
<p>일단 이렇게 어려운 단어는 제외하고 최대한 직관적인 이해를 하기 위해서 p-value를 뜯어보도록 하겠습니다. 우선 위 회사의 상황을 다시 풀어보자면 이렇게 말할 수 있습니다.</p>
<blockquote>
<p>새로운 혜택이란 이벤트가 구매고객수를 늘리는 데 영향을 미쳤나?</p>
</blockquote>
<p>회사를 다니면 다양한 이벤트를 맞이할 수 있습니다. 그러나 해당 이벤트(원인)가 고객 증대(결과)에 100% 온전히 영향을 미쳤다고 보기는 어렵습니다. 시간대에 따른 차이일 수도, 계절의 영향일 수도, 아니면 옆 부서에서 다른 이벤트를 했을 수도, 그게 다 아니고 그냥 <strong><em>우연히</em></strong> 발생한 것일 수도 있습니다.</p>
<p>그렇다면 해당 이벤트로 인해서 고객 증대가 발생했다고는 어떻게 말할 수 있을까요? 이럴 때 p-value를 기준으로 정말 우연히 고객증대가 발생했는지, 해당 이벤트로 인해서 고객 증대가 발생했는지 말을 할 수 있습니다. p-value란 어떤 결과가 <strong>우연히</strong> 발생할 수 있는 확률값(probability value)를 의미합니다. 즉, 고객 증대가 우연히 발생할 수 있는 값인지, 아닌지 그 확률값을 구해서 새로운 혜택이 고객 증대를 늘린 것이 우연히 발생한 것인지, 아니면 우연히 발생한 것이 아니라 유의한 것인지를 결정하는 것입니다.</p>
<p>이제 밑에서 더 자세하게 p-value에 대해서 정리를 해보겠지만 회사에서 더 중요한 지식을 하나 작성하고 넘어가보려고 합니다. 뭐 0.05가 뭐고 그런걸 떠나서 그래서 p-value를 구해서 유의한 거라면 그게 뭐 어떤 의미인데? 입니다. 사실 유의하다고 그게 정말 대단한 것은 아닙니다. 정말 말 그대로 새로운 혜택이 고객 증대에 영향을 미쳤다는 것 뿐입니다. 영향을 적게 미쳤을 수도, 크게 미쳤을 수도 있습니다. 그건 이 단계에서는 아직 알 수 없습니다. 다만 우리는 딱 이러한 결론에 미칠 수는 있습니다.</p>
<blockquote>
<p>새로운 혜택이 고객증대에 영향을 미쳤다</p>
</blockquote>
<p>우리는 아직 그 혜택으로 인해서 얼마나 고객 증대가 되었는지는 모릅니다. 따라서 유의하니 이 이벤트는 좋다! 라고 말할 수는 없습니다. 그러한 내용에 대해서는 추후 다루도록 하겠습니다.</p>
<h3 id="02-5는-어디서-나왔을까">02. 5%는 어디서 나왔을까?</h3>
<p>p값은 그래서 사건이 우연히 발생할 확률이라고 설명할 수 있습니다. 그럼 그 우연히 발생할 확률이 어느 정도되면 유의하다고 볼 수 있을까요? 그럴 때 사용하는 기준이 보통 5%입니다. 즉 p-value가 5%보다 크다면, 다시 말해 우연히 발생할 확률이 5%보다 높다면 해당 사건은 유의하지 않습니다. 충분히 우연히 발생할 수 있다고 생각할 수 있습니다. 그렇다면 5%보다 낮다면요? 해당 사건은 유의합니다. 해당 사건이 우연히 발생할 확률을 5%보다 낮고 즉 일어날 확률이 낮다는 겁니다. </p>
<p>이럴 때 해당 사건이 발생한 건 우연이 아니라 어떤 이유가 있다고 볼 수 있습니다. 즉, 위 케이스에 대입해보면 고객증대가 발생한 건 어떤 이유(새로운 혜택)가 있기 때문이라고 말할 수 있습니다. 그런데 도대체 이 5%는 어디서 나온 숫자일까요?</p>
<p>사실 이 5%라는 수치가 절대적인 기준은 될 수 없습니다. 지금껏 이 숫자를 사용해왔으니까, 다들 이 숫자를 사용하니까, 전공책에 그렇게 적혀있으니까.. 는 이유로 해당 수치가 절대적인 기준이 되는 건 아니니까요. 어떤 배경에서 p-value를 사용하느냐에 따라서 각자 다른 기준을 사용할 수 있어야 합니다. 위처럼 어떤 혜택이 고객 증대에 영향을 미쳤는지 판단하는 것이 아니라 의약제품이 환자에게 어떤 결과를 미쳤는지 판단하는 상황처럼 엄격한 잣대가 필요한 상황에서는 5%가 아니라 1%처럼 더욱 엄격한 잣대를 사용할 수도 있다는 의미입니다. 따라서 5%가 절대적인 기준이라는 생각은 버려야 합니다.</p>
<p>뿐만 아니라 p-value는 여러 방법으로도 쉽게 왜곡될 수 있습니다. effect size가 달라지거나 표본의 크기가 달라지면서 쉽게 p-value는 왜곡될 수 있습니다. 또한 실험자체가 유의미한 p-value를 가지도록 설계할 수도 있습니다. 따라서 p-value는 매우 편리한 도구이긴 하지만 여러 의미로 조심해서 해석을 해야 합니다.</p>
<h3 id="03-마치며">03. 마치며</h3>
<p>p-value를 더욱 제대로 이해하기 위해서는 가설, 오류 등에 대해서 공부를 해야 합니다. 물론 데이터 분석가 실무에서는 해당 지식이 필요하지 않을 수 있지만 그럼에도 제대로 된 이해를 위해서 추가적으로 정리하도록 하겠습니다. 그리고 다음 통계 주제로는 이러한 p-value와 함께 사용되는 t-stat을 다루거나 t-검정에 대해서 다뤄보도록 하겠습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[23년 이직을 위하여]]></title>
            <link>https://velog.io/@robin_updata/23%EB%85%84-%EC%9D%B4%EC%A7%81%EC%9D%84-%EC%9C%84%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@robin_updata/23%EB%85%84-%EC%9D%B4%EC%A7%81%EC%9D%84-%EC%9C%84%ED%95%98%EC%97%AC</guid>
            <pubDate>Sun, 24 Dec 2023 14:37:02 GMT</pubDate>
            <description><![CDATA[<h3 id="00-만다라트">00. 만다라트</h3>
<p>저는 매해 새로운 한 해를 시작하는 기념으로 만다라트를 작성합니다. 특히 2023년 만다라트의 제일 큰 목표는 <strong>&#39;Quantum Jump&#39;</strong>  였고 그를 위해서 본격적으로 준비하던 것이 바로 이직이었습니다. 특히 2023년 상반기, 즉 글또 8기를 할 때는 이직을 하기 위해 서류를 다듬고 제게 부족한 항목이 어떤 것인지 파악하였으며 2023년 하반기에는 본격적으로 이직을 진행했습니다. 그리고 2023년이 끝나기 전에 마침내 이직을 하게 되었고 이직을 준비하시는 분들에게 도움이 되고자 이렇게 후기를 작성하게 되었습니다.</p>
<p>회사의 이직 과정은 항상 달라질 수 있기 때문에 필요한 부분만 취해 챙기시면 좋을 것 같습니다.</p>
<h3 id="01-지원기업">01. 지원기업</h3>
<p>정확하지 않을 수 있지만 저는 2023년에 총 6개 기업에 지원하였습니다. </p>
<table>
<thead>
<tr>
<th>기업명</th>
<th>직무명</th>
<th>서류</th>
<th>과제/코딩테스트</th>
<th>1차면접</th>
<th>2차면접</th>
<th>3차면접</th>
</tr>
</thead>
<tbody><tr>
<td>쿠팡플레이</td>
<td>business analyst</td>
<td>탈</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>오늘의집</td>
<td>data analyst</td>
<td>탈</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>네이버웹툰</td>
<td>data analyst</td>
<td>탈</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>당근페이</td>
<td>data analyst</td>
<td>합</td>
<td></td>
<td>합</td>
<td>탈</td>
<td></td>
</tr>
<tr>
<td>토스뱅크</td>
<td>data analyst</td>
<td>합</td>
<td>합</td>
<td>합</td>
<td>합</td>
<td>탈</td>
</tr>
<tr>
<td>네이버</td>
<td>data analyst</td>
<td>합</td>
<td>합</td>
<td>합</td>
<td>최종합</td>
<td></td>
</tr>
</tbody></table>
<p>대부분 데이터분석가 직무에 지원했습니다.</p>
<h3 id="02-이직준비">02. 이직준비</h3>
<p>이직 준비를 시작하는 첫번째 단계는 이력서(경력기술서)를 작성하는 것이었습니다. 저는 따로 포트폴리오를 만들지 않았기 때문에 이력서를 최대한 자세하게 작성하는 것을 목표로 했습니다. 처음에는 단순히 개조식으로만 작성을 했다가 이후에 각각 프로젝트 별로 어떤 가설을 세웠는지, 실제로 어떻게 분석을 진행했고 어떤 액션을 발생시켰는지 과정을 나눠서 작성하는 식으로 프로젝트를 서술했습니다.</p>
<p>또한 이력서를 작성하고 나서는 저와 같이 이직을 준비하는 사람들과 서로 공유하며 이력서에 어떤 면이 부족한지 피드백을 받고 제가 보기에 부족해 보이는 항목이 있다면 이를 채우기 위해서 해당 영역과 연관되는 활동을 하거나 업무에서도 그러한 부분을 신경쓰면서 업무를 진행했습니다.</p>
<h3 id="03-서류탈락">03. 서류탈락</h3>
<p>저는 쿠팡, 오늘의집, 네이버웹툰에서는 서류 탈락을 했으나 이게 제가 너무 부족해서 떨어졌다고 생각하기보다는 해당 회사와 제가 핏이 많지 않다거나 회사에 다른 이슈가 있을 수도 있다는 생각을 하면서 스스로 너무 자책하려고 하지는 않았습니다. 거절을 당하는 것에 있어서 이게 당연하다고 생각을 하려고 노력했고 실제로도 2023년은 채용 시장이 매우 얼어붙어있던 시기이기 때문에 이에 대해서 크게 힘들어하려고 하지 않았습니다.</p>
<h3 id="04-토스뱅크">04. 토스뱅크</h3>
<p>2023년에 처음으로 서류가 붙은 기업이었습니다. 저는 이직을 할 회사를 찾는 과정에서 한 가지 고려사항이 회사의 성장과 스스로의 성장이 병행할 수 있는 회사였기 때문에 토스는 제가 생각하기에 훌륭한 후보였습니다. 사실 서류는 크게 기대를 하지 않았기때문에 놀라웠고 채용 과정 또한 매우 속도감이 느껴졌기 때문에 개인적으로 전형 과정에서 매우 즐거웠던 회사였습니다.</p>
<p>실제로 서류, 면접을 보고 거의 다음날 바로 연락이 와서 해당 결과를 알 수 있었고 면접 일자나 시간 또한 지원자의 의견을 적극적으로 반영을 해줬기때문에 매우 즐거운 면접 경험을 가질 수 있었습니다. (연차를 쓰지 않아도 되었기 때문에 또한 좋았습니다)</p>
<p>전형은 서류, 코딩테스트, 1차, 2차, 3차로 이루어져있었으며 이 중 2차는 1부, 2부로 나뉘어져 있었기 때문에 사실상 2차는 2-1차, 2-2차로 나뉜다고 생각하면 좋을 듯 합니다. 코딩테스트는 SQL로 진행이 되었으며 어렵지 않았기 때문에 대부분의 데이터분석가라면 크게 어렵지 않게 풀어나갈 수 있을 듯 합니다.</p>
<p>1차, 2차는 직무면접으로 진행이 되었고 면접이라기 보다는 실제로 토스를 다니는 분들과 커피챗을 하는 느낌으로 진행이 되었기 때문에 면접을 하면서 저를 소개하는 자리기도 했지만 실제로 토스라는 회사를 더욱 자세하게 알 수 있게 되어서 매우 즐거운 경험이었다고 생각합니다. 저는 아쉽게도 3차 면접에서 떨어지게 되었지만 전체적인 과정을 걸치면서 매우 즐거운 경험을 했고 서류와 면접 모두 더 구체적으로 준비할 수 있는 계기를 만들어주었다고 생각합니다.</p>
<h3 id="05-당근페이">05. 당근페이</h3>
<p>당근페이 또한 토스와 비슷한 식으로 전형이 진행되었습니다. 매우 속도감이 느껴졌고 면접일자 또한 제가 지정할 수 있었습니다. 당근의 경우는 따로 코딩테스트는 진행되지 않았으며 1차, 2차는 직무면접으로 진행이 되었습니다. 개인적으로 면접이 어려워서 떨어지게 되었지만 전형 진행이 매우 빠르고 피드백이 빨랐기 때문에 좋은 경험으로 남아있습니다.</p>
<h3 id="06-네이버">06. 네이버</h3>
<p>네이버는 서류 과정에서 다른 회사와 달리 기입해야 하는 정보가 많았습니다. 비교하자면 공채 지원하는 것과 비슷하게 정보를 기입해야했고 자기소개서도 작성을 해야했기 때문에 서류에서는 가장 시간이 많이 걸렸습니다. 그리고 다음 전형으로 코딩테스트, 1차, 2차 면접이 있었습니다. 코딩테스트는 토스와 같이 SQL로 진행이 되었으나 난이도는 토스보다 훨씬 어려웠습니다. 실무에서 SQL을 사용하시는 분석가분들이라도 어려울 수 있다고 생각합니다.</p>
<p>1차, 2차 모두 직무와 인성이 섞인 형태의 면접이었습니다. 개인적으로는 2차 면접이 매우 어려워서 면접이 끝나고 당연히 떨어졌다고 생각해서 당일 바로 다른 회사 서류를 작성했었던 것 같습니다. 다행히 면까몰인건지 최종합격이 되었습니다.</p>
<h3 id="07--못다한-이야기">07.  못다한 이야기</h3>
<p>제가 이직을 결과적으로 성공한 가장 큰 이유를 저는 행동이라고 생각합니다. 주변에 이직을 원하는 지인들을 보면 이직을 생각하지만 이력서를 수정하지 않거나 실제로 지원을 잘 하지 않는다는 것을 알 수 있었습니다. 물론 무분별한 지원은 좋지 않을 수 있지만 저는 이직을 성공하기 위해서는 일단 이직을 시도하는 것을 시작해야 한다고 생각합니다.</p>
<p>저는 이직의 시작은 왜 이직을 하는지에 대한 이유 탐구와 이력서 작성이라고 생각합니다. 우선 이직을 생각한 이유가 어떠한 것인지 스스로 고민하면서 구체화하는 것이 매우 중요합니다. 저는 제가 이직을 원한다고 생각했는데 그게 아니라 가끔은 그냥 퇴사를 원하는 상황인적이 많았습니다. 제가 정말 원하는 것이 이직인지, 아니면 그냥 회사가 싫은 건지 가끔은 고민해보는 걸 추천합니다.</p>
<p>그리고 이력서를 정말 구체적으로 작성해보는 것을 추천합니다. 이력서를 작성해보고 가길 원하는 후보 회사들의 JD와 비교해보면 제가 어떤 경험과 역량이 부족한지 알 수 있습니다. 그러한 무엇이 부족한지 파악하고 회사에서 할 수 있는 업무 중에서 해당 역량을 채울 수 있는 방향으로 최대한 업무를 진행시키고 업무를 고도화하려고 했습니다. 결과적으로 업무에도 더욱 많은 주체성과 열정을 보일 수 있었으며 비록 이직을 실패한다고 해도 회사에서 업무를 하는데에 많은 도움이 되었을 것이라고 생각합니다.</p>
<p>또한 현직자의 조언은 매우 큰 도움이 됩니다. 저는 커피챗을 요청하거나 링크드인에서 연락을 드리는 등 최대한 현직자분들의 조언을 듣기 위해서 노력했습니다. 그러한 과정에서 서류와 면접의 완성도를 더욱 높일 수 있었고 결과적으로 합격하는데 큰 도움이 되었습니다.</p>
<h3 id="08-마치며">08. 마치며</h3>
<p>이러나 저러나 취업과 이직은 노력과 큰 운이 필요하다고 생각합니다.</p>
<p>이직을 준비하면서 채용이 갑자기 사라져 중간에 전형이 멈춘 적도 있었고 전형이 사라진 건지 아닌 건지 중간에 연락이 아예 중단되어서 기다리기만 했단 전형도 있었습니다. 이직을 생각하는 직장인이라면 분명 간절한 마음이 클 것이고 따라서 이러한 전형에서 많은 괴로움도 겪을 것이라고 생각합니다.</p>
<p>저는 이런 상황에서도 최대한 많은 시도를 하려고 했었고 결과적으로 그러한 행동에서 최종 합격이란 결과를 만들 수 있었다고 생각합니다. 이 글을 읽는 여러분들도 포기하지 마시고 정진하신다면 좋은 결과 있으실 거라 믿습니다.</p>
<hr>
<p>이 글에서 문제가 되는 내용이 있다면 연락주시면 감사하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[글또를 또 다시 시작하면서]]></title>
            <link>https://velog.io/@robin_updata/%EA%B8%80%EB%98%90%EB%A5%BC-%EB%98%90-%EB%8B%A4%EC%8B%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C</link>
            <guid>https://velog.io/@robin_updata/%EA%B8%80%EB%98%90%EB%A5%BC-%EB%98%90-%EB%8B%A4%EC%8B%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C</guid>
            <pubDate>Sat, 09 Dec 2023 00:56:43 GMT</pubDate>
            <description><![CDATA[<h3 id="01-8기와-9기-사이">01. 8기와 9기 사이</h3>
<br/>

<p>벌써 시간이 이렇게 흘러서 글또 9기를 시작할 시간이 되었습니다. 8기와 9기 사이, 길다면 길고 짧다면 짧을 수 있는 시간동안 무엇을 했을까요?</p>
<p>약 5개월 시간동안 우선 면접을 정말 많이 봤습니다. 이직을 목표로 하면서 글또가 끝난 7월부터 많은 서류를 제출하고 면접을 정말 다양하게 봤습니다. 그 과정에서 커피챗도 다수하고 제가 무엇이 부족하고 무엇에 강점이 있는지 느낄 수 있는 시간이었습니다. 지금은 그 이직 여정이 거의 마무리되고 있는데 제 행동과 그 시간이 부끄럽지 않은 시간이었으면 좋겠네요.</p>
<p>그렇지만 면접과 서류 제출로 바쁘다는 핑계로 글을 작성하지는 못했습니다. 물론 시간을 내서 할 수는 있었겠지만 면접에 대해서 오랜만에 준비를 하는 것이다 보니 무엇을 준비해야 할지 잘 모르겠더라구요. 그래서 실제로 면접을 준비하는 시간보다 면접 준비를 위한 준비에 더 많은 시간을 보냈습니다. 또한 정말 매우매우 지치는 시간들이었습니다. 이는 추후에 이직 면접에 대해서 한 번 자세하게 작성해보고 싶네요.</p>
<p>회사 업무는 크게 변한 것이 없습니다. 그렇게 동기부여가 되진 않고 그러다보니 점점 업무에는 흥미가 떨어집니다. 지금 글을 작성하면서 8기 마지막 회고글을 읽었는데 그 때보나 제가 훨씬 더 시니컬해졌네요.</p>
<p>8기와 9기 사이에 업무나 학습 상 대단한 일을 하진 못했습니다. 10번의 면접을 봤고 면접을 위해 이력서를 작성하고 공부만 진행했네요. 그리고 머신러닝, 딥러닝 공부를 위해서 부트캠프에도 참여했습니다. 업무와는 직접적인 관련은 없지만 업무 외 새로운 지식을 배우니 매우 즐거운 시간을 보낼 수 있었습니다. 
<br/></p>
<h3 id="02-그래서-9기에서는-무엇을-해야할까">02. 그래서 9기에서는 무엇을 해야할까?</h3>
<br/>
본격적으로 학술적인 공부를 하고자 합니다. 통계학, 데이터과학에 집중해서 세부적인 내용을 정해 깊게 탐구해보고자 합니다. 물론 이렇게 보면 너무 뜬 구름 잡는 이야기가 될 수 있을 듯 해서 본격적인 연구계획서를 작성하기 위한 배경 지식을 채워나간다는 것을 목표로 글또 글을 작성해보고자 합니다.

<p>또한 글또 쉬는 시간에 커피챗의 이점을 많이 깨달았습니다. 제가 너무나도 부족하다는 사실을 새삼 깨닫고 있고 많은 분들과 대화를 하면서 이를 해결해나갈 수 있다는 생각을 하게 되었습니다. 따라서 가능하다면 한 달에 한 번은 글또 참여자분들과 커피챗을 해나가고자 하는 욕심이 있습니다. 새로운 분과 대화는 항상 저에게 자극이 되고 그 뿐만 아니라 네트워킹은 커리어에도 분명한 도움이 되니까요!
<br/></p>
<h4 id="1-무엇을-해야-할까">1. 무엇을 해야 할까?</h4>
<ul>
<li>일단 통계학 위주의 글을 작성해보고 싶습니다. 최근 들어 데이터 분석가에게 필요하지만 저에게 부족한 역량이 통계지식이라는 걸 인지하고 있어요</li>
<li>글또 활동을 통해 업무에 흥미를 다시 가지고 싶습니다. 그게 글을 작성하는 것일수도 있고, 아님 커피챗을 하는 것일수도 있겠네요</li>
</ul>
<h4 id="2-그렇다면-어떻게-해야-할까">2. 그렇다면 어떻게 해야 할까?</h4>
<ul>
<li>통계학을 공부하기 위한 주요 레퍼런스를 정하고 이를 바탕으로 제가 직접 교안을 작성한다는 생각으로 글을 작성해보려고 합니다.</li>
<li>이전에는 수동적으로 커피챗을 참여했다면 이제는 적극적으로 참여하고자 합니다. 또한 다른 분들이 작성한 글을 읽어보면서 많은 피드백도 작성하고자 합니다.</li>
<li>너무 부담을 가지지는 않으려고 합니다. 글을 작성하는 시간도 모니터링하면서 글을 작성하는데에 너무 부담을 가지거나 시간을 많이 쏟기 보다는 시간도 관리하는 식으로 글을 작성하려고 합니다.</li>
</ul>
<br/>

<h3 id="03-마무리하며">03. 마무리하며</h3>
<br/>
지난 8기 글또를 하면서 업무를 많이 정리하는 시간을 가졌다고 생각해요. 최근들어 업무에 대한 흥미가 많이 떨어졌는데 이번 글또를 통해서는 다시 업무에 흥미를 가지는 계기를 가졌으면 좋겠습니다. 최근 들어 커리어 성장이 참 어렵다고 생각이 드네요. 모두 화이팅입니다! 


]]></description>
        </item>
        <item>
            <title><![CDATA[2023년 상반기 회고]]></title>
            <link>https://velog.io/@robin_updata/2023%EB%85%84-%EC%83%81%EB%B0%98%EA%B8%B0-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@robin_updata/2023%EB%85%84-%EC%83%81%EB%B0%98%EA%B8%B0-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 16 Jul 2023 13:18:17 GMT</pubDate>
            <description><![CDATA[<h3 id="01-어느-덧-7월이-되었습니다">01. 어느 덧 7월이 되었습니다.</h3>
<p>벌써 2023년도 반이나 흘렀습니다. 매번 그렇듯 한 해가 시작할 때마다 멋진 다짐을 하곤 합니다만 그것들이 얼마나 지켜졌는지는 잘 모르겠습니다. 항상 열심히 살았다고 생각하기는 하지만 실제로 열심히 살았는지 파악하는 시간을 가져봐야겠습니다.</p>
<p>먼저 한 해 활동을 요약해보자면 자기개발, 회사, 글또 활동, 인간관계, 기타 등으로 나눠서 정리해볼 수 있을 듯 합니다. 각각의 영역에서 무엇을 했고 하반기에는 무엇을 더 이뤄야하는지 정리를 해보도록 하겠습니다.</p>
<h3 id="02-자기개발">02. 자기개발</h3>
<p>다양한 자기개발을 하기 위해서 많은 계획을 세웠습니다. 연초에 작성한 2023년 만다라트를 다시보니 올해 제 슬로건을 <code>Quantum Jump</code>라고 했었네요. 다른 해보다도 올해는 특히 더 건강에 신경을 쓰는 한 해가 되었습니다. 재택이 줄어들면서 운동 빈도는 줄긴 했지만 주 4~5회 헬스, 주 2회 수영은 꾸준하게 했고 중간에 피티수업을 받기도 했습니다. 요즘은 특히나 수영이 더더욱 재밌어지고 있네요. 지난 몇 년간은 술도 마시는 편이긴 했지만 최근에는 그 빈도도 매우 줄어서 한달에 한 번..? 정도 마시는 듯 합니다. 앞으로는 빈도도 빈도지만 술의 종류와 양도 매우 줄이고자 하고 있습니다. 
단순히 미적으로 보여지는 건강 외에도 신체 전반적인 건강을 개선하기 위해서 꾸준하게 불균형을 고치기 위해서 바른 자세로 운동하는 것에 많은 노력을 하고 있습니다. 이러한 시간을 가지니 중량에서는 아쉬움이 느껴지는 게 사실이지만 운동 평생 할 거니까요. 평생 할 운동, 더 건강하고 안전하게 하기 위해서 이러한 시간을 가지고 있습니다. 그리고 나이가 들면서 아무래도 살이 좀 찌고 있는데 살을 줄이기 위해서도 식단에 신경을 쓰고 있습니다. 매크로를 계산하면서 식단을 먹고 건강하고 다양한 음식을 소비하기 위해 노력을 하고 있습니다. 마지막으로 수면도 중요한 요소라고 생각하기에 적어도 7시간은 자기 위해서 노력합니다. 덕분에 요즘은 거의 10시 30분정도만 되면 잠들고 있네요. 이렇게 정리해보니 정말 건강에 진심인 사람인 듯 합니다.</p>
<p>또한 교양을 늘리기 위해서 시간을 보내고 있습니다. 저는 평상시에도 영화와 뮤지컬, 연극을 매우 좋아해서 이를 관람하는 데 많은 시간을 할애하는데 단순히 소비하는 것을 넘어서 후기를 남기고 기록을 하며 이를 생산적인 활동으로 하고자 생각하고 있었습니다. 아직 본격적인 기록을 남기지는 못하고 후기만 적는 식이었지만 앞으로는 많은 기록을 남기고 더 많은 곳을 공부해서 해석과 즐거운 지식을 같이 공유하는 식이 되었으면 좋겠네요. 이 점은 아직은 아쉽습니다.
그리고 제가 책을 한창 많이 읽었는데 출퇴근 시에는 책을 잘 읽지 못하게 되었더라구요. 아무래도 출퇴근할 때는 졸거나 유튜브를 보곤 합니다. 이 점 또한 개선해서 책을 더 자주 읽어야 한다는 생각이 듭니다.</p>
<p>그리고 직무 공부에도 시간을 사용하고 있습니다. 글또에 대한 내용은 다음 차례에서 적도록 하고 최근에는 회사에서 데이터 시각화 스터디를 조직해서 같이 Power BI를 공부하고 이를 바탕으로 업무를 개선하는 작업을 진행했습니다. 다양한 직무의 분들과 함께하니 실제로 필요한 대시보드가 어떤 점인가에 대해서 더 많은 인사이트를 얻을 수 있었고 최근에는 해당 대시보드를 바탕으로 실제로 업무에 임팩트를 미칠 수 있어 매우 만족스러운 활동이라고 생각하고 있습니다. 이후 스터디에서는 데이터 시각화 뿐만 아니라 빅쿼리에 대해서도 같이 공부를 할 예정입니다.</p>
<p>그리고 최근에는 통계에 많은 관심이 생겨 통계를 공부하는 데 시간을 쓰고 있습니다. 강의를 듣고 책을 읽는 식으로 공부를 하긴 하는데 실제로 업무에 적용하기가 어렵고 프로젝트 베이스 러닝을 하기에도 어려운 영역이다보니 요즘은 흥미가 좀 떨어지고 있습니다. 개선점을 찾아야겠네요. </p>
<p>최근에는 코딩에 대해서는 조금 소홀했는데 하반기에는 다시금 지식을 살리기 위해서 전체적인 코딩 공부를 조금 진행해볼까 합니다. </p>
<p>뿐만 아니라 자기관리에도 많은 시간을 사용했습니다. 대단한 자기관리를 하지는 않았지만 그래도 영양제를 매일 먹고 피부와 머리에 시간을 조금은 투자했습니다. 노화는 무서우니까요. 그래도 비교적 제 나이또래에서는 많은 관리를 하고 있다고는 생각하는데 이러한 자기관리도 참 어렵네요. 
이렇게 눈으로 보이는 자기관리는 아니지만 집중력과 도파민 관리에도 신경을 쓰고 있습니다. 쇼츠와 릴스를 전혀 보지 않고 움직이면서 폰을 보지 않는 것이 그 것입니다. 사실 쇼츠와 릴스를 보지 않는건 생각보다 쉽더라구요. 일단 제 취향이 아니기도 했고 한 번만 확 끊어버리면 생각보다 보고싶지도 않습니다. 그냥 습관처럼 보는 것이지 어려운 게 아니니 많이들 끊어봤으면 좋겠습니다. 트렌드 읽기는 다른 걸 통해서 하면 되니까요. 다만 움직이면서 폰 안보는건 생각보다 어렵습니다. 여기서 말하는 폰 안보는건 정말 말그대로 폰을 전혀 쳐다보지 않는 걸 의미합니다. 앞으로는 이를 넘어서 일상 생활을 할 때 필요하지 않다면 폰을 안보는 것 또한 연습하려고 하는데 잘 될지 모르겠습니다.</p>
<h3 id="03-회사">03. 회사</h3>
<p>사실 회사에는 많은 애정이 떨어졌습니다. 업무의 변동도 너무 잦았고 생산적인 피드백을 받는 것도 드물어서 요즘은 회사는 별로 좋아하지 않습니다. 그래도 제가 할 수 있는 것, 제가 좋아하는 것을 찾기 위해서 많은 노력을 했습니다. 업무를 최대한 능동적으로 만들어서 보고드리며 해당 업무를 하기 위해서 노력하고 소통을 할 때도 더욱 생산적인 아이디어가 있다면 이를 제안하는 일들을 했습니다. 그리고 회사에서도 작지만 확실한 친절을 베풀기 위해서 조금씩은 노력을 해왔습니다. 그리고 회사에서 동호회도 들어갔습니다! 물론 활동을 자주 하지는 않았지만 그래도 동호회를 하니까 조금은 회사가 좋아지더라구요 :) 그렇지만 아무래도 회사 애정은 많이 떨어져서 회사에 대해서는 쓰고 싶은 점이 별로 없습니다. </p>
<h3 id="04-글또">04. 글또</h3>
<p>이러한 생산적인 사람이 되기 프로젝트의 첫 발자국은 글또였습니다. 그 동안 존재는 알고 있었지만 실제로 활동한 적은 없었는데 이번에 처음으로 글또에 참여하게 되어서 매우 영광이었습니다. 물론 패스를 모두 사용했고 처음에 글을 쓰는데에는 많은 어려움을 겪었지만 그럼에도 조금은 나아진...? 제 글을 보면서 스스로는 만족할 수 있었습니다. 글또가 없어도 블로그에 꾸준하게 글은 작성하고 싶고 추후 글또 활동에도 계속 활동하고 싶습니다 :) 글또 감사해요!</p>
<p>(그리고 처음 글또 시작할 때와 글또 글을 써가면서 주제가 많이 바뀌었는데 처음 정한 주제를 꾸준하게 밀고 나가고 싶습니다. 다음에는 그래보려구요!)</p>
<h3 id="05-인간관계">05. 인간관계</h3>
<p>참... 어려웠습니다. 저는 애초에 외향적인 사람이 아닐뿐더러 친구가 많은 타입이 아니었습니다. 친구도 적었고 사실 친구가 필요한가..? 라는 생각을 하는 편에 가까웠습니다. 그런데 작년부터 꾸준하게 외롭다는 생각이 들더라구요. 친구가 있고 연인이 있는 것과 별도로 계속해서 내 인간관계가 좁아지고 있다는 생각이 들어서 그런 듯 합니다. 
그럼에도 인간관계를 정리하는데에는 또 빨라서 전 성인 이전에 만났던 친구들은 현재에는 아무도 연락을 하지는 않고 있습니다. 그래서 그런지 그런 말을 싫어합니다. 학교에서 만난 친구가 진짜 친구다, 성인돼서 만난 친구는 가짜 친구다, 회사에서는 친구를 만들 수 없다, 그런 말들이요. 전 제 제일 친한 친구가 대학 친구라고 생각하고 회사에서도 친구를 만들 수 있다고 생각합니다. </p>
<p>이런 저런 이유로 올해는 친구를 소중히 여기는 한 해가 되려고 노력하고 있습니다. 친구를 많이 만들기보다는 적은 친구를 더더욱 소중하게 여기고 더 배려하는 태도를 보여야겠더라구요. 친구도 연인처럼 노력이 필요한 관계이니까요. 최근에는 회사에서 새로운 친구를 사귀었는데 이게 정말 즐겁습니다. 사실 저도 회사에서는 친구를 못 만들 줄 알았거든요. 이렇게 친구가 생기니 좀 학생이 다시 된 것 같고 즐겁네요. 오래볼 수 있으면 좋겠습니다. 제 여자친구는 그 친구랑 제가 썸타는 거 아니냐고도 물어보네요.</p>
<p>그리고 여자친구와 더 깊은 관계를 맺기 위해서 노력합니다. 실제로도 그렇게 노력을 하고 있고 아마 내년에는 그러한 과정의 결실을 맺을 수 있지 않을까 생각하고 있습니다. 저는 제가 결혼을 못할 줄 알았어요. 참 감사한 나날이었네요. 이렇게 적고보니까.</p>
<h3 id="06-기타-및-정리">06. 기타 및 정리</h3>
<p>작년에 비해서 다양한 활동을 하지는 않았습니다. 작년에는 보컬학원도 다니고 뮤지컬 동호회(관람 동호회가 아니라 하는 동호회)도 가입하려고 하고 운동도 더 진심이었습니다. 하지만  그렇다고 올해가 별로라는 건 아닙니다. 분명 많은 결실을 맺고 있고 더 행복하기도 한 것 같아요. 실제로 운동도 지금이 훨씬 잘합니다. 아직 초급자지만요 :)</p>
<p>이렇게 정리해보니 참 괜찮게 산 상반기가 아니었나 싶습니다. 물론 오히려 공부와 회사 부분은 좀 부족한 듯 한데 모든 걸 완벽하게 할 수는 없으니까요. 최근에 인생의 중대사가 참 많았습니다! 앞으로 더욱 바쁜 하반기, 그리고 2024년에 될텐데 더 많이 노력하는 시간을 보내야겠습니다. 참 즐겁네요. 감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최적화 알고리즘을 통해 최적 할인율 쿠폰 구하기]]></title>
            <link>https://velog.io/@robin_updata/%EC%9C%A0%EC%A0%84%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9C%BC%EB%A1%9C%EC%BF%A0%ED%8F%B0%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@robin_updata/%EC%9C%A0%EC%A0%84%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9C%BC%EB%A1%9C%EC%BF%A0%ED%8F%B0%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Sat, 17 Jun 2023 13:45:47 GMT</pubDate>
            <description><![CDATA[<h3 id="00-최적-할인율-쿠폰-구하기">00. 최적 할인율 쿠폰 구하기</h3>
<p>지난 시간에도 최적 할인율 쿠폰을 구하기 위한 업무를 계속 진행했습니다. 이전 시간에는 회귀 분석을 통해서 예상 구매고객이 제일 많은 쿠폰을 찾는 과정을 진행했습니다. 다만 실제로 업무를 진행하다보니 아래와 같은 한계점을 마주쳐 새로운 방식을 고안하게 되었습니다.</p>
<ul>
<li>쿠폰 속성에는 할인율만 존재하는 것이 아님 -- 최소구매조건, 최대구매조건 등 다양한 조건 또한 쿠폰을 세팅할 때 고민해야함</li>
<li>다양한 속성을 고민해서 모델을 만들 때, 다양한 조합으로 결과치를 확인하고 싶은데 회귀모델은 이 때 많은 제한점이 있음</li>
<li>회귀분석으로 모든 과정을 보기에 너무 많은 시간이 소요됨 -- 더 효율적인 모델을 사용할 필요성이 있음</li>
</ul>
<p>위와 같은 문제점을 마주치고 업무 과정을 나눠서 진행하기로 했습니다. 먼저 이전 회귀분석에서 사용했던 내용으로 과거 데이터를 바탕으로 고객들의 예상 사용률을 예측하고자 합니다. 이렇게 예측한 예상 사용률을 바탕으로 최적화 알고리즘을 이용해서 (할인율, 최소구매조건, 최대할인금액) 값을 한 번에 구하기로 정했습니다. 그럼 다음 아래에서는 최적화 알고리즘에 대해서 간략히 먼저 공부해보도록 하겠습니다.</p>
<p><img src="https://img1.daumcdn.net/thumb/R1280x0.fjpg/?fname=https://t1.daumcdn.net/brunch/service/user/a4eJ/image/XPPaTdj3ckFin47lbVLcfMTsplg" alt="">
<span style="font-size:0.8em; color:gray"> <em>어차피 회사에서 잘 사용하지 않을 것 같지만 하라면 해야 하는게 직장인입니다.</em> </span></p>
<h3 id="01-최적화란-무엇인가">01. 최적화란 무엇인가</h3>
<p>최적화는 많은 현실 세계 문제에서 핵심적인 역할을 담당하고 있습니다. 예를 들어, 기계 학습 모델의 성능을 최대화하거나 비용을 최소화하는 제조 공정을 설계하는 등의 문제에서 최적화는 필수적인 도구입니다. 최적화 알고리즘은 주어진 조건과 제약 사항 하에서 주어진 목적 함수를 최대화하거나 최소화하기 위해 사용되는 수학적인 접근 방식입니다. 결국 손실함수의 값을 최소화하는 하이퍼 파라미터를 찾는 방법인데 이러한 방법에는 아래와 같은 대표적인 모델이 존재합니다.</p>
<p><img src="https://image.slidesharecdn.com/random-170910154045/95/-49-638.jpg?cb=1505089848" alt="">
<span style="font-size:0.8em; color:gray"> <em>출처: 하용호, 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다</em> </span></p>
<ol>
<li><p>경사 하강법 (Gradient Descent, GD)</p>
<p>경사 하강법은 기본적인 최적화 알고리즘으로, 목적 함수의 기울기(그래디언트)를 사용하여 최적해를 찾는 방법입니다. GD는 현재 위치에서 그래디언트를 계산하고, 그래디언트의 반대 방향으로 일정 거리(학습률, learning rate)만큼 이동합니다. 이 과정을 최적해에 도달할 때까지 반복합니다. GD는 단순하고 직관적인 방법이지만, 큰 데이터셋이나 복잡한 문제에서는 계산 비용이 높아질 수 있습니다.</p>
</li>
<li><p>확률적 경사 하강법 (Stochastic Gradient Descent, SGD)</p>
<p>확률적 경사 하강법은 GD의 변형으로, 매 단계마다 랜덤하게 선택한 하나의 데이터 샘플에 대한 그래디언트를 계산하여 업데이트하는 방식입니다. 이는 GD보다 계산 비용이 낮아지며, 특히 대규모 데이터셋에서 더 효율적으로 동작합니다. 그러나 SGD는 그래디언트의 노이즈로 인해 수렴하는 데 더 많은 반복이 필요할 수 있습니다. </p>
</li>
<li><p>모멘텀 (Momentum)</p>
<p>모멘텀은 GD나 SGD보다 빠르게 수렴하고 지역 최소값에서 빠져나오는 데 도움이 되는 알고리즘입니다. 모멘텀은 현재의 그래디언트 업데이트에 이전 업데이트에 대한 모멘텀을 추가하여, 이동 방향을 고려하는 방식으로 작동합니다.</p>
</li>
<li><p>AdaGrad (Adaptive Gradient)</p>
<p>AdaGrad는 학습률을 조정하여 각 매개변수의 업데이트 속도를 개별적으로 조절하는 알고리즘입니다. AdaGrad는 경사 제곱의 누적 합을 사용하여 각 매개변수의 학습률을 조절하는 방식으로 작동합니다. 매개변수의 그래디언트가 많이 업데이트된 경우에는 학습률이 감소하여 안정성을 향상시킵니다.</p>
</li>
<li><p>RMSProp (Root Mean Square Propagation</p>
<p>RMSProp은 AdaGrad의 단점을 개선하기 위해 제안된 알고리즘입니다. RMSProp은 최근 그래디언트의 제곱값을 지수 이동 평균을 사용하여 누적하지 않고, 과거 그래디언트의 영향을 감소시킴으로써 학습률을 적절하게 조절합니다. 이를 통해 더 안정적인 학습이 가능하며, AdaGrad보다는 더 넓은 범위의 학습률을 유지할 수 있습니다.</p>
</li>
<li><p>Adam (Adaptive Moment Estimation)</p>
<p>Adam은 RMSProp과 모멘텀 방식을 결합한 알고리즘으로, 현재 그래디언트와 이동 평균을 사용하여 학습률을 조절합니다. Adam은 그래디언트의 일반적인 모멘텀을 추정하고 그래디언트의 크기와 방향을 조정하여 매개변수 업데이트를 수행합니다. 이를 통해 빠른 수렴과 안정적인 학습을 동시에 달성할 수 있습니다. Adam은 다양한 유형의 최적화 문제에서 효과적이며, 기본적으로 많이 사용되는 알고리즘 중 하나입니다.</p>
</li>
<li><p>유전 알고리즘 (Genetic Algorithm)</p>
<p> 유전 알고리즘은 위에 신경망 알고리즘과 다른 형태의 모델입니다. 다소 전통적인 모델이며 생물의 진화 원리를 모방한 메타휴리스틱 알고리즘입니다. 개체의 유전자 조합을 사용하여 후보 해집단을 생성하고, 이를 평가하고 선택 및 변형하여 최적해를 찾아냅니다. 해의 다양성을 유지하면서 전역 최적해를 찾는 데 효과적입니다. 다만 함수 복잡도에 따라 수렴이 느려질 수 있습니다.</p>
</li>
</ol>
<p>이번 할인쿠폰 최적화의 경우 조건 최적화 문제입니다. 이는 연속 함수를 학습하는 문제가 아니라 시스템의 입력 변수와 제약 조건에 대해 최적해를 찾는 문제입니다. 따라서 신경망 알고리즘을 굳이 사용할 필요는 없어 보입니다. 그러나 유전 알고리즘은 제약 조건을 고려한 적합도 함수를 최대화하는 해를 찾는 데 특화되어 있습니다. 즉, 문제의 복잡성, 해의 다양성, 문제의 목적에 따라 유전 알고리즘이 기타 신경망 알고리즘보다 더욱 적합해보입니다. 따라서 이번 할인쿠폰 최적화 문제의 경우는 유전 알고리즘을 사용해서 분석해보도록 하겠습니다. </p>
<h3 id="02-데이터-수집-및-예상-사용률-구하기">02. 데이터 수집 및 예상 사용률 구하기</h3>
<p>회사에서 데이터 수집을 하려고 보니 생각보다 쿠폰의 형태가 매우 다양하다는 것을 깨달았습니다. 먼저 쿠폰에서 다양한 카테고리가 설정되어 있는 것이 있고 제외 상품조건이 있는 것이 있습니다. 그보다 더 큰 문제는 쿠폰이 모든 사용자(고객)에게 제공되지는 않는다는 점입니다.</p>
<p>일부 쿠폰은 모두가 다운로드 받을 수 있게 되어있거나 자동으로 제공되는 반면, 고객이 직접 다운로드 받아야 하거나 혹은 일부 고객을 한정으로 제공되는 쿠폰이 있습니다. 사실 전자보다는 후자가 대부분을 차지합니다. 이 때, 이러한 쿠폰을 바탕을 그냥 사용률을 사용하려고 하니 이러한 점들이 어렵다는 것을 깨달았습니다. 쿠폰 사용률을 바탕으로 최적화 모델을 생성할 시, 해당 사용률이 편향돼서 들어갈 수 있는 문제가 있는데 이를 해결하기 위해서는 기존 쿠폰들의 과거 데이터, 즉 실제 사용률이 아니라 가상의 고객군에게 모두 동일하게 제공 시 예측되는 사용률(이하 예측 사용률)을 가지고 최적화를 진행해야 원하는 결과값을 얻을 수 있을 것이라 생각하였습니다. 따라서 최적화에 앞서 쿠폰 데이터 및 예측 사용률을 구하는 것이 우선시되어야 했습니다.</p>
<p>다만 너무 구체적인 대상에게만 제공되었던 쿠폰 데이터는 가상의 고객풀에 대해서 예측 사용률을 도출하기에 적합하진 않았습니다. 워낙 데이터가 편향되어 있었기 때문에 예측 사용률 또한 평가 상 좋게 나오지는 않았습니다. 따라서 저는 이번에는 일단 최대한 고객 조건이 없이 다운로드 받을 수 있던 쿠폰들 위주로 데이터를 수집해 먼저 해당 형식의 쿠폰에 대해서만 최적화 모델을 생성하기로 했습니다. 이에 대해서는 랜덤 포레스트 모델을 사용하여 예측 사용률을 계산하였고 이를 바탕으로 최적화 알고리즘을 진행하기로 했습니다.</p>
<h3 id="03-최적화-모델-생성하기">03. 최적화 모델 생성하기</h3>
<p>실제로 사용한 유전 알고리즘을 최대한 간략하게 작성해보자면 아래와 같습니다. </p>
<pre><code class="language-python">
import random
import numpy as np
from deap import creator, base, tools, algorithms
</code></pre>
<p>먼저 사용해야 할 라이브러리를 불러오겠습니다. 이 중에서 생소한 것은 아마 <code>deap</code>일텐데 이는 유전 알고리즘을 사용하기 위해 불러와야 하는 라이브러리입니다. 이 때 deap는 <code>DEAP(Distributed Evolutionary Algorithms in Python)</code>를 의미합니다. </p>
<pre><code class="language-python">

# 2. 적합도 함수 정의
def fitness_function(coupon):

    discount_rate, min_purchase_amt, max_discount_amt = coupon

    # 적합도 계산: 가상 데이터에서 특정 쿠폰 조건과 유사한 데이터의 사용 건수 합계
    similarity = np.abs(coupons_data[:, :-1] - coupon).sum(axis=1)
    sum_of_uses = (coupons_data[:, -1] * (1 / (similarity + 1))).sum()

    return sum_of_uses,</code></pre>
<p>그리고 유전 알고리즘에서 중요한 적합도 함수를 정의하게 됩니다. 적합도 함수는 유전 알고리즘에서 각 개체가 얼마나 적합한지를 평가하는 함수입니다. 적합도 함수는 개체의 품질을 측정하고, 이를 기반으로 개체를 선택, 교차, 변이 등의 유전 연산을 수행합니다. 이러한 유전 연산은 개체의 품질을 개선하고, 다음 세대에 더 좋은 개체를 생성하는 데 기여합니다. 이 때 좋은 적합도 함수를 생성하는 것이 매우 중요한데 좋은 적합도 함수를 선택하면 유전 알고리즘이 빠르게 최적의 해에 수렴할 수 있습니다.</p>
<p>위 적합도 함수는 쿠폰의 할인율(discount_rate), 최소 구매 금액(min_purchase_amt) 및 최대 할인 금액(max_discount_amt)을 입력으로 받습니다. <code>coupons_data</code>에서 쿠폰 조건과의 유사도를 계산하고, 그 값을 더합니다. 여기서 유사도는 입력 쿠폰과 coupons_data의 각 행 사이의 차이의 절댓값의 합입니다. 따라서 유사도가 작을수록 입력 쿠폰과 해당 데이터의 조건이 유사하다는 의미입니다.</p>
<p>유사도 값은 1을 더한 후 역수를 취하여 사용됩니다. 이렇게 함으로써 유사도 값이 작을수록 큰 값을 갖게 되고, 유사도 값이 크면 작은 값을 갖게 됩니다. 이는 유사한 조건을 갖는 데이터의 사용 건수에 대한 가중치를 높여주는 역할을 합니다. 마지막으로, <code>coupons_data</code>의 각 행의 사용 건수와 가중치를 곱한 값들을 합산하여 최종적인 쿠폰의 적합도를 계산합니다. 결과는 튜플 형태로 반환됩니다.</p>
<pre><code class="language-python"># 3. DEAP 라이브러리 과정 설정

# 최대화 문제로 설정 (적합도를 최대로 하는 해 찾기)
creator.create(&quot;FitnessMax&quot;, base.Fitness, weights=(1.0,))
creator.create(&quot;Individual&quot;, list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register(&quot;attr_discount_rate&quot;, random.uniform, 0.01, 0.99)
toolbox.register(&quot;attr_min_purchase_amt&quot;, random.uniform, 1, 100000)
toolbox.register(&quot;attr_max_discount_amt&quot;, random.uniform, 1, 100000)

# 개체 초기화: 할인율, 최소 구매 금액, 최대 할인 금액 값을 튜플로 초기화
toolbox.register(
    &quot;individual&quot;,
    tools.initCycle,
    creator.Individual,
    (toolbox.attr_discount_rate, toolbox.attr_min_purchase_amt, toolbox.attr_max_discount_amt),
    n=1,
)
toolbox.register(&quot;population&quot;, tools.initRepeat, list, toolbox.individual)

toolbox.register(&quot;mate&quot;, tools.cxTwoPoint)
toolbox.register(&quot;mutate&quot;, tools.mutGaussian, mu=[0.0, 0.0, 0.0], sigma=[0.1, 1000, 1000], indpb=0.05)
toolbox.register(&quot;select&quot;, tools.selTournament, tournsize=3)
toolbox.register(&quot;evaluate&quot;, fitness_function)
</code></pre>
<p>위 코드는 간단하게 적은 유전 알고리즘 코드입니다. 실제로 사용 시에는 위처럼 사용하지 마시고 실제 파라미터 값과 데이터를 조정하시면 됩니다. </p>
<p>먼저, <code>creator</code> 객체를 사용하여 <code>FitnessMax 클래스</code>와 <code>Individual 클래스</code>를 생성합니다. FitnessMax 클래스는 최대화 문제를 위한 적합도 클래스로 설정되며, Individual 클래스는 개체를 나타내는 리스트입니다. Individual 클래스는 FitnessMax 클래스로 적합도를 가집니다. <code>individual</code> 함수는 개체를 초기화하는 역할을 수행합니다. tools.initCycle을 사용하여 creator.Individual 클래스에 attr_discount_rate, attr_min_purchase_amt, attr_max_discount_amt 값을 튜플로 초기화합니다. n=1은 개체를 한 번에 하나씩 생성한다는 의미입니다. <code>population</code> 함수는 초기 개체 집합(개체의 모음)을 생성합니다. toolbox.individual 함수를 사용하여 creator.Individual 클래스의 개체를 생성하고, tools.initRepeat를 사용하여 해당 개체를 반복하여 리스트로 만듭니다.</p>
<p>유전 알고리즘에서 사용되는 다른 함수들도 등록됩니다. mate 함수는 두 개체 간의 교차(crossover)를 수행합니다. mutate 함수는 개체의 돌연변이(mutate)를 적용합니다. select 함수는 토너먼트 선택(tournament selection)을 사용하여 개체를 선택합니다. evaluate 함수는 앞서 정의한 적합도 함수인 fitness_function을 호출하여 개체의 적합도를 계산합니다.</p>
<pre><code class="language-python"># 4. 유전 알고리즘 적용 및 결과 출력

population = toolbox.population(n=100)
ngen = 100
cxpb, mutpb = 0.7, 0.3

result, log = algorithms.eaSimple(population, toolbox, cxpb=cxpb, mutpb=mutpb, ngen=ngen, verbose=False)
best_coupon = tools.selBest(result, k=1)[0]</code></pre>
<p>먼저 초기 개체 집합인 population을 생성합니다. toolbox.population(n=100)은 toolbox에 등록된 individual 함수를 사용하여 개체를 생성하고, n 인자를 통해 개체의 수를 지정합니다. 이 경우에는 100개의 초기 개체가 생성됩니다.</p>
<p>ngen 변수는 진행할 세대(generation)의 수를 나타냅니다. cxpb는 교차 확률(crossover probability)로, 두 개체가 교차 연산을 수행할 확률을 나타냅니다. mutpb는 돌연변이 확률(mutation probability)로, 개체의 돌연변이가 발생할 확률을 나타냅니다.</p>
<p>algorithms.eaSimple 함수는 DEAP 라이브러리에서 제공하는 간단한 유전 알고리즘을 실행합니다. population은 초기 개체 집합을 나타내며, toolbox는 등록된 함수들을 포함한 도구 모음을 제공합니다. cxpb, mutpb, ngen은 앞서 설정한 교차 확률, 돌연변이 확률, 그리고 진행할 세대의 수입니다. verbose=False는 상세한 출력을 비활성화하는 매개변수입니다.</p>
<p>tools.selBest(result, k=1)는 result에서 적합도가 가장 높은 개체를 선택하는 함수입니다. k=1은 가장 높은 적합도를 가진 개체를 1개 선택한다는 의미입니다. 선택된 개체는 best_coupon 변수에 할당됩니다.</p>
<p>위와 같은 코드를 바탕으로 최적의 쿠폰할인율, 최소주문금액, 최대할인금액을 구할 수 있습니다.</p>
<h3 id="04-후기-및-피드백">04. 후기 및 피드백</h3>
<p>사실 위 유전 알고리즘은 매우 기초적인 단계입니다. 먼저 이 작업을 진행하면서 깨닫게 된 문제점이 많습니다.</p>
<ol>
<li>쿠폰에는 더 다양한 속성들이 있다.
대표적으로 쿠폰의 사용기한, 다운로드 기간이 존재합니다. 같은 속성의 쿠폰이라도 사용기한이 길다면 사용률이 더 높아질 수 있습니다. 따라서 이러한 조건 또한 유전알고리즘에 포함시켜야 합니다.</li>
<li>쿠폰의 카테고리의 다양성
보통 일반적으로 이커머스에서 쿠폰을 생성할 때 적용 카테고리가 존재합니다. 예를 들어 화장품 전용, 혹은 패션 전용, 혹은 신선식품 전용 등으로 말입니다. 그러나 이러한 조건은 매우 복잡합니다. 이번에는 이러한 속성을 무시하고 진행했지만 이 특성이 사용률에 미칠 영향은 매우 클 것으로 예상됩니다. 해당 특성과 사용률 등 다양한 쿠폰의 속성과 사용률 간 상관관계 분석을 추가로 진행해야 할 듯 합니다.</li>
<li>데이터양의 부족
이번에는 전체적인 틀을 생성하기 위해서 데이터 전체 양이 절대적으로 부족했습니다. 그러나 쿠폰 데이터를 전처리하는데 너무 오랜 시간이 걸리고 레거시가 복잡해서 이번에는 적은 데이터로만 진행했으나 모델을 고도화하기 위해서는 더 많은 데이터가 필요할 듯 합니다.</li>
</ol>
<p>위 문제를 해결해가면서 유전 알고리즘을 고도화 시켜야하는 필요성이 존재합니다. 또한 유전 알고리즘 자체가 자주 사용되는 알고리즘이 아니다보니 이 알고리즘을 설명하는데 더 많은 시간이 소요되었습니다. 다음 블로그 게시글로는 이 유전 알고리즘이 어떻게 작동하는 것인지에 대해서 더 자세히 다뤄보는 것이 좋을 듯 합니다.</p>
<hr>
<h3 id="reference">Reference.</h3>
<p>하용호, 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다
컬리 테크 블로그, 컬리는 물류 최적화 문제를 어떻게 풀고 있을까? - 1부</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최적의 할인율을 어떻게 구할 수 있을까? - 회귀 분석]]></title>
            <link>https://velog.io/@robin_updata/%EC%B5%9C%EC%A0%81%EC%9D%98-%ED%95%A0%EC%9D%B8%EC%9C%A8%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B5%AC%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C-%ED%9A%8C%EA%B7%80-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@robin_updata/%EC%B5%9C%EC%A0%81%EC%9D%98-%ED%95%A0%EC%9D%B8%EC%9C%A8%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B5%AC%ED%95%A0-%EC%88%98-%EC%9E%88%EC%9D%84%EA%B9%8C-%ED%9A%8C%EA%B7%80-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sun, 21 May 2023 13:03:03 GMT</pubDate>
            <description><![CDATA[<h3 id="00-할인율--할인금액을-어떻게-정할-수-있을까">00. 할인율 / 할인금액을 어떻게 정할 수 있을까?</h3>
<p>모두가 그러지는 않을 수 있습니다. 하지만 적어도 저는 아직 이커머스에서 고객에게 혜택을 제공할 때 그 혜택내용을 크게 고민하지는 않고 업무를 진행했던 것 같습니다. 이전에는 10% 할인쿠폰을 사용했으니까, 지난 번에는 1만원 할인쿠폰 사용했는데 결과가 잘 나왔으니까 또 같은 형식으로 프로모션을 진행했던 적이 꽤 많았습니다. 비용 시뮬레이션을 한다고는 하지만 크게 고민하고 진행하지는 않았습니다.
그러다가 문득 이런 생각이 들었습니다. 지금 내가 만들고 있는 혜택이 정말 최선의 혜택인가? 이렇게 쿠폰 스킴을 기획해도 되는걸까? 그래서 고민을 하기 시작했습니다. 어떤 혜택이 정말 최선의 결과를 나을 수 있는 혜택일까? 어떻게 혜택을 설정해야 더 적합한 프로모션을 진행할 수 있을까? 하는 생각들을요. 그래서 찾아보기로 했습니다. </p>
<p><img src="https://img.freepik.com/premium-vector/letter-of-thanks-and-a-1000point-discount-coupon-illustration-set-present-card-pay-shop_632180-957.jpg" alt=""></p>
<p><strong><em>최적의 할인율을 어떻게 구할 수 있을까?</em></strong></p>
<p>시간이 충분하다면 A/B 테스트를 진행하는 것이 가장 좋은 방법이라고 생각합니다. 여러 그룹을 나누고 각각 나눠서 어떤 혜택이 가장 최선일지 보는 것이 쉽고 직관적으로 이러한 문제에 대한 해답을 낳을 수 있다고 생각합니다. 그러나 시간이 충분히 필요하고 예산을 집행해야 하는 상황에서 A/B 테스트는 제가 선택할 수 있는 선택지에는 존재하지 않았습니다. 따라서 저는 과거에 진행했던 데이터를 바탕으로 최적 할인율을 구하는 방식을 진행하기로 했습니다. 데이터를 더욱 확인해봐야 정확하겠지만 일반적으로 할인율과 구매고객수는 선형관계를 취할 것이라고 가정하고 회귀 모델에 기반하여 최적의 할인율을 구하기로 했습니다.</p>
<h3 id="01-어떻게-해야-더-정확한-최적-할인율을-구할-수-있을까">01. 어떻게 해야 더 정확한 최적 할인율을 구할 수 있을까?</h3>
<p>현재 해결해야 하는 문제를 다시 구체화해보도록 하겠습니다. 특정 쿠폰을 고객에게 지급했을 때, 구매고객수가 가장 많이 발생하는 최적의 할인율을 구하고 싶습니다. 따라서 다른 목표(구매액, 구매건수 등)는 일단 무시하고 구매고객수만 고려하도록 하겠습니다. 또한 쿠폰에는 할인율 뿐만 아니라 다른 여러 가지 조건이 존재합니다. 이러한 조건들도 최적 할인율을 구할 때 같이 고려해야 합니다. 이러한 조건에는 최소구매액, 최대할인금액, 전체 예산, 쿠폰지급수가 존재합니다. 쿠폰에 따라서 쿠폰지급수가 차이가 있을 수도 있기 때문에 변수로 사용하기에는 구매고객수보단 쿠폰구매율(구매고객수/쿠폰지급수)을 고려하는 것이 더욱 적합할 듯 합니다.</p>
<p>일단 최적 할인율을 구하기 위해서는 회귀모델을 사용하고자 합니다. 이 때 회귀에 대해서 간단히 정리를 하도록 하겠습니다. 회귀는 이전 글에서 다룬 분류와 마찬가지로 대표적인 머신러닝 지도학습입니다. 분류가 결과를 클래스, 즉 카테고리로 나누는 모델이었다면 회귀는 결과가 연속형 숫자 값이 나오게 됩니다. 이러한 회귀 중 대표적인 모델이 선형 회귀입니다. 선형 회귀는 실제 값과 예측 값의 차이를 최소화하는 직선형 회귀선을 최적화하는 방식으로 이 안에서도 일반 선형 회귀, 릿지, 라쏘, 엘라스틱넷, 로지스틱 회귀 등이 존재합니다.</p>
<p>다양한 회귀 모델에 대해서는 이후 알아보도록 하고 이번 최적 할인율 예측에서는 최대한 간단한 선형 회귀모델을 사용하도록 하겠습니다. 이 때 모델에 사용되는 독립변수가 하나 이상이므로 다중 선형 회귀 모델로 진행을 하도록 하겠습니다. 다중 선형 회귀는 종속 변수와 둘 이상의 독립 변수 간의 관계를 모델링하는 통계적 기법입니다. 이는 선형 회귀의 확장된 형태로, 하나의 종속 변수에 여러 개의 독립 변수가 영향을 미치는 경우에 사용됩니다. 다중 선형 회귀의 기본적인 아이디어는 종속 변수와 독립 변수들 간의 선형 관계를 가정하는 것입니다. 종속 변수는 예측하고자 하는 변수이며, 독립 변수들은 종속 변수에 영향을 주는 변수들입니다.</p>
<p>다중 선형 회귀는 여러 개의 독립 변수들이 종속 변수에 영향을 미치는 경우에 유용합니다. 예를 들어, 집 가격을 예측하는 모델을 만들고자 할 때, 방의 개수, 욕실의 개수, 주택 면적 등 여러 독립 변수들이 종속 변수인 집 가격에 영향을 미칠 수 있습니다. 이러한 경우에 다중 선형 회귀를 사용하여 종속 변수와 독립 변수들 간의 관계를 모델링하고, 새로운 독립 변수 값에 대한 종속 변수 값을 예측할 수 있습니다.</p>
<p>현재로서는 해당 분석을 통해서 스터디를 우선적으로 하는 게 목적이기 때문에 가장 간단한 모델을 사용하면서 업무를 정리해보도록 하겠습니다. </p>
<h3 id="02-회귀분석">02. 회귀분석</h3>
<p>본격적인 내용을 다루기에 앞서 먼저 회귀분석에 대해서 간략하게 이해하고 넘어가도록 하겠습니다. 회귀 분석은 종속 변수와 독립 변수 사이의 관계를 모델링하는 방법입니다. 종속 변수는 예측하고자 하는 변수이며, 독립 변수는 종속 변수에 영향을 주는 변수들입니다. 회귀 분석은 이러한 변수들 간의 관계를 통계적인 모델로 나타내어 예측, 해석, 인과 관계 추론 등 다양한 분석 목적을 달성할 수 있습니다.</p>
<p>회귀 분석의 중요성은 다음과 같은 이유로 설명될 수 있습니다</p>
<ol>
<li>변수 간의 관계 이해</li>
</ol>
<p>회귀 분석을 통해 변수 간의 관계를 이해할 수 있습니다. 독립 변수와 종속 변수 사이의 선형, 비선형, 양의 또는 음의 상관 관계 등을 파악할 수 있습니다. 이를 통해 도메인 지식을 획득하고 데이터에 대한 통찰력을 얻을 수 있습니다.</p>
<ol start="2">
<li>예측 및 추론</li>
</ol>
<p>회귀 분석은 종속 변수의 값을 예측하는 데 사용됩니다. 학습된 회귀 모델을 통해 독립 변수 값을 입력하면 종속 변수의 예상 값을 얻을 수 있습니다. 또한 회귀 분석은 인과 관계를 추론하는 데에도 사용될 수 있습니다.</p>
<ol start="3">
<li>변수 영향력 파악</li>
</ol>
<p>회귀 분석은 독립 변수가 종속 변수에 미치는 영향력을 파악하는 데 도움을 줍니다. 각 독립 변수의 회귀 계수를 통해 변수의 상대적인 중요성을 알 수 있으며, 이를 통해 변수의 가중치나 중요도를 평가하고 비교할 수 있습니다.</p>
<ol start="4">
<li>이상치 탐지 및 처리</li>
</ol>
<p>회귀 분석은 이상치를 탐지하고 처리하는 데에도 사용됩니다. 이상치는 데이터의 정확성과 모델의 정확도에 부정적인 영향을 미칠 수 있으므로, 회귀 분석을 통해 이상치를 식별하고 조치를 취할 수 있습니다.</p>
<p>단순 선형 회귀는 독립 변수와 종속 변수 사이의 선형 관계를 모델링하는 회귀 분석 방법입니다. 이는 종속 변수와 독립 변수 간의 최적의 직선을 찾아내어 예측과 해석을 가능하게 합니다. 단순 선형 회귀 모델은 다음과 같은 형태로 표현됩니다. <code>Y = β₀ + β₁X + ε</code>
여기서 Y는 종속 변수, X는 독립 변수, β₀와 β₁는 회귀 계수(coefficients)이고, ε는 오차 항(error term)입니다. β₀는 y 절편(intercept)을 나타내며, β₁은 독립 변수 X의 기울기(slope)를 나타냅니다.</p>
<p>회귀 분석에서 가장 일반적으로 사용되는 추정 방법은 최소 제곱법(Ordinary Least Squares, OLS)입니다. 최소 제곱법은 오차 제곱의 합을 최소화하여 회귀 계수를 추정하는 방법입니다. 이를 통해 β₀와 β₁을 구하게 됩니다.</p>
<p>회귀 모델의 성능 평가는 여러 가지 지표를 사용할 수 있습니다. 대표적으로는 다음과 같은 지표들이 사용됩니다:</p>
<ol>
<li>평균 제곱 오차(Mean Squared Error, MSE) : 실제 값과 예측 값의 오차를 제곱하여 평균한 값입니다. 작을수록 모델의 예측이 정확합니다.</li>
<li>결정 계수(Coefficient of Determination, R²) : 종속 변수의 총 변동 중 모델이 설명하는 변동의 비율을 나타냅니다. 0과 1 사이의 값이며, 1에 가까울수록 모델이 데이터를 잘 설명합니다.</li>
<li>t-검정(t-test) 및 p-값(p-value) : 회귀 계수의 유의성을 평가하기 위해 사용됩니다. t-검정은 각 회귀 계수의 t-통계량을 계산하고, p-값은 해당 계수가 유의한지를 판단하는 데 사용됩니다.</li>
</ol>
<h3 id="03-데이터-수집-및-전처리">03. 데이터 수집 및 전처리</h3>
<p>가장 중요한 파트입니다. 우선적으로 독립 변수들의 데이터를 수집하고자 하는데 이 때 쿠폰의 스킴(최대할인금액, 최소구매액, 쿠폰지급수)와 전체 예산, 그리고 쿠폰사용수를 정리해야 합니다. 또한 쿠폰의 형태 또한 고려해야 하는데 할인율이 정해져있는 쿠폰 (10% 할인 쿠폰)이 있는 반면 할인금액이 정해져있는 쿠폰 (1만원 할인 쿠폰)이 있기 때문에 이러한 쿠폰의 형태 또한 구분해야 합니다. 또한 쿠폰의 세부조건이 있을 수도 있습니다. 특정 카테고리만 적용이 가능한 쿠폰, 한 개의 상품에만 적용 가능한 쿠폰, 장바구니 전체에 적용이 가능한 쿠폰처럼 여러 조건을 정리해야 합니다. 추가적으로 쿠폰이 특정 대상에게 지급된 것인지 아니면 누구나 사용가능한 쿠폰인지도 구분해야 합니다. vip고객에게만 제공된 쿠폰이라면 당연히 사용률도 높을 것이고 전체 대상이 사용 가능한 쿠폰이라면 사용률이 낮을 것이기 때문입니다.</p>
<p>이렇게 다양한 데이터를 다루게 되면 진행해야 하는 업무가 달라지게 됩니다. 예를 들어 카테고리 별로 적용 가능 여부를 보기 위해서 해당 데이터를 넣게 된다면 더 많은 전처리 과정을 거쳐야 하고 모델 또한 더욱 복잡해지는 경우가 많아집니다. 단순 회귀모델로 보기 어려우며 트리 기반 모델(예: 랜덤포레스트, XGBoost, LightGBM)을 통해 비선형 및 복잡한 상호 작용을 처리하는 게 더욱 효과적입니다.</p>
<p>이러한 실제적인 업무에 대해서는 다음 글에서 더욱 자세하게 살펴보도록 하고 이번에는 일반 회귀모델에 집중해서 내용을 진행해보도록 하겠습니다.</p>
<h3 id="04-선형-회귀-모델-생성-및-평가">04. 선형 회귀 모델 생성 및 평가</h3>
<p>가상의 데이터를 바탕으로 선형 회귀 모델을 생성하고 평가 또한 해보도록 하겠습니다.</p>
<pre><code class="language-python">import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 가상의 데이터 생성
data = pd.DataFrame({&#39;discount_rate&#39;: np.random.rand(100),
                     &#39;promotion_length&#39;: np.random.randint(1, 30, 100),
                     &#39;max_discount_amount&#39;: np.random.randint(1000, 5000, 100),
                     &#39;min_purchase_amount&#39;: np.random.randint(1000, 10000, 100),
                     &#39;number_of_coupons&#39;: np.random.randint(50, 200, 100),
                     &#39;total_budget&#39;: np.random.randint(10000, 100000, 100),
                     &#39;used_coupons&#39;: np.random.randint(1, 200, 100)})

# 쿠폰 사용률 계산 (used_coupons / number_of_coupons)
data[&#39;coupon_usage_rate&#39;] = data[&#39;used_coupons&#39;] / data[&#39;number_of_coupons&#39;]
</code></pre>
<p>위와 같은 코드를 통해서 가상의 데이터를 생성해보도록 하겠습니다. 변수는 더욱 다양할 수 있지만 효율성을 위해서 대략적인 변수로만 이를 확인해보도록 하겠습니다. X는 독립 변수를 나타내는 DataFrame으로, <code>&#39;discount_rate&#39;, &#39;promotion_length&#39;, &#39;max_discount_amount&#39;, &#39;min_purchase_amount&#39;, &#39;number_of_coupons&#39;, &#39;total_budget&#39;</code> 열을 포함합니다. y는 종속 변수를 나타내는 Series로, <code>&#39;number_of_customers&#39;</code> 열을 포함합니다.</p>
<pre><code class="language-python">X = data[[&#39;discount_rate&#39;, &#39;promotion_length&#39;, &#39;max_discount_amount&#39;, &#39;min_purchase_amount&#39;, &#39;number_of_coupons&#39;, &#39;total_budget&#39;]]
y = data[&#39;coupon_usage_rate&#39;]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

linear_regression = LinearRegression()
linear_regression.fit(X_train, y_train)

y_pred = linear_regression.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
</code></pre>
<p><code>train_test_split</code> 함수를 사용하여 데이터를 훈련 세트와 테스트 세트로 분할합니다. <code>test_size=0.2</code>는 테스트 세트의 비율을 20%로 설정하고, <code>random_state=42</code>는 분할을 재현 가능하도록 난수 생성기의 시드를 설정합니다. <code>mean_squared_error</code> 함수를 사용하여 예측값과 실제값 간의 평균 제곱 오차(MSE)를 계산합니다. MSE는 모델의 예측 오차를 측정하는 지표로, 값이 작을수록 예측 성능이 높음을 의미합니다.</p>
<pre><code class="language-python">X = data.drop([&#39;coupon_usage_rate&#39;, &#39;used_coupons&#39;], axis=1)
y = data[&#39;coupon_usage_rate&#39;]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
rf_regressor.fit(X_train, y_train)

y_pred = rf_regressor.predict(X_test)

best_discount_rate = 0
best_usage_rate = 0

for discount_rate in np.arange(0.1, 1, 0.1):
    X_scenario = X.copy()
    X_scenario[&#39;discount_rate&#39;] = discount_rate

    y_scenario_pred = rf_regressor.predict(X_scenario)
    mean_usage_rate = np.mean(y_scenario_pred)

    if mean_usage_rate &gt; best_usage_rate:
        best_discount_rate = discount_rate
        best_usage_rate = mean_usage_rate

print(f&quot;The optimal discount rate is: {best_discount_rate:.2f}&quot;)
</code></pre>
<p>이런 식으로 랜덤포레스트 회귀모델을 생성해볼 수 있습니다. </p>
<p>이후에는 일반 선형회귀 뿐 아니라 다른 모델도 살펴보면서 실제로 어떻게 최적 할인율을 구할 수 있는지 구체적인 글을 작성해보도록 하겠습니다.</p>
<hr>
<h3 id="reference">Reference.</h3>
<p>파이썬 머신러닝 완벽 가이드 - 권철민 지음(위키북스)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL도 안해보신 분한테 랜덤포레스트를 설명하라구요?]]></title>
            <link>https://velog.io/@robin_updata/%EB%9E%9C%EB%8D%A4%ED%8F%AC%EB%A0%88%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@robin_updata/%EB%9E%9C%EB%8D%A4%ED%8F%AC%EB%A0%88%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Sun, 07 May 2023 12:31:33 GMT</pubDate>
            <description><![CDATA[<p><em>최근에 받은 피드백에 맞춰서 글쓰기 톤을 바꿔봤습니다 🥳</em></p>
<h3 id="00-아니-그게-무슨말이에요-팀장님">00. 아니 그게 무슨말이에요 팀장님</h3>
<p>내가 어쩌다가 회사에서 갑자기 랜덤 포레스트를 사용하게 되었을까
지난 번 글에서는 결정트리에서 설명드렸습니다. 회사에서는 타겟마케팅을 진행하는 경우가 많고 이 때 브레이즈 등 다양한 마케팅 툴을 사용하게 됩니다. <strong>대 AI 시대</strong>에 이제 곧 여러 툴에서 바로 머신러닝을 사용할 수 있게 되겠지만 아직 저희 회사는 그런 상황은 아닙니다. 이런 상황에서 한 가지 질문을 받게 되었습니다</p>
<p><em>그래서 이런 타겟마케팅을 하면 <strong>실제 증분</strong>은 얼마나 되는거야? <strong>정말 효과 있는거야?</strong></em></p>
<p>사실 별로 알고 싶지는 않았습니다. 그렇지만 또 어쩌겠습니까, 해봐야죠. 그래서 제가 확인해 본 여러 타겟 마케팅은 그렇게 효과적이진 않았습니다. 실적이야 어떻게 보느냐에 따라 다르게 볼 수 있겠지만 실험군과 대조군을 비교해봤을 때 큰 실적을 내고 있다고 보기는 어려웠거든요. <strong>그런 이야기는 제가 하지 말았어야 했는데.</strong></p>
<p>이런 문제제기를 한 저에게 새로운 지시가 내려왔습니다. 그럼 타겟마케팅을 더욱 효과가 좋게 만들어봐라. 사실 현업에서는 이런 지시를 해결하는 아주 좋은 해결책이 있습니다. 고객에게 주는 혜택을 늘리면 바로 해결됩니다. 그러나 또 그런 건 대답이 될 수 없습니다. 비용은 줄이고 실적은 늘리는 그런 <strong>희귀한 말</strong>을 잡아와야 하거든요. 거기다 당장 예산 측정하기도 쉽고 성과도 도출하기 쉬우며 이전에 안해봤고 거기다 멋진 용어도 들어가 있는 <strong>유니콘</strong>을 잡아와야 하는 상황에 놓였습니다.</p>
<p><img src="https://dtd31o1ybbmk8.cloudfront.net/photos/1064c9a43e84833678da1e01d6ad0a27/thumb.png" alt="">
<span style="font-size:0.8em; color:gray"> <em>위에서는 상당히 불만이 많은 어조로 글을 작성했지만 사실 데이터분석가로서 이런 업무를 하는 건 꽤나 즐거운 일이긴 합니다. 저도 그랬을 겁니다. 사수와 업무를 이해해주는 팀장님이 있었다면 말이죠</em> </span></p>
<p>그래서 다음과 같은 문제를 해결하게 되었습니다. 타겟마케팅 대상인 고객의 증분효과를 늘리자. 혜택을 늘릴 수 없는 상황에서 더욱 정확하고 고도화된 타겟마케팅, 즉 고객 분류가 필요한 상황이 되었습니다.</p>
<h3 id="01-어떻게-하면-더욱-자세하게-고객-분류를-할-수-있을까">01. 어떻게 하면 더욱 자세하게 고객 분류를 할 수 있을까?</h3>
<p>지금 문제는 고객의 반응률, 유입률 등을 높이는 게 아닙니다. 저는 실험군과 비교군의 차이, 즉 타겟마케팅 대상의 고객이 정말 타겟마케팅의 결과로 <strong>행동이 변화하였는가?</strong> 를 보고 싶은 상황입니다. 물론 정말로 어떤 액션이 고객 행동의 변화를 이끌었는가를 보기 위해서는 더욱 자세한 분석방법론(인과관계분석, 더욱 고도화된 a/b test 등)을 응용하면 좋겠지만 일단 시작하는 과정에서 조금은 빠르게 진행할 수 있는 방법을 고민하게 되었습니다. 일단 고객의 구매가능성을 바탕으로 고객을 분류해보고자 했습니다. 해당 타겟마케팅이 없었다면 구매 행동이 없었을 고객인지, 아니면 타겟마케팅이 없었더라도 구매행동을 했을 고객인지를 구분하여 비효율적인 비용 집행을 줄이고자 했고 추가적으로 증분 효과를 더욱 키우고자 함입니다. </p>
<p>따라서 미구매 고객 예측을 하기 위해서 고객 분류를 진행하고자 하였고 이를 하기 위해서 랜덤포레스트 모델을 사용하기로 했습니다. 왜 결정트리를 사용하지 않았을까요? 사실 결정트리 모델이 훨씬 더 직관적이고 설명하기 쉬운 건 사실입니다. 그렇지만 저는 다음과 같은 이유로 랜덤포레스트를 선택했습니다.</p>
<ol>
<li><strong>모델성능이 훨씬 뛰어나다</strong></li>
</ol>
<p>현재 고객 분류를 하는 것은 증분효과를 더욱 극대화하기 위해 진행하는 것이기 때문에 주 목적이 고객 분류를 하는 것이 아니라 해당 분류를 통해서 성과를 늘리는 것이라고 판단했습니다. 즉, 분류는 도구일 뿐이지 목적이 아니기 때문에 일반적으로 모델 성능이 더욱 뛰어난 랜덤포레스트가 더 좋다고 생각했습니다.</p>
<ol start="2">
<li><strong>다양한 유형의 데이터를 다뤄야 한다</strong></li>
</ol>
<p>고객 데이터는 범주형, 연속형 상관없이 정말 다양한 데이터가 존재하고 있습니다. 깔끔하게 정리된 데이터 뿐만 아니라 실제로 모델을 생성할 때는 데이터 전처리에 많은 시간을 들여야하는데 이런 과정에서 랜덤포레스트가 훨씬 모델 성능에 도움이 됩니다.</p>
<ol start="3">
<li><strong>모델의 설명력이 별로 중요하지 않다</strong> 🤣</li>
</ol>
<p>네.... 사실 제가 무슨 모델을 사용하든 크게 중요하지 않을 것이라고 생각했습니다. 물론 고객 분류가 도구이기 때문이기도 맞지만 제가 이 업무를 보고하고 설명해야 하는 대상자가 데이터 지식이 거의 없기 때문에 아무리 결정트리가 설명하기에 더 쉽고 직관적이라고 해도 유의미하게 쉽지는 않을 것이라고 생각했습니다. 따라서 설명력이 크게 중요하지 않을 것이라고 생각했기에 랜덤포레스트 모델을 선택하게 되었습니다.</p>
<p>위와 같은 이유들로 랜덤포레스트로 미구매 고객 예측(분류)를 진행하게 되었습니다. 제가 진행하는 업무 방향은 다음과 같습니다.</p>
<ol>
<li>랜덤포레스트 모델에 사용할 수 있도록 다양한 형태의 고객 데이터를 수집 및 전처리 과정을 진행한다</li>
<li>과거 고객 데이터(약 3개월치)를 바탕으로 그 다음 달에 고객이 구매를 했는지 안했는지를 분류하는 랜덤포레스트 분류 모델을 생성한다</li>
<li>생성한 랜덤포레스트 분류 모델을 최근 3개월 (1월~3월)을 바탕으로 실제 4월에 고객이 구매를 할 것인지, 아닌지를 예측한다</li>
<li>고객 타겟마케팅을 진행할 때 미구매 고객으로 예측된 고객에게 진행을 하고 실제 증분효과를 확인한다</li>
<li>증분효과와 위 분류모델을 보고한다</li>
</ol>
<p>그래서 실제로 어떻게 업무를 진행했는지 아래 자세하게 작성해보도록 하겠습니다.</p>
<h3 id="02-데이터-수집-및-전처리">02. 데이터 수집 및 전처리</h3>
<p>위에서도 말했다시피 랜덤 포레스트는 상대적으로 데이터 종류가 다양해도 모델이 잘 수행되는 아주 좋은 모델입니다. 사용할 수 있는 데이터가 다양한 상황에서 랜덤포레스트는 그래도 저에게 위안을 주었습니다. 그렇지만 조금 업무가 줄었을 뿐이지 실제로 이 과정이 전체 과정에서 제일 오래걸리는 과정입니다.</p>
<p>먼저 실제로 어떤 특성을 사용하면 좋을까 하며 추출 가능한 특성들을 나열해나갔습니다. 특정 카테고리 구매 여부, 3개월 연속구매, 2개월 연속구매, 1개월 연속구매, 가입시점, 고객 등급, 수신동의여부, 특정 상품 구매여부 등 다양한 특성을 나열하고 추가적으로 가설을 통해서 생성할 수 있는 특성들을 나열했습니다. 아이 여부, 자동차 소유 여부, 취미, 예상 소득치 등 여러 특성들을 나열하고 이러한 특성에 대한 가설과 이를 실제로 수집할 수 있는지 담당자들에게 문의 및 확인을 해나가면서 해당 특성을 채워나갔습니다. </p>
<p><em>사실 이 부분을 쓰는게 약간 겁이 납니다. 회사 업무를 이렇게 작성해도 되나.. 싶어서요! 그래서 해당 과정은 블로그에는 대략적으로만 작성하고 포트폴리오에 구체적으로 작성할 예정입니다 😀</em></p>
<p>이렇게 생성한 고객 특성 테이블은 매달 업데이트를 해야하기 때문에 <strong>친절하게 주석을 작성</strong>하고 더 이쁘게 작성하여 유지보수하기 더 적합하게 생성했습니다. 혹시나 이 과정을 하고자 하는 분이 이 글을 읽고 계신다면 다시 한 번 더 강조하지만 이 파트가 전체에서 제일 중요한 파트입니다. 생각보다 분류에 도움이 안되는 특성이 많고 친절하게 답변해주지 않는 담당자분들이 더 많으니 이 과정에서 <strong>많은 시간을 소요하게 됩니다.</strong></p>
<p>그러나 다행인 건 랜덤 포레스트 모델을 사용하고 있다는 점입니다. 랜덤 포레스트는 <strong>이상치에 대한 영향을 크게 받지 않습니다.</strong> 각각의 결정트리는 이상치를 제거하거나 대체하는 것이 아니라, 전체 데이터에서 무작위로 샘플링한 부분집합으로 학습하기 때문에, 이상치에 대한 영향력이 줄어들게 됩니다. 또한 랜덤 포레스트는 <strong>데이터 스케일링에 대한 영향을 크게 받지 않습니다.</strong> 따라서, 데이터를 정규화하거나 표준화하지 않아도 높은 예측 성능을 보일 수 있습니다. 그리고 랜덤 포레스트 모델은 모든 특성을 사용하는 것이 아니라 <strong>특성을 선별하여 모델을 학습하는 앙상블 모델</strong>이기 때문에 상대적으로 다양한  업무로부터 데이터 분석가를 자유롭게 합니다.</p>
<p><img src="https://i1.sndcdn.com/avatars-xGZwNiOrSyABMBpf-sXK0wQ-t240x240.jpg" alt="">
<span style="font-size:0.8em; color:gray"> <em>데이터 분석가는 이제 자유예요!
  실제로 아래 과정은 위 과정에 비하면 큰 시간이 필요하진 않습니다. 운이 좋다면요.</em> </span></p>
<h3 id="03-랜덤-포레스트-모델-생성-및-모델-평가">03. 랜덤 포레스트 모델 생성 및 모델 평가</h3>
<p>이제 학습에 사용할 데이터가 준비되었다면 실제 모델을 생성해보도록 하겠습니다. 사용 언어는 python이고 필요한 라이브러리는 다음과 같습니다.</p>
<pre><code class="language-python">
import pyodbc
import pandas as pd
import numpy as np
import pickle
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
</code></pre>
<p>물론 사용한 라이브러리에는 반드시 필요하지는 않은 것들도 많으니 취사선택하여 상황에 맞게 사용하시면 더욱 좋을 듯 합니다.</p>
<p>다음처럼 모델을 생성하는데 이 때 다양한 파라미터가 존재합니다. 간단하게만 해당 파라미터를 설명하자면</p>
<pre><code class="language-python">
model = RandomForestClassifier(n_estimators=1000, max_depth=10, min_samples_split=3, min_samples_leaf=2, max_features=&#39;sqrt&#39;)
</code></pre>
<p>위 코드처럼 <code>n_estimators, max_depth, min_samples_split, min_samples_leaf, max_features</code> 등이 존재합니다. 이러한 파라미터 값들을 수정하면서 모델의 성능을 더욱 개선할 수 있습니다.  물론 모델의 성능을 개선하는데 가장 효과적인 방법은 <strong>데이터 수집과 전처리 과정에 더 많은 시간을 투자</strong>하는 것입니다. </p>
<p><img src="https://profisee.com/wp-content/uploads/2021/09/garbage_in_garbage_out-1024x576.webp" alt="">
<span style="font-size:0.8em; color:gray"> <em>언제나 진리입니다.</em> </span></p>
<p>전체적인 코드를 보도록 하겠습니다.</p>
<pre><code class="language-python">
# cat_cols: 범주형 변수들의 리스트입니다.

cat_cols = [여기 범주형 변수들을 넣습니다.]

# transformer: ColumnTransformer를 사용하여 범주형 변수들을 OneHotEncoder로 변환합니다.
# remainder=&#39;passthrough&#39;는 나머지 변수들을 변환하지 않고 그대로 유지하도록 설정합니다.

transformer = ColumnTransformer(transformers=[(&#39;cat&#39;, OneHotEncoder(), cat_cols)], remainder=&#39;passthrough&#39;)

# data_transformed: ColumnTransformer를 적용하여 데이터를 변환합니다.

data_transformed = transformer.fit_transform(data)

X = data_transformed[:, :-1]
y = data_transformed[:, -1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestClassifier(n_estimators=1000, max_depth=10, min_samples_split=3, min_samples_leaf=2, max_features=&#39;sqrt&#39;)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

</code></pre>
<p>이렇게 랜덤 포레스트 모델을 생성했다면 이제 모델의 성능을 평가해야 합니다. 다양한 평가방법이 존재하지만 저는 대표적인 아래와 같은 모델 성능 평가 지표를 사용했습니다. </p>
<pre><code class="language-python">
accuracy = accuracy_score(y_test, y_pred)
print(&quot;정확도:&quot;, accuracy)

precision = precision_score(y_test, y_pred, pos_label=&#39;YES&#39;)
print(&quot;정밀도:&quot;, precision)

recall = recall_score(y_test, y_pred, pos_label=&#39;YES&#39;)
print(&quot;재현율:&quot;, recall)

f1 = f1_score(y_test, y_pred, pos_label=&#39;YES&#39;)
print(&quot;f1:&quot;, f1)
</code></pre>
<p>실제 결과는 아래와 같이 나왔습니다.</p>
<pre><code>정확도: 0.9226388888888889
정밀도: 0.9410010983838066
재현율: 0.9707024927160893
f1: 0.955621066050514</code></pre><p>이런식으로 오차행렬을 볼 수도 있습니다.</p>
<pre><code class="language-python">from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)


labels = [&#39;NO&#39;, &#39;YES&#39;]
fig, ax = plt.subplots()
im = ax.imshow(cm, interpolation=&#39;nearest&#39;, cmap=plt.cm.Blues)
ax.figure.colorbar(im, ax=ax)
ax.set(xticks=np.arange(cm.shape[1]),
       yticks=np.arange(cm.shape[0]),
       xticklabels=labels, yticklabels=labels,
       title=&#39;Confusion Matrix&#39;,
       ylabel=&#39;True label&#39;,
       xlabel=&#39;Predicted label&#39;)


thresh = cm.max() / 2.
for i in range(cm.shape[0]):
    for j in range(cm.shape[1]):
        ax.text(j, i, format(cm[i, j], &#39;d&#39;),
                ha=&quot;center&quot;, va=&quot;center&quot;,
                color=&quot;white&quot; if cm[i, j] &gt; thresh else &quot;black&quot;)

plt.show()</code></pre>
<p>모델 성능이 나쁘지 않습니다. <strong>아니 사실 매우 좋습니다.</strong> 운이 매우 좋은 상황입니다. 따라서 이제 이 모델을 실제 데이터에 적용해보도록 하겠습니다.</p>
<h3 id="04-실제-적용과-성과-확인">04. 실제 적용과 성과 확인</h3>
<p>실제 데이터(1월~3월)를 바탕으로 4월에 고객들이 미구매할 것인지 아닌지를 예측해보도록 하겠습니다. 이 때, 고객을 더욱 세분화하기 위해서 이진분류가 아니라 <strong>예측 확률</strong>을 바탕으로 스코어를 계산해보도록 하겠습니다.</p>
<pre><code class="language-python">y_proba = model.predict_proba(new_data_transformed)</code></pre>
<p>위 코드로 <code>y_proba</code>를 계산하면 이진분류가 아니라 해당 값이 <strong>레이블에 속할 확률</strong>이 나오게 됩니다. 이제 이러한 확률(스코어)를 실제 타겟 마케팅에 적용해보도록 하겠습니다. 이 부분은 자세하게 설명할 순 없지만 이전에 진행했던 타겟마케팅에 해당 미구매 고객 예측 조건만 추가하여 타겟 마케팅을 진행했습니다. 물론 여러 조건이 동시에 적용이 되었을 것이기 때문에 <strong>단순 비교는 어렵습니다.</strong> 그러나 성과를 대략적으로 비교해보도록 하겠습니다. 이전에는 타겟마케팅으로 인한 상승효과가 약 1%밖에 안되었지만 미구매 고객 예측을 적용 후에는 이러한 상승효과가 *<em>20% *</em>까지 상승했습니다. 매우 기쁘네요! 이제 이 성과를 팀장님과 상무님께 보고만 하면 되겠습니다 😀</p>
<p><img src="https://mblogthumb-phinf.pstatic.net/MjAxNjEyMDZfMTY1/MDAxNDgxMDMwMzgxMDgy.SANhebTwlqJITs9mLpq8SxSqdLNPo2VTuYqQG5Wfockg.olVy4o3xPL3C8-Z6bGepLfJRKYPnLLICjg-mmNbVM94g.JPEG.withbooks3/%EC%9A%B4%EC%88%98_%EC%A2%8B%EC%9D%80_%EB%82%A0.jpg?type=w800" alt="">
<span style="font-size:0.8em; color:gray"> <em>어쩐지 운수가 좋더라니..</em> </span></p>
<h3 id="05-보고-및-개인적인-회고">05. 보고 및 개인적인 회고</h3>
<p>랜덤 포레스트 모델 평가 지표도 매우 좋고 실제로 이를 타겟 마케팅에 적용해보니 성과도 개선이 되었습니다. 그러나 이러한 성과는 보고 대상자에게는 <strong>큰 의미가 없을 수 있습니다.</strong> 일단 이 전 과정을 설명하기에는 보고 대상자분들을 보통 시간이 없으며 관심도 없습니다. 따라서 이를 통해서 어떤 성과를 얻었는지만 간략하게 보고하게 됩니다. 그러나 미구매 고객을 분류 및 예측하여 이러한 고객에게만 타겟마케팅을 진행하는 것은 분명 증분, 상승효과의 개선에는 도움이 되지만 전체 반응률은 감소할 수 있습니다. <strong>아니, 감소합니다.</strong> 왜냐하면 당연하게도 이전에는 타겟마케팅을 구분없이 진행했다면 이제는 타겟마케팅이 없이는 구매를 하지 않을 고객에게만 타겟 마케팅을 하는 거니까요. 하지만 보고대상자는 보통 여기까지는 고려하지 않습니다. </p>
<p>그럼 어떻게 보고를 해야 효과적으로 이 성과를 전달할 수 있을까요? 개인적으로는 아래와 같은 요건이 필요하다고 생각합니다.</p>
<ol>
<li><strong>지속적인 약식 보고</strong></li>
</ol>
<p>적어도 팀장님에게는 업무를 약식으로라도 보고를 해야한다고 생각합니다. 팀장님께서 커버하는 업무 범위는 매우 넓고 많을 것이므로 제가 하는 모든 업무를 알고 있을 것이라고 생각하면 안됩니다. 따라서 업무를 꾸준하게 보고 및 소통하여 해당 업무에 대한 팀장님의 이해도를 높여야 합니다.</p>
<ol start="2">
<li><strong>두괄식, 그러나 논리구조 설명하기</strong></li>
</ol>
<p>저는 보통 업무를 보고할 때는 모두 두괄식으로 진행합니다. 그렇게 진행하는 것이 해당 보고를 이해하는 데 더욱 도움이 된다고 생각합니다. 그러나 일부  상황에서는 그렇지 않을 수도 있습니다. 이번 업무의 보고는 그 보고 대상자가 배경 지식이 부족할 수 있습니다. 따라서 바로 두괄식으로 설명하면 이해하기가 굉장히 어려울 수 있습니다. 물론 해당 보고에서 사용되는 지식을 설명하는 것도 좋겠지만 현실적으로 어려운 상황에서 왜 이러한 방식으로 이렇게 업무를 진행했는지에 대한 논리적인 흐름을 보고에 추가하는 것도 좋을 수 있습니다.</p>
<p>물론 현실적으로는 위와 같은 과정을 진행하더라도 <strong>어려움을 겪을 수 있습니다.</strong> 이번에 제가 겪은 가장 큰 어려움은 보고 대상자의 배경 지식 부족이었습니다. 해당 업무가 어느 정도의 리소스가 필요한지, 실제로 어느 정도 시간이 필요한지, 그래서 변화한 성과가 얼마나 좋은 것인지, 그게 그렇게 중요한 것인지에 대해서 설명 및 <strong>설득</strong>을 해야 하는 상황이 제일 큰 어려움으로 닥쳐왔습니다. 적어도 팀장님께서는 해당 업무에 대해서 같이 이해를 했으면 더욱 좋았겠네요.</p>
<p>결론적으로 저는 실제 모델을 생성하고 적용하는 것보다 <strong>보고를 하는 데 더 많은 어려움을 겪었습니다.</strong> 사실 이 전 과정을 업무위키에도 저장했지만 해당 위키를 읽으시는 일은 없으시더라구요. 이해없이 그냥 던지시는 피드백이 오히려 업무를 어렵게 만들기는 했습니다. 다음부터는 업무를 잘하는 것을 넘어서 <strong>어떻게 보고를 하고 설득을 할 것인지</strong>에 대해서도 고민을 하며 업무를 진행해야겠다는 반성을 하게 되었습니다.</p>
<p>실제로 해당 업무는 현재 진행 중에 있습니다. 이제 모델을 모두 생성했고 실제로 적용을 해봤으니 앞으로는 모델을 고도화하거나 해당 경험을 바탕으로 새로운 모델을 고민해보는 업무를 해볼 수 있겠네요. 그리고 벨로그에 이렇게 정리했던 경험을 바탕으로 팀장님에게 더욱 자세히 설명할 수 있는 계기를 마련할 수 있었음 좋겠습니다.</p>
<hr>
<h3 id="reference">Reference.</h3>
<p>파이썬 머신러닝 완벽 가이드 - 권철민 지음(위키북스)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[결정트리]]></title>
            <link>https://velog.io/@robin_updata/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%AC</link>
            <guid>https://velog.io/@robin_updata/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%AC</guid>
            <pubDate>Sun, 23 Apr 2023 04:57:22 GMT</pubDate>
            <description><![CDATA[<h3 id="00-의사결정나무가-갑자기-왜-나와">00. 의사결정나무가 갑자기 왜 나와?</h3>
<p>의사결정나무, <code>decision tree</code>에 대해서는 많이들 들어왔을 듯 합니다. 다만 본격적으로 해당 모형이 어떻게 작동하는지에 대해서는 모르는 사람들이 많을 듯 하여 해당 글을 작성하게 되었습니다. 제가 그렇거든요.</p>
<p>회사에서 마케팅팀에서는 <strong>타겟마케팅</strong>을 진행하는 일이 꽤 많습니다. 그럴 때 브레이즈와 같은 툴을 이용한다면 쉽게 고객을 타겟할 수 있겠지만 가끔은 더 고도화된 형태로 고객들에게 타겟마케팅을 진행하고 싶을 때가 있습니다. 그럴 때 다양한 고객 형태를 고민하게 되는데 비용 효율화의 측면에서는 다음과 같은 고민을 할 수 있습니다. 이 고객에게 내가 괜한 푸시메시지, 혜택을 주고 있는 건 아닐까? 이 고객에게 굳이 추가 혜택을 주지 않더라도 이 고객이 알아서 구매를 잘 할 것 같은 고객이라면 내가 비효율적으로 비용을 쓰고 있는 건 아닐까? 그래서 그런 고객들, 즉 특별히 어떤 추가적인 혜택을 주지 않더라도 구매를 할 것 같은 고객을 분류하고 싶습니다. 가능하면 YES or NO가 아니라 그럴 확률을 점수화해서 보면 더욱 좋겠군요. 그런 데이터분석가와 마케터를 위해서 분류라는 것이 도움이 될 듯 합니다.
<img src="https://t1.daumcdn.net/cfile/tistory/1114641D4B34D4907A" alt=""></p>
<p><span style="color:yellowgreen"> <em>모르는 상황에서 보면 사실 점성술이나 다를 바 없는 이야기이기도 합니다. 회사에서도 그런 분들을 <strong>설득</strong>하기 위해, 그리고 제가 더 잘 <strong>이해</strong>하기 위해서 이 글을 작성하게 되었습니다 :)</em> </span></p>
<p>머신러닝에서 분류(Classification)는 데이터를 정의된 <strong>클래스</strong> 또는 <strong>범주</strong>로 구분하는 작업을 말합니다. 즉, 지도학습(Supervised Learning)의 한 종류로, 입력 데이터와 그에 해당하는 클래스 정보가 함께 제공되면 모델이 이를 학습하고 새로운 데이터에 대해 예측을 수행하는 방식으로 이루어집니다. 즉, 기존 데이터가 어떤 클래스에 속하는지 알고리즘을 통해 파악한 후 새로운 데이터에 대한 클래스를 <strong>판별</strong>하는 것입니다. 그러한 분류를 도와주어 의사 결정에 도움이 되는 모델의 대표적인 것이 의사결정나무(결정트리)입니다. 의사결정나무는 데이터를 기반으로 여러 결정 규칙을 생성하고 이를 통해 데이터를 분류하는 알고리즘입니다. </p>
<p>의사결정나무는 특징을 기반으로 데이터를 분할하고, 이에 속하는 데이터들의 클래스를 예측하는 규칙을 생성합니다. 이 규칙들을 트리 구조로 표현하여 직관적이고 해석하기 쉬운 모델을 제공합니다.</p>
<p><img src="https://blog.kakaocdn.net/dn/wlH1u/btqwWZI9Xen/kFJDjGSFJAPxhyatC3Xhs0/img.png" alt="">
출처 : 귀퉁이 서재</p>
<p>의사결정나무는 주로 분류 문제를 해결하는데 도움이 되지만 뿐만 아니라 회귀, feature selection, outlier detection 분야에서도 많은 도움을 줍니다.</p>
<p>결정트리가 어떻게 실제로 데이터 분석을 하는지 예시를 들어보겠습니다.</p>
<p>어떤 음식 배달 서비스가 고객들에게 할인 쿠폰을 제공하고자 합니다. 이때, 어떤 고객에게 할인 쿠폰을 제공할지를 결정하기 위해 결정트리를 사용할 수 있습니다.</p>
<ol>
<li>데이터 수집: 고객들에게 관련된 정보를 수집합니다. 예를 들어, 고객의 나이, 성별, 거주 지역, 주문 이력, 결제 방식, 고객 등급 등의 데이터를 수집합니다.</li>
<li>데이터 전처리: 수집한 데이터를 정리하고 전처리합니다. 예를 들어, 누락된 데이터나 이상치를 처리하고, 범주형 데이터를 숫자형으로 변환하는 등의 작업을 수행합니다.</li>
<li>특징(feature) 선택: 결정트리에 사용할 특징(feature)을 선택합니다. 예를 들어, 고객의 나이, 성별, 거주 지역 등이 특징으로 선택될 수 있습니다.</li>
<li>데이터 분할: 데이터를 학습 데이터와 테스트 데이터로 분할합니다. 학습 데이터는 결정트리를 학습시키는 데 사용되고, 테스트 데이터는 학습된 결정트리의 성능을 평가하는 데 사용됩니다.</li>
<li>결정트리 학습: 학습 데이터를 사용하여 결정트리를 학습시킵니다. 의사결정나무는 데이터를 특징(feature)에 따라 분할하는 과정을 거치며, 정보이득(information gain)이나 지니불순도(Gini impurity) 등의 지표를 사용하여 가장 효과적인 분할을 선택합니다.</li>
<li>결정트리 평가: 학습된 결정트리를 사용하여 테스트 데이터에 대해 예측을 수행하고, 예측 결과를 평가합니다. 정확도, 정밀도, 재현율 등의 평가 지표를 사용하여 결정트리의 성능을 평가합니다.</li>
<li>모델 개선: 필요에 따라 모델을 개선합니다. 예를 들어, 결정트리의 최대 깊이(maximum depth)를 조절하거나 가지치기(pruning)를 수행하여 과적합(overfitting)을 방지하거나 성능을 향상시킬 수 있습니다.</li>
</ol>
<h3 id="01-의사결정나무의-작동-원리">01. 의사결정나무의 작동 원리</h3>
<p>의사결정나무는 데이터를 분석하여 결정 규칙을 생성하는데, 다음과 같은 작동 원리를 가지게 됩니다.</p>
<ol>
<li>데이터 분할 (Data Splitting) : 데이터의 특징들을 기반으로 분할 기준을 설정하고, 해당 기준에 따라 데이터를 분할합니다. 이 때 데이터를 가장 잘 분할하는 특징을 선택하고, 해당 특징의 분할 기준을 결정하는데에 다양한 알고리즘이 사용됩니다.</li>
<li>결정 규칙 생성 : 데이터를 분할하면서 생성된 각각의 분할된 영역에 대해 예측을 위한 결정 규칙을 생성합니다. 이 규칙은 분할 기준을 통해 생성되며, 각 분할된 영역에 대해 예측이 가장 정확하게 이루어질 수 있는 규칙을 생성하게 됩니다.</li>
<li>트리 구조 형성 : 데이터를 분할하고 결정 규칙을 생성한 후, 이를 트리 구조로 표현합니다. 트리 구조는 root node, branch node, leaf node로 구성되며, 해당 노드를 내려가는 경로가 결정 규칙을 형성합니다.</li>
</ol>
<p>이렇게 생성된 의사결정나무는 매우 직관적이며 pruning 과정을 통해 데이터의 과적합을 방지할 수 있습니다. 또한 비교적 빠른 예측 속도를 가지고 있으며 직관적이기 때문에 해석하고 설명하는데 매우 용이합니다.</p>
<h3 id="02-의사결정나무-공부하기">02. 의사결정나무 공부하기</h3>
<p>그럼 이제 본격적으로 의사결정나무에 대해서 알아보도록 하겠습니다. 의사결정나무는 기본적으로 데이터를 분할하는 과정에서 레이블의 값이 순수해지도록 분할 기준을 형성합니다. 이러한 분할 기준은 순수, 즉 불순도(impurity)를 최소화하는 것을 목적으로 합니다. 불순도는 분할된 데이터가 얼마나 순수한 상태인지, 즉 각 노드에서의 클래스의 혼잡도를 측정합니다. 대표적인 불순도 지표로는 엔트로피, 지니계수, 분류오차 등이 있습니다. 예를 들어 지니계수는 각 클래스의 확률을 제곱하여 합한 것에서 1을 뺀 값으로 계산됩니다. 즉, 만약 데이터의 클래스가 총 k개이고, 각 클래스의 확률이 P1, P2, ... Pk라면 지니계수는 다음과 같이 계산됩니다.</p>
<p><code>Gini Index = 1 - (P1^2 + P2^2 + ... + PK^2)</code></p>
<p>이렇듯 불순도를 최소화는 방향으로 분할 기준을 하게 되는데 이 때 단순히 위 목적만 가지고 진행한다면 데이터에 과적합이 있을 수 있습니다. 따라서 pruning이라는 과정이 필요합니다. pruning, 가지치기는 의사결정나무를 단순화하여 일반화 능력을 향상시키는 과정으로, 어떤 노드에서 규칙을 삭제할 것인지를 결정하는 과정이 필요합니다. 가지치기는 크게 사전가지치기, 사후가지치기로 나뉘게 됩니다. 사전가지치기는 분기를 결정하는 기준을 더 강하게 설정하여 가지의 수를 제한하는 방법입니다. 예를 들어, 최대 깊이를 제한하거나 노드에 속한 샘플의 최소 개수를 설정하는 방식입니다. 사후 가지치기는 의사결정나무 생성 후, 가지치기를 진행합니다. 검증 데이터를 사용하며 예측 성능을 평가하고 이 중 최적인 모델을 선택하는 방식으로 이루어집니다. 대표적으로 교차검증 기반 방식과 비용 복잡도 방식이 있습니다. </p>
<p>다시 보자면 의사결정은 최대한 균일한 데이터 세트를 구성할 수 있도록 분할하는 방향으로 진행됩니다. 균일하다는 것은 데이터 세트 안에 최대한 한 쪽으로 데이터가 구성되는 것을 의미합니다. 
<img src="https://velog.velcdn.com/images%2Fsset2323%2Fpost%2Fc0a6642a-9440-4d67-a356-7db761d49fda%2Fimage.png" alt=""></p>
<p>위 그림에서 가장 균일도가 높은 것은 c입니다. 데이터가 균일하면 해당 데이터 세트에서 데이터를 구분하는데 많은 리소스가 필요하지 않다는 의미입니다. 이런 식으로 균일도가 가장 높은 데이터 세트를 구성할 수 있도록 트리는 데이터를 분할하게 됩니다. 이러한 균일도를 측정하는 방법이 위에서 말한 지니계수가 있습니다. 우리가 사이킷런에서 사용하는 <code>DecisionTreeClassifier</code>도 지니계수를 사용합니다. </p>
<p>그리고 의사결정나무는 단일 트리로만 구성될 수도 있지만, 앙상블 기법을 활용할 수도 있습니다. 대표적으로 random forest가 있는데 이는 여러 의사결정나무를 결합하여 예측 결과를 향상시키는 방법입니다. </p>
<h3 id="04-python에서-살펴보기">04. Python에서 살펴보기</h3>
<p>파이썬 환경에서 실제 결정 트리를 확인해보기 위해서 사이킷런에서 제공하는 <code>make_classification()</code>을 사용해서 예시 데이터를 생성 후 확인해보도록 하겠습니다. </p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/ac1d4908-3325-4e2f-9502-2cbb85add40c/image.png" alt=""></p>
<p>위 코드를 통해 2개의 피처를 가진 데이터를 3개의 클래스에 분류하는 데이터 세트를 생성해보도록 하겠습니다. </p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/7e6986e0-8e8b-4553-8ce4-19ac6cb70f9f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/b0f3433f-db39-482f-9871-00881a6d6628/image.png" alt=""></p>
<p>위처럼 디폴트로 결정 트리를 생성해서 분류를 진행하게 되면 아래와 같은 결과를 얻을 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/2a5079d1-c32c-4fae-b214-fe5c0b6e52c9/image.png" alt="">
아웃라이어 또한 분류를 하기 위해서 시각화 상 복잡한 형태를 보입니다. 이 때 <code>min_sample_leaf</code>를 조정하여 다르게 시각화를 해보도록 하겠습니다. </p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/8c347d42-99d6-4a71-b770-8eaa9f6ee70c/image.png" alt="">
<img src="https://velog.velcdn.com/images/robin_updata/post/30663104-29cd-4c74-a402-81e5dcfea12b/image.png" alt=""></p>
<p>이상치는 무시하면서 더 일반적인 데이터 분류를 할 수 있음을 확인할 수 있습니다.</p>
<p>다음에는 이러한 결정트리를 이용한 랜덤 포레스트와 이러한 모델을 평가하는 방법에 대해서 추가적으로 작성해보고자 합니다.</p>
<hr>
<h3 id="reference">Reference.</h3>
<p><a href="https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-4-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%ACDecision-Tree">귀퉁이 서재 - 머신러닝 - 4. 결정 트리(Decision Tree)</a>
파이썬 머신러닝 완벽 가이드 - 권철민 지음(위키북스)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Side note. SQL cheat sheet]]></title>
            <link>https://velog.io/@robin_updata/Side-note.-SQL-cheat-sheet</link>
            <guid>https://velog.io/@robin_updata/Side-note.-SQL-cheat-sheet</guid>
            <pubDate>Fri, 07 Apr 2023 13:52:31 GMT</pubDate>
            <description><![CDATA[<h2 id="00-sql-101">00. SQL 101</h2>
<p>구글 빅쿼리에서 사용하는 대부분의 문법은 일반 RDBMS SQL과 매우 유사합니다. 이번 글에서는 이러한 SQL의 기초적인 사용법에 대해서 정리를 하도록 하겠습니다. 갑자기 SQL을 정리하게 된 이유는 회사에서 이를 정리해야 하는 일이 있었기 때문입니다 😂</p>
<h2 id="01-sql에서-데이터를-검색하는-법">01. SQL에서 데이터를 검색하는 법</h2>
<h3 id="1-데이터베이스와-테이블의-개념과-구조">1. 데이터베이스와 테이블의 개념과 구조</h3>
<h4 id="11-데이터베이스와-테이블">1.1 데이터베이스와 테이블</h4>
<ul>
<li>데이터베이스와 테이블은 MS SQL Server와 같은 RDBMS에서 가장 기본적인 구성 요소임</li>
<li>데이터베이스에는 여러 테이블이 속해 있으며 테이블은 데이터를 저장하는 행과 열로 구성됨</li>
<li>열(column)은 데이터의 종류를 정의하고 행(row)은 데이터의 실제 값을 포함함</li>
<li>행은 테이블 안에서 식별자를 가지며 이 식별자를 통해 데이터를 검색할 수 있음</li>
</ul>
<h4 id="12-엑셀에-비유">1.2 엑셀에 비유</h4>
<img src="https://velog.velcdn.com/images/robin_updata/post/1b62022d-85d1-4096-8785-dfd832bfbb58/image.png" width="650" height="500">

<ul>
<li>엑셀 파일에는 여러 시트가 포함될 수 있으며 이는 데이터베이스와 테이블의 관계와 유사함</li>
<li>시트에는 다른 데이터가 저장되어 있지만 각 시트는 서로 복사하거나 연결될 수 있듯이, 데이터베이스에서도 테이블은 서로 다른 테이블끼리 복사하거나 연결될 수 있음</li>
<li>엑셀 시트는 행과 열로 구성되어 있고 이는 테이블과 매우 유사함</li>
<li>우리가 보통 사용하는 데이터베이스는 거의 엑셀과 같은 형식을 가지고 있다고 생각하면 편함 <strong><em><em>(다 그런건 아님)</em></em></strong></li>
</ul>
<h3 id="2-select문의-구성과-기본적인-문법">2. SELECT문의 구성과 기본적인 문법</h3>
<h4 id="21-select문">2.1 SELECT문</h4>
<ul>
<li><p><code>SELECT</code>문은 데이터를 검색하고 추출할 때 사용하는 가장 기본적인 구문임</p>
</li>
<li><p>데이터베이스에서 하나 이상의 테이블에서 데이터를 가져오고 반환함</p>
<pre><code class="language-sql">SELECT [열1], [열2], ... [열n] FROM [테이블 이름] WHERE [조건]</code></pre>
<blockquote>
<ul>
<li><code>SELECT</code>: 가져올 열(column)을 지정합니다. *을 사용하면 모든 열을 선택합니다.</li>
</ul>
</blockquote>
</li>
<li><p><code>FROM</code>: 데이터를 가져올 테이블 이름을 지정합니다.</p>
</li>
<li><p><code>WHERE</code>: 가져올 데이터의 조건을 지정합니다. WHERE절은 선택적으로 사용할 수 있습니다.</p>
</li>
<li><p>위 엑셀을 데이터베이스라고 가정하면 아래와 같은 SELECT문을 작성할 수 있음</p>
</li>
</ul>
<pre><code class="language-sql">-- 임시 테이블 생성
CREATE TABLE #MYTABLE (
  id INT,
  name VARCHAR(50),
  age INT,
  gender CHAR(1)
);

INSERT INTO #MYTABLE (id, name, age, gender)
VALUES (1, &#39;John&#39;, 25, &#39;M&#39;)

INSERT INTO #MYTABLE (id, name, age, gender)
VALUES (2, &#39;Jane&#39;, 30, &#39;F&#39;)

INSERT INTO #MYTABLE (id, name, age, gender)
VALUES (3, &#39;Sam&#39;, 27, &#39;M&#39;)

INSERT INTO #MYTABLE (id, name, age, gender)
VALUES (4, &#39;Jenny&#39;, 23, &#39;F&#39;);

INSERT INTO #MYTABLE (id, name, age, gender)
VALUES (5, &#39;Robin&#39;, 28, &#39;M&#39;)


CREATE TABLE #MYSALARY (
  id INT,
  salary INT
);

INSERT INTO #MYSALARY (id, salary)
VALUES (1, 50000)

INSERT INTO #MYSALARY (id, salary)
VALUES (2, 60000)

INSERT INTO #MYSALARY (id, salary)
VALUES (3, 55000)

INSERT INTO #MYSALARY (id, salary)
VALUES (4, 45000);</code></pre>
<pre><code class="language-sql">SELECT  NAME, AGE
FROM    #MYTABLE

---

SELECT  NAME, AGE
FROM    #MYTABLE
WHERE   GENDER = &#39;M&#39;</code></pre>
<ul>
<li>위 SELECT문은 이름과 나이를 추출하는 구문임</li>
<li>아래 SELECT문은 성별이 M인 사람들의 이름과 나이를 추출하는 구문임</li>
</ul>
<h3 id="3-where-조건절-이용하기---in-like">3. WHERE 조건절 이용하기 - IN, LIKE</h3>
<h4 id="31-in-연산자">3.1 IN 연산자</h4>
<ul>
<li>WHERE절은 특정한 데이터만을 가져오기 위해 사용됨</li>
<li>WHERE절에 여러 조건을 조합해서 사용할 수 있으며 그 중 IN, LIKE는 자주 사용되는 연산자임</li>
<li><code>IN</code>연산자는 WHERE절에서 여러 개의 값을 비교할 때 사용됨<pre><code class="language-sql">SELECT * FROM employees WHERE department IN (&#39;Sales&#39;, &#39;Marketing&#39;)</code></pre>
</li>
<li>위처럼 작성하게 되면 employees 테이블에서 department가 Sales나 Marketing에 속한 데이터를 반환함<pre><code class="language-sql">SELECT * FROM employees WHERE department NOT IN (&#39;Sales&#39;, &#39;Marketing&#39;)</code></pre>
</li>
<li>위처럼 작성하게 되면 반대로 Sales나 Marketing에 속하지 않는 데이터만을 반환함</li>
</ul>
<h4 id="32-like-연산자">3.2 LIKE 연산자</h4>
<ul>
<li><p><code>LIKE</code> 연산자는 WHERE절에서 문자열 비교를 할 때 사용함</p>
</li>
<li><p>&#39;=&#39;과 다르게 문자열 비교에만 사용되고 와일드카드 문자를 사용할 수 있음</p>
<pre><code class="language-sql">SELECT * FROM employees WHERE employee_name LIKE &#39;%an%&#39;</code></pre>
</li>
<li><p>와일드카드 % 을 사용했는데 이는 0개 이상의 문자를 나타냄. 즉 위 쿼리의 결과는 이름 중에 an이 포함된 모든 데이터를 반환함 ( <code>Ian</code>, <code>~~~an~~~~</code>)</p>
<pre><code class="language-sql">SELECT TOP 5 * FROM item WHERE item_nm LIKE N&#39;%생수%&#39;</code></pre>
</li>
<li><p>MSSQL에서 한글을 LIKE를 이용해서 조회할 때는 N을 붙여야 함. 이는 MSSQL에서는 ASCII 문자를 사용하지만 한글은 유니코드 문자를 사용해야 하기 때문. 그냥 외워야 함</p>
</li>
<li><p>위 쿼리를 수행하면 상품명에 <code>생수</code> 란 단어가 포함되어 있는 데이터를 반환함</p>
</li>
</ul>
<h3 id="4-distinct-top-order-by-사용하기">4. DISTINCT, TOP, ORDER BY 사용하기</h3>
<h4 id="41-distinct">4.1 DISTINCT</h4>
<ul>
<li><code>DISTINCT</code>는 중복된 값을 제거하여 유일한 값을 반환하는 키워드임. 쿼리 결과에서 중복된 값을 제거하고 한 번만 나타나는 값을 반환함<pre><code class="language-sql">SELECT DISTINCT NAME FROM #MYTABLE</code></pre>
</li>
<li>위와 같은 쿼리는 #MYTABLE에서 NAME 컬럼의 값들을 중복을 제거한 후 반환함</li>
</ul>
<blockquote>
<p>DISTINCT를 사용하면 쿼리 성능에 문제가 있을 수 있음, 지나치게 쿼리 수행시간이 길어질 수 있음
SELECT문 안에서 사용되는 컬럼에만 영향을 미침. 다른 컬럼에 중복이 있어도 이는 무시함
NULL값 고려 안 함. NULL값이 중복된 경우에도 하나의 값으로 취급되지 않음
JOIN과 같이 사용하는 경우 결과를 확인해야 함</p>
</blockquote>
<h4 id="42-top">4.2 TOP</h4>
<ul>
<li><code>TOP</code>은 쿼리 결과에서 상위 N개의 값을 반환하는 키워드임. 비슷한 키워드로 LIMIT가 있음 (빅쿼리에서는 <code>LIMIT</code> 사용)<pre><code class="language-sql">SELECT TOP 5 * FROM item WHERE item_nm LIKE N&#39;%생수%&#39;</code></pre>
</li>
<li>위 구문은 item 에서 중간에 &#39;생수&#39;가 포함된 ITEM_NM을 반환하는 쿼리임</li>
<li>이 때 TOP 5의 의미는 이 중 상위 5개의 값만 반환하라는 의미임</li>
<li>큰 테이블의 구성을 파악할 시 이를 사용할 수 있음</li>
<li>이러한 TOP과 같이 자주 같이 사용되는 구문이 <code>ORDER BY</code> 임</li>
</ul>
<h4 id="43-order-by">4.3 ORDER BY</h4>
<ul>
<li><p><code>ORDER BY</code>는 SELECT 쿼리 결과의 정렬 순서를 지정하는 키워드임</p>
<pre><code class="language-sql">SELECT NAME FROM #MYTABLE ORDER BY AGE DESC</code></pre>
</li>
<li><p>위 쿼리는 <code>#MYTABLE</code>에서 <code>AGE</code>가 높은 순서대로 <code>NAME</code>을 반환함</p>
</li>
<li><p><code>ORDER BY</code> 뒤에 붙은 컬럼명으로 데이터를 정렬하여 반환하며 디폴트는 오름차순, 컬럼명 뒤에 DESC가 붙으면 내림차순임</p>
</li>
<li><p>SELECT 문에 없는 컬럼으로도 정렬할 수 있음</p>
</li>
<li><p>SELECT 문에 있는 컬럼으로 정렬하는 경우에는 숫자로 컬럼명을 대신할 수 있음</p>
<pre><code class="language-sql">SELECT NAME, AGE FROM #MYTABLE ORDER BY 2 DESC</code></pre>
</li>
<li><p>SELECT 에서 두번째 컬럼이 AGE 이므로 ORDER BY 2 DESC라고 적으면 AGE로 내림차순 정렬한 결과를 반환함</p>
</li>
<li><p>TOP과 같이 사용하면 우선 데이터를 정렬한 후, 상위 N개의 값을 반환할 수 있음</p>
</li>
</ul>
<h2 id="02-join">02. JOIN</h2>
<h3 id="1-join의-개념과-종류">1. JOIN의 개념과 종류</h3>
<h4 id="11-join-개념">1.1 JOIN 개념</h4>
<ul>
<li><code>JOIN</code>은 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법임</li>
<li>JOIN은 크게 <code>INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN</code> 등이 있음</li>
</ul>
<h4 id="12-inner-join">1.2 INNER JOIN</h4>
<ul>
<li>두 개의 테이블에서 공통된 값을 기준으로 데이터를 연결함</li>
<li>교집합과 같이 공통된 값을 가진 데이터만을 가져올 수 있음</li>
<li>INNER를 생략하고 JOIN만 작성할 수 있음<pre><code class="language-sql">SELECT *
FROM 테이블1
JOIN 테이블2
ON 테이블1.컬럼1 = 테이블2.컬럼2</code></pre>
<h4 id="13-left-outer-join">1.3 LEFT OUTER JOIN</h4>
</li>
<li>왼쪽 테이블의 모든 레코드와 오른쪽 테이블에서 공통된 값을 기준으로 레코드를 연결함</li>
<li>오른쪽 테이블에서 공통된 값이 없는 경우 NULL 값을 반환함<pre><code class="language-sql">SELECT *
FROM 테이블1
LEFT OUTER JOIN 테이블2
ON 테이블1.컬럼1 = 테이블2.컬럼2</code></pre>
<h4 id="14-right-outer-join">1.4 RIGHT OUTER JOIN</h4>
</li>
<li>오른쪽 테이블의 모든 레코드와 왼쪽 테이블에서 공통된 값을 기준으로 레코드를 연결함</li>
<li>왼쪽 테이블에서 공통된 값이 없는 경우 NULL 값을 반환함<pre><code class="language-sql">SELECT *
FROM 테이블1
RIGHT OUTER JOIN 테이블2
ON 테이블1.컬럼1 = 테이블2.컬럼2</code></pre>
</li>
</ul>
<h3 id="2-특이한-join-사용해보기">2. 특이한 JOIN 사용해보기</h3>
<h4 id="21-cross-join">2.1 CROSS JOIN</h4>
<ul>
<li><code>CROSS JOIN</code>은 두 테이블의 모든 가능한 조합을 반환함</li>
<li>CARTESIAN PRODUCT라고 칭하기도 함</li>
<li>테이블이 작고 행 수가 적을 때는 유용하지만, 대규모 테이블의 경우에는 너무 많은 조합이 생성되어 성능 문제를 일으킬 수 있음<pre><code class="language-sql">SELECT *
FROM table1
CROSS JOIN table2</code></pre>
<h4 id="22-self-join">2.2 SELF JOIN</h4>
</li>
<li><code>SELF JOIN</code>은 하나의 테이블 내에서 자체적으로 조인하는 것을 의미함</li>
<li>부모-자식 관계나 계층적 데이터 구조에서 많이 사용됨<pre><code class="language-sql">SELECT a.column1, b.column2
FROM table a
JOIN table b ON a.column3 = b.column3</code></pre>
</li>
<li>위처럼 같은 테이블을 두 번 사용하여 조인을 수행하게 됨<h2 id="03-함수-1">03. 함수 1</h2>
<h3 id="1-집계함수에-대한-소개-및-사용-방법">1. 집계함수에 대한 소개 및 사용 방법</h3>
</li>
</ul>
<h4 id="11-집계함수-소개">1.1 집계함수 소개</h4>
<ul>
<li>집계함수는 특정한 데이터의 집합을 하나의 값으로 반환하는 함수임</li>
<li><code>COUNT, SUM, AVG, MAX, MIN</code> 등이 존재함</li>
<li><code>COUNT</code> 함수는 지정한 열에서 NULL 값을 제외한 행의 개수를 반환함<pre><code class="language-sql">SELECT COUNT(*) FROM 테이블</code></pre>
</li>
<li><code>SUM</code> 함수는 지정한 열의 모든 행의 값을 더한 총합을 반환함<pre><code class="language-sql">SELECT SUM(SALES) FROM 테이블</code></pre>
</li>
<li><code>AVG</code> 함수는 지정한 열의 모든 행의 값을 평균화한 결과를 반환함<pre><code class="language-sql">SELECT AVG(SALES) FROM 테이블</code></pre>
</li>
<li><code>MAX</code> 함수는 지정한 열의 모든 행 중 가장 큰 값을 반환함<pre><code class="language-sql">SELECT MAX(SALES) FROM 테이블</code></pre>
</li>
<li><code>MIN</code> 함수는 지정한 열의 모든 행 중 가장 작은 값을 반환함<pre><code class="language-sql">SELECT MIN(SALES) FROM 테이블</code></pre>
</li>
<li>이러한 집계 함수는 <code>GROUP BY</code> 절과 함께 사용하여 특정 열 기준으로 데이터를 그룹화한 후 그룹 별로 결과를 반환할 수 있음<pre><code class="language-sql">SELECT id, COUNT(order)
FROM ord
GROUP BY id</code></pre>
</li>
</ul>
<h3 id="2-group-by-having-이해하기">2. GROUP BY, HAVING 이해하기</h3>
<h4 id="21-group-by-having-사용하기">2.1 GROUP BY, HAVING 사용하기</h4>
<ul>
<li><code>HAVING</code> 절은 WHERE 절과 비슷하지만, GROUP BY 절에 의해 그룹화된 결과 집합에서 행을 필터링하는 역할을 함<pre><code class="language-sql">SELECT title, AVG(salary) as avg_salary
FROM employees_table
WHERE title = &#39;manager&#39;
GROUP BY title
HAVING AVG(salary) &gt; 50000</code></pre>
</li>
<li>위처럼 WHERE은 employees_table에서 직급이 manager인 로우를 대상으로 하겠단 의미이고, HAVING은 title로 그룹화된 여러 그룹 중 AVG(SALARY)가 50000 이상인 경우를 보겠다는 의미임</li>
</ul>
<h4 id="22-유의사항">2.2 유의사항</h4>
<ul>
<li>GROUP BY 절에는 SELECT 문에서 지정된 열 이외에도 그룹화 대상 열을 추가로 지정할 수 있음</li>
<li>HAVING 절에서 지정하는 조건은 집계 함수를 사용한 결과에 대해 필터링함. 즉, HAVING 절에서 참조하는 열은 SELECT 문 열이거나 집계 함수로 계산된 값이 대상임</li>
</ul>
<h2 id="04-서브쿼리-cte">04. 서브쿼리, CTE</h2>
<h3 id="1-서브쿼리-구성하기">1. 서브쿼리 구성하기</h3>
<h4 id="11-subquery-설명">1.1 Subquery 설명</h4>
<ul>
<li>서브쿼리는 다른 쿼리의 일부로 사용되는 쿼리임</li>
<li>메인쿼리보다 먼저 수행되며, 서브쿼리 수행 후 메인쿼리의 결과가 반환됨</li>
<li>다양한 절에서 사용될 수 있음<pre><code class="language-sql">SELECT column1, column2, column3
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE column2 = &#39;value&#39;)
</code></pre>
</li>
</ul>
<hr>
<p>SELECT column1, column2, column3
FROM (SELECT column1, column2, column3 FROM table1 WHERE column1 = &#39;value&#39;) AS subquery</p>
<hr>
<p>SELECT column1, column2, (SELECT COUNT(column3) FROM table2 WHERE column2 = &#39;value&#39;) AS count
FROM table1</p>
<pre><code>- 순서대로 WHERE 절, FROM 절, SELECT 절에서 서브쿼리를 사용했는데 이처럼 다양한 방법으로 사용할 수 있음
- 서브쿼리는 32개까지 중첩할 수는 있으나 성능저하를 고려해야 함
#### 1.2 WHERE 절에서 사용할 때 유의사항
- WHERE에서 사용할 경우 결과가 하나 이상의 값이 반환될 수 있는데 이 때는 IN, EXIST, ANY, ALL 등의 연산자를 사용해야 함
```sql
SELECT column1, column2, column3
FROM table1
WHERE EXISTS (SELECT * FROM table2 WHERE table1.column1 = table2.column1)

--------------------

SELECT column1, column2, column3
SELECT column1, column2, column3
FROM table1
WHERE column1 = ANY (SELECT column1 FROM table2 WHERE column2 = &#39;value&#39;)


--------------------

SELECT column1, column2, column3
FROM table1
WHERE column1 = ALL (SELECT column1 FROM table2 WHERE column2 = &#39;value&#39;)</code></pre><ul>
<li><p>순서대로 <code>EXIST, ANY, ALL</code>의 사용 예시임. </p>
</li>
<li><p><code>EXIST</code>는 서브쿼리가 반환하는 결과가 존재하는지 여부를 검사함. 서브쿼리에서 반환된 값이 존재하면, 참을 반환함</p>
</li>
<li><p><code>ANY</code>는 서브쿼리에서 반환된 값 중 하나라도 메인쿼리의 조건식과 일치하면 참을 반환함</p>
</li>
<li><p><code>ALL</code>은 서브쿼리에서 반환된 모든 값이 메인쿼리의 조건식과 일치하면 참을 반환함</p>
<h3 id="13-join과-비교">1.3 JOIN과 비교</h3>
</li>
<li><p>서브쿼리는 작은 데이터 집합을 추출할 때 사용함. 반면 JOIN은 더 큰 데이터 집합을 추출하는 데 사용함</p>
</li>
<li><p>서브쿼리는 다음과 같을 때 사용하기에 더 적합함</p>
<blockquote>
<ul>
<li>메인 쿼리와 별개로 작은 데이터 집합을 추출해야 할 때</li>
<li>메인 쿼리의 실행 결과에 영향을 미치지 않으면서 데이터를 추출해야 할 때</li>
<li>복잡한 조건식을 사용해야 할 때</li>
</ul>
</blockquote>
</li>
<li><p>JOIN은 다음과 같을 때 사용하기에 적합함</p>
<blockquote>
<ul>
<li>두 개 이상의 테이블을 조인해서 더 큰 데이터 집합을 추출해야 할 때</li>
<li>테이블 간 관계를 명확하게 이해하고 있어야 할 때</li>
<li>여러 개의 조건식이 필요한 경우</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="2-cte-구성하기">2. CTE 구성하기</h3>
<h4 id="21-cte-설명">2.1 CTE 설명</h4>
<ul>
<li><code>CTE</code>는 Common Table Expression, 즉 공통 테이블 표현식을 의미함</li>
<li>CTE를 사용하면 복잡한 쿼리를 작성 시 중간 결과를 저장하고 재활용할 수 있으며, 가독성 높아짐</li>
<li>CTE에서는 하나의 SELECT 문에서만 사용할 수 있으며, WITH 절 뒤에 오는 SELECT 문에서만 참조할 수 있음<pre><code class="language-sql">WITH cte AS (
SELECT column1, column2, ...
FROM table_name
WHERE condition
)
SELECT *
FROM cte;</code></pre>
</li>
<li>위처럼 쿼리를 작성하면 cte라는 CTE를 생성하게 되고 이를 SELECT문에서 참조하여 결과를 반환하게 됨</li>
<li>서브쿼리를 사용하는 것처럼 이를 활용할 수 있음<h4 id="22-유의사항-1">2.2 유의사항</h4>
</li>
<li>CTE에서 정의한 열은 CTE 내에서만 사용할 수 있으며, 다른 쿼리에서는 참조할 수 없음</li>
<li>CTE를 사용할 때는 성능에 대한 고려가 필요함<h4 id="23-서브쿼리와-비교하기">2.3 서브쿼리와 비교하기</h4>
</li>
<li>CTE는 중간 결과를 재사용하거나 쿼리의 가독성을 높일 때 좋고, 서브쿼리는 데이터 서브셋을 필터링하거나 조인할 때 유용함
```sql</li>
<li><ul>
<li><ol>
<li>CTE</li>
</ol>
</li>
</ul>
</li>
</ul>
<p>WITH sales_info AS (
    SELECT 
        customer_id, 
        SUM(sale_amount) AS total_sales
    FROM sales
    GROUP BY customer_id
)
SELECT 
    customer_id,
    total_sales
FROM sales_info
WHERE total_sales &gt; 10000;</p>
<p>-- 2. Subquery</p>
<p>SELECT 
    customer_id, 
    total_sales
FROM (
    SELECT 
        customer_id, 
        SUM(sale_amount) AS total_sales
    FROM sales
    GROUP BY customer_id
) AS sales_info
WHERE total_sales &gt; 10000;</p>
<pre><code>- 위 두 쿼리는 결과적으로는 동일하지만, 사용한 방식이 각각 다름
- CTE를 사용하면 중복 코드를 줄이고 가독성을 높일 수는 있지만, 대용량 데이터 처리에는 부적합함
- 서브쿼리는 대용량 데이터 처리에는 유리하지만, 복잡한 쿼리의 경우 가독성이 떨어질 수 있음

## 05. 함수 2
### 1. WINDOW FUNCTION
#### 1.1 WINDOW FUNCTION 설명
- 집계함수처럼 데이터 집계 및 분석 작업을 수행하는 함수임
- 윈도우 함수는 일반적으로 `OVER()` 절을 사용하여 정의됨
```sql
&lt;윈도우 함수&gt; OVER ([PARTITION BY &lt;열&gt;]
                        [ORDER BY &lt;열&gt; [ASC|DESC], ...]) </code></pre><ul>
<li>PARTITION BY : 윈도우를 분할할 열을 지정함. 해당 절을 사용하면 각 윈도우 함수가 분할된 데이터 집합에서 별도로 계산됨</li>
<li>ORDER BY : 윈도우를 정렬할 열을 지정함. 해당 절을 사용하면 ROWS BETWEEN 절을 사용하여 특정 범위 내 행에 대한 계산을 제한할 수 있음<h4 id="12-window-function-예시">1.2 WINDOW FUNCTION 예시</h4>
</li>
<li><code>ROW_NUMBER()</code>: 각 행에 대해 일련 번호를 지정함</li>
<li><code>RANK()</code>: 순위를 지정함. 동일한 값을 가진 행은 같은 순위를 갖게 됨</li>
<li><code>DENSE_RANK()</code>: 순위를 지정함. 동일한 값을 가진 행은 같은 순위를 갖게 되지만, 순위 사이에 빈 순위는 없음.</li>
<li><code>NTILE()</code>: 결과 집합을 동일한 크기의 그룹으로 분할함.</li>
<li><code>LAG()</code>: 이전 행의 값을 가져옴.</li>
<li><code>LEAD()</code>: 다음 행의 값을 가져옴.</li>
<li><code>FIRST_VALUE()</code>: 윈도우 내 첫 번째 행의 값을 반환함.</li>
<li><code>LAST_VALUE()</code>: 윈도우 내 마지막 행의 값을 반환함.<pre><code class="language-sql">SELECT name, score, 
     ROW_NUMBER() OVER(ORDER BY score DESC) AS rank,
     RANK() OVER(ORDER BY score DESC) AS rank2,
     DENSE_RANK() OVER(ORDER BY score DESC) AS rank3,
     NTILE(3) OVER(ORDER BY score DESC) AS group,
     LAG(score, 1) OVER(ORDER BY score DESC) AS prev_score,
     LEAD(score, 1) OVER(ORDER BY score DESC) AS next_score,
     FIRST_VALUE(score) OVER(ORDER BY score DESC) AS first_score,
     LAST_VALUE(score) OVER(ORDER BY score DESC) AS last_score
FROM students



</code></pre>
</li>
</ul>
<p>SELECT
    ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNum,
    FirstName,
    LastName,
    Salary
FROM
    Employees</p>
<p>SELECT
    RANK() OVER (ORDER BY Sales DESC) AS Rank,
    FirstName,
    LastName,
    Sales
FROM
    Salespeople</p>
<p>SELECT
    DENSE_RANK() OVER (ORDER BY Sales DESC) AS DenseRank,
    FirstName,
    LastName,
    Sales
FROM
    Salespeople</p>
<p>SELECT 
    department, 
    name, 
    salary, 
    AVG(salary) OVER(PARTITION BY department) as avg_salary_per_dept 
FROM employees;</p>
<p>```</p>
<ul>
<li>위처럼 PARTITION BY 절을 사용하게 되면 부서별 평균 급여를 계산하도록 지정됨</li>
<li>즉, PARTITION BY 는 데이터를 분할하는 역할을 하며, 해당 컬럼 기준으로 데이터를 분할하여 분할된 그룹 단위로 윈도우 함수가 적용됨<h4 id="13-유의사항과-응용">1.3 유의사항과 응용</h4>
</li>
<li>윈도우 함수는 일반적으로 복잡하고 처리 속도가 느릴 수 있기 때문에 성능이 중요하거나 빅데이터 처리를 할 때는 다른 방안을 고려해봐야함</li>
<li>윈도우 함수는 중첩해서 사용할 수 있음</li>
<li>윈도우 함수를 이용해서 이동 평균, 누적 합계 등을 계산할 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[01. 빅쿼리 자료형 - 배열과 구조체]]></title>
            <link>https://velog.io/@robin_updata/01.-%EB%B9%85%EC%BF%BC%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EA%B5%AC%EC%A1%B0%EC%B2%B4</link>
            <guid>https://velog.io/@robin_updata/01.-%EB%B9%85%EC%BF%BC%EB%A6%AC-%EC%9E%90%EB%A3%8C%ED%98%95-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EA%B5%AC%EC%A1%B0%EC%B2%B4</guid>
            <pubDate>Sat, 25 Mar 2023 08:56:17 GMT</pubDate>
            <description><![CDATA[<h3 id="00-데이터-정규화-vs-비정규화">00. 데이터 정규화 vs 비정규화</h3>
<p>일반적으로 SQL을 사용하는 사용자는 정규화된 데이터에 익숙할 것입니다. 하지만 빅쿼리는 데이터 비정규화를 지향하는 데이터 웨어하우스 서비스입니다. 이에 따라 데이터 정규화와 비정규화의 개념을 먼저 정리하고, 빅쿼리의 특징을 잘 보여줄 수 있는 데이터 타입인 배열과 구조체에 대해 알아보겠습니다.</p>
<p>데이터 정규화는 제1정규화, 제2정규화, 제3정규화로 크게 나뉩니다. 제1정규화는 한 칸에는 한 데이터만 넣는 것을 의미합니다. 즉, 한 컬럼에는 하나의 데이터만 존재하도록 하는 작업을 말하며 이러한 조건을 만족한 테이블을 제1정규형이라고 합니다. 제2정규화는 특정 테이블의 주제와 관련없는 컬럼 및 데이터를 다른 테이블로 옮기는 것을 의미합니다. 예를 들어, 고객의 주문 데이터를 정리하고 있는 테이블이 있다면 해당 테이블에는 고객의 여러 정보가 함께 있을 수 있습니다. 하지만 이러한 정보를 분리하여 회원정보 테이블과 주문정보 테이블을 나누는 것이 제2정규화입니다. 마지막으로 제3정규화는 일반 컬럼에만 종속된 컬럼을 다른 테이블로 관리하는 것을 의미합니다.</p>
<p>하지만 빅쿼리는 데이터 처리 성능을 높이기 위해 데이터 비정규화를 적극적으로 사용합니다. 일반적인 관계형 데이터베이스 (Mysql, MSSQL, PostgreSQL 등)에서는 데이터 무결성을 확보하기 위해 정규화를 수행하지만, 빅데이터 분석 환경을 제공하는 빅쿼리에서는 비정규화를 통해 데이터 처리 성능을 높이는 것입니다. 이러한 특징으로 인해 빅쿼리에서는 SQL에서 볼 수 없는 데이터 자료형인 배열과 구조체를 사용할 수 있게 되었습니다. 아래에서는 이러한 자료형에 대해 자세히 알아보겠습니다.</p>
<h3 id="01-배열array">01. 배열(Array)</h3>
<h4 id="1-array란">1) Array란?</h4>
<p>먼저 배열(array)은 하나의 컬럼에 여러 데이터를 저장하는 자료형입니다. 파이썬에서 볼 수 있는 리스트와 유사한데 하나의 배열에는 동일한 자료형이 들어가야 하는 특징이 있습니다. 즉, <code>[&#39;로빈&#39;, &#39;형석&#39;, &#39;현철&#39;]</code> 는 가능해도 <code>[&#39;강훈&#39;, 29 ]</code> 은 불가능하다는 것을 의미합니다.</p>
<pre><code class="language-sql">SELECT 
      [1,2,3] AS array_sample, 1 AS int_value
  UNION ALL
  SELECT 
      [4,5,6] AS array_sample, 2 AS int_value</code></pre>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/09f9f4a0-f842-4e7e-813a-52de31257172/image.png" alt=""></p>
<p>위 그림에서 array_sample을 보면 int_value에 비해 한 행에 여러 데이터가 들어가 있는 것을 확인할 수 있습니다. 이처럼 한 행에 여러 데이터가 들어가 있는 데이터 형식을 array 이라고 합니다. </p>
<h4 id="2-array를-생성하는-법">2) Array를 생성하는 법</h4>
<p>이러한 배열을 빅쿼리에서 생성하는 법에는 약 4가지가 있습니다.</p>
<ul>
<li>직접 <code>[]</code>로 감싸서 배열을 생성하는 방법</li>
<li>데이터타입과 <code>[]</code>로 배열을 생성하는 방법</li>
<li><code>GENERATE_ARRAY</code>로 생성하는 방법</li>
<li><code>ARRAY_AGG</code>로 생성하는 방법</li>
</ul>
<p>아래는 생성하는 법의 실제 예시입니다.</p>
<pre><code class="language-sql">-- 직접 `[]`로 감싸서 배열을 생성하는 방법
INSERT INTO table_name (array_column_name)
VALUES ([1, 2, 3]);

-- 데이터타입과 `[]`로 배열을 생성하는 방법
SELECT ARRAY&lt;INT64&gt;[1,2,3] AS int_array

-- `GENERATE_ARRAY`로 생성하는 방법
SELECT generate_array(1, 10, 2) AS even_numbers;

-- `ARRAY_AGG`로 생성하는 방법
SELECT ARRAY_AGG(name) as names
FROM my_table;
</code></pre>
<p>위에서부터 보면 데이터를 []로 감싸서 생성하는 방식입니다. 파이썬에서 리스트를 생성할 때와 동일한 형태를 보이며, 두 번째 방식도 배열 안에 들어가는 데이터 형식을 지정해주는 유사한 방식입니다. 세 번째 방식은 GENERATE_ARRAY(시작시점, 종료시점, 간격)으로 생성하는 형식으로 파이썬의 range(start, end, step)과 매우 유사합니다. 네 번째 방식은 테이블 내에 있는 데이터를 사용해서 array를 생성할 때 사용하는 방법입니다.</p>
<h4 id="3-array의-사용-예시">3) Array의 사용 예시</h4>
<p>배열의 특정값에 접근하는 방법으로는 offset, ordinal을 사용하는 방법이 있습니다. </p>
<pre><code class="language-sql">WITH example_array AS (
  SELECT [&quot;apple&quot;, &quot;banana&quot;, &quot;grape&quot;, &quot;watermelon&quot;, &quot;strawberry&quot;] AS my_array
)

SELECT 
  my_array[offset(1)] AS second_element,
  my_array[offset(4)] AS fifth_element,
  my_array[ordinal(2)] AS second_element_ordinal,
  my_array[ordinal(5)] AS fifth_element_ordinal
FROM 
  example_array;

</code></pre>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/90c9501a-dae4-4082-900d-c1bc45f3d632/image.png" alt=""></p>
<p>offset은 순서가 0부터, ordinal은 순서가 1부터 시작되는 걸 확인할 수 있습니다</p>
<pre><code class="language-sql">WITH data AS (
  SELECT [&#39;apple&#39;, &#39;banana&#39;, &#39;orange&#39;, &#39;grape&#39;] AS fruits
)
SELECT OFFSET, fruit
FROM data, UNNEST(fruits) AS fruit WITH OFFSET
</code></pre>
<p>UNNEST 와 WITH OFFSET을 같이 사용하면 해당 배열의 순서를 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/robin_updata/post/27fa6f99-3d33-4e4c-a84b-e2b968afd36b/image.png" alt=""></p>
<p>이러한 기능 외에도 ARRAY_REVERSE를 사용해서 배열을 역순으로 생성할 수 있고 ARRAY_LENGTH를 사용해서 배열의 길이를 확인할 수 있습니다.</p>
<h4 id="4-array의-응용-예시">4) Array의 응용 예시</h4>
<p>빅쿼리에서 array 자료형은 여러 개의 값들을 하나의 변수에 담아 처리할 수 있는 유용한 데이터 타입입니다. 예를 들어, 하나의 테이블 안에서 여러 개의 데이터 값을 모아서 저장하고 분석하는 작업을 할 때 매우 유용합니다.</p>
<p>예를 들어, 여러 개의 상품 카테고리가 있는 이커머스에서 각 카테고리별로 판매량을 계산하려고 할 때, 각 상품의 카테고리 정보를 배열로 저장하고 해당 카테고리의 판매량을 배열에 누적하는 방식으로 분석할 수 있습니다. 이렇게 배열을 사용하면 복잡한 쿼리 없이도 간단하게 원하는 데이터를 추출할 수 있습니다.</p>
<p>또한, 배열을 사용하면 여러 개의 값들 중에서 특정 값을 추출하는 작업도 매우 용이해집니다. 배열에서 특정 값을 추출하는 방법은 offset, ordinal, unnest와 같은 함수를 이용하여 가능합니다. 이를 응용하면 특정 조건에 해당하는 값을 추출하거나, 배열 안에서 최대, 최소값을 구하는 등 다양한 작업을 할 수 있습니다.</p>
<p>종합적으로, 배열은 여러 개의 값을 효율적으로 저장하고 분석할 수 있는 유용한 데이터 타입입니다. 데이터 분석 작업에서 여러 개의 값을 저장하고 처리해야 하는 경우에 활용하면 좋습니다.</p>
<h3 id="02-구조체struct">02. 구조체(Struct)</h3>
<h4 id="01-struct란">01) struct란?</h4>
<p>array가 파이썬의 리스트와 유사했다면 struct는 파이썬의 사전 자료형과 비슷한 특징을 가지고 있습니다. </p>
<pre><code class="language-sql">SELECT 
  (1,2,3) AS struct_example</code></pre>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/19eb1e11-390b-466e-8a63-12df946383ef/image.png" alt=""></p>
<p>Struct는 array와 유사하게 한 행에 여러 데이터를 저장하는 형식이지만, 그 내부에 여러 하위 필드가 있는 복합 데이터 타입입니다. 위의 그림에서 보이는 것처럼, struct는 하나의 필드에 하위 필드 3개가 포함될 수 있습니다.</p>
<h4 id="2-struct를-생성하는-법">2) Struct를 생성하는 법</h4>
<p>구조체는 배열과 동일하게 생성하는 방식이 다양합니다</p>
<ul>
<li>직접 <code>()</code>로 감싸서 struct을 생성하는 방법</li>
<li>데이터타입과 <code>()</code>로 struct을 생성하는 방법</li>
<li>데이터타입을 바로 선언하며 struct을 생성하는 방법</li>
<li>데이터타입 선언 없이 하위 필드명만 선언하는 방법</li>
</ul>
<p>아래는 생성하는 법의 실제 예시입니다.</p>
<pre><code class="language-sql">-- 직접 `()`로 감싸서 배열을 생성하는 방법
SELECT (23, &#39;Robin&#39;, TRUE) AS my_struct;


-- 데이터타입과 `()`로 배열을 생성하는 방법
SELECT STRUCT&lt;
  id INT64,
  name STRING,
  is_active BOOL&gt;
(23, &#39;Robin&#39;, TRUE) AS my_struct;


-- 데이터타입을 바로 선언하며 struct을 생성하는 방법
SELECT STRUCT&lt;first_name STRING, last_name STRING, id INT64&gt;(&#39;robin&#39;, &#39;hwangbo&#39;, 23) AS struct_test

-- 데이터타입 선언 없이 하위 필드명만 선언하는 방법
SELECT STRUCT(&#39;robin&#39; as first_name, &#39;hwangbo&#39; as last_name, DATE(&#39;1994-08-23&#39;) as birth_date);
</code></pre>
<p>아래는 struct를 생성하는 데 응용 방법입니다</p>
<ul>
<li>strcut 안 struct</li>
<li>테이블을 불러와서 struct을 생성하는 방법</li>
</ul>
<pre><code class="language-sql">-- strcut 안 struct
SELECT STRUCT&lt;
  id INT64,
  name STRUCT&lt;
    first_name STRING,
    last_name STRING
  &gt;,
  is_active BOOL
&gt;
(1, STRUCT(&#39;Robin&#39;, &#39;Hwangbo&#39;), TRUE) AS my_struct;

-- 테이블을 불러와서 struct을 생성하는 방법
WITH my_table AS (
  SELECT 1 AS id, &#39;Robin&#39; AS name, TRUE AS is_active UNION ALL
  SELECT 2 AS id, &#39;Hebe&#39; AS name, FALSE AS is_active UNION ALL
  SELECT 3 AS id, &#39;Rebe&#39; AS name, TRUE AS is_active
)
SELECT STRUCT(id, name, is_active) AS my_struct
FROM my_table;</code></pre>
<h4 id="3-struct의-사용-예시">3) Struct의 사용 예시</h4>
<p>빅쿼리에서 struct 자료형은 다른 데이터 타입들과 함께 사용되어, 테이블의 특정 필드에 여러 데이터를 묶어서 저장하고자 할 때 주로 사용됩니다. 예를 들어, 특정 테이블에 고객의 정보를 저장하는 경우, 각 고객의 이름, 나이, 성별, 이메일 등의 정보를 각각 따로 저장하는 것이 아니라, 이러한 정보를 하나의 구조체로 묶어서 저장하고자 할 때 struct 자료형을 사용할 수 있습니다.</p>
<p>struct는 데이터 분석에서 매우 유용하게 활용됩니다. 예를 들어, 여러 개의 변수가 있는 데이터셋에서 특정 필드의 값을 비교하는 등의 작업을 수행할 때, struct를 사용하면 더 쉽고 간편하게 데이터에 접근할 수 있습니다.</p>
<p>struct를 사용하면 데이터의 가독성이 높아지고, 필드에 접근하는 것이 편리해집니다. 또한 struct를 활용하여 여러 필드를 하나의 필드로 묶어서 저장할 수 있기 때문에, 테이블의 구조를 간결하게 유지할 수 있습니다. 이를 통해 쿼리 작성 시 가독성이 높아지며, 복잡한 연산을 수행할 때도 효율적으로 처리할 수 있습니다.</p>
<p>특히나 json형식의 데이터를 읽는 경우에 struct가 유용하게 사용될 수 있습니다. json 문자열을 struct로 변환해서 데이터 분석을 더욱 용이하게 할 수 있습니다.</p>
<h3 id="03-배열과-구조체-활용하기">03. 배열과 구조체 활용하기</h3>
<p>데이터 분석 작업을 수행하다 보면, array나 struct 자료형 전체가 아닌 내부에 들어있는 데이터에 대해 접근해야 할 경우가 있습니다. 이런 상황에서 유용한 함수 중 하나가 UNNEST입니다. UNNEST 함수는 array나 struct와 같은 복잡한 데이터 형식을 해제하여 데이터에 포함된 값을 별도의 테이블 형태로 반환합니다. 이를 통해, 데이터셋에서 내부 값에 대한 접근이 더욱 용이해집니다.</p>
<pre><code class="language-sql">WITH example_table AS (
  SELECT [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] AS array_column UNION ALL
  SELECT [&#39;d&#39;, &#39;e&#39;] AS array_column UNION ALL
  SELECT [&#39;f&#39;] AS array_column
)

SELECT 
  array_column_value
FROM 
  example_table, 
  UNNEST(array_column) AS array_column_value
</code></pre>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/a7cd8bba-4fb2-4366-bb35-a49e4112e90b/image.png" alt=""></p>
<p>위를 실행하게 되면 UNNEST안에 있는 배열이 밖으로 나와서 일반적인 데이터 형식으로 변하게 됩니다. 이처럼 UNNEST는 배열, 구조체를 일반적인 데이터 형식으로 바꿔주는 함수인데 아래는 이러한 함수의 실제 활용 예시입니다.</p>
<pre><code class="language-sql">WITH sample AS (
  SELECT 1 as id, [&#39;apple&#39;, &#39;banana&#39;, &#39;orange&#39;] as fruit_list UNION ALL
  SELECT 2 as id, [&#39;grape&#39;, &#39;mango&#39;, &#39;papaya&#39;] as fruit_list
)

SELECT id, fruit
FROM sample, UNNEST(fruit_list) as fruit</code></pre>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/a25185cc-4b8e-4d24-8fd6-93f1848485ae/image.png" alt=""></p>
<p>이렇듯 빅쿼리에서는 array나 struct와 같은 자료형을 사용할 수 있습니다. 이러한 자료형을 UNNEST 함수를 이용해 쉽게 조회할 수 있습니다. UNNEST 함수는 array나 struct를 각각 하나의 로우로 변환하여 반환합니다. 이러한 결과를 기존 테이블과 크로스 조인하여 데이터를 조회할 수 있습니다. 이렇게 UNNEST 함수를 사용하면 array나 struct 내부에 있는 데이터에 대해 조건을 걸어 조회할 수 있습니다. </p>
<p>빅쿼리에서는 이러한 자료형을 사용할 수 있기 때문에 빅쿼리에서 데이터를 더욱 효과적으로 다룰 수 있습니다.</p>
<hr>
<h3 id="reference">Reference.</h3>
<p><a href="https://zzsza.github.io/bigquery/">BigQuery Guide Book - 빅쿼리 가이드북</a>
<a href="https://zzsza.github.io/gcp/2020/04/12/bigquery-unnest-array-struct/">BigQuery UNNEST, ARRAY, STRUCT 사용 방법</a>
구글 빅쿼리 완벽 가이드 - 발리아파 락쉬마난, 조던 티가니 저/변성윤, 장현희 역 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[00. Google BigQuery를 들어가며]]></title>
            <link>https://velog.io/@robin_updata/00.BigQuery</link>
            <guid>https://velog.io/@robin_updata/00.BigQuery</guid>
            <pubDate>Sun, 12 Mar 2023 07:25:15 GMT</pubDate>
            <description><![CDATA[<h3 id="00-빅쿼리가-뭔데-왜-하는건데">00. 빅쿼리가 뭔데, 왜 하는건데</h3>
<p>최근 회사에서 데이터 웨어하우스를 모두 GCP로 이관한다고 한다. 그러면서 결과적으로 빅쿼리를 사용하게 된다는 소식을 듣게 되었다. 그래서 GCP는 뭐고 빅쿼리는 뭔데?</p>
<p>GCP,  Google Cloud Platform은 구글의 클라우드 컴퓨팅 플랫폼이다. GCP가 익숙하지 않은 사람이라도 AWS, Azure는 들어본 적이 있을 것이다. 이러한 플랫폼들이 대표적인 클라우드 컴퓨팅 플랫폼의 예시이다.</p>
<p>이러한 GCP에서 제공하는 클라우드 데이터웨어하우스 서비스가 구글 빅쿼리이다. 비슷한 서비스로 AWS에서 제공하는 Redshift가 존재한다. </p>
<p>클라우드에 대해서 가볍게 설명하자면 클라우드는 인터넷을 통해서 다른 컴퓨터의 자원을 활용하는 것이다. 클라우드 서비스를 이용해본 적이 없다는 사람들도 아이클라우드, 원드라이브 등을 이용한 경험은 분명 있을 것이다. 이처럼 다른 컴퓨터의 저장 공간을 빌려서 사용하는 것이 대표적인 클라우드 서비스이다. 이렇듯 저장용량 뿐만 아니라 원하는 사양을 빌려서 사용할 수 있고 클라우드가 제공하는 특정 기능만 빌려서 사용할 수도 있고 이러한 모든 서비스들을 우리는 클라우드 플랫폼을 통해서 제공받을 수 있다. 이러한 클라우드 서비스를 통해 서버용 컴퓨터를 따로 구매하지 않아도 웹서비스를 배표할 수 있게 되었다.</p>
<p>데이터 웨어하우스는 비즈니스에서 많은 양의 데이터를 수집하고 저장하며, 이를 분석하여 의사결정에 활용하는 중요한 시스템이다. 이를 클라우드 상에서 구축하면 저장용량과 사양 등을 빌려서 필요한 시점에 필요한 만큼 사용할 수 있으며, 이를 위해 구글은 빅쿼리와 같은 클라우드 데이터웨어하우스 서비스를 제공한다.</p>
<p>이러한 클라우드 데이터웨어하우스 서비스는 비즈니스에서 많이 활용되며, GCP의 빅쿼리는 이 분야에서 안정적이고 높은 성능을 보여주고 있다. 회사에서 이를 도입함으로써 데이터 분석 및 의사결정에 더욱 효율적으로 활용할 수 있을 것이다.</p>
<hr>
<h3 id="01-빅쿼리-콘솔-살펴보기">01. 빅쿼리 콘솔 살펴보기</h3>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/23f1c24b-951f-4031-90b5-3e19973a52f8/image.png" alt="빅쿼리 콘솔 화면"></p>
<p>빅쿼리에서는 데이터를 프로젝트 - 데이터셋 - 테이블 순으로 저장하고 있다. 왼쪽 메뉴에서 이러한 경로를 확인할 수 있고 데이터를 확인할 때 테이블의 메타데이터를 확인해서 이를 이용할 수 있다. </p>
<p>빅쿼리를 사용하면서 다른 RDMS에는 없는 유용한 기능을 확인할 수 있는데 이게 Validator, dry run 기능이다.</p>
<p>validator는 실제로 쿼리를 수행하기 전, 쿼리에 대해서 검사를 사전에 해주는 기능인데 이를 통해서 두 가지, check process byte와 check error message를 할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/bae92d7f-6873-406d-872a-100de5223346/image.png" alt="check process byte">
빅쿼리 에디터에서 쿼리를 등록하고 에러가 없을 경우, validator는 dry run을 통해 얼마나 바이트를 읽을 것인지를 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/083dfbed-0d65-4833-8ee0-e7f1553c9c8b/image.png" alt="chekc error message">
또한 쿼리가 유효하지 않다면 위와 같은 메시지를 보여주며 해당 쿼리를 수정할 수 있도록 도와주는 기능이 있다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/cea4451e-ba6b-4f1c-8abd-015ef670caee/image.png" alt="">
기존에 다른 SQL을 사용해본 사람이라면 문법이나 데이터를 추출하는 과정에서 큰 어려움은 겪지 않을 것이다. 문법 자체는 다른 RDMS와 거의 차이가 없기 때문에 아래에는 빅쿼리가 가지는 특성을 나열해보려고 한다.</p>
<hr>
<h3 id="02-빅쿼리가-다른-rdms에-비해-가지는-특성">02. 빅쿼리가 다른 RDMS에 비해 가지는 특성</h3>
<h4 id="1-테이블-명을-백틱으로-감싼다">1) 테이블 명을 백틱(`)으로 감싼다</h4>
<p>위 테이블명을 보면 `bigquery-public-data.~<del>.bikeshare_trips` 이렇게 쓰여진 걸 확인할 수 있다. 테이블 이름을 백틱으로 감싸서 표현하고 있는데 이는 프로젝트 명에 포함된 하이픈(-) 때문인데 이를 문자열로 처리하기 위해서 백틱으로 테이블 경로를 감싸는 것이다. 이 때 하이픈이 문제이기 때문에 `bigquery-public-data`.\</del>.bikeshare_trips 이런식으로 프로젝트명만 백틱으로 감싸도 정상적으로 수행이 된다</p>
<h4 id="2-array-structure-자료형">2) array, structure 자료형</h4>
<p>기존에 다른 프로그래밍 언어를 사용해봤다면 익숙한 자료형이겠지만 SQL에만 친숙하다면 생소할 수 있는 자료형이다. 먼저 array는 배열, 리스트 등과 유사하다</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/3908b66c-a5d7-46bb-a6c0-7c480f4bde0b/image.png" alt="">
위 에디터 화면을 보면 꼭 여러 행이 출력된 것처럼 보이지만 실제로는 행은 하나이고 array 자료형이 출력된 것을 확인할 수 있다. </p>
<p>structure, struce 자료형은 dict 자료형과 유사한 자료형이다. 위 array와 생김새는 비슷하지만 각 데이터마다 필드명을 따로 지정할 수 있기 때문에 리스트와 dict의 관계와 비슷하다고 이해할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/robin_updata/post/2637bc27-c076-44bd-b824-f03bd6df0514/image.png" alt="">
오히려 json 자료형에 익숙한 사람들이라면 아래와 같은 표시로 확인하는 게 더 익숙할 것이다. 
<img src="https://velog.velcdn.com/images/robin_updata/post/cde910e4-9ae3-4a73-9c6a-f5c64ca6fe0b/image.png" alt=""></p>
<hr>
<h3 id="03-마무리하며">03. 마무리하며</h3>
<p>클라우드 서비스가 무엇인지, 빅쿼리에 들어가면 보이는 화면과 빅쿼리가 가지는 대표적인 특성을 살펴봤다. 다음부터는 빅쿼리를 실제로 활용하면서 이를 실무에서 어떻게 이용할 수 있는지, 시각화는 어떻게 할 수 있는지에 대한 내용을 살펴볼 예정이다.</p>
<hr>
<h3 id="reference">Reference</h3>
<p>빅쿼리 가이드북 (<a href="https://zzsza.github.io/bigquery/">BigQuery Guide Book - 빅쿼리 가이드북</a>)
BigQuery의 모든 것(기획자, 마케터, 신입 데이터 분석가를 위한) 입문편 (<a href="https://www.slideshare.net/zzsza/bigquery-147073606">링크</a>)
구글 빅쿼리 완벽 가이드 - 발리아파 락쉬마난, 조던 티가니 저/변성윤, 장현희 역 
데이터 분석을 위한 SQL 레시피 - 가사키 나가토, 다미야 나오토 저/윤인성 역</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[글또] 중요한 건 꺾이지 않는 마음]]></title>
            <link>https://velog.io/@robin_updata/%EA%B8%80%EB%98%90-%EC%A4%91%EC%9A%94%ED%95%9C-%EA%B1%B4</link>
            <guid>https://velog.io/@robin_updata/%EA%B8%80%EB%98%90-%EC%A4%91%EC%9A%94%ED%95%9C-%EA%B1%B4</guid>
            <pubDate>Sun, 12 Feb 2023 10:31:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/robin_updata/post/1ebd6dbb-1110-41e6-8ad5-d1865f5efaf3/image.png" alt=""></p>
<p>연말연초가 되면 항상 많은 다짐을 하곤 했다
올해는 다이어트 해야지, 올해는 운동 열심히 해서 바프 찍어야지, 독서 많이 해야지....</p>
<p>그러한 2023년 계획 중 하나가 바로 &#39;불확실한 것을 선택하기&#39; 이다</p>
<p>딱 대학생 때까지는 많은 활동을 하고자 일을 벌려놓고는 했다. 대외활동을 신청하고, 동아리 활동을 하며 밤을 새고, 조모임을 하면서 화도 내고.
그러나 취업을 하고 난 뒤에는 최대한 안정적이고 확실한 활동을 하고 또한 그런 게 습관이 된 듯 하다</p>
<p>지금은 불확실한 것을 극도로 경계하고 또한 무서워한다. 많은 기회가 있었음에도 불구하고 그런 기회를 놓치고 안주하기만 했다.</p>
<p>그리고 이렇게 되어버렸다</p>
<p>이제는 정말로 이대로 두었다간 큰일이 날 것 같다는 생각이 들었고 이러한 일들을 타파하기 위해서는 모험을 떠나야 한다고 생각했다
그리고 이러한 결과로 올해의 목표 중 하나인 &#39;불확실한 것을 선택하기&#39;가 만들어지게 되었다.
이러한 불확실한 것 중 하나가 글또에 참여하는 것이고 이러한 불확실한 선택을 통해서 얻고자 하는 것을 아래 세 가지로 나누어서 볼 수 있을 듯 하다</p>
<h3 id="1-2023년-하고자-하는-공부">1. 2023년 하고자 하는 공부</h3>
<p>회사 업무에만 집중하다보니 확실한 여러 방면으로 역량이 부족해지고 있다 그래서 아래와 같은 공부를 하면서 직무 역량을 키워나가고자 한다</p>
<ol>
<li>데이터분석 다시</li>
</ol>
<ul>
<li>데이터분석 공부를 다시금 정리할 필요가 있다고 느껴진다 회사에서 주로 하는 영역 이외에는 다 잊어버리고 있고 이에 따라 누군가가 물어본다면 바로 대답할 엄두가 나지 않기 때문이다. 이러한 지식은 패스트캠퍼스 강의 <em>&#39;직장인을 위한 파이썬 데이터 분석 초격차 패키지&#39;</em> 를 통해서 학습하고자 한다</li>
<li>데이터 엔지니어링에 대한 지식이 필요함을 계속 느낀다. T자형 인재, 혹은 풀스택 분석가가 되기 위해서는 해당 영역에 대해서도 꾸준히 학습하는 것이 옳은데 이것에 대해서는 너무 무관심했던 것 같다. 따라서 <em>&#39;빅데이터처리 with Spark&amp;Hadoop 초격차 패키지&#39;</em> 를 통해서 이에 대한 개괄적인 지식을 학습하고자 한다</li>
<li>마지막으로 클라우드 환경, 특히 빅쿼리에 대한 학습이 필요하다고 느꼈다. 많은 회사에서 분석 환경을 클라우드로 이관하고 있고 이에 대한 학습이 필요하다고 느껴 <em>&#39;구글 빅쿼리 완벽 가이드&#39;</em>  책을 독학하면서 이에 대해서 학습하고자 한다. 이는 스터디를 진행할 수 있으면 좋겠다</li>
</ul>
<ol start="2">
<li>투자 공부</li>
</ol>
<ul>
<li>많은 비중을 차지하진 않겠지만 투자와 주식에 관심을 꾸준히 가지고 학습하기 위해 <em>&#39;한 번에 끝내는 주식 투자의 모든 것 초격차 패키지&#39;</em> 강의를 통해 지식을 얻고자 한다. 최고민수님께서 진행하는 강의라서 보다가 너무 지루하면 몇 번은 침착맨 영상으로 돌아가긴 할 듯 하다</li>
</ul>
<h3 id="2-2023년-글또를-통해-얻고자-하는-것">2. 2023년 글또를 통해 얻고자 하는 것</h3>
<ol>
<li>글 쓰는 습관을 기르자</li>
</ol>
<ul>
<li>한 때는 글을 쓰고 강연을 하는 것이 목표 중 하나였을 정도로 생산에 대한 열의가 있었는데 어느 덧 이러한 목표에는 무관심했었다. 꾸준하게 글을 쓰는 것, 그리고 읽는 것이 습관을 만들기는 어렵겠지만 그래도 글또를 통해서라도 이러한 습관을 얻고자 노력하고 싶다</li>
</ul>
<ol start="2">
<li>다른 사람으로 부터 영향을 받자</li>
</ol>
<ul>
<li>글또에 참여하는 많은 사람들은 분명히 자신의 커리어에 열정을 가지고 성장하고자 하는 사람들이 많을 거라고 생각한다. 이러한 다양한 사람들의 글을 읽고 피드백을 받으며 나도 그러한 사람들에게 긍정적인 영향을 받고 싶다</li>
<li>이러한 커뮤니티에 참여하지 않으면 난 우물 안 개구리처럼 작은 세상에서만 살아갈 게 너무 뻔하다. 다양한 사람들을 만나면서 이러한 사람들로부터 많은 자극을 받아야 한다</li>
</ul>
<ol start="3">
<li>다른 사람에게 영향을 주자</li>
</ol>
<ul>
<li>내가 남기는 기록은 분명히 내가 회고하는 데에도 도움이 되겠지만 나와 비슷한 고민을 하는 사람들에게 도움이 될 수 있다고 생각한다. 분명 나같은 고민을 하는 사람들이 많을 것이고 비슷한 고통을 받고 있을텐데 대한민국의 직장인로서 이들에게 큰 도움은 안될 수는 있지만 비슷한 사람이 있다는 점에 대해서 위로를 줄 수 있으면 좋겠다</li>
</ul>
<h3 id="3-2023년-회사에서-이루고-싶은-것">3. 2023년 회사에서 이루고 싶은 것</h3>
<ol>
<li>이직</li>
</ol>
<ul>
<li>그렇게 됐다. 회사에서 더 오래 있는 것이 연봉에는 도움이 되겠지만 이제는 더 이상 이 회사에서는 있을 수 없겠다. 그래서 더더욱 이직과 내 커리어에 대한 기준을 명확하게 잡아야 한다는 생각이 든다</li>
</ul>
<ol start="2">
<li>Be kind</li>
</ol>
<ul>
<li>회사 생활을 오래 할 수록 점점 내가 예민해지는 것을 느끼고 있다 회사에서도 사람들과 대화할 때 최대한 부드럽고 친절하게 말할 수 있도록 노력해야 한다는 생각이 든다 이러기 힘들 때마다 _&#39;인턴&#39;_과 _&#39;에에올&#39;_을 복습해야겠다</li>
</ul>
<h3 id="4-그래서-글또에서는-무슨-글을-쓸건데">4. 그래서 글또에서는 무슨 글을 쓸건데?</h3>
<ul>
<li>데이터 분석과 시각화</li>
<li>빅데이터처리</li>
<li>통계학</li>
</ul>
<p>위주로 글을 작성할 듯 싶다. 아직은 명확하게 정리를 못했지만 일단은 공부한 내용을 최대한 친절하게 작성하는 것을 목표로 글을 작성하고자 한다. 웹툰작가, 소설가가 연재하는 것처럼 세이브 원고를 만들고 항상 미리미리 만들과 전체 개괄을 잡아가면서 글또를 시작해야겠다</p>
<h3 id="5-마무리하며">5. 마무리하며</h3>
<p>쓰다보니 넋두리 글이 된 것 같다. 글을 쓰면서 다시 느낀 점은 내가 글을 너무 모른다는 점이다. 어떤 글을 써야 할지, 그리고 그 글을 어떻게 써야 할지 혼란스럽기만 하다. 앞으로 2주뒤 다시 글을 쓸 때 까지는 어떤 주제로 글을 작성할지에 대한 고민이 우선적으로 이루어져야겠다.</p>
<p>회사 생활, 일상 생활, 그런 모든 게 힘들긴 하지만 조금씩 노력하다보면 분명 성취가 있을 것이라고 생각한다 고통 속에 성장하는 법이니 고통을 달게 받기 위해서 많은 액션을 취해야겠다.</p>
]]></description>
        </item>
    </channel>
</rss>