<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>isitcake_yes.log</title>
        <link>https://velog.io/</link>
        <description>주니어 개발자 주니어발록 주니어예티 주니어레이스</description>
        <lastBuildDate>Fri, 12 May 2023 10:05:28 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>isitcake_yes.log</title>
            <url>https://velog.velcdn.com/images/isitcake_yes/profile/0af33752-2e38-4e78-8b69-20a97199a391/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. isitcake_yes.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/isitcake_yes" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[자료구조/알고리즘] 해시(Hash), 해시테이블(Hash Table), 해시함수 (Hash Function) 개념 및 예제 ]]></title>
            <link>https://velog.io/@isitcake_yes/%ED%95%B4%EC%8B%9CHash-%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94Hash-Table-%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98-Hash-Function-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@isitcake_yes/%ED%95%B4%EC%8B%9CHash-%ED%95%B4%EC%8B%9C%ED%85%8C%EC%9D%B4%EB%B8%94Hash-Table-%ED%95%B4%EC%8B%9C%ED%95%A8%EC%88%98-Hash-Function-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Fri, 12 May 2023 10:05:28 GMT</pubDate>
            <description><![CDATA[<h2 id="해시hash">해시(Hash)?</h2>
<h3 id="1-개념">1. 개념</h3>
<ul>
<li><strong>Hash(Hash Table) : Key : Value의 형태를 가진 하나의 자료구조</strong> (python에서는 dictionary 구조)
모든 데이터 타입으로 접근이 가능하다.<ul>
<li><strong>Hash function</strong>: 임의 길이 데이터(input)를 암호화된 고정 길이(output)의 int데이터로 매핑(전환)하는 함수</li>
</ul>
</li>
</ul>
<blockquote>
<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/28b56135-5cce-4e4f-bdf2-2e621b370e7d/image.png" alt=""> 왼쪽 그림: Hash Function의 역할. 임의 길이 데이터를 고정길이 데이터로 전환. 
오른쪽 그림 : <strong>buckets</strong>라고 하는 칸에는 key인 사람의 전화번호(value)가 있다. 
-&gt; 즉, <strong>key값을 hash function에 넣어 얻은 hashes를 배열의 인덱스로 쓰는 테이블</strong>을 hash table이라고 한다. </p>
</blockquote>
<ul>
<li>[key] -&gt; [hash func] -&gt;  [hash(==h(key))] - [value(in bucket)] 라는 네 단계를 거친다.</li>
</ul>
<br> 

<h3 id="2-충돌-hash-collision">2. 충돌 Hash collision</h3>
<p>충돌 : 서로 다른 key에 대해 동일한 hash값(index)이 부여된 상황 </p>
<h4 id="충돌-해결-1개별체이닝-seperate-chaining">충돌 해결 1.개별체이닝 (Seperate Chaining)</h4>
<p>: 충돌 발생 시 동일한 key에 다른 value를 연결리스트로 연결해 충돌을 해결하는 방법</p>
<h4 id="충돌-해결-2오픈-어드레싱-open-addressing">충돌 해결 2.오픈 어드레싱 (Open Addressing)</h4>
<p>: 충돌 발생 시 테이블 공간을 탐사해 빈 공간을 찾아나서는 방식
<br> </p>
<h3 id="3-시간복잡도-on-속도-비교">3. 시간복잡도 O(n) 속도 비교</h3>
<ul>
<li>일반적인 경우(Collision이 없음) -&gt; <strong>O(1)</strong></li>
<li>최악의 경우(Collision이 모두 발생) -&gt; O(n)</li>
<li>해시 테이블의 평균(충돌이 일어나지 않았을 경우) <strong>시간복잡도는 O(1)</strong>로, 매우 빠르게 탐색, 삽입 삭제할 수 있다. </li>
</ul>
<blockquote>
<p>ex) <em>배열과 해시 테이블 비교</em>
: 10개의 배열에 데이터를 저장하고, 검색할 때 O(10)
: 10개의 데이터 저장공간을 가진 해시 테이블에 데이터를 저장하고, 검색할 때 O(1)</p>
</blockquote>
<br> 


<h3 id="4-어떤-문제에서-해시를-사용해야-할까">4. 어떤 문제에서 해시를 사용해야 할까?</h3>
<ul>
<li>String을 기반으로 정보를 기록하고 관리해야 할 때 !</li>
<li>데이터를 빠르게 넣거나 가져와야 할 때 !</li>
<li>매우 긴 리스트, 리스트로 풀 경우 효율성 떨어지는 경우!<blockquote>
<p>ex) <em>문제예시 (프로그래머스)</em></p>
<ol>
<li>완주하지 못한 선수 :  선수이름 (String key) -&gt; 완주여부(Bool value) </li>
<li>신고결과 받기 : 게시판 사용자 (String key) -&gt; 신고자들의 목록 (Array value)</li>
<li>위장 : 옷의 종류(String key) -&gt; 옵션 개수 (integer value)</li>
</ol>
</blockquote>
</li>
</ul>
<br>

<h3 id="예제---완주하지-못한-선수">예제 - 완주하지 못한 선수</h3>
<blockquote>
<h4 id="문제설명">문제설명</h4>
<p>수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.</p>
</blockquote>
<h4 id="제한사항">제한사항</h4>
<ul>
<li>마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.</li>
<li>completion의 길이는 participant의 길이보다 1 작습니다.</li>
<li>참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.</li>
<li>참가자 중에는 동명이인이 있을 수 있습니다.<h4 id="입출력-예">입출력 예</h4>
participant,    completion    &gt; return
[&quot;leo&quot;, &quot;kiki&quot;, &quot;eden&quot;]    [&quot;eden&quot;, &quot;kiki&quot;] &gt;    &quot;leo&quot;
[&quot;marina&quot;, &quot;josipa&quot;, &quot;nikola&quot;, &quot;vinko&quot;, &quot;filipa&quot;]    [&quot;josipa&quot;, &quot;filipa&quot;, &quot;marina&quot;, &quot;nikola&quot;] &gt;    &quot;vinko&quot;
[&quot;mislav&quot;, &quot;stanko&quot;, &quot;mislav&quot;, &quot;ana&quot;]    [&quot;stanko&quot;, &quot;ana&quot;, &quot;mislav&quot;]     &gt; &quot;mislav&quot;<h4 id="입출력-예-설명">입출력 예 설명</h4>
예제 #1
&quot;leo&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
&quot;vinko&quot;는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
&quot;mislav&quot;는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.</li>
</ul>
<blockquote>
<h3 id="best-code-해쉬사용">BEST CODE (해쉬사용)</h3>
</blockquote>
<pre><code class="language-python">def solution(participant, completion):
    answer = &#39;&#39;
    temp = 0
    dic = {}
    # participant의 hash구조 만들기, hash sum구하기
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    # completion의 hash값 빼기        
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]
&gt;
    return answer</code></pre>
<br>

<h4 id="참고">참고</h4>
<ul>
<li>노마드코더, Hash Table <a href="https://youtu.be/HraOg7W3VAM">https://youtu.be/HraOg7W3VAM</a></li>
<li><a href="https://woonys.tistory.com/entry/%ED%95%B4%EC%8B%9CHash-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%ACFeat-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%B8%ED%84%B0%EB%B7%B0">해시(Hash) 개념 정리(Feat. 파이썬 알고리즘 인터뷰)</a></li>
<li>프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a> </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML/NLP] 텍스트 마이닝 (Text Mining) 용어정리 및 TDM (Term Document Matrix)]]></title>
            <link>https://velog.io/@isitcake_yes/MLNLP-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%A7%88%EC%9D%B4%EB%8B%9D-Text-Mining-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC-%EB%B0%8F-TDM-Term-Document-Matrix</link>
            <guid>https://velog.io/@isitcake_yes/MLNLP-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%A7%88%EC%9D%B4%EB%8B%9D-Text-Mining-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC-%EB%B0%8F-TDM-Term-Document-Matrix</guid>
            <pubDate>Tue, 09 May 2023 08:03:02 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-텍스트-마이닝text-mining이란">✏️ 텍스트 마이닝(Text Mining)이란?</h2>
<p><em><strong>Text Mining = Data Mining + NLP(Natural Language Processing)</strong></em></p>
<ul>
<li>정의 : 구조화되지 않은 대규모의 텍스트 집합으로부터 새로운 지식을 발견하는 과정</li>
<li>목적 : 정형화되지 않은 데이터를 <u>정형화된 데이터로 바꾸는 것</u> </li>
<li>과정 : Text &gt; Parse &gt; Weight &gt; Transform &gt; Classification or Cluster </li>
</ul>
<h3 id="👉-관련-용어-정리">👉 관련 용어 정리</h3>
<blockquote>
<ul>
<li><strong>토큰 Token</strong> : 가장 작은 단위. 분리자(띄어쓰기, 특수문자 등)를 포함하지 않는 연속적인 문자열.</li>
</ul>
</blockquote>
<ul>
<li><strong>용어 Term</strong> : 특정한 의미를 갖는 토큰.</li>
<li><strong>문서 Document</strong> : 토큰으로 이루어진 집합.</li>
<li><strong>코퍼스, 말뭉치 Corpus</strong> : 문서의 집합. 대량의 텍스트 데이터. </li>
<li><strong>토큰화 Tokenize</strong> : 문장을 토큰들의 연속으로 분석하는 과정.</li>
<li><strong>토크나이저 Tokenizer</strong> : 토큰화를 수행하는 프로그램 (ex. 은전한잎, 꼬꼬마 등)</li>
<li><strong>형태소분석 Morphological Analysis</strong> : 토큰화(tokenize) + 품사판별 (Part of Speech Tagging)</li>
<li><strong>어휘집합 Vacabulary</strong> : 말뭉치에 있는 모든 문서를 문장으로 나누고 토큰화를 실시한 후, 중복을 제거한 토큰들의 집합.</li>
<li><strong>자연어 처리 Natural Language Processing</strong> : 인간이 사용하는 언어를 컴퓨터에게 이해시키기 위한 기술</li>
<li><strong>임베딩 Embedding</strong> : 자연어를 기계가 이해할 수 있는 벡터(숫자의 나열)로 바꾼 결과 혹은 그 일련의 과정. </li>
<li><strong>불용어 Stopwords(common words)</strong> : 자주 쓰이거나 의미를 갖지 않아 변별력이 없는 단어. </li>
<li><strong>스테밍 Stemming</strong> : 단어의 뿌리/줄기를 찾는 방법. 다양한 접미사를 제거하고 단어의 수를 감소시키기 위해 사용.</li>
<li><strong>태깅 Tagging</strong> : 단어에 품사를 붙이는 과정. </li>
<li><strong>단어-문서 행렬 Term-Document Matrix, TDM</strong> : 다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것</li>
</ul>
<br>

<h2 id="✏️-tdm-term-document-matrix-단어-문서-행렬">✏️ TDM (Term Document Matrix, 단어-문서 행렬)</h2>
<h3 id="데이터-정형화--tdm-생성">데이터 정형화 : TDM 생성</h3>
<ul>
<li>비정형의 텍스트들(Document)로부터 형태소 분석을 통해 토큰(명사/형태소/Term 등)을 추출한 후 <strong>각각의 Document에서 해당 Term이 몇 번 나타나는지를 숫자로 표시하는 행렬</strong> 형태로 나타낸다. </li>
</ul>
<h3 id="가중치-적용--tf-idf가중치">가중치 적용 : TF-IDF가중치</h3>
<ul>
<li><p><strong>Weighting</strong> : 문서를 더 잘 나타내는 용어(term)에 가중치 부여 </p>
<ul>
<li><em>ex1. 문서 내 빈도가 높은 용어 -&gt; 문서를 잘 설명하기 때문에, 높은 가중치 부여</em></li>
<li><em>ex2. 코퍼스 내 빈도가 낮은 용어 -&gt; 코퍼스 내 문서를 더 잘 식별하기 때문에, 높은 가중치 부여</em></li>
</ul>
</li>
<li><p><strong>TF(Term Frequency) 가중치</strong> </p>
<ul>
<li><strong>TF<sub>ij</sub> = log(1+f<sub>ij</sub>)</strong>  <em>(여기에서, f<sub>ij</sub>는 빈도수)</em>
-&gt; 모든 문서에 나타나는 단어(ex. &quot;a&quot;, &quot;the&quot;)는 문서의 특징을 나타내는데 변별력이 없음(단점) 
-&gt; TF-IDF가중치로 보완! </li>
</ul>
</li>
<li><p><strong>TF-IDF(Inverse Document Frequency) 가중치</strong>  </p>
<ul>
<li><strong>TF<sub>ij</sub> * IDF<sub>i</sub></strong> <em>(여기에서, i는 단어, j는 문서)</em></li>
<li><strong>IDF<sub>i</sub> = log( N / df<sub>i</sub>)</strong> <em>(여기에서, N은 총 문서 수, df<sub>i</sub>는  단어i를 포함하는 문서 수)</em>
-&gt; TF-IDF 값은 전체 문서들(N) 중에서 단어 i가 적은 수의 문서에서 발생할수록, 발생횟수가 많을수록 큰 값을 가진다.
-&gt; IDF값이 클 수록 중요도가 커진다. </li>
</ul>
</li>
</ul>
<p><br><br>
앞으로 임베딩, NLP 기법 등에 대해 공부해보자!! !! 
<a href="https://wikidocs.net/31698">위키독스</a> 참고해서 꾸준히 실습도 해보자~! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Software Engineering] 애자일(Agile) 소프트웨어 개발]]></title>
            <link>https://velog.io/@isitcake_yes/Software-Engineering-%EC%95%A0%EC%9E%90%EC%9D%BCAgile-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C</link>
            <guid>https://velog.io/@isitcake_yes/Software-Engineering-%EC%95%A0%EC%9E%90%EC%9D%BCAgile-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C</guid>
            <pubDate>Thu, 20 Apr 2023 06:01:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📍-agile-methods-애자일-방법론">📍 Agile Methods 애자일 방법론</h2>
<blockquote>
<h4 id="-애자일-소프트웨어-개발을-위한-4가지-원칙">* 애자일 소프트웨어 개발을 위한 4가지 원칙</h4>
</blockquote>
<ol>
<li><strong>Individuals and interactions</strong> over processes and tools 개인과 상호작용에 집중</li>
<li><strong>Working software</strong> over comprehensive documentation 작동하는 소프트웨어에 집중</li>
<li><strong>Customer collaboration</strong> over contract negotiation 고객 협력</li>
<li><strong>Responding to change</strong> over following a plan 변화에 대응</li>
</ol>
<blockquote>
<h4 id="-변화에-드는-비용-graph">* 변화에 드는 비용 Graph</h4>
<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/e772b4f8-0d18-48b6-9303-855f6a3452ab/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>기존 방법론</strong>에서는 프로세스가 진행될수록 변경사항에 대한 개발 비용이 굉장히 많이 든다.</li>
<li><strong>애자일</strong> 방법으로 잘 구현하면 초기에는 비용이 더 들 수 있을지라도, 프로세스 전반에 걸친 변화에 잘 대응할 수 있다. 비용이 적게 든다.</li>
<li>요구사항이 계속 바뀔 수 밖에 없음을 인정. 변경에 잘 대응하는 체계로 변경. </li>
</ul>
<blockquote>
<h4 id="--plan-driven-development">*  Plan-driven Development</h4>
</blockquote>
<ul>
<li>전통적인 방법임.</li>
<li>정의되고 표준화되고 점진적으로 개선되는 프로세스</li>
<li>문서화 강조, 잘 정의된 중간산출물. </li>
<li>반복가능성, 예측가능성에 집중</li>
<li>미리 정의된 소프트웨어 시스템 아키텍처</li>
<li>상세한 계획, 워크플로, 역할, 책임 및 작업 제품 정의
<img src="https://velog.velcdn.com/images/isitcake_yes/post/e0a7d60a-4396-4670-8235-33314d420042/image.png" alt=""></li>
</ul>
<blockquote>
<h4 id="-애자일-선언의-12가지-원칙">* 애자일 선언의 12가지 원칙</h4>
</blockquote>
<ol>
<li>당사의 최우선 과제는 가치있는 소프트웨어를 <strong>조기에 지속적으로</strong> 제공함으로써 고객을 만족시키는 것이다.</li>
<li><strong>개발 후반부에도 변화하는 요구사항을 환영</strong>한다. 애자일 프로세스는 고객의 경쟁우위를 위해 변화를 이용한다.</li>
<li>작동하는 소프트웨어를 2주에서 2개월까지 <strong>자주 배포</strong>하고, 더 짧은 기간을 선호한다. </li>
<li><strong>비지니스 담당자와 개발자는 프로젝트 기간 내내 매일 함께 작업</strong>해야 한다.</li>
<li><strong>동기부여받은 개인을 중심으로</strong> 프로젝트를 구축하라. 그들에게 필요한 환경과 지원을 제공하고 일을 완수할 수 있도록 믿어준다. </li>
<li>가장 효율적이고 효과적으로 정보를 전달하는 방법은 <strong>직접 대면하는 대화</strong>이다. </li>
<li><strong>작동 중인 소프트웨어</strong>는 진행 상황의 주요 척도이다. </li>
<li><strong>지속가능한 개발</strong>을 촉진한다. 후원자, 개발자, 사용자는 일정한 속도를 유지할 수 있어야 한다. 개발 패이스를 균일화 한다.</li>
<li><strong>기술적 우수성과 우수한 디자인에 대한 지속적인 관심</strong>은 애자일을 향상시킨다. </li>
<li><strong>단순화, 즉 하지 않아도 되는 일을 줄이는 기술</strong>은 필수적이다. </li>
<li>최고의 아키텍처, 요구사항 및 디자인은 <strong>스스로 조직화하는 팀</strong>에서 나온다. </li>
<li>팀은 <strong>주기적으로</strong> 어떻게 하면 더 효과적으로 일할 수 있을지 <strong>회고</strong>한 다음 그에 따라 행동을 조정하고 조정한다.</li>
</ol>
<blockquote>
<h4 id="-애자일-프로젝트-관리">* 애자일 프로젝트 관리</h4>
</blockquote>
<ul>
<li>Timebox management technique 타임박스 기법<ul>
<li>결과물 제작 마감일(상수)은 정해져있으며 변경해서는 안된다. </li>
<li>해당 시간 안에 결과물이 나와야 함. </li>
<li>타임박스는 잘 알려진 정의된 결과물은 주어진 리소스로 제작해야 한다. </li>
<li><strong>결과물의 범위</strong>는 프로젝트 관리의 변수 중 하나이다. 하지만 품질(상수)은 결코 변수가 될 수 없다. </li>
</ul>
</li>
<li>Rolling wave planning<ul>
<li>파도치는 모형, 물결이 점점 커지는 plan</li>
<li>가까운 것은 상세하게 planning, 뒷 일정은 대략적인 planning</li>
</ul>
</li>
<li>Pull system, Not Push system<ul>
<li>팀 멤버들이 본인의 일을 끌어가는 방식</li>
</ul>
</li>
</ul>
<br>

<h2 id="📍-extreme-programming-xp">📍 eXtreme Programming (XP)</h2>
<p>: 1990년대 후반에 개발된 매우 영향력 있는 애자일 방법론. 소프트웨어를 개발하는 <strong>중소규모 팀</strong>을 위한 경량 방법론. 요구사항이 자주 바뀌거나 모호한 소프트웨어 개발시 사용.</p>
<h3 id="xp의-소프트웨어-개발-문제-해결법">XP의 소프트웨어 개발 문제 해결법</h3>
<ul>
<li>일정 지연 Schedule slips -&gt; 릴리즈를 자주 함(1-4주기), 우선순위가 높은 기능을 우선적으로 개발. </li>
<li>프로젝트가 취소됨 Project Canceled -&gt; 고객이 기능 우선순위를 선택하게 해서 개발. </li>
<li>시스템을 다시 개발해야하는 상황 System goes sour (needs replace) -&gt; 지속적인 통합, 자동 테스트로 해결</li>
<li>운영중인 S/W의 높은 결함률 High Defect Rate of S/W in production -&gt; 개발자와 고객에 의한 테스트 강화</li>
<li>비지니스에 대한 잘못된 이해 Business misunderstood -&gt; 고객을 팀의 필수로 포함. </li>
<li>비지니스가 변경됨 Business change -&gt; 짧은 릴리즈 주기로 인해 변경사항을 적게 유지하며, 신규/변경된 기능을 환영한다.</li>
<li>엄한 feature가 많음 False feature rich -&gt; 우선순위가 가장 높은 작업에 집중</li>
<li>이직률 Staff turnover -&gt; 개발자가 자신의 작업을 추정하고 완료할 수 있도록 책임과 권리 부여.(Pull방식)</li>
</ul>
<h3 id="xp-practices">XP Practices</h3>
<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/0ae349dd-c96e-43dc-a743-dde24df28624/image.png" alt=""> *XP의 practice들은 잘 엮여있다.</p>
<ul>
<li><strong>The Planning Game</strong><ul>
<li>심플하게 게임처럼 계획 세움.</li>
<li>요구사항은 스토리카드(명세서X)에 기록되고, 릴리즈에 포함될 스토리는 소요시간과 우선순위에 의해 결정된다. </li>
<li>비지니스 담당자는 범위scope, 우선순위, 릴리즈 구성, 날짜, 릴리즈 등의 사항을 결정.</li>
<li>기술 담당자는 규모, 결과, 프로세스, 세부일정 결정</li>
</ul>
</li>
<li><strong>Small releases 소규모 릴리즈</strong> <ul>
<li>간단한 시스템을 신속하게 프로덕션에 적용한 다음, 매우 짧은 주기로 새버전을 릴리즈한다. </li>
</ul>
</li>
<li><strong>Metaphor</strong> <ul>
<li>전체 시스템에 대한 간단한 공유 스토리로 전체 개발을 안내한다.</li>
</ul>
</li>
<li><strong>Simple design 단순한 디자인</strong><ul>
<li>현재 요구사항을 충족할 만큼만 설계.</li>
<li>올바른 디자인 - 1.모든 테스트 실행. 2.중복된 로직이 없음. 3.개발자에게 중요한 코드 명시. 4.가능한 클래스와 메서드는 적게.</li>
</ul>
</li>
<li><strong>Testing 테스트</strong> <ul>
<li>XP의 핵심이며, 모든 변경이 이루어진 후 프로그램을 테스트하는 접근방식 개발</li>
<li>XP 테스트 특징 <ul>
<li>테스트 우선 개발</li>
<li>시나리오부터 점진적 테스트 개발</li>
<li>테스트 개발 및 검증에 사용자가 참여</li>
<li>테스트 자동화 </li>
</ul>
</li>
<li>테스트 중심 개발(TDD, Test-Driven-Development)<ul>
<li>코딩 전에 테스트를 작성하면 구현해야 할 요구사항이 명확해짐.</li>
<li>테스트 자동화 - Junit과 같은 테스트 프레임워크 사용. 새 기능이 추가되면 모든 이전 테스트와 새 테스트가 자동으로 실행. </li>
</ul>
</li>
</ul>
</li>
<li><strong>Pair programming</strong><ul>
<li>프로그래머가 짝을 이루어 같은 컴퓨터에 앉아 함께 코드를 개발함.</li>
<li>모든 팀원이 개발 과정에서 서로 협력할 수 있다.</li>
<li>코드에 대한 공동의 소유권을 개발하고 팀 전체의 코드에 대한 이해도 상승.</li>
<li>리팩토링 시 많은 도움이 됨.</li>
</ul>
</li>
<li><strong>Refactoring</strong> <ul>
<li>기능은 유지하고 내부 코드 구조는 더욱 좋게 개선한다.</li>
<li>소프트웨어 개선이 가능한 부분을 찾아서 당장 개선이 필요하지 않은 부분까지 개선한다.</li>
<li>이렇게 하면 소프트웨어의 이해도가 향상되어 문서화할 필요성이 줄어든다.</li>
<li>코드가 체계적이고 명확하기 때문에 변경하기가 더 쉽다.  </li>
</ul>
</li>
<li><strong>Collective ownership 공동 소유권</strong><ul>
<li>모든 사람이 전체 시스템에 대한 책임을 진다. </li>
<li>코드의 어떤 부분에 가치를 더할 수 있는지 발견한 사람은 누구나 언제든지 그렇게 할 수 있다.</li>
</ul>
</li>
<li><strong>Continuous integration(CI) 지속적인 통합</strong><ul>
<li>개발자 코드 변경 &gt; 변경사항 Build &gt; Test &gt; 결과 노티스 </li>
<li>코드통합 및 테스트는 몇시간 후 혹은 최대 하루 이내에 완료.</li>
<li>테스트를 빠르게 실행.</li>
</ul>
</li>
<li><strong>40 hour week</strong> - 지속적인 개발을 위함</li>
<li><strong>On-site customer 현장고객</strong><ul>
<li>실제 고객(시스템 사용자)이 팀에 참여하여 질문에 답변하고, 기능 테스트에 대한 테스트케이스 작성, 우선순위 결정 등을 할 수 있어야 한다.</li>
<li>고객이 프로젝트의 가치를 창출할 수 있다. </li>
</ul>
</li>
<li><strong>Coding standards</strong> - 표준을 지켜 개발한다.</li>
</ul>
<br>

<h2 id="📍-scrum-스크럼">📍 Scrum 스크럼</h2>
<p>반복적인 개발을 관리하는 데 중점을 두는 애자일 방법. </p>
<h3 id="relay-race-vs-rugby-approach">Relay race VS. Rugby approach</h3>
<ul>
<li>릴레이 (Waterfall 방식)<ul>
<li>프로젝트는 순차적으로 진행, 단계에서 단계로</li>
<li>기능이 전문화되고 세분화</li>
<li>부서들이 명확함</li>
<li>럭비 접근 방식<ul>
<li>다분야 팀의 지속적인 상호작용을 통해 이루어진다. </li>
<li>멤버들은 처음부터 끝까지 함께 일한다. </li>
<li>팀 전체가 최종적인 목표를 이룬다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="속도와-유연성을-제공하는-6개-특징-스크럼-철학">속도와 유연성을 제공하는 6개 특징 (스크럼 철학)</h3>
<p><strong>1. Built-in instability 불안정성이 내포됨</strong></p>
<ul>
<li>명확한 신제품 컨셉이나 구체적인 작업 계획을 제시하는 경우는 거의없다. </li>
<li>프로젝트 팀에게 매우 도전적인 목표와 프로젝트를 수행할 수 있는 큰 자유가 주어진다.</li>
</ul>
<p><strong>2. Self-organizing project teams 자체 조직화 된 프로젝트 팀</strong></p>
<ul>
<li>본사는 초기에만 개입하고, 팀은 자유롭게 방향을 설정할 수 있다. 한계를 향한 끝없는 탐구</li>
<li>다양한 기능적 전문성, 사고 프로세스 및 행동패턴을 가진 구성원들로 구성됨</li>
</ul>
<p><strong>3. Overlapping development phases 중복되는 개발단계</strong></p>
<ul>
<li>개발 형태를 오버랩핑 방식으로 진행.</li>
<li>문제 해결에 초점을 두고 주도적인 자세를 취하도록 한다.</li>
<li>&quot;공유 분업&quot; 필요</li>
</ul>
<p><strong>4. Multi-learning</strong></p>
<ul>
<li>다단계 학습 : 개인 수준의 학습 &gt; 그룹 수준의 학습 &gt; 기업수준의 학습 </li>
<li>다기능 학습 : 자신의 분야가 아닌 다른 분야에서도 경험을 쌓도록 권장됨.</li>
</ul>
<p><strong>5. Subtle control 섬세한 제어</strong></p>
<ul>
<li>프로젝트 팀은 대부분 독립적으로 운영되지만 통제를 받지 않는 것은 아니다. </li>
<li>&quot;자기 통제&quot;, &quot;또래의 압력을 통한 통제&quot;, &quot;사랑에 의한 통제&quot;에 중점을 둠.<ul>
<li>적합한 사람 선택 / 개방적인 업무 환경 조성/ 고객의 의견을 경청하도록 장려 / 그룹 성과에 따른 평가 보상 시스템 구축. 팀워크 강조 / 실수를 예측하고 관용 / 협력업체 또한 스스로 조직화하도록 장려</li>
</ul>
</li>
</ul>
<p><strong>6. Organizational transfer of learning</strong></p>
<ul>
<li>조직 내에 경험이 내재화, 표준화 되어 공유되도록.</li>
<li>후속 신제품 개발 프로젝트 또는 조직의 다른 부서로 학습을 전이하는 작업은 정기적으로 이루어짐</li>
<li>기업들은 성공에서 얻은 교훈을 제도화하기 위해 노력함. </li>
</ul>
<h3 id="소프트웨어-개발을-위한-스크럼-프로세스">소프트웨어 개발을 위한 스크럼 프로세스</h3>
<ul>
<li>스크럼은 일반적으로 사용되는 반복적/점진적 개발주기를 강화한 것이다. </li>
<li>Pregame(계획, 시스템 아키텍처, 상위레벨 디자인) &gt; Game(개발 스프린트) &gt; Postgame(릴리즈)</li>
</ul>
<h3 id="sprint-cycle-스프린트-주기">Sprint cycle 스프린트 주기</h3>
<ul>
<li>스프린트는 일반적으로 2-4주 동안 <strong>고정된 기간</strong>으로 진행</li>
<li><strong>Product backlog : 프로젝트에서 수행해야할 작업 목록(feature list)</strong></li>
<li>선택 단계에서는 고객과 협력하여 스프린트 기간 동안 개발할 기능을 Product backlog에서 선택함.</li>
<li>개발 기능에 따른 개발팀이 구성되면, 개발팀은 고객과 조직으로부터 분리되며, 모든 커뮤니케이션은 <strong>&#39;스크럼마스터&#39;</strong>를 통해 이루어짐.</li>
<li><strong>스크럼 마스터의 역할은 외부의 방해요소로부터 개발팀을 보호하는 것</strong></li>
<li>스프린트가 끝나면 완료된 작업을 검토하고 이해관계자에게 발표함. 그러면 다음 스프린트 주기가 시작됨.</li>
</ul>
<h3 id="역할">역할</h3>
<ul>
<li><strong>프로덕트 오너</strong> <ul>
<li>제품 기능 또는 요구사항을 식별하고 개발 우선순위를 정함.</li>
<li>Product backlog를 지속적으로 검토, 비지니스 요구사항을 충족하는지 계속 확인.</li>
<li>고객일 수도 있고 소프트웨어 회사의 제품관리자일 수도 있음.</li>
</ul>
</li>
<li><strong>스크럼 마스터</strong><ul>
<li>스크럼 프로세스를 준수하는지 확인하고 팀을 가이드 함.</li>
<li>다른 부서와의 인터페이스를 담당함</li>
<li>스크럼 팀이 외부의 간섭에 의해 방향을 전환하지 않도록 하는 책임이 있다.</li>
<li>프로젝트 관리자(PM)로 생각해서는 안된다.</li>
</ul>
</li>
<li><strong>개발팀</strong><ul>
<li>자체적으로 조직된 소프트웨어 개발자 그룹.</li>
<li>소프트웨어 및 기타 문서 개발을 담당.</li>
</ul>
</li>
</ul>
<h3 id="워크플로우">워크플로우</h3>
<p>* 스크럼 미팅의 목표 - 프로젝트/스프린트 목표 공유, 진행상태 매일 갱신, 위험과 이슈 식별 및 해결</p>
<ul>
<li>스프린트 계획 미팅 : 각 스프린트 시작시 / Product backlog 검토 / Sprint backlog 추정</li>
<li>일일 스크럼 미팅 : 어제 오늘 무엇을 할건지 / 어떤 이슈가 있는지 (15분 남짓)</li>
<li>스프린트 검토 미팅 : 스프린트 검토 / 이해관계자에게 데모 시연</li>
<li>스프린트 회고 : 스프린트 프로세스 검토</li>
</ul>
<h3 id="artefacts-산출물">Artefacts 산출물</h3>
<ul>
<li>Product backlog : 스크럼 팀이 처리해야 하는 &#39;해야할일&#39; 항목의 정렬된 목록 (덜 상세함)</li>
<li>Sprint backlog : 스프린트 기간동안 개발팀이 해결해야 하는 작업 목록 (매우 상세함)</li>
</ul>
<h3 id="진척진행상황-추적">진척(진행상황) 추적</h3>
<ul>
<li>Task board 작업보드 : 스프린트 작업의 상태 (할일/진행중/완료)</li>
<li>Sprint Burn-down chart : 매일 진행상황 추적, 남은 노력에 집중 (X축 타임라인, Y축 남은 작업)</li>
<li>Release Burn-down chart : 각 스프린트 별 스토리포인트 남은 정도 차트. 전체 프로그레스 확인. (X축 스프린트, Y축 남은 작업)</li>
</ul>
<br>

<h2 id="📍-lean-software-development-린-소프트웨어-개발">📍 Lean Software Development 린 소프트웨어 개발</h2>
<p>: Toyota 시스템에서 시작. 근본적인 린 원칙 - 낭비(고객에게 가치를 창출하지 못하는 모든 것)의 절대적 제거
ex) 과잉생산으로 인한 낭비, 시간 낭비, 운송 낭비, 재고 낭비, 결함이 있는 제품을 만드는 낭비 등.. </p>
<h3 id="7가지-린-원칙">7가지 린 원칙</h3>
<p><strong>1. 낭비를 제거 Eliminate waste</strong></p>
<ul>
<li>소프트웨어 개발의 7가지 낭비 : Partially Done Work / Extra Processes / Extra Features / Task Switching / Waiting / Unnecessary Motion / Defects</li>
</ul>
<p><strong>2. 학습 증폭 Amplify Learning</strong></p>
<ul>
<li>피드백으로부터 배움. 짧은 반복</li>
</ul>
<p><strong>3. 가능한 늦게 결정 Decide as late as possible</strong></p>
<ul>
<li>동시에 소프트웨어 개발 - 변화하는 요구 사항에 대처 </li>
<li>의사결정 지연</li>
</ul>
<p><strong>4. 최대한 빠르게 전달 Deliver as fast as possible</strong></p>
<ul>
<li>비지니스 유연성 확정</li>
<li>진행중인 작업을 줄이고 빠르게 결과물을 제공.</li>
<li>가능한 한 늦게 결정을 보완한다.</li>
<li>풀(Pull) 시스템을 통해 직원들이 가장 효과적으로 시간을 활용할 수 있도록 지원</li>
</ul>
<p><strong>5. 팀역량 강화 Empower the team</strong></p>
<ul>
<li>리더십 : 관리자 vs 리더</li>
<li>관리자 - 복잡성에 대처 : 계획 및 예상 / 조직 및 직원 구성 / 추적 및 제어</li>
<li>리더 - 변화에 대처 : 방향 설정 / 사람 정렬 / 동기부여 활성화</li>
</ul>
<p><strong>6. 무결성 구축 Build Integrity in</strong> </p>
<ul>
<li>시작부터 모든 단계에서 품질 구축.</li>
<li>고객 테스트 참여.</li>
<li>리팩토링을 해서 변화에 대처할 수 있도록.</li>
</ul>
<p><strong>7. 전체를 보기 See the whole</strong></p>
<ul>
<li>시스템 사고 : 시스템은 상호의존적이고 상호작용하는 부분으로 구성됨. 최고의 부품이 최고의 시스템을 만드는 것은 아니다. </li>
<li>로컬 최적화 피하기</li>
<li>측정 : 전문화된 기여도를 기준으로 측정</li>
</ul>
<br>

<h2 id="📍-kanban-칸반">📍 KANBAN 칸반</h2>
<p>: Just-In-Time(JIT)기반의 애자일 프로젝트 관리방법</p>
<ul>
<li>Timeboxing 기반의 iteration계획을 수립하지 않고 <strong>WIP(Work-In-Process)</strong>의 양을 관리</li>
</ul>
<br>

<h2 id="📍-devops">📍 DevOps</h2>
<p>: Development(개발) + Operations(운영)</p>
<ul>
<li>지속적인 배포에 집중 Continuous Integration and Delivery</li>
</ul>
<h3 id="도구-카테고리-및-참조-도구">도구 카테고리 및 참조 도구</h3>
<ul>
<li>협업도구 : 잔디(JANDI), Slack, Microsoft Teams, Flow, Confluence 등</li>
<li>프로젝트 관리/요구사항관리 도구 : Redmine, Trello 등/Doors등</li>
<li>결함/이슈 추적: mantis, Bugzilla, Jira, ClearQuest등</li>
<li>코드품질(static analysis, code review) / 제품품질(test자동화)<ul>
<li>정적분석 Static analysis: PMD, CPPCheck, Prevent, Klockwork, sonarqube, Veracode 등</li>
<li>Code review: Gerrit, code collaborator, crucible 등</li>
<li>테스트 자동화 도구 (code level, feature level, UI 포함 등)</li>
</ul>
</li>
<li>Continuous Integration / 형상관리 : Jenkins, Hudson 등 / SVN, GitHub, ClearCase 등</li>
</ul>
<br>

<h2 id="-wbs-work-breakdown-structure-업무-분류-체계">+ WBS (Work Breakdown Structure, 업무 분류 체계)</h2>
<p>: WBS - 모든 계획작업의 기초. 프로젝트 전체 범위를 구성하고 정의함. 프로젝트 팀이 프로젝트 목표를 달성하고 필요한 인도물을 산출하기 위해 <strong>실행하는 작업</strong>을 인도물 중심의 <strong>계층 구조</strong>로 세분해 놓은 것.</p>
<ul>
<li><strong>1단계 <em>프로젝트(Project)</em> &gt; 2단계 <em>단계(Phase)</em> &gt; 3단계 <em>작업(Task)</em> &gt; 4단계 <em>작업패키지(Work Package, 가장 작은 수준의 작업)</em></strong></li>
<li>WBS의 목적 <ul>
<li>전체상 파악</li>
<li>각 단계의 목표와 달성수단의 명확화</li>
<li>일정, 자원, 범위의 계획을 제대로 세우기 위한 기준</li>
<li>업무누락 방지</li>
<li>이후 프로젝트의 진행, 추적 관리의 기준</li>
<li>원가 집계, 요약/보고의 체계</li>
</ul>
</li>
<li>Decomposition 분해 : 프로젝트 범위와 프로젝트 결과물을 더 작고 관리하기 쉬운 부분으로 나누는 기법</li>
<li>Expert Judgement 전문가 판단 : 사전에 정의된 템플릿 제공. 잘 세분화하는 방법에 대해 의견 제공.</li>
<li>WBS 작성시 유의사항<ul>
<li>최하위 타스크(워크 패키지)의 경우, 산출물이 누락되지 않도록 정의</li>
<li>MECE(Mutually Exclusive and Collectively Exhaustive)의 원칙에 맞게 작성</li>
<li>WBS 작성 후 번호 부여</li>
<li>번호는 업무의 순서와는 관계가 없고 위계 (Hierarchy)를 나타냄.</li>
<li>WBS 구조 : Top-down 또는 Bottom-UP 둘다 가능<h3 id="프로젝트-진척율-계산">프로젝트 진척율 계산</h3>
</li>
</ul>
</li>
<li>WBS구조에서 작업패키지(Work Package, 최하위 task)에 진척율을 입력하여 상위task로 집계 </li>
<li><blockquote>
<p>각 Phase 또는 전체 프로젝트 진척율 계산</p>
</blockquote>
</li>
<li>진척율 산정 - <strong>가중치 적용</strong><ul>
<li>Task별 가중치를 부여한다.</li>
<li>상위레벨에 가중치 부여, 하위레벨은 필요시 가중치 부여.</li>
<li>최하위 레벨부터 가중치 부여하여 sum-up도 가능</li>
<li>ex) 단계별 기능점수 가중치
분석(0.19), 설계(0.24), 구현(0.32), 시험(0.25). 합계(1.0)  </li>
</ul>
</li>
</ul>
<br>



<h2 id="-실제-개발-프로세스">+ 실제 개발 프로세스</h2>
<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/ad275d77-b25d-479d-9bc9-4588ef591eee/image.png" alt=""> 하이브리드 모델 주로 많이 사용됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 사이언스 논문 모음]]></title>
            <link>https://velog.io/@isitcake_yes/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%9D%B4%EC%96%B8%EC%8A%A4-%EB%85%BC%EB%AC%B8-%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@isitcake_yes/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%9D%B4%EC%96%B8%EC%8A%A4-%EB%85%BC%EB%AC%B8-%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Wed, 12 Apr 2023 02:57:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/82370185-7629-427d-bbc0-bc9013c2765e/image.jpeg" alt=""> <strong>논문</strong> 읽기는 <em>&quot;효과가 확실한 맛없는 약&quot;</em> 이라는 글을 본 적이 있다.. 
쓰더라도 효과가 확실함을 믿고 열심히 차근차근 읽어보자!</p>
<h3 id="--attention-is-all-you-need">- Attention Is All You Need</h3>
<p><a href="https://arxiv.org/pdf/1706.03762.pdf">[Paper on arXiv]</a></p>
<h3 id="--bert-pre-training-of-deep-bidirectional-transformers-for-language-understanding">- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding</h3>
<p><a href="https://arxiv.org/pdf/1810.04805.pdf">[Paper on DeepMind&#39;s site]</a></p>
<h3 id="--a-style-based-generator-architecture-for-generative-adversarial-networks">- A Style-Based Generator Architecture for Generative Adversarial Networks</h3>
<p><a href="https://arxiv.org/pdf/1812.04948.pdf">[Paper on arXiv]</a></p>
<h3 id="--learning-transferable-visual-models-from-natural-language-supervision">- Learning Transferable Visual Models From Natural Language Supervision</h3>
<p><a href="https://arxiv.org/pdf/2103.00020.pdf">[Paper on arXiv]</a></p>
<h3 id="--mastering-the-game-of-go-with-deep-neural-networks-and-tree-search">- Mastering the Game of Go with Deep Neural Networks and Tree Search</h3>
<p><a href="https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf">[Paper on DeepMind&#39;s site]</a></p>
<h3 id="--deep-neural-networks-for-youtube-recommendations">- Deep Neural Networks for YouTube Recommendations</h3>
<p><a href="https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf">[Paper on Google Research]</a></p>
<h5 id="출처--6-papers-every-modern-data-scientist-must-read"><a href="https://towardsdatascience.com/6-papers-every-modern-data-scientist-must-read-1d0e708becd">출처 : 6 Papers Every Modern Data Scientist Must Read</a></h5>
<hr>
<h3 id="--documentation-matters-human-centered-ai-system-to-assist-data-science-code-documentation-in-computational-notebooks">- Documentation Matters: Human-Centered AI System to Assist Data Science Code Documentation in Computational Notebooks</h3>
<p><a href="https://dl.acm.org/doi/10.1145/3489465">[Paper on ACM]</a></p>
<h3 id="--assessing-the-effects-of-fuel-energy-consumption-foreign-direct-investment-and-gdp-on-co2-emission-new-data-science-evidence-from-europe--central-asia">- Assessing the effects of fuel energy consumption, foreign direct investment and GDP on CO2 emission: New data science evidence from Europe &amp; Central Asia</h3>
<p><a href="https://doi.org/10.1016/j.fuel.2021.123098">[Paper on Sciencedirect]</a></p>
<h3 id="--impact-on-stock-market-across-covid-19-outbreak">- Impact on Stock Market across Covid-19 Outbreak</h3>
<p><a href="https://www.ijraset.com/best-journal/impact-on-stock-market-across-covid19-outbreak">[Paper on iJRASET]</a></p>
<h3 id="--exploring-the-political-pulse-of-a-country-using-data-science-tools">- Exploring the political pulse of a country using data science tools</h3>
<p><a href="https://arxiv.org/pdf/2011.10264.pdf">[Paper on arXiv]</a></p>
<h3 id="--veridicalflow-a-python-package-for-building-trustworthy-data-science-pipelines-with-pcs">- VeridicalFlow: a Python package for building trustworthy data science pipelines with PCS</h3>
<p><a href="https://joss.theoj.org/papers/10.21105/joss.03895">[Paper on JOSS]</a></p>
<h3 id="--from-ai-ethics-principles-to-data-science-practice-a-reflection-and-a-gap-analysis-based-on-recent-frameworks-and-practical-experience">- From AI ethics principles to data science practice: a reflection and a gap analysis based on recent frameworks and practical experience</h3>
<p><a href="https://link.springer.com/article/10.1007/s43681-021-00127-3">[SpringerLink]</a></p>
<h3 id="--detection-of-road-traffic-anomalies-based-on-computational-data-science">- Detection of Road Traffic Anomalies Based on Computational Data Science</h3>
<p><a href="https://www.researchsquare.com/article/rs-1149975/v1">[Paper Link]</a></p>
<h3 id="--data-science-data-governance-ai-ethics">- Data Science Data Governance [AI Ethics]</h3>
<p><a href="https://ieeexplore.ieee.org/document/8636447">[Paper on IEEE]</a></p>
<h5 id="출처--top-10-must-read-data-science-research-papers-in-2022"><a href="https://www.analyticsinsight.net/top-10-must-read-data-science-research-papers-in-2022/">출처 : Top 10 Must-Read Data Science Research Papers in 2022</a></h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Software Engineering] 소프트웨어 개발 생명주기(Life Cycle) 모델 종류와 장단점]]></title>
            <link>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Life-Cycle-%EB%AA%A8%EB%8D%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90</link>
            <guid>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Life-Cycle-%EB%AA%A8%EB%8D%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EC%9E%A5%EB%8B%A8%EC%A0%90</guid>
            <pubDate>Thu, 06 Apr 2023 12:38:58 GMT</pubDate>
            <description><![CDATA[<h2 id="⚙️소프트웨어-라이프-사이클-모델">⚙️소프트웨어 라이프 사이클 모델</h2>
<p><strong>소프트웨어 개발 생명주기(Software Development Life Cycle)</strong>란? </p>
<ul>
<li>소프트웨어 생명주기 모델 프로세스 : <u>요구사항 분석 &gt; 설계 &gt; 구현 &gt; 테스트 &gt; 유지보수</u></li>
<li>소프트웨어 개발에 대한 단계별 접근 방식 </li>
<li>시스템의 요구분석부터 유지보수까지 전 공정을 체계화한 절차</li>
<li>개발 프로세스를 단계별로 단순화•추상화한 것<blockquote>
<p>*<em>모델 종류 *</em> 
• 코딩과 수정(주먹구구식) 모델 | Code-and-fix model 
• 폭포수 모델 | Waterfall model 
• 프로토타입 모델 | Prototyping model 
• 점증적 모델 | Incremental model 
• 나선형 모델 | Spiral model
• 통합 프로세스 모델 | Unified Software Development Process 
• V모델 | V model 
• 에자일 방법론 | Agile methods </p>
</blockquote>
</li>
</ul>
<br> 

<h3 id="주먹구구식-모델-code-and-fix-model">주먹구구식 모델 Code-and-Fix model</h3>
<p>: 공식적인 가이드라인이나 프로세스가 없는 개발 방식. 간단한 기능만을 정리하여 개발하는 형태.</p>
<ul>
<li>클라이언트가 만족할 때까지 수정. No디자인 No플랜 No명세서 </li>
</ul>
<table>
<thead>
<tr>
<th align="center">장점 (+)</th>
<th align="center">단점 (-)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 작은 프로젝트에서는 유용하다.</td>
<td align="center">- 대규모 프로젝트는 불가하다. <br>- 여러 개발자가 협업이 불가하다. <br> - 가독성이 떨어질 수 있다.  <br> - 유지보수 어렵다.</td>
</tr>
</tbody></table>
<br>

<h3 id="폭포수-모델-waterfall-model">폭포수 모델 Waterfall model</h3>
<p>: 각 단계가 하향식(top-down)으로 진행되며, 병행하거나 거슬러 반복되지 않는 형태. </p>
<ul>
<li>문서화 강조. 명세서를 기준으로 다음 단계로 넘어감. 요구 사항을 잘 정리되어 있고, 리스크가 적은 소규모 프로젝트에 적합하다.</li>
</ul>
<table>
<thead>
<tr>
<th align="center">장점 (+)</th>
<th align="center">단점 (-)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 절차가 간결하고 이해하기 쉽다. <br> - 단계별 진척사항에 대한 관리가 용이하다. <br> - 각 단계별 산출물을 체계적으로 문서화 할 수 있다.</td>
<td align="center">- 소프트웨어 요구사항이 후반에 테스트 되기 때문에 중간에 가시적인 결과를 볼 수 없다. <br>- 고객이 모든 요구사항을 사전에 명시하기 어렵다. <br> - 원하는 결과가 나오지 않았을 때 보완하기 위한 시간과 비용이 많이 든다. (리스크가 크다.)</td>
</tr>
</tbody></table>
<br>


<h3 id="프로토타입-모델-prototyping-model">프로토타입 모델 Prototyping model</h3>
<p>: 사용자의 요구사항에 따른 시제품을 만들어 최종 결과물을 예측해본 후, 개발을 진행하는 형태.</p>
<ul>
<li>Throw-away prototype : 최종 프로토타입을 통해 결정된 최종 요구사항을 가지고 본격적으로 시스템을 만든다.</li>
<li>Evolutionary prototype : 요구사항을 반영하여 구현된 프로토타입을 버리지 않고 지속적으로 개선하여 최종 시스템으로 완성. (cf. 나선형 모델..)</li>
</ul>
<table>
<thead>
<tr>
<th align="center">장점 (+)</th>
<th align="center">단점 (-)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 고객의 요구사항을 정확히 반영. <br> - 초기 마케팅에 도움을 줄 수 있다. <br> - 눈으로 확인함으로써 소프트웨어가 어떻게 작동할 것인지 예상할 수 있다. <br> - 사용자와 의사소통의 도구로 사용되어 구체적이고 원활히 대화할 수 있다.</td>
<td align="center">-프로토타이핑 과정을 관리, 통제하기 어렵다. <br>- 개발범위가 명확하지 않아 언제 종료될 지 모른다. <br> 광범위하게 고객과의 협업이 요구된다. <br> - 투입 인력과 비용 산정이 어렵고, 프로토타입에 따른 추가비용이 들 수 있다.</td>
</tr>
</tbody></table>
<br>


<h3 id="점증적-모델-incremental-model">점증적 모델 Incremental model</h3>
<p>: 사용자의 요구사항 일부분 혹은 시스템의 일부분을 개발하여 단계적으로 릴리즈하고, 점진적으로 개발 범위를 늘려가 시스템을 완성하는 방식.  </p>
<table>
<thead>
<tr>
<th align="center">장점 (+)</th>
<th align="center">단점 (-)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 사용자들 초기 피드백 수용이 용이하다. <br> - 고객의 요구사항을 더 잘 충족시킨다. <br> - 서비스를 빠르게 시작할 수 있고, 인력 분배가 유용하다.</td>
<td align="center">- 배포 후에도 계속 릴리즈되기 때문에 유지보수를 관리하기 어렵다.</td>
</tr>
</tbody></table>
<br>

<h3 id="나선형-모델-sprial-model">나선형 모델 Sprial model</h3>
<p>: 리스크 최소화 하기 위해 여러 번의 개발 과정을 거쳐 점진적으로 완벽한 시스템을 개발해 나가는 모델. 위험관리 및 위험 최소화가 목적이다. 폭포수 모형 + 프로토타입 모형 + 위험분석 추가</p>
<ul>
<li>진화적 프로토타입 모델 절차를 따르고, 위험분석 단계가 추가된 모델.</li>
</ul>
<table>
<thead>
<tr>
<th align="center">장점 (+)</th>
<th align="center">단점 (-)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 폭포수 모델과 프로토타입 모델의 장점을 통합했다. <br> - 처음부터 위험에 대한 고려를 하며 개발이 진행되기 때문에 위험 요소가 줄어든다. <br> - 반복적 개발 방식에 의해 요구사항이 충분히 반영된다.</td>
<td align="center">- 위험 분석에 대한 기술 전문 지식이 필요하다. <br> - 모델이 복잡하고 이해하기 어렵기 때문에 전문적인 관리가 필요하다. <br> - 반복횟수가 많아질수록 프로젝트 관리가 어렵다.</td>
</tr>
</tbody></table>
<br>

<h3 id="통합-프로세스-모델-usdpunified-software-development-process">통합 프로세스 모델 USDP(Unified Software Development Process)</h3>
<p>: 폭포수 모델의 문제점을 해결하기 위해 등장한 모델로, 도입, 구체화, 구축, 전이 단계의 과정 속에서 세부 개발 활동이 반복적으로 이루어지는 모델이다.</p>
<ul>
<li>대표적인 반복적, 점증적 프로세스이다 -&gt; 위험요소를 초기에 완화할 수 있다. </li>
<li>한 단계에서 특정 업무만 하지 않는다.</li>
<li>아키텍처와 객체지향이 중요해짐에 따라 활용도가 증가하고 있다. </li>
</ul>
<br>

<h3 id="v-모델">V 모델</h3>
<p>: 폭포수 모델에 테스트(검증) 단계를 추가하여 각 개발단계를 검증하는데에 초점을 둔 모델이다.</p>
<ul>
<li>단위테스트 / 통합테스트 / 시스템테스트 / 인수테스트를 진행한다.</li>
<li>개발 단계를 검증하는 데 초점을 두므로 오류를 줄일 수 있다. </li>
<li>V &amp; V (Verification and Validation) 모델 <ul>
<li>Verification : 개발자관점 the product right ? </li>
<li>Validation : 사용자 관점 the right product ? </li>
</ul>
</li>
</ul>
<br>

<h3 id="애자일-방법론-agile-methods">애자일 방법론 Agile Methods</h3>
<p>: 일정한 주기를 반복하며 진행하고, 고객과의 소통에 초점을 맞춘 방법론. </p>
<ul>
<li>Iterative 반복적 / Incremental 점진적 / Evolutionary 진화적 </li>
<li>짧은 주기 반복, 초기에 구체적이고 지속적인 피드백</li>
<li>점진적인 계획 접근 방식</li>
<li>변화하는 비즈니스 요구에 대응하여 구현 일정을 유연하게 조정</li>
<li>고객 요구사항 변화에 빠르고 유연하게 대응</li>
</ul>
<h4 id="애자일-방법론-일하는-방식">애자일 방법론 (일하는 방식)</h4>
<ul>
<li>eXtreme Programming (XP) </li>
<li>Scrum </li>
<li>Lean Software Development </li>
<li>DevOps </li>
</ul>
<br>
더욱 자세한 애자일 방법론에 대한 내용은 다음 스터디에서 계~~속~~…🏓📚 
]]></description>
        </item>
        <item>
            <title><![CDATA[[Software Engineering] 소프트웨어 프로세스 개선(SPI) 및 소프트웨어 프로세스(SP) 품질인증 모델]]></title>
            <link>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-process</link>
            <guid>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B0%9C%EB%B0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-process</guid>
            <pubDate>Fri, 31 Mar 2023 05:04:53 GMT</pubDate>
            <description><![CDATA[<h2 id="⚙️소프트웨어-개발-프로세스-개선-software-process-improvementspi">⚙️소프트웨어 개발 프로세스 개선 Software Process Improvement(SPI)</h2>
<h3 id="소프트웨어-프로세스--개발-생명주기">소프트웨어 프로세스 &amp; 개발 생명주기</h3>
<ul>
<li>소프트웨어를 개발할 때 일을 수행하는 작은 단위를 <strong>작업(task)</strong>이라고 한다. 소프트웨어 개발 프로세스는 이 작업 순서의 집합이라고 할 수 있으며, 작업 순서뿐 아니라 일정, 예산, 자원과 같은 제약 조건을 포함하는 일련의 활동을 말한다.  </li>
<li>소프트웨어 개발 생명주기 : 계획 &gt; 분석 &gt; 설계 &gt; 구현 &gt; 테스트 &gt; 유지보수 <br>

</li>
</ul>
<h3 id="소프트웨어-프로세스-개선spi">소프트웨어 프로세스 개선(SPI)</h3>
<ul>
<li>소프트웨어 품질을 향상시키기 위해서는 소프트웨어 프로세스를 개선을 통해 소프트웨어 품질을 개선하려는 노력이 필요하다!!  = ⭐️<strong>Software Process Improvement (SPI)</strong>⭐️</li>
<li>소프트웨어 개발과 관련된 모든 활동을 더욱 체계적으로 수행함으로써, 개발 소프트웨어의 결함을 줄이고 더 품질 좋은 제품을 만들기 위함.</li>
<li>SPI Benefits <ul>
<li>품질, 비용, 시장 출시 시간, 프로세스 품질, 제품 품질, 추정 정확도, 생산성, 고객 만족, 직원 만족도<h4 id="📌-프로세스-개선-모델">📌 프로세스 개선 모델</h4>
</li>
</ul>
</li>
<li><strong>CMMI</strong> <ul>
<li>SW 개발 조직의 업무 능력 및 성숙도를 평가하는 모델</li>
<li>초기 -&gt; 관리 -&gt; 정의 -&gt; 정량적 관리 -&gt; 최적화</li>
</ul>
</li>
<li><strong>SPICE</strong><ul>
<li>소프트웨어 품질 향상을 위해 평가 및 개선하는 국제 표준</li>
<li>ISO/IEC15504<h4 id="📌-프로세스-평가-모델">📌 프로세스 평가 모델</h4>
</li>
</ul>
</li>
<li><strong>SP인증 제도</strong> <ul>
<li>5개 영역, 17개 평가항목, 70개 세부평가 항목</li>
</ul>
</li>
</ul>
<br>


<h2 id="⚙️-소프트웨어-프로세스sp-품질인증-모델">⚙️ 소프트웨어 프로세스(SP) 품질인증 모델</h2>
<blockquote>
<h4 id="인증기준의-평가-영역">인증기준의 평가 영역</h4>
</blockquote>
<ol>
<li>프로젝트 관리 2. 개발 3. 지원 4. 조직관리 5. 프로세스 개선</li>
</ol>
<h2 id="1-프로젝트-관리">1. 프로젝트 관리</h2>
<h3 id="11-프로젝트-계획">1.1 프로젝트 계획</h3>
<p>프로젝트 계획 수립 활동은 프로젝트의 성공적 수행과 관리를 위해 관련 기준 및 계획을 마련하는
것이다.</p>
<blockquote>
<h4 id="세부-평가항목">세부 평가항목</h4>
</blockquote>
<ol>
<li>프로젝트의 목표 및 범위 결정한다.</li>
<li>프로젝트에 적용할 생명주기와 프로세스 정의한다.</li>
<li>공수와 비용 산정한다.</li>
<li>일정과 예산 결정한다.</li>
<li>프로젝트 관리에 필요한 계획 수립한다.</li>
<li>프로젝트 계획서 작성 및 승인의 획득한다.</li>
</ol>
<h3 id="12-프로젝트-통제">1.2 프로젝트 통제</h3>
<p>프로젝트 통제 활동은 프로젝트 계획 시에 수립하였던 각종 계획 요소들의 실제 수행 상황을
점검하여, 프로젝트의 목표를 달성하도록 하는 것이다.</p>
<blockquote>
<h4 id="세부-평가항목-1">세부 평가항목</h4>
</blockquote>
<ol>
<li>프로젝트 계획 요소 점검한다.</li>
<li>프로젝트 진척사항 검토한다.</li>
<li>주요 단계별 산출물 검토한다.</li>
<li>식별된 문제들을 분석한다.</li>
<li>시정조치 활동 수행한다.</li>
</ol>
<h3 id="13-협력업체-관리">1.3 협력업체 관리</h3>
<p>협력업체 관리 활동은 프로젝트에 참여하는 외부 조직인 협력업체를 적절하게 선정하고 계약을
체결하며, 계약에 명시된 사항의 이행을 관리하는 것이다.</p>
<blockquote>
<h4 id="세부-평가항목-2">세부 평가항목</h4>
</blockquote>
<ol>
<li>획득 대상 및 범위 결정한다.</li>
<li>협력업체 선정한다.</li>
<li>협력업체와 계약 체결한다.</li>
<li>협력업체의 계약 이행 여부 확인한다.</li>
<li>제품 및 서비스 검수한다.</li>
</ol>
<hr>

<h2 id="2-개발">2. 개발</h2>
<h3 id="21-고객-요구사항-관리">2.1 고객 요구사항 관리</h3>
<p>: 고객 요구사항 관리 활동은 시스템 관점에서 개발할 시스템의 범위와 품질 목표를 정의하고, 지속적으로 변할 수 있는 요구사항을 관리하여 고객 요구사항에 부합하는 시스템 개발을 가능하도록 하는 것이다.</p>
<blockquote>
<h4 id="세부-평가항목-3">세부 평가항목</h4>
</blockquote>
<ol>
<li>고객 요구사항을 정의한다.</li>
<li>고객 요구사항의 변경을 관리한다.</li>
<li>고객 요구사항과 산출물간 추적성을 유지한다.</li>
</ol>
<h3 id="22-분석">2.2 분석</h3>
<p>: 분석 활동은 고객 요구사항을 바탕으로 SW 개발에 필요한 하위 수준의 요구 사항을 식별하고 상세화하며 이를 검토하여 정확한 SW를 개발하고자 하는 것이다.</p>
<ul>
<li>해결해야 할 사용자의 문제(Problem) 에 대한 분석</li>
<li>시스템이 사용자에서 무엇을 제공해야 하는지 “What” 을 정의</li>
<li>기능 요구사항 뿐 아니라 <strong>비기능 요구사항 (성능, 사용성 등 품질 요구사항)</strong>에 대한 정의가 중요함</li>
<li>품질 요구사항간 트레이드 오프 (Trade-off) 분석 및 검토 필요 </li>
</ul>
<blockquote>
<h4 id="세부-평가항목-4">세부 평가항목</h4>
</blockquote>
<ol>
<li>소프트웨어 요구사항을 정의한다.</li>
<li>소프트웨어 요구사항을 분석한다.</li>
<li>소프트웨어 요구사항을 검토한다. </li>
</ol>
<h3 id="23-설계">2.3 설계</h3>
<p>: 설계 활동은 구현 시 참조할 수 있고 요구사항에 부합하는지 검증할 수 있는 산출물을 작성하여 SW 개발을 준비하는 것이다.</p>
<blockquote>
<h4 id="세부-평가항목-5">세부 평가항목</h4>
</blockquote>
<ol>
<li>구조 설계를 수행한다.</li>
<li>상세 설계를 수행한다.</li>
<li>테스트 계획을 수행한다. </li>
</ol>
<blockquote>
<h4 id="구조설계-vs-상세설계">구조설계 vs 상세설계</h4>
</blockquote>
<ul>
<li>구조설계 : 전체 시스템의 구성요소와 이들 간의 상관관계 식별. 비기능적 요구사항(NFR)이 반영되어야 함. 여러 가능한 대안 도출 및 검토. 의사결정 내역에 대한 문서화.</li>
<li>상세설계 : 개별 구성요소의 내부구조를 설계하는 활동. 구현가능한 소프트웨어 단위로 분할하고, 내부로직 및 인터페이스 정의</li>
</ul>
<h3 id="24-구현">2.4 구현</h3>
<p>구현 활동은 설계 결과물을 반영하여 고객 요구사항을 만족하는 실행가능한 SW를 만들어 내는
것이다.</p>
<blockquote>
<h4 id="세부-평가항목-6">세부 평가항목</h4>
</blockquote>
<ol>
<li>소프트웨어 단위를 구현한다. </li>
<li>단위 테스트를 수행한다.</li>
<li>소프트웨어를 통합한다. </li>
</ol>
<h3 id="25-테스트">2.5 테스트</h3>
<p>테스트 활동은 계획된 절차에 따라 시스템의 결함을 제거하여 고객의 요구사항을 만족하는 SW를
제공하는 것이다</p>
<blockquote>
<h4 id="세부-평가항목-7">세부 평가항목</h4>
</blockquote>
<ol>
<li>통합 테스트를 수행한다.</li>
<li>시스템 테스트를 수행한다.</li>
<li>인수를 지원한다.</li>
</ol>
<blockquote>
<h4 id="통합-테스트-vs-시스템-테스트">통합 테스트 vs 시스템 테스트</h4>
</blockquote>
<ul>
<li>통합 테스트 : 개발자 관점. 통합 단계에 따라 테스트. 통합환경(개발환경). 기능완성도에 초점.</li>
<li>시스템 테스트 : 사용자 관점. 실 운영환경. 비기능 품질 목표에 초점. 100% 통합이 완료된 시점.</li>
</ul>
<hr>

<h2 id="3-지원">3. 지원</h2>
<h3 id="31-품질보증">3.1 품질보증</h3>
<p>: 품질보증 활동은 프로젝트의 프로세스가 프로젝트 전체 과정의 활동에 대해 적합성을 유지하고 있는지와 작업산출물이 고객 요구사항을 만족 시키고 있는지를 확인하여 정확한 프로젝트 진행을 보증하는 것이다.</p>
<blockquote>
<h4 id="세부-평가항목-8">세부 평가항목</h4>
</blockquote>
<ol>
<li>품질보증 계획을 수립한다.</li>
<li>품질보증 활동을 수행한다.</li>
<li>품질보증 활동 결과를 관리한다.</li>
</ol>
<h3 id="32-형상관리">3.2 형상관리</h3>
<p>: 형상관리 활동은 프로젝트 생명주기 전체 기간 동안의 작업산출물에 대해 베이스라인을 수립하고, 주요 단계별로 변경을 추적하고 통제하여 작업산출물의 <strong>무결성을 보장</strong> 하고 유지하는 것이다.</p>
<ul>
<li>변경 통제가 필요한 대상 및 버전에 대해 베이스라인(기준선)의 설정 및 이후 공식 절차에
따라 변경 수행한다. </li>
</ul>
<blockquote>
<h4 id="세부-평가항목-9">세부 평가항목</h4>
</blockquote>
<ol>
<li>형상 항목을 식별하고 계획을 수립한다.</li>
<li>형상 통제를 실시한다.</li>
<li>형상관리 기록을 관리한다.</li>
<li>형상 감사를 실시한다.</li>
</ol>
<blockquote>
<h4 id="형상항목-예시">형상항목 예시</h4>
</blockquote>
<ul>
<li>소스코드 / 실행파일 / 데이터구조 (DB스키마) / 사용자 메뉴얼 / 운영자 메뉴얼 / 분석서, 설계서, 테스트케이스 등 개발 산출물 / 프로젝트 계획서 등 관리 산출물</li>
</ul>
<blockquote>
<h4 id="형상통제-절차-예시">형상통제 절차 예시</h4>
</blockquote>
<ul>
<li>통제가 필요한 대상에 대해 베이스라인(기준선) 설정 -&gt; 공식절차에 따라 변경 수행</li>
<li>단계별 업무 완료 -&gt; 베이스라인 설정 -&gt; 변경심사(영향평가, 개발자, 고객…) -&gt; 변경실시 -&gt; 변경공지 </li>
</ul>
<h3 id="33-측정분석">3.3 측정분석</h3>
<p>:  측정 및 분석 활동은 프로젝트 수행 중 필요한 정보를 수집하고 분석하여 프로젝트의 목표 달성 정도를 관리하는 것이다. 측정을 할 수 있어야 통제, 개선이 가능하다. 품질, 비용, 시간 등을 측정한다. </p>
<blockquote>
<h4 id="세부평가항목">세부평가항목</h4>
</blockquote>
<ol>
<li>측정 및 분석 계획을 수립한다.</li>
<li>측정을 실시한다.</li>
<li>측정 결과를 분석한다.</li>
<li>측정 분석 결과를 관리한다.</li>
</ol>
<blockquote>
<h4 id="측정지표-metric">측정지표 (Metric)</h4>
</blockquote>
<ul>
<li>속성을 표현하기 위해 어느 메트릭을 사용할것인지 결정한다. </li>
<li>Ex) 속성: 자동차의 경제성, 메트릭 : 연비 / 엔진오일 교체주기 / 중고차 시세 …</li>
</ul>
<hr>

<h2 id="4조직관리">4.조직관리</h2>
<h3 id="41-조직-프로세스-관리">4.1 조직 프로세스 관리</h3>
<p>: 조직 프로세스 관리 활동은 조직 및 프로젝트의 목표에 대한 이해를 바탕으로 프로젝트 수행을 위한 조직 차원의 기본 지침을 정의하여 유지하고 관리하는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-1">세부평가항목</h4>
</blockquote>
<ol>
<li>조직의 표준 프로세스를 정의한다.</li>
<li>표준 생명주기 모델을 정의한다.</li>
<li>표준 프로세스 조정을 위한 기준 및 가이드라인을 수립한다.</li>
<li>조직의 표준 프로세스를 확산한다.</li>
<li>조직 프로세스 적용 상황을 확인한다.</li>
<li>프로세스 관련 경험을 자산으로 축적한다.</li>
</ol>
<h3 id="42-기반구조-관리">4.2 기반구조 관리</h3>
<p>: 조직의 기반구조 관리 활동은 프로세스 수행성과를 향상시키기 위해 HW, SW, 표준, 기술 등 조직의 기반 작업환경을 구축하고 관리하는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-2">세부평가항목</h4>
</blockquote>
<ol>
<li>조직 기반구조에 대한 요구사항을 정의한다.</li>
<li>조직 기반구조를 구축한다.</li>
<li>조직 기반구조를 관리하고 개선한다.</li>
</ol>
<h3 id="43-구성원-교육">4.3 구성원 교육</h3>
<p>: 조직 구성원 교육 활동은 구성원 각자의 역할을 효과적이고 효율적으로 수행할 수 있도록 구성원들의 역량을 강화 시키는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-3">세부평가항목</h4>
</blockquote>
<ol>
<li>교육 및 훈련 계획을 수립한다.</li>
<li>교육 및 훈련을 실시한다.</li>
<li>교육 및 훈련의 효과를 평가한다.</li>
</ol>
<hr>

<h2 id="5프로세스-개선">5.프로세스 개선</h2>
<h3 id="51-정량적-프로세스-관리">5.1 정량적 프로세스 관리</h3>
<p>: 정량적 프로세스 관리 활동은 조직 프로세스 및 프로젝트의 목표를 달성하기 위하여 프로세스 수행을 정량적으로 통제하고 관리하는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-4">세부평가항목</h4>
</blockquote>
<ol>
<li>조직의 표준 프로세스 성과 목표를 정의한다.</li>
<li>조직 프로세스 성과 베이스라인을 정의한다.</li>
<li>조직 프로세스 성과 모델을 정의한다.</li>
<li>프로젝트의 프로세스 성과 목표를 정의한다.</li>
<li>프로젝트의 프로세스를 측정하고 분석하는 방법을 정의한다.</li>
<li>프로젝트의 프로세스 성과를 확인한다.</li>
</ol>
<h3 id="52-문제-해결">5.2 문제 해결</h3>
<p>: 문제 해결 활동은 자주 발생되는 문제들에 대해 근본 원인을 분석하고 식별하여 적절한 시정조치를 수행하는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-5">세부평가항목</h4>
</blockquote>
<ol>
<li>문제 해결을 위한 가이드라인을 수립한다.</li>
<li>해결할 문제를 선정한다.</li>
<li>선정된 문제의 원인을 분석하고 해결방안을 정의한다.</li>
<li>해결방안에 따라 문제를 해결한다.</li>
<li>문제 해결방안의 성과를 기록하고 관리한다.</li>
</ol>
<h3 id="53-프로세스-개선-관리">5.3 프로세스 개선 관리</h3>
<p>: 프로세스 개선 관리 활동은 조직과 프로젝트의 프로세스에 대한 이해를 형성하고 유지하며, 프로세스를 평가하여 개선하고 유지하는 것이다.</p>
<blockquote>
<h4 id="세부평가항목-6">세부평가항목</h4>
</blockquote>
<ol>
<li>조직의 표준 프로세스에 대한 요구 및 목표를 식별한다.</li>
<li>조직 프로세스의 강점 및 약점을 평가한다.</li>
<li>프로세스 개선을 위한 계획을 수립한다.</li>
<li>프로세스 개선 활동을 수행한다.</li>
<li>프로세스 개선 활동의 성과를 기록하고 관리한다.</li>
</ol>
<br>
<br>
다음에는 소프트웨어 프로세스 모델들도 알아보자 ~~! 
]]></description>
        </item>
        <item>
            <title><![CDATA[[Software Engineering] 소프트웨어와 소프트웨어 공학!   ]]></title>
            <link>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%99%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99</link>
            <guid>https://velog.io/@isitcake_yes/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%99%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99</guid>
            <pubDate>Tue, 28 Mar 2023 03:50:44 GMT</pubDate>
            <description><![CDATA[<h2 id="⚙️소프트웨어-공학">⚙️소프트웨어 공학</h2>
<h3 id="💡-소프트웨어software란">💡 소프트웨어(Software)란?</h3>
<ul>
<li><p>소프트웨어란? 컴퓨터 시스템을 효율적으로 운영하기 위해 개발된 프로그램의 총칭이다.  </p>
</li>
<li><p>소프트웨어의 예시</p>
<ul>
<li><strong>운영체제</strong>: 컴퓨터 하드웨어와 사용자 소프트웨어 사이에서 중재하는 소프트웨어. Windows, macOS, Linux 등</li>
<li><strong>어플리케이션 소프트웨어</strong>: 특정 작업을 수행하기 위한 소프트웨어. 워드프로세서, 그래픽 에디터, 게임, 웹 브라우저 등</li>
<li><strong>시스템 소프트웨어</strong>: 하드웨어와 소프트웨어 간의 상호작용을 관리하고, 시스템 자원을 효율적으로 사용하는 소프트웨어. 디바이스 드라이버, 보안 소프트웨어, 데이터베이스 관리 시스템 등</li>
<li><strong>프로그래밍 언어 및 개발도구</strong>: 소프트웨어를 개발하기 위한 도구. C++, Python, Java 등</li>
<li><strong>모바일 어플리케이션</strong>: 스마트폰이나 태블릿 PC에서 사용하는 소프트웨어. 캘린더, 메모장, 카메라, 게임 등</li>
<li><strong>인공지능 및 기계 학습 소프트웨어</strong>: 기계 학습 알고리즘 등을 사용하여 인간의 지능적인 역할을 수행하는 소프트웨어. 스피치 리코그니션, 언어 번역, 이미지 인식 등</li>
</ul>
<p>이처럼 소프트웨어는 우리 일상 생활에서 굉장히 많이 사용되고 있으며, 더욱 빠르고 효율적인 작업을 가능하게 해준다. </p>
</li>
</ul>
<br>

<h3 id="💡-소프트웨어-공학software-engineering이란">💡 소프트웨어 공학(Software Engineering)이란?</h3>
<ul>
<li><p>소프트웨어 공학이란? <strong>소프트웨어 개발 전체 생명주기(life cycle)</strong>에서 <u>요구사항 분석, 설계, 구현, 테스트, 유지보수 등과 같은 과정을 체계적으로 수행하며, 효율적이고 안정적인 소프트웨어를 개발하는 방법을 연구</u>한다.</p>
</li>
<li><p>소프트웨어 공학의 목표는 고품질의 소프트웨어를 효율적으로 개발하고, 비용과 시간을 절약하여 소프트웨어 프로젝트를 성공적으로 완료하는 것이다. 이를 위해 소프트웨어 개발자는 소프트웨어 개발 프로세스의 다양한 단계에서 공학적 기법과 원칙을 적용하여 소프트웨어의 품질을 향상시키고, 유지보수 가능성을 높이며, 프로젝트 일정과 예산을 준수할 수 있도록 해야한다. </p>
</li>
</ul>
<br>

<h3 id="💡-오늘날의-소프트웨어">💡 오늘날의 소프트웨어</h3>
<ul>
<li>소프트웨어 역할의 변화 <ul>
<li>비지니스 지원 역량에서 -&gt; 비지니스 자체 (핵심역량)으로 변화 </li>
</ul>
</li>
<li>고객, 사용자, 개발자의 변화 <ul>
<li>밀레니얼 세대. 세대별 특징 파악 필요</li>
</ul>
</li>
<li>더 많은 이해관계자, 개발 복잡도 증가<ul>
<li>융합기술 / 기업간 협력 / 산업간 협력 등</li>
</ul>
</li>
<li>컴퓨팅 환경의 복잡도 증가</li>
<li>오픈 아키텍쳐, 소프트웨어 플랫폼화를 통한 생태계 구축</li>
<li>유연한 소프트웨어, 외부서비스와의 간편한 통합</li>
<li>더 빨리, 더 자주 업데이트하는 소프트웨어</li>
<li>글로벌화, 시간과 공간에 대한 새로운 니즈 (24 * 7 * 365 서비스)</li>
</ul>
<p><strong><em>--&gt;  하지만, SW 프로젝트의 현주소는...</em></strong></p>
<ul>
<li>프로젝트 성공율은 약 14%정도 (대규모 프로젝트의 성공율은 약 6%정도) </li>
<li>실패요인 <ul>
<li>개발생산성에 비해 소프트웨어 복잡도가 급격히 증가 -&gt; 프로젝트의 비용, 시간 초과 ...</li>
</ul>
</li>
</ul>
<p><strong>_--&gt; SW 프로젝트가 성공하기 위해서는... _</strong></p>
<ul>
<li>** 소프트웨어 프로세스(Software Process = 일하는 방식)가 중요하다. ⭐️⭐️⭐️**<ul>
<li>제품 뿐 아니라, 소프트웨어 프로세스에 대한 평가가 중시되고 있음.</li>
</ul>
</li>
<li>소프트웨어 프로세스에 따른 체게적인 설계가 필요하다.<ul>
<li>실제 현업에서는 체계적이지 못한 경우가 매우 많음.. 처음으로 다시 돌아와서 다시 시작하는 경우도 많음.. </li>
</ul>
</li>
</ul>
<br>
<br>
<br>

<p>다음 게시물에서는 ** 소프트웨어 프로세스**에 대해 자세히 알아보자!!! </p>
<p>* _소프트웨어 공학을 공부하며 작성할 시리즈 입니다. 화이탱~! _</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | MySQL | “JOIN”]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-JOIN</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-JOIN</guid>
            <pubDate>Thu, 02 Mar 2023 05:41:23 GMT</pubDate>
            <description><![CDATA[<h1 id="join">JOIN</h1>
<h2 id="💎💎-lv2">💎💎 Lv2</h2>
<h3 id="조건에-맞는-도서와-저자-리스트-출력하기">조건에 맞는 도서와 저자 리스트 출력하기</h3>
<p>Q. &#39;경제&#39; 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. 
결과는 출판일을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT B.book_id, A.author_name, DATE_FORMAT(published_date, &quot;%Y-%m-%d&quot;) AS published_date 
FROM book B LEFT JOIN author A 
ON B.author_id = A.author_id
WHERE category=&quot;경제&quot; 
ORDER BY published_date;</code></pre>
<h3 id="상품-별-오프라인-매출-구하기">상품 별 오프라인 매출 구하기</h3>
<p>Q. PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT product_code, SUM(price*sales_amount) AS sales 
FROM offline_sale OS LEFT JOIN product P 
ON OS.product_id=P.product_id 
GROUP BY product_code ORDER BY 2 DESC, 1;</code></pre>
<h2 id="💎💎💎-lv3">💎💎💎 Lv3</h2>
<h3 id="없어진-기록찾기">없어진 기록찾기</h3>
<p>Q. 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT animal_id, name FROM animal_outs 
WHERE animal_id NOT IN (SELECT animal_id FROM animal_ins) ORDER BY animal_id;</code></pre>
<h3 id="있었는데요-없었습니다">있었는데요 없었습니다</h3>
<p>Q. 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.</p>
<pre><code class="language-sql">SELECT AI.animal_id, AI.name FROM animal_ins AI
LEFT JOIN animal_outs AO
ON AI.animal_id=AO.animal_id
WHERE AI.datetime &gt; AO.datetime
ORDER BY AI.datetime;</code></pre>
<h3 id="오랜-기간-보호한-동물1">오랜 기간 보호한 동물(1)</h3>
<p>Q. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.</p>
<pre><code class="language-sql">SELECT AI.name, AI.datetime 
FROM animal_ins AI LEFT JOIN animal_outs AO 
ON AI.animal_id=AO.animal_id 
WHERE AO.animal_id IS NULL 
ORDER BY AI.datetime LIMIT 3;</code></pre>
<h2 id="💎💎💎💎-lv4">💎💎💎💎 Lv4</h2>
<h3 id="그룹별-조건에-맞는-식당-목록-출력하기">그룹별 조건에 맞는 식당 목록 출력하기</h3>
<p>Q. MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT M.member_name, R.review_text, DATE_FORMAT(R.review_date, &quot;%Y-%m-%d&quot;)
FROM rest_review R LEFT JOIN member_profile M 
ON R.member_id = M.member_id 
WHERE R.member_id=(SELECT member_id FROM rest_review GROUP BY member_id ORDER BY COUNT(1) DESC LIMIT 1)
ORDER BY 3, 2;</code></pre>
<h3 id="특정기간동안-대여-가능한-자동차들의-대여비용-구하기">특정기간동안 대여 가능한 자동차들의 대여비용 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 &#39;세단&#39; 또는 &#39;SUV&#39; 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT C.car_id, C.car_type, ROUND((C.daily_fee/100)*(100-DP.discount_rate)*30) as fee
FROM (SELECT car_id 
        FROM car_rental_company_rental_history 
        GROUP BY car_id
        HAVING MAX(end_date)&lt;&#39;2022-11-01&#39;) AS H 
JOIN car_rental_company_car AS C
ON H.car_id = C.car_id
JOIN car_rental_company_discount_plan AS DP 
ON DP.car_type = C.car_type
WHERE C.car_type in (&quot;세단&quot;,&quot;SUV&quot;) AND DP.duration_type like &quot;30일%&quot;
AND (daily_fee/100)*(100-discount_rate)*30 between 500000 AND 2000000
ORDER BY fee DESC, car_type; </code></pre>
<h3 id="주문량이-많은-아이스크림들-조회하기">주문량이 많은 아이스크림들 조회하기</h3>
<p>Q. 7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT flavor FROM 
(SELECT * FROM first_half 
UNION ALL 
SELECT * FROM july) LIST
GROUP BY flavor 
ORDER BY SUM(total_order) DESC LIMIT 3;</code></pre>
<h3 id="5월-식품들의-총매출-조회하기">5월 식품들의 총매출 조회하기</h3>
<p>Q. FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT FO.product_id, FP.product_name,
SUM(FO.amount*FP.price) AS total_sales
FROM food_order FO JOIN food_product FP 
ON FO.product_id=FP.product_id 
WHERE DATE_FORMAT(produce_date,&quot;%Y-%m&quot;)=&quot;2022-05&quot; 
GROUP BY product_id ORDER BY 3 DESC, 1;</code></pre>
<h3 id="보호소에서-중성화한-동물">보호소에서 중성화한 동물</h3>
<p>Q. 보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT AI.animal_id, AO.animal_type, AO.name 
FROM animal_ins AI LEFT JOIN animal_outs AO 
ON AI.animal_id=AO.animal_id 
WHERE AI.sex_upon_intake LIKE &quot;intact%&quot; 
AND AO.sex_upon_outcome REGEXP &#39;Neutered|Spayed&#39; ORDER BY 1;</code></pre>
<h2 id="💎💎💎💎💎-lv5">💎💎💎💎💎 Lv5</h2>
<h3 id="상품을-구매한-회원-비율-구하기">상품을 구매한 회원 비율 구하기</h3>
<p>Q. USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT  YEAR(sales_date) AS year, MONTH(sales_date) as month,
        COUNT(DISTINCT user_id) AS puchased_users, 
        ROUND(
            COUNT(DISTINCT user_id) / 
            (SELECT COUNT(DISTINCT user_id) FROM user_info 
                    WHERE YEAR(joined)=2021),1) 
        AS puchased_ratio
FROM online_sale 
WHERE user_id IN (SELECT user_id FROM user_info WHERE YEAR(joined)=2021)
GROUP BY YEAR(sales_date), MONTH(sales_date)
ORDER BY 1,2</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | MySQL | “String, Date”]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-String-Date</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-String-Date</guid>
            <pubDate>Sat, 11 Feb 2023 09:57:46 GMT</pubDate>
            <description><![CDATA[<h1 id="string-date">String, Date</h1>
<h2 id="🌼-lv1">🌼 Lv1</h2>
<h3 id="자동차-대여-기록에서-장기단기-대여-구분하기">자동차 대여 기록에서 장기/단기 대여 구분하기</h3>
<p>Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 &#39;장기 대여&#39; 그렇지 않으면 &#39;단기 대여&#39; 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT history_id, car_id, DATE_FORMAT(start_date, &quot;%Y-%m-%d&quot;) AS start_date, 
        DATE_FORMAT(end_date, &quot;%Y-%m-%d&quot;) AS end_date, 
    CASE WHEN DATEDIFF(end_date, start_date)+1 &gt;= 30 
    THEN &quot;장기 대여&quot; 
    ELSE &quot;단기 대여&quot; 
    END AS rent_type
FROM car_rental_company_rental_history 
WHERE YEAR(start_date)=2022 AND MONTH(start_date)=9
ORDER BY history_id DESC;</code></pre>
<h3 id="특정-옵션이-포함된-자동차-리스트-구하기">특정 옵션이 포함된 자동차 리스트 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블에서 &#39;네비게이션&#39; 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT * FROM car_rental_company_car 
WHERE  options LIKE &quot;%네비게이션%&quot;
ORDER BY car_id DESC; </code></pre>
<h2 id="🌼🌼-lv2">🌼🌼 Lv2</h2>
<h3 id="이름에-el이-들어가는-동물-찾기">이름에 el이 들어가는 동물 찾기</h3>
<p>Q. 동물 보호소에 들어온 동물 이름 중, 이름에 &quot;EL&quot;이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.</p>
<pre><code class="language-sql">SELECT animal_id, name FROM animal_ins 
WHERE name LIKE &quot;%EL%&quot; AND animal_type=&quot;Dog&quot; ORDER BY name;</code></pre>
<h3 id="중성화-여부-파악하기">중성화 여부 파악하기</h3>
<p>Q. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 &#39;Neutered&#39; 또는 &#39;Spayed&#39;라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 &#39;O&#39;, 아니라면 &#39;X&#39;라고 표시해주세요.</p>
<pre><code class="language-sql">SELECT animal_id, name, 
CASE WHEN sex_upon_intake LIKE &quot;%Neutered%&quot; OR sex_upon_intake LIKE &quot;%Spayed%&quot; THEN &quot;O&quot;
ELSE &quot;X&quot;
END AS &quot;중성화&quot;
FROM animal_ins
ORDER BY animal_id; </code></pre>
<pre><code class="language-sql">SELECT animal_id, name, 
IF(sex_upon_intake REGEXP &#39;Neutered|Spayed&#39;, &#39;O&#39;, &#39;X&#39;) AS 중성화
FROM animal_ins 
ORDER BY animal_id;</code></pre>
<h3 id="루시와-엘라-찾기">루시와 엘라 찾기</h3>
<p>Q. 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT animal_id, name, sex_upon_intake
FROM animal_ins
WHERE name IN (&#39;Lucy&#39;, &#39;Ella&#39;, &#39;Pickle&#39;, &#39;Rogan&#39;, &#39;Sabrina&#39;, &#39;Mitty&#39;)
ORDER BY animal_id;</code></pre>
<h3 id="카테고리-별-상품-개수-구하기">카테고리 별 상품 개수 구하기</h3>
<p>Q. PRODUCT 테이블에서 상품 카테고리 코드(PRODUCT_CODE 앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT LEFT(product_code, 2) AS category, COUNT(product_id) AS products 
FROM product GROUP BY category ORDER BY category;</code></pre>
<h3 id="datetime에서-date로-형-변환">DATETIME에서 DATE로 형 변환</h3>
<p>Q. ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.</p>
<pre><code class="language-sql">SELECT animal_id, name, DATE_FORMAT(datetime, &quot;%Y-%m-%d&quot;) AS &quot;날짜&quot; 
FROM animal_ins ORDER BY animal_id;</code></pre>
<h3 id="자동차-평균-대여-기간-구하기">자동차 평균 대여 기간 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT car_id, ROUND(AVG(DATEDIFF(end_date, start_date)+1),1) AS average_duration 
FROM car_rental_company_rental_history
GROUP BY car_id HAVING average_duration &gt;= 7
ORDER BY 2 DESC, 1 DESC;</code></pre>
<h2 id="🌼🌼🌼-lv3">🌼🌼🌼 Lv3</h2>
<h3 id="오랜-기간-보호한-동물2">오랜 기간 보호한 동물(2)</h3>
<p>Q. 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.</p>
<pre><code class="language-sql">SELECT O.animal_id, O.name FROM animal_ins I 
INNER JOIN animal_outs O 
ON I.animal_id=O.animal_id 
ORDER BY DATEDIFF(O.datetime, I.datetime) DESC LIMIT 2;</code></pre>
<h3 id="조건별로-분류하여-주문상태-출력하기">조건별로 분류하여 주문상태 출력하기</h3>
<p>Q. FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT order_id, product_id, DATE_FORMAT(out_date, &quot;%Y-%m-%d&quot;) AS out_date,
CASE WHEN out_date &gt; &quot;2022-05-01&quot; THEN &quot;출고대기&quot;
WHEN out_date &lt;= &quot;2022-05-01&quot; THEN &quot;출고완료&quot; ELSE &quot;출고미정&quot; END AS &quot;출고여부&quot;
FROM food_order ORDER BY order_id;</code></pre>
<h3 id="대여-기록이-존재하는-자동차-리스트-구하기">대여 기록이 존재하는 자동차 리스트 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 &#39;세단&#39;인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT DISTINCT H.car_id FROM car_rental_company_rental_history H 
LEFT JOIN car_rental_company_car C 
ON H.car_id = C.car_id 
WHERE car_type=&quot;세단&quot; AND DATE_FORMAT(start_date,&quot;%Y-%m&quot;)=&quot;2022-10&quot; 
ORDER BY H.car_id DESC;</code></pre>
<h2 id="🌼🌼🌼🌼-lv4">🌼🌼🌼🌼 Lv4</h2>
<h3 id="자동차-대여-기록-별-대여-금액-구하기">자동차 대여 기록 별 대여 금액 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 &#39;트럭&#39;인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT HC.history_id, 
        ROUND(HC.daily_fee * (DATEDIFF(HC.end_date,HC.start_date)+1) * IFNULL(1-DP.discount_rate * 0.01, 1)) AS fee 
FROM 
    (SELECT H.history_id, H.start_date, H.end_date, C.daily_fee, C.car_type, 
    CASE WHEN DATEDIFF(end_date,start_date)+1 &gt;=90 THEN &quot;90일 이상&quot; 
    WHEN DATEDIFF(end_date,start_date)+1 &gt;=30 THEN &quot;30일 이상&quot; 
    WHEN DATEDIFF(end_date,start_date)+1 &gt;=7 THEN &quot;7일 이상&quot; END AS diff 
    FROM car_rental_company_rental_history H 
    LEFT JOIN car_rental_company_car C 
    ON H.car_id=C.car_id 
    WHERE C.car_type=&quot;트럭&quot;
) HC 
LEFT JOIN car_rental_company_discount_plan DP 
ON HC.diff=DP.duration_type AND DP.car_type=&quot;트럭&quot; 
ORDER BY fee DESC, history_id DESC;</code></pre>
<h3 id="취소되지-않은-진료-예약-조회하기">취소되지 않은 진료 예약 조회하기</h3>
<p>Q. PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT A.apnt_no, P.pt_name, P.pt_no, A.mcdp_cd, D.dr_name, A.apnt_ymd 
FROM patient P 
RIGHT JOIN appointment A ON P.pt_no = A.pt_no 
LEFT JOIN doctor D ON A.mddr_id = D.dr_id 
WHERE DATE_FORMAT(apnt_ymd,&quot;%Y-%m-%d&quot;)=&quot;2022-04-13&quot; 
AND apnt_cncl_yn=&quot;N&quot;
AND A.mcdp_cd=&quot;CS&quot;
ORDER BY apnt_ymd;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | MySQL | “GROUP BY”]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-GROUP-BY-e8q00uin</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-GROUP-BY-e8q00uin</guid>
            <pubDate>Thu, 09 Feb 2023 08:49:52 GMT</pubDate>
            <description><![CDATA[<h1 id="group-by">GROUP BY</h1>
<h2 id="🌱-lv2">🌱 Lv2.</h2>
<h3 id="진료과별-총-예약-횟수-출력하기">진료과별 총 예약 횟수 출력하기</h3>
<p>Q. APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요. 이때, 컬럼명은 &#39;진료과 코드&#39;, &#39;5월예약건수&#39;로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT mcdp_cd AS &quot;진료과 코드&quot;, COUNT(mcdp_cd) AS &quot;5월예약건수&quot; 
FROM appointment 
WHERE MONTH(apnt_ymd)=&quot;05&quot; AND YEAR(apnt_ymd)=&quot;2022&quot; 
AND (apnt_cncl_yn =&quot;N&quot; OR apnt_cncl_yn IS NULL) 
GROUP BY mcdp_cd ORDER BY 2,1</code></pre>
<h3 id="성분으로-구분한-아이스크림-총-주문량">성분으로 구분한 아이스크림 총 주문량</h3>
<p>Q.상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.</p>
<pre><code class="language-sql">SELECT ingredient_type, SUM(total_order) AS total_order 
FROM first_half F LEFT JOIN icecream_info I 
ON F.flavor=I.flavor 
GROUP BY ingredient_type ORDER BY 2;</code></pre>
<h3 id="자동차-종류별-특정-옵션이-포함된-자동차-수-구하기">자동차 종류별 특정 옵션이 포함된 자동차 수 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블에서 &#39;통풍시트&#39;, &#39;열선시트&#39;, &#39;가죽시트&#39; 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요. </p>
<pre><code class="language-sql">SELECT car_type, COUNT(car_type) AS CARS FROM car_rental_company_car 
WHERE options LIKE &quot;%통풍시트%&quot; OR options LIKE &#39;%열선시트%&#39; OR options LIKE &#39;%가죽시트%&#39; 
GROUP BY car_type ORDER BY 1;

SELECT car_type, COUNT(car_type) AS CARS FROM car_rental_company_car 
WHERE options REGEXP (&#39;통풍시트|열선시트|가죽시트&#39;)
GROUP BY car_type ORDER BY car_type ASC;</code></pre>
<h3 id="고양이와-개는-몇-마리-있을까">고양이와 개는 몇 마리 있을까</h3>
<p>Q. 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.</p>
<pre><code class="language-sql">SELECT animal_type, COUNT(animal_type) FROM animal_ins 
GROUP BY animal_type 
ORDER BY FIELD (ANIMAL_TYPE, &#39;Cat&#39;,&#39;Dog&#39;)</code></pre>
<h3 id="입양-시각-구하기1">입양 시각 구하기(1)</h3>
<p>Q. 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.</p>
<pre><code class="language-sql">SELECT HOUR(datetime) AS hour, COUNT(datetime) AS count FROM animal_outs 
WHERE HOUR(datetime) BETWEEN 9 AND 19 
GROUP BY hour ORDER BY 1;</code></pre>
<h3 id="동명-동물-수-찾기">동명 동물 수 찾기</h3>
<p>Q. 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.</p>
<pre><code class="language-sql">SELECT name, COUNT(name) AS count FROM animal_ins 
GROUP BY name HAVING COUNT(name)&gt;1 ORDER BY name; </code></pre>
<h3 id="가격대-별-상품-개수-구하기">가격대 별 상품 개수 구하기</h3>
<p>Q. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT TRUNCATE(ct_id) AS products FROM product 
GROUP BY price_group ORDER BY price_group; </code></pre>
<h2 id="☘️-lv3">☘️ Lv3.</h2>
<h3 id="카테고리-별-도서-판매량-집계하기">카테고리 별 도서 판매량 집계하기</h3>
<p>Q. 2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요. 
결과는 카테고리명을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT category, SUM(sales) AS total_sales 
FROM book B LEFT JOIN book_sales S ON B.book_id = S.book_id 
WHERE MONTH(sales_date)=&quot;1&quot; AND YEAR(sales_date)=&quot;2022&quot; 
GROUP BY category ORDER BY 1;</code></pre>
<h3 id="즐겨찾기가-가장-많은-식당-정보-출력하기">즐겨찾기가 가장 많은 식당 정보 출력하기</h3>
<p>Q. REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT food_type, rest_id, rest_name, favorites FROM rest_info A 
WHERE favorites = (SELECT MAX(favorites) FROM rest_info B where A.food_type = B.food_type)
GROUP BY food_type ORDER BY food_type DESC;</code></pre>
<h3 id="대여-횟수가-많은-자동차들의-월별-대여-횟수-구하기">대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.</p>
<pre><code class="language-sql">SELECT MONTH(start_date) AS MONTH, car_id, COUNT(*) AS RECORDS
FROM car_rental_company_rental_history
WHERE (MONTH(start_date) BETWEEN 8 AND 10) 
AND car_id IN (
    SELECT car_id
    FROM car_rental_company_rental_history
    WHERE MONTH(start_date) BETWEEN 8 AND 10 GROUP BY CAR_ID HAVING COUNT(*)&gt;=5
)
GROUP BY 1, 2
ORDER BY 1 ASC, 2 DESC</code></pre>
<h3 id="자동차-대여기록에서-대여가능-여부-구분하기">자동차 대여기록에서 대여가능 여부 구분하기</h3>
<p>Q. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 &#39;대여중&#39; 이라고 표시하고, 대여 중이지 않은 자동차인 경우 &#39;대여 가능&#39;을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 &#39;대여중&#39;으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT car_id, 
      MAX(IF(&quot;2022-10-16&quot; BETWEEN start_date AND end_date, &quot;대여중&quot;, &quot;대여 가능&quot;)) AS AVAILABILITY
FROM car_rental_company_rental_history
GROUP BY car_id
ORDER BY car_id DESC;</code></pre>
<h2 id="🍀-lv4">🍀 Lv4.</h2>
<h3 id="입양-시각-구하기2">입양 시각 구하기(2)</h3>
<p>Q. 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.</p>
<pre><code class="language-sql">SET @i = -1;
SELECT (@i := @i + 1) AS HOUR
        , (SELECT COUNT(*) 
           FROM animal_outs 
           WHERE HOUR(datetime) = @i) AS COUNT
FROM animal_outs
WHERE @i &lt; 23;</code></pre>
<pre><code class="language-sql">WITH RECURSIVE temp AS(
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1 FROM temp WHERE HOUR&lt;23
)

SELECT HOUR, COUNT(animal_id) AS COUNT 
FROM animal_outs A RIGHT JOIN temp T ON HOUR(A.datetime)=T.HOUR 
GROUP BY HOUR ;</code></pre>
<h3 id="년-월-성별-별-상품-구매-회원-수-구하기">년, 월, 성별 별 상품 구매 회원 수 구하기</h3>
<p>Q. USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요. </p>
<pre><code class="language-sql">SELECT YEAR(sales_date) AS year, MONTH(sales_date) AS month, 
        gender, COUNT(DISTINCT OS.user_id) AS users 
FROM user_info UI RIGHT JOIN online_sale OS 
ON UI.user_id=OS.user_id
WHERE gender IS NOT NULL
GROUP BY 1,2,3
ORDER BY 1,2,3;  </code></pre>
<h3 id="식품분류별-가장-비싼-식품의-정보-조회하기">식품분류별 가장 비싼 식품의 정보 조회하기</h3>
<p>Q. FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 &#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT category, price AS max_price, product_name FROM food_product A
WHERE category IN (&#39;과자&#39;, &#39;국&#39;, &#39;김치&#39;, &#39;식용유&#39;) AND
price IN (SELECT MAX(price) FROM food_product B GROUP BY category)
GROUP BY category 
ORDER BY price DESC;</code></pre>
<h3 id="저자-별-카테고리-별-매출액-집계하기">저자 별 카테고리 별 매출액 집계하기</h3>
<p>Q. 2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요. 
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT A.author_id, author_name, category, SUM(sales*price) AS total_sales
FROM book_sales BS 
LEFT JOIN book B ON B.book_id=BS.book_id 
LEFT JOIN author A ON A.author_id=B.author_id 
WHERE YEAR(sales_date)=2022 AND MONTH(sales_date)=1 
GROUP BY author_id, category
ORDER BY author_id, category DESC;</code></pre>
<h2 id="🌟regexp-정규표현식">🌟REGEXP 정규표현식</h2>
<h4 id="-matching">* Matching</h4>
<ul>
<li><p>| : 구분된 문자에 해당하는 문자열을 찾음.</p>
<pre><code class="language-sql">data REGEXP (&#39;예시1|예시2|예시3&#39;)
=
data like &#39;%예시1%&#39; OR data like &#39;%예시2%&#39;OR data like &#39;%예시3%&#39;</code></pre>
</li>
<li><p>^ : 시작하는 문자열을 찾음.    </p>
</li>
<li><p>$ : 끝나는 문자열을 찾음.        </p>
<pre><code class="language-sql">data REGEXP (&#39;^시작1|^시작2|끝$&#39;)
=
data like &#39;시작1%&#39; OR data like &#39;시작2%&#39;OR data like &#39;%끝&#39;</code></pre>
</li>
<li><p>[  ] : [ ]안에 나열된 패턴에 해당하는 문자열을 찾음.</p>
<pre><code class="language-sql">data REGEXP (&#39;[123]d&#39;)
=
data like &#39;%1d%&#39; OR data like &#39;%2d%&#39;OR data like &#39;%3d%&#39;</code></pre>
</li>
<li><p>. : 문자길이가 .의 개수 이상인 문자열을 찾음 </p>
<pre><code class="language-sql">data REGEXP (&#39;...&#39;)
=
CHAR_LENGTH(data) &gt;= 3 </code></pre>
</li>
</ul>
<h4 id="-times">* Times</h4>
<ul>
<li>* : 0회 이상 나타나는 문자, &quot;a*&quot; -&gt; &#39;a&#39;, &#39;b&#39;, &#39;aa&#39;</li>
<li>+ : 1회 이상 나타나는 문자, &quot;찌개+&quot;-&gt; &quot;김치찌개&quot;, &quot;된장찌개&quot;  </li>
<li>{m, n} : m회 이상 n회 이하 나타나는 문자, &quot;치{1,2}&quot; -&gt; &quot;치커리&quot;, &quot;치카치카&quot;</li>
<li>? : 0-1회 나타나는 문자, &quot;[가나다]?&quot; -&gt; &quot;가오리&quot;, &quot;나비&quot;, &quot;다람쥐&quot;, &quot;코끼리&quot;</li>
</ul>
<h4 id="-group">* Group</h4>
<ul>
<li>[A-z] or [:alpha:] or \a : 알파벳 대소문자 중 한개이상 포함된 문자열을 찾음. </li>
<li>[0-9] or [:digit:] or \d : 한개이상 숫자가 들어가는 문자열 찾음. </li>
</ul>
<h4 id="-not">* Not</h4>
<ul>
<li>[^문자] : 괄호 안에 문자를 포함하지 않은 문자열을 찾음. &quot;[^가나다]&quot; -&gt; &quot;가오리&quot;, &quot;나비&quot;, &quot;다람쥐&quot; 모두 제외됨.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | MySQL | “SUM, MAX, MIN” | “IS NULL”]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-SUM-MAX-MIN-IS-NULL</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-SUM-MAX-MIN-IS-NULL</guid>
            <pubDate>Thu, 02 Feb 2023 05:34:08 GMT</pubDate>
            <description><![CDATA[<h1 id="sum-max-min">SUM, MAX, MIN</h1>
<h2 id="🎈-lv1">🎈 Lv1.</h2>
<h3 id="최댓값-구하기">최댓값 구하기</h3>
<p>Q. PRODUCT 테이블에서 판매 중인 상품 중 가장 높은 판매가를 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 MAX_PRICE로 지정해주세요.</p>
<pre><code class="language-sql">SELECT MAX(price) AS max_price FROM product;</code></pre>
<h2 id="🎈🎈-lv2">🎈🎈 Lv2.</h2>
<h3 id="최솟값-구하기">최솟값 구하기</h3>
<p>Q. 동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT MIN(datetime) FROM animal_ins;</code></pre>
<h3 id="가격이-제일-비싼-식품의-정보-출력하기">가격이 제일 비싼 식품의 정보 출력하기</h3>
<p>Q. FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.</p>
<pre><code class="language-sql">
SELECT * FROM food_product WHERE price = (SELECT MAX(price) FROM food_product);

SELECT * FROM food_product ORDER BY price DESC LIMIT 1; </code></pre>
<p>** LIMIT 1을 사용한다면 만약에 PRICE가 동일한 데이터가 여러 개라면 그 중에 ROWNUM이 1인 한 건만 표시됩니다.  MAX함수를 사용하면 해당 테이블에서 조건이 PRICE 컬럼이 가장 큰 모든 건수가 조회되므로 결과가 달라질 수 있어 구분해서 사용해야 한다고 생각합니다.</p>
<h3 id="동물-수-구하기">동물 수 구하기</h3>
<p>Q. 동물 보호소에서 컨디션이  Normal인 동물은 몇 마리인지 조회하는 SQL문을 작성해주세요. </p>
<pre><code class="language-sql">SELECT COUNT(*) FROM animal_ins WHERE intake_condition=&quot;Normal&quot;;</code></pre>
<h3 id="중복-제거하기">중복 제거하기</h3>
<p>Q. 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.</p>
<pre><code class="language-sql">SELECT COUNT(DISTINCT(name)) AS count FROM animal_ins WHERE name IS NOT NULL;</code></pre>
<h1 id="is-null">IS NULL</h1>
<h2 id="🏓-lv1">🏓 Lv1.</h2>
<h3 id="경기도에-위치한-식품창고-목록-출력하기">경기도에 위치한 식품창고 목록 출력하기</h3>
<p>Q. FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, &#39;N&#39;으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT warehouse_id, warehouse_name, address, IFNULL(freezer_yn,&quot;N&quot;) AS freezer_yn 
FROM food_warehouse 
WHERE address LIKE &quot;경기도%&quot; ORDER BY warehouse_id;</code></pre>
<h3 id="이름이-있는--없는-동물의-아이디">이름이 있는 / 없는 동물의 아이디</h3>
<p>Q. 동물 보호소에 들어온 동물 중, 이름이 없는 채로(/이름이 있는) 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.</p>
<pre><code class="language-sql">SELECT animal_id FROM animal_ins WHERE name IS NULL ORDER BY animal_id;

SELECT animal_id FROM animal_ins WHERE name IS NOT NULL ORDER BY animal_id;</code></pre>
<h3 id="나이-정보가-없는-회원-수-구하기">나이 정보가 없는 회원 수 구하기</h3>
<p>Q. USER_INFO 테이블에서 나이 정보가 없는 회원이 몇 명인지 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 USERS로 지정해주세요.</p>
<pre><code class="language-sql">SELECT COUNT(*) AS users FROM user_info WHERE age IS NULL;</code></pre>
<h2 id="🏓🏓-lv2">🏓🏓 Lv2.</h2>
<h3 id="null처리하기">NULL처리하기</h3>
<p>Q. 입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 &quot;No name&quot;으로 표시해 주세요.</p>
<pre><code class="language-sql">SELECT animal_type, IFNULL(name,&quot;No name&quot;), sex_upon_intake FROM animal_ins ORDER BY animal_id;</code></pre>
<h2 id="🌟정리">🌟정리</h2>
<pre><code class="language-sql"># IFNULL - NULL값 대체
IFNULL(컬럼명,&quot;대체값&quot;)

# NULL인 열 찾기
WHERE 컬럼명 IS NULL

# NULL이 아닌 열 찾기
WHERE 컬럼명 IS NOT NULL</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | MySQL | “SELECT”]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-SELECT</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-MySQL-SELECT</guid>
            <pubDate>Thu, 02 Feb 2023 01:55:52 GMT</pubDate>
            <description><![CDATA[<h1 id="select">SELECT</h1>
<h2 id="🍏-lv1">🍏 Lv1.</h2>
<h3 id="상위-n개-레코드">상위 n개 레코드</h3>
<p>Q. 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql"> SELECT name FROM animal_ins ORDER BY datetime LIMIT 1;</code></pre>
<h3 id="여러-기준으로-정렬하기">여러 기준으로 정렬하기</h3>
<p>Q. 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.</p>
<pre><code class="language-sql">SELECT animal_id, name, datetime FROM animal_ins ORDER BY name, datetime DESC;</code></pre>
<h3 id="특정-컬럼의-특정값-제외-혹은-포함">특정 컬럼의 특정값 제외 혹은 포함</h3>
<pre><code class="language-sql">SELECT animal_id, name FROM animal_ins WHERE intake_condition NOT IN (&quot;Aged&quot;); 

SELECT animal_id, name FROM animal_ins WHERE intake_condition != &quot;Aged&quot;; 

SELECT animal_id, name FROM animal_ins WHERE intake_condition = &quot;sick&quot;; </code></pre>
<h3 id="조건에-맞는-회원수-구하기">조건에 맞는 회원수 구하기</h3>
<p>Q. USER_INFO 테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT count(*) as USERS FROM user_info 
WHERE (age BETWEEN 20 AND 29) AND (joined BETWEEN &quot;2021-01-01&quot; AND &quot;2021-12-31&quot;); </code></pre>
<h3 id="평균-일일-대여-요금-구하기">평균 일일 대여 요금 구하기</h3>
<p>Q. CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 &#39;SUV&#39;인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.</p>
<pre><code class="language-sql">SELECT ROUND(AVG(daily_fee),0) as average_fee FROM car_rental_company_car WHERE car_type = &#39;SUV&#39;;</code></pre>
<h3 id="인기있는-아이스크림">인기있는 아이스크림</h3>
<p>Q. 상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT flavor FROM first_half ORDER BY total_order DESC, shipment_id;</code></pre>
<h3 id="흉부외과-또는-일반외과-의사-목록-출력하기">흉부외과 또는 일반외과 의사 목록 출력하기</h3>
<p>Q. DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT dr_name, dr_id, mcdp_cd, DATE_FORMAT(hire_ymd, &quot;%Y-%m-%d&quot;) AS hire_ymd 
FROM doctor WHERE mcdp_cd IN (&quot;CS&quot;,&quot;GS&quot;) ORDER BY hire_ymd DESC, dr_name ASC; </code></pre>
<h3 id="강원도에-위치한-생산공장-목록-출력하기">강원도에 위치한 생산공장 목록 출력하기</h3>
<p>Q. FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT factory_id, factory_name, address FROM food_factory 
WHERE address LIKE &quot;%강원도%&quot; ORDER BY factory_id ASC;</code></pre>
<h3 id="조건에-맞는-도서-리스트-출력하기">조건에 맞는 도서 리스트 출력하기</h3>
<p>Q. BOOK 테이블에서 2021년에 출판된 &#39;인문&#39; 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요. 
결과는 출판일을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT book_id, DATE_FORMAT(published_date, &quot;%Y-%m-%d&quot;) AS published_date FROM book 
WHERE category=&quot;인문&quot; AND YEAR(published_date)=‘2021’ ORDER BY published_date;</code></pre>
<h3 id="null값-대체">NULL값 대체</h3>
<p>Q. PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, &#39;NONE&#39;으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT pt_name, pt_no, gend_cd, age, IFNULL(tlno,&quot;NONE&quot;) FROM patient 
WHERE age &lt;= 12 AND gend_cd=&quot;W&quot; ORDER BY age DESC, pt_name ASC; </code></pre>
<h3 id="과일로-만든-아이스크림-고르기">과일로 만든 아이스크림 고르기</h3>
<p>Q. 상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.</p>
<pre><code class="language-sql">SELECT A.flavor FROM first_half A LEFT JOIN icecream_info B ON A.flavor = B.flavor 
WHERE total_order &gt;=3000 AND ingredient_type=&quot;fruit_based&quot; ORDER BY total_order DESC;</code></pre>
<h2 id="🍏🍏-lv-2">🍏🍏 Lv 2.</h2>
<h3 id="재구매가-일어난-상품과-회원-리스트-구하기">재구매가 일어난 상품과 회원 리스트 구하기</h3>
<p>Q. ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT user_id, product_id FROM online_sale 
GROUP BY user_id, product_id HAVING COUNT(*)&gt;=2 ORDER BY user_id ASC, product_id DESC;</code></pre>
<h3 id="3월에-태어난-여성회원-목록-출력하기">3월에 태어난 여성회원 목록 출력하기</h3>
<p>Q. MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT member_id, member_name, gender, DATE_FORMAT(date_of_birth,&quot;%Y-%m-%d&quot;) AS date_of_birth FROM member_profile 
WHERE gender=&quot;W&quot; AND MONTH(date_of_birth)=&quot;03&quot; AND tlno IS NOT NULL; </code></pre>
<h2 id="🍏🍏🍏🍏--lv4">🍏🍏🍏🍏  Lv4.</h2>
<h3 id="서울에-위치한-식당-목록-출력하기">서울에 위치한 식당 목록 출력하기</h3>
<p>Q. REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT I.rest_id, I.rest_name, I.food_type, I.favorites, I.address, ROUND(AVG(R.review_score),2) as score 
FROM rest_info I LEFT JOIN rest_review R 
ON I.rest_id = R.rest_id 
WHERE address LIKE &quot;서울%&quot; GROUP BY R.rest_id HAVING score IS NOT NULL 
ORDER BY score DESC,favorites DESC;</code></pre>
<h3 id="오프라인--온라인-판매-데이터-통합하기">오프라인 / 온라인 판매 데이터 통합하기</h3>
<p>Q. ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.</p>
<pre><code class="language-sql">SELECT DATE_FORMAT(sales_date, &quot;%Y-%m-%d&quot;) as sales_date, product_id, user_id, sales_amount FROM online_sale 
WHERE MONTH(sales_date)=&quot;03&quot; AND YEAR(sales_date)=&quot;2022&quot;
UNION
SELECT DATE_FORMAT(sales_date, &quot;%Y-%m-%d&quot;) AS sales_date, product_id,NULL AS user_id, sales_amount FROM offline_sale 
WHERE MONTH(sales_date)=&quot;03&quot; AND YEAR(sales_date)=&quot;2022&quot;
ORDER BY sales_date, product_id, user_id;</code></pre>
<h2 id="🌟정리">🌟정리</h2>
<pre><code class="language-sql"># DATE_FORMAT
DATE_FORMAT(sales_date, &quot;%Y-%m-%d&quot;)  // 2023-01-10

# DATE YEAR, MONTH
YEAR(published_date)=&quot;2021&quot;
MONTH(sales_date)=&quot;03&quot;

# 반올림, 버림 (소수점 n 자리까지 반올림/버림)
ROUND(숫자,반올림할 자릿수 n)  
  // ROUND(1234.5678 ,2) // 1234.57 
TRUNCATE(숫자,버릴 자릿수 n)   
  // ROUND(1234.5678 ,-2) // 1200  

# BETWEEN 범위
BETWEEN 20 AND 29
BETWEEN &quot;2021-01-01&quot; AND &quot;2021-12-31&quot;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQLP] 1-1데이터 모델링의 이해 ]]></title>
            <link>https://velog.io/@isitcake_yes/SQLP-1-1%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@isitcake_yes/SQLP-1-1%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Mon, 09 Jan 2023 07:49:44 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터-모델링의-이해">1. 데이터 모델링의 이해</h1>
<h2 id="1-1-데이터-모델링의-이해">1-1. 데이터 모델링의 이해</h2>
<h2 id="📂-데이터-모델의-이해">📂 데이터 모델의 이해</h2>
<h3 id="1-모델링의-이해">1. 모델링의 이해</h3>
<ul>
<li><p>모델링이란? 복잡한 현실세계를 추상화, 단순화 명확화하기 위해 일정한 표기법에 의해 표현하는 기법</p>
</li>
<li><p>모델링의 특징</p>
<ul>
<li>1) <strong>추상화</strong> : 현실세계를 일정한 형식에 맞추어 표현을 한다는 의미</li>
<li>2) <strong>단순화</strong> : 복잡한 현실세계를 약속된 규약에 의해 제한된 언어로 표현하여 쉽게 이해 할 수 있도록 한다는 의미</li>
<li>3) <strong>명확화</strong> : 누구나 이해하기 쉽도록 애매모호함을 제거하고 정확하게 현상을 기술한다는 의미 </li>
</ul>
</li>
<li><p>모델링의 3가지 관점</p>
<ul>
<li>1) <strong>데이터 관점</strong> : 업무와 데이터의 관계 또는 데이터 간의 관계에 대해 모델링 (Data, What) -&gt; 이 장의 중심</li>
<li>2) <strong>프로세스 관점</strong> : 업무가 실제하고 있는 일이 무엇인지 또는 무엇을 해야 하는지 모델링 (Process, How)</li>
<li>3) <strong>데이터와 프로세스의 상관관점</strong> : 업무가 처리하는 일의 방법에 따라 데이터가 어떻게 영향을 받는지 모델링 (Interaction)</li>
</ul>
</li>
</ul>
<h3 id="2-데이터-모델링의-기본-개념">2. 데이터 모델링의 기본 개념</h3>
<ul>
<li><p><strong>데이터 모델링</strong>이란? </p>
<ul>
<li>정보시스템을 구축하기 위한 데이타관점의 업무 분석 기법</li>
<li>현실세계의 데이타(what)에 대해 약속된 표기법에 의해 표현하는 과정</li>
<li>데이터베이스를 구축하기 위한 분석/설계의 과정</li>
</ul>
</li>
<li><p>데이터 모델이 제공하는 기능</p>
<ul>
<li>시스템 가시화 / 시스템 명세화 / 구조화된 틀 제공 / 문서화 / 세부사항 숨기는 관점 제공 </li>
</ul>
</li>
<li><p><strong>데이터 모델링의 중요성</strong></p>
<ul>
<li><p>1) 파급효과 : 데이터 구조 변경에 의해 많은 영향이 갈 수 있다. </p>
</li>
<li><p>2) 복잡한 정보 요구사항의 간결한 표현 : 데이터 모델은 구축할 시스템의 정보 요구사항과 한계를 가장 명확하고 간결하게 표현할 수 있는 도구임.  (예를 들면 건축물의 설계도면)</p>
</li>
<li><p>3) 데이터 품질 (Data Quality) : 데이터 구조가 데이터의 품질을 결정하는 중요한 요소이기 때문에 모델링시 유의해야 한다. </p>
<ul>
<li>중복 유의 / 비유연성 유의 (프로세스 변화에도 데이터모델이 변경되지 않을 수 있도록 유연하게 설계) / 비일관성 유의 (데이터 상호 연관관계에 대한 명확한 정의가 필요) </li>
</ul>
</li>
</ul>
</li>
<li><p><strong>데이터 모델링의 3가지 요소</strong></p>
<ul>
<li>1) 어떤 것 (엔터티, Things)  / 2) 어떤 것의 성격(Attributes) / 3) 어떤 것 간의 관계(Relationship) </li>
<li><table>
<thead>
<tr>
<th align="center">복수</th>
<th align="center">단수</th>
</tr>
</thead>
<tbody><tr>
<td align="center">엔터티 (ex. 과목)</td>
<td align="center">인스턴스 (ex. 수학,영어)</td>
</tr>
<tr>
<td align="center">- ex. 과목은 엔터티에 해당하고, 수학,영어는 &#39;과목&#39;이라는 엔터티의 인스턴스이다.</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">### 3. 데이터 모델링의 3단계 진행</td>
<td align="center"></td>
</tr>
</tbody></table>
</li>
</ul>
</li>
<li><p>개념적 모델링 -&gt; 논리적 모델링 -&gt; 물리적 모델링</p>
</li>
<li><p>1) 개념적 모델링 : 사용자와 개발자가 데이터 요구사항을 발견하는 것 지원. 추상적이므로 상위 문제에 대한 구조화 가능. 전 조직에 걸쳐 이루어진다면, 전사적 데이터 모델이라고도 불림. </p>
</li>
<li><p>2) 논리적 모델링 : 데이터 설계 프로세스의 Input으로써, 논리적인 구조와 규칙을 명확하게 표현. 식별자 확정, 정규화, M:M관계 해소, 참조 무결성 규칙 정의 등으로 신뢰성 있는 데이터구조 얻음.</p>
</li>
<li><p>3) 물리적 모델링 : 논리 데이터 모델이 어떻게 하드웨어에 표현될 것인지 다룸(=물리적 스키마). </p>
</li>
<li><p>프로젝트 생명주기(life cycle)에서 데이터 모델링</p>
<ul>
<li>프로젝트 생명주기 : 분석(논리적/개념적 모델링 과정 포함) -&gt; 설계(물리적 모델링 포함) -&gt; 개발 -&gt; 테스트 -&gt; 전환/이행 </li>
</ul>
</li>
</ul>
<h3 id="4-데이터-독립성">4. 데이터 독립성</h3>
<ul>
<li><p>데이터 독립성의 필요성</p>
<ul>
<li>1) 유지보수 비용증가 / 2) 데이터 중복성 증가 / 3) 데이터 복잡도 증가 / 4) 요구사항 대응 저하</li>
</ul>
</li>
<li><p>데이터 독립성 모델(ANSI/SPARC)의 3단계 구조</p>
<ul>
<li>1) 내부적 단계[내부스키마] -- (물리적 데이터 독립성) --&gt; 2) 개념적 단계[개념스키마] -- (논리적 데이터 독립성) --&gt; 외부 단계[외부스키마]<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/d8d454c6-ec5a-4fd3-bc0b-18a139c90aca/image.png" align="left"></li>
</ul>
</li>
<li><table>
<thead>
<tr>
<th align="center">항목</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">외부스키마</td>
<td align="center">사용자 관점으로 구성. 접근하는 특성에 따른 스키마 구성</td>
</tr>
<tr>
<td align="center">개념스키마</td>
<td align="center">모든 사용자 관점을 통합한 조직 전체의 DB 기술함. DB에 저장되는 데이터와 관계를 표현하는 스키마.</td>
</tr>
<tr>
<td align="center">내부스키마</td>
<td align="center">DB가 물리적으로 저장되는 방법을 표현하는 스키마</td>
</tr>
<tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">논리적 독립성</td>
<td align="center">개념스키마가 변경되어도 외부스키마에 영향 없도록. 사용자 특성에 맞는 변경 가능. 통합구조 변경가능.</td>
</tr>
<tr>
<td align="center">물리적 독립성</td>
<td align="center">내부스키마가 변경되어도 외부/개념스키마에 영향 없도록.</td>
</tr>
</tbody></table>
</li>
</ul>
</li>
</ul>
<h3 id="5-데이터-모델의-표기법-erd">5. 데이터 모델의 표기법 ERD</h3>
<ul>
<li>ERD 작업 순서 : ① 엔터티를 그린다.           → ② 엔터티를 적절하게 배치한다 → ③ 엔터티간 관계를 설정한다.  → ④ 관계명을 기술한다.  → ⑤ 관계의 참여도를 기술한다.  → ⑥ 관계의 필수 여부를 기술한다.</li>
<li>엔터티(사각형), 관계(마름모), IE표기법 혹은 Baker표기법 주로 사용</li>
</ul>
<h3 id="6-좋은-데이터-모델의-요소">6. 좋은 데이터 모델의 요소</h3>
<ul>
<li>1) 완전성(Completeness) : 업무에 필요로 하는 모든 데이터가 데이터 모델에 정의</li>
<li>2) 중복배제(Non-Redundancy) : DB에 동일한 사실은 반드시 한번만 기록 (ex. 나이, 생년월일은 데이터 중복)</li>
<li>3) 업무규칙(Business Rules) : 업무규칙을 데이터 모델로 표현하고 모든 사용자가 공유할 수 
있도록 제공</li>
<li>4) 데이터 재사용(Data Reusablity) : 데이터의 통합성과 독립성에 대해서 충분히 고려</li>
<li>5) 의사소통(Communication) : 데이터의 모델은 진정한 의사소통의 도구로서의 역할을 한다.</li>
<li>6) 통합성(Integration) : 동일한 데이터는 조직의 전체에서 한번만 정의되고 이를 여러 다른 영역에서 참조, 활용</li>
</ul>
<hr>
<h2 id="📂-엔터티">📂 엔터티</h2>
<h3 id="1-엔터티entity의-개념">1. 엔터티(Entity)의 개념</h3>
<ul>
<li>사람, 장소, 물건, 사건, 개념 등의 명사에 해당한다.</li>
<li>업무상 관리가 필요한 관심사에 해당한다.</li>
<li>저장이 되기 위한 어떤 것(Thing)이다.</li>
</ul>
<h3 id="2-엔터티의-특징">2. 엔터티의 특징</h3>
<ul>
<li>반드시 해당 업무에서 필요하고 관리하고자 하는 정보이어야 한다.</li>
<li>유일한 식별자에 의해 식별이 가능해야 한다.</li>
<li>영속적으로 존재하는 인스턴스의 집합이어야 한다.
(한개가 아닌 두개 이상의 row)</li>
<li>엔터티는 업무 프로세스에 의해 이용되어야 한다.</li>
<li>엔터티는 반드시 속성이 있어야 한다.
(주식별자만 존재하는 엔터티도 부적절. 단, 관계엔터티는 주식별자만 갖고 있어도 엔터티로 인정함)</li>
<li>엔터티는 다른 엔터티와 최소 한 개 이상의 관계가 있어야 한다.
(단, 통계성 엔터티, 코드성 엔터티(읽기효율성↓), 시스템 처리 내부 엔터티 도출의 경우 제외)</li>
<li><em>명명 : 현업용어 사용 / 약어 사용하지 않기 / 단수명사 사용 / 모든 엔터티 유일한 이름 / 엔터티 생성 의미대로 부여</em><h3 id="3-엔터티의-분류">3. 엔터티의 분류</h3>
<ul>
<li>유무형에 따른 분류</li>
<li><strong>유형엔터티</strong>(사원, 물품) : 물리적인 형태가 있고, 안정적이며 지속적으로 활용되는 엔터티</li>
<li><strong>개념엔터티</strong>(조직, 보험상품) : 물리적인 형태가 존재하지 않고, 관리해야할 개념적 정보로 
 구분이 되는 엔터티</li>
<li><strong>사건엔터티</strong>(주문, 청구, 미납) : 업무를 수행함에 따라 발생되는 엔터티로서 비교적 발생량이 많으며 각종 통계자료에 이용</li>
</ul>
</li>
</ul>
<ul>
<li>발생시점에 따른 분류<ul>
<li><strong>기본엔터티</strong>(상품, 사원, 부서) : 그 업무에 원래 존재하는 정보로서 다른 엔터티와 관계에 의해 생성되지않고 독립적으로 생성이 가능하고 자신은 타 엔터티의 부모의 역할을 한다. 다른 엔터티로부터 주식별자를 상속받지않고 &quot;자신의 고유한 주식별자&quot;를 가짐.</li>
<li><strong>중심엔터티</strong>(계약, 접수, 주문) : &quot;기본 엔터티&quot;로부터 발생되고 그 업무에 있어서 중심적인 역할을 한다. 데이터의 양이 많이 발생한다.</li>
<li><strong>행위엔터티</strong>(거래내역, 주문내역, 변경이력) : &quot;두개 이상의 부모 엔터티&quot;로부터 발생되고, 자주 내용이 바뀌거나 데이터량이 증가한다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📂-속성">📂 속성</h2>
<h3 id="1-속성attribute의-개념">1. 속성(Attribute)의 개념</h3>
<ul>
<li>속성이란? 업무에서 필요로 하는 인스턴스로 의미상 더 이상 분리되지 않는 최소의 데이터 단위이다. </li>
</ul>
<h3 id="2-속성의-특징">2. 속성의 특징</h3>
<ul>
<li><p>속성의 특징</p>
<ul>
<li>엔터티와 마찬가지로 반드시 해당 업무에서 필요하고 관리하고자 하는 정보</li>
<li>정규화 이론에 근간하여 정해진 주식별자에 함수적 종속성을 가져야 함</li>
<li>하나의 속성에는 한개의 값만 가짐. 다중값일 경우 별도의 엔터티로 분리</li>
</ul>
</li>
<li><p>엔터티, 인스턴스, 속성, 속성값의 관계</p>
<ul>
<li>한 개의 엔터티는 두 개 이상의 인스턴스들의 집합이어야 함.</li>
<li>한 개의 엔터티는 두 개 이상의 속성을 갖는다.</li>
<li>한 개의 속성은 한 개의 속성값을 갖는다.</li>
</ul>
</li>
<li><p>속성의 명명 </p>
<ul>
<li>해당업무에서 사용하는 이름 부여 / 서술식 속성명 사용하지 않음 / 약어사용 가급적 제한 / 유일성 확보</li>
</ul>
</li>
</ul>
<h3 id="3-속성의-분류">3. 속성의 분류</h3>
<ul>
<li><p>속성의 특성에 따른 분류</p>
<ul>
<li>기본속성(제품이름) : 업무로부터 추출한 모든 속성이 여기에 해당되며, 가장 일반적이고 대부분 여기에 속함.</li>
<li>설계속성(약품코드) : 업무를 규칙화하기 위해 속성을 새로 만들거나 변형하여 정의하는 속성</li>
<li>파생속성(계산값) : 다른 속성에 영향을 받아 발생하는 속성. 보통 계산된 값들이 이에 해당됨.</li>
</ul>
</li>
<li><p>엔터티 구성방식에 따른 분류</p>
<ul>
<li>식별과 관계에 따른 분류
ㆍPK 속성 : 엔터티를 식별할 수 있는 속성
ㆍFK 속성 : 다른 엔터티와의 관계에서 포함되는 속성
ㆍ일반 속성 : PK, FK에 포함되지 않는 속성</li>
<li>세부 의미로 쪼갤 수 있는지에 따라
ㆍ단순형(나이, 성별) : 더 이상 다른 속성들로 구성될 수 없다.
ㆍ복합형(시, 구, 동, 번지) : 여러 세부 속성들로 구성될 수 있다.</li>
<li>동일한 성질이 있는지 없는지에 따라
ㆍ단일값 속성(주민번호)
ㆍ다중값 속성(차량색상-지붕, 차체, 외부 색)</li>
</ul>
</li>
</ul>
<h3 id="4-도메인">4. 도메인</h3>
<ul>
<li>도메인(Domain) : 각 속성이 가질 수 있는 값의 범위. 엔터티 내에서 속성에 대한 데이터타입과 크기, 제약사항을 지정하는 것. </li>
</ul>
<h2 id="📂-관계">📂 관계</h2>
<h3 id="1-관계의-개념">1. 관계의 개념</h3>
<ul>
<li>관계(Relationship) : 엔터티의 인스턴스 사이의 논리적인 연관성</li>
</ul>
<h3 id="2-관계의-분류">2. 관계의 분류</h3>
<ul>
<li>존재적 관계(부서, 사원) / 행위적 관계(고객, 주문)</li>
<li>ERD : 존재적 관계와 행위에 의한 관계를 구분하여 표현하지 않음</li>
<li>UML : 연관관계(존재적 관계, 실선), 의존관계(행위적 관계, 점선)</li>
</ul>
<h3 id="3-관계의-표기법">3. 관계의 표기법</h3>
<ul>
<li><p><strong>관계명</strong> : 엔터티가 관계에 참여하는 형태를 지칭. 관계의 이름</p>
<ul>
<li>관계시작점 : 관계가 시작되는 엔터티 편</li>
<li>관계끝점 : 관계를 받는 엔터티 편</li>
<li>관계시작점과 끝점 모두 관계명을 가져야하며, 능동적이거나 수동적으로 명명된다. </li>
</ul>
</li>
<li><p><strong>관계차수</strong> : 1:1, 1:M, M:M</p>
<ul>
<li>두 개의 엔터티간 관계에서 참여자의 수를 표현</li>
<li><table>
<thead>
<tr>
<th align="center">차수</th>
<th align="center">IE 표기법</th>
<th align="center">Barker 표기법</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1:1</td>
<td align="center">실선 &amp; 선(1)</td>
<td align="center">실선</td>
</tr>
<tr>
<td align="center">1:M</td>
<td align="center">실선 &amp; 선(1) + 까마귀발(M)</td>
<td align="center">점선&amp;선(1) + 실선&amp;까마귀발(M)</td>
</tr>
<tr>
<td align="center">M:M</td>
<td align="center">실선 &amp;  까마귀발(M)</td>
<td align="center">실선&amp;까마귀발(M)</td>
</tr>
<tr>
<td align="center">1:1 IE &gt; 실선에 선추가, Baker</td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
</li>
</ul>
</li>
<li><p><strong>관계선택사양</strong> : 필수관계, 선택관계</p>
<ul>
<li>필수참여관계 : 참여하는 모든 참여자가 관계를 가짐</li>
<li>선택참여관계 : 외래키로 연결될 경우 Null 허용<h3 id="4-관계-체크사항-및-읽는-방법">4. 관계 체크사항 및 읽는 방법</h3>
</li>
</ul>
</li>
<li><p>체크사항</p>
<ul>
<li>두 개의 엔터티 사이에 관심있는 연관규칙이 존재하는가?</li>
<li>두 개의 엔터티 사이에 정보의 조합이 발생되는가?</li>
<li>업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?</li>
<li>업무기술서, 장표에 관계연결을 가능하게 하는 동사(Verb)가 있는가?</li>
</ul>
</li>
<li><p>읽기</p>
<ul>
<li>엔터티(각각의/하나의), 기준엔터티, 관계차수(한/여러), 관련엔터티, 선택사양(항상/때때로), 관계명
ex) 각 부서에는 여러 사원이 항상 소속된다. 
  각 사원은 한 부서에 때때로 속한다.<h2 id="📂-식별자">📂 식별자</h2>
<h3 id="1-식별자identifiers-개념">1. 식별자(Identifiers) 개념</h3>
</li>
</ul>
</li>
<li><p>식별자란 ? 엔터티내에서 인스턴스들을 구분할 수 있는 구분자</p>
</li>
<li><p><strong>주식별자</strong>의 특징</p>
<ul>
<li>유일성 : 주식별자에 의해 엔터티내에 모든 인스턴스들이 유일하게 구분되어야 함</li>
<li>최소성 : 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함</li>
<li>불변성 : 값은 변하지 않아야 함</li>
<li>존재성 : 반드시 값이 있어야 함(Not Null)</li>
</ul>
</li>
</ul>
<ul>
<li>주식별자 도출기준<ul>
<li>해당 업무에서 자주 이용되는 속성을 주식별자로 지정</li>
<li>명칭, 내역 등과 같이 이름으로 기술되는 것을 피함</li>
<li>복합으로 주식별자를 구성할 경우 속성의 수가 많아지지 않도록 함<h3 id="2-식별자의-분류-및-표기법">2. 식별자의 분류 및 표기법</h3>
</li>
</ul>
</li>
<li>분류<ul>
<li>대표성여부<ul>
<li>주식별자(PK) : 엔터티 내에서 각 어커런스를 구분할 수 있으며, 타 엔터티와 참조관계를 연결 가능.</li>
<li>보조식별자 : 엔터티 내에서 각 어커런스를 구분할 수 있으나, 대표성을 가지지 못해 참조관계 연결 못함.</li>
</ul>
</li>
<li>스스로 생성 여부<ul>
<li>내부식별자 : 엔터티 내부에서 스스로 만들어지는 식별자</li>
<li>외부식별자 : 타 엔터티와의 관계를 통해 타 엔터티로부터 받아오는 식별자(FK)</li>
</ul>
</li>
<li>속성의 수<ul>
<li>단일식별자 : 하나의 속성으로 구성된 식별</li>
<li>복합식별자 : 둘 이상의 속성으로 구성된 식별자<ul>
<li>대체여부</li>
</ul>
</li>
<li>본질식별자 : 업무에 의해 만들어지는 식별자(주민번호)</li>
<li>인조식별자 : 원조식별자가 복잡한 구성일 경우 인위적으로 만든 식별자(고객식별자)<ul>
<li>표기법</li>
</ul>
</li>
</ul>
</li>
<li>IE 표기법<pre><code> ┌──────┐</code></pre>  │주식별자    │: 일반속성 상단에 위치함
  ├──────┤
  │보조식별자  │: 일반속성과 같이 위치함
  │일반속성        │
  └──────┘</li>
<li>Barker 표기법 <pre><code>┌──────┐</code></pre>  │#주식별자   │: # 표시
  │*보조식별자 │: * 표시
  │o일반속성   │: o 표시
  └──────┘</li>
</ul>
</li>
</ul>
<h3 id="3-식별자-관계와-비식별자-관계">3. 식별자 관계와 비식별자 관계</h3>
<ul>
<li><p>엔터티에 주식별자가 지정되고 엔터티간 관계를 연결하면, 자식엔터티에서 <strong>부모엔터티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지</strong> 또는 부모와 <strong>연결이 되는 속성으로만 이용할 것인지</strong> 결정해야 함 </p>
</li>
<li><p>식별자 관계 (주식별자로 이용 O)</p>
<ul>
<li>부모엔터티로부터 받은 외부식별자를 자신의 주식별자로 이용하는 경우 (1:1 관계)</li>
<li>부모엔터티로부터 받은 외부식별자와 본인의 속성과 함께 주식별자로 구성하는 경우(1:M 관계)</li>
</ul>
</li>
<li><p>비식별자 관계 (주식별자로 이용 X)</p>
<ul>
<li>부모엔터티로부터 받은 외부식별자를 일반적인 속성으로 이용하는 경우</li>
<li>자식엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때, 비식별자 관계에 의한 외부식별자로 표현</li>
<li>엔터티별로 데이터 생명주기를 다르게 관리할 경우(부모엔터티가 먼저 소멸될 수 있는 경우)</li>
</ul>
</li>
<li><p>문제점</p>
<ul>
<li>식별자 관계로만 설정할 때 : 주식별자 속성이 지속적으로 증가하는 구조이므로, 개발자 복잡성과 오류가능성 유발</li>
<li>비식별자 관계로만 설정할 때 : 많은 조인구문 사용에 따른 복잡성 증가, 성능 저하 유발</li>
</ul>
</li>
</ul>
<h3 id="4-식별자-관계와-비식별자-관계-모델링">4. 식별자 관계와 비식별자 관계 모델링</h3>
<ul>
<li><p>적절한 관계모델링은 데이터 모델의 균형감을 준다.</p>
</li>
<li><p>비식별자관계 선택 프로세스
관계의 강/약 분석 (약한 관계 -&gt; 비식별자관계 고려)</p>
</li>
<li><blockquote>
<p>자식테이블 독립PK필요 (독립 PK구성 필요 -&gt;  비식별자관계 고려)</p>
</blockquote>
</li>
<li><blockquote>
<p>SQL복잡도 증가 / 개발생산성 저하 </p>
</blockquote>
</li>
<li><blockquote>
<p>PK속성 단순화(비식별자관계 고려)</p>
</blockquote>
</li>
<li><p>식별자와 비식별자 관계 비교</p>
<ul>
<li><table>
<thead>
<tr>
<th align="center"></th>
<th align="center">식별자 관계</th>
<th align="center">비식별자 관계</th>
</tr>
</thead>
<tbody><tr>
<td align="center">목적</td>
<td align="center">강한 연결관계</td>
<td align="center">약한 연결관계</td>
</tr>
<tr>
<td align="center">자식엔터티</td>
<td align="center">자식 주식별자의 구성에 포함</td>
<td align="center">자식 일반속성에 포함</td>
</tr>
<tr>
<td align="center">표기법</td>
<td align="center">실선</td>
<td align="center">점선</td>
</tr>
</tbody></table>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML] 지도학습 - 수치예측 목적의 머신러닝]]></title>
            <link>https://velog.io/@isitcake_yes/ML-%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5-%EC%88%98%EC%B9%98%EC%98%88%EC%B8%A1-%EB%AA%A9%EC%A0%81%EC%9D%98-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@isitcake_yes/ML-%EC%A7%80%EB%8F%84%ED%95%99%EC%8A%B5-%EC%88%98%EC%B9%98%EC%98%88%EC%B8%A1-%EB%AA%A9%EC%A0%81%EC%9D%98-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Wed, 23 Nov 2022 14:51:31 GMT</pubDate>
            <description><![CDATA[<h1 id="지도학습supervised-learning">지도학습(Supervised Learning)</h1>
<p> 👉  <strong>정답(label)이 있는 데이터</strong>를 학습시키는 것이다. 입력값(X)에 대한 목적변수(Y)를 학습시키며,  지도학습은 <strong>목적변수(Y, label, 반응변수)의 형태</strong>에 따라 <strong>분류</strong> 혹은 <strong>예측</strong>으로 구분된다.  </p>
<ul>
<li><p><strong>분류</strong> : <strong>Y가 이산형(혹은 명목형)변수</strong>로, 고정된 값을 가질 때</p>
<ul>
<li><small> ex) 남/녀, 유/무, 정상/비정상, 긍정/중립/부정, MBTI .. </small></li>
</ul>
</li>
<li><p><strong>예측</strong> : <strong>Y가 연속형 변수</strong>로, 어떠한 값도 가질 수 있을 때</p>
<ul>
<li><small> ex) 키, 몸무게, 연봉, 수치형태의 변수 .. </small></li>
</ul>
</li>
</ul>
<p>(👀 반면, 비지도학습은 데이터에 대한 명시적인 정답없이, 데이터 그 자체로 학습을 진행하는 방법임) </p>
<hr>
<h1 id="수치-예측을-위한-머신러닝">수치 예측을 위한 머신러닝</h1>
<h3 id="✔️-활용영역">✔️ 활용영역</h3>
<ul>
<li>주식 가격 예측 / 경제 지표 예측 / 제품 판매량 및 가격 변화 예측 / 대출 채무 불이행에 대한 손실금액 예측 / 고객 LTV 예측 / 상품구매 가능성 예측 / 인구통계에 따른 의료비 증감 예측 등<br>

</li>
</ul>
<h3 id="✔️-수치예측-알고리즘-종류">✔️ 수치예측 알고리즘 종류</h3>
<ol>
<li><p>회귀분석(Regression Analysis)</p>
</li>
<li><p>의사결정트리 (Decision Tree)</p>
</li>
<li><p>인공 신경망 분석 (Artificial Neural Network)</p>
</li>
<li><p>랜덤포레스트 (Random Forest)</p>
</li>
</ol>
<br>

<hr>
<h2 id="1️⃣-회귀분석regression-analysis">1️⃣ 회귀분석(Regression Analysis)</h2>
<h4 id="🔎-회귀분석">🔎 회귀분석</h4>
<p>: 연속형 목적변수(Y)와 설명변수(X)의 관계를 함수식으로 모형화하는 기법
<img src="https://velog.velcdn.com/images/isitcake_yes/post/6ede4f88-a978-4578-ada3-73ee062de746/image.png" alt=""></p>
<ul>
<li><p>B0,B1,…,Bp는 데이터로부터 추정해야 하는 회귀계수이며,  ε은 오차항이다. 
<img src="https://velog.velcdn.com/images/isitcake_yes/post/59489f1e-5b0a-485e-86e2-ccd32c81ed2d/image.png" alt=""></p>
</li>
<li><p>머신러닝에서 훈련 데이터 세트가 주어졌을 때,    오차의 제곱합을 최소로 만드는 B0, B1,…,Bp를 찾아서 함수식을 도출한다. (학습)</p>
</li>
<li><p>훈련데이터를 학습시킨 뒤, 테스트데이터를 통해 결과값을 확인하며 성능을 평가한다</p>
</li>
<li><p>모형구축의 단순성, 해석의 명료성 때문에 선형회귀분석을 주로 사용하며, 적절치 않은 경우, 변환(로그변환, 제곱근변환, 다항식 접근 등)을 취해 적절히 선형회귀모델화 가능하다. </p>
</li>
<li><p>f(x) 가 </p>
<ul>
<li>선형함수인 경우 -&gt; 선형회귀분석</li>
<li>독립변수가 1개인 경우 -&gt; 단순선형회귀분석</li>
<li>독립변수가 여러개인 경우 -&gt; 다중선형회귀분석</li>
<li>로비스트가 함수인 경우 -&gt; 로지스틱 회귀분석 (단, 이 경우는 Y가 이산형 변수임)<ul>
<li>비선형 함수인 경우 -&gt; 비선형 회귀분석 
(선형회귀모형만큼 쉽지 않으며, 실질적으로 은닉층이 없는 인공신경망과 수학적으로 동일하기 때문에, 인공신경망 기법 등의 기법을 사용함)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="➕-장점">➕ 장점</h4>
<ul>
<li>모형구축의 단순성, 해석의 명료성</li>
<li>각 독립변수의 영향력 파악하기 쉽다</li>
<li>빠른 훈련 시간</li>
</ul>
<h4 id="➖-단점">➖ 단점</h4>
<ul>
<li>결측치, 이상치에 민감</li>
<li>단순한 모형에 적합하는 경향이 있어 복잡한 데이터를 예측할 때는 정확도가 떨어진다</li>
</ul>
<br>


<h2 id="2️⃣-의사결정트리decision-tree">2️⃣ 의사결정트리(Decision Tree)</h2>
<h4 id="🔎-의사결정트리-분석">🔎 의사결정트리 분석</h4>
<p>: 수치예측 목적의 의사결정트리는 목표변수(Y)의 평균, 표준편차, 절대편차와 같은 통계치의 불순도를 이용하여 마디를 분리시킨다. </p>
<ul>
<li>분류목적(분류나무), 수치예측목적(회귀나무) 둘 다 사용될 수 있다.</li>
<li>목표변수(Y)의 평균 차이가 가장 두드러지게 나타나는 분리점을 사용한다.</li>
</ul>
<h4 id="➕-장점-1">➕ 장점</h4>
<ul>
<li>분류 및 수치예측 모두 활용 가능 </li>
<li>결측치가 있는 데이터 효과적으로 처리 가능</li>
<li>선형성, 정규성, 등분산성 등의 가정이 필요없는 비모수적 모형임.</li>
<li>어떤 입력변수(X)가 목표변수(Y)에 영향력이   높은지 등의 통찰력을 얻을 수 있음</li>
<li>모형의 결과 이해가 쉽고, 분류결과의 이유를   설명하기 유용함.</li>
</ul>
<h4 id="➖-단점-1">➖ 단점</h4>
<ul>
<li>연속형 입력변수를 비연속적 값으로 취급하므로,  - 예측오류 가능성 있음. </li>
<li>모형식을 수립해야 하는 경우 적용이 어려움.</li>
<li>훈련데이터에 대한 변경이 발생할 경우, 분류 결정 논리에 큰 변화를 가져옴. </li>
<li>쉽게 과적합화 되거나 과소적합 될 수 있음.</li>
<li>트리가 너무 커질 경우 패턴 이해하기가 쉽지 않음. </li>
</ul>
<br>

<h2 id="3️⃣-랜덤포레스트-random-forest">3️⃣ 랜덤포레스트 (Random Forest)</h2>
<h4 id="🔎-랜덤포레스트">🔎 랜덤포레스트</h4>
<p>: 여러 개의 다양한 의사결정트리를 만들어 각 의사결정트리의 예측결과를 합쳐 최종 결과를 결정하는 앙상블 형태의 기법</p>
<ul>
<li>트리들의 상관성을 최소화하기 위해, 각 분할에서 사용되는 설명변수(X)들의 수(m개)는 전체 설명변수(X)의 개수(p개)보다 작다.</li>
<li>일반적으로 수치예측에서는 한 트리에서 p/3개의 설명변수를 사용한다.</li>
<li>어떤 랜덤 표본에는 약한 설명변수로 분할하는 경우도 있기 때문에, 상관성을 줄이게 되고, 트리들의 예측값 평균은 더 안정적으로 된다. </li>
</ul>
<h4 id="➕-장점-2">➕ 장점</h4>
<ul>
<li>분류문제(분류나무) 및 수치예측(회귀나무)   모두 활용 가능</li>
<li>대용량 데이터 처리에 효과적</li>
<li>과대적합 문제 최소화하여 모델의 정확도 향상</li>
</ul>
<h4 id="➖-단점-2">➖ 단점</h4>
<ul>
<li>데이터 크기에 비례해서 수백~수천개의 트리를 형성하기 때문에 학습 및 예측에 오랜시간이 걸림</li>
<li>생성하는 모든 트리 모델을 다 확인하기 어렵기에 해석력 떨어짐</li>
</ul>
<br>

<h2 id="4️⃣-인공신경망artificial-neural-network">4️⃣ 인공신경망(Artificial Neural Network)</h2>
<h4 id="🔎-인공신경망-분석">🔎 인공신경망 분석</h4>
<p>: 인간의 뉴런 작용에서 모티브를 얻은 기법으로, 입력 노드와 은닉 노드, 출력 노드를 구성하여 복잡한 분류나 수치예측 문제를 해결할 수 있도록 하는 분석 기법 (블랙박스 기법)</p>
<ul>
<li><p><strong>출력 활성함수</strong> : 은닉층에서 최종 목표변수(출력노드)로 결과값을 결합하여 변환하는 활성함수</p>
</li>
<li><blockquote>
<p>수치목적에서는 목표변수가 제한된 범위가 없기 때문에 출력활성함수로 항등함수를 사용한다.</p>
</blockquote>
</li>
<li><p><strong>목적함수</strong> : 은닉층과 은닉마디 수가 결정되면, 계수값을 찾기 위해 목적함수(오차함수)를 최소화하는 문제를 해결한다. </p>
</li>
<li><blockquote>
<p>수치목적에서는 오차제곱합(SSE)를 목적함수로 사용한다</p>
</blockquote>
</li>
</ul>
<h4 id="➕-장점-3">➕ 장점</h4>
<ul>
<li>입력변수(X)와 목적변수(Y)가 연속형이나 범주형인 경우 모두 처리 가능하여 다양한 분야에 적용가능</li>
<li>복잡한 데이터에 대해서도 좋은 결과 가능</li>
<li>예측력 우수하고, 견고하고 안정적인 기법</li>
</ul>
<h4 id="➖-단점-3">➖ 단점</h4>
<ul>
<li>최적의 모형을 구현하는 것이 상대적으로 어려움</li>
<li>도출된 입출력 변수의 연관관계에 대한 설명이 어려움</li>
<li>충분한 데이터 필요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 가상환경 만들기 virtualenv]]></title>
            <link>https://velog.io/@isitcake_yes/Python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0-virtualenv</link>
            <guid>https://velog.io/@isitcake_yes/Python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0-virtualenv</guid>
            <pubDate>Wed, 09 Nov 2022 06:19:26 GMT</pubDate>
            <description><![CDATA[<h4 id="python-프로젝트별-가상환경-만들어-작업하는-이유">Python 프로젝트별 가상환경 만들어 작업하는 이유</h4>
<ul>
<li>프로젝트마다 사용하는 패키지가 다르기 때문에, 프로젝트별로 패키지를 관리하기 용이하다. </li>
<li>패키지간의 의존성문제, 버전문제 등에 따른 오류, 코드변경을 최소화할 수 있다. </li>
<li>협업이나 코드 공유가 편리하다.</li>
</ul>
<h4 id="1-virtualenv-설치">1. virtualenv 설치</h4>
<blockquote>
<p>$ pip install virtualenv</p>
</blockquote>
<h4 id="2-가상환경-생성">2. 가상환경 생성</h4>
<blockquote>
<p>$ virtual protfolio --python=python3.8 
# 파이썬 버전 지정가능 # protfolio라는 가상환경 폴더 생성됨</p>
</blockquote>
<h4 id="3-가상환경-활성화">3. 가상환경 활성화</h4>
<blockquote>
<p>$ source portfolio/bin/activate
  # <em>이하 코드 (portfolio) ~$ 로 바뀜!</em></p>
</blockquote>
<h4 id="4-필요한-패키지-설치">4. 필요한 패키지 설치</h4>
<blockquote>
<p>$ pip install 패키지</p>
</blockquote>
<h4 id="5-해당-환경에-설치된-패키지-requirementstxt-로-추출">5. 해당 환경에 설치된 패키지 requirements.txt 로 추출</h4>
<blockquote>
<p>$ pip freeze &gt; requirements.txt</p>
</blockquote>
<h4 id="6-requirementstxt-에-있는-패키지-일괄-설치">6. requirements.txt 에 있는 패키지 일괄 설치</h4>
<blockquote>
<p>$ pip install -r requirements.txt</p>
</blockquote>
<h4 id="7-가상환경-종료하기나가기">7. 가상환경 종료하기(나가기)</h4>
<blockquote>
<p>$ deactivate</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 문제풀이 | 프로그래머스 | 푸드파이트 대회 음식배치 (Python / Javascript)]]></title>
            <link>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%91%B8%EB%93%9C%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C-%EC%9D%8C%EC%8B%9D%EB%B0%B0%EC%B9%98-Python-Javascript</link>
            <guid>https://velog.io/@isitcake_yes/%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%91%B8%EB%93%9C%ED%8C%8C%EC%9D%B4%ED%8A%B8-%EB%8C%80%ED%9A%8C-%EC%9D%8C%EC%8B%9D%EB%B0%B0%EC%B9%98-Python-Javascript</guid>
            <pubDate>Tue, 08 Nov 2022 05:19:24 GMT</pubDate>
            <description><![CDATA[<h2 id="📖-문제-설명">📖 문제 설명</h2>
<p>수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.</p>
<p>이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.</p>
<p>예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 &quot;1223330333221&quot;이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.</p>
<p><u>수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.</u></p>
<h3 id="제한사항">제한사항</h3>
<ul>
<li>2 ≤ food의 길이 ≤ 9</li>
<li>1 ≤ food의 각 원소 ≤ 1,000</li>
<li>food에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.</li>
<li>food[i]는 i번 음식의 수입니다.</li>
<li><strong>food[0]은 수웅이가 준비한 물의 양이며, 항상 1입니다.</strong></li>
<li>정답의 길이가 3 이상인 경우만 입력으로 주어집니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th align="center">food</th>
<th align="center">result</th>
</tr>
</thead>
<tbody><tr>
<td align="center">[1, 3, 4, 6]</td>
<td align="center">&quot;1223330333221&quot;</td>
</tr>
<tr>
<td align="center">[1, 7, 1, 2]</td>
<td align="center">&quot;111303111&quot;</td>
</tr>
<tr>
<td align="center">두 선수는 1번 음식 3개, 3번 음식 1개를 먹게 되므로 음식의 배치는 &quot;111303111&quot;입니다.</td>
<td align="center"></td>
</tr>
</tbody></table>
<p><br> <hr></p>
<h2 id="💡--문제풀이">💡  문제풀이</h2>
<h3 id="🧀-파이썬-코드">🧀 파이썬 코드</h3>
<pre><code class="language-python">def solution(food): 
    answer = &quot;&quot;
    for i in range(1,len(food)):
        answer += str(i)*(food[i]//2)
    rev = answer[::-1]
    answer += &quot;0&quot; 
    answer += rev
    return answer</code></pre>
<h3 id="🧀-자바스크립트-코드">🧀 자바스크립트 코드</h3>
<pre><code class="language-javascript">function solution(food) {
    var answer = &#39;&#39;;
    for (i = 1; i &lt; food.length; i++){
        answer += String(i).repeat(parseInt(food[i]/2))
    }
    rev = answer.split(&#39;&#39;).reverse().join(&#39;&#39;)
    answer+=&#39;0&#39;
    answer+=rev
    return answer;
}</code></pre>
<p><br><br></p>
<ul>
<li>문제출처 : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/134240">https://school.programmers.co.kr/learn/courses/30/lessons/134240</a> </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML/Python]시계열 데이터, 주식데이터 분석예측, ARIMA]]></title>
            <link>https://velog.io/@isitcake_yes/mlarimastockprediction</link>
            <guid>https://velog.io/@isitcake_yes/mlarimastockprediction</guid>
            <pubDate>Wed, 02 Nov 2022 08:48:37 GMT</pubDate>
            <description><![CDATA[<h2 id="1️⃣-시계열-데이터-주가데이터-준비">1️⃣. 시계열 데이터 (주가데이터) 준비</h2>
<h3 id="1-10년치-주가-정보-가져오기">1. 10년치 주가 정보 가져오기</h3>
<h4 id="🔍--사전지식">🔍  사전지식</h4>
<ul>
<li>DataReader([종목정보],[데이터소스],[시작일],[종료일])</li>
<li><strong>High</strong>(최고가), <strong>Low</strong>(최저가), <strong>Open</strong>(시가), <strong>Close</strong>(종가), <strong>Volume</strong>(거래량), <strong>Adj Close</strong>(수정종가;분할,배당,배분,신주 발생이 된 경우를 고려하여 주식가격을 조정해둔 가격)</li>
</ul>
<blockquote>
<pre><code class="language-python"># Libraries
import pandas_datareader.data as web # 주가 데이터
import datetime # 날짜    
import matplotlib.pyplot as plt # 시각화 라이브러리

# 시작일, 종료일 
start = datetime.datetime(2012, 10, 31) 
end = datetime.datetime(2022, 10, 31) 
# DataReader([종목정보],[데이터소스],[시작일],[종료일])
alphabet = web.DataReader(&quot;GOOG&quot;,&quot;yahoo&quot;,start,end)
print(&quot;&lt;Alphabet Inc. (GOOG) 주가 Historical Data&gt;\n&quot;)
print(alphabet)
print(&#39;\n&#39;)
print(alphabet.info())</code></pre>
</blockquote>
<pre><code>&gt;
- ![](https://velog.velcdn.com/images/isitcake_yes/post/e4acfe29-e535-444c-9d3d-14edbdcfe27c/image.png)


### 2. 데이터 전처리 &amp;  원본시계열, 이동평균, 이동표준편차 시각화
&gt;- 전처리
```python
# 거래량이 0인 일자 제거 &amp; 수정종가 데이터만 사용
data = alphabet[&#39;Adj Close&#39;][alphabet[&#39;Volume&#39;] != 0] </code></pre><ul>
<li>원본시계열, 이동평균, 이동표준편차 시각화<pre><code class="language-python">def plot_rolling(data, interval):
  rolmean = data.rolling(interval).mean()
  rolstd = data.rolling(interval).std()
  #Plot rolling statistics:
  plt.figure(figsize=(10, 6))
  plt.xlabel(&#39;Date&#39;)
  orig = plt.plot(data, color=&#39;blue&#39;,label=&#39;Original&#39;)
  mean = plt.plot(rolmean, color=&#39;red&#39;, label=&#39;Rolling Mean {}&#39;.format(interval))
  std = plt.plot(rolstd, color=&#39;black&#39;, label = &#39;Rolling Std {}&#39;.format(interval))
  plt.legend(loc=&#39;best&#39;)
  plt.title(&#39;Rolling Mean &amp; Standard Deviation&#39;)
  plt.show()
&gt;
# 50일치 평균내어 이동평균계산
plot_rolling(data, 50)</code></pre>
</li>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/1a30dddc-a7b1-4c2b-bab3-5f2318d6739b/image.png" alt=""></li>
<li><strong>해석1.</strong> 데이터가 평균이 일정하지 않은 비정상성의 특징<small>(아래 개념 설명)</small>을 가지는 것 같아 보이므로, 변환과정을 거친다면 ARIMA의 d차수<small>(아래 개념 설명)</small>가 1 이상일 것이다. </li>
<li><em>해석2.*</em> 계절성이나 특정 주기성은 크게 확인되지 않기 때문에 추후 ARIMA 분석에서 모수 seasonal이나 m은 auto_arima에 적용할 필요가 없을 수도 있다.</li>
</ul>
<br>

<h2 id="2️⃣-시계열-데이터-분석---arima">2️⃣. 시계열 데이터 분석 - ARIMA</h2>
<p>🔍 <strong>시계열 분석</strong>
: 시계열 분석이란, 일반적인 예측분석 중에서도 <u>시간을 독립변수(X)로 사용</u>하여 종속변수(Y)를 예측하는 분석이다. <strong>ARIMA</strong>는 시계열 분석(예측)에서 가장 널리 사용되는 모델 중 하나이고, 시계열 데이터는 정상성과 비정상성 데이터로 나눌 수 있다.
<br></p>
<p>🔍 <strong>정상성(stationary)과 비정상성(Non-stationary)</strong></p>
<ul>
<li><strong>정상성</strong> : 관측된 시간에 대해 무관한 데이터. 평균과 분산이 일정함. ex)백색소음</li>
<li><strong>비정상성</strong> : 시간에 따라 평균 수준이 다르거나 추세(Trend)나 계절성(Seasonality)에 영향을 받는 데이터. ex) 겨울에 난방비 증가, 여름에 아이스크림 판매량 증가<ul>
<li>비정상성 데이터는 예측범위가 무한대이고 고려할 파라미터들이 많다. 따라서, <u>비정상성 데이터를 정상성으로 변환하여 분석을 진행</u>하면 예측범위가 일정 범위로 줄어들어 예측 성능이 개선되고, 고려할 파라미터의 수가 감소하여 보다 단순한 알고리즘으로 예측이 가능하며, over fitting도 방지할 수 있다. </li>
<li><u>변환 방법</u> 중에는 <strong>평균의 정상화를 위한 차분</strong>과, <strong>분산의 안정화를 위한 로그 변환, 제곱/제곱근 변환</strong> 등이 있다. <br>

</li>
</ul>
</li>
</ul>
<h3 id="0-arima-">0. ARIMA ?</h3>
<p><strong>A</strong>uto<strong>r</strong>egressive <strong>I</strong>ntegrated <strong>M</strong>oving <strong>A</strong>verage
: ARIMA는 <strong>자기회귀모형</strong>(Autoregressive)과 <strong>이동평균모형</strong>(Moving Average) 둘 다 고려하고, 비정상성(Non-stationary) 데이터의 변환을 위해 관측치간의 <strong>차분</strong>(Diffrance)을 사용하는 모델이다. <small><em>(차분이란 현시점 데이터에서 d시점 이전 데이터를 뺀 것이다. Ex. 1차 차분 : 1일 전 데이터와의 차이, 2차 차분 2일 전 데이터와의 차이 )</em></small></p>
<ul>
<li><strong>AR</strong> : 자기회귀모형(Autoregressive). p시점 만큼 앞선 시점까지의 값에 영향을 받는 모형. <ul>
<li><strong>I</strong> : integrated. 누적을 의미하며, 비정상성(Non-stationary) 데이터의 변환(평균의 정상화)을 위해 차분을 이용하는 시계열 모형에 붙이는 표현</li>
<li><strong>MA</strong> : 이동평균모형(Moving Average). q시점 만큼 앞선 시점까지의 연속적인 오차값들(shock)의 영향을 받는 모형. 
=&gt; *<em>AR(p), MA(q) 모형에 차분(d)을 이용해 비정상성을 제거하는 과정을 더하여 ARIMA(p,d,q)로 표현한다. *</em></li>
</ul>
</li>
</ul>
<br>


<h3 id="1-시계열-정상성-확인---adf-테스트">1. 시계열 정상성 확인 - ADF 테스트</h3>
<p>: ADF Test(Augmented Dickey-Fuller Test)는 <strong>시계열 데이터의 정상성 여부</strong>를 통계적인 정량 방법으로 검증하는 방법이다.</p>
<ul>
<li><strong>귀무가설</strong> Null hypothesis: 증명하고자 하는 가설의 반대되는 가설, 효과와 차이가 없는 가설. 기각에 실패하면 시계열이 비정상성(Non-stationary)임을 의미한다.</li>
<li><strong>대립가설</strong> Alternative hypothesis : 증명하고자 하는 가설. 귀무가설이 기각되고 시계열이 정상성(Stationary)임을 의미한다.</li>
</ul>
<blockquote>
<p><strong>1) 원본데이터 ADF 테스트</strong></p>
</blockquote>
<pre><code class="language-python">from statsmodels.tsa.stattools import adfuller
&gt;
def adf_test(data):
    result = adfuller(data.values)
    print(&#39;ADF Statistics: %f&#39; % result[0])
    print(&#39;p-value: %f&#39; % result[1])
    print(&#39;num of lags: %f&#39; % result[2])
    print(&#39;num of observations: %f&#39; % result[3])
    print(&#39;Critical values:&#39;)
    for k, v in result[4].items():
        print(&#39;\t%s: %.3f&#39; % (k,v))
&gt;
print(&#39;ADF TEST 결과&#39;)
adf_test(data)
&gt;
&quot;&quot;&quot; 
ADF TEST 결과
ADF Statistics: -0.810527
p-value: 0.816010
num of lags: 24.000000
num of observations: 2493.000000
Critical values:
    1%: -3.433
    5%: -2.863
    10%: -2.567
&quot;&quot;&quot; </code></pre>
<p><strong>해석</strong>&gt; 
pvalue &gt; 0.05 이므로 귀무가설을 기각할 수 없다. 따라서 <u>구글(알파벳) 주식 데이터 (data) 는 비정상성 데이터이다.</u> 
<br>
 <strong>2) 차분 데이터 ADF 테스트</strong></p>
<pre><code class="language-python"># 1차 차분 데이터 diff1
dff1 = data.diff().dropna()
dff1.plot(figsize=(15,5))</code></pre>
<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/7ec2f91a-f070-4ce7-8e5c-6a9090325e6e/image.png" alt=""><blockquote>
</blockquote>
<pre><code class="language-python"># 차분 테이터 adf테스트
print(&#39;ADF TEST 결과&#39;)
adf_test(dff1)
&gt;
&quot;&quot;&quot;
ADF TEST 결과
(-10.57269500384887, 7.236501803746375e-19, 23, 2493, {&#39;1%&#39;: -3.4329757705711432, &#39;5%&#39;: -2.862700050059295, &#39;10%&#39;: -2.567387539813443}, 8124.823784502814)
ADF Statistics: -10.572695
p-value: 0.000000
num of lags: 23.000000
num of observations: 2493.000000
Critical values:
  1%: -3.433
  5%: -2.863
  10%: -2.567
&quot;&quot;&quot;</code></pre>
</li>
<li><em>해석*</em>&gt; pvalue가 0.05미만이므로 가설 기각(채택), <u>1차 차분 처리한 데이터가 정상성 데이터</u>가 되었다! 
=&gt; 비정상성 데이터는 <strong>차분</strong>을 이용하여 안정적으로 만들어 분석한다. (ARIMA) </li>
</ul>
<p>결론 : 원본데이터는 비정상성 시계열 데이터이므로 차분을 이용하는 시계열 모형을 사용하자! = ARIMA를 사용하자~! </p>
<br>

<h3 id="2-arimapdq-모수-추정">2. ARIMA(p,d,q) 모수 추정</h3>
<p>AR(p), 차분(d), MA(q)에서 보통 p+q &lt;2, p*q=0 인 값을 많이 사용한다. (p,q둘 중 한 값이 0) 
실제로는 AR 이나 MA 둘중 하나의 경향을 강하게 띄기 때문에 주로 이렇게 사용한다.</p>
<p>추정 방법은 <strong><em>(방법1)ACF plot과 PACF plot을 통해 모수 추정</em></strong> 하는 것과 <strong>(방법2)<code>pmdarima</code> 라이브러리의 <code>ndiffs</code>, <code>auto_arima</code> 함수를 사용하여 모수 추정</strong>하는 방법이 있다. </p>
<h4 id="📍-방법1-acf-pacf-검정-">📍 방법1. ACF, PACF 검정 !</h4>
<p>: ** ACF plot** 과 <strong>PACF plot</strong> 은 현재 값이 과거 값과 어떤 relationship이 있는지 보여준다. </p>
<table>
<thead>
<tr>
<th align="center">** ACF plot <br> (자기상관함수, Autocorrelation Function plot)**</th>
<th align="center">** PACF plot <br> (편자기상관함수, Partial Autocorrelation Function plot)**</th>
</tr>
</thead>
<tbody><tr>
<td align="center">현재값 S(t)에 S(t-p)값 부터 S(t)에 도달하기까지의 값들의 영향까지 고려<br> ( S(t-p), S(t-p+1), S(t-p+2) .. S(t)값 )</td>
<td align="center">현재값 S(t)에 S(t-p)값이 주는 영향만 의미</td>
</tr>
</tbody></table>
<p><u><strong>정상 시계열 데이터</strong>의 경우, ACF는 상대적으로 빠르게 0(상관관계 0)에 접근하고, 
<strong>비정상 시계열 데이터</strong>의 경우, ACF는 천천히 감소하며 종종 큰 양의 값을 가진다.</u></p>
<h4 id="모델-적합">&gt; 모델 적합</h4>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">AR(p) 모델 적합</th>
<th align="center">MA(q) 모델 적합</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>ACF plot</strong></td>
<td align="center">천천히 감소</td>
<td align="center">첫 값으로부터 q개 뒤에 끊긴다</td>
</tr>
<tr>
<td align="center"><strong>PACF plot</strong></td>
<td align="center">첫 값으로부터 p개 뒤에 끊긴다</td>
<td align="center">천천히 감소</td>
</tr>
</tbody></table>
<blockquote>
<p>*** 원본 데이터 (비정상) &gt; ACF 그래프 천천히 감소 ** </p>
</blockquote>
<pre><code class="language-python">from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(data)
plot_pacf(data)
plt.show()</code></pre>
<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/b2ab8176-78d5-40b7-a85a-fe0308b0929c/image.png" alt=""></li>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/28d12c66-539d-4d88-bbca-02e8e4a56311/image.png" alt="">  <strong>해석</strong>&gt; ACF plot가 천천히 감소되는 것으로 보아 주식 데이터는 주기에 따라 일정하지 않은 비정상성 데이터이고, 
PACF plot에서 첫값으로부터 1개 이후 파란 박스에 들어가면서 그래프가 끊기는 것으로 보아 <u>AR(1) 모델을 활용하는 것이 가장 적절</u>할 것으로 예상된다. <blockquote>
</blockquote>
<hr> 
>
>** *1차 차분 데이터 (정상성) > ACF 그래프 1개 뒤에 끊김** 
```python
plot_acf(dff1)
plot_pacf(dff1)
plt.show()
```</li>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/902b5ee3-e89b-444f-92ec-2804fad417ba/image.png" alt=""></li>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/30ad3a2d-89fa-4aa1-8513-c1160a24abf1/image.png" alt=""></li>
</ul>
<p>결론: ACF, PACF 그래프 그려본 결과, AR(1), d(1), MA(0)이 적절해 보인다. 
<br></p>
<h4 id="📍-방법2-ndiffs-auto_arima-함수-사용">📍 방법2. ndiffs, auto_arima 함수 사용</h4>
<p><strong>1. 차분 결정</strong> : <code>ndiffs</code> </p>
<blockquote>
<pre><code class="language-python">import pmdarima as pm
from pmdarima.arima import ndiffs
data = new_alpha[&#39;Adj Close&#39;]
n_diffs = ndiffs(data, alpha=0.05, test=&#39;adf&#39;, max_d=6)
print(f&quot;추정된 차수 d = {n_diffs}&quot;) # 결과
추정된 차수 d = 1</code></pre>
</blockquote>
<p><strong>2. 모형 차수 결정</strong> : <code>auto_arima</code>, pmdarima 라이브러리에 있는 함수로, ARIMA 모형의 차수 p,d,q와 계수를 자동으로 추정해주는 함수</p>
<ul>
<li><code>y</code>: 시계열 데이터(array 형태)</li>
<li><code>d</code> (기본값 = none): 차분의 차수, 이를 지정하지 않으면 실행 기간이 매우 길어질 수 있음</li>
<li><code>start_p</code> (기본값 = 2), <code>max_p</code> (기본값 = 5): AR(p)를 찾을 범위 (start_p에서 max_p까지 찾는다!)</li>
<li><code>start_q</code> (기본값 = 2), <code>max_q</code> (기본값 = 5): MA(q)를 찾을 범위 (start_q에서 max_q까지 찾는다!)</li>
<li><code>m</code> (기본값 = 1): 계절적 차분이 필요할 때 쓸 수 있는 모수로 m=4이면 분기별, m=12면 월별, m=1이면 자동적으로 seasonal 에 대한 옵션은 False로 지정되며 계절적 특징을 띠지 않는 데이터를 의미함</li>
<li><code>seasonal</code> (기본값 = True): 계절성 ARIMA 모형을 적합할지의 여부</li>
<li><code>stepwise</code> (기본값 = True): 최적의 모수를 찾기 위해 쓰는 힌드만 - 칸다카르 알고리즘을 사용할지의 여부, False면 모든 모수 조합으로 모형을 적합한다.</li>
<li><code>trace</code> (기본값 = False): stepwise로 모델을 적합할 때마다 결과를 프린트하고 싶을 때 사용한다.</li>
</ul>
<blockquote>
<pre><code class="language-python">model = pm.auto_arima(
            y=data, 
            d=1, 
            start_p=0, max_p=3, 
            start_q=0, max_q=3, 
            m=1, seasonal=False, # 계절성이 없음!
            stepwise=True,
            trace=True
)</code></pre>
</blockquote>
<pre><code>&gt; - ![](https://velog.velcdn.com/images/isitcake_yes/post/c7106205-7eeb-411e-8c33-04f5dd9d6022/image.png)
- **해석**&gt; auto_arima를 사용한 결과 최적의 모델은 **ARIMA (1,1,0)** 모형으로 나왔다. 
이때, AIC(Akaike Information Criterion) 또는 BIC(Bayesian Information Criterion)을 최소화하는 차수를 결정한다. 
(모델의 fitting력이 좋을수록 AIC값이 작아지고 모델의 복잡도가 높아질수록 AIC값이 커진다.)

결론: auto_arima결과, ARIMA (1,1,0)이 적절해 보인다. 

&lt;br&gt;

### 3. 잔차 검정
: 잔차가 정상성(백색잡음인지), 정규성, 등분산성 등을 만족하는지 파악. `model.summary()`, `model.plot_diagnostics()`

&gt; ```python
print(model.summary())</code></pre><blockquote>
<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/a045d5f6-b32c-48bc-b3b1-988a4ffede6d/image.png" alt=""></li>
</ul>
</blockquote>
<ul>
<li><p>해석&gt; Ljung-Box (Q), Heteroskedasticity (H), Jarque-Bera (JB)에 대한 부분은 모두 <strong>잔차에 대한 검정 통계량</strong>이다. </p>
<ul>
<li><table>
<thead>
<tr>
<th align="center">통계량</th>
<th align="center">Ljung-Box (Q)</th>
<th align="center">Heteroskedasticity (H)</th>
<th align="center">Jarque-Bera (JB)</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>통계량의 귀무가설</strong></td>
<td align="center">&quot;잔차가 백색잡음이다.&quot;</td>
<td align="center">&quot;잔차가 이분산을 띄지 않는다&quot;</td>
<td align="center">“잔차가 정규성을 만족한다”</td>
</tr>
<tr>
<td align="center"><strong>p-value</strong></td>
<td align="center">Prob(JB) &gt; 0.05 <br> 귀무가설 채택 O</td>
<td align="center">Prob(JB) &lt;0.05<br> 귀무가설 채택 X</td>
<td align="center">Prob(JB) &lt;0.05<br> 귀무가설 채택 X</td>
</tr>
<tr>
<td align="center"><strong>해석</strong></td>
<td align="center">잔차가 자기 상관을 가지지 않는 백색잡음이며, <br>시게열 모형이 잘 적합되었다.</td>
<td align="center">잔차가 이분산성을 띈다</td>
<td align="center">잔차가 정규성을 따르지 않음</td>
</tr>
</tbody></table>
<blockquote>
<pre><code class="language-python">model.plot_diagnostics(figsize=(16,8))
plt.show()</code></pre>
</blockquote>
```<blockquote>
</blockquote>
</li>
</ul>
</li>
<li><p><img src="https://velog.velcdn.com/images/isitcake_yes/post/5a43ce56-1996-4037-9725-d6546726b55e/image.png" alt=""></p>
</li>
<li><p><strong>해석1. 잔차의 정상성</strong></p>
<ul>
<li><u>Standardized residual(좌상단)</u> : 잔차의 시계열 데이터. 잔차의 시계열이 평균 0을 중심으로 변동하는 것으로 보임.</li>
<li><u>Correlogram (우하단)</u> : 잔차에 대한 ACF 플롯. 어느정도 허용 범위(파란박스) 안에 위치하여 자기상관이 없음을 알 수 있음.</li>
</ul>
</li>
<li><p><strong>해석2. 잔차의 정규성</strong></p>
<ul>
<li><u>Histogram plus estimated density (우상단)</u> : 잔차의 히스토그램을 그려 정규분포(N(0,1))와 밀도를 추정한 그래프.</li>
<li><u>Normal Q-Q (좌하단)</u> : 양끝쪽 빨간 선을 벗어나는 구간이 존재한다. 정규성을 만족하려면 빨간 일직선 위에 점들이 분포해야 함. </li>
</ul>
<p>결론: 잔차는 백색잡음(정상성)이지만, 정규성은 따르지 않는다. 따라서 추후 모형 설정에서 여러 파라미터(모수)들을 변경하거나 데이터를 변환해가며 모형을 테스트해본다.</p>
</li>
</ul>
<h3 id="4-arima모델-훈련과-테스트">4. ARIMA모델 훈련과 테스트</h3>
<blockquote>
<h4 id="1-train-test-set분리">1) train, test set분리</h4>
</blockquote>
<pre><code class="language-python"># train : test = 9 : 1
train_data, test_data = data[:int(len(data)*0.9)], data[int(len(data)*0.9):]</code></pre>
<blockquote>
<h4 id="2-train_data-모델-학습">2) train_data 모델 학습</h4>
</blockquote>
<pre><code class="language-python">from statsmodels.tsa.arima_model import ARIMA
&gt;
model_fit = pm.auto_arima(
            y=train_data, 
             d=n_diffs , 
            start_p=0, max_p=2, 
            start_q=0, max_q=2, 
            m=1, seasonal=False, # 계절성이 없음!
            stepwise=True,
            trace=True
)
print(model_fit.summary())</code></pre>
<p><img src="https://velog.velcdn.com/images/isitcake_yes/post/b61a6d3f-410b-4b2f-b9bc-1fd36ca2065d/image.png" alt=""></p>
<blockquote>
<h4 id="3-test_data-와-예측값-비교">3) test_data 와 예측값 비교</h4>
</blockquote>
<ul>
<li>forecast 함수 생성<pre><code class="language-python"># forecast 함수
def forecast_n_step(model, n = 1):
  fc, conf_int = model.predict(n_periods=n, return_conf_int=True)
  # print(&quot;fc&quot;, fc,&quot;conf_int&quot;, conf_int)
  return (
      fc.tolist()[0:n], np.asarray(conf_int).tolist()[0:n]
 )
&gt;
def forecast(len, model, index, data=None):
  y_pred = []
  pred_upper = []
  pred_lower = []
&gt;
  if data is not None:
      for new_ob in data:
          fc, conf = forecast_n_step(model)
          y_pred.append(fc[0])
          pred_upper.append(conf[0][1])
          pred_lower.append(conf[0][0])
          model.update(new_ob)
  else:
      for i in range(len):
          fc, conf = forecast_n_step(model)
          y_pred.append(fc[0])
          pred_upper.append(conf[0][1])
          pred_lower.append(conf[0][0])
          model.update(fc[0])
  return pd.Series(y_pred, index=index), pred_upper, pred_lower</code></pre>
</li>
<li>test_data와 예측값 그래프<pre><code class="language-python"># Forecast 
fc, upper, lower = forecast(len(test_data), model_fit, test_data.index, data = test_data)
&gt;
# pandas series 생성
# fc # 예측결과
lower_series = pd.Series(lower, index=test_data.index)  # 예측결과의 하한 바운드
upper_series = pd.Series(upper, index=test_data.index)  # 예측결과의 상한 바운드
&gt;
# Plot
plt.figure(figsize=(20,6))
plt.plot(train_data, label=&#39;train_data&#39;)
plt.plot(test_data, c=&#39;b&#39;, label=&#39;test_data (actual price)&#39;)
plt.plot(fc, c=&#39;r&#39;,label=&#39;predicted price&#39;)
plt.fill_between(lower_series.index, lower_series, upper_series, color=&#39;k&#39;, alpha=.10)
plt.legend(loc=&#39;upper left&#39;)
plt.show()</code></pre>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/e2a54f75-b3c8-4496-8316-b4d9ea2bf43b/image.png" alt=""><blockquote>
<h4 id="4-모델의-오차율-계산">4) 모델의 오차율 계산</h4>
</blockquote>
<pre><code class="language-python">from sklearn.metrics import mean_squared_error, mean_absolute_error
import math
mse = mean_squared_error(np.exp(test_data), np.exp(fc))
print(&#39;MSE: &#39;, mse)
mae = mean_absolute_error(np.exp(test_data), np.exp(fc))
print(&#39;MAE: &#39;, mae)
rmse = math.sqrt(mean_squared_error(np.exp(test_data), np.exp(fc)))
print(&#39;RMSE: &#39;, rmse)
mape = np.mean(np.abs(np.exp(fc) - np.exp(test_data))/np.abs(np.exp(test_data)))
print(&#39;MAPE: &#39; ,&#39;{:.2f}%&#39;.format(mape*100))
&quot;&quot;&quot;  
결과
모델의 오차율 계산(성능평가)
MSE:  4.423699884665538e+128
MAE:  4.1226648119126564e+63
RMSE:  2.103259347932522e+64
MAPE:  11709.69%
&quot;&quot;&quot;</code></pre>
</li>
</ul>
<h3 id="5-향후-1년-주가-예측">5. 향후 1년 주가 예측</h3>
<blockquote>
<ul>
<li>주식개장일 불러오는 함수 생성</li>
</ul>
</blockquote>
<pre><code class="language-python">import exchange_calendars as ecals
def get_open_dates(start,end):
    k = ecals.get_calendar(&quot;XKRX&quot;)
    df = pd.DataFrame(k.schedule.loc[start:end]) #[&quot;2022-11-01&quot;:&quot;2023-10-31&quot;])
    # print(df[&#39;open&#39;])
    date_list = []
    for i in df[&#39;open&#39;]:
        date_list.append(i.strftime(&quot;%Y-%m-%d&quot;))
       # print(i.strftime(&quot;%Y-%m-%d&quot;))   
    date_index = pd.DatetimeIndex(date_list)
    return date_index  # DatetimeIndex</code></pre>
<ul>
<li>향후 1년 주가 예측<pre><code class="language-python">date_index = get_open_dates(&quot;2022-11-01&quot;,&quot;2023-10-31&quot;)
fc2, upper2, lower2 = forecast(len(date_index), model_fit, date_index)
print(&#39;1년 후 주가&#39;) 
print(fc2.tail())
# fc2, conf = forecast_n_step(model_fit, len(date_list))
lower_series2 = pd.Series(lower2, index=date_index)  # 예측결과의 하한 바운드
upper_series2 = pd.Series(upper2, index=date_index)  # 예측결과의 상한 바운드
&gt; # plot
plt.figure(figsize=(20,6))
plt.plot(train_data, label=&#39;original&#39;)
plt.plot(test_data, c=&#39;b&#39;, label=&#39;actual price&#39;)
plt.plot(fc, c=&#39;r&#39;,label=&#39;predicted price&#39;)
plt.plot(fc2, c=&#39;g&#39;,label=&#39;forward predicted price&#39;)
plt.fill_between(lower_series.index, lower_series, upper_series, color=&#39;k&#39;, alpha=.10)
plt.fill_between(lower_series2.index, lower_series2, upper_series2, color=&#39;k&#39;, alpha=.10)
plt.title(&#39;After 1 year&#39;)
plt.legend(loc=&#39;upper left&#39;)
plt.show()
&quot;&quot;&quot;
1년 후 주가
2023-10-25    102.362737
2023-10-26    102.393655
2023-10-27    102.424573
2023-10-30    102.455491
2023-10-31    102.486410
&quot;&quot;&quot;</code></pre>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/4f0dd204-8bf4-4e00-b063-e7a290352017/image.png" alt=""></li>
</ul>
<h2 id="ref">Ref</h2>
<ul>
<li><p><a href="https://aliencoder.tistory.com/3">https://aliencoder.tistory.com/3</a></p>
</li>
<li><p><a href="https://byeongkijeong.github.io/ARIMA-with-Python/">https://byeongkijeong.github.io/ARIMA-with-Python/</a></p>
</li>
<li><p><a href="https://velog.io/@euisuk-chung/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%8B%9C%EA%B3%84%EC%97%B4-AR-MA-ARMA-ARIMA%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83-%EA%B0%9C%EB%85%90%ED%8E%B8">https://velog.io/@euisuk-chung/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%8B%9C%EA%B3%84%EC%97%B4-AR-MA-ARMA-ARIMA%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83-%EA%B0%9C%EB%85%90%ED%8E%B8</a></p>
</li>
<li><p><a href="https://leedakyeong.tistory.com/entry/ARIMA%EB%9E%80-ARIMA-%EB%B6%84%EC%84%9D%EA%B8%B0%EB%B2%95-AR-MA-ACF-PACF-%EC%A0%95%EC%83%81%EC%84%B1%EC%9D%B4%EB%9E%80">https://leedakyeong.tistory.com/entry/ARIMA%EB%9E%80-ARIMA-%EB%B6%84%EC%84%9D%EA%B8%B0%EB%B2%95-AR-MA-ACF-PACF-%EC%A0%95%EC%83%81%EC%84%B1%EC%9D%B4%EB%9E%80</a></p>
</li>
</ul>
<ul>
<li><p><a href="https://assaeunji.github.io/data%20analysis/2021-09-25-arimastock/">https://assaeunji.github.io/data%20analysis/2021-09-25-arimastock/</a></p>
</li>
<li><p><a href="https://skyeong.net/285">https://skyeong.net/285</a></p>
</li>
<li><p><a href="https://happy-chipmunk.tistory.com/96">https://happy-chipmunk.tistory.com/96</a></p>
</li>
<li><p><a href="https://github.com/stereo-weld/explorations/blob/master/E13_Project_Stock_Prediction.ipynb">https://github.com/stereo-weld/explorations/blob/master/E13_Project_Stock_Prediction.ipynb</a></p>
</li>
<li><p><a href="https://www.statsmodels.org/v0.12.0/generated/statsmodels.tsa.arima_model.ARIMA.predict.html">https://www.statsmodels.org/v0.12.0/generated/statsmodels.tsa.arima_model.ARIMA.predict.html</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UI/UX] Figma 장점과 단축키 모음]]></title>
            <link>https://velog.io/@isitcake_yes/UIUX-Figma-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@isitcake_yes/UIUX-Figma-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Tue, 01 Nov 2022 07:05:28 GMT</pubDate>
            <description><![CDATA[<h2 id="🎨-피그마">🎨 피그마</h2>
<p><strong>피그마(Figma)</strong> <a href="https://www.figma.com">https://www.figma.com</a>
: UI 디자인, 프로토타이핑 등을 구현하기 위한 디자인 툴 </p>
<blockquote>
<p><strong>장점</strong></p>
</blockquote>
<ol>
<li>디자인 프로세스를 적극 반영한 사용성과 인터페이스</li>
<li>개발자 핸드오프(handoff, 개발자에게 전달) 과정에서 유용</li>
<li>무료 가능(편집자 2명 제한)</li>
<li>강력한 협업 툴 - 동시작업, 보기전용, 링크공유, 히스토리 버전관리 등 다양한 옵션 존재</li>
<li>거의 없는 환경적 제약 - Mac, Windows, 리눅스 모두 동작 어디서나 접속 가능 </li>
<li>커뮤니티, 다양한 플러그인, 디자인 래퍼런스 활성화 </li>
</ol>
<p><strong>+ 피그잼(Figjam)</strong>
: 브래인스토밍을 위한 화이트보드 협업 툴. 프로젝트 시각화, 스케쥴링, 데이터스키마 설계 등 다방면으로 사용되고 있다. Figjam또한 무료이고 실시간 협업과 관리가 쉽고 편하다.</p>
<br>


<h2 id="⌨️-피그마-단축키-모음">⌨️ 피그마 단축키 모음</h2>
<h3 id="files">Files</h3>
<blockquote>
<p><strong>Ctrl+Alt+S</strong> : 히스토리 저장 Save to Version History 
(히스토리확인 : <code>file &gt; Show version history</code>)</p>
</blockquote>
<h3 id="tools">Tools</h3>
<blockquote>
<p><strong>V</strong> : 이동 Move
<strong>C</strong> : 코멘트 추가 또는 보기 Add/Show Comments
<strong>P</strong> : 펜툴 Pen
<strong>Shift+P</strong> : 연필 툴 Pencil
<strong>R</strong> : 사각형 그리기 Rectangle
<strong>O</strong> : 원 그리기 Ellipse
<strong>L</strong> : 선 그리기 Line
<strong>F</strong> : 프레임 생성 Frame
<strong>S</strong> : 슬라이스 Slice
<strong>I</strong> : 스포이드 툴Pick Color</p>
</blockquote>
<h3 id="text">TEXT</h3>
<blockquote>
<p><strong>T</strong> : 텍스트 Text
<strong>Ctrl+Shift+V</strong> : 스타일에 맞춰 붙여넣기 Paste and Match Style
<strong>Ctrl+B</strong> : 볼드 Bold
<strong>Ctrl+I</strong> : 이탤릭 Italic
<strong>Ctrl+U</strong> : 밑줄 Underline</p>
</blockquote>
<h3 id="object">Object</h3>
<blockquote>
<p><strong>Ctrl+A</strong> : 전체 선택 select All
<strong>Esc</strong>    : 전체 선택 해제 select None
<strong>Ctrl+G</strong> : 그룹 Group Selection
<strong>Ctrl+Shift+G</strong> : 그룹 해제 Ungroup Selection
<strong>Ctrl+Shift+H</strong> : 숨기기/나타내기 Show/Hide Selection
<strong>Ctrl+Shift+L</strong> : 잠금/잠금해제 Lock/Unlock Selection
<strong>Ctrl+Alt+Shift+L</strong> : 전체 잠금 해제 Unlock All Object
<strong>Ctrl+C</strong>    : 복사 Copy
<strong>Ctrl+X</strong>    : 잘라내기 Cut
<strong>Ctrl+V</strong>    : 붙여넣기 Paste
<strong>Alt+drag</strong> : 선택 복사 Duplicate Selection   </p>
</blockquote>
<h3 id="component">Component</h3>
<blockquote>
<p><strong>Ctrl+Alt+K</strong> : 컴포넌트 만들기 Create Component
<strong>Ctrl+Alt+B</strong> : 인스턴스 분리하기 Detach Instance
<strong>컴포넌트 해제</strong> : </p>
</blockquote>
<ol>
<li>해당 컴포넌트로 instance생성(복붙) </li>
<li>해당 Instance를 Detach Instance하여 일반 Frame으로 변경(Ctrl+Alt+B) </li>
<li>Assets에서 해당 컴포넌트 제거(Delete키) </li>
</ol>
<h3 id="view">View</h3>
<blockquote>
<p><strong>Alt + 1</strong> : Open layers panel 
<strong>Alt + 2</strong> : Open Libraries(Assets) panel 
<strong>Alt + 8</strong> : Open Design panel 
<strong>Alt + 9</strong> : Open Prototype panel 
<strong>Alt + 0</strong> : Open inspect panel 
<strong>Ctrl+/</strong> : 검색 Search
<strong>Ctrl+Shift+/</strong> : 단축키 보기 Keyboard Shortcuts</p>
</blockquote>
<h3 id="shape">Shape</h3>
<blockquote>
<p><strong>Shift + V</strong> : 가로 뒤집기 
<strong>Shift + H</strong> : 세로 뒤집기 
<strong>Ctrl+E</strong>    병합 Flatten Selection
<strong>Ctrl+Shift+O</strong>    윤곽선으로 변경 Outline Stroke
<strong>Alt+double+click</strong>    이미지 자르기 Crop Image</p>
</blockquote>
<h3 id="zoom">Zoom</h3>
<blockquote>
<p><strong>Ctrl+drag</strong> : Zoom In-Out
<strong>Shift+drag</strong> : Move to Left-Right 
<strong>Shift+1</strong> : Zoom to fit
<strong>Shift+2</strong> : Zoom to selection 
<strong>N</strong> : Zoom to next frame
<strong>Shift+N</strong> : Zoom to previous frame</p>
</blockquote>
<br>
<br>
- 성공적인 협업을 위하여! 🍻


]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] 도커 개념, 도커 설치, 기본 명령어 실습]]></title>
            <link>https://velog.io/@isitcake_yes/docker</link>
            <guid>https://velog.io/@isitcake_yes/docker</guid>
            <pubDate>Fri, 28 Oct 2022 09:06:41 GMT</pubDate>
            <description><![CDATA[<h2 id="1-도커란-">1. 도커란 ?</h2>
<p><strong>도커 (Docker)</strong>는 가상머신처럼 <strong>컨테이너 기반의 독립된 실행환경을 만들어주는 플랫폼</strong>이다. host OS안에서 독립적인 Application(Container)들이 각각 관리되고 실행된다.  </p>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/ddbd7e8d-b339-4525-a59a-9178f8e04473/image.png"  width="800">                                                                                                                

<h3 id="🐬-도커-사용-이유">🐬 도커 사용 이유</h3>
<p>도커는 실행파일만 갖고 있기 때문에 VM보다 용량 부담이 적고 실행속도가 빠르다. 또한 컨테이너 생성 및 관리가 매우 용이하기 때문에 <u>Application의 개발과 배포 편해지고, 여러 Application의 독립성과 확장성이 높아지는</u> 등 많은 장점이 있다. </p>
<h3 id="🐬-docker-hub--image--container">🐬 Docker hub / Image / Container</h3>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/adc987fe-b2c6-4d8b-a3c4-93b83f970980/image.png"  width="500">

<ul>
<li><p><strong>Docker Hub</strong> : Docker의 이미지 저장소 서비스</p>
<ul>
<li>(image 가져오기) <a href="https://hub.docker.com/">https://hub.docker.com/</a> &gt; Explore &gt; 필요한 image 정보확인, <code>docker pull [이미지]</code></li>
</ul>
</li>
<li><p><strong>Docker Image</strong> : 도커 컨테이너 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 하나로 합친 것. </p>
<ul>
<li>(image 실행) <code>docker run [이미지]</code> </li>
</ul>
</li>
<li><p><strong>Docker Container</strong> : 도커 이미지를 실행한 상태. 파일 시스템과 어플리케이션이 구체화되어 실행되는 상태.</p>
</li>
</ul>
<p><br><br><hr></p>
<h2 id="2-리눅스ubuntu에-설치">2. 리눅스(Ubuntu)에 설치</h2>
<p>참고 : <a href="https://docs.docker.com/engine/install/ubuntu/">https://docs.docker.com/engine/install/ubuntu/</a></p>
<h3 id="1-저장소-설정repository">1) 저장소 설정(repository)</h3>
<pre><code class="language-shell">#  update apt
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release


# Docker의 official GPG key 추가
 $ sudo mkdir -p /etc/apt/keyrings
 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg


# 리포지토리를 설정
$ echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</code></pre>
<h3 id="2-도커-엔진-설치">2) 도커 엔진 설치</h3>
<pre><code class="language-shell">$  sudo apt-get update
# 설치
$  sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 도커설치 확인
$  sudo docker run hello-world </code></pre>
<p><br><br><hr></p>
<h2 id="3-도커-실행">3. 도커 실행</h2>
<h3 id="1-도커-허브에서-이미지-가져오기pull">1) 도커 허브에서 이미지 가져오기(pull)</h3>
<blockquote>
<p>$ <strong>docker pull</strong>  [OPTIONS] ** NAME** [:TAG|@DIGEST]
$ <strong>docker images</strong> </p>
</blockquote>
<p> 도커 허브에서 이미지 가져오기 (ex. httpd 설치) -  <a href="https://hub.docker.com/_/httpd">https://hub.docker.com/_/httpd</a></p>
<pre><code class="language-shell">$ sudo docker pull httpd # 설치된 images 리스트 확인
$ sudo docker images </code></pre>
<h3 id="2-이미지-실행시켜-컨테이너-생성-run">2) 이미지 실행시켜 컨테이너 생성 (run)</h3>
<blockquote>
<p>$ <strong>docker run</strong> [OPTIONS] <strong>IMAGE</strong> [COMMAND] [ARG...]</p>
</blockquote>
<pre><code class="language-shell">$ sudo docker run --name ws1 httpd
$ sudo docker run --name ws2 httpd</code></pre>
<h3 id="3-도커-컨테이너-확인">3) 도커 컨테이너 확인</h3>
<blockquote>
<p> $ <strong>docker stop</strong> [OPTIONS] <strong>CONTAINER</strong> [CONTAINER...]
: 컨테이너 종료 </p>
<p> $ <strong>docker start</strong> [OPTIONS] <strong>CONTAINER</strong> [CONTAINER...]
 : 컨테이너 실행</p>
<p>$ <strong>docker logs</strong> [OPTIONS] <strong>CONTAINER</strong>
 : 컨테이너 로그출력
 (<code>docker logs -f ws1</code>:실시간 로그 출력)</p>
<p>$ <strong>docker ps</strong> [OPTIONS]
 : 현재 실행중인 컨테이너 출력 
 (<code>docker ps -a</code> : 존재하는 모든 컨테이너 출력)</p>
<p>$ <strong>docker rm</strong> [OPTIONS] <strong>CONTAINER</strong> [CONTAINER...]
: 컨테이너 삭제</p>
<p>$ <strong>docker rmi</strong> [OPTIONS] <strong>IMAGE</strong> [IMAGE...] 
: 이미지 삭제</p>
</blockquote>
<pre><code class="language-shell">$ sudo docker ps </code></pre>
<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/d3750b86-eb0a-47fd-a513-cf38f75ae078/image.png" alt=""><pre><code class="language-shell">$ sudo docker stop ws2
$ sudo docker ps # 멈춘 것 확인</code></pre>
</li>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/60b8a3f0-637d-444d-9c39-073795b8d979/image.png" alt=""><pre><code class="language-shell">$ sudo docker rm ws2
$ sudo docker rmi httpd</code></pre>
</li>
</ul>
<p><br><br><hr></p>
<h2 id="4-도커-네트워크-구조">4. 도커 네트워크 구조</h2>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/3c16e9b2-d64c-4600-a09d-b6ec511d764b/image.png"  width="800">

<ul>
<li><p>1개의 도커 host에는 여러개의 container를 만들 수 있다.</p>
</li>
<li><p>host, container 모두 독립적이기 때문에, 독립적인 포트와 파일시스템을 갖고 있다.</p>
</li>
<li><p>호스트의 8080번 포트와 컨테이너 80번 포트를 연결하려면, 컨테이너 실행 시, <code>docker run -p 8080:80 httpd</code> 와 같이 연결한다. 이렇게 연결된 포트로 신호를 전송하는 것을 <strong>포트 포워딩(port forwarding)</strong>이라고 한다.</p>
</li>
<li><p>Ex. <strong><u>Web1(Web browser), Web2(Web server)에서 도커 네트워크</u></strong></p>
<ol>
<li>Web1(웹브라우저)에 주소창 <code>index.html</code>을 입력 </li>
<li>host:8080, container:80 포트로 Web2(웹서버)에 요청신호가 전달됨 </li>
<li>Web2(웹서버)의 <code>file system(/usr/loacl/apache2/htdocs/)</code>에서 <code>index.html</code>파일을 읽어서 index.html코드를 Web1(웹브라우저)에게 전달함 </li>
</ol>
</li>
</ul>
<pre><code class="language-shell">$ sudo docker run --name ws3 -p 8081:80 httpd</code></pre>
<ul>
<li><img src="https://velog.velcdn.com/images/isitcake_yes/post/f61c2739-d028-4a0d-a7b7-5ab41e0d68eb/image.png"  width="900">


</li>
</ul>
<ul>
<li>도커 연결 웹페이지 확인 (<code>localhost:8081/index.html</code>) <img src="https://velog.velcdn.com/images/isitcake_yes/post/379682d3-8216-470d-842a-60668050ddbc/image.png" alt=""></li>
<li>컨테이너 로그 실시간 확인 (<code>docker logs -f ws3</code>)
<img src="https://velog.velcdn.com/images/isitcake_yes/post/31e006bc-e995-45e6-9263-2b5a9afb894c/image.png" alt=""></li>
</ul>
<p><br><br><hr></p>
<h2 id="5-컨테이너-명령-실행">5. 컨테이너 명령 실행</h2>
<blockquote>
<p>$ <strong>docker exec</strong> [OPTIONS] <strong>CONTAINER COMMAND</strong> [ARG...]</p>
</blockquote>
<pre><code class="language-shell"># ws3 컨테이너에서 pwd 실행
$ sudo docker exec ws3 pwd
/usr/local/apache2


# ws3 컨테이너에서 command line 지속적으로 연결(- it 옵션)
$ sudo docker exec -it ws3 /bin/sh
$ sudo docker exec -it ws3 /bin/bash
# pwd 
usr/local/apache2
# exit  (host 로 나가기 )</code></pre>
<h3 id="🐬-indexhtml을-수정해보자">🐬 index.html을 수정해보자</h3>
<ul>
<li>index.html파일 위치 : /usr/local/apache2/htdocs/ (hub에 사용법 정리되어 있음.)</li>
</ul>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/2f9f8ad9-945a-4ede-b463-cd5178d15163/image.png"  width="700">

<pre><code class="language-shell">$ sudo docker exec -it ws3 /bin/bash
root@3215050bf255:/usr/local/apache2# cd /usr/local/apache2/htdocs/
root@3215050bf255:/usr/local/apache2/htdocs# ls 
index.html</code></pre>
<ul>
<li>vi 에디터 설치<pre><code class="language-shell">apt update
apt install vim
vi index.html  -&gt; 수정 후 localhost:8081/index.html 확인</code></pre>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/07ba02f8-c609-424b-b1a8-ce2d05677693/image.png"  width="500">

</li>
</ul>
<img src="https://velog.velcdn.com/images/isitcake_yes/post/5aa65086-81ef-4278-9c44-8269c740a5f1/image.png"  width="500">


<p><br><br><hr></p>
<h2 id="6-호스트와-컨테이너의-파일-시스템">6. 호스트와 컨테이너의 파일 시스템</h2>
<blockquote>
<p>$ sudo docker run --name cfront -p 8081:80 <strong>-v /home/sekim/front:/usr/local/apache2/htdocs/</strong> httpd</p>
</blockquote>
<ul>
<li>v옵션 추가 : <code>-v host의 파일 위치:container의 파일위치</code></li>
<li>$ sudo docker exec -it cfront /bin/bash 로 파일 확인
```
root@9109f76dfd59:/usr/local/apache2# cd htdocs/
root@9109f76dfd59:/usr/local/apache2/htdocs# ls</li>
</ul>
<p>04.md  index.html  main.css  main.js</p>
<pre><code>=&gt; host(내 로컬)환경에 있던 front폴더(/home/sekim/front)의 내용을 cfront컨테이너에서 확인할 수 있게 되었다. 또한 실시간으로 host파일을 변경할 때마다 바로 container의 파일도 변경된다.  
&lt;br&gt;

&lt;hr&gt;

## Ref 
생활코딩 도커 강의를 공부하며 작성한 글입니다.
- https://opentutorials.org/course/4781/30610
- https://kibua20.tistory.com/135
- https://docs.docker.com/reference/ 
- *(그림:[생활코딩 - 도커 수업 영상](https://opentutorials.org/course/4781/30609) 캡쳐)*</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[R] R 데이터구조 관련 함수 - 벡터Vector, 행렬Matrix, 팩터Factor, 배열Array]]></title>
            <link>https://velog.io/@isitcake_yes/r</link>
            <guid>https://velog.io/@isitcake_yes/r</guid>
            <pubDate>Wed, 26 Oct 2022 05:11:51 GMT</pubDate>
            <description><![CDATA[<h2 id="🔍-벡터-vector">🔍 벡터 Vector</h2>
<h4 id="⭐️--벡터-생성--c-seq-rep-names">⭐️  벡터 생성 : c(), seq(), rep(), names()</h4>
<pre><code class="language-python">v1 &lt;- c(1, 2, 3)  
v2 &lt;- c(4, 5, 6)  
v1; v2
#&gt; [1] 1 2 3
#&gt; [1] 4 5 6

v3 &lt;- c(v1, v2)   
v3
#&gt; [1] 1 2 3  4 5 6</code></pre>
<pre><code class="language-python"># seq() 연속값
var1 &lt;- c(1:6)   # 1~6까지의 연속 값
var2 &lt;- seq(1, 6)   # 1~6까지의 연속 값
var1; var2
#&gt; [1] 1 2 3 4 5 6
#&gt; [1] 1 2 3 4 5 6
var3 &lt;- seq(1, 6, by = 2)   # 1~10까지 2간격의 연속값
var4 &lt;- seq(1, 6, by = 3)   # 1~10까지 3간격의 연속값
var5 &lt;- seq(from = 1, to = 2, length.out = 5)
var3; var4; var5
#&gt; [1] 1 3 5 
#&gt; [1]  1  4  
#&gt; [1] 1.00 1.25 1.50 1.75 2.00</code></pre>
<pre><code class="language-python"># rep() 반복값 
var6 &lt;- rep(3, times = 5)  # 5를 7번 반복 
var7 &lt;- rep(c(&quot;a&quot;, &quot;b&quot;), each = 3)  # 각 문자 3번 반복
var6; var7
#&gt; [1] 3 3 3 3 3
#&gt; [1] &quot;a&quot; &quot;a&quot; &quot;a&quot; &quot;b&quot; &quot;b&quot; &quot;b&quot;</code></pre>
<pre><code class="language-python"># names() 값마다 이름 부여
mbti &lt;- c(&quot;INFP&quot;, &quot;ENTP&quot;, &quot;ESFP&quot;)
names(mbti) &lt;- c(&quot;김땡땡&quot;, &quot;문땡땡&quot;, &quot;박땡땡&quot;)
# mbti &lt;- c(김땡땡=&quot;INFP&quot;,문땡땡= &quot;ENTP&quot;,박땡땡=&quot;ESFP&quot;) 와 동일

mbti
# 김땡땡 문땡땡 박땡땡 
# &quot;INFP&quot; &quot;ENTP&quot; &quot;ESFP&quot; </code></pre>
<h4 id="⭐️--벡터-요소-추출-및-제외--특정위치로-이름으로-조건으로">⭐️  벡터 요소 추출 및 제외 : 특정위치로, 이름으로, 조건으로</h4>
<pre><code class="language-python"># 이름으로 추출
mbti[&quot;김땡땡&quot;] #&gt; 김땡땡 &quot;INFP&quot;

# 특정 위치 요소 추출
v &lt;- c(11, 12, 13, 14, 15)
v[2:3]               #&gt; [1] 12 13
v[c(1,2,4)]          #&gt; [1] 11 12 14
v[seq(1, 5, 2)]      #&gt; [1] 11 13 15

# - 기호로 요소 제외
v[-2]                  #&gt; [1] 11 13 14 15
v[-c(3:4)]             #&gt; [1] 11 12 15

# 조건으로 추출
s &lt;- c(3, 1, 5, 9, 7, 10)  
s[s&gt;=7]              #&gt; [1]  9  7 10
subset(s, s&gt;=7)      #&gt; [1]  9  7 10
# s&gt;=7인 요소의 인덱스 추출
which(s&gt;=7)          #&gt; [1] 4 5 6</code></pre>
<h4 id="⭐️--벡터-연산">⭐️  벡터 연산</h4>
<pre><code class="language-python">v &lt;- c(11, 12, 13, 14, 15)
v - mean(v) #&gt; [1] -2 -1  0  1  2
sum(v) #&gt; 65
w &lt;- c(1, 2, 3, 4, 5)
sqrt(w) # [1] 1.00 1.41 1.73 2.00 2.24
</code></pre>
<hr>
<h2 id="🔍-행렬-matrix">🔍 행렬 Matrix</h2>
<h4 id="⭐️---행렬-생성--matrix-cbind-rbind">⭐️   행렬 생성 : matrix(), cbind(), rbind()</h4>
<pre><code class="language-python"># ncol : 열의 수, nrow : 행의 수
m1 &lt;- matrix(1:12, ncol = 3)
m1
#&gt;      [,1] [,2] [,3]
#&gt; [1,]    1    5    9
#&gt; [2,]    2    6   10
#&gt; [3,]    3    7   11
#&gt; [4,]    4    8   12

# byrow = TRUE : row로 채워짐
m2 &lt;- matrix(data = c(1:6), nrow = 2, byrow = TRUE)
m2
#&gt;      [,1] [,2] [,3]
#&gt; [1,]    1    2    3
#&gt; [2,]   11   12   13

# cbind() 열 병합, rbind() 행 병합
# 숫자 벡터 생성
first &lt;- c(1,2,3,4)
second &lt;- c(5,6,7,8)
third &lt;- c(9,10,11,12)

# 열 기준으로 벡터 병합 
m3 &lt;- cbind(first, second, third)
m3
#&gt;      first second third
#&gt; [1,]    1    5    9
#&gt; [2,]    2    6    10
#&gt; [3,]    3    7    11
#&gt; [4,]    4    8    12

#행 기준으로 벡터 병합
m4 &lt;- rbind(first, second, third)
m4
#       [,1] [,2] [,3] [,4]
#first     1    2    3    4
#second    5    6    7    8
#third     9   10   11   12</code></pre>
<h4 id="⭐️--행렬-이름-붙이기--rownames-colnames-dimnames">⭐️  행렬 이름 붙이기 : rownames(), colnames(), dimnames()</h4>
<pre><code class="language-python">rownames(m3) &lt;- c(&quot;행1&quot;, &quot;행2&quot;, &quot;행3&quot;, &quot;행4&quot;, &quot;행5&quot;)
colnames(m3) &lt;- c(&quot;열1&quot;, &quot;열2&quot;, &quot;열3&quot;)
m3
#&gt;     열1 열2 열3
#&gt; 행1   5   2   7
#&gt; 행2   6   4   3
#&gt; 행3   7   5   4
#&gt; 행4   8   9   8
#&gt; 행5   9   8   7

m4 &lt;- matrix(
  data = c(1,2,3, 11,12,13),
  nrow = 2, byrow = TRUE,
  dimnames = list(c(&quot;행1&quot;, &quot;행2&quot;), c(&quot;열1&quot;, &quot;열2&quot;, &quot;열3&quot;))
  )
m4
#&gt;       열1  열2   열3
#&gt; 행1    1    2    3
#&gt; 행2   11   12   13</code></pre>
<h4 id="⭐️--행렬-차원--nrow-ncol-dim-t">⭐️  행렬 차원 : nrow(), ncol(), dim(), t()</h4>
<pre><code class="language-python">t(m) # 행렬 전치
nrow(m) # 행 개수
ncol(m) # 열 개수
dim(m) # 행렬 개수</code></pre>
<h4 id="⭐️--행렬-요소-추출-및-제외-특정위치로-이름으로-조건으로">⭐️  행렬 요소 추출 및 제외 :특정위치로, 이름으로, 조건으로</h4>
<pre><code class="language-python">m[2,] # 2번째 행 요소 추출
m[2,3] # 2행 3열 요소 추출
m[1:5,] # 1-5번째 행 요소 추출
m[c(2,4),] # 2,4번째 행 요소 추출
m[,&quot;열1&quot;] # 열1 추출
m[&quot;행3&quot;,] # 행3 추출
m[-2, -2] # 2행 2열 제외
col3 &lt;- m[, 3]
m[col3 &gt;= 5,] # 3열의 값이 5이상인 경우 추출
m[m&gt;1] # 1보다 큰 수 모두 추출
</code></pre>
<h4 id="⭐️--행렬-요소-수정">⭐️  행렬 요소 수정</h4>
<pre><code class="language-python">mm[mm &lt; 10] &lt;- 0  # mm에서 10보다 작은 수 0으로 수정
mm[2, 2] &lt;- 9     # mm에서 2행2열의 값 9로 수정
</code></pre>
<h4 id="⭐️-행렬-연산">⭐️ 행렬 연산</h4>
<pre><code class="language-python">m1 * 2    # 모든 값에 x 2 
log2(m1)  # 모든 값에 log2 취함
rowSums(m3)
colSums(m3)</code></pre>
<hr>
<h2 id="🔍-팩터-factor">🔍 팩터 Factor</h2>
<h4 id="⭐️-팩터-변수-만들기">⭐️ 팩터 변수 만들기</h4>
<ul>
<li>팩터는 범주형(명목형) 자료의 데이터 구조이다. 분석 시, factor 형식의 구조여야하는 경우가 종종 있다. <pre><code class="language-python">diz &lt;- factor(c(&quot;양성&quot;, &quot;음성&quot;, &quot;음성&quot;, &quot;양성&quot;, &quot;양성&quot;))
diz
# [1] 양성 음성 음성 양성 양성
# Levels: 양성 음성
</code></pre>
</li>
</ul>
<p>sex &lt;- c(&quot;여성&quot;, &quot;남성&quot;, &quot;여성&quot;)
sex &lt;- factor(sex, levels = c(&quot;여성&quot;, &quot;남성&quot;))
sex</p>
<h1 id="1-여성-남성-여성">[1] 여성 남성 여성</h1>
<h1 id="levels-여성-남성">Levels: 여성 남성</h1>
<pre><code>#### ⭐️ 팩터 요소 수정
```python
# level 추가 
levels(diz) &lt;- c(levels(diz), &quot;악성&quot;)
diz[1] &lt;- &quot;악성&quot;
diz
# [1] 악성 음성 음성 양성 양성
# Levels: 양성 음성 악성
</code></pre><hr>
<h2 id="🔍-배열-array">🔍 배열 Array</h2>
<p>: 2차원 이상의 구조, 행렬을 쌓은 구조, 행렬 문법과 거의 유사함.</p>
<pre><code class="language-python"># 
arr1 &lt;- array(1:24, dim = c(3, 4, 2))
arr1
# , , 1
# 
#      [,1] [,2] [,3] [,4]
# [1,]    1    4    7   10
# [2,]    2    5    8   11
# [3,]    3    6    9   12
# 
# , , 2
# 
#      [,1] [,2] [,3] [,4]
# [1,]   13   16   19   22
# [2,]   14   17   20   23
# [3,]   15   18   21   24

# data, dim, dimnames
arr2 &lt;- array(data=1:12, dim = c(2, 3, 2), dimnames = list(c(&quot;x1&quot;,&quot;x2&quot;), c(&quot;y1&quot;,&quot;y2&quot;,&quot;y3&quot;), c(&quot;z1&quot;,&quot;z2&quot;)))
arr2
# , , z1
#
#   y1 y2 y3
# x1  1  3  5
# x2  2  4  6
#
# , , z2
#
#   y1 y2 y3
# x1  7  9 11
# x2  8 10 12

arr2[,,&quot;z1&quot;] # z1 요소 추출
#   y1 y2 y3
# x1  1  3  5
# x2  2  4  6</code></pre>
<hr>
<h2 id="🔍-데이터프레임-data-frame">🔍 데이터프레임 Data Frame</h2>
<h4 id="⭐️-데이터프레임-구조--dataframe-str-nrow-ncol-summary">⭐️ 데이터프레임 구조 : data.frame(), str(), nrow(), ncol(), summary()</h4>
<pre><code class="language-python">library(MASS)
df &lt;- Boston
str(df) # 데이터 프레임 구조
# &#39;data.frame&#39;:    506 obs. of  14 variables:
# $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
# $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ..
..

nrow(df) # 506
ncol(df) # 14
length(df) # 14

names(df) # 컬럼명 추출

summary(df) # 데이터프레임 각 변수별 요약

colMeans(df) # 컬럼별 평균
</code></pre>
<h4 id="⭐️-데이터프레임-데이터-추출-및-제외-특정위치로-이름으로-조건으로">⭐️ 데이터프레임 데이터 추출 및 제외 :특정위치로, 이름으로, 조건으로</h4>
<pre><code class="language-python"># 첫번째 열 추출 
df$crim
df[,&quot;crim&quot;]
df[,1]

# 특정 행 추출
df[1:3,] # 1-3번째 행

# 특정 데이터 추출
df[2,&quot;crim&quot;]
df$crim[2]
df[2,1]

# 제외 
df[, -1] # 첫번째 열 제외

# 조건
df[df$crim &lt; 0.1, ]

crim01 &lt;- df$crim &lt; 0.1
cols &lt;- c(&quot;crim&quot;, &quot;medv&quot;)
df[crim01, cols]

subset(df, crim &lt; 0.1)
subset(df, crim &lt; 0.1, select = -(zn)) # zm컬럼 제외
</code></pre>
<h4 id="⭐️-데이터프레임-수정-추가-삭제">⭐️ 데이터프레임 수정, 추가, 삭제</h4>
<pre><code class="language-python"># 수정
df$age[2] &lt;- 29
df[3, &quot;score&quot;] &lt;- 95

# 행추가
new_data &lt;- list(&quot;김땡땡&quot;, 26, &quot;여&quot;, 97)
df &lt;- rbind(df, new_data)

# 열추가
df$salary &lt;- c(220, 180, 250, 170, 220, 270, 250, 290, 210)
or
salary2 &lt;- c(220, 180, 250, 170, 220, 270, 250, 290, 210)
df &lt;- cbind(df, salary2)

# 행 삭제
df &lt;- df[!df$score &lt; 80, ] # score 80이하인 행 삭제 

# 열 삭제
df$salary3 &lt;- NULL # salary3 열 삭제
df &lt;- df[, -(1:3)] # 1~3번째 열 제외

</code></pre>
<hr>
<h2 id="ref">Ref</h2>
<ul>
<li><a href="https://manboha.github.io/rbasic/dataframe.html">https://manboha.github.io/rbasic/dataframe.html</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>