<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>soo_oo.zip</title>
        <link>https://velog.io/</link>
        <description>데린이인데요 ໒꒰ྀ ˶ • ༝ •˶ ꒱ྀིა (잘못 된 부분은 너그러이 알려주세요.)</description>
        <lastBuildDate>Wed, 26 Feb 2025 04:09:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>soo_oo.zip</title>
            <url>https://velog.velcdn.com/images/soo_oo/profile/718e0443-b097-4814-888e-b8c74cd7ad1b/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. soo_oo.zip. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/soo_oo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[MYSQL_함수,연산자]]></title>
            <link>https://velog.io/@soo_oo/SQL-MYSQL-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@soo_oo/SQL-MYSQL-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 26 Feb 2025 04:09:30 GMT</pubDate>
            <description><![CDATA[<p><span style="color:#cccccc;background-color:#aaaaaa">이직하고 나한테 여유의 시간을 주다 보니,
점점 공부했던 내용들을 머리속에서 지우는 것 같다.
바로 활용 할 수 있도록 스터디 재시작 - !
</SPAN></p>
<p>현업에서 ORACLE도 많이 사용하고 MY SQL과 문법이 조금씩 다르지만
일단 우선 MY SQL부터 도장 깨기</p>
<h3 id="✏️-basic">✏️ BASIC</h3>
<blockquote>
<h4 id="sql-작성-순서">SQL 작성 순서</h4>
<p>SELECT - <span style="color:#000000;background-color:#fff5b1">FROM - WHERE - GROUP BY - HAVING</span> - ORDER BY - LIMIT</p>
</blockquote>
<blockquote>
<h4 id="sql-실행-순서">SQL 실행 순서</h4>
<p><span style="color:#000000;background-color:#fff5b1">FROM - WHERE - GROUP BY - HAVING</span> - SELECT - ORDER BY - LIMIT</p>
</blockquote>
<h4 id="💡-함수funtions-vs-연산자-operator">💡 함수(Funtions) vs 연산자 (Operator)</h4>
<ul>
<li>함수
영문 함수 이름 + 괄호</li>
</ul>
<h2 id="함수">함수</h2>
<h3 id="✏️-숫자-함수">✏️ 숫자 함수</h3>
<h4 id="💡-평균-avg">💡 평균 (AVG)</h4>
<h4 id="💡-반올림-round">💡 반올림 (ROUND)</h4>
<h4 id="💡-min--max">💡 MIN / MAX</h4>
<h3 id="✏️-null-처리">✏️ NULL 처리</h3>
<h4 id="💡-ifnull">💡 IFNULL</h4>
<p>컬럼이 NULL을 반환할 때, 다른 값으로 출력하는 함수</p>
<pre><code class="language-sql">SELECT IFNULL(컬럼명, 대체값) FROM 테이블명</code></pre>
<pre><code class="language-참고용">**MSSQL**
ISNULL(VALUE1, VALUE2)

**ORACLE**
NVL(VALUE1, VALUE2)</code></pre>
<h3 id="✏️-날짜-함수">✏️ 날짜 함수</h3>
<h4 id="💡-date_format">💡 DATE_FORMAT</h4>
<p>날짜를 지정한 형식으로 출력</p>
<pre><code class="language-sql">SELECT DATE_FORMAT(컬럼명,&#39;%Y-%m-%d&#39;) FROM 테이블명

# 2016년09월22일 17시00분05초
SELECT DATE_FORMAT(컬럼명,&#39;%Y년%m월%d일 %H시%i분%S초&#39;) FROM 테이블명</code></pre>
<h5 id="--format">- FORMAT</h5>
<table>
<thead>
<tr>
<th align="center">형식</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">%Y</td>
<td><strong>연도 Year (4자리)</strong> <br> ex) 1999, 2000, 2020</td>
</tr>
<tr>
<td align="center">%y</td>
<td><strong>연도 Year (2자리)</strong> <br> ex) 99, 00, 20</td>
</tr>
<tr>
<td align="center">%M</td>
<td><strong>월 Month (영문/긴)</strong> <br> ex) January, February ...</td>
</tr>
<tr>
<td align="center">%b</td>
<td><strong>월 Month (영문/짧은)</strong> <br> ex) Jan, Feb ...</td>
</tr>
<tr>
<td align="center">%m</td>
<td><strong>월 Month (숫자/2자리)</strong> <br> ex) 01, 02, 03 ...</td>
</tr>
<tr>
<td align="center">%c</td>
<td><strong>월 Month (숫자/1자리)</strong> <br> ex) 1, 2, 3 ...</td>
</tr>
<tr>
<td align="center">%D</td>
<td><strong>월 Month</strong> <br> ex) 1st, 2dn, 3rd ...</td>
</tr>
<tr>
<td align="center">%d</td>
<td><strong>일 Day (숫자/2자리)</strong> <br> ex) 00, 01, 02 ...</td>
</tr>
<tr>
<td align="center">%e</td>
<td><strong>일 Day (숫자/1자리)</strong> <br> ex) 0, 1, 2 ...</td>
</tr>
<tr>
<td align="center">%W</td>
<td><strong>요일 Day of Week</strong> <br> ex) Sunday, Monday ...</td>
</tr>
<tr>
<td align="center">%a</td>
<td><strong>요일 Day of Week</strong> <br> ex) Sun., Mon. ...</td>
</tr>
<tr>
<td align="center">%H</td>
<td><strong>시 Hour (24시간)</strong> <br> ex) 00, 01,24 ...</td>
</tr>
<tr>
<td align="center">%h</td>
<td><strong>시 Hour (12시간)</strong> <br> ex) 00, 06,12 ...</td>
</tr>
<tr>
<td align="center">%T</td>
<td><strong>hh:mm:ss</strong> <br></td>
</tr>
<tr>
<td align="center">%p</td>
<td><strong>AP, PM</strong></td>
</tr>
</tbody></table>
<h4 id="💡-date-vs-datetime">💡 DATE vs DATETIME</h4>
<table>
<thead>
<tr>
<th align="center">자료형</th>
<th align="center">표기 형식</th>
<th align="center">길이/크기</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><code>DATE</code></td>
<td align="center">YYYY-MM-DD</td>
<td align="center">3 Byte<br>참고 : varchar (8 Byte)</td>
</tr>
<tr>
<td align="center"><code>DATETIME</code></td>
<td align="center">YYYY-MM-DD HH:mm:ss</td>
<td align="center">8 Byte</td>
</tr>
</tbody></table>
<hr>
<h2 id="연산자">연산자</h2>
<p>연산자들은 조건으로 필터링하는 역할이므로 <code>WHERE절</code>에 위치</p>
<blockquote>
<p><strong>WHERE 절</strong>
WHERE 절에서는 단일 행 기준의 조건을 사용해야 하므로, <u>집계 함수를 직접 사용할 수 없습니다.</u>
<code>EX) WHERE MIN(DATETIME)</code></p>
</blockquote>
<h3 id="✏️-특수조건-검색">✏️ 특수조건 검색</h3>
<h4 id="💡-in--not-in">💡 IN / NOT IN</h4>
<ul>
<li>연속적이지 않은 여러값 조회</li>
<li><code>컬러명 IN (&quot;&quot;)</code></li>
</ul>
<pre><code class="language-sql">#SELECT * FROM 테이블명 WHERE 컬럼명 = VALUE 1, 컬럼명 = VALUE 2, 컬럼명 = VALUE 3
SELECT * FROM 테이블명 WHERE 컬럼명 IN (&quot;VALUE 1&quot;, &quot;VALUE 2&quot;, &quot;VALUE 3&quot;)</code></pre>
<h4 id="💡-betweend-and">💡 BETWEEND, AND</h4>
<ul>
<li>연속적인 값 조회<pre><code class="language-sql">#SELECT * FROM 테이블명 WHERE 컬럼명 &gt;= VALUE 1 AND Column &lt;= VALUE 2
SELECT * FROM 테이블명 WHERE 컬럼명 BETWEEN VALUE 1 AND VALUE 2</code></pre>
</li>
</ul>
<h4 id="💡-like">💡 LIKE</h4>
<ul>
<li>문자열 검색</li>
<li>_ : 글자수 1개 , % : 모든 글자</li>
<li><code>컬럼명 LIKE &quot;&quot;</code></li>
</ul>
<pre><code class="language-sql">#A로 시작하는 문자 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;A%&#39;

#A로 끝나는 문자 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;%A&#39;

#A를 포함하는 문자 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;%A%&#39;

#A로 시작하는 두글자 문자 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;A_&#39;


#A로 시작하는 두글자 문자 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;A_&#39;

-----

#첫번째 문자가 &#39;A&#39;&#39;가 아닌 모든 문자열 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE&#39;[^A]&#39;

#첫번째 문자가 &#39;A&#39;또는&#39;B&#39;또는&#39;C&#39;인 문자열 찾기
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;[ABC]&#39;
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE &#39;[A-C]&#39;</code></pre>
<h3 id="✏️-null-처리-1">✏️ NULL 처리</h3>
<h4 id="💡-is-null--is-not-null">💡 IS NULL / IS NOT NULL</h4>
<pre><code class="language-sql">SELECT * FROM 테이블명 WHERE 컬럼명 IS NULL</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[참여형 봄꽃놀이 지도] 24.03.02 ~ 24.03.25]]></title>
            <link>https://velog.io/@soo_oo/%EC%B0%B8%EC%97%AC%ED%98%95-%EB%B4%84%EA%BD%83%EB%86%80%EC%9D%B4-%EC%A7%80%EB%8F%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%8B%9C%EA%B0%81%ED%99%94</link>
            <guid>https://velog.io/@soo_oo/%EC%B0%B8%EC%97%AC%ED%98%95-%EB%B4%84%EA%BD%83%EB%86%80%EC%9D%B4-%EC%A7%80%EB%8F%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%8B%9C%EA%B0%81%ED%99%94</guid>
            <pubDate>Tue, 26 Mar 2024 15:56:54 GMT</pubDate>
            <description><![CDATA[<p>디스코드에서 알게된 머신러닝/데이터사이언스 중심 비영리 커뮤니티 <span style="color:#ff8000"><code>가짜연구소</code></span>
그리고 8기 러너로 진행하게된 <span style="color:#ff8000"><code>참여형 봄꽃놀이 지도</code></span>!!</p>
<p>지금까지 데이터 위주의 프로젝트만 진행했었는데,
처음 경험해보는 백앤드 &amp; 프론트앤드와 함께하는 서비스 기반 프로젝트라 기대를 안고 참여를 하게됐다.</p>
<pre><code>가짜연구소는 머신러닝/데이터사이언스를 중심으로 모인 비영리 커뮤니티입니다.
예측할 수 없는 비선형적인 성장과 너드 문화를 선도하며 사소하고 재밌는 일들을 해오고 있습니다. 
가짜연구소에서는 기초 이론 공부, 논문 리뷰, 연구개발 프로젝트, 논문 작성, 펠로우쉽, 멘토링, 컨퍼런스 등을 진행하며 함께 성장하고 있습니다. 
가짜연구소에 오셔서 동기부여가 가득한 사람들과 관심 있는 주제로 즐겁게 함께하세요!

- 가짜연구소 홈페이지 : https://pseudo-lab.com
- 가짜연구소 디스코드 : https://discord.gg/EPurkHVtp2
- 가짜연구소 블로그 : https://pseudolab.github.io/
- 가짜연구소 유튜브 : https://bit.ly/pseudo-lab-youtube</code></pre><blockquote>
<h3 id="현재까지-진행한-과제">현재까지 진행한 과제</h3>
</blockquote>
<ul>
<li><strong>웹 크롤링</strong><ul>
<li>꽃 이미지 데이터 웹 크롤링</li>
<li>&#39;서울&#39;지역 2020 ~ 2024년 2,3월 기상 정보 웹 크롤링 (최고기온, 최저기온, 일강수량,최대 순간 풍속)</li>
</ul>
</li>
<li><strong>기상 정보 시각화</strong></li>
</ul>
<h3 id="✨-웹-크롤링">✨ 웹 크롤링</h3>
<h4 id="🌸-꽃-이미지-데이터-추출-🌸">🌸 꽃 이미지 데이터 추출 🌸</h4>
<p>본격 진행함에 있어 가장 우선시된 타겟은
봄의 시작을 알리는 가장 상징적인 꽃 <span style="color:#ff3399"><strong>벚꽃</strong></span>이였다.</p>
<p>그리고 기존 데이터 셋에는 벚꽃 이미지가 없었기 때문에 십시일반으로 각 멤버들 모두 300개의 이미지 데이터 수집을 하기로 하였다.
나는 많은 코드 자료가 있기도 하고, 팀원이 올려준 코드가 있는 <code>google image 크롤링</code>을 택했다.</p>
<p>제공받은 코드로 하면 금방 끝날 줄 알았는데, 역시나...
어디서부터 꼬였는지, 약 50개 단위로 이미지들이 중복되어 다운이 받아졌고,
패턴을 찾아보니 아래와 같이 중간에 껴있는 <code>관련 검색어</code>때문에 코드가 잘못 처리된 것으로 보였다.<img src="https://velog.velcdn.com/images/soo_oo/post/948e1c6f-1c58-4a3a-9c34-f44ab144ebfb/image.png" alt=""></p>
<p>중복되지않는 이미지만 다운로드 받기 위한 해결 방법으로
아래와 같이 처리하였고, 무사히 300개 데이터 다운로드 완 🤘🏻</p>
<pre><code class="language-python">downloaded_images = set()  # 이미 다운로드한 이미지 URL을 저장하는 집합 생성
.
.
.
# 이미지 다운로드
for image_info in image_info_list:
    if download_cnt &gt;= image_cnt:
        break
    if &#39;src&#39; in image_info.attrs:
        image_url = image_info[&#39;src&#39;]
        if image_url not in downloaded_images:  # 이미지 중복 체크, 중복되지 않은 것만 다운 받도록 조건 설정
            downloaded_images.add(image_url)
            image_filename = f&quot;{keyword.replace(&#39; &#39;, &#39;_&#39;)}_{download_cnt}.jpg&quot;
            image_path = os.path.join(save_dir, image_filename)
            urllib.request.urlretrieve(image_url, image_path)
            logging.info(f&#39;{image_filename} image download&#39;)
            download_cnt += 1</code></pre>
<h4 id="🌸-기상정보-크롤링-🌸">🌸 기상정보 크롤링 🌸</h4>
<p><a href="https://www.weather.go.kr/w/obs-climate/land/aws-obs.do?db=DAYDB&amp;tm=2024.03.01%2000%3A00&amp;stnId=400&amp;sidoCode=asos&amp;sort=&amp;config=">기상청 사이트</a>에서 2020~2024년, 그 중 개화 시기에 큰 영향을 끼친다 2,3월 위주의 기상 정보를 크롤링하여 가져왔다.
<img src="https://velog.velcdn.com/images/soo_oo/post/d1b681bd-67b5-42f8-bc27-36d8480a5f08/image.png" alt="">
위와 같이 사이트 주소에서 <code>날짜</code>와 <code>지역 코드</code>를 넣으면 자료를 추출할 수 있는 구조였기에,
기상청에서 사용하고 있는 <code>지역 코드</code>를 가장 우선으로 리스트화 하여 정리한 다음, 이걸 주소에 대입시켜 보며 기상 정보 추출까지 완료!🤘🏻
<img src="https://velog.velcdn.com/images/soo_oo/post/454706f7-8a45-491d-97d3-e1eae1929b11/image.png" alt=""></p>
<p>총 <code>11826 rows × 7 columns</code>의 데이터 셋을 만들어 냈다.
<img src="https://velog.velcdn.com/images/soo_oo/post/80facbed-c3ab-4542-a13e-768369b50959/image.png" alt=""></p>
<h3 id="✨-데이터-시각화">✨ 데이터 시각화</h3>
<p>소개받은 새로운 인터랙티브 시각화 라이브러리 중 2023년 성장세 1위라는 <code>pygwalker</code>를 사용하여 위 기상정보의 시각화를 진행했다.</p>
<p><a href="https://docs.kanaries.net/articles/top10-dataviz-in-python">- Top 10 growing data visualization libraries in Python in 2023</a>
<a href="https://github.com/Kanaries/pygwalker">- pygwalker.Github</a> <span style="color:grey"> (한글버전 가이드도 있음!)</span>
<img src="https://velog.velcdn.com/images/soo_oo/post/666a0624-ae00-4e5c-bc43-f79295eb12d4/image.png" alt=""></p>
<p>이 라이브러리를 사용한 소감은 한 마디로 &#39;tableau&#39;, 한 마디 덧붙이면 &#39;간단 그 자체&#39;.
<code>matplot</code>이든 <code>seaborn</code>이든 코드를 원하는 그림을 어느정도 구상하고 코드 쿼리를 작성해야 하는데,</p>
<p>이건 그냥 아래처럼 2줄 작성하면</p>
<pre><code class="language-python">import pygwalker as pyg
walker = pyg.walk(df)</code></pre>
<p>이런 tableau같은 인터랙티브 창이 나온다.
<img src="https://velog.velcdn.com/images/soo_oo/post/3f634e5b-1985-4ae6-b553-c1f3e0407a2d/image.png" alt="">
그럼 입맛에 맞게 x,y열에 데이터 끌어다 넣고 sum이든 avg든 필요한 연산만 클릭하면 자동으로 그래프가 완성된다.</p>
<p>아무리 tableau 같다고 하더라도,
데이터를 추가 연결은 불가(원한다면 df1을 다른 df2와 merge 시켜야함), 투명도/컬러 등 자우 셋팅 불가 (데이터 값으로만 조정 가능) 등 자유롭지 않다는 한계점이 있었다.
그래도 에러-수정-에러-수정이 있는 코드 쿼리 작성보다는 확실히 편했다.</p>
<p>아래처럼 map 시각화도 가능하긴 한다는데, 음..이 자료로는 효과적이지 못해서 작동 방법만 몇 번 클릭만 해봤다.
<img src="https://velog.velcdn.com/images/soo_oo/post/81a525ab-bcf9-4d2d-a91e-acf2e1ea1137/image.png" alt=""></p>
<h3 id="✨-회고">✨ 회고</h3>
<p>오랜만에 셀레니움, 웹 크롤링을 해보며 &#39;역시 코딩은 계속 꾸준히 직접 짜봐야한다&#39;는걸 되새기고,
새로운 라이브러리들을 보면서 &#39;역시 세상엔 천재들이 많구나&#39; 깨우쳤다.</p>
<h3 id="✨-기타-자료">✨ 기타 자료</h3>
<p><a href="https://docs.kanaries.net/ko/articles/best-python-visualization-library">데이터를 통해 통찰력을 얻기 위한 최고의 파이썬 시각화 라이브러리</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[딥러닝] ✨딥러닝 베이직 ✨]]></title>
            <link>https://velog.io/@soo_oo/%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@soo_oo/%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Sat, 02 Dec 2023 05:43:20 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-확률적-경사-하강법sgd을-이용한-로지스틱-회귀-모델">✏️ 확률적 경사 하강법(SGD)을 이용한 로지스틱 회귀 모델</h2>
<ul>
<li>이미지 분류에 유용</li>
<li>가장 간단한 인공 신경망<pre><code class="language-python">from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss=&#39;log&#39;, max_iter=5) # max_iter=5 : 5번 에포크
scores = cross_validate(sc, train_X, train_y, n_jobs=-1)
print(np.mean(scores[&#39;test_score&#39;]))</code></pre>
</li>
</ul>
<h2 id="✏️-텐서플로-tensorflow">✏️ 텐서플로 (TensorFlow)</h2>
<blockquote>
<ul>
<li>딥러닝 라이브러리</li>
</ul>
</blockquote>
<ul>
<li>CPU, GPU를 사용해 인공 신경망 모델을 효율적으로 훈련</li>
</ul>
<pre><code>from tesorflow as tf</code></pre><h3 id="💡-케라스keras">💡 케라스(Keras)</h3>
<ul>
<li>텐서플로 내 고수준 API</li>
<li>직접 GPU 실행 X, 백앤드(텐서플로, 씨아노, CNTK 등)와 함께</li>
<li>기본적으로 &#39;미니배치 경사 하강법&#39;사용<pre><code class="language-python">from tesorflow import keras</code></pre>
</li>
<li>용량이 크기 때문에 교차 검증을 잘 사용 X =&gt; 검증 세트는 별도로 덜어내어 사용<pre><code class="language-python">from sklearn.model_selection import train_test_split
train_X, val_X, train_y, train_y= \
train_test_split(train_X, train_y, test_size=0.2) 
#test_size=0.2 : 검증 세트는 20%로</code></pre>
</li>
</ul>
<h4 id="1-1밀집층-만들기">1-1.밀집층 만들기</h4>
<ul>
<li>머신러닝과 다른 추가 단계</li>
<li>신경망 중 가장 기본층</li>
<li>Dense<ul>
<li>밀집층을 만드는 클래스</li>
<li>n : 뉴런 개수</li>
<li>activation=&#39;abc&#39; : 뉴런 출력에 적용할 함수 (보통 &#39;softmax&#39;), 회귀에선 아무 값도 지정 안함</li>
<li>input_shape=(x,y) : 입력의 크기<pre><code class="language-python">dense = keras.layers.Dense(n,activation=&#39;abc&#39;,input_shape=(x,y))</code></pre>
</li>
</ul>
</li>
<li>이진 분류일 경우 :
activation=&#39;sigmoid&#39;</li>
<li>뉴런이 3개 이상의 다중 분류일 경우 (이진분류 X) :
activation=&#39;softmax&#39; <a href="https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%ED%8F%89%EA%B0%80-%ED%9A%8C%EA%B7%80-vs-%EB%B6%84%EB%A5%98#%EF%B8%8F-%EB%B6%84%EB%A5%98classification">(참고-분류 파트)</a></li>
</ul>
<h4 id="1-2-dense---은닉층-만들기-for-심층-신경망-1️⃣">1-2. Dense - 은닉층 만들기 for 심층 신경망 1️⃣</h4>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/d72bf7fb-86fd-4cda-8f6d-a9f593869269/image.png" alt=""></p>
<ul>
<li>출력층(이진-시그모이드, 다중-소프트맥스)에 비해 사용할 수 있는 활성화 함수가 자유로움/ &#39;시그모이드&#39; &amp; &#39;볼 렐루&#39; 함수 주로 사용</li>
</ul>
<table>
<thead>
<tr>
<th><center>&quot;은닉층&quot; 활성화 함수 종류</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td><span style="color:yellowgreen">&#39;시그모이드 함수&#39;</span></td>
<td>- 하나의 선형 방정식 출력값을 0~1사이로 압축<br>- 초창기 인공 신경망 은닉층에서 활용 -&gt; 왼쪽&amp;오른쪽 양 끝이 갈수록 누워있어 신속하게 대응 X</td>
</tr>
<tr>
<td><span style="color:yellowgreen">&#39;볼 렐루&#39;</span></td>
<td>- 은닉층에서의 &#39;시그모이드 함수&#39; 단점 보완 <br> - 입력이 양수일 경우, 활성화 함수가 없는 것 처럼 입력 통과 &amp; 음수일 경우, 0으로 변환</td>
</tr>
<tr>
<td>* 몇 개의 뉴런을 둘지는 기준 x, 다만 출력층 뉴런보다 개수가 많아야 함</td>
<td></td>
</tr>
<tr>
<td>```python</td>
<td></td>
</tr>
<tr>
<td>#은닉층으로 사용할 것</td>
<td></td>
</tr>
<tr>
<td>dense1 = keras.layers.Dense(100, activation=&#39;sigmoid&#39; input_shape=(784,))</td>
<td></td>
</tr>
<tr>
<td>dense2 = keras.layers.Dense(10,activation=&#39;softmax&#39;)</td>
<td></td>
</tr>
<tr>
<td>```</td>
<td></td>
</tr>
</tbody></table>
<h4 id="1-3-1-2단계-말고-2-2로-바로-넘어가기">1-3. &#39;1-2&#39;단계 말고 &#39;2-2&#39;로 바로 넘어가기</h4>
<h4 id="2-1-밀집층을-가진-신경망-모델-만들기">2-1. 밀집층을 가진 신경망 모델 만들기</h4>
<ul>
<li>케라스의 Sequential() 사용</li>
</ul>
<pre><code class="language-python"># model : 신경망 모델
model = leras.Sequential(dense)</code></pre>
<pre><code class="language-python"># layer(층)이 2개 이상 일 경우 (은닉층 같이)
# 순서 중요 : 출력층을 가장 마지막에 위치
model = kearas.Sequential([dense1,dense2])</code></pre>
<ul>
<li>model 분석하기 - .summary()<ul>
<li>Output Shape에서 첫번째 차원 : 샘플 개수 (None / 어떤 배치 크기에도 유연하게 대응 가능)
fit()메서드에서 batch_size=로 수정 가능</li>
<li>Output Shape에서 두번째 차원 : 출력 개수 (100,10 / 입력층보다 적어야 정상</li>
<li>Total = dense 1(784*100+10) + dense 2 (100*10+10) = 79510<pre><code class="language-pyhthon">model.summary()
&gt;&gt;&gt;
Model: &quot;sequential_1&quot;</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="layer-type----------------output-shape--------------param-"> Layer (type)                Output Shape              Param #   </h1>
<p> dense_1 (Dense)             (None, 100)               78500     </p>
<p> dense_2 (Dense)             (None, 10)                1010      </p>
<p>=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)</p>
<hr>
<pre><code>#### 2-2. Sequential() - 은닉층 만들기 2️⃣
```python
model = keras.Sequential([
    keras.layers.Dense(100,activation=&#39;sigmoid&#39;, input_shape =(784,), name = &#39;hidden&#39;),
    keras.layers.Dense(10,activation=&#39;softmax&#39;,name=&#39;output&#39;)
],name=&#39;패션 MNIST 모델&#39;)</code></pre><pre><code class="language-python">model.summary()
&gt;&gt;&gt;
Model: &quot;패션 MNIST 모델&quot;
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 hidden (Dense)              (None, 100)               78500     

 output (Dense)              (None, 10)                1010      

=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________</code></pre>
<h4 id="2-3-add-메서드---은닉층-만들기-3️⃣">2-3. add() 메서드 - 은닉층 만들기 3️⃣</h4>
<pre><code class="language-python">model = keras.Sequential()
model.add(keras.layers.Dense(100,activation=&#39;sigmoid&#39;, input_shape=(784,),name=&#39;hidden&#39;))
model.add(keras.layers.Dense(10,activation=&#39;softmax&#39;,name=&#39;output&#39;))</code></pre>
<pre><code class="language-python">model.summary()
&gt;&gt;&gt;
Model: &quot;sequential_2&quot;
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 hidden (Dense)              (None, 100)               78500     

 output (Dense)              (None, 10)                1010      

=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________</code></pre>
<h4 id="2-4-렐루-함수---은닉층-만들기-3️⃣">2-4. 렐루 함수 - 은닉층 만들기 3️⃣</h4>
<ul>
<li>[참고] Flatten() 메서드
<code>train_X= train_X.reshape(-1,n)</code>을 통해 1차원으로 변환하던 것을 Flatten 메서드로 간편하게 진행<pre><code class="language-python">model = keras.Sequential()
#input_shape=(n,m) : 데이터 크기 n x m
model.add(keras.layers.Flatten(input_shape=(n,m)))
model.add(keras.layers.Dense(100, activation=&#39;relu&#39;))
model.add(keras.layers.Dense(10,activation=&#39;softmax&#39;))
model.summary()
&gt;&gt;&gt;
#Flatten 층이 추가로 생김 -&gt; 784개의 입력이 1차원으로 변환하여 은닉층에 전달
Model: &quot;sequential_5&quot;</code></pre>
</li>
</ul>
<hr>
<h1 id="layer-type----------------output-shape--------------param--1"> Layer (type)                Output Shape              Param #   </h1>
<p> flatten (Flatten)           (None, 784)               0         </p>
<p> dense_5 (Dense)             (None, 100)               78500     </p>
<p> dense_6 (Dense)             (None, 10)                1010      </p>
<p>=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)</p>
<hr>
<pre><code>
#### 3. 훈련 전 설정
* model 객체의 compile()메서드 수행 - 손실 함수 &amp; 측정 지표등 지정
* &quot;손실 함수 종류&quot; 중요
* metrics=accuracy : 에포크마다 손실도를 알려줄 때, 정확도도 함께 출력
```python
# 원-핫 인코딩이 준비되지 않았을 경우,
model.compile(loss=&#39;sparse_categorial_crossentropy&#39;, metrics=&#39;accuracy&#39;)</code></pre><pre><code class="language-python"># 원-핫 인코딩 준비됐을 경우,
model.compile(loss=&#39;categorial_crossentropy&#39;, metrics=&#39;accuracy&#39;)</code></pre>
<h4 id="4-모델-훈련하기">4. 모델 훈련하기</h4>
<pre><code class="language-python">model.fit(train_X, train_y, epochs=5, verbose=1)
#verbose=1 : default / 에포크마다 진행 막대 &amp; 지표 등 표시
#verbose=0: 에포크마다 진행 막대 &amp; 지표 등 표시 X
#verbose=2 : 에포크마다 지표 표시 (진행 막대 표시 X)
&gt;&gt;&gt;&gt;
Epoch 1/5
1500/1500 [==============================] - 8s 3ms/step - loss: 0.6105 - accuracy: 0.7931
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4744 - accuracy: 0.8387
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4509 - accuracy: 0.8481
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4369 - accuracy: 0.8514
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4292 - accuracy: 0.8549
&lt;keras.src.callbacks.History at 0x7c8e7d74d870&gt;</code></pre>
<h4 id="5-모델-검증하기">5. 모델 검증하기</h4>
<p>머신러닝에서 일종의 <code>.score</code>과 동일한 구조</p>
<pre><code class="language-python">model.evaluate(val_X,val_target)</code></pre>
<h3 id="💡-콜백supcallbacksup">💡 콜백<sup>callback</sup></h3>
<ul>
<li>ModelCheckpoint 콜백<ul>
<li>에포크마다 모델을 저장</li>
<li><code>save_best_only = True</code> : 가장 낮은 검증 점수를 만드는 모델 저장</li>
<li><span style="color:gray">혼공머신 408p 참고</span></li>
</ul>
</li>
</ul>
<h3 id="💡-조기-종료supearly-stoppingsup">💡 조기 종료<sup>early stopping</sup></h3>
<ul>
<li>과대 적합 전에, 훈련을 중지하는 것 (훈련 epoch 횟수 제한)</li>
<li>콜백 종류 중 하나</li>
<li>파라미터<ul>
<li><code>patience = n</code> : n번 연속 검증 점수가 향상 되지 않으면 훈련 중지</li>
<li><code>restore_best_weights=True</code> : 가장 낮은 검증 손실을 낸 모델 파라미터로 되돌림</li>
</ul>
</li>
<li><span style="color:gray">혼공머신 409p 참고</span><pre><code class="language-python">model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer=&#39;adam&#39;, loss=&#39;sparse_categorical_crossentropy&#39;, metrics=&#39;accuracy&#39;)
checkpoint_cb = keras.callbacks.ModelCheckpoint(&#39;best-model.h5&#39;,save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,restore_best_weights=True)
history=model.fit(train_scaled, train_target, epochs=20,verbose=0, validation_data=(val_scaled, val_target),callbacks=[checkpoint_cb,early_stopping_cb])</code></pre>
</li>
</ul>
<h3 id="💡-딥러닝-하이퍼파라미터">💡 딥러닝 하이퍼파라미터</h3>
<ul>
<li><p>추가할 은닉층의 개수</p>
</li>
<li><p>뉴런 개수</p>
</li>
<li><p>활성화 함수</p>
</li>
<li><p>층의 종류</p>
</li>
<li><p>배치 사이즈 매개변수</p>
</li>
<li><p>에포크 매개변수 </p>
</li>
<li><p>compile 옵티마이저 설정</p>
<ul>
<li>SGD : 가장 기본 옵티마이저<ul>
<li>학습률 
<code>sgd=keras.optimizers.SGD(learning_rate=0.1)</code></li>
<li>모멘텀 최적화
보통 모멘텀 매개변수는 0.9 이상 지정</li>
<li>네스테로프
기본값인 False를 True로 설정 -&gt; 네스테로프 모멘텀 최적화 (네스테로프 가속 경사)
<code>sgd = keras.optimizers.SGD(momentum=0.9, nestrov=True)</code><pre><code class="language-python">model.compile(optimizer=&#39;sgd&#39;,     loss=&#39;sparse_categorical_crossentropy&#39;,   metrics=&#39;accuracy&#39;)
</code></pre>
</li>
</ul>
</li>
</ul>
<p>혹은</p>
<p>sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd,   loss=&#39;sparse_categorical_crossentropy&#39;,   metrics=&#39;accuracy&#39;)</p>
<pre><code> * Adagrad : &#39;적응적 학습률&#39;을 사용하는 옵티마이저 1 (default =0.001)
 &#39;적응적 학습률&#39; : 모델이 최적점에 가까울수록 학습률을 낮춤 -&gt; 안정적으로 최적점 수렴
```python
adagrad=keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss=&#39;saprse_categorical_crossentropy&#39;,   metrics=&#39;accuracy&#39;)</code></pre><ul>
<li>RMSprop : &#39;적응적 학습률&#39;을 사용하는 옵티마이저 2 (default = 0.001)<pre><code class="language-python">rmsprop=keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss=&#39;saprse_categorical_crossentropy&#39;,   metrics=&#39;accuracy&#39;)</code></pre>
</li>
<li>Adam : 모멘텀 최적화 + RMSprop<pre><code class="language-python">model.compile(optimizer=&#39;adam&#39;,   loss=&#39;saprse_categorical_crossentropy&#39;,   metrics=&#39;accuracy&#39;)</code></pre>
</li>
</ul>
</li>
<li><p>드롭아웃</p>
<ul>
<li>훈련이 끝난 뒤, 평가 &amp; 예측시에는 드롭아웃을 적용 X</li>
<li>텐서프로 &amp; 케라스는 자동으로 드롭아웃 적용 X<pre><code class="language-python">#30 % 드롭 아웃함
model.add(keras.layers.Dropout(0.3))</code></pre>
</li>
</ul>
</li>
<li><p>등등</p>
</li>
</ul>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>교재 &#39;혼자 공부하는 머신러닝 + 딥러닝&#39;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] ✨성능 평가✨]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%84%B1%EB%8A%A5-%ED%8F%89%EA%B0%80</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%84%B1%EB%8A%A5-%ED%8F%89%EA%B0%80</guid>
            <pubDate>Thu, 30 Nov 2023 13:18:26 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-성능평가">✏️ 성능평가</h2>
<p><span style="color:grey">&quot;회귀&quot;보다 평가 항목이 많은 편</span></p>
<ul>
<li><a href="https://white-joy.tistory.com/9">분류 모델 성능 평가 지표(Accuracy, Precision, Recall, F1 score 등)</a></li>
<li>Confusion Matrix(혼동 행렬, 오차 행렬) / Accuracy(정확도) / Precision(정밀도) 등등</li>
</ul>
<h3 id="💡-confusion-matrix혼동-행렬-오차-행렬">💡 Confusion Matrix(혼동 행렬, 오차 행렬)</h3>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/31c47b28-a86c-4813-a256-8f65a00ca688/image.png" alt=""></p>
<ul>
<li><p>Predicted Values (예측)</p>
<ul>
<li><u><strong>P(Positive)</strong></u>: 모델이 positive라고 예측 (1)</li>
<li><u><strong>N(Negative)</strong></u>: 모델이 negative라고 예측 (0)</li>
</ul>
</li>
<li><p>Actual values (실제)</p>
<ul>
<li><u><strong>T(True)</strong></u>: 예측한 것이 정답 (1)</li>
<li><u><strong>F(False)</strong></u>: 예측한 것이 오답 (0)</li>
</ul>
</li>
<li><p>Actual + Predicted</p>
<ul>
<li><u><strong>TP(True Positive)</strong></u>: 모델이 positive라고 예측했는데 실제로 정답이 positive (정답)</li>
<li><u><strong>TN(True Negative)</strong></u>: 모델이 negative라고 예측했는데 실제로 정답이 negative (정답)</li>
<li><u><strong>FP(False Positive)</strong></u>: 모델이 positive라고 예측했는데 실제로 정답이 negative (오답) =&gt; 1종 오류 (Type 1 error)</li>
<li><u><strong>FN(False Negative)</strong></u>: 모델이 negative라고 예측했는데 실제로 정답이 positive (오답) =&gt; 2종 오류 (Type 2 error)</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/4035c3aa-04da-401f-95a7-857e516b1cb9/image.png" alt=""></p>
<h3 id="💡-accuracy정확도">💡 Accuracy(정확도)</h3>
<ul>
<li><code>.score</code></li>
<li>전체 데이터 중 맞게 예측한 것의 비율</li>
<li>0 ~ 1 사이의 값을 가지며, 1에 가까울수록 좋다.</li>
<li>데이터가 불균형할 때, (ex) positive:negative=9:1)는 Accuracy만으로 제대로 분류했는지는 알 수 없기 때문에 Recall과 Precision을 사용한다.</li>
</ul>
<p>$$
Accuracy=\frac{TP+TN}{TP+TN+FP+FN}$$</p>
<h3 id="💡-precision정밀도--ppvpositive-predictive-value">💡 Precision(정밀도) = PPV(Positive Predictive Value)</h3>
<ul>
<li>Predict가 Positive(양성)인 것중 실제 양성 비율
$$
Precision=\frac{TP}{TP+FP}$$
<img src="https://velog.velcdn.com/images/soo_oo/post/ff4f7993-07e6-48eb-8fd9-5036a571838f/image.png" alt=""></li>
</ul>
<h3 id="💡-recall재현율--sensitivity민감도--tprtrue-positive-rate">💡 Recall(재현율) = Sensitivity(민감도) = TPR(True Positive Rate)</h3>
<ul>
<li>Actual이 Positive(양성)인 것 중 양성이라고 예측한 비율
(실제 1 중에서 1이라고 예측)
$$
Recall=\frac{TP}{TP+FN}$$
<img src="https://velog.velcdn.com/images/soo_oo/post/70c6f6f3-e7ef-4507-a65b-cce3eb9fa4e5/image.png" alt=""></li>
</ul>
<h3 id="💡-fall-out위양성률--fprfalse-positive-rate">💡 Fall Out(위양성률) = FPR(False Positive Rate)</h3>
<ul>
<li>실제 정답이 negative인 것들 중에서 모델이 positive라고 예측한 비율
$$
Fall Out=\frac{FP}{FP+TN}$$
<img src="https://velog.velcdn.com/images/soo_oo/post/0cd0c9e8-de6a-4b11-b2b4-4c8fc9538a94/image.png" alt=""></li>
</ul>
<h3 id="💡-5-f1-score">💡 5. F1 score</h3>
<ul>
<li>Recall + Precision</li>
<li>Precision과 Recall이 한쪽으로 치우쳐지지 않고 모두 클 때 큰 값을 가진다.</li>
<li>0 ~ 1 사이의 값을 가지며, 1에 가까울수록 좋다.
$$
F1=\frac{2×Precision×Recall}{Precision+Recall}$$</li>
</ul>
<hr>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>제로베이스 &#39;데이터 취업스쿨&#39; 수강중
교재 &#39;혼자 공부하는 머신러닝 + 딥러닝&#39;
<a href="https://white-joy.tistory.com/9">분류 모델 성능 평가 지표(Accuracy, Precision, Recall, F1 score 등)</a>
<a href="https://rebro.kr/183">Rebro의 코딩 일기장:티스토리</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] ✨모델 (회귀 vs 분류)✨]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%ED%8F%89%EA%B0%80-%ED%9A%8C%EA%B7%80-vs-%EB%B6%84%EB%A5%98</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%ED%8F%89%EA%B0%80-%ED%9A%8C%EA%B7%80-vs-%EB%B6%84%EB%A5%98</guid>
            <pubDate>Tue, 31 Oct 2023 13:24:04 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-회귀-regression">✏️ 회귀 (Regression)</h2>
<blockquote>
</blockquote>
<ul>
<li><span style="color:yellowgreen">임의의 수치(연속적인 값)</span>를 예측하는 문제 </li>
<li>score 확인시, &quot;결정 계수(R<sup>2</sup>)&quot;로 평가</li>
<li>손실 함수 확인시, &#39;평균 제곱 오차<sup>mean squared error</sup>&#39;사용</li>
<li>mean_absolute_error() : 회귀 모델에의 평균 절댓값 오차 계산 
```python
from sklearn.metrics import mean_absolute_error
test_prediction = knr.predict(test_input) #예측값
mae = mean_absolute_error(test_target,test_prediction) #test_target : 정답값, test_prediction : 예측값
print(mae)<blockquote>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
</blockquote>
</li>
</ul>
<p>19.157142857142862
#예측이 타깃값과 19 정도 차이가 난다는 뜻</p>
<pre><code>
### 💡 K-최근접 이웃 회귀
* 사례 기반 학습
* 학습된 범위 이상 예측이 어려움
* 데이터 스케일링 필요할 수도 있음

```python
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()</code></pre><h3 id="💡-선형-회귀-linear-reg">💡 선형 회귀 (Linear Reg.)</h3>
<pre><code class="language-python">from sklearn.linear_model import LinearRegression
lr = LinearRegression()</code></pre>
<ul>
<li>모델 기반 학습</li>
<li>특성 &amp; 타깃간 관계를 가장 잘 나타내는 선형 방정식을 구함 (a=기울기, b= y절편)
$$
y=ax×b$$<pre><code class="language-python"># a &amp; b 구하기
print(lr.coef_, lr.intercept_)
</code></pre>
</li>
</ul>
<h1 id="a--lrcoef_--특성에-대한-계수를-포함한-배열--특성의-개수">a = lr.coef_ / 특성에 대한 계수를 포함한 배열 = 특성의 개수</h1>
<h1 id="b--lrintercept_--절편">b = lr.intercept_ / 절편</h1>
<pre><code>* 선형 회귀가 찾은 특성 &amp; 타깃 관계는 선형 방정식의 &#39;계수&#39; 혹은 &#39;가중치&#39;에 저장
* 잔차 (residue)
  * 에러 값
  * 어떤 모델이 데이터의 정보를 적절하게 잡아냈는지 여부를 확인할 때 유용
  * 잔차의 평균이 0인 정규 분포를 따라야 함
  * 잔차 평가 : 잔차의 평균이 0이고 정규분포를 따르는지 확인
* &lt;span style=&quot;color:grey&quot;&gt;2차방정식 (다항회귀/곡선형/비선형) : 혼공머신 139p 확인&lt;/span&gt;
  * get_feature_names_out()
 ```python
poly=PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly=poly.transform(train_input)
poly.get_feature_names_out()
#[19.6, 5.14 , 3.04 , 384.16, 100.744 , 59.584, 26.4196, 15.6256, 9.2416]의 값은
#array([&#39;x0&#39;, &#39;x1&#39;, &#39;x2&#39;, &#39;x0^2&#39;, &#39;x0 x1&#39;, &#39;x0 x2&#39;, &#39;x1^2&#39;, &#39;x1 x2&#39;,&#39;x2^2&#39;], dtype=object)으로 계산됨</code></pre><h3 id="💡-다중-회귀">💡 다중 회귀</h3>
<ul>
<li>2개 이상의 여러 개의 특성을 사용한 선형 회귀</li>
<li>선형 회귀 모델과 동일한 <code>from sklearn.linear_model</code>사용</li>
<li>특성이 많 -&gt; 선형 모델의 고성능 발휘</li>
</ul>
<h3 id="💡-릿지--라쏘-회귀">💡 릿지 &amp; 라쏘 회귀</h3>
<ul>
<li>선형 회귀 모델에 <a href="https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#-%EC%A7%80%EB%8F%84-%ED%95%99%EC%8A%B5---%EA%B3%BC%EB%8C%80%EC%A0%81%ED%95%A9--%EA%B3%BC%EC%86%8C%EC%A0%81%ED%95%A9">규제</a><sup>regularzation</sup>를 추가한 모델</li>
<li>해서 선형 모델과 동일하게 <code>from sklearn.linear_model</code>사용</li>
<li>두 모델 모두 계수의 크기를 줄이지만 &#39;라쏘&#39;는 0까지 가능<h4 id="1-릿지-회귀">1. 릿지 회귀</h4>
</li>
<li>계수를 제곱한 값을 기준으로 규제 적용</li>
<li>&#39;릿지&#39;를 &#39;라쏘&#39;보다 더 선호하는 추세<pre><code class="language-python">from sklearn.linear_model import Ridge
ridge=Ridge()
ridge.fit(train_X,train_y)</code></pre>
<h4 id="2-라쏘-회귀">2. 라쏘 회귀</h4>
</li>
<li>계수의 절대값을 기준으로 규제 적용<pre><code>from sklearn.linear_model import Lasso
lasso=Lasso()
lasso.fit(train_X,train_y)</code></pre><h3 id="💡-회귀-result-확인하기">💡 회귀 result 확인하기</h3>
<img src="https://velog.velcdn.com/images/soo_oo/post/332e7484-01bd-4bd3-99f4-35cb0014d3fa/image.png" alt=""><h3 id="💡-비용함수-coste-func">💡 비용함수 (Coste Func.)</h3>
<a href="https://box-world.tistory.com/6">[머신러닝] 비용함수(Cost Function)란</a></li>
</ul>
<hr>
<h2 id="✏️-분류classification">✏️ 분류(Classification)</h2>
<blockquote>
<p><strong><u>특징</u></strong></p>
</blockquote>
<ul>
<li><p>예측값으로 <span style="color:yellowgreen">이산적인 값</span>을 출력</p>
<ul>
<li>이산값 :  0과1로 처리할 수 있는 값으로써 연속적이 아닌 단속적인 값</li>
<li>아이리스 문제, 와인 종류, 부도 여부(yes/no), 여신 승인 여부, 동물 분류(dog/cat) 등</li>
</ul>
</li>
<li><p>종류 <span style="color:grey">(혼공머신 - 190p, 356p)</span></p>
<ul>
<li><strong><u>이진 분류</u></strong> : Yes/ No처럼 두가지의 답으로 분류하는 것</li>
<li><strong><u>다중 분류</u></strong> : 다양한 답으로 분류 (타깃 데이터에 클래스가 2개 이상)</li>
</ul>
</li>
<li><p>이진 분류 <a href="https://velog.io/@soo_oo/%EB%94%A5%EB%9F%AC%EB%8B%9D">(딥러닝 관련)</a></p>
</li>
</ul>
<table>
<thead>
<tr>
<th><center>함수 종류</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>활성화 함수</td>
<td><span style="color:yellowgreen">&#39;시그모이드 함수&#39;</span> 사용 <br>(하나의 선형 방정식 출력값을 0~1사이로 압축)</td>
</tr>
<tr>
<td>손실 함수</td>
<td>- <span style="color:yellowgreen">&#39;로지스틱 손실 함수&#39;</span> 혹은 &#39;이진 크로스 엔트로피 손실 함수&#39; 사용<br>- binary_crossentropy</td>
</tr>
</tbody></table>
<ul>
<li>다중 분류 <a href="https://velog.io/@soo_oo/%EB%94%A5%EB%9F%AC%EB%8B%9D">(딥러닝 관련)</a></li>
</ul>
<table>
<thead>
<tr>
<th><center>함수 종류</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>활성화 함수</td>
<td><span style="color:yellowgreen">&#39;소프트맥스 함수&#39;</span> 사용<br>(여러 개의 선형 방정식의 출력값을 0 ~ 1사이로 압축 &amp; 전체 합을 1로)</td>
</tr>
<tr>
<td>손실 함수</td>
<td>- <span style="color:yellowgreen">&#39;크로스 엔트로피 손실 함수&#39;</span> 사용 <br> - categorical_crossentropy<br>- 원-핫 인코딩이 준비되어 있지 않을 경우,<br>sparse_categorical_crossentropy</td>
</tr>
<tr>
<td>```</td>
<td></td>
</tr>
<tr>
<td>손실 함수 (비용 함수)</td>
<td></td>
</tr>
<tr>
<td>- 지도학습(Supervised Learning) 시, 알고리즘이 예측한 값과 실제 정답의 차이를 비교하기 위한 함수.</td>
<td></td>
</tr>
<tr>
<td>- &#39;학습 중에 알고리즘이 얼마나 잘못 예측하는 정도&#39;를 확인하기 위한 함수로써 최적화(Optimization)를 위해 최소화하는 것이 목적인 함수</td>
<td></td>
</tr>
<tr>
<td>```</td>
<td></td>
</tr>
</tbody></table>
<h4 id="다중-분류">다중 분류</h4>
<ul>
<li>다중 분류 : 다양한 답으로 분류 (타깃 데이터에 클래스가 2개 이상)<ul>
<li>타깃을 1과0이 아닌 알파벳 그대로 사용 가능하나, 알파벳 순서로 정렬됨</li>
<li>클래스 배열 확인하기</li>
</ul>
</li>
</ul>
<hr>
<h3 id="💡-k-최근접-이웃-알고리즘">💡 K-최근접 이웃 알고리즘</h3>
<ul>
<li>KNeighborsClassifier(n_neighbors=n)</li>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html">sklearn.neighbors.KNeighborsClassifier</a></li>
<li>사례 기반 학습</li>
<li>거리기반 분류분석 모델<ul>
<li>가장 가까운 유사 속성에 따라 분류하여 라벨링하는 것</li>
<li>거리가 가까운 &#39;k&#39;개의 다른 데이터의 레이블을 참조하여 분류하는 알고리즘</li>
<li>다수를 보고! 다수를 차지!하는 것을 정답으로 사용</li>
<li><span style="color:yellowgreen">사전에 기준치(단위,스케일)를 맞춰야 함 =&gt; 특성공학 차원에서 표준 편차, 표준 점수를 이용 하는 편</span></li>
<li>거리 측정시 &#39;유클리드 거리&#39; 계산법 사용</li>
</ul>
</li>
<li>데이터가 아주 많은 경우 사용하기 어려움</li>
<li>데이터 스케일링이 필요할 수도 있음 `혹은 plt.axis(&#39;equal&#39;)로 x축, y축 동일하게 만들어서 산점도 확인해보기<pre><code class="language-python">from sklearn.neighbors import KNeighborsClassifier
kn=KNeighborsClassifier()
#train_y 는 다중 클래스
kn.fit(train_X, train_y)
kn.classes_</code></pre>
<table>
<thead>
<tr>
<th><center>파라미터 (Parameters)</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>n_neighbors</td>
<td>- n_neighbors=int (참고할 데이터 개수,default=5)<br>ex) kn49=KenighborsClassifier(n_neighbors=49)<br>가장 가까운 49개 데이터에서 다반수인 것을 예측<br>- 분류가 가능하도록 K는 홀수로 설정하는 것이 좋으며, 일반적으로는 총 데이터 수의 제곱근 값을 사용<br><img src="https://velog.velcdn.com/images/soo_oo/post/6d132dfc-47d2-4899-a595-e587b3858bd4/image.png" alt=""></td>
</tr>
<tr>
<td>weights</td>
<td>- {‘uniform’, ‘distance’}, callable or None, default=’uniform’</td>
</tr>
<tr>
<td>algorithm</td>
<td>- {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’</td>
</tr>
<tr>
<td>n_jobs</td>
<td>- n_neighbors=int (default=None)</td>
</tr>
<tr>
<td>```python</td>
<td></td>
</tr>
<tr>
<td>print(kn._fit_X) #knn으로 훈련된 x 프린트</td>
<td></td>
</tr>
<tr>
<td>print((kn._y) #knn으로 훈련된 x 프린트</td>
<td></td>
</tr>
<tr>
<td>```</td>
<td></td>
</tr>
<tr>
<td>#### - 가장 가까운 이웃 값들 구하기 (이웃 개수 : 기본값 5일 때)</td>
<td></td>
</tr>
<tr>
<td>```python</td>
<td></td>
</tr>
<tr>
<td>distance, indexes= kn.kneighbors([[25,150]])</td>
<td></td>
</tr>
</tbody></table>
</li>
</ul>
<p>train_input[indexes]</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p>array([[[ 25.4, 242. ],
        [ 15. ,  19.9],
        [ 14.3,  19.7],
        [ 13. ,  12.2],
        [ 12.2,  12.2]]])</p>
</blockquote>
</blockquote>
<pre><code>### 💡 ⭐️로지스틱 회귀
* 이진 분류 &amp; 다중 분류에 사용되므로 &#39;분류&#39;파트에 작성
* 선형 회귀와 같이 &#39;선형 방정식&#39; 사용하지만 값을 0~1사이로 압축 (&#39;타깃&#39;일 확률을 계산함)
  * 다중 분류-원 핫 인코딩 : 타깃 값 클래스만 1, 나머지 0인 배열로 만드는 것
* 선형 회귀와 달리 &#39;시그모이드 함수&#39;, &#39;소프트맥스 함수&#39; 사용

```python
from sklearn.linear_model import LogisticRegression
lr= LogisticRegression()</code></pre><h3 id="💡-⭐️sgd-classifier-확률적-경사-하강법">💡 ⭐️SGD Classifier (확률적 경사 하강법)</h3>
<ul>
<li>머신러닝, 특히 딥러닝에서 사용되는 가장 대표적인 최적화 알고리즘</li>
<li>한 번에 하나 또는 일부의 훈련 샘플을 사용하여 그라디언트를 계산하고 매개 변수를 업데이트</li>
<li>수렴 속도가 느리고, 최적화 문제에 따라 최솟값을 찾는 데 어려움이 있을 수 있음</li>
<li>2차원 배열 X, 1차원 배열 O
<code>train_X= train_X.reshape(-1,n)</code>
<code>train_X= train_X.reshape(1,n)</code><pre><code class="language-python">from sklearn.linear_model import SGDClassifier
sc=SGDClassifier(loss=&#39;log_loss&#39;,max_iter=10,random_state=42)
#loss=&#39;log_loss&#39; : 로지스틱 손실 함수 -&gt; 클래스가 많아도 이진 분류 모델 생성 (a=양성, 나머지는 다 음성)
#loss 기본값 : hinge
#max_iter=10 : 10번 반복
sc.fit(train_X train_y)</code></pre>
이어서 모델 수행하기<pre><code class="language-python">sc.score(train_X, train_y)</code></pre>
에포크 300번 반복<pre><code class="language-python"># _ : 임시로 두는 것, 그냥 버리는 값
for _ in range(0,300):
  sc.partial_fit(train_X, train_y, classes=classes)
  train_score.append(sc.score(train_X,train_y))
  test_score.append(sc.score(test_X, test_y))</code></pre>
</li>
</ul>
<hr>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>제로베이스 &#39;데이터 취업스쿨&#39; 수강중
교재 &#39;혼자 공부하는 머신러닝 + 딥러닝&#39;
<a href="https://yhyun225.tistory.com/8">머신러닝 - 회귀(Regression) VS 분류(Classification)</a>
<a href="https://davincilabs.ai/wiki/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;bmode=view&amp;idx=7709711&amp;t=board">회귀문제와 분류문제(Regression &amp; Classification)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] GridSearchCV]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-GridSearchCV</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-GridSearchCV</guid>
            <pubDate>Tue, 31 Oct 2023 12:23:10 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-gridsearchcv란">✏️ GridSearchCV란</h2>
<blockquote>
<ul>
<li>머신러닝에서 모델의 성능 향상을 위해 쓰이는 기법 중 하나</li>
</ul>
</blockquote>
<ul>
<li>최고의 hyperparameter를 찾기 위해 사용</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import GridSearchCV

sklearn.model_selection.GridSearchCV(estimator, param_grid, *, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch=&#39;2*n_jobs&#39;, error_score=nan, return_train_score=False)[source]¶</code></pre>
<table>
<thead>
<tr>
<th><center>파라미터 (Parameters)</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>estimator</td>
<td>- classifier, regressor, pipeline 등 가능</td>
</tr>
<tr>
<td>param_grid</td>
<td>- 튜닝을 위해 파라미터, 사용될 파라미터를 <span style="color:yellowgreen">dictionary 형태로</span> 만들어서 넣는다.</td>
</tr>
<tr>
<td>scoring</td>
<td>- 예측 성능을 측정할 평가 방법 <br> - 보통 accuracy 로 지정하여서 정확도로 성능 평가 진행</td>
</tr>
<tr>
<td>cv</td>
<td>- <a href="https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-Cross-Validation">교차 검증(Cross Validation)</a>에서 몇 개 (K개)로 분할되는지 지정</td>
</tr>
<tr>
<td>refit</td>
<td>- True : default <br> - True시, 최적의 하이퍼 파라미터를 찾아서 재학습</td>
</tr>
<tr>
<td>verbose</td>
<td>- 0 (default) : 반복할 때 마다 메시지 출력 <br>- 1 : 간단한 메시지 <br>- 2 : 하이퍼 파라미터별 메시지 출력</td>
</tr>
<tr>
<td>n_jobs</td>
<td>- 코어를 얼마나 사용하는지를 지정<br> - 1 : default<br>- &#39;-1&#39; : 모든 코어 사용 &amp; 속도 빨라짐</td>
</tr>
</tbody></table>
<h2 id="✏️-출처">✏️ 출처</h2>
<p><a href="https://rudolf-2434.tistory.com/10">머신러닝 GridSearchCV 로 하이퍼 파라미터 학습과 최적화</a>
<a href="https://velog.io/@hyunicecream/GridSearchCV%EB%9E%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C">GridSearchCV란? 뭘까? 사용 방법(예시)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PYTHON] ✨시각화✨]]></title>
            <link>https://velog.io/@soo_oo/PYTHON-%EC%8B%9C%EA%B0%81%ED%99%94</link>
            <guid>https://velog.io/@soo_oo/PYTHON-%EC%8B%9C%EA%B0%81%ED%99%94</guid>
            <pubDate>Thu, 26 Oct 2023 19:58:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="관련-게시글">관련 게시글</h4>
</blockquote>
<ul>
<li><a href="https://velog.io/@soo_oo/EDA-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94-Matplotlib">[EDA] 데이터 시각화 (Matplotlib) - 2d 그래프</a></li>
<li><a href="https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EC%9E%90-%EC%98%88%EC%B8%A1">[머신러닝] 타이타닉 생존자 예측</a></li>
</ul>
<h2 id="✏️-종류">✏️ 종류</h2>
<h3 id="💡-matplotlib-라이브러리">💡 matplotlib 라이브러리</h3>
<ul>
<li>python 프로그래밍 언어 및 수학적 확장 NumPy 라이브러리를 활용한 플로팅 라이브러리</li>
<li><a href="https://matplotlib.org/">https://matplotlib.org/</a><pre><code class="language-python">import matplotlib.pyplot as plt    
from matplotlib import rc  #폰트 설정
rc(&quot;font&quot;,family=&quot;Arial Unicode MS&quot;)
</code></pre>
</li>
</ul>
<p>%matplotlib inline
#혹은 get_[python().run_line_magic(&quot;matplotlib&quot;,&quot;inline&quot;]</p>
<p>plt.figure(figsize=(10,6))
plt.plot(X축, Y축)  #x축,y축
plt.show()</p>
<pre><code>
### 💡 seaborn 라이브러리
* matplotlib 를 기반으로 하는 Python 데이터 시각화 라이브러리
* [https://seaborn.pydata.org/index.html](https://seaborn.pydata.org/index.html)
```python
import seaborn as sns</code></pre><h3 id="💡-matplotlib-vs-seaborn-라이브러리">💡 Matplotlib vs Seaborn 라이브러리</h3>
<p>  Matplotlib 는 지속적으로 개발되고 있는 인기 있는 플로팅 패키지. 수많은 렌더링 백엔드를 제공하고 장황한 구문을 사용하여 플롯에 높은 수준의 유연성과 사용자 정의 가능성을 제공</p>
<ul>
<li>그래프를 임의로 그려야 하는 경우</li>
<li>고도로 맞춤화된 플롯을 생성하거나 seaborn 뒤에 있는 플로팅 도구를 배우려는 경우, Matplotlib 고려</li>
</ul>
<p>seaborn 은 Matplotlib 위에 구축된 Python 플로팅 라이브러리. Matplotlib보다 더 보기 좋은 스타일 기본값으로 데이터 세트를 빠르게 시각화하는 간결하지만 제한된 접근 방식을 허용합니다.</p>
<ul>
<li>DataFrame을 가지고 그리는 경우 </li>
<li>간결한 코드를 작성하고 더 짧은 시간에 더 매력적인 기본 스타일로 플롯(특히 통계 플롯)을 생성하려면 seaborn을 고려.</li>
</ul>
<h2 id="✏️-seaborn">✏️ Seaborn</h2>
<p>** plot 정리 : <a href="https://dining-developer.tistory.com/30">Seaborn - 데이터를 시각화하는 17가지 방법</a></p>
<table>
<thead>
<tr>
<th><center>목적</center></th>
<th><center>TYPE</center></th>
</tr>
</thead>
<tbody><tr>
<td>개수 또는 빈도</td>
<td>막대 그래프 : barplot()<br>누적 막대 그래프 : countplot()</td>
</tr>
<tr>
<td>구간(이산)분포</td>
<td>히스토그램 : histplot(), displot()</td>
</tr>
<tr>
<td>누적 확률 및 백분위수 추정</td>
<td>누적 분포함수 : displot()</td>
</tr>
<tr>
<td>중위수, 사분위간 범위</td>
<td>Box plot : boxplot()<br>Violin plot : violinplot(), catplot()</td>
</tr>
<tr>
<td>변수 간 관계</td>
<td>Two variable : scatterplot(), stripplot()<br>Categorical : swarmplot(), catplot(), heatmap(), pairplot()<br>ex) heatmap : 상관계수</td>
</tr>
<tr>
<td>연속된 데이터</td>
<td>선형 그래프 : plot()</td>
</tr>
</tbody></table>
<h3 id="💡-countplot">💡 countplot()</h3>
<h4 id="1-seaborncountplot">1. <a href="https://seaborn.pydata.org/generated/seaborn.countplot.html#seaborn-countplot">seaborn.countplot</a></h4>
<pre><code class="language-python">seaborn.countplot(data=None, *, x=None, y=None, hue=None, order=None, hue_order=None,
orient=None, color=None, palette=None, saturation=0.75, fill=True, hue_norm=None,
stat=&#39;count&#39;,width=0.8, dodge=&#39;auto&#39;, gap=0, log_scale=None,
native_scale=False,formatter=None, legend=&#39;auto&#39;, ax=None, **kwargs)</code></pre>
<h4 id="2-예시">2. 예시</h4>
<pre><code class="language-python">plt.subplots(figsize=(15, 6))
sns.countplot(data=DF이름, x=&#39;column명&#39;, palette=&#39;RdYlGn(컬러명)&#39;, 
              edgecolor=sns.color_palette(&#39;dark&#39;, 7))
plt.xticks(rotation=90)
plt.title(&#39;제목&#39;)
plt.show()</code></pre>
<h3 id="💡-seaborn을-위해-df-바꾸기">💡 seaborn을 위해 DF 바꾸기</h3>
<h4 id="-meltdf-id_vars기준-var_name컬럼을-value로-value_namevalue를-컬럼으로">* .melt(df, id_vars=&quot;기준&quot;, var_name=&quot;컬럼을 value로&quot;, value_name=&quot;value를 컬럼으로&quot;)</h4>
<pre><code class="language-python">    class       men       woman   children
0   first   0.91468    0.667971   0.660562
1   second  0.30012    0.329380   0.882608
2   third   0.11899    0.189747   0.121259</code></pre>
<p>▼▼▼▼▼▼</p>
<pre><code class="language-python">df = pd.melt(df, id_vars=&quot;class&quot;, var_name=&quot;sex&quot;, value_name=&quot;survival rate&quot;)
df
Out: 
    class       sex  survival rate
0   first       men       0.914680
1  second       men       0.300120
2   third       men       0.118990
3   first     woman       0.667971
4  second     woman       0.329380
5   third     woman       0.189747
6   first  children       0.660562
7  second  children       0.882608
8   third  children       0.121259</code></pre>
<h3 id="💡-palette">💡 palette</h3>
<p><a href="https://teddylee777.github.io/visualization/matplotlib-colorcode/">matplotlib 컬러명(color name), 팔레트(palette) 이름</a></p>
<ul>
<li>색상을 반대로 하고 싶다면 : 색상 뒤에 <code>_r</code>붙이기</li>
</ul>
<h2 id="✏️-출처">✏️ 출처</h2>
<p><a href="https://modulabs.co.kr/blog/python-data-analysis-matplotlib-seaborn-etc/">파이썬 데이터분석을 위한 시각화 라이브러리(matplotlib, seaborn,etc)</a>
<a href="https://velog.io/@munsi0405/Python-Seaborn-%ED%8C%A8%ED%82%A4%EC%A7%80-countplot-rugplot">[Python] Seaborn 패키지 - countplot(), rugplot()</a>
<a href="https://hyemin-kim.github.io/2020/07/03/S-Python-Seaborn1/">Python &gt;&gt; Seaborn - (1) Seaborn을 활용한 다양한 그래프 그리기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 교차검증 (Cross Validation)]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-Cross-Validation</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-Cross-Validation</guid>
            <pubDate>Wed, 25 Oct 2023 15:01:26 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-교차-검증이란">✏️ 교차 검증이란?</h2>
<blockquote>
<ul>
<li>모델 학습 시 데이터를 훈련용과 검증용으로 교차하여 선택하는 방법</li>
</ul>
</blockquote>
<ul>
<li>종류<ul>
<li>K-Fold Cross-Validation</li>
<li>Hold-out Cross-Validation</li>
<li>Leave-p-Out Cross-Validation(LpOCV)</li>
<li>Leave-One-Out CV(LOOCV)</li>
</ul>
</li>
<li>accuracy 검증시, 항상 같은 값이 나오는 것이 아니지만, np.mean(평균값)이 대표값을 확인 할 수 있다.</li>
</ul>
<h3 id="💡-이유">💡 이유</h3>
<ul>
<li>과적합을 피하면서 파라미터를 튜닝하고 일반적인 모델을 만들고 더 신뢰성 있는 모델 평가를 진행하기 위함</li>
<li>그 어떤 글보다 <a href="https://blog.naver.com/winddori2002/221850530979">아래 글</a>이 가장 잘 정리되어 있는 것 같아서 캡쳐했다.
<img src="https://velog.velcdn.com/images/soo_oo/post/0b29a584-3f01-4fcc-8609-736689e12c12/image.png" alt=""></li>
</ul>
<h3 id="💡-장단점">💡 장단점</h3>
<table>
<thead>
<tr>
<th><center>장점</center></th>
<th><center>단점</center></th>
</tr>
</thead>
<tbody><tr>
<td>특정 데이터셋에 대한 과적합 방지</td>
<td></td>
</tr>
<tr>
<td>더욱 일반화된 모델 생성 가능</td>
<td>모델 훈련 및 평가 소요시간 증가(반복 학습 횟수 증가)</td>
</tr>
<tr>
<td>데이터셋 규모가 적을 시 과소적합 방지</td>
<td></td>
</tr>
</tbody></table>
<h2 id="✏️-k-fold-cross-validation">✏️ K-Fold Cross-Validation</h2>
<blockquote>
<ul>
<li>전체 데이터셋을 K개의 fold로 나누어 K번 다른 fold 1개를 test data로, 나머지 (K-1)개의 fold를 train data로 분할하는 과정을 반복함으로써 train 및 test data를 교차 변경하는 방법론</li>
</ul>
</blockquote>
<ul>
<li>학습 데이터 세트와 검증 데이터 세트를 점진적으로 변경하면서 마지막 K번째까지 학습과 검증을 수행하는 것</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import KFold
kf=KFold(n_splits=보통 3 or 5)</code></pre>
<h3 id="💡-특징">💡 특징</h3>
<ul>
<li>K는 하이퍼파라미터로서 주로 5~10 fold 사용</li>
<li>최적의 K값을 찾기 위한 실험적 검증 필요</li>
<li>가장 일반적인 교차검증 방법론</li>
<li>k가 적어질 수록 bias는 커질 것이고 k가 커진다면 variance가 커짐. 또한 k가 크다면 시간도 많이 걸릴 것</li>
<li><strong>학습 데이터 (Training set)</strong> - 문제집의 문제은행</li>
<li><em>검증 데이터 (Validation set)*</em> - 문제집에 속한 기출 모의고사 (성능 검증 / 학습에는 활용되지 않음) </li>
<li><em>시험 데이터(Test set)*</em> - 실제 시험 </li>
</ul>
<h3 id="💡-절차">💡 절차</h3>
<ol>
<li>전체 데이터를 K개 fold로 분할</li>
<li>분할된 fold 중 test data로 할당된 적이 없는 fold 1개를 test data로 할당</li>
<li>위 2. 과정을 K번 반복</li>
<li>K개의 모델 성능 평가 결괏값을 평균 내어 최종 결괏값으로 활용</li>
</ol>
<h3 id="💡-장단점-1">💡 장단점</h3>
<table>
<thead>
<tr>
<th><center>장점</center></th>
<th><center>단점</center></th>
</tr>
</thead>
<tbody><tr>
<td>모든 데이터를 train 및 test에 활용 → 과적합/과소적합 탐지 및 더욱 일반화된 모델 생성 가능</td>
<td>아래와 같은 경우에는 CV 수행 시 오히려 모델 성능이 악화될 수 있습니다.<br>- 순서가 고려된 데이터가 shuffle 되어 있지 않은 경우<br>- 데이터 불균형(Data Imbalance) → 층화 교차검증(Stratified K-fold CV)을 통해 보완<br>- 각기 다른 fold에 같은 데이터(i.e., duplicate)가 존재할 경우<br>- Natural Group(e.g., 같은 사용자/머신 데이터) 데이터가 여러 fold에 shuffle 된 경우</td>
</tr>
</tbody></table>
<h3 id="💡-예시-k--5인-경우">💡 예시: k = 5인 경우</h3>
<ul>
<li>k를 5로 지정(k는 변동 가능), 전체 데이터를 임의로 1/5로 나누어서 validation set을 한 번씩 번갈아가면서 데이터셋을 구성</li>
<li>각 데이터를 학습하고 validation으로 평가를 한 다음 5개의 결과에 대해 평균을 내어 최종 성능을 구함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/cecc0c02-7075-4348-83af-ee2e4e055862/image.png" alt=""></p>
<h2 id="✏️-stratified-k-fold-cross-validation">✏️ Stratified K-fold Cross Validation</h2>
<blockquote>
<ul>
<li>층화 K-fold CV는 기존 K-fold CV와 비슷한 방법으로 수행되나 계층을 고려하는 방법</li>
</ul>
</blockquote>
<h2 id="✏️-train-score-확인">✏️ Train score 확인</h2>
<pre><code class="language-python">from sklearn.model_selection import cross_validate
cross_validate(estimator, X, y=None, cv=skfold, return_train_score=True)</code></pre>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>&#39;제로베이스 데이터 취업 스쿨&#39; 수강중
<a href="https://huidea.tistory.com/30">[Machine learning] 쉽게 설명하는 Cross Validation 교차검증</a>
<a href="https://heytech.tistory.com/113">[머신러닝] 교차검증(Cross-validation) 필요성 및 장단점</a>
<a href="https://velog.io/@ohxhxs/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-KFold-StratifiedKFold-crossvalscoreGridSearchCV">파이썬 머신러닝 교차검증 - KFold, StratifiedKFold, cross_val_score, GridSearchCV</a>
<a href="https://blog.naver.com/winddori2002/221850530979">[바람돌이/머신러닝] 교차검증(CV), Cross Validation, K-fold, TimeSeries 등 CV 종류 및 이론|작성자 바람돌이</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] ✨머신러닝 베이직  & 모델 클래스 (feat. sklearn, 사이킷 런)✨]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 24 Oct 2023 14:26:05 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-머신러닝">✏️ 머신러닝</h2>
<blockquote>
<ul>
<li>규칙을 일일이 프로그래밍 하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야</li>
</ul>
</blockquote>
<ul>
<li>통계학과 관련</li>
<li>대표 머신러닝 라이브러리 : 사이킷런 (scikit -learn)</li>
</ul>
<h3 id="💡-사이킷-런sklearn이란">💡 사이킷 런(sklearn)이란?</h3>
<ul>
<li>2007년 구글 썸머 코드에서 처음 구현됐으며 현재 파이썬으로 구현된 가장 유명한 기계 학습 오픈 소스 라이브러리</li>
<li>다양한 분류기를 지원하며 머신러닝 결과를 검증하는 기능 보유</li>
<li>또한 분류, 회기, 클러스터링, 차원 축소처럼 머신러닝에 자주 사용되는 다양한 알고리즘을 지원<pre><code class="language-python">import sklearn</code></pre>
</li>
</ul>
<h3 id="💡-명령어--용어-정리">💡 명령어 &amp; 용어 정리</h3>
<h4 id="1-zip">1. zip()</h4>
<pre><code class="language-python">name = [&#39;merona&#39;, &#39;gugucon&#39;]
price = [500, 1000]

z = zip(name, price)
print(list(z))

&gt;&gt;&gt; [(&#39;merona&#39;, 500), (&#39;gugucon&#39;, 1000)]</code></pre>
<pre><code class="language-python">name = [&#39;merona&#39;, &#39;gugucon&#39;]
price = [500, 1000]

for n, p in zip(name, price):
    print([n, p])
혹은
[n, p] for n, p in zip(name, price)
&gt;&gt;&gt;
[[merona,500],[gugucon,1000]]</code></pre>
<h4 id="2-numpy">2. numpy</h4>
<ul>
<li>배열 라이브러리 (고차원적인 배열 가능)<h5 id="2-1-column_stack--numpy로-zip같은-기능-사용하기">2-1. .column_stack : numpy로 zip같은 기능 사용하기</h5>
<pre><code class="language-python">import numpy as np
f_data=np.column_stack(([1,2,3],[4,5,6]))
f_data
&gt;&gt;&gt;
array([[1, 4],
     [2, 5],
     [3, 6]])</code></pre>
<pre><code class="language-python">import numpy as np
f_data=np.column_stack((f_length, f_weight)
f_data[:5]
&gt;&gt;&gt;
array([[ 25.4, 242. ],
     [ 26.3, 290. ],
     [ 26.5, 340. ],
     [ 29. , 363. ],
     [ 29. , 430. ]])</code></pre>
<h5 id="2-2-배열--열특성수-행샘플수">2-2. 배열 : 열(특성수), 행(샘플수)</h5>
<pre><code class="language-python">import numpy as np
name = [&#39;merona&#39;, &#39;gugucon&#39;,&#39;pigbar&#39;]
price = [500, 1000, 600]
</code></pre>
</li>
</ul>
<p>list = [n, p] for n, p in zip(name, price)
list_array= np.array(list)</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p>[[merona,500]
[gugucon,1000]
[pigbar, 600]</p>
</blockquote>
</blockquote>
<p>print(list_array.shape) #numpy array로 정렬된 형태 확인하기</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p>(3,2) #3행2열 </p>
</blockquote>
</blockquote>
<pre><code>##### 2-3. 1씩 증가하는 인덱스 만들기
```python
# 0 ~ 48까지 1씩 증가하는 배열
index=np.arrage(49)
print(index)
&gt;&gt;&gt;
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48])</code></pre><h5 id="2-4-train_test_split-하거나-numpy로-무작위-셔플링하기">2-4. train_test_split 하거나 numpy로 무작위 셔플링하기</h5>
<pre><code class="language-python">np.random.shuffle(index)
print(index)
&gt;&gt;&gt;
[13 45 47 44 17 27 26 25 31 19 12  4 34  8  3  6 40 41 46 15  9 16 24 33
 30  0 43 32  5 29 11 36  1 21  2 37 35 23 39 10 22 18 48 20  7 42 14 28
 38]</code></pre>
<h5 id="2-5-배열에서-가장-큰-값의-인덱스-반환">2-5. 배열에서 가장 큰 값의 인덱스 반환</h5>
<p>배열의 첫 번째 원소가 가장 큰 값일 경우, 인덱스 0 반환</p>
<pre><code class="language-python">val_labels = np.argmax(model.predict(val_scaled),axis=-1)
#predict(val_scaled)의 마지막 차원(-1)의 최대 인덱스 값
print(np.mean(val_labels == val_target))
#val_labels &amp; val_target 비교후 위치가 같으면 1, 다르면 0
#이를 평균하면 정확도</code></pre>
<h4 id="3-파라미터매개변수--하이퍼파라미터">3. <a href="https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-13-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0Parameter%EC%99%80-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0Hyper-parameter">파라미터(매개변수) &amp; 하이퍼파라미터</a></h4>
<hr>
<h2 id="✏️-머신러닝-시작">✏️ 머신러닝 시작</h2>
<h3 id="💡-특성-공학-feature-engineering">💡 특성 공학 (feature engineering)</h3>
<ul>
<li>기존의 특성을 사용해 새로운 특성을 뽑아내는 작업 (혼공머신 4쇄 :99p <pre><code class="language-python">#평균
mean = np.mean(X_train, axis=0)
</code></pre>
</li>
</ul>
<p>#표준편차
std=np.std(X_train, axis=0)</p>
<p>#표준점수
std_score=(X_train-mean)/std</p>
<p>#polynomialFeatures
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
poly.fit([[n,m]])
poly.transform([[n,m]])</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p>1,n,m,n^2,n*m,m^2
#1을 없애고 싶으면 poly = PolynomialFeatures(include_bias=False)
#5제곱까지 하고 싶으면 poly = PolynomialFeatures(degree=5)
##하지만 너무 상세히 특성을 정리하면 과대적합(overfitting)됨</p>
</blockquote>
</blockquote>
<pre><code>
### 💡 train\_test_split
&gt;* [sklearn.model_selection.train_test_split](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)
* &lt;span style=&quot;color:yellowgreen&quot;&gt;train set(학습 데이터 세트)과 test set(테스트 세트)을 분리&lt;/span&gt;
  * X_train : 학습 데이터 셋의 feature 부분
X_test : 테스트 데이터 셋의 feature 부분
y_train : 학습 데이터 셋의 label 부분
y_test : 테스트 데이터 셋의 label 부분
* stratify 파라미터로 무작위 섞은 후 트레인 세트와 테스트 세트 분리


```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)</code></pre><table>
<thead>
<tr>
<th><center>파라미터 (Parameters)</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>test_size</td>
<td>- test set 구성의 비율 <br>- train_size의 옵션과 반대 관계에 있는 옵션 값, 주로 test_size를 지정<br>- default 값은 0.25 (ex - 0.2일때 전체 data set의 20%를 test (validation) set으로 지정하겠다는 의미)</td>
</tr>
<tr>
<td>random_state</td>
<td>- 세트를 섞을 때 해당 int 값을 보고 섞으며, 하이퍼 파라미터를 튜닝시 이 값을 고정해두고 튜닝해야 매번 데이터셋이 변경되는 것을 방지할 수 있음</td>
</tr>
<tr>
<td>shuffle</td>
<td>- default=True<br>- split을 해주기 이전에 섞을건지 여부 확인. 보통은 default 값으로 유지</td>
</tr>
<tr>
<td><span style="color:yellowgreen">stratify</span></td>
<td>- default=None<br>- 데이터 편향 방지, 골고루 섞이게 해줌<br>- classification을 다룰 때 매우 중요한 옵션값 <br> stratify 값을 target으로 지정해주면 각각의 class 비율(ratio)을 train / validation에 유지 (한 쪽에 쏠려서 분배되는 것을 방지) <a href="https://teddylee777.github.io/scikit-learn/train-test-split/">자세한 내용 하기 출처 확인</a></td>
</tr>
</tbody></table>
<h3 id="💡-label_encoder">💡 label_encoder</h3>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html">sklearn.preprocessing.LabelEncoder</a></li>
</ul>
</blockquote>
<ul>
<li>문자를 0부터 시작하는 정수형 숫자로 바꿔주는 기능</li>
<li>코드숫자를 이용하여 원본 값 구함 (반대 기능)</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import LabelEncoder</code></pre>
<table>
<thead>
<tr>
<th><center>Methods<br><u>- y값에 DataFrame도 사용 가능ex)le.fit(df[&#39;A&#39;])</u></center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td><span style="color:yellowgreen"><strong>le.fit(y)</strong></span></td>
<td>- 사이킷 런 <span style="color:yellowgreen">모델 훈련</span>시 사용하는 메서드<br>- 처음 두 매개변수로 훈련에 사용할 특성과 정답 데이터 전달<br>- Fit label encoder <br>- y를 학습시킴<br></td>
</tr>
<tr>
<td><strong>le.transform(y)</strong></td>
<td>- Transform labels to normalized encoding.<br>- fit을 기준으로 얻은 mean,variance에 맞춰 변형<br>- fit 시킨 변수를 숫자로 변환<br>- 일종의 fit으로 학습시킨 것을 적용하는 메서드</td>
</tr>
<tr>
<td><strong>le.fit_transform(y)</strong></td>
<td>- Fit label encoder and return encoded labels<br>- fit과 transform을 한번에 진행함</td>
</tr>
<tr>
<td><strong>le.inverse_transform(y)</strong></td>
<td>- Transform labels back to original encoding.<br>- 숫자를 문자로 변환</td>
</tr>
<tr>
<td>le.get_metadata_routing()</td>
<td>Get metadata routing of this object.</td>
</tr>
<tr>
<td>le.get_params([deep])</td>
<td>Get parameters for this estimator.</td>
</tr>
<tr>
<td>le.set_output(*[, transform])</td>
<td>Set output container.</td>
</tr>
<tr>
<td>le.set_params(**params)</td>
<td>Set the parameters of this estimator.</td>
</tr>
</tbody></table>
<pre><code class="language-python">&gt;&gt;&gt; from sklearn.preprocessing import LabelEncoder
&gt;&gt;&gt; le = LabelEncoder()

# fit : [1,2,2,6]을 학습 시킴
&gt;&gt;&gt; le.fit([1, 2, 2, 6])
LabelEncoder()

#.class_ : fit시킨 le라는 변수에 학습된 소스 확인
&gt;&gt;&gt; le.classes_
array([1, 2, 6])

# fit을 한 다음에 transform 시키기
&gt;&gt;&gt; le.transform([1, 1, 2, 6])
array([0, 0, 1, 2]...)

&gt;&gt;&gt; le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])
</code></pre>
<h3 id="💡-score--평가하기">💡 .score : 평가하기</h3>
<ul>
<li>정확도 = (정확히 맞힌 개수) / (전체 데이터 개수)</li>
<li>과대적합 : 훈련 세트 점수는 좋으나 테스트 세트 점수가 안 좋을 경우</li>
<li>과소적합 : 훈련 세트보다 테스트 세트 점수가 높을 경우, 두 점수 모두 낮을 경우 (모델이 단순할 경우 발생함) =&gt; 훈련 세트의 점수를 높여줌 ex)KNN일 경우, n_neighbors를 5에서 3으로 낮추기<pre><code class="language-python">kn=KNeighborsClassifier()
kn.fit(a_data, a_target)
kn.score(b_data, a_target) #b_data의 답을 b_target이라고  kn머신 학습된 것에 돌렸을 때의 점수(..이게 맞는건강..?)</code></pre>
<h3 id="💡-predict--학습된-데이터로-예측하기">💡 .predict : 학습된 데이터로 예측하기</h3>
<pre><code class="language-python">#위 데이터 이어서
kn.predict([[30,600]])
&gt;&gt; array([1]) #&quot;1(도미)에 해당한다&quot;</code></pre>
</li>
</ul>
<h3 id="💡-predict_proba--예측-확률">💡 .predict_proba : 예측 확률</h3>
<pre><code>#lr 타겟이 2개 일 경우 (타겟 알파벳순)
lr.predict_proba(train_X[:5])
&gt;&gt;&gt;
array([[0.99759855, 0.00240145],
       [0.02735183, 0.97264817],
       [0.99486072, 0.00513928],
       [0.98584202, 0.01415798],
       [0.99767269, 0.00232731]])</code></pre><h3 id="💡-evaluate">💡 .evaluate()</h3>
<ul>
<li>성능 평가</li>
<li>compile() 메서드 (딥러닝)가 먼저 실행되어야 함</li>
</ul>
<h3 id="💡-accuracy">💡 accuracy</h3>
<pre><code class="language-python">from sklearn.metrics import accuracy_score</code></pre>
<p><code>.score() / .evaluate() / .accuracy() 차이 비교해보기</code></p>
<hr>
<h2 id="✏️-학습--훈련">✏️ 학습 &amp; 훈련</h2>
<h3 id="💡-학습">💡 학습</h3>
<table>
<thead>
<tr>
<th><center>학습 종류</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td><center>지도 학습<br>(supervised Learning)</center></td>
<td>- 입력과 타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는데 활용<br>- 훈련 데이터 필요<br>ex) K-최근접 이웃</td>
</tr>
<tr>
<td><center>비지도 학습<br>(Unsupervised Learning)</center></td>
<td>- 입력 데이터만 있을 때 사용(타깃 데이터가 없음) <br>- 입력 데이터에서 특징 &amp; 경향을 찾기 위해 사용, 예측 용도 X&lt;br<br>ex) 군집(clustering), 차원 축소</td>
</tr>
<tr>
<td>* <span style="color:yellowgreen">훈련 데이터 (Training Data)</span>(.fit)</td>
<td></td>
</tr>
<tr>
<td>* 입력 (input) : 데이터</td>
<td></td>
</tr>
<tr>
<td>* 타깃 (target) : 정답 (1인지 0인지)</td>
<td></td>
</tr>
<tr>
<td>```python</td>
<td></td>
</tr>
<tr>
<td>#numpy를 활용해 타깃 데이터 만들기 (1 : 35개, 0 : 14개)</td>
<td></td>
</tr>
<tr>
<td>f_target=np.concatenate((np.ones(35),np.zeros(14)))</td>
<td></td>
</tr>
<tr>
<td>f_target</td>
<td></td>
</tr>
</tbody></table>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p>array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])</p>
</blockquote>
</blockquote>
<pre><code>* 특성 : 데이터를 표현하는 하나의 성질
&lt;span style=&quot;color:grey&quot;&gt;ex) 생선 데이터 각각의 길이와 무게&lt;/span&gt;

### 💡 지도 학습 - 훈련
- 샘플링 편향 : 샘플링이 한쪽으로 치우쳐져 있는 상황
  * 샘플링 편향을 피하기 위해 훈련 세트와 테스트 세트를 나누기 전 데이터를 충분히 골고루 섞여있어야 함
  * 참고 페이지 : [[머신러닝] ✨머신러닝 베이직  &amp; 모델 클래스 (feat. sklearn, 사이킷 런)✨ &gt;&gt; 💡 샘플 섞기](https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#-%EC%83%98%ED%94%8C-%EC%84%9E%EA%B8%B0)

|&lt;center&gt;훈련 종류&lt;/center&gt;|&lt;center&gt;설명&lt;/center&gt;|
|------|---|
|&lt;center&gt;훈련 세트&lt;/center&gt;|- 모델을 훈련할 때 사용&lt;br&gt;- 훈련세트가 클수록 좋음&lt;br&gt;- 테스트 세트를 제외한 모든 데이터 사용&lt;br&gt;- 2차원 배열이여야 함 (1차 배열이라도 2차원 배열로 만들기)&lt;br&gt; ex) &lt;span style=&quot;color:yellowgreen&quot;&gt;.reshape(n행,y열)&lt;/span&gt; 사용|
|&lt;center&gt;테스트 세트&lt;/center&gt;|- 통상 전체 데이터에서 20~30% 사용|
* &lt;span style=&quot;color:yellowgreen&quot;&gt;numpy.reshape(a, newshape, order=&#39;C&#39;) &lt;/span&gt;
  * a: 변경하려는 배열
  * newshape: 변경하려는 배열의 새로운 shape
  * order: 배열의 요소 순서. &#39;C&#39;(기본값)는 C 언어 스타일의 요소 순서, &#39;F&#39;는 포트란 스타일의 요소 순서 ({‘C’, ‘F’, ‘A’},optional)
  * a.reshape(-1,n) : n열에 맞춰서 행 자동 셋팅
  * a.reshape(n,-1) : n행에 맞춰서 열 자동 셋팅

```python
a = np.arange(9)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
a.reshape(3, 3)

&gt;&gt;&gt;
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])</code></pre><pre><code class="language-python">a = np.arange(9)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
np.reshape(a, (3, 3))

&gt;&gt;&gt;
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])</code></pre>
<h3 id="💡-지도-학습---과대적합--과소적합">💡 지도 학습 - 과대적합 &amp; 과소적합</h3>
<h4 id="1-과대적합---규제">1. 과대적합 -&gt; 규제</h4>
<ul>
<li>훈련 세트가 과도한 학습을 못하도록 훼방</li>
<li>예시
선형 회귀 모델 : 특성에 곱해지는 계수 (혹은 기울기)의 크기 축소<h4 id="2-과소적합---특성-세분화">2. 과소적합 -&gt; 특성 세분화</h4>
</li>
<li>모델을 더 복잡하게 만들기</li>
<li>예시
이웃 : 이웃 범위를 줄이기</li>
</ul>
<h3 id="💡-data-scaling">💡 Data Scaling</h3>
<p><a href="https://mkjjo.github.io/python/2019/01/10/scaler.html">[Python] 어떤 스케일러를 쓸 것인가?</a>
<a href="https://wooono.tistory.com/96">[ML] 데이터 스케일링 (Data Scaling) 이란?</a>
<a href="https://velog.io/@jiazzang/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8A%A4%EC%BC%80%EC%9D%BC%EB%A7%81StandardScaler-MinMaxScaler-Robust">[데이터 전처리] 데이터 스케일링(StandardScaler, MinMaxScaler, RobustScaler)</a></p>
<ul>
<li>서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 의미</li>
<li>수치형 변수에만 적용</li>
<li>예시 ) K 이웃 모델, 계수에 곱이 들어갈 경우(릿지 혹은 라쏘)</li>
</ul>
<h4 id="1-표준-점수">1. 표준 점수</h4>
<pre><code class="language-python">#표준점수
std_score=(X_train-mean)/std</code></pre>
<h4 id="2-표준화-standard-scaler">2. 표준화 (Standard Scaler)</h4>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html">sklearn.preprocessing.StandardScaler</a></li>
</ul>
</blockquote>
<ul>
<li>모든 피처들을 평균이 0, 분산이 1인 정규분포를 갖도록 만듬 (표준화해주는 방법) =&gt; 전체 피처를 ttl로 보고 그 중간을 평균 0</li>
<li>데이터 내에 이상치가 있다면 데이터의 평균과 분산에 크게 영향을 주기 때문에 스케일링 방법으로 적절하지 않음</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
ss.fit(X_train)
train_scaled=ss.transform(X_train)
test_scaled=ss.transform(X_test)</code></pre>
<h4 id="3-최소-최대-정규화-minmaxscaler">3. 최소 최대 정규화 (MinmaxScaler)</h4>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html">sklearn.preprocessing.MinMaxScaler</a></li>
</ul>
</blockquote>
<ul>
<li>제일 작은 값을 0, 제일 큰 값을 1로 두어 계산</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import MinMaxScaler</code></pre>
<h4 id="4-robustscaler">4. RobustScaler</h4>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html">sklearn.preprocessing.RobustScaler</a></li>
</ul>
</blockquote>
<ul>
<li>StandardScaler와 비슷하지만 평균과 분산 대신 <span style="color:yellowgreen">중간값(median)과 사분위값(quartile)</span>을 사용 </li>
<li><span style="color:yellowgreen">아주 동 떨어진 데이터(이상치)를 제거</span><ul>
<li>이상치: 측정된 데이터 사이의 경향성을 지나치게 해치는 데이터 ex)측정 에러</li>
</ul>
</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import RobustScaler</code></pre>
<pre><code class="language-python">from sklearn.preprocessing import RobustScaler
rs = robustscaler()

# df = robustscaler().fit_transform(df)
df=rs.fit_transform(df)</code></pre>
<hr>
<blockquote>
<p><strong><u>모델 평가 (Model Evaluation)</u></strong>
머신러닝을 통해 예측하고자 하는 값에 따라 <span style="color:yellowgreen">회귀</span>와 <span style="color:yellowgreen">분류</span>로 모델 평가를 나눌 수 있다.</p>
</blockquote>
<hr>
<h2 id="✏️-클래스">✏️ 클래스</h2>
<h3 id="💡-의사결정트리decision-tree">💡 의사결정트리(Decision Tree)</h3>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html">sklearn.tree.DecisionTreeClassifier</a></li>
</ul>
</blockquote>
<ul>
<li>노드(node)<ul>
<li>루트노드(Root Node) : 시작점</li>
<li>리프노드(Leaf Node) : 결정된 클래스 값</li>
<li>규칙노드/내부노드(Decision Node / Internal Node) : 데이터세트의 피처가 결합해 만들어진 분류를 위한 규칙조건</li>
</ul>
</li>
</ul>
<pre><code class="language-python">from sklearn.tree import DecisionTreeClassifier
변수명= DecisionTreeClassifier(random_state=0 ...)</code></pre>
<table>
<thead>
<tr>
<th><center>파라미터 (Parameters)</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>max_depth</td>
<td>- 트리의 최대 깊이<br>- int <br>- default=None <br> 완벽하게 클래스 값이 결정될 때 까지 분할 or 데이터 개수가 min_samples_split보다 작아질 때까지 분할 (깊이가 깊어지면 과적합될 수 있으므로 적절히 제어 필요)</td>
</tr>
<tr>
<td>random_state</td>
<td>- int <br> - default=None <br>- Random_state를 None으로 두는 경우 Decisiontreeclassifier 함수를 이용해 Decision tree를 생성하면 그때그때 다른 데이터를 이용하기 때문에 결과가 바뀜 <br><a href="https://jerry-style.tistory.com/entry/Decisiontreeclassifier-%ED%95%A8%EC%88%98%EC%9D%98-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-randomstate%EB%9E%80">자세한 내용 하기 출처 확인</a></td>
</tr>
</tbody></table>
<hr>
<h2 id="✏️-pipeline">✏️ Pipeline</h2>
<h3 id="💡-파이프라인이란">💡 파이프라인이란?</h3>
<blockquote>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html">sklearn.pipeline.Pipeline</a></li>
</ul>
</blockquote>
<ul>
<li>전처리 ~ 학습까지의 과정을 하나로 연결</li>
</ul>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/1f39e3c1-8ea8-428a-aa68-b205c95eb305/image.png" alt=""></p>
<img src="https://blog.kakaocdn.net/dn/bN6xUr/btrwhyR4AqR/SREuUJKIqarDolMBQiufCK/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN6xUr%2FbtrwhyR4AqR%2FSREuUJKIqarDolMBQiufCK%2Fimg.png" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" data-origin-width="602" data-origin-height="108">

<pre><code class="language-python">from sklearn.pipeline import Pipeline</code></pre>
<h3 id="💡-코드">💡 코드</h3>
<table>
<thead>
<tr>
<th><center>Methods</center></th>
<th><center>설명</center></th>
</tr>
</thead>
<tbody><tr>
<td>steps</td>
<td>- 단계 호출</td>
</tr>
<tr>
<td>set_params(**kwargs)</td>
<td>- 각 스텝별 속성 설정<br>- **kwargs : <code>스텝이름__속성=값</code> <br>- 언더바 2개 ‘__’ 필수</td>
</tr>
</tbody></table>
<pre><code class="language-python"># 파이프 라인 만들기
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

pipe = Pipeline([(&#39;scaler&#39;, StandardScaler()), (&#39;svc&#39;, SVC())])
#or
#estimaters = [(&#39;scaler&#39;, StandardScaler()), (&#39;svc&#39;, SVC())]
#pipe = Pipeline(estimaters)

pipe.steps
&gt;&gt;&gt; [(&#39;scaler&#39;, StandardScaler()), (&#39;svc&#39;, SVC())]
pipe.steps[0]
&gt;&gt;&gt;(&#39;scaler&#39;, StandardScaler())
pipe.steps[1]
&gt;&gt;&gt;(&#39;svc&#39;, SVC())
pipe[0]
&gt;&gt;&gt; StandardScaler
pipe[&#39;scaler&#39;]
&gt;&gt;&gt; StandardScaler

pipe.set_params(svc__C=10).fit(X_train, y_train).score(X_test, y_test)
#or
#(svc__max_depth=2)
#(svc__random_state=13)</code></pre>
<pre><code class="language-python"># 학습 &amp; 테스트
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
     X, y, test_size=0.2, random_state=13)

## 원래대로라면 스케일링을 하고 분류기를 학습시키는 과정 필요
## but 이미 pipe에 진행 완료. 해서 아래 진행

pipe.fit(X_train,y_train)</code></pre>
<pre><code class="language-python"># 정확성 확인
from sklearn.metrics import accuracy_score

y_pred_tr = pipe.predict(X_train)
y_pred_test = pipe.predict(X_test)

print(&#39;Train Acc&#39; : accracy_score(y_train, y_pred_tr)
print(&#39;Test Acc&#39; : accracy_score(y_test, y_pred_test)</code></pre>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>&#39;제로베이스 데이터 취업스쿨&#39; 수강중
교재 &#39;혼자 공부하는 머신러닝 + 딥러닝&#39;
<a href="https://velog.io/@supremo7/%EC%82%AC%EC%9D%B4%ED%82%B7%EB%9F%B0%EC%9C%BC%EB%A1%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0">사이킷런으로 머신러닝 시작하기</a>
<a href="https://wikidocs.net/89704">토닥토닥 sklearn - 머신러닝 </a>
<a href="https://dacon.io/codeshare/4526">sklearn으로 데이터 스케일링(Data Scaling)하는 5가지 방법🔥</a>
<a href="https://teddylee777.github.io/scikit-learn/train-test-split/">train_test_split 모듈을 활용하여 학습과 테스트 세트 분리</a>
<a href="https://injo.tistory.com/15">[Chapter 4. 분류] Decision Tree Classifier</a>
<a href="https://jerry-style.tistory.com/entry/Decisiontreeclassifier-%ED%95%A8%EC%88%98%EC%9D%98-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-randomstate%EB%9E%80">Decisiontreeclassifier 함수의 파라미터 random_state란?</a>
<a href="https://gils-lab.tistory.com/70">머신러닝 파이프라인</a>
<a href="https://velog.io/@skarb4788/%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-PipeLine">머신 러닝 - PipeLine</a>
<a href="https://sdc-james.gitbook.io/onebook/2.-1/1.6./untitled-9">2.5.10. 싸이킷런(Scikit-learn)(Sklearn)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 타이타닉 생존자 예측]]></title>
            <link>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EC%9E%90-%EC%98%88%EC%B8%A1</link>
            <guid>https://velog.io/@soo_oo/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EC%9E%90-%EC%98%88%EC%B8%A1</guid>
            <pubDate>Fri, 20 Oct 2023 15:17:13 GMT</pubDate>
            <description><![CDATA[<span style="color:gray">
*이렇게 분석을 해보니 영화보다 더 영화같고, 감동스러운 포인트들까지도 읽혀졌다..찌잉...ㅠㅠ</span>

<p><span style="color:gray">* 분명히 matplot과 seaborn을 활용한 다양한 시각화 라이브러리를 저번에도 다룬 것 같은데 왜 이렇게 낯선지 모르겠다. 이렇게 복습해야할 것들이 점점 늘어난다📚</span></p>
<span style="color:gray">
* 하나의 엑셀 파일일 뿐인데 알아 낼 수 있는게 너무 많았다.(넘흐 흥미로와) 적은 리소스라도 최대의 결과를 뽑아내는 것도 중요하다는걸 몸소 깨우치게 됐다.</span>

<hr>
<h2 id="✏️-eda">✏️ EDA</h2>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/78cfc8bd-56a7-4ac8-8812-4896ad266301/image.png" alt=""></p>
<h3 id="💡-생존률-382">💡 생존률 (38.2%)</h3>
<ul>
<li><code>autopct=&#39;%1.1f%%&#39;</code> : 소수점 첫째자리까지 비율 표시<pre><code class="language-python">titanic[&#39;survived&#39;].value_counts().plot.pie(autopct=&#39;%1.1f%%&#39;)</code></pre>
out&gt;&gt;
<img src="https://velog.velcdn.com/images/soo_oo/post/cdff7837-de60-481a-877a-2abbece31c4c/image.png" alt=""></li>
</ul>
<pre><code class="language-python">f,ax = plt.subplots(1,2,figsize=(16,8)) #1행 2열

titanic[&#39;survived&#39;].value_counts().plot.pie(ax=ax[0],autopct=&#39;%1.1f%%&#39;,shadow=True, explode=[0,0.05])
ax[0].set_title(&#39;Pie plot - survived&#39;)
ax[0].set_ylabel(&#39;&#39;)

sns.countplot(x=&#39;survived&#39;,data=titanic,ax=ax[1])
ax[1].set_title(&#39;Count plot = survived&#39;)

plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/379f417e-5a6f-4894-8768-f9c699e6f317/image.png" alt=""></p>
<h3 id="💡-성별에-따른-생존-상황">💡 성별에 따른 생존 상황</h3>
<p>: 남성의 생존 가능성이 더 낮다.</p>
<pre><code class="language-python">f,ax = plt.subplots(1,2,figsize=(16,8)) #1행 2열

titanic[&#39;sex&#39;].value_counts().plot.pie(ax=ax[0],autopct=&#39;%1.1f%%&#39;,shadow=True, explode=[0,0.05])
ax[0].set_title(&#39;Pie plot - Count of passengers of sex&#39;)
ax[0].set_ylabel(&#39;&#39;)

sns.countplot(x=&#39;sex&#39;,data=titanic,hue=&#39;survived&#39;,ax=ax[1])
ax[1].set_title(&#39;Count plot = sex : survived&#39;)

plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/973f00c0-0820-41c0-9080-8ed8d4dcac9b/image.png" alt=""></p>
<h3 id="💡-좌석-등급-대비-생존률">💡 좌석 등급 대비 생존률</h3>
<ul>
<li>1등실일수록 생존 가능성이 높음</li>
<li>여성의 생존률이 높음
=&gt; 여성들은 1등실에 많이 타고 있었는가?<pre><code class="language-python">pd.crosstab(titanic[&#39;pclass&#39;],titanic[&#39;survived&#39;],margins=True) #margins : 합계</code></pre>
<img src="https://velog.velcdn.com/images/soo_oo/post/12479ae0-8a2e-435a-8920-3d67d9bae2a2/image.png" alt=""></li>
</ul>
<h3 id="💡-등급--성별-관계-기준--나이">💡 등급 &amp; 성별 관계 (기준 : 나이)</h3>
<pre><code class="language-python">grid=sns.FacetGrid(titanic, row=&#39;pclass&#39;,col=&#39;sex&#39;, height=4,aspect=2)
grid.map(plt.hist,&#39;age&#39;, alpha=0.8, bins=20) # alpha : 투명도
grid.add_legend()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/be32b567-1dcf-4643-ab8b-d4de28c42076/image.png" alt=""></p>
<pre><code>&lt;&lt;틈새 정리 - 시각화 라이브러리&gt;&gt;
_matplotlib
: 파이썬으로 기본적인 차트들을 쉽게 그릴 수 있도록 도와주는 시각화 라이브러리

_seaborn
: matplotlib 기반으로 만들어진 통계 데이터 시각화 라이브러리</code></pre><h3 id="💡-나이별-승객-현황">💡 나이별 승객 현황</h3>
<pre><code class="language-python">import plotly.express as px
fig=px.histogram(titanic,x=&#39;age&#39;)
fig.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/a6346602-1079-485a-870a-a5a9120d72ec/image.png" alt=""></p>
<h3 id="💡-등실별-생존율">💡 등실별 생존율</h3>
<pre><code class="language-python">grid=sns.FacetGrid(titanic, row=&#39;pclass&#39;,col=&#39;survived&#39;, height=4,aspect=2)
grid.map(plt.hist,&#39;age&#39;, alpha=0.5, bins=20) # alpha : 투명도
grid.add_legend()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/a300b9df-db33-419f-9adf-61043432c5ed/image.png" alt=""></p>
<h3 id="💡-연령-5단계로-구분하기">💡 연령 5단계로 구분하기</h3>
<pre><code class="language-python">#새로운 컬럼 추가하기
titanic[&#39;age_cat&#39;]=pd.cut(titanic[&#39;age&#39;], bins=[0,7,15,30,60,100],
                include_lowest=True,
                labels=[&#39;baby&#39;,&#39;teen&#39;,&#39;young&#39;,&#39;adult&#39;,&#39;old&#39;])
titanic.head()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/6ec46815-7b4d-4719-9843-63a54a54481a/image.png" alt=""></p>
<h3 id="💡-나이-성별-등급별로-생존율">💡 나이, 성별, 등급별로 생존율</h3>
<p>: 1로 갈수록 생존</p>
<pre><code class="language-python">plt.figure(figsize=(14,6))

plt.subplot(131) #1행 3열 중 1번째
sns.barplot(x=&#39;pclass&#39;,y=&#39;survived&#39;,data=titanic)

plt.subplot(132) #1행 3열 중 2번째
sns.barplot(x=&#39;age_cat&#39;,y=&#39;survived&#39;,data=titanic)

plt.subplot(133) #1행 3열 중 3번째
sns.barplot(x=&#39;sex&#39;,y=&#39;survived&#39;,data=titanic)

plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/5a253bf0-b039-43c9-89e0-2d00e3e76535/image.png" alt=""></p>
<pre><code class="language-python">fig,axes = plt.subplots(nrows=1, ncols=2, figsize=(14,6))

women = titanic[titanic[&#39;sex&#39;]==&#39;female&#39;] #이거 자체가 df 형태
men = titanic[titanic[&#39;sex&#39;]==&#39;male&#39;] #이거 자체가 df 형태

ax = sns.distplot(women[women[&#39;survived&#39;]==1][&#39;age&#39;], bins=20,  #women[women[&#39;survived&#39;]==1] : 여성 &#39;survived&#39;컬럼이 1인 df중에서 [&#39;age&#39;] 데이터만
                  label =&#39;survived&#39;, ax = axes[0],kde=False)
ax = sns.distplot(women[women[&#39;survived&#39;]==0][&#39;age&#39;], bins=40,
                  label =&#39;not_survived&#39;, ax = axes[0],kde=False)
ax.legend() ; ax. set_title(&#39;Female&#39;)

ax = sns.distplot(men[men[&#39;survived&#39;]==1][&#39;age&#39;], bins=18,
                  label =&#39;survived&#39;, ax = axes[1],kde=False)
ax = sns.distplot(men[men[&#39;survived&#39;]==0][&#39;age&#39;], bins=40,
                  label =&#39;not_survived&#39;, ax = axes[1],kde=False)
ax.legend() ; ax. set_title(&#39;male&#39;)</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/0a91a55a-8d63-4982-8d5a-413be7fc672f/image.png" alt=""></p>
<h3 id="💡-이름으로-신분-확인하기">💡 이름으로 신분 확인하기</h3>
<pre><code class="language-python">import re
for idx, dataset in titanic.iterrows():
    tmp = dataset[&#39;name&#39;]
    print(re.search(&#39;\,\s\w+(\s\w+)?\.&#39;,tmp).group())
    # &#39;\,\s\w+(\s\w+)?\.&#39; : \,: ,로 시작, 
    #                       \s: 한 칸을 비움, 
    #                       \w+ : 어떤 단어들이 여러개 나옴
    #                       (\s\w+)? : (공백 + 어떤 단어) 가 없을수도 있고, 있을수도 있고
    #                       \. : .로 끝남
    # 대상 : tmp

out&gt;&gt;
, Miss.
, Master.
, Miss.
, Mr.
, Mrs. ...</code></pre>
<pre><code class="language-python">import re

title=[]
for idx, dataset in titanic.iterrows():
    tmp = dataset[&#39;name&#39;]
    condition = re.search(&#39;\,\s\w+(\s\w+)?\.&#39;,tmp).group()
    title.append(condition[2 : -1]) #, Miss.에서 ,부터 0, .전 : -1

title

out&gt;&gt;
[&#39;Miss&#39;,
 &#39;Master&#39;,
 &#39;Miss&#39;,
 &#39;Mr&#39;, ...]</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/38b01c42-a8cb-4631-be1a-3fd2795de892/image.png" alt=""></p>
<hr>
<h2 id="✏️-머신러닝">✏️ 머신러닝</h2>
<hr>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>&quot;제로베이스 데이터 취업 스쿨&quot; 강의</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL] 필수 My SQL 문법]]></title>
            <link>https://velog.io/@soo_oo/SQL-%ED%95%84%EC%88%98-SQL-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@soo_oo/SQL-%ED%95%84%EC%88%98-SQL-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Mon, 16 Oct 2023 23:23:21 GMT</pubDate>
            <description><![CDATA[<p><span style="color:gray"> 백문이 불여일견이라고, 강의를 아무리 집중해서 보고, 다른 사람의 자료를 보더라도 손으로 쓰는 거만큼 머리에 남는게 없더라.
이것만은 짚고가자 하는 필수 SQL 문법 재정리하기!! </span>
<a href="https://velog.io/@soo_oo/SQL-%EC%98%A4%EB%8B%B5%EB%85%B8%ED%8A%B8">관련 노트 : 학습 과제 2 오답노트_비공개</a></p>
<blockquote>
<h4 id="sql-작성-순서">SQL 작성 순서</h4>
<p>SELECT - <span style="color:#000000;background-color:#fff5b1">FROM - WHERE - GROUP BY - HAVING</span> - ORDER BY - LIMIT</p>
</blockquote>
<blockquote>
<h4 id="sql-실행-순서">SQL 실행 순서</h4>
<p><span style="color:#000000;background-color:#fff5b1">FROM - WHERE - GROUP BY - HAVING</span> - SELECT - ORDER BY - LIMIT</p>
</blockquote>
<h2 id="✏️-열기">✏️ 열기</h2>
<pre><code class="language-python">mysql -u 유저네임 -p [데이터베이스]</code></pre>
<pre><code class="language-python">mysql -h &quot;엔드포인트&quot; -P 3306 -u 유저네임 -p비밀번호 데이터베이스</code></pre>
<h2 id="✏️-기초-type">✏️ 기초 type</h2>
<ul>
<li><p><code>CHAR</code> 또는 <code>CHARACTER</code>: 고정 길이 문자열을 나타내는 데이터 타입( 지정된 길이만큼의 문자열을 저장)</p>
</li>
<li><p><code>VARCHAR</code> 또는 <code>CHARACTER VARYING</code>
: 가변 길이 문자열을 나타내는 데이터 타입 (최대 길이가 정해져 있으나 실제 데이터의 길이에 따라 유동적으로 조정됨)</p>
</li>
<li><p><code>TEXT</code>
: 긴 문자열을 나타내는 데이터 타입. 가변 길이의 문자열을 저장할 수 있음.</p>
</li>
<li><p><code>INTEGER</code>
: 정수 값을 나타내는 데이터 타입 (일반적으로 32비트 혹은 64비트로 표현)</p>
</li>
<li><p><code>REAL</code> 또는 <code>FLOAT</code>
: 실수 값</p>
</li>
<li><p><code>DOUBLE</code> 
: 보다 높은 정밀도 제공</p>
</li>
<li><p><code>DECIMAL</code> 또는 <code>NUMERIC</code>
: 고정 소수점 숫자를 나타내는 데이터 타입, 정확한 소수 자리를 유지하기 위해 사용</p>
</li>
<li><p><code>DATE</code>
: 날짜 값을 나타내는 데이터 타입</p>
</li>
<li><p><code>TIME</code>
: 시간 값을 나타내는 데이터 타입</p>
</li>
<li><p><code>TIMESTAMP</code>
: 날짜와 시간을 나타내는 데이터 타입</p>
</li>
<li><p><code>BOOLEAN</code>
: 참(True) 또는 거짓(False) 값을 나타내는 데이터 타입</p>
</li>
</ul>
<h2 id="✏️-테이블">✏️ 테이블</h2>
<h3 id="💡-생성-create">💡 생성 (create)</h3>
<pre><code class="language-python">create TABLE 테이블_이름 (열1_이름 type 그_외_옵션, 열2_이름 type 그_외_옵션)</code></pre>
<pre><code class="language-python"># 예시 1
create table gas_brand (id int AUTO_INCREMENT,name varchar(16),primary key (id))

# 예시 2
create table gas_brand (id int AUTO_INCREMENT primary key,name varchar(16))</code></pre>
<ul>
<li><span style="color:yellowgreen"><strong>,</strong></span>으로 데이터간 구분</li>
<li>구성<ul>
<li>id : 데이터 제목</li>
<li>int : type</li>
<li>AUTO_INCREMENT : 숫자 자동 생성</li>
<li>primary key (id) : </li>
</ul>
</li>
</ul>
<h3 id="💡-자료value-입력-insert-into">💡 자료(value) 입력 (insert into)</h3>
<pre><code class="language-python"># 예시 1
insert into 테이블_이름 (열_이름1, 열_이름2) values (&#39;데이터 내용1_string&#39;,&#39;데이터 내용2_string&#39;,&#39;데이터 내용3_string&#39;)
## (열_이름1, 열_이름2)은 전체 열 입력이 아닌 일부 열일 경우 작성하고, 전체 열 입력일 경우 안적어도 됨

# 예시 2
insert into gas_brand values (데이터 내용1_int, 데이터 내용2_int,데이터 내용3_int)</code></pre>
<ul>
<li><span style="color:yellowgreen"> 데이터 <strong>타입</strong>에 따라</span> 따옴표 사용하기</li>
</ul>
<h3 id="💡-조회">💡 조회</h3>
<ul>
<li>테이블 타입 조회<pre><code class="language-python">desc 테이블_이름</code></pre>
</li>
<li>테이블 내용 조회<pre><code class="language-python">select * from 테이블_이름</code></pre>
</li>
<li>* = 모든 value</li>
</ul>
<h3 id="💡-제약조건-외래키">💡 제약조건 (외래키)</h3>
<h2 id="✏️-python">✏️ Python</h2>
<h3 id="💡-시작하기">💡 시작하기</h3>
<pre><code class="language-python">import mysql.connector</code></pre>
<h3 id="💡-커넥터-만들기">💡 커넥터 만들기</h3>
<pre><code class="language-python">conn=mysql.connector.connect(
    host = &quot;엔드포인트&quot;,
    port = 포트 넘버,
    user = &#39;유저 이름&#39;,
    password = &quot;비밀번호&quot;,
    database=&quot;데이터베이스 이름&quot;
)

#즉, conn : 유저 정보가 담겨 있음</code></pre>
<h3 id="💡-커서-지정">💡 커서 지정</h3>
<pre><code class="language-python">cur=conn.cursor(buffered=True)

#conn에는 유저 정보</code></pre>
<h3 id="💡-명령동작-시행">💡 명령&amp;동작 시행</h3>
<pre><code class="language-python">cur.execute(&quot;명령&quot;)</code></pre>
<pre><code class="language-python">#명령이 길 경우 1,
sql = &quot;insert into 테이블_이름 (데이터_제목) values (&#39;데이터 내용1_string&#39;,&#39;데이터 내용2_string&#39;,&#39;데이터 내용3_string&#39;)&quot;

cur.execute(sql)

#명령이 길 경우 2,(줄나눠도 인식시키는 방법)

sql = &quot;INSERT INTO gas_station (a, b, c, d, e, f, g, h, i, j, k)&quot; +\
&quot;VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)&quot;

cur.execute(sql,(A,B,C,D,E,F,G,H,I,J,K))</code></pre>
<h3 id="💡-conncommit">💡 conn.commit()</h3>
<ul>
<li>트랜잭션을 종료하고 다른 사용자에게 변경된 모든 사항을 보이도록 만드는 문</li>
<li>일반적으로 트랜잭션 종료시 해당 업데이트를 확정한다는 의미에서 &quot;커밋&quot;이라고 사용</li>
<li>commit을 하면 바로바로 sql에 자료가 들어감</li>
<li>업데이트를 취소 처리를 &quot;롤백 (ROLLBACK)&quot;이라고 하며, 이러한 제어를 &quot;약속 제어&quot;라고 부름<pre><code class="language-python">conn.commit()</code></pre>
<h3 id="💡-curfetchone---curfetchall-">💡 cur.fetchone( ) &amp; cur.fetchall( )</h3>
</li>
<li>. fetchone( )<ul>
<li>fetchone을 호출할 때마다 <span style="color:yellowgreen">로우 단위</span>로 데이터를 얻을 수 있음</li>
<li>아래 예시는 2개의 로우만 존재하므로 세번째부터 출력 X<pre><code class="language-python">In [5]: cursor.fetchone()
Out[5]: (&#39;16.06.03&#39;, 97000, 98600, 96900, 98000, 321405)
</code></pre>
</li>
</ul>
</li>
</ul>
<p>In [6]: cursor.fetchone()
Out[6]: (&#39;16.06.02&#39;, 99000, 99300, 96300, 97500, 556790)</p>
<p>In [7]: cursor.fetchone()</p>
<p>In [8]:</p>
<pre><code>* . fetchall( )
  * 한 번에 &lt;span style=&quot;color:yellowgreen&quot;&gt;모든&lt;/span&gt; 로우를 읽기
```python
In [9]: cursor.fetchall()
Out[9]: 
[(&#39;16.06.03&#39;, 97000, 98600, 96900, 98000, 321405),
(&#39;16.06.02&#39;, 99000, 99300, 96300, 97500, 556790)]</code></pre><h2 id="✏️-연습-사이트">✏️ 연습 사이트</h2>
<p><a href="https://kimsyoung.tistory.com/entry/SQL-%EA%B0%9C%EB%85%90-%EC%97%B0%EC%8A%B5%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EC%82%AC%EC%9D%B4%ED%8A%B8-1">SQL 개념 연습하기 좋은 사이트 (1)</a></p>
<h2 id="✏️-출처">✏️ 출처</h2>
<p><a href="https://velog.io/@ygh7687/SQL-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC">📚SQL 문법 정리</a>
<a href="https://wikidocs.net/5329">3) 데이터베이스로부터 데이터 읽기</a>
<a href="https://ko.wikipedia.org/wiki/COMMIT_(SQL)">COMMIT (SQL)</a>
<a href="https://keep-cool.tistory.com/51">[SQL 24] 제약조건 - PK(Primary Key), FK(Foreign Key)</a>
<a href="https://kimsyoung.tistory.com/entry/SQL-%EC%99%B8%EB%9E%98-%ED%82%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4">SQL 외래 키에 대한 이해</a>
<a href="https://project-notwork.tistory.com/52">[SQL]작성 및 실행 순서를 이해하면 좋은 점</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[태블로] BASIC]]></title>
            <link>https://velog.io/@soo_oo/%ED%83%9C%EB%B8%94%EB%A1%9C-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@soo_oo/%ED%83%9C%EB%B8%94%EB%A1%9C-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Mon, 09 Oct 2023 08:31:21 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-태블로">✏️ 태블로?</h2>
<h3 id="💡-bi-솔루션">💡 BI 솔루션</h3>
<ul>
<li>BI 기업에서 데이터를 수집, 정리, 분석하고 활용하여 효율적인 의사 결정을 하도록 하는 애플리케이션과 기술의 집합(Business Intelligence)</li>
<li>행 혹은 열 둘 중 하나가 없어도 차트 생성 가능(예-파이 차트)</li>
<li>타부서와 소통에선 엑셀,막대 차트, 파이 차트같이 단순한 시각화가 효율적(이 대쉬보드를 누가 볼 것인지!!를 유념)</li>
</ul>
<h3 id="💡-테이블-구성">💡 테이블 구성</h3>
<p><span style="color:magenta">로지컬 테이블 / </span><span style="color:skyblue">피지컬 테이블</span>
<img src="https://velog.velcdn.com/images/soo_oo/post/78f50a98-3093-4550-81e9-b5a1eec8c74d/image.png" alt=""></p>
<h3 id="💡-유니온--조인">💡 유니온 &amp; 조인</h3>
<ul>
<li><p>유니온 (결합)</p>
<ul>
<li>다중 결합 가능함</li>
<li>주의점 : 유니온을 하려면 결합하려는 자료들의 구조가 같아야함 (필드 수, 유형 등)
<img src="https://velog.velcdn.com/images/soo_oo/post/9fcc9915-110b-44f0-93dc-421b1630be00/image.png" alt=""></li>
</ul>
</li>
<li><p>조인 (병합)</p>
<ul>
<li>물리적으로 병합해서 하나의 데이터로 만드는 것</li>
<li>피지컬 테이블에서 조인해야함</li>
<li>아래 이미지는 각각 고유 상태의 자료 (관계)
<img src="https://velog.velcdn.com/images/soo_oo/post/e4354a86-50b2-470c-9ec5-042a6d825a04/image.png" alt=""></li>
<li>조인 유형 선택
<img src="https://velog.velcdn.com/images/soo_oo/post/c950967f-9693-4107-86e5-f7e46161c7de/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="💡-차원--측정값">💡 차원 &amp; 측정값</h3>
<p>태블로에서 데이터를 확인하여 자동으로 차원인지 측정값인지 분류함 (기준 : 실선)
<img src="https://velog.velcdn.com/images/soo_oo/post/7b1ba8a6-e49e-43b6-aa6a-60035d70d033/image.png" width="150" height="100"></p>
<ul>
<li>차원<ul>
<li>정성적 값 (ex-이름, 날짜, 지리적 데이터 등)</li>
<li>연속형 차원 : 데이터 유형이 문자열 혹은 bool 형식일 경우, 연속형 불가</li>
</ul>
</li>
<li>측정값<ul>
<li>정량적 수치 값</li>
</ul>
</li>
</ul>
<h3 id="💡-연속형--불연속성">💡 연속형 &amp; 불연속성</h3>
<p>각각 연속형(파란색)과 불연속성(초록색)으로 분류
<img src="https://velog.velcdn.com/images/soo_oo/post/c122f8ce-77ef-4665-b1f3-fa71db028667/image.png" width="200" height="100"></p>
<ul>
<li>연속형<ul>
<li>컬러 그라데이션 표기
<img src="https://velog.velcdn.com/images/soo_oo/post/30fc5eac-0f57-445d-8150-189d698ab992/image.png" alt=""></li>
</ul>
</li>
<li>불연속형<ul>
<li>컬러 구분 표기
<img src="https://velog.velcdn.com/images/soo_oo/post/f7efef72-826d-4072-9297-02620e6d60d6/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/62265acf-67bb-4bd5-b1f8-4d89c6974a84/image.png" alt=""></li>
<li>날짜<ul>
<li>기본적으로 불연속형이기 때문에 끊긴 그래프 나옴</li>
<li>필요한 목적에 따라 연속형 가능
<img src="https://velog.velcdn.com/images/soo_oo/post/10315ed7-3fe9-4e3c-bede-a5406157491c/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="💡-필터링--드릴다운--값-단위-변경">💡 필터링 &amp; 드릴다운 &amp; 값 단위 변경</h3>
<ul>
<li>필터링
<img src="https://velog.velcdn.com/images/soo_oo/post/bee3e562-53de-4578-979c-f7f268a7a2c2/image.png" alt=""></li>
<li>드릴다운
<img src="https://velog.velcdn.com/images/soo_oo/post/8001f123-6d5f-4fe6-abab-62b6a1f51fe5/image.png" alt=""></li>
<li>값 단위 변경 : &#39;레이블-서식-숫자&#39;에서 수정
<img src="https://velog.velcdn.com/images/soo_oo/post/6c01500a-977d-4675-ab97-0712fccb8c6d/image.png" alt=""></li>
<li>소수점 자리수 수정</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/141437b7-2f81-4046-a5ae-c07e239ff33e/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/3a829a07-270e-4ac7-8df2-5cd339e1e10c/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/f922cb70-c637-4074-99b6-33a2d65d43de/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/f379893e-0a11-4dd5-afbe-b56ca0406682/image.png" alt=""></p>
<hr>
<h2 id="✏️-차트">✏️ 차트</h2>
<h3 id="💡-비중-차트---막대차트">💡 비중 차트 - 막대차트</h3>
<ul>
<li>옆으로 누운 그래프
<img src="https://velog.velcdn.com/images/soo_oo/post/492bd639-2b83-40ed-ab4e-d7dbca195b9f/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/e0b1ea22-ee94-4870-bc23-f5c12827f16a/image.png" alt=""></li>
<li>막대 차트로 비중 표현하기
<img src="https://velog.velcdn.com/images/soo_oo/post/6fe7978b-4bbd-448d-9845-29ca17fbf5dc/image.png" alt=""></li>
</ul>
<h3 id="💡-비중-차트---파이-차트">💡 비중 차트 - 파이 차트</h3>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/70cc79f8-13dc-4533-ad4d-b846ed6f7540/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/a8db7d0a-9fb5-4bff-91d2-e8b604a08c13/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/65224330-99f1-45b7-b985-f1758e1d2ea8/image.png" alt=""></p>
<h3 id="💡-비중-차트---트리맵">💡 비중 차트 - 트리맵</h3>
<ul>
<li>항목이 많을 경우 파이차트보다 유용 (but 실무에선 잘 사용 X)
<img src="https://velog.velcdn.com/images/soo_oo/post/4d79a846-7935-4c7e-98df-ade0e29e032d/image.png" alt=""></li>
</ul>
<h3 id="💡-테이블">💡 테이블</h3>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/8af74029-6737-43ce-b3fb-13613ff383df/image.png" alt=""></p>
<ul>
<li><p>응용 1 : 매출별 순위
<img src="https://velog.velcdn.com/images/soo_oo/post/5fb45fc0-6f63-4744-b6fa-d7ba049be289/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/b5fb0996-2c04-4662-853a-73367892f7b7/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/2ecf6002-1bbd-4163-a257-8efe245d2140/image.png" alt=""></p>
<ul>
<li>&#39;순위&#39;탭 이름 변경하기
<img src="https://velog.velcdn.com/images/soo_oo/post/4b31e3ad-8f84-4ae8-a5c4-75411d3d98d3/image.png" alt=""></li>
</ul>
</li>
<li><p>응용 2 : 100% 비율 변경하기
<img src="https://velog.velcdn.com/images/soo_oo/post/56af3103-566a-4c70-8625-2c05c191cb12/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/6f416adf-a7ff-4285-9a99-c3cbffa367c6/image.png" alt=""></p>
</li>
<li><p>응용 3 : YTD vs 누계
누계를 누계를 오른쪽 마우스 - &#39;다음을 사용하여 계산&#39; - &#39;패널(아래로)&#39;로 설정하면 YTD와 동일
<img src="https://velog.velcdn.com/images/soo_oo/post/2bd21576-218b-4907-a62b-d5752667d02c/image.png" alt=""></p>
</li>
</ul>
<h3 id="💡-콤비네이션-차트-이중-축">💡 콤비네이션 차트 (이중 축)</h3>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/b9a156ca-5a2c-438b-b4b3-be5b10ba4407/image.png" alt=""></p>
<ul>
<li><p>라인 + 원형
라인과 원형이 안 맞을 때 = 두 차트의 축 범위가 다를 때 =&gt; <span style="color:yellowgreen">축 동기화</span> 해주기
<img src="https://velog.velcdn.com/images/soo_oo/post/41ce94d3-0e0c-44e9-8229-a2a5f5d493d2/image.png" alt=""></p>
</li>
<li><p>라인 + 영역
<img src="https://velog.velcdn.com/images/soo_oo/post/d606ae2d-98eb-4475-87e9-17c9e4f11bf0/image.png" alt="">
<img src="https://velog.velcdn.com/images/soo_oo/post/e4438298-0eb1-439f-999d-a242a15d53fa/image.png" alt=""></p>
</li>
<li><p>도넛 차트
<img src="https://velog.velcdn.com/images/soo_oo/post/d083c57d-b76d-46f1-bad3-a2766b6908d2/image.png" alt=""></p>
</li>
</ul>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>&quot;제로베이스 데이터 취업 스쿨&quot; 강의</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PYTHON] ✨Web Crawling✨]]></title>
            <link>https://velog.io/@soo_oo/PYTHON-Web-Crawling</link>
            <guid>https://velog.io/@soo_oo/PYTHON-Web-Crawling</guid>
            <pubDate>Sat, 07 Oct 2023 17:43:04 GMT</pubDate>
            <description><![CDATA[<p><span style="color:gray"> 참고 : 지금까지 해온 코드들을 짜집기로 그대로 복붙이라 아래 내용끼리 일치하지 않음 </span></p>
<h2 id="✏️-자주-사용하는-기본-코드">✏️ 자주 사용하는 기본 코드</h2>
<pre><code class="language-python">from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from tqdm import tqdm_notebook
from tqdm import tqdm
from bs4 import BeautifulSoup
import numpy as np

#이건 종종
import warnings
warnings.simplefilter(action=&quot;ignore&quot;,category=FutureWarning)</code></pre>
<h3 id="💡-셀레니움">💡 셀레니움</h3>
<ol>
<li>기본<pre><code class="language-python">driver = webdriver.Chrome()
driver.get(&#39;https://주소&#39;) #연결할 페이지 링킹
time.sleep(10) #버퍼링 고려해 time sleep 넣어주는게 안전
driver.find_element(By.CSS_SELECTOR,&#39;CSS 주소&#39;).click()</code></pre>
</li>
<li>표 읽기<pre><code class="language-python">#표 찾아서 table 이라는 변수로 지정
table = driver.find_element(By.CSS_SELECTOR,&#39;표 CSS 주소&#39;)</code></pre>
</li>
</ol>
<h3 id="💡-beautiful-soup-파싱">💡 Beautiful Soup (파싱)</h3>
<ol>
<li>기본<pre><code class="language-python">req=driver.page_source
soup = BeautifulSoup(req,&#39;html.parser&#39;)
print(soup.prettify)</code></pre>
</li>
<li>select / find_all / find_element<pre><code>select_변수 = soup.select(&#39;beatifulsoup에서 내가 필요한 곳에 대한 주소&#39;) #html(soup)에서 전체만 추출
select_변수</code></pre></li>
</ol>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>제로베이스 데이터취업스쿨 강의
<a href="https://minjoos.tistory.com/5">[python] Selenium으로 웹 페이지 크롤링하기 2 / 표(table)</a>
<a href="https://velog.io/@jisu0807/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81-BeautifulSoup%EC%97%90%EC%84%9C-find%EC%99%80-select-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">웹크롤링 - BeautifulSoup에서 find와 select 사용하기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PYTHON] ✨DATAFRAME✨]]></title>
            <link>https://velog.io/@soo_oo/PYTHON-DATAFRAME</link>
            <guid>https://velog.io/@soo_oo/PYTHON-DATAFRAME</guid>
            <pubDate>Wed, 04 Oct 2023 14:34:56 GMT</pubDate>
            <description><![CDATA[<p><span style="color:gray"> EDA 테스트를 해보며 자주 나오는 코딩 문법 복습하기!!! </span></p>
<h2 id="✏️-데이터프레임-만들기">✏️ 데이터프레임 만들기</h2>
<h3 id="💡-행row-기준">💡 행(row) 기준</h3>
<ul>
<li>디렉토리 : 한 행 {&#39;컬럼명&#39; : &#39;값&#39;}</li>
<li>리스트로 묶기<pre><code class="language-python">source =  
[{&#39;매장명&#39;: &#39;용마로주유소&#39;,
&#39;주소&#39;: &#39;서울 중랑구 용마산로 309 (면목동)&#39;,
&#39;브랜드&#39;: &#39;SK에너지&#39;,
&#39;휘발유 가격&#39;: &#39;1,798&#39;,
&#39;경유 가격&#39;: &#39;1,698&#39;,
&#39;셀프 여부&#39;: &#39;Y&#39;,
&#39;세차장 여부&#39;: &#39;Y&#39;,
&#39;충전소 여부&#39;: &#39;N&#39;,
&#39;경정비 여부&#39;: &#39;N&#39;,
&#39;편의점 여부&#39;: &#39;N&#39;,
&#39;24시간 운영 여부&#39;: &#39;N&#39;,
&#39;구&#39;: &#39;중랑구&#39;},
{&#39;매장명&#39;: &#39;범아주유소&#39;,
&#39;주소&#39;: &#39;서울 중랑구 동일로 881 (묵동)&#39;,
&#39;브랜드&#39;: &#39;S-OIL&#39;,
&#39;휘발유 가격&#39;: &#39;1,859&#39;,
&#39;경유 가격&#39;: &#39;1,739&#39;,
&#39;셀프 여부&#39;: &#39;N&#39;,
&#39;세차장 여부&#39;: &#39;Y&#39;,
&#39;충전소 여부&#39;: &#39;N&#39;,
&#39;경정비 여부&#39;: &#39;Y&#39;,
&#39;편의점 여부&#39;: &#39;N&#39;,
&#39;24시간 운영 여부&#39;: &#39;N&#39;,
&#39;구&#39;: &#39;중랑구&#39;}]
</code></pre>
</li>
</ul>
<p>df=pd.DataFrame(source)</p>
<pre><code>### 💡 Github에서 파일 불러오기
```python
git_address=&quot;http://~~~&quot; #따옴표 중요
df=pd.read_excel(git_address)</code></pre><ul>
<li>번외 ) 리스트를 튜플로 만들기 (zip), 튜플을 딕셔너리로, 언팩킹<pre><code class="language-python"># 리스트를 튜플로 만들기 (zip),
list1=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]
list2=[1,2,3]
pairs =[pair for pair in zip(list1,list2)]
paris
</code></pre>
</li>
</ul>
<p>out&gt;&gt;
[(&#39;a&#39;,1),(&#39;b&#39;,2),(&#39;c&#39;,3)]</p>
<p>#튜플을 딕셔너리로
dict(pairs)</p>
<p>out&gt;&gt;
{&#39;a&#39;:1,&#39;b&#39;:2,&#39;c&#39;:3 }</p>
<p>#언팩킹
x,y =zip(*pairs)
x</p>
<p>out&gt;&gt;
(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;)</p>
<p>print(list(y))</p>
<p>out&gt;&gt;
[1,2,3]</p>
<pre><code>### 💡 열(column) 기준
```python
source={&#39;country&#39;: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;e&#39;],&#39;person&#39;: [11, 22, 3, 23, 9],&#39;zero&#39;: [0, 0, 0, 0, 0]}

df_temp=pd.DataFrame(source)
df_temp</code></pre><p>&#39;country&#39;: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;e&#39;]}</p>
<h2 id="✏️-파일-읽기">✏️ 파일 읽기</h2>
<h3 id="💡-csv">💡 csv</h3>
<pre><code class="language-python">import pandas as pd

#파일 불러오기
data = pd.read_csv(&#39;주소/파일.csv&#39;, encoding=&#39;&#39;)

#파일 확인하기
data.head()</code></pre>
<h3 id="💡-html">💡 html</h3>
<pre><code class="language-python">import pandas as pd
pd.read_html(URL, match=&#39;.+&#39;, flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=&#39;, &#39;, encoding=None, decimal=&#39;.&#39;, converters=None, na_values=None, keep_default_na=True, displayed_only=True)</code></pre>
<h2 id="✏️-열컬럼-조회">✏️ 열(컬럼) 조회</h2>
<h3 id="💡-컬럼-1개">💡 컬럼 1개</h3>
<blockquote>
</blockquote>
<ul>
<li>df[‘ColumnName’]</li>
<li>df.ColumnName</li>
</ul>
<h3 id="💡-컬럼-여러개">💡 컬럼 여러개</h3>
<blockquote>
<ul>
<li>df[[‘ColumnName’, &#39;ColumnName&#39;]]
<span style="color:gray">리스트에 리스트 형식</span></li>
</ul>
</blockquote>
<h3 id="💡-loc를-사용해서-불러오기">💡 loc를 사용해서 불러오기</h3>
<hr>
<h2 id="✏️-행-조회">✏️ 행 조회</h2>
<h3 id="💡-인덱싱-활용--loc-iloc">💡 인덱싱 활용 : loc, iloc</h3>
<blockquote>
<p><strong>df.loc[행 인덱싱 값, 열 인덱싱 값 ]</strong></p>
</blockquote>
<ul>
<li>Location 약자</li>
</ul>
<pre><code class="language-python"># 예시
df.loc[0] : 0번째 행변경 (딕셔너리)
df.loc[0,&#39;Name&#39;] : 0번째 행, Name 열
df.loc[:,&#39;Name&#39;] : 전체 행, Name 열
df.loc[:4,:&#39;Name&#39;] : 처음행부터 4까지, 처음열부터 Name 열
df.loc[[1,2,5],[&#39;Name&#39;,&#39;Address&#39;]] : 1,2,5행 + Name, Address 열

# 예시 : age 컬럼에서 3인 값들 추출하기
cond1=df[&#39;age&#39;] == 1
df.loc[cond1]

# 예시 : age 컬럼에서 3인 값들 추출하기 + class가 30인 값 추출하기
df.loc[(df[&#39;age&#39;] == 1) | (df[&#39;class가&#39;] == 30)]</code></pre>
<pre><code># 멀티 인덱스일 경우_아래 이미지
df_target.loc[(&#39;서울시&#39;, &#39;합계&#39;, &#39;발생건수&#39;),열]</code></pre><p><img src="https://velog.velcdn.com/images/soo_oo/post/345819f2-93ba-43ad-bd2c-f7e1993f03a1/image.png" alt=""></p>
<blockquote>
<p><strong>df.iloc[행 인덱싱값, 열 인덱싱 값]</strong></p>
</blockquote>
<ul>
<li>Integer Location 약자</li>
<li>맨 첫 행은 0부터 시작</li>
<li>명칭을 직접 적거나 특정 조건식을 사용하는 loc와 달리 컴퓨터가 읽기 좋은 &#39;숫자&#39;형식으로 위치에 접근함</li>
</ul>
<pre><code class="language-python"># 예시 
df.iloc[2] #0부터 시작해서 0&gt;1&gt;2 번째 줄
df.iloc[3:7] #0&gt;1&gt;2&gt;3 번째 ~ 6번째 줄
df.iloc[:7] #처음부터 ~ 6번째 줄
df.iloc[:-7] #마지막에서부터 ~ 6번째까지</code></pre>
<h3 id="💡-iterrows">💡 iterrows()</h3>
<ul>
<li>데이터의 행-열/데이터 정보를 튜플 형태의 generator 객체로 반환하는 메서드</li>
<li>(행 이름, 내용의 Series객체) 형태로 반환하는데, Series객체는 열 - 값 형태로 반환</li>
</ul>
<h3 id="💡-조건-활용">💡 조건 활용</h3>
<blockquote>
<ul>
<li><strong>df[df[</strong>&#39;ColumnName&#39;]조건<strong>]</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>df[df.</strong>ColumnName 조건<strong>]</strong>
<span style="color:gray">데이터 프레임에 데이터 프레임</span></li>
</ul>
<pre><code class="language-python"># 예시 : age 컬럼이 30 이상인 행을 가져오고 싶다면
df[df[&#39;age&#39;]&gt;=30]
df[df.age&gt;=30]

# 예시 : name이 ‘Clara Oswald’가 아닌 경우만 선택하고 싶다면
df[df[&#39;name&#39;] != &#39;Clara Oswald&#39;]
df[df.name != &#39;Clara Oswald&#39;]</code></pre>
<hr>
<h2 id="✏️-데이터프레임-내용-수정">✏️ 데이터프레임 내용 수정</h2>
<h3 id="💡-replace-수정-전-수정-후">💡 .replace (수정 전, 수정 후)</h3>
<h3 id="💡-인덱스-컬럼명_딕셔너리-리스트">💡 인덱스, 컬럼명_딕셔너리, 리스트</h3>
<p>아래 코드에서 이 부분 로직 잘 확인하기 : <span style="color:greenyellow">df.loc[df.index == index, &#39;country&#39;] == country </span></p>
<pre><code class="language-python">df={&#39;country&#39;: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;e&#39;]},&#39;person&#39;: [11, 22, 3, 23, 9]},&#39;zero&#39;: [0, 0, 0, 0 0]}

#(인덱스,&#39;country&#39;컬럼 변경 내용)
df_change_list = [
    (1, &#39;A&#39;),
    (3, &#39;C&#39;),
    (4, &#39;E&#39;),
]

for index, country in df_change_list:
    df.loc[df.index == index, &#39;country&#39;] = country</code></pre>
<h3 id="💡-컬럼명_리스트">💡 컬럼명_리스트</h3>
<pre><code class="language-python">df.columns=[]</code></pre>
<h3 id="💡-컬럼명_딕셔너리">💡 컬럼명_딕셔너리</h3>
<pre><code class="language-python">df.rename(columns={&#39;기존 이름&#39; : &#39;바뀔 이름&#39;})</code></pre>
<h3 id="💡-컬럼-순서_리스트">💡 컬럼 순서_리스트</h3>
<pre><code class="language-python">data={
    &quot;name&quot; : a,
    &quot;age&quot; : b,
    &quot;height&quot; : c,
    &quot;sex&quot; : d
}
혹은
df.columns = [&#39;name&#39;, &#39;age&#39;, &#39;height&#39;, &#39;sex&#39;]
------------------------------------------------------------
#1
df[[&#39;name&#39;, &#39;sex&#39;, &#39;age&#39;, &#39;height&#39;]]

#2
df=pd.DataFrame(data, columns=[&quot;name&quot;,&quot;sex&quot;,&quot;age&quot;,&quot;height&quot;])
df

# **3
new_order_column=[&#39;name&#39;, &#39;sex&#39;, &#39;age&#39;, &#39;height&#39;]
df[new_order_column]</code></pre>
<h3 id="💡-값-변경_딕셔너리">💡 값 변경_딕셔너리</h3>
<p>아래 코드에서 이 부분 로직 잘 확인하기 : <span style="color:greenyellow">items() / df.loc[df[&quot;Column&quot;]==old_name, &quot;Column&quot;] : [행,열]</span></p>
<pre><code class="language-python">#컬럼명 주어짐
old_to_new_value = {
    &#39;Old_1&#39;: &#39;New_1&#39;,
    &#39;Old_2&#39;: &#39;New_2&#39;,
    &#39;Old_3&#39;: &#39;New_3&#39;,}

for old_name, new_name in old_to_new_value.items():
    df.loc[df[&quot;Column&quot;]==old_name, &quot;Column&quot;] = new_name</code></pre>
<h3 id="💡-데이터프레임-형-변환--astype">💡 데이터프레임 형 변환 : astype</h3>
<ol>
<li>1개 열<pre><code class="language-python">df1 = df.astype({&#39;col1&#39;:&#39;int32&#39;})</code></pre>
</li>
<li>다수 열<pre><code class="language-python">df1 = df.astype({&#39;col1&#39;:&#39;int32&#39;, &#39;col3&#39;:&#39;int64&#39;})
print(df1.dtypes)</code></pre>
</li>
</ol>
<ul>
<li>변경할 타입들이 동일 할 경우<pre><code class="language-python">columns_to_convert = [&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;]
df1[columns_to_convert] = df1[columns_to_convert].astype(float)</code></pre>
</li>
</ul>
<ol start="3">
<li>모든 열<pre><code class="language-python">df1= df.astype(dtype=&#39;int64&#39;,errors=&#39;ignore&#39;)
#errors = int64로 변경할 수 없는건 무시
print(df1.dtypes)</code></pre>
</li>
</ol>
<h3 id="💡-특정-단어를-포함하고-있다면">💡 특정 단어를 포함하고 있다면??</h3>
<pre><code class="language-python">#특정 단어를 포함하고 있는 열을 제외한 데이터프레임으로 설정
df = df[~df[&#39;column&#39;].str.contains(&#39;특정 단어&#39;)]</code></pre>
<h3 id="💡-split">💡 split()</h3>
<p>예시) df의 A 컬럼에서 str 타입을 공백으로 나눈다</p>
<pre><code class="language-python">df.컬럼명.str.split(&#39; &#39;)[0]</code></pre>
<p>예시) df의 A 컬럼에서 str 타입을 공백으로 나눈 것에서 str타입 [0]번째 호출</p>
<pre><code class="language-python">df.[&#39;A&#39;].str.split(&#39; &#39;).str[0]</code></pre>
<pre><code class="language-python"># 같은 문법
for id, row in df.iterrows():
    df.loc[id, &#39;A&#39;] = row[&#39;A&#39;].split(&#39; &#39;)[0]

-----
df[&#39;A&#39;] = df[&#39;A&#39;].str.split(&#39; &#39;).str[0]</code></pre>
<pre><code>for i, row in df_practice.iterrows():
    df_practice[&#39;구분&#39;]=df_practice[&#39;구분&#39;].str.split(&#39; &#39;)[i][0]

#위와 동일한 코드
df_practice[&#39;구분&#39;] = df_practice[&#39;구분&#39;].apply(lambda x: x.split(&#39; &#39;)[0])</code></pre><h3 id="💡-strip">💡 strip()</h3>
<ul>
<li>문자열에서 양쪽 끝에 있는 공백이나 지정한 다른 문자들을 제거<pre><code class="language-python">s = &quot;   Hello   &quot;
print(s.strip())  # 출력: &quot;Hello&quot;</code></pre>
<pre><code class="language-python">s = &quot;----Hello----&quot;
print(s.strip(&#39;-&#39;))  # 출력: &quot;Hello&quot;</code></pre>
</li>
<li>데이터 프레임 value에서 공백 제거<pre><code class="language-python">df[&#39;컬럼명&#39;]=df[&#39;컬럼명&#39;].str.strip()</code></pre>
</li>
</ul>
<hr>
<h2 id="✏️-데이터-프레임-삭제하기">✏️ 데이터 프레임 삭제하기</h2>
<h3 id="💡-기본-코드--drop">💡 기본 코드 : drop()</h3>
<p>&#39;리스트&#39; 사용
<span style="color:greenyellow">axis=1 : 열(coulumn)</span></p>
<pre><code class="language-python">drop_col = [&#39;A&#39;,&#39;C&#39;,&#39;F&#39;]
df=df.drop(drop_col,axis=1)</code></pre>
<h3 id="💡-특정-조건에-맞는-행-삭제">💡 특정 조건에 맞는 행 삭제</h3>
<pre><code class="language-python">source = {&#39;country&#39;: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;e&#39;, &#39;e&#39;],
&#39;person&#39;: [11, 3, 3, 23, 5],
&#39;zero&#39;: [0, 0, 0, 0, 0]}

# &#39;country&#39;컬럼에서 &#39;b&#39;인 행 지우기
idx = source[source[&#39;country&#39;] == &quot;b&quot;].index
source.drop(idx , inplace=True)

# 더 심플한 방법 : &#39;country&#39;컬럼에서 &#39;b&#39;가 아닌 행 찾기
DF = source[source.country != &#39;b&#39;]
</code></pre>
<h3 id="💡-중복-제거--drop_duplicates">💡 중복 제거 : drop_duplicates()</h3>
<p><code>df.drop_duplicates()</code></p>
<table>
<thead>
<tr>
<th>파라미터</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>keep</td>
<td>first : 첫번째만 남기고 이후 중복값 제거, default= first <br>last : 마지막만 남기고 이전 중복값 제거</td>
</tr>
<tr>
<td>inplace</td>
<td>default = False, df 변경 여부</td>
</tr>
<tr>
<td>ignore_index</td>
<td>default = False, 인덱스 재설정 여부</td>
</tr>
<tr>
<td>subset</td>
<td>중복 데이터를 처리할 열</td>
</tr>
</tbody></table>
<h3 id="💡-멀티인덱스-제거--droplevellevel">💡 멀티인덱스 제거 : droplevel(level=)</h3>
<pre><code class="language-python">df_result = df_result.droplevel(level=2)</code></pre>
<hr>
<h2 id="✏️-데이터프레임-정렬">✏️ 데이터프레임 정렬</h2>
<h3 id="💡-sort_values">💡 sort_values()</h3>
<ol>
<li><p>기본 원리 : A 컬럼을 내림차순으로</p>
<pre><code class="language-python">df.sort_values(by=&#39;A&#39;, ascending=False)</code></pre>
</li>
<li><p>A 컬럼을 오름차순으로 먼저 맞춘후 B 컬럼 오름차순 지정</p>
<pre><code class="language-python">df.sort_values(by=[&#39;A&#39;, &#39;B&#39;], ascending=[True, True])</code></pre>
</li>
<li><p>컬럼 ) 특정 리스트 순서대로</p>
<pre><code class="language-python">type_list = [&#39;합계&#39;, &#39;차대사람&#39;, &#39;차대차&#39;, &#39;차량단독&#39;, &#39;건널목&#39;]
category_type = pd.CategoricalDtype(categories=type_list, ordered=True)</code></pre>
</li>
<li><p>멀티 인덱스 ) 특정 리스트 순서대로</p>
<pre><code class="language-python">gu_list = [&#39;서울시&#39;, &#39;종로구&#39;, &#39;중구&#39;, &#39;용산구&#39;, &#39;성동구]
df=df.reindex(index=gu_list, level=1)
# 두번째 인덱스 줄을 gu_list 순서대로 배열</code></pre>
</li>
</ol>
<h3 id="💡-sort_index">💡 sort_index()</h3>
<h3 id="💡-groupby">💡 groupby()</h3>
<table>
<thead>
<tr>
<th>함수</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>count</td>
<td>데이터의 개수</td>
</tr>
<tr>
<td>sum</td>
<td>합계</td>
</tr>
<tr>
<td>mean</td>
<td>평균</td>
</tr>
<tr>
<td>median</td>
<td>중앙값</td>
</tr>
<tr>
<td>var, std</td>
<td>분산, 표준편차</td>
</tr>
<tr>
<td>min, max</td>
<td>최소, 최대값</td>
</tr>
<tr>
<td>unique, nunique</td>
<td>고유값, 고유값 개수</td>
</tr>
<tr>
<td>prod</td>
<td>곱</td>
</tr>
<tr>
<td>first, last</td>
<td>첫째, 마지막값</td>
</tr>
<tr>
<td>```python</td>
<td></td>
</tr>
<tr>
<td>df.groupby(&#39;컬럼명&#39;).집계함수()</td>
<td></td>
</tr>
</tbody></table>
<p>#예시
df.groupby(&#39;age&#39;).var()</p>
<pre><code>* 다중 통계
```python
df.groupby(&#39;age&#39;).agg([&#39;mean&#39;, &#39;var&#39;])</code></pre><h3 id="💡-list순으로-정렬하기">💡 List순으로 정렬하기</h3>
<ul>
<li>.map( ) 사용</li>
</ul>
<pre><code class="language-python">city_list = [&#39;서울&#39;, &#39;부산&#39;, &#39;대전&#39;, &#39;광주&#39;]
cat_list = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;]
type_list = [&#39;가&#39;, &#39;나&#39;, &#39;다&#39;, &#39;라&#39;, &#39;마&#39;, &#39;-&#39;]

# 리스트 항목별로 순서 매기기
sorterIndex_city = dict(zip(gu_list, range(len(gu_list))))
sorterIndex_type = dict(zip(type_list, range(len(type_list))))
sorterIndex_cat = dict(zip(cat_list, range(len(cat_list))))

# 순서를 위한 임시 컬럼 만들기
df[&#39;도시순서&#39;] = df[&#39;도시&#39;].map(sorterIndex_city)
df[&#39;유형순서&#39;] = df[&#39;유형&#39;].map(sorterIndex_type)
df[&#39;구분&#39;] = df[&#39;구분&#39;].map(sorterIndex_cat)

#&#39;도시순서&#39;가 같으면 &#39;유형순서, &#39;유형순서&#39;가 같으면 &#39;구분순서&#39;순으로 배열
df.sort_values([&#39;도시순서&#39;,&#39;유형순서&#39;,&#39;구분순서&#39;],inplace=)

# 임시 컬럼 삭제하기
df.drop([&#39;도시순서&#39;,&#39;유형순서&#39;,&#39;구분순서&#39;],axis=1,inplace=True)</code></pre>
<hr>
<h2 id="✏️-데이터-프레임-합치기">✏️ 데이터 프레임 합치기</h2>
<h3 id="💡-merge--데이터프레임-병합하기">💡 .merge() : 데이터프레임 병합하기</h3>
<ul>
<li>공통된 컬럼 (key) 를 기반으로 합쳐짐</li>
</ul>
<span style="color:grey">
* left : 왼쪽 데이터프레임 / * right : 오른쪽 데이터프레임</span>


<pre><code class="language-python">import pandas as pd

# 기준열 이름이 같을 때
pd.merge(left, right, on = &#39;기준열&#39;, how = &#39;조인방식&#39;)

# 기준열 이름이 다를 때
pd.merge(left, right, left_on = &#39;왼쪽 열&#39;, right_on = &#39;오른쪽 열&#39;, how = &#39;조인방식&#39;)</code></pre>
<ul>
<li><p><code>on</code> : (두 데이터프레임의 기준열 이름이 같을 때) 기준열
하지만 양쪽 데이터프레임에서 기준이 되는 열의 이름이 다르다면 각각 left_on = &#39;왼쪽 열&#39;, right_on = &#39;오른쪽 열&#39;로 지정하면 된다.</p>
<ul>
<li>left_on : 기준열 이름이 다를 때, 왼쪽 기준열</li>
<li>right_on : 기준열 이름이 다를 때, 오른쪽 기준열</li>
</ul>
</li>
<li><p><code>how</code> : 조인 방식 {&#39;left&#39;, &#39;right&#39;, &#39;inner&#39;, &#39;outer&#39;} 기본값은 &#39;inner&#39;
<img src="https://velog.velcdn.com/images/soo_oo/post/4ee023f0-35af-416e-b790-675ee97c51d7/image.png" alt=""></p>
<ul>
<li>left : right에 없으면 right 자리에 Nan</li>
<li>right : left에 없으면 left 자리에 Nan</li>
<li>inner : 교집합만</li>
<li>outer : 전체</li>
</ul>
</li>
</ul>
<h3 id="💡-concat--데이터-프레임-붙이기">💡 .concat() : 데이터 프레임 붙이기</h3>
<ul>
<li>합집합 형태로 데이터를 묶을 때 편리</li>
<li>기본 <code>asix=0</code> : 행단위로 아래에 붙여넣기
<code>asix=1</code> : 열단위로 옆에 붙여넣기</li>
</ul>
<hr>
<h2 id="✏️-결측치-확인">✏️ 결측치 확인</h2>
<h3 id="💡-결측치-행-확인--isnull">💡 결측치 행 확인 : isnull()</h3>
<ol>
<li>기본 원리
데이터 프레임에 True/False 표시 : 결측치 O = True / 결측치 X = False<pre><code class="language-python">df.isnull()</code></pre>
</li>
<li>특정 열에서 찾기 1
A열의 결측치<pre><code class="language-python">df[df[&#39;A&#39;].isnull()]</code></pre>
</li>
<li>특정 열에서 찾기 2
A와 C 결측치_참고 : &amp;(and), |(or)<pre><code class="language-python">df[(df[&#39;A&#39;].isnull()) | (df[&#39;C&#39;].isnull())]</code></pre>
</li>
<li>결측치 개수 확인 방법<pre><code class="language-python">df.isnull().sum()
</code></pre>
</li>
</ol>
<h1 id="결과">결과</h1>
<p>A    2
B    1
C    3
dtype: int64</p>
<p>#특정 열에 있는지 여부 체크
df[&#39;A&#39;].isnull().sum()</p>
<pre><code>### 💡 결측치 아닌 행 확인 : notnull()
1. 기본 원리
데이터 프레임에 True/False 표시 : 결측치 O = False / 결측치 X = True
```python
df.notnull()</code></pre><ol start="2">
<li>특정 열에서 찾기 1
A열의 결측치가 아닌 것을 데이터 프레임으로<pre><code class="language-python">df[df[&#39;A&#39;].notnull()]</code></pre>
</li>
<li>특정 열에서 찾기 2
A와 C 결측치가 아닌 것을 데이터 프레임으로_참고 : &amp;(and), |(or)<pre><code class="language-python">df[(df[&#39;A&#39;].notnull()) | (df[&#39;C&#39;].notnull())]</code></pre>
</li>
<li>결측치가 아닌 값 개수 확인 방법<pre><code class="language-python">df.    notnull().sum()
</code></pre>
</li>
</ol>
<h1 id="결과-1">결과</h1>
<p>A    4
B    5
C    3
dtype: int64</p>
<pre><code>### 💡 결측값 채우기
```python
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)</code></pre><table>
<thead>
<tr>
<th>파라미터</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>value</td>
<td>결측값을 대체할 값, dict 형태도 가능</td>
</tr>
<tr>
<td>method</td>
<td>결측값을 변경할 방식<br>bfill : 결측값 바로 아래 값과 동일하게<br>ffill : 결측값 바로 위값과 동일하게</td>
</tr>
<tr>
<td>axis</td>
<td>{0 : index / 1 : columns} fillna 메서드를 적용할 레이블</td>
</tr>
<tr>
<td>inplace</td>
<td>원본 변경 여부</td>
</tr>
<tr>
<td>limit</td>
<td>변경활 회수, 위에서부터 지정된 갯수만 변경</td>
</tr>
<tr>
<td>downcast</td>
<td>downcast=&#39;infer&#39;일 경우 float64를 int64로 변경</td>
</tr>
</tbody></table>
<hr>
<h2 id="✏️-인덱스-셋--리셋">✏️ 인덱스 셋 &amp; 리셋</h2>
<h3 id="💡-set_index">💡 set_index()</h3>
<pre><code class="language-python">df.set_index(&#39;id&#39;)
df.set_index([&#39;id&#39;, &#39;name&#39;])</code></pre>
<ul>
<li>멀티 인덱스 추출하기<pre><code class="language-python">df.index.get_level_values(0)</code></pre>
</li>
</ul>
<h3 id="💡-reset_index">💡 reset_index()</h3>
<pre><code class="language-python">DataFrame.reset_index(level=None, drop=False,
inplace=False, col_level=0, col_fill=&#39;&#39;)</code></pre>
<hr>
<h2 id="✏️-코드-간소화하기">✏️ 코드 간소화하기</h2>
<pre><code class="language-python">df=df.groupby(&#39;Country&#39;).count()
df=df.sort_values(by=&#39;Year&#39;, ascending=False)
df=df.head(10) # 상위 10개
df=df.reset_index()
dropList=[&#39;Month&#39;,&#39;Day&#39;,&#39;Region&#39;,&#39;city&#39;,&#39;latitude&#39;,&#39;longitude&#39;,&#39;Type&#39;]
df=df.drop(dropList,axis=1)
</code></pre>
<pre><code class="language-python">dropList = [&#39;Month&#39;, &#39;Day&#39;, &#39;Region&#39;, &#39;city&#39;, &#39;latitude&#39;, &#39;longitude&#39;, &#39;Type&#39;]

df = (
    df.groupby(&#39;Country&#39;).count()
    .sort_values(by=&#39;Year&#39;, ascending=False)
    .head(10)
    .reset_index()
    .drop(columns=dropList)
)</code></pre>
<hr>
<h2 id="✏️-출처">✏️ 출처</h2>
<p><a href="https://bigdaheta.tistory.com/41">[pandas] 2-1. loc와 iloc 차이와 사용방법</a>
<a href="https://hleecaster.com/python-pandas-selecting-data/">[pandas] 열 또는 행 선택하기</a>
<a href="https://jimmy-ai.tistory.com/162">[Pandas] 파이썬 결측치 확인 방법 : isnull, notnull</a>
<a href="https://ybworld.tistory.com/63">[Python/파이썬] Pandas Dataframe 결합 : Merge</a>
<a href="https://jimmy-ai.tistory.com/69">[Pandas] 데이터프레임 정렬하기 : sort_values, sort_index 함수</a>
<a href="https://hogni.tistory.com/51">[파이썬 pandas] 데이터프레임 컬럼 순서 변경, 추가, 이름 바꾸기</a>
<a href="https://blog.naver.com/nilsine11202/221667433984">[파이썬] 7. 판다스 - 특정 조건 만족하는 행 삭제하기|작성자 러닝머신</a>
<a href="https://mizykk.tistory.com/82">[Python] 데이터프레임 합치기 :: pd.merge()</a>
<a href="https://wikidocs.net/160327#concat">02. 데이터 프레임 결합하기</a>
<a href="https://teddylee777.github.io/pandas/pandas-groupby/">판다스(Pandas) .groupby()로 할 수 있는 거의 모든 것! (통계량, 전처리)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GIT] README]]></title>
            <link>https://velog.io/@soo_oo/GIT-README</link>
            <guid>https://velog.io/@soo_oo/GIT-README</guid>
            <pubDate>Tue, 03 Oct 2023 13:52:57 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-readme란">✏️ README란?</h2>
<blockquote>
<ul>
<li>프로젝트에 대한 설명, 사용 방법, 라이센스, 설치법과 같은 부분에 대해 기술하는 파일 (포트폴리오 설명 용도로도 사용)</li>
</ul>
</blockquote>
<ul>
<li>본인, 직장 동료, 프로그램 사용자를 위해 존재</li>
<li>벨로그 markdown 문법과 동일함</li>
</ul>
<h3 id="💡-markdown">💡 Markdown</h3>
<h4 id="큰-제목--">큰 제목 : =====</h4>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/0a738d19-c3e8-49c5-98d7-572c6b5e08d0/image.png" alt=""></p>
<h4 id="작은-제목-------">작은 제목 : -----</h4>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/ece41c03-321e-4c3c-adb8-45fad4a56ae4/image.png" alt=""></p>
<h4 id="hashtag-제목">Hashtag 제목</h4>
<ul>
<li>&#39;#&#39; 1개부터 ~ 6개 : #가 많아질 수록 타이틀은 작아짐</li>
</ul>
<h4 id="블럭인용문">블럭인용문</h4>
<ul>
<li>&#39;&gt;&#39;,&#39;&gt;&gt;&#39;,&#39;&gt;&gt;&gt;&#39; 등으로 사용<blockquote>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
</blockquote>
</li>
</ul>
<h4 id="코드블럭-1">코드블럭 1</h4>
<pre><code>&lt;code&gt;코드입력&lt;/code&gt;
&lt;pre&gt;&lt;code&gt;코드입력&lt;/code&gt;&lt;/pre&gt;</code></pre><h4 id="코드블럭-2">코드블럭 2</h4>
<ul>
<li>```</li>
</ul>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>제로베이스 데이터취업스쿨 강의</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GIT] 코드 ]]></title>
            <link>https://velog.io/@soo_oo/GIT-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@soo_oo/GIT-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Tue, 03 Oct 2023 06:49:04 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-git-기초-코드">✏️ GIT 기초 코드</h2>
<h3 id="💡-기초-코드">💡 기초 코드</h3>
<p><span style="color:gray">아래 코드는 git의 직접적인 명령코드는 아니나 알아두면 유용</span></p>
<h4 id="-local-경로-이동하기">* [local] 경로 이동하기</h4>
<pre><code>% cd 폴더명</code></pre><h4 id="-local-폴더-만들기">* [local] 폴더 만들기</h4>
<pre><code>% mkdir 폴더명</code></pre><h4 id="-local-빈-파일-만들기">* [local] 빈 파일 만들기</h4>
<pre><code>% touch 파일명.확장자</code></pre><h4 id="-cat--파일-내용-확인하기">* CAT : 파일 내용 확인하기</h4>
<pre><code>% cat 파일명.확장자</code></pre><h4 id="-cat--파일-생성하고-내부-파일에-내용-입력하기-파일이-있으면-덮어씀">* CAT : 파일 생성하고 내부 파일에 내용 입력하기 (파일이 있으면 덮어씀)</h4>
<pre><code>% cat &gt; 파일명.확장자
명령어 #ex-파이썬이라면 print(&#39;hello,world&#39;)
control + D #for Mac / 위 내용 저장됨</code></pre><h4 id="-cat--기존-파일에-덧붙여쓰기">* CAT : 기존 파일에 덧붙여쓰기</h4>
<pre><code>% cat &gt;&gt; 파일명.확장자
명령어 #ex-파이썬이라면 print(&#39;hello,world&#39;)
control + D #for Mac / 위 내용 저장됨</code></pre><h3 id="💡-local--remote-repository">💡 Local &amp; Remote Repository</h3>
<h4 id="-local-폴더-초기화">* [local] 폴더 초기화</h4>
<ul>
<li>해당 폴더를 git이 관리하기 시작하는 초기화 명령</li>
<li>숨은 폴더로 git 폴더 생성됨</li>
<li>별도 브랜치를 생성하지 않는 이상 main 혹은 master 브랜치로 이름 지정됨<pre><code>% git init </code></pre><h4 id="-⭐️-local-파일을-indexstage에-추가">* ⭐️ [local] 파일을 index(stage)에 추가</h4>
<pre><code>% git add 파일명.확장자</code></pre><h4 id="-⭐️-local-파일을-indexstage에-추가된-사항을-head에-반영확정">* ⭐️ [local] 파일을 index(stage)에 추가된 사항을 head에 반영(확정)</h4>
cat등으로 파일 수정후 아래 코드 입력해서 업데이트 해주면 git graph에 history 업데이트 됨<pre><code>% git commit -m &#39;메시지 입력&#39; 파일명.확장자</code></pre></li>
</ul>
<h4 id="github에서-repository-만들기"><del>github에서 repository 만들기</del></h4>
<h4 id="-remote-remote-repository-등록">* [remote] remote repository 등록</h4>
<pre><code>% git remote add origin https://계정이름:토큰@github repository 주소</code></pre><h4 id="-remote-remote-repository-연결-확인">* [remote] remote repository 연결 확인</h4>
<pre><code>% git remote -v</code></pre><span style="color:gray">
현재까지 : 연결은 됐어도 github 사이트상에선 local 자료들은 보이지 않는 상태
</span>

<h4 id="-remote-push-local-자료를-remote-repository로">* [remote] push (local 자료를 remote repository로)</h4>
<pre><code>% git push origin [main or master...]</code></pre><h4 id="-remote-pull-remote-repository를-local로">* [remote] pull (remote repository를 local로)</h4>
<pre><code>% git pull origin [main or master...]</code></pre><h3 id="💡-git-clone">💡 Git Clone</h3>
<ul>
<li>github에서 repository를 먼저 생성후 local pull까지 바로 진행</li>
<li>git init 과정 불필요 -&gt; 바로 git add 명령어부터 실행 가능</li>
<li>github의 폴더명과 동일한 local 폴더 자동으로 생성</li>
<li>github 사이트 상의 폴더중 폴더명 맨 앞에 .이 있는건 local에서 숨은 폴더<pre><code>% git clone https://계정이름:토큰@github repository 주소</code></pre></li>
</ul>
<h3 id="💡-branch">💡 Branch</h3>
<ul>
<li>브랜치를 생성해도 local 상에선 보이진 않지만, 그 브랜치 안에서 파일 생성 등 가능 -&gt; commit , push 등 가능 (그럼 main or master 브랜치가 아닌 그 브랜치로 히스토리가 누적됨)</li>
<li>동일한 파일이라도 브랜치마다 내용이 다를 수 있음
<span style="color:gray">(하단 &#39;💡 Git diff&#39;로 상세 내용 확인)</span><ul>
<li>main hello.py에는 print(&#39;hello, cat&#39;)이 등록</li>
<li>git checkout dev로 dev 브랜치 이동 -&gt; cat &gt; hello.py | print(&#39;hello, dog&#39;)으로 수정 -&gt; cat hello.py로 확인하면 print(&#39;hello, dog&#39;) 나옴<h4 id="-branch-조회">* branch 조회</h4>
local branch조회<pre><code>% git branch</code></pre>remote branch 조회<pre><code>% git branch -r</code></pre>local &amp; remote branch 조회<pre><code>% git branch -a</code></pre><h4 id="-branch-생성">* branch 생성</h4>
생성시 동일한 브랜치명 사용    X (동일한 브랜치명으로 생성이 불가함)<pre><code>% git branch 브랜치명</code></pre><h4 id="-branch-이동">* branch 이동</h4>
<pre><code>% git checkout 브랜치명</code></pre><h4 id="-branch-생성-후-바로-이동">* branch 생성 후 바로 이동</h4>
생성시 동일한 브랜치명 사용    X (동일한 브랜치명으로 생성이 불가함)<pre><code>% git checkout -b 브랜치명</code></pre><h4 id="-branch-push-local-자료를-remote-repository로">* branch push (local 자료를 remote repository로)</h4>
<pre><code>% git push origin 브랜치명</code></pre><h4 id="-branch-삭제하기">* branch 삭제하기</h4>
local 삭제 (해당 브랜치에 있을 땐 삭제 안됨, 다른 브랜치로 이동 후 삭제 / github remote repository에는 삭제 안됨)<pre><code>% git branch -d 브랜치명</code></pre>branch remote 삭제<pre><code>% git push origin -delete 브랜치명</code></pre></li>
</ul>
</li>
</ul>
<h3 id="💡-git-log">💡 Git Log</h3>
<ul>
<li>현재 위치한 브랜치에서 변경 이력 확인 가능 (git graph의 텍스트 버전)</li>
<li>가장 상단에 최신 업데이트 내용 기록되어 있음<pre><code>% git log</code></pre></li>
</ul>
<h3 id="💡-git-diff">💡 Git Diff</h3>
<ul>
<li>버전간의 차이를 조회할 수 있는 명령<h4 id="-branch간-비교">* branch간 비교</h4>
vim으로 조회<pre><code>% git diff 브랜치명 브랜치명</code></pre>vscode로 조회 : <a href="https://velog.io/@soo_oo/GIT#-editor">사전에 editor에 vscode로 설정 필요</a><pre><code>% git difftool 브랜치명 브랜치명
</code></pre></li>
</ul>
<p>y 누르기</p>
<pre><code>#### * Commit간 비교</code></pre><p>% git diff commithash commithash
or
% git difftool commithash commithash</p>
<pre><code>commithash 확인하는 방법 : % git log

#### * 마지막 commit과 이전 commit 비교</code></pre><p>% git diff HEAD HEAD^
or
% git difftool HEAD HEAD^</p>
<pre><code>
#### * 마지막 commit과 현재 수정사항</code></pre><p>% git diff HEAD 
or
% git difftool HEAD </p>
<pre><code>
#### * Local &amp; remote 간 비교</code></pre><p>% git diff 브랜치명 origin/브랜치명
or
% git diff 브랜치명 origin/브랜치명</p>
<pre><code>
### 💡 Git Merge
[사전에 editor에 설정 필요](https://velog.io/@soo_oo/GIT#-editor)
모브랜치로 이동 후(% git checkout 브랜치명) 아래 코드 입력 : 모브랜치에 자브랜치를 merge 시킴 (자브랜치 내용으로 수정됨)
&lt;span style=&quot;color:gray&quot;&gt; 모,자는 혼자 이해하기 쉽게 하기 위해서 붙힌 것&lt;/span&gt;
</code></pre><p>% git merge 자브랜치명</p>
<pre><code>### 💡 Git Merge (Merge Conflict)
![](https://velog.velcdn.com/images/soo_oo/post/ecdb4d15-42e6-4eec-bdd7-1b1ac1080814/image.png)
#### * git mergetool</code></pre><p>(VS코드로 mergetool 셋팅이 되어 있다면)
% git mergetool</p>
<pre><code>VS코드가 연결됨 -&gt; 오류 지점 찾기
#### * 오류 수정
* Diff 를 &lt;&lt;&lt;&lt;, ====, &gt;&gt;&gt;&gt; 로 표시
![](https://velog.velcdn.com/images/soo_oo/post/528df561-1291-48c4-9bc8-e84937db7319/image.png)
* 맞는 코드를 선택하여 수정하고 저장.(Diff 표시 부분도 삭제)
  * 협업자가 많을 경우, 협업자와 상의 후 진행하기
![](https://velog.velcdn.com/images/soo_oo/post/a4472743-d4fb-4a1a-8429-f32af751aac5/image.png)
#### * Conflict 해제
* 위 상태는 파일만 수정된 상태
* 아래의 해제 단계 필요</code></pre><p>#인덱스(stage)추가
% git add 파일명.확장자</p>
<p>#head 연결 (메시지 적을 필요 없이 아래 코드만 입력해도 됨)
% git commit</p>
<p>창이 새로 뜨면 command + s하고 닫기</p>
<pre><code>* cat으로 확인하면 merge 된 것 확인 가능

### 💡 Git Tag
특정 버전 (commit)에 tag를 달아놓을 필요가 있을 때 사용 (ex-버전 릴리즈)
#### * 마지막 버전에 태깅</code></pre><p>% git tag 태그이름</p>
<p>예시&gt;&gt;
% git tag v0.3</p>
<pre><code>#### * 특정 버전에 태깅
commithash 확인하는 방법 : % git log</code></pre><p>% git tag 태그이름 commithash</p>
<p>예시&gt;&gt;
% git tag v0.2 commithash_blahblah</p>
<pre><code>#### * Tag를 Remote Repository로 Push</code></pre><p>% git push origin 태그이름</p>
<pre><code>#### * Tag 목록 확인</code></pre><p>% git tag</p>
<pre><code>#### * Tag 상세정보</code></pre><p>% git show 태그이름</p>
<pre><code>#### * Tag 삭제 (Local)</code></pre><p>% git tag --delete 태그이름</p>
<pre><code>#### * Tag 삭제 (Remote)</code></pre><p>% git push --delete origin 태그이름</p>
<p>```</p>
<h2 id="✏️-출처">✏️ 출처</h2>
<p>제로베이스 데이터취업스쿨 강의</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GIT] 버전 관리란 & git 설치하기]]></title>
            <link>https://velog.io/@soo_oo/GIT</link>
            <guid>https://velog.io/@soo_oo/GIT</guid>
            <pubDate>Tue, 03 Oct 2023 05:38:31 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-버전-관리-형상-관리-소스-관리">✏️ 버전 관리 (형상 관리/ 소스 관리)</h2>
<h3 id="💡-버전-관리란">💡 버전 관리란?</h3>
<p>소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것</p>
<ul>
<li><p><span style="color:greenyellow"><strong>V</strong></span>ersion <span style="color:greenyellow"><strong>C</strong></span>ontrol <span style="color:greenyellow"><strong>S</strong></span>ytem (버전관리 시스템)
<span style="color:gray">(밑줄 : 현업에서 많이 사용하는 툴)</span></p>
<ul>
<li>CVCS = CVS, <u><a href="https://subversion.apache.org/">SVN</a></u>, etc…</li>
<li>DVCS = Mercurial, <u><a href="https://git-scm.com/">Git</a></u>, etc…</li>
</ul>
</li>
<li><p><span style="color:greenyellow"><strong>C</strong></span>onfiguration <span style="color:greenyellow"><strong>M</strong></span>anagement <span style="color:greenyellow"><strong>S</strong></span>ystem (형상관리 시스템)</p>
</li>
</ul>
<h3 id="💡-장점">💡 장점</h3>
<ul>
<li>협업에 유용하다.</li>
<li>개발자 모두가 모두 분산처리 서버의 주인임으로 빠르게 일을 처리할 수 있다.</li>
<li>history 추적이 가능하다.</li>
<li>로컬 서버로 오프라인 작업이 가능하다. (다른 개발자에 영향 없음 + 일시적인 서버 장애에도 개발 진행 가능)</li>
</ul>
<h2 id="✏️-git">✏️ GIT</h2>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/f2c6c45c-202e-4811-9ba9-ebe1794898be/image.png" alt=""></p>
<h3 id="💡-대표-서비스">💡 대표 서비스</h3>
<ul>
<li><p><a href="https://git-scm.com/">github</a></p>
<ul>
<li>Git을 호스팅 해주는 웹 서비스, 협업을 위한 기능을 제공</li>
<li>참고 - 소스코드 보안이 중요한 경우 사용을 기피함</li>
</ul>
</li>
<li><p><a href="https://gitlab.com">gitlab</a></p>
<ul>
<li>설치형 버전관리 시스템 - 소스코드 보안이 중요한 기업에서 주로 사용</li>
<li>클라우드 버전관리 시스템 - 10명이하무료(Github와유사)</li>
<li>Issue tracker, Git Remote Repository, API, Team, Group 기능 제공</li>
</ul>
</li>
</ul>
<h3 id="💡-git-설치하기-for-mac-m1">💡 GIT 설치하기 (For MAC M1)</h3>
<h4 id="1-설치여부-확인-at-터미널">1. 설치여부 확인 (at 터미널)</h4>
<p>설치되어 있다면 pass <span style="color:gray"><del>난 이미 설치되어 있어 이후 과정은 진행하지 않아 아래 과정 진행하지 않음</del></span></p>
<pre><code>git  --version</code></pre><h4 id="2-1-homebrew-설치">2-1. Homebrew 설치</h4>
<pre><code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre><p><img src="https://velog.velcdn.com/images/soo_oo/post/fabed5b6-4785-4e34-8ad8-5b7afa4599e3/image.png" alt=""></p>
<h4 id="2-2-터미널-이동-후-아래-입력">2-2. 터미널 이동 후 아래 입력</h4>
<pre><code>% /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre><h4 id="2-3-1-zsh-command-not-found-에러가-발생한다면">2-3-1. zsh: command not found 에러가 발생한다면</h4>
<pre><code>% /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
zsh: command not found

# 홈브루를 /opt 디렉토리에 설치하기 위해 이동
% cd /opt

# 루트 권한으로 homebrew 폴더를 만든다
% sudo mkdir homebrew

# homebrew 폴더의 루트 권한을 유저로 바꿔준다
% sudo chown -R $(whoami) /opt/homebrew
//sudo chown -R 유저명 경로 = 경로의 권한을 유저한테 준다는 뜻

# homebrew 다운로드
% curl -L https://github.com/Homebrew/brew/tarball/
master | tar xz --strip 1 -C homebrew

# homebrew bin 디렉토리를 PATH에 추가
% echo &quot;export PATH=/opt/homebrew/bin:$PATH&quot; &gt;&gt; ~/.zshrc

# homebrew 홈페이지에 있던 명령어를 이제 실행!
% /bin/bash -c &quot;$(curl -fsSL https://gist.githubusercontent.com/nrubin29/
bea5aa83e8dfa91370fe83b62dad6dfa/raw/
48f48f7fef21abb308e129a80b3214c2538fc611/homebrew_m1.sh)&quot;
Copyright zerobase Corp. All Rights Reserved

# 설치완료</code></pre><h4 id="2-3-2-password-mac-입력-후-enter">2-3-2. Password (Mac) 입력 후 Enter</h4>
<pre><code>% /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/
install/HEAD/install.sh)&quot;
==&gt; Checking for `sudo` access (which may request your password).
Password:</code></pre><h4 id="2-4-설치-중-enter-누르기">2-4. 설치 중 enter 누르기</h4>
<pre><code>Press RETURN to continue or any other key to abort</code></pre><h4 id="2-5-password-mac-입력후-enter">2-5. Password (Mac) 입력후 Enter</h4>
<pre><code>...
Downloading Command Line Tools for Xcode
Downloaded Command Line Tools for Xcode Installing Command Line Tools for Xcode
Done with Command Line Tools for Xcode
Done.
==&gt; /usr/bin/sudo /bin/rm -f /tmp/
.com.apple.dt.CommandLineTools.installondemand.in-progress
Password:</code></pre><h4 id="2-6-설치-완료">2-6. 설치 완료</h4>
<pre><code>...
==&gt; Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
%
echo &#39;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&#39; &gt;&gt; /Users/insang/.zprofile
eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;
- Run `brew help` to get started
- Further documentation:
https://docs.brew.sh
%</code></pre><h4 id="3-1-brew로-git-설치하기-at-터미널">3-1. brew로 git 설치하기 (at 터미널)</h4>
<pre><code>% brew install git
.... 
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/git
%</code></pre><h4 id="3-2-zsh-command-not-found-brew-에러가-발생한다면">3-2. zsh: command not found: brew 에러가 발생한다면</h4>
<pre><code>% brew install git
zsh: command not found: brew
% eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;
% brew install git
....
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/git
%</code></pre><h4 id="3-3-설치여부-확인">3-3. 설치여부 확인</h4>
<pre><code>git  --version</code></pre><h3 id="💡-github-가입후-git-configuration">💡 GIThub 가입후 git configuration</h3>
<h4 id="1-터미널에서-아래-개인-정보-입력">1. 터미널에서 아래 개인 정보 입력</h4>
<pre><code>git config --global user.name &lt;username&gt;
git config --global user.email &lt;email&gt;

예시 &gt;&gt;
% git config --global user.name zerobasegit
% git config --global user.email zerobase.git@gmail.com</code></pre><h4 id="2-crlf">2. CRLF</h4>
<p>for mac</p>
<pre><code>% git config --global core.autocrlf input</code></pre><p>for window : 가져올 때는 LF 를 CRLF 로 변경하고 보낼때는 CRLF 를 LF 로 변경
<span style="color:gray">-LF가 기본 통용임으로 윈도우-맥 유저간 협업 작업을 위해 LF로 변경하고 보내는 설정 필수
-그렇지 않으면 CRLF 차이로 인해 commit 이 발생할 수 있음
</span></p>
<pre><code>% git config --global core.autocrlf true</code></pre><h4 id="3-editor">3. editor</h4>
<p><span style="color:gray">아래 &quot;💡 Editor&quot;에서 추가 설명</span></p>
<pre><code>git config --global core.editor &lt;editor&gt;

&gt;&gt; 예시
% git config --global core.editor vim</code></pre><h4 id="4-전체-설정-확인">4. 전체 설정 확인</h4>
<pre><code>% git config --list

&gt;&gt; 예시
% git config --list credential.helper=osxkeychain
user.name=&lt;username&gt;
user.email=zerobase.&lt;email&gt;
core.editor=vim
core.auticrlf=true</code></pre><h3 id="💡-editor">💡 Editor</h3>
<pre><code>git config --global core.editor &lt;editor&gt;

&gt;&gt; 예시
% git config --global core.editor vim</code></pre><ul>
<li>--wait 옵션 : command line으로 VScode를 실행했을 경우, VScode를 닫을 때까지 command 대기 (터미널에 명령 입력 안됨)<pre><code>git config --global core.editor &lt;editor&gt; --wait</code></pre></li>
<li>현재 config 확인하는 코드<pre><code>% git config --global core.editor</code></pre></li>
<li>VScode로 변경하기<pre><code>% git config --global core.editor &quot;code --wait&quot;</code></pre></li>
<li>설정된 editor 상세 옵션 수정할수 있는 창<ul>
<li>위 명령으로 VS코드로 변경후 아래 코드 입력하면 VS코드가 열림</li>
<li>vim상태에서도 수정할 수 있으나 가독성이 떨어짐<pre><code>% git config --global -e</code></pre></li>
</ul>
</li>
<li>창에 들어간 후 아래 코드로 tool 설정하기 <ul>
<li><a href="https://velog.io/@soo_oo/GIT-%EC%BD%94%EB%93%9C#-git-diff">git diff</a><pre><code>[diff]
  tool = vscode
[difftool &quot;vscode&quot;]
  cmd = &quot;code --wait --diff $LOCAL $REMOTE&quot;</code></pre><ul>
<li><a href="https://velog.io/@soo_oo/GIT-%EC%BD%94%EB%93%9C#-git-diff">git merge</a><pre><code>[merge]
tool = vscode
[mergetool &quot;vscode&quot;]
cmd = &quot;code --wait $MERGED&quot;</code></pre><h2 id="✏️-출처">✏️ 출처</h2>
제로베이스 데이터취업스쿨 강의
<a href="https://kurukurucoding.tistory.com/68">형상관리에 대해서... SCM, VCS, SVN, git...</a>
<a href="https://namu.wiki/w/Git">나무위키_git</a></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬] 함수 인자의 *  &  **]]></title>
            <link>https://velog.io/@soo_oo/EDA-%ED%95%A8%EC%88%98-%EC%9D%B8%EC%9E%90%EC%9D%98</link>
            <guid>https://velog.io/@soo_oo/EDA-%ED%95%A8%EC%88%98-%EC%9D%B8%EC%9E%90%EC%9D%98</guid>
            <pubDate>Tue, 12 Sep 2023 15:43:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ul>
<li>참고자료 : <a href="https://brunch.co.kr/@princox/180">[나름 중급 파이썬1] <em>args와 *</em>kwargs</a></li>
</ul>
</blockquote>
<h3 id="💡-args">💡 *args</h3>
<p>이건 이미 알고 있는 내용이라 간단히 짚고 가자면,
함수 인자가 몇개 들어 올지 모를 때 <strong>&quot;def 함수명 (*인자명)&quot;</strong> 으로 지정해 사용한다.</p>
<p>다만, 내가 이 파트에서 주요하게 정리하고 싶은 부분은 바로 아래이다.</p>
<h3 id="💡-kwargs">💡 **kwargs</h3>
<ul>
<li>kwargs : keyword argument의 줄임말</li>
<li>{&#39;키워드 : &#39;특정 값&#39;}으로 함수 전달</li>
</ul>
<p>아래 코드의 단점은 plotSineWave()함수에 인자를 넣을 때, 숫자 순서들이 충분히 헷갈릴 수 있다는 점이다. <del>코드가 길 때는 def 지정된 인자들을 확인하기 어려울 수도 있음!!</del>
이럴 때 사용하는게 &quot;**kwargs&quot; 이다.</p>
<pre><code class="language-python">def plotSinWave(amp,freq,endTime,sampleTime,startTime,bias):
  &quot;&quot;&quot;
  plot sin wave
  y= a sin(2 pi f t + t_o) + b
  &quot;&quot;&quot;

  time = np.arange(startTime,endTime,sampleTime)
  result = amp+np.sin(2 *np.pi * freq *time + startTime)+bias

  plt.figure(figsize=(12,6))
  plt.plot(time,result)
  plt.grid(True)
  plt.xlabel(&quot;time&quot;)
  plt.ylabel(&quot;sin&quot;)
  plt.title(str(amp)+ &quot;sine(2*pi&quot; + str (freq) + &quot;*t&quot; + str(startTime) +&quot;)+&quot; + str(bias))
  plt.show()

plotSinWave(2,1,10,0.01,0.5,0)</code></pre>
<pre><code class="language-python">#**karges 사용시 각 번호 살피기

#1.
def plotSinWave(**kwargs):
  &quot;&quot;&quot;
  plot sin wave
  y= a sin(2 pi f t + t_o) + b
  &quot;&quot;&quot;

  #2. (기본값을 아래같이 설정했으나, 코드에 인자 입력하면 그에 맞춰서 인식함)
  amp = kwargs.get(&quot;amp&quot;,1)
  freq =kwargs.get(&quot;freq&quot;,1)
  endTime = kwargs.get(&quot;endTime&quot;,1)
  sampleTime = kwargs.get(&quot;sampleTime&quot;,0.01)
  startTime = kwargs.get(&quot;startTime&quot;,0)
  bias = kwargs.get(&quot;bias&quot;,0)
  figsize =kwargs.get(&quot;figsize&quot;,(12,6))

  time = np.arange(startTime,endTime,sampleTime)
  result = amp+np.sin(2 *np.pi * freq *time + startTime)+bias

  plt.figure(figsize=(12,6))
  plt.plot(time,result)
  plt.grid(True)
  plt.xlabel(&quot;time&quot;)
  plt.ylabel(&quot;sin&quot;)
  plt.title(str(amp)+ &quot;sine(2*pi&quot; + str (freq) + &quot;*t&quot; + str(startTime) +&quot;)+&quot; + str(bias))
  plt.show()

# 3.
plotSinWave()</code></pre>
<p>바로 위 코드와 다른 점은 크게 3가지로 각 번호 표기한 부분을 보면된다.
2번 부분에 임의로 값을 지정해줬기에 3번 부분엔 특별히 인자를 기입할 필요가 없다.
<img src="https://velog.velcdn.com/images/soo_oo/post/e634885a-a8a7-4c65-b47f-2a3fc0e44653/image.png" alt=""></p>
<p>그렇다면 다른 값을 넣어보자.</p>
<pre><code class="language-python">plotSinWave(amp=2, freq =0.5, endTime=10)</code></pre>
<p>&quot;**kwargs&quot;를 사용했기 때문에 3번 부분에 모든 인자를 다시 입력할 필요없이 필요한 특정 인자에만 값을 수정해주었다.
<img src="https://velog.velcdn.com/images/soo_oo/post/e3ad74f0-d2b7-4bbd-9234-9a10715b45c7/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[EDA] Pandas_Pivot Table
]]></title>
            <link>https://velog.io/@soo_oo/EDA-PandasPivot-Table</link>
            <guid>https://velog.io/@soo_oo/EDA-PandasPivot-Table</guid>
            <pubDate>Sun, 03 Sep 2023 16:15:04 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-pivot-table">✏️ Pivot Table</h2>
<blockquote>
<ul>
<li>기본 구성요소 : index, columns, values, aggfunc</li>
</ul>
</blockquote>
<pre><code class="language-python">pd.pivot_table(df,              # 피벗할 데이터프레임
               index = &#39;--&#39;,    # 행 위치에 들어갈 열
               columns = &#39;--&#39;,  # 열 위치에 들어갈 열
               values = &#39;--&#39;,   # 데이터로 사용할 열
               aggfunc = &#39;--&#39;)  # 데이터 집계함수</code></pre>
<h3 id="💡-피벗-데이블의-인덱스--벨류-지정">💡 피벗 데이블의 인덱스 &amp; 벨류 지정</h3>
<pre><code class="language-python">pd.pivot_table(df, index=&quot;인덱스로 갈 컬럼 이름&quot;,
values=[&#39;컬럼 이름 1&#39;, &#39;컬럼 이름 2&#39;]))</code></pre>
<h3 id="💡-멀티-인덱스">💡 멀티 인덱스</h3>
<pre><code class="language-python">pd.pivot_table(df, index=[&quot;인덱스로 갈 컬럼 이름 1&quot;,&quot;인덱스 컬럼 2&quot;,&quot;인덱스 컬럼 3&quot;],
values=[&#39;컬럼 이름 1&#39;, &#39;컬럼 이름 2&#39;]))</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_oo/post/5a5b1e85-558e-448b-a7d4-7ba02c4e80b9/image.png" alt=""></p>
<h3 id="💡-컬럼-설정">💡 컬럼 설정</h3>
<pre><code class="language-python">df.pivot_table(index=[&#39;Manager&#39;,&#39;Rep&#39;], values=&#39;Price&#39;,columns=&#39;Product&#39;,aggfunc=np.sum)</code></pre>
<p>   <img src="https://velog.velcdn.com/images/soo_oo/post/90014f41-dbb7-41c5-910f-98b49a0a7537/image.png" alt="">
   <img src="https://velog.velcdn.com/images/soo_oo/post/c1b61188-e700-4cd6-b44b-6d9ddbcc2bd6/image.png" alt=""></p>
<h3 id="💡-피벗-테이블의-연산">💡 피벗 테이블의 연산</h3>
<ul>
<li><p>덧셈</p>
<p>  df.pivot_table(aggfunc=np.sum)</p>
<ul>
<li><p>2개 이상의 연산</p>
<p>  df.pivot_table(aggfunc=[np.sum,len])</p>
</li>
</ul>
</li>
<li><p>맨 밑 총합 나오게</p>
<p>  margins=True
  <img src="https://velog.velcdn.com/images/soo_oo/post/d26b5d36-3bc3-4860-b181-5273c1f492ea/image.png" alt=""></p>
</li>
</ul>
<h3 id="💡-응용">💡 응용</h3>
<ul>
<li>피벗테이블_멀티인덱스 + &#39;fill_value=&#39;
<img src="https://velog.velcdn.com/images/soo_oo/post/aaa7a1a6-bffd-4043-9dd0-b39762b71816/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[EDA] 주피터 Review & Recap]]></title>
            <link>https://velog.io/@soo_oo/EDA-%EC%A3%BC%ED%94%BC%ED%84%B0-Review-Recap</link>
            <guid>https://velog.io/@soo_oo/EDA-%EC%A3%BC%ED%94%BC%ED%84%B0-Review-Recap</guid>
            <pubDate>Sun, 03 Sep 2023 15:22:14 GMT</pubDate>
            <description><![CDATA[<h2 id="✏️-jupyter-notebook">✏️ Jupyter notebook</h2>
<blockquote>
<ul>
<li><strong>주피터(Jupyter)</strong></li>
</ul>
</blockquote>
<ul>
<li>오픈소스 웹 어플리케이션으로, 코드 작성, 시각화 및 문서 작성이 가능한 대화형 환경을 제공하는 도구</li>
<li>주피터 노트북은 프로그래밍 언어인 파이썬뿐 아니라 R, Julia 등다양한 언어를 지원</li>
<li>명령어 입력후 [shift + tap] 입력시 설명서 확인</li>
</ul>
<blockquote>
<ul>
<li><strong>판다스(Pandas)</strong></li>
</ul>
</blockquote>
<ul>
<li>여러가지 유용한 데이터 자료구조를 제공하는 파이썬 라이브러리</li>
<li><a href="https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html">공식 홈페이지</a></li>
</ul>
<ul>
<li>참고 자료 : <a href="https://junpyopark.github.io/Intro_to_Pandas/">따라하면서 쉽게 배우는 판다스</a> / <a href="https://wikidocs.net/195613">Jupyter Notebook이란?</a></li>
</ul>
<h3 id="💡-intro">💡 intro</h3>
<ul>
<li><p>import</p>
<ul>
<li>numpy : 수치적 해석이 많을 때<pre><code class="language-python">import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline</code></pre>
</li>
</ul>
</li>
<li><p>데이터 읽기</p>
<ul>
<li>파일 확장자 : csv / excel /</li>
<li>encoding = &#39;utf-8&#39; : 한글 글자깨짐 방지</li>
<li>데이터 주소 .. : 현재 폴더의 1단계 상위 폴더</li>
<li>데이터 주소 . : 현재 폴더<ul>
<li>thousands = &#39; , &#39; : 1000단위 이상 넘어가면 문자로 인식 할 수 있어서, 숫자로 인식 할수 있도록 지정<pre><code class="language-python">pd.read_파일 확장자(&#39;데이터 주소&#39;),encoding=&#39;utf-8&#39;</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="💡-유용-메서드-python">💡 유용 메서드 (python)</h3>
<blockquote>
<p>유용 사이트 : <a href="https://data-make.tistory.com/125">https://data-make.tistory.com/125</a></p>
</blockquote>
<ul>
<li>.info() </li>
<li>.unique() : 칼럼에 중복되지 않은 유일한 value 출력</li>
<li>.isnull() : 누락 데이터(NaN) 값 개수 구하기</li>
<li>.notnull() : 누락 데이터가 아닌 값만 구하기</li>
<li>.head(n) : n 지정 없을시 상위 5개, n값만큼 상위 출력</li>
<li>.tail(n) : n 지정 없을시 하위 5개, n값만큼 하위 출력</li>
<li>.columns.droplevel([n,m]) : 인덱스 n,m 컬럼 제거 <a href="https://velog.io/@soo_oo/EDA">del / drop 사용</a></li>
<li>.iterrows ( ) : pandas용 반복문/받을 때, 인덱스와 내용으로 나누어 받는것 주의</li>
<li>.split( ) : 띄어쓰기대로 나눠 하나의 리스트화</li>
</ul>
<h3 id="💡-유용-메서드">💡 유용 메서드</h3>
<ul>
<li>(fill_value = 0) :Nan 같은 누락요소 반영 전 &#39;=값&#39;을 반영</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>